fix(providers): handle proxied DeepSeek V4 replay

This commit is contained in:
Peter Steinberger
2026-04-25 19:23:06 +01:00
parent b8a41739d5
commit 31456e3326
7 changed files with 254 additions and 2 deletions

View File

@@ -686,6 +686,128 @@ describe("skill-workshop", () => {
);
});
it("uses the configured agent default for reviewer fallback", async () => {
const workspaceDir = await makeTempDir();
const stateDir = await makeTempDir();
const runEmbeddedPiAgent = vi.fn(async () => ({
payloads: [{ text: JSON.stringify({ action: "none" }) }],
meta: {},
}));
const api = createTestPluginApi({
config: {
agents: {
defaults: {
model: { primary: "openai-codex/gpt-5.5" },
},
},
},
runtime: {
agent: {
defaults: { provider: "openai", model: "gpt-5.4" },
resolveAgentDir: () => path.join(workspaceDir, ".agent"),
runEmbeddedPiAgent,
},
state: {
resolveStateDir: () => stateDir,
},
} as never,
});
await reviewTranscriptForProposal({
api,
config: {
enabled: true,
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "llm",
reviewInterval: 1,
reviewMinToolCalls: 1,
reviewTimeoutMs: 5_000,
maxPending: 50,
maxSkillBytes: 40_000,
},
ctx: { agentId: "main", workspaceDir },
messages: [{ role: "user", content: "Remember this repeatable fix." }],
});
expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
expect.objectContaining({
provider: "openai-codex",
model: "gpt-5.5",
}),
);
});
it("infers reviewer fallback provider for a bare configured model", async () => {
const workspaceDir = await makeTempDir();
const stateDir = await makeTempDir();
const runEmbeddedPiAgent = vi.fn(async () => ({
payloads: [{ text: JSON.stringify({ action: "none" }) }],
meta: {},
}));
const api = createTestPluginApi({
config: {
agents: {
defaults: {
model: { primary: "gpt-5.5" },
},
},
models: {
providers: {
"openai-codex": {
baseUrl: "https://chatgpt.com/backend-api/codex",
models: [
{
id: "gpt-5.5",
name: "GPT 5.5",
reasoning: true,
input: ["text"],
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
contextWindow: 200_000,
maxTokens: 128_000,
},
],
},
},
},
},
runtime: {
agent: {
defaults: { provider: "openai", model: "gpt-5.4" },
resolveAgentDir: () => path.join(workspaceDir, ".agent"),
runEmbeddedPiAgent,
},
state: {
resolveStateDir: () => stateDir,
},
} as never,
});
await reviewTranscriptForProposal({
api,
config: {
enabled: true,
autoCapture: true,
approvalPolicy: "pending",
reviewMode: "llm",
reviewInterval: 1,
reviewMinToolCalls: 1,
reviewTimeoutMs: 5_000,
maxPending: 50,
maxSkillBytes: 40_000,
},
ctx: { agentId: "main", workspaceDir },
messages: [{ role: "user", content: "Remember this bare-model default." }],
});
expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
expect.objectContaining({
provider: "openai-codex",
model: "gpt-5.5",
}),
);
});
it("runs reviewer after threshold and queues the proposal", async () => {
const workspaceDir = await makeTempDir();
const stateDir = await makeTempDir();