
























@@ -686,6 +686,128 @@ describe("skill-workshop", () => {
686686);
687687});
688688689+it("uses the configured agent default for reviewer fallback", async () => {
690+const workspaceDir = await makeTempDir();
691+const stateDir = await makeTempDir();
692+const runEmbeddedPiAgent = vi.fn(async () => ({
693+payloads: [{ text: JSON.stringify({ action: "none" }) }],
694+meta: {},
695+}));
696+const api = createTestPluginApi({
697+config: {
698+agents: {
699+defaults: {
700+model: { primary: "openai-codex/gpt-5.5" },
701+},
702+},
703+},
704+runtime: {
705+agent: {
706+defaults: { provider: "openai", model: "gpt-5.4" },
707+resolveAgentDir: () => path.join(workspaceDir, ".agent"),
708+ runEmbeddedPiAgent,
709+},
710+state: {
711+resolveStateDir: () => stateDir,
712+},
713+} as never,
714+});
715+716+await reviewTranscriptForProposal({
717+ api,
718+config: {
719+enabled: true,
720+autoCapture: true,
721+approvalPolicy: "pending",
722+reviewMode: "llm",
723+reviewInterval: 1,
724+reviewMinToolCalls: 1,
725+reviewTimeoutMs: 5_000,
726+maxPending: 50,
727+maxSkillBytes: 40_000,
728+},
729+ctx: { agentId: "main", workspaceDir },
730+messages: [{ role: "user", content: "Remember this repeatable fix." }],
731+});
732+733+expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
734+expect.objectContaining({
735+provider: "openai-codex",
736+model: "gpt-5.5",
737+}),
738+);
739+});
740+741+it("infers reviewer fallback provider for a bare configured model", async () => {
742+const workspaceDir = await makeTempDir();
743+const stateDir = await makeTempDir();
744+const runEmbeddedPiAgent = vi.fn(async () => ({
745+payloads: [{ text: JSON.stringify({ action: "none" }) }],
746+meta: {},
747+}));
748+const api = createTestPluginApi({
749+config: {
750+agents: {
751+defaults: {
752+model: { primary: "gpt-5.5" },
753+},
754+},
755+models: {
756+providers: {
757+"openai-codex": {
758+baseUrl: "https://chatgpt.com/backend-api/codex",
759+models: [
760+{
761+id: "gpt-5.5",
762+name: "GPT 5.5",
763+reasoning: true,
764+input: ["text"],
765+cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
766+contextWindow: 200_000,
767+maxTokens: 128_000,
768+},
769+],
770+},
771+},
772+},
773+},
774+runtime: {
775+agent: {
776+defaults: { provider: "openai", model: "gpt-5.4" },
777+resolveAgentDir: () => path.join(workspaceDir, ".agent"),
778+ runEmbeddedPiAgent,
779+},
780+state: {
781+resolveStateDir: () => stateDir,
782+},
783+} as never,
784+});
785+786+await reviewTranscriptForProposal({
787+ api,
788+config: {
789+enabled: true,
790+autoCapture: true,
791+approvalPolicy: "pending",
792+reviewMode: "llm",
793+reviewInterval: 1,
794+reviewMinToolCalls: 1,
795+reviewTimeoutMs: 5_000,
796+maxPending: 50,
797+maxSkillBytes: 40_000,
798+},
799+ctx: { agentId: "main", workspaceDir },
800+messages: [{ role: "user", content: "Remember this bare-model default." }],
801+});
802+803+expect(runEmbeddedPiAgent).toHaveBeenCalledWith(
804+expect.objectContaining({
805+provider: "openai-codex",
806+model: "gpt-5.5",
807+}),
808+);
809+});
810+689811it("runs reviewer after threshold and queues the proposal", async () => {
690812const workspaceDir = await makeTempDir();
691813const stateDir = await makeTempDir();
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。