Skip to content

Commit 0adf2ef

Browse files
hiyougaclaude
andauthored
feat(core,cli,web,docs,skills): AgentHub 0.4.6 with the DeepSeek vision model (#388)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 4f29ab6 commit 0adf2ef

13 files changed

Lines changed: 131 additions & 30 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# AgentHub 0.4.6: a DeepSeek vision model, and DeepSeek on the Responses protocol
2+
3+
- **Date:** 2026-08-21
4+
- **Type:** feature
5+
- **Scope:** `core`, `cli`, `web`, `model-catalog`, `docs`
6+
- **PR:** [#388](https://github.com/Prism-Shadow/penguin-harness/pull/388)
7+
- **Breaking:** yes — a `deepseek-v4*` model pointed at a Chat Completions-only endpoint now needs `client_type = "openai-chat"` set by hand
8+
9+
[中文版](2026-08-21-agenthub-0.4.6.zh.md)
10+
11+
`@prismshadow/agenthub` moved from 0.4.5 to 0.4.6, which adds `deepseek-v4-flash-vision-exp` and moves the first-party DeepSeek client from Chat Completions to the OpenAI Responses API (agenthub [#185](https://github.com/Prism-Shadow/agenthub/pull/185)). The model catalog gained the new model in two groups, and the Web model dialog's base URL hint now reads `/responses` for DeepSeek.
12+
13+
## Details
14+
15+
- `deepseek-v4-flash-vision-exp` joined the DeepSeek group: image input on top of V4 Flash's text capabilities, a 1M context window, and V4 Flash's own price. It is the only vision-capable model in that group: a session running it reads images directly, instead of routing them through the `vision_model` proxy `describe_image` uses for text-only models. A fresh Project still defaults to `deepseek-v4-flash`.
16+
- `deepseek/deepseek-v4-flash-vision-exp` joined the OpenRouter group at that gateway's published rates ($0.22 input / $0.66 output / $0.007 cache read per million tokens) and its 1,048,576-token context window. DeepSeek is the only provider serving it there.
17+
- Both rows record the official **off-peak** tier, the same convention the existing DeepSeek rows follow: peak hours (Beijing 9:00–12:00 and 14:00–18:00) bill exactly double, and the cost centre uses one rate, so peak usage is under-counted 2x.
18+
- The protocol-path hint at the right edge of the base URL field reads `/responses` for the DeepSeek group and for an explicit `deepseek-v4` client type. The gateway rows reselling DeepSeek pin `openai-chat` and keep `/chat/completions`.
19+
- The shipped `agenthub-models` skill lists the new id in both its official and OpenRouter columns, and records which wire protocol the `deepseek-v4` client speaks.
20+
- `pnpm-workspace.yaml`'s `minimumReleaseAgeExclude` entry names 0.4.6 and drops 0.4.5, as that file's own note instructed.
21+
22+
## Compatibility
23+
24+
Existing Projects do not pick up the two new catalog rows on their own: presets are copied into `.project_config.toml` when a Project is created, and nothing rewrites them afterwards. Use **sync presets** on the models page to append them; the stored default model is never touched.
25+
26+
A model whose id contains `deepseek-v4` and which carries no `client_type` is routed to the DeepSeek client by its id alone, and that client now posts to `{base_url}/responses`. Entries pointed at `https://api.deepseek.com` are unaffected — DeepSeek serves both protocols. An entry pointed at an endpoint that serves Chat Completions only (a self-hosted server, a relay, a third-party DeepSeek-compatible gateway) starts failing after the upgrade: set `client_type = "openai-chat"` on it, in `.project_config.toml` or through the models page's protocol selector, and the request shape returns to what it was.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# AgentHub 0.4.6:DeepSeek 视觉模型,以及 DeepSeek 改走 Responses 协议
2+
3+
- **Date:** 2026-08-21
4+
- **Type:** feature
5+
- **Scope:** `core`, `cli`, `web`, `model-catalog`, `docs`
6+
- **PR:** [#388](https://github.com/Prism-Shadow/penguin-harness/pull/388)
7+
- **Breaking:** yes — 指向仅提供 Chat Completions 端点的 `deepseek-v4*` 模型,现在需要手工设置 `client_type = "openai-chat"`
8+
9+
[English](2026-08-21-agenthub-0.4.6.md)
10+
11+
`@prismshadow/agenthub` 从 0.4.5 升到 0.4.6。新版本加入了 `deepseek-v4-flash-vision-exp`,并把第一方 DeepSeek client 从 Chat Completions 改为 OpenAI Responses API(agenthub [#185](https://github.com/Prism-Shadow/agenthub/pull/185))。模型目录在两个分组中收录了该模型,Web 模型对话框中 base URL 的协议路径提示对 DeepSeek 改为 `/responses`
12+
13+
## 细节
14+
15+
- `deepseek-v4-flash-vision-exp` 进入 DeepSeek 分组:在 V4 Flash 的文本能力之上支持图像输入,上下文窗口 100 万 Token,价格与 V4 Flash 相同。它是该分组中唯一支持图像输入的模型:以它运行的会话直接读图,无需再经 `describe_image` 为 text-only 模型准备的 `vision_model` 代读路径。新建 Project 的默认模型仍是 `deepseek-v4-flash`
16+
- `deepseek/deepseek-v4-flash-vision-exp` 进入 OpenRouter 分组,按该网关公布的价格记录(每百万 Token 输入 $0.22 / 输出 $0.66 / 缓存命中 $0.007),上下文窗口为 1,048,576 Token。该模型在 OpenRouter 上只有 DeepSeek 一家提供。
17+
- 两条记录都采用官方**低谷时段**档,与既有 DeepSeek 记录一致:高峰时段(北京时间 9:00–12:00、14:00–18:00)按整整双倍计费,而费用中心只用单一价格,因此高峰用量会被低估一半。
18+
- base URL 输入框右端的协议路径提示,对 DeepSeek 分组以及显式的 `deepseek-v4` client type 均显示 `/responses`。转售 DeepSeek 的网关分组固定 `openai-chat`,仍显示 `/chat/completions`
19+
- 随附的 `agenthub-models` skill 在官方与 OpenRouter 两列中都列出了新 id,并记录了 `deepseek-v4` client 使用的传输协议。
20+
- `pnpm-workspace.yaml``minimumReleaseAgeExclude` 的条目改为 0.4.6;按该文件自身注释的要求,移除了 0.4.5 的条目。
21+
22+
## 兼容性
23+
24+
既有 Project 不会自动获得这两条新目录记录:预置模型在创建 Project 时写入 `.project_config.toml`,此后不再被改写。在模型页点击**同步预置**即可追加,存储的默认模型不受影响。
25+
26+
model id 中含 `deepseek-v4`、且未填写 `client_type` 的条目,仅凭 id 就会被路由到 DeepSeek client,而该 client 现在向 `{base_url}/responses` 发请求。指向 `https://api.deepseek.com` 的条目不受影响——DeepSeek 两种协议都提供。指向仅提供 Chat Completions 端点的条目(自建服务、中转站、第三方 DeepSeek 兼容网关)在升级后会开始失败:为其设置 `client_type = "openai-chat"` 即可——在 `.project_config.toml` 中填写,或用模型页的协议选择器选择——请求形态即恢复原样。

packages/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
},
2525
"dependencies": {
2626
"@modelcontextprotocol/client": "^2.0.0",
27-
"@prismshadow/agenthub": "^0.4.5",
27+
"@prismshadow/agenthub": "^0.4.6",
2828
"@prismshadow/penguin-core": "workspace:*",
2929
"@prismshadow/penguin-server": "workspace:*",
3030
"@prismshadow/penguin-skills": "workspace:*",

packages/core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
},
5050
"dependencies": {
5151
"@modelcontextprotocol/client": "^2.0.0",
52-
"@prismshadow/agenthub": "^0.4.5",
52+
"@prismshadow/agenthub": "^0.4.6",
5353
"@prismshadow/penguin-skills": "workspace:*",
5454
"arktype": "^2.2.3",
5555
"smol-toml": "^1.3.0",

packages/core/src/state/model-catalog.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
* auto-route, shared by core's default config, server's initial config, and web/cli display.
44
* Data verified as of 2026-07-10 (Qwen Token Plan entries: 2026-07-20; MiniMax: 2026-08-03;
55
* DeepSeek, Gemini 3.7, GLM-5.3 and the whole OpenAI line-up (direct + OpenRouter):
6-
* 2026-08-18; the direct Anthropic group: 2026-08-20 — per each provider's docs).
6+
* 2026-08-18; the direct Anthropic group: 2026-08-20; the DeepSeek V4 Flash Vision Exp rows:
7+
* 2026-08-21 — per each provider's docs).
78
* Docs: packages/docs/content/models.{zh,en}.md (site path /docs/models) documents the
89
* provider groups and credential resolution described here.
910
*
@@ -247,6 +248,16 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
247248
pricing: cny(0.05, 1.5, 4.5),
248249
supportsVision: false,
249250
},
251+
{
252+
// The experimental vision revision of V4 Flash (added 2026-08-21): image input on top of
253+
// the base model's text capabilities, at the same published price.
254+
modelId: "deepseek-v4-flash-vision-exp",
255+
displayName: "DeepSeek V4 Flash Vision Exp",
256+
provider: "deepseek",
257+
contextWindow: 1000000,
258+
pricing: cny(0.05, 1.5, 4.5),
259+
supportsVision: true,
260+
},
250261
{
251262
modelId: "deepseek-v4-pro",
252263
displayName: "DeepSeek V4 Pro",
@@ -358,6 +369,20 @@ export const MODEL_CATALOG: ModelCatalogEntry[] = [
358369
clientType: "openai-chat",
359370
baseUrl: OPENROUTER_BASE_URL,
360371
},
372+
{
373+
// DeepSeek serves this one alone on OpenRouter, so the stored rates are its own published
374+
// USD list ($0.22 / $0.66 / $0.007 cache read), and the context window is that endpoint's
375+
// 1,048,576. Like the direct group, the price is the OFF-PEAK tier: the models API exposes
376+
// the peak windows as `pricing.overrides` billing exactly double.
377+
modelId: "deepseek/deepseek-v4-flash-vision-exp",
378+
displayName: "DeepSeek V4 Flash Vision Exp",
379+
provider: "openrouter",
380+
contextWindow: 1048576,
381+
pricing: usd(0.007, 0.22, 0.66),
382+
supportsVision: true,
383+
clientType: "openai-chat",
384+
baseUrl: OPENROUTER_BASE_URL,
385+
},
361386
{
362387
// The 0813 general-availability release of DeepSeek V4 Pro (OpenRouter listing dated
363388
// 2026-08-12); the default routed endpoint is DeepSeek's own API, so the price matches

packages/core/test/model-catalog.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ describe("model-catalog", () => {
131131
expect(catalogEntryFor("zhipu", "glm-5.2")?.contextWindow).toBe(1000000);
132132
expect(catalogEntryFor("qwen-token-plan", "glm-5.2")?.contextWindow).toBe(1048576);
133133
expect(catalogEntryFor("deepseek", "deepseek-v4-pro")?.provider).toBe("deepseek");
134+
// The vision revision is a model of its own in both the direct group and on OpenRouter,
135+
// and it is the only vision-capable DeepSeek row in either.
136+
expect(catalogEntryFor("deepseek", "deepseek-v4-flash-vision-exp")?.supportsVision).toBe(true);
137+
expect(
138+
catalogEntryFor("openrouter", "deepseek/deepseek-v4-flash-vision-exp")?.supportsVision,
139+
).toBe(true);
140+
expect(catalogEntryFor("deepseek", "deepseek-v4-flash")?.supportsVision).toBe(false);
134141
expect(catalogEntryFor("qwen-token-plan", "deepseek-v4-pro")?.provider).toBe("qwen-token-plan");
135142
expect(catalogEntryFor("minimax", "MiniMax-M3")?.displayName).toBe("MiniMax M3");
136143
});
@@ -167,6 +174,7 @@ describe("model-catalog", () => {
167174
"anthropic/claude-sonnet-5",
168175
"deepseek/deepseek-v4-flash-0731",
169176
"deepseek/deepseek-v4-flash",
177+
"deepseek/deepseek-v4-flash-vision-exp",
170178
"deepseek/deepseek-v4-pro-0813",
171179
"deepseek/deepseek-v4-pro",
172180
"google/gemini-3.7-flash",

packages/docs/content/models.en.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ The gateway groups (openrouter / fireworks / siliconflow / qwen-token-plan / qwe
7777

7878
The preset catalog also carries OpenRouter's free tier: the `:free` model variant `nvidia/nemotron-3-ultra-550b-a55b:free` and the `openrouter/free` unified Free Models Router. They cost nothing, but are subject to OpenRouter's free-tier rate limits and data policy.
7979

80-
Some models in the preset catalog: deepseek-v4-pro / deepseek-v4-flash, MiniMax-M3, gemini-3.7-flash, claude-opus-5 / claude-opus-4-8 / claude-sonnet-5, gpt-5.6 / gpt-5.5, glm-5.3, kimi-k3, qwen3.8-max (not exhaustive). The whole OpenAI line-up is listed twice — directly (your own OpenAI key, list prices) and on OpenRouter as `openai/<id>` (the gateway's rates, which follow its running promotions). DeepSeek's direct-group prices record the official off-peak tier (peak hours, Beijing 9:00–12:00 and 14:00–18:00, bill double).
80+
Some models in the preset catalog: deepseek-v4-pro / deepseek-v4-flash / deepseek-v4-flash-vision-exp (the DeepSeek group's only vision-capable model), MiniMax-M3, gemini-3.7-flash, claude-opus-5 / claude-opus-4-8 / claude-sonnet-5, gpt-5.6 / gpt-5.5, glm-5.3, kimi-k3, qwen3.8-max (not exhaustive). The whole OpenAI line-up is listed twice — directly (your own OpenAI key, list prices) and on OpenRouter as `openai/<id>` (the gateway's rates, which follow its running promotions). DeepSeek's direct-group prices record the official off-peak tier (peak hours, Beijing 9:00–12:00 and 14:00–18:00, bill double).
8181

8282
## Local / self-hosted OpenAI-compatible endpoints (e.g. vLLM)
8383

packages/docs/content/models.zh.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ api_key = "sk-..."
7777

7878
预置目录还收录了 OpenRouter 的免费档:`:free` 模型变体 `nvidia/nemotron-3-ultra-550b-a55b:free` 与统一路由 `openrouter/free`(Free Models Router),零成本可用,但受 OpenRouter 免费档速率限制与数据政策约束。
7979

80-
预置目录中的部分模型:deepseek-v4-pro / deepseek-v4-flash、MiniMax-M3、gemini-3.7-flash、claude-opus-5 / claude-opus-4-8 / claude-sonnet-5、gpt-5.6 / gpt-5.5、glm-5.3、kimi-k3、qwen3.8-max 等(非完整清单)。OpenAI 全系列都收录了两份——直连(用自己的 OpenAI Key,记牌价)与 OpenRouter 上的 `openai/<id>`(记网关实际计费价,会随其促销浮动)。DeepSeek 直连分组的价格记录官方低谷时段档(高峰时段——北京时间 9:00–12:00、14:00–18:00——按双倍计费)。
80+
预置目录中的部分模型:deepseek-v4-pro / deepseek-v4-flash / deepseek-v4-flash-vision-exp(DeepSeek 分组中唯一支持图像输入的模型)、MiniMax-M3、gemini-3.7-flash、claude-opus-5 / claude-opus-4-8 / claude-sonnet-5、gpt-5.6 / gpt-5.5、glm-5.3、kimi-k3、qwen3.8-max 等(非完整清单)。OpenAI 全系列都收录了两份——直连(用自己的 OpenAI Key,记牌价)与 OpenRouter 上的 `openai/<id>`(记网关实际计费价,会随其促销浮动)。DeepSeek 直连分组的价格记录官方低谷时段档(高峰时段——北京时间 9:00–12:00、14:00–18:00——按双倍计费)。
8181

8282
## 本地 / 自建 OpenAI 兼容端点(如 vLLM)
8383

packages/skills/skills/agenthub-models/SKILL.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: agenthub-models
33
description: Call model APIs through @prismshadow/agenthub — streaming text generation, image generation, speech synthesis, embeddings and the supported-model registry with one client.
44
short_description: Call model APIs with one AgentHub client.
55
short_description_zh: 用一个 AgentHub 客户端调用模型 API。
6-
version: 14
6+
version: 15
77
updated: 2026-08-21T00:00:00Z
88
---
99

@@ -64,7 +64,7 @@ Use exact model ids. If an id is not in the table below and the user has not giv
6464
| Kimi K3 | `kimi-k3` | OpenRouter `moonshotai/kimi-k3` |
6565
| Kimi K2.7 Code || SiliconFlow `moonshotai/Kimi-K2.7-Code`; Fireworks AI `accounts/fireworks/models/kimi-k2p7-code` |
6666
| Kimi K2.6 | `kimi-k2.6` | OpenRouter `moonshotai/kimi-k2.6`; SiliconFlow `Pro/moonshotai/Kimi-K2.6` |
67-
| DeepSeek V4 | `deepseek-v4-pro`, `deepseek-v4-flash` | OpenRouter `deepseek/deepseek-v4-pro-0813`, `deepseek/deepseek-v4-pro`, `deepseek/deepseek-v4-flash`, `deepseek/deepseek-v4-flash-0731`; Fireworks AI `accounts/fireworks/models/deepseek-v4-flash-0731`; SiliconFlow `deepseek-ai/DeepSeek-V4-Pro`, `deepseek-ai/DeepSeek-V4-Flash` |
67+
| DeepSeek V4 | `deepseek-v4-pro`, `deepseek-v4-flash`, `deepseek-v4-flash-vision-exp` | OpenRouter `deepseek/deepseek-v4-pro-0813`, `deepseek/deepseek-v4-pro`, `deepseek/deepseek-v4-flash`, `deepseek/deepseek-v4-flash-0731`, `deepseek/deepseek-v4-flash-vision-exp`; Fireworks AI `accounts/fireworks/models/deepseek-v4-flash-0731`; SiliconFlow `deepseek-ai/DeepSeek-V4-Pro`, `deepseek-ai/DeepSeek-V4-Flash` |
6868
| GLM 5.3 | `glm-5.3` | OpenRouter `z-ai/glm-5.3` |
6969
| GLM 5.2 | `glm-5.2` | OpenRouter `z-ai/glm-5.2`; SiliconFlow `zai-org/GLM-5.2` |
7070
| GLM 5.1 | `glm-5.1` ||
@@ -108,6 +108,7 @@ The registry is the curated current line-up, so prefer it when picking a model o
108108
- `clientType: "ant-messages"` — Anthropic Messages-compatible endpoints (Anthropic, OpenRouter `https://openrouter.ai/api`, DeepSeek `https://api.deepseek.com/anthropic`, Z.AI, MiniMax).
109109
- Exception: an id served by an OpenAI-compatible gateway that still matches a first-party substring (e.g. OpenRouter's `google/gemini-3.7-flash`, `anthropic/claude-sonnet-5` or `openai/gpt-5.6-sol` on the `/api/v1` endpoint) would auto-route to the vendor protocol client — and a dotted id like `anthropic/claude-opus-4.8` matches nothing and throws. Always pass an explicit `clientType` for gateway ids; never rely on the id. Routing reads `clientType` (or the model id) as a plain lowercased string and never looks at `baseUrl`, so the vendor prefix gives no protection.
110110
- OpenRouter serves both protocols at `https://openrouter.ai/api/v1`, so its `openai/*` ids work with `clientType: "openai-responses"` as well as `"openai-chat"`; use Responses when you want reasoning items round-tripped.
111+
- The first-party `deepseek-v4` client posts to `{baseUrl}/responses` (AgentHub 0.4.6 moved it off Chat Completions). A self-hosted endpoint serving a `deepseek-v4*` id over Chat Completions must therefore pass `clientType: "openai-chat"` explicitly rather than rely on id routing.
111112
- API key: constructor parameter first, then the provider environment variable — `DEEPSEEK_API_KEY`, `ANTHROPIC_API_KEY` (also for `ant-messages`), `OPENAI_API_KEY` (also for `openai-chat`/`openai-responses`), `GEMINI_API_KEY`, `ZAI_API_KEY`, `MOONSHOT_API_KEY`, `MINIMAX_API_KEY`. Base URLs read the same names with `_BASE_URL`.
112113

113114
## Streaming text

0 commit comments

Comments
 (0)