TUI keys: register both CSI and SS3 forms of the cursor/Home/End keys and
the xterm modifier sequences when terminfo lacks them, so an arrow sent in
the "other" form no longer turns into Esc + a typed letter. Up/Down move by
visual (soft-wrapped) row, and the draft survives a trip through history.
scripts/tui_keys drives the TUI in a pty to check all of this.
Images: text inside a multimodal content array is now a {"type":"text"}
part; DeepSeek rejected the bare string with HTTP 422. deepseek-flash
(and its deepseek-chat / deepseek-reasoner aliases) read images, so the
registry marks them vision; deepseek-v4-pro stays text only.
CI: models.c lost _DEFAULT_SOURCE in 0.7.0 and gmtime_r broke the musl
build; tests sleep with poll() instead of usleep for the same reason.
74 lines
2.9 KiB
JSON
74 lines
2.9 KiB
JSON
{
|
|
"providers": {
|
|
"minimax": {
|
|
"api_base": "https://api.minimax.cn/v1",
|
|
"key_env": "MINIMAX_API_KEY",
|
|
"default_model": "MiniMax-M2.7",
|
|
"models": ["MiniMax-M2.7", "MiniMax-M2.5"]
|
|
},
|
|
"deepseek": {
|
|
"api_base": "https://api.deepseek.com/v1",
|
|
"key_env": "DEEPSEEK_API_KEY",
|
|
"default_model": "deepseek-flash",
|
|
"models": ["deepseek-flash", "deepseek-v4-pro"],
|
|
"reasoning_passback": true,
|
|
"prefix_completion": true,
|
|
"effort": "passthrough"
|
|
},
|
|
"openai": {
|
|
"api_base": "https://api.openai.com/v1",
|
|
"key_env": "OPENAI_API_KEY",
|
|
"default_model": "gpt-4.1-mini",
|
|
"models": ["gpt-4.1-mini", "gpt-4o"],
|
|
"effort": "openai"
|
|
},
|
|
"teamorouter": {
|
|
"api_base": "https://api.teamorouter.com/v1",
|
|
"key_env": "TEAMOROUTER_API_KEY",
|
|
"default_model": ""
|
|
}
|
|
},
|
|
"models": [
|
|
{"match": "deepseek", "context": 1000000, "vision": false,
|
|
"price": {"currency": "¥", "miss": 2, "hit": 0.04, "out": 8, "offpeak_half": true}},
|
|
{"match": "deepseek-flash", "vision": true},
|
|
{"match": "deepseek-chat", "vision": true},
|
|
{"match": "deepseek-reasoner", "vision": true},
|
|
{"match": "deepseek-v4-pro",
|
|
"price": {"currency": "¥", "miss": 9, "hit": 0.3, "out": 27, "offpeak_half": true}},
|
|
{"match": "deepseek-vl", "vision": true},
|
|
{"match": "minimax", "context": 196608, "vision": false},
|
|
|
|
{"match": "gpt-", "cache": "openai"},
|
|
{"match": "gpt-4.1", "context": 1047576, "vision": true,
|
|
"price": {"currency": "$", "miss": 2, "hit": 0.5, "out": 8}},
|
|
{"match": "gpt-4.1-mini",
|
|
"price": {"currency": "$", "miss": 0.4, "hit": 0.1, "out": 1.6}},
|
|
{"match": "gpt-4o", "context": 128000, "vision": true,
|
|
"price": {"currency": "$", "miss": 2.5, "hit": 1.25, "out": 10}},
|
|
{"match": "gpt-4o-mini",
|
|
"price": {"currency": "$", "miss": 0.15, "hit": 0.075, "out": 0.6}},
|
|
{"match": "gpt-5", "context": 400000, "vision": true, "reasoning": true},
|
|
{"match": "o1", "vision": true, "cache": "openai", "reasoning": true},
|
|
{"match": "o3", "context": 200000, "vision": true, "cache": "openai", "reasoning": true},
|
|
{"match": "o4", "context": 200000, "vision": true, "cache": "openai", "reasoning": true},
|
|
|
|
{"match": "anthropic/", "cache": "anthropic"},
|
|
{"match": "claude", "context": 200000, "vision": true, "cache": "anthropic"},
|
|
{"match": "claude-sonnet",
|
|
"price": {"currency": "$", "miss": 3, "hit": 0.3, "write": 3.75, "out": 15}},
|
|
|
|
{"match": "gemini", "context": 1048576, "vision": true},
|
|
{"match": "grok", "context": 256000},
|
|
{"match": "grok-4", "vision": true},
|
|
{"match": "qwen", "context": 131072},
|
|
{"match": "glm", "context": 128000},
|
|
{"match": "glm-*v*", "vision": true},
|
|
{"match": "kimi", "context": 131072},
|
|
{"match": "pixtral", "vision": true},
|
|
{"match": "llava", "vision": true},
|
|
{"match": "*-vl*", "vision": true},
|
|
{"match": "*vision*", "vision": true}
|
|
]
|
|
}
|