背景
当前 multi-review action 只有一个 model 输入,所有 reviewer(quality、security、performance 等)和最后的 coordinator(总结合成)共用同一个模型。
当前架构:
model: X ──┬──> Reviewer sessions (quality, security, ...)
└──> Coordinator session (synthesis)
全部使用同一个 SDK client → 同一个模型
需求
增加两个独立的模型输入,允许用户分别指定:
- reviewer 使用的模型 — 用于各 reviewer 的代码审查
- coordinator 使用的模型 — 用于最终总结合成
使用场景
- Reviewer 使用廉价/快速模型(如
deepseek/deepseek-v4-flash)做大量并行审查
- Coordinator 使用更强的模型(如
zhipuai-coding-plan/glm-5.1)做高质量总结
- 反之亦然:强模型审查,快速模型总结
- 成本优化 + 质量控制的灵活组合
预期 API
- uses: sun-praise/opencode-actions/multi-review@v3
with:
model: deepseek/deepseek-v4-flash # reviewer 模型
coordinator-model: zhipuai-coding-plan/glm-5.1 # coordinator 模型
向后兼容:
coordinator-model 不设置时,coordinator 继续使用 model(当前行为)
model 不设置时,保持现有默认值
SDK 调研结果
@opencode-ai/sdk 的 session.prompt() 支持 per-prompt 模型覆盖:
// types.gen.d.ts — SessionPromptData
export type SessionPromptData = {
body?: {
model?: {
providerID: string;
modelID: string;
};
parts: Array<...>;
};
path: { id: string };
};
这意味着 方案 B(单 server 实例 + per-prompt override)完全可行,无需启动额外的 opencode server 进程。
实现方案:
createOpencode({ config: { model: "reviewer-model" } })
│
├── session 1: prompt({ model: undefined }) → reviewer-model (默认)
├── session 2: prompt({ model: undefined }) → reviewer-model (默认)
└── coordinator: prompt({ model: { providerID, modelID } }) → coordinator-model
单 server 进程 ✓ 无额外开销 ✓ SDK 原生支持 ✓
实现计划
涉及的文件
| 文件 |
改动 |
multi-review/action.yml |
新增 coordinator-model 输入 + 环境变量传递 |
multi-review/src/types.ts |
OrchestratorOptions 加 coordinatorModel 可选字段 |
multi-review/src/reviewers.ts |
新增 resolveCoordinatorModel(),fallback 到 reviewer model |
multi-review/src/orchestrator.ts |
runCoordinator() 的 prompt() 调用传入 model 参数 |
multi-review/src/index.ts |
解析 coordinator model 并传入 orchestrator options |
multi-review/README.md |
文档更新 |
具体改动
action.yml — 新增 input coordinator-model(description: 为 coordinator 合成步骤指定不同模型),传递 MULTI_REVIEW_COORDINATOR_MODEL 环境变量
reviewers.ts — 新增 resolveCoordinatorModel():
export function resolveCoordinatorModel(): { providerID: string; modelID: string } | undefined {
const raw = env("MULTI_REVIEW_COORDINATOR_MODEL");
if (!raw) return undefined; // fallback: coordinator 用 reviewer model
const idx = raw.indexOf("/");
if (idx === -1) throw new Error(...);
return { providerID: raw.slice(0, idx), modelID: raw.slice(idx + 1) };
}
types.ts — OrchestratorOptions 加:
coordinatorModel?: { providerID: string; modelID: string };
orchestrator.ts — runCoordinator() 中 prompt 调用加 model:
client.session.prompt({
path: { id: sessionId },
body: {
...(opts.coordinatorModel ? { model: opts.coordinatorModel } : {}),
parts: [{ type: "text", text: fullPrompt }],
},
})
index.ts — main() 中解析并传递:
const coordinatorModel = resolveCoordinatorModel();
// ...传给 runCoordinator 的 opts
背景
当前
multi-reviewaction 只有一个model输入,所有 reviewer(quality、security、performance 等)和最后的 coordinator(总结合成)共用同一个模型。需求
增加两个独立的模型输入,允许用户分别指定:
使用场景
deepseek/deepseek-v4-flash)做大量并行审查zhipuai-coding-plan/glm-5.1)做高质量总结预期 API
向后兼容:
coordinator-model不设置时,coordinator 继续使用model(当前行为)model不设置时,保持现有默认值SDK 调研结果
@opencode-ai/sdk的session.prompt()支持 per-prompt 模型覆盖:这意味着 方案 B(单 server 实例 + per-prompt override)完全可行,无需启动额外的 opencode server 进程。
单 server 进程 ✓ 无额外开销 ✓ SDK 原生支持 ✓
实现计划
涉及的文件
multi-review/action.ymlcoordinator-model输入 + 环境变量传递multi-review/src/types.tsOrchestratorOptions加coordinatorModel可选字段multi-review/src/reviewers.tsresolveCoordinatorModel(),fallback 到 reviewer modelmulti-review/src/orchestrator.tsrunCoordinator()的prompt()调用传入model参数multi-review/src/index.tsmulti-review/README.md具体改动
action.yml— 新增 inputcoordinator-model(description: 为 coordinator 合成步骤指定不同模型),传递MULTI_REVIEW_COORDINATOR_MODEL环境变量reviewers.ts— 新增resolveCoordinatorModel():types.ts—OrchestratorOptions加:orchestrator.ts—runCoordinator()中 prompt 调用加 model:index.ts—main()中解析并传递: