fix(deepseek): align V4 reasoning efforts across DeepSeek and OpenCode Go (#10540)

* fix(deepseek): align V4 reasoning efforts

* docs(changelog): note DeepSeek effort fix

* fix(deepseek): align OpenCode V4 effort aliases

* test(deepseek): align effort alias expectation

* fix(deepseek): scope low effort to v4

* fix(opencode-go): route DeepSeek V4 through Responses
This commit is contained in:
Ke Jin
2026-08-18 21:51:52 +08:00
committed by GitHub
parent 276b3dffa3
commit f92075bb63
12 changed files with 267 additions and 189 deletions

View File

@@ -78,19 +78,25 @@ describe("OpencodeExecutor", () => {
assert.equal(model.supportsReasoning, true);
});
it("exposes DeepSeek V4 Pro effort variants on opencode-go only", () => {
it("declares V4 effort tiers on OpenCode Go base models only", () => {
const goModels = PROVIDER_MODELS["opencode-go"] || [];
const zenModels = PROVIDER_MODELS["opencode-zen"] || [];
const variants = ["low", "medium", "high", "max"].map((level) => `deepseek-v4-pro-${level}`);
for (const variant of variants) {
const model = goModels.find((m) => m.id === variant);
assert.ok(model, `${variant} should be in opencode-go model list`);
assert.equal(model?.supportsReasoning, true);
assert.equal(
zenModels.some((m) => m.id === variant),
false,
`${variant} should not be exposed on opencode-zen`
);
const efforts = ["none", "low", "high", "max"];
for (const modelId of ["deepseek-v4-pro", "deepseek-v4-flash"]) {
const base = goModels.find((model) => model.id === modelId);
assert.deepEqual(base?.supportedThinkingEfforts, efforts);
for (const effort of efforts) {
const variant = `${modelId}-${effort}`;
assert.equal(
goModels.some((model) => model.id === variant),
false
);
assert.equal(
zenModels.some((model) => model.id === variant),
false
);
}
}
});
@@ -137,6 +143,16 @@ describe("OpencodeExecutor", () => {
assert.equal(fetchCalls[0].url, "https://opencode.ai/zen/v1/responses");
});
it("routes OpenCode Go DeepSeek V4 models to the responses endpoint", async () => {
const models = ["deepseek-v4-pro", "deepseek-v4-flash"];
for (const [index, model] of models.entries()) {
const result = await goExecutor.execute(createInput(model));
assert.equal(result.url, "https://opencode.ai/zen/go/v1/responses");
assert.equal(fetchCalls[index].url, "https://opencode.ai/zen/go/v1/responses");
}
});
it("routes gemini streaming requests to streamGenerateContent", async () => {
registerModel("opencode-zen", {
id: "gemini-2.5-pro",
@@ -544,7 +560,7 @@ describe("OpencodeExecutor", () => {
});
});
describe("DeepSeek V4 Pro reasoning-effort variants", () => {
describe("DeepSeek V4 reasoning-effort variants", () => {
function baseBody(model) {
return {
model,
@@ -554,17 +570,19 @@ describe("OpencodeExecutor", () => {
};
}
const levels = ["low", "medium", "high", "max"];
for (const level of levels) {
it(`maps deepseek-v4-pro-${level} to base id + reasoning_effort=${level}`, () => {
const variant = `deepseek-v4-pro-${level}`;
const out = goExecutor.transformRequest(variant, baseBody(variant), false, {
apiKey: "test-key",
const levels = ["none", "low", "high", "max"];
for (const model of ["deepseek-v4-pro", "deepseek-v4-flash"]) {
for (const level of levels) {
it(`maps ${model}-${level} to base id + reasoning_effort=${level}`, () => {
const variant = `${model}-${level}`;
const out = goExecutor.transformRequest(variant, baseBody(variant), false, {
apiKey: "test-key",
});
assert.equal(out.model, model);
assert.equal(out.reasoning_effort, level);
assert.ok(!String(out.model).endsWith(`-${level}`));
});
assert.equal(out.model, "deepseek-v4-pro");
assert.equal(out.reasoning_effort, level);
assert.ok(!String(out.model).endsWith(`-${level}`));
});
}
}
it("preserves explicit reasoning_effort over the variant suffix", () => {