Skip to content

multi-review: 支持为 reviewer 和 coordinator 分配不同模型 #231

Description

@Svtter

背景

当前 multi-review action 只有一个 model 输入,所有 reviewer(quality、security、performance 等)和最后的 coordinator(总结合成)共用同一个模型。

当前架构:

  model: X ──┬──> Reviewer sessions (quality, security, ...)
             └──> Coordinator session (synthesis)
             
  全部使用同一个 SDK client → 同一个模型

需求

增加两个独立的模型输入,允许用户分别指定:

  1. reviewer 使用的模型 — 用于各 reviewer 的代码审查
  2. 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/sdksession.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 OrchestratorOptionscoordinatorModel 可选字段
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 文档更新

具体改动

  1. action.yml — 新增 input coordinator-model(description: 为 coordinator 合成步骤指定不同模型),传递 MULTI_REVIEW_COORDINATOR_MODEL 环境变量
  2. 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) };
    }
  3. types.tsOrchestratorOptions 加:
    coordinatorModel?: { providerID: string; modelID: string };
  4. orchestrator.tsrunCoordinator() 中 prompt 调用加 model:
    client.session.prompt({
      path: { id: sessionId },
      body: {
        ...(opts.coordinatorModel ? { model: opts.coordinatorModel } : {}),
        parts: [{ type: "text", text: fullPrompt }],
      },
    })
  5. index.tsmain() 中解析并传递:
    const coordinatorModel = resolveCoordinatorModel();
    // ...传给 runCoordinator 的 opts

Metadata

Metadata

Assignees

No one assigned

    Labels

    agentOpenCode agent SDK integrationenhancementNew feature or requesttriagedIssue has been triaged

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions