Skip to content

WARNING

本页面由 AI 自动翻译,部分技术术语可能与中文习惯存在差异。如有疑问,请以英文原文为准。

使用 oh-my-openagent 编排多代理工作流

oh-my-openagent (OMO) 是 OpenCode 的多模型代理编排插件。启用后,你可以在 OpenCode 中使用关键词 ultrawork(或别名 ulw)触发多代理协作。Sisyphus、Hephaestus、Oracle 和 Atlas 等专业代理分工协作,共同处理复杂的编码任务。

WARNING

本指南侧重于本地模型设置。与付费云模型相比,完全在本地模型上运行 OMO 会明显降低编排质量和多代理协作速度。对于实际工作,我们推荐混合设置:为主代理使用付费云模型,为子代理使用本地模型。

学习目标

在本教程结束时,你将学习如何:

  • 在 Olares 上的 OpenCode 中启用 OMO。
  • 将 OMO 配置为与本地模型、云模型或两者混合使用。
  • 使用 ultrawork 关键词触发多代理协作。
  • 使用内置的 context7、grep_app 和 websearch MCP 服务器。
  • 将文档查询路由到自托管的 Context7, alongside OMO。

前提条件

开始前,你需要:

  • 你的 Olares 设备必须具有互联网访问权限。

  • 在 Olares 上安装 OpenCode,chart 版本 1.0.6 或更高。

  • 以下模型:

    用途模型获取方式
    核心代理Qwen3.6-27B (llama.cpp)从 Market 安装
    轻量子代理Qwen3.5-9B (Ollama)通过 Ollama Engine Base 应用创建

配置 OMO 前,请先将两个模型连接到 OpenCode

可选:使用其他模型

你也可以选择不同大小的模型,或改用其他模型提供商:

  • 从应用市场安装其他模型应用。
  • 通过引擎基座应用创建模型实例,使用自己的模型。

如果 AI Agent 应用已安装 Olares CLIAgent Skills,可以让它部署模型并跳过手动设置。例如:

plain
使用 Ollama 引擎基座在我的 Olares 上部署 qwen3.5:9b。

模型能力要求

  • 参数少于 7B 的本地模型通常无法正确处理 tool_use 或结构化输出。避免将它们用于任何代理。
  • 建议上下文窗口至少为 32K token。核心代理(Sisyphus、Hephaestus、Prometheus、Atlas)使用 64K 或更多时效果更好。
  • 本地模型有时无法正确生成 write 工具调用。

了解 Olares 上的 OMO

模型如何选择

OMO 将模型选择在你和配置文件之间分配:

  • 主模型:你直接与之聊天的代理的模型。你在 OpenCode UI 的模型选择器中挑选它。它独立于 oh-my-openagent.json
  • 子代理模型:当主代理调用 delegate_task 将工作交给子代理(如 Explore 或 Librarian)时,该子代理使用 ~/.config/opencode/oh-my-openagent.jsonagents 字段下为该代理定义的模型。

默认的 oh-my-openagent.json 为每个子代理配备了多层回退链:付费主模型、付费备用模型,以及 OpenCode 提供的免费模型作为最后的回退。如果第一个模型在运行时不可用,runtime_fallback 会自动沿链向下走到下一个。大致如下:

text
oh-my-openagent.json
└── agents
    └── <agent name>
        └── model chain:  paid primary → paid backup → free fallback
                              (runtime_fallback auto-switches on failure)

这使子代理委托即使在提供方宕机时也能继续工作。

配置文件中的默认模型

OMO 为每个代理的提示调整特定的模型系列。默认配置文件使用以下主模型和回退模型:

代理推荐的 UI 模型(云)免费回退
SisyphusClaude Opus 4.6Big Pickle
HephaestusGPT-5.4Big Pickle
PrometheusClaude Opus 4.6Big Pickle
AtlasClaude Sonnet 4.6Big Pickle
OracleGPT-5.4Big Pickle
ExploreClaude Haiku 4.5GPT-5 Nano
LibrarianMiniMax M2.7GPT-5 Nano

有关每个代理和每个类别的推荐模型的完整列表,请参阅 Agent-to-model 匹配参考

Olares 为 OMO 管理的文件

安装 OpenCode 时,Olares 会预配置 OMO。预安装项目位于全局 OpenCode 配置目录下,该目录映射到 Olares Files 中的 Application/Data/opencode/.config/opencode/。本指南的其余部分使用 ~/.config/opencode/ 作为此路径的简写。

文件清单
路径作用
~/.config/opencode/opencode.jsonplugin 字段)在全局配置中注册 "oh-my-openagent"
~/.config/opencode/oh-my-openagent.json每个代理的推荐模型以及运行时回退链。仅在首次安装时写入。
~/.config/opencode/olares-baseline-instructions.mdWeb 预览、包管理和 Olares 域约定。每次启动时刷新。
~/.config/opencode/skills/web-preview/system-admin/技能文件。每次启动时强制更新。
/usr/local/lib/node_modules/oh-my-opencode/(容器内)npm 包。持久化在系统快照中。

所有 Olares 管理的设置都位于全局配置目录中。它们永远不会写入你的工作空间 opencode.json。如果你的工作空间配置仍然包含旧的 Olares 管理的指令,Olares 只会在它们与之前的预设完全匹配时才删除它们。你添加或修改的任何内容都会被保留。

oh-my-openagent.json 文件仅在首次安装时写入。如果你稍后通过 install 命令或手动更新它,你的更改不会被覆盖。

配置 OMO

启用 OMO

OMO 由 OPENCODE_OMO 环境变量控制:

  • false(默认):插件不加载。npm 包和配置文件保留在磁盘上,因此稍后启用它不需要再次下载。
  • true:插件在全局配置中注册,并安装 npm 包。

要启用 OMO:

  1. 打开 Settings 并导航到 Applications > OpenCode > Manage environment variablesLocate the OPENCODE_OMO environment variable

  2. 找到 OPENCODE_OMO 环境变量并点击 edit_square

  3. Value 下拉菜单中,选择 true,然后点击 ConfirmSet OPENCODE_OMO to true

  4. 点击 Apply 保存更改,并等待应用重启。

首次启动时,OMO 需要时间来完成其初始配置。这可能需要几分钟。

要稍后禁用 OMO,请重复上述步骤并将 OPENCODE_OMO 设置为 false。插件注册和 MCP 服务器停止,但 npm 包和 oh-my-openagent.json 配置保留在磁盘上,供下次重新启用。

配置本地模型

配置 ~/.config/opencode/oh-my-openagent.json,让 OMO 将任务委派给本地模型。以下两种情况可以跳过本节:

  • 仅使用云模型:在 OpenCode 的提供方中添加 API 密钥并使用云模型。
  • 仅使用免费回退模型:使用 OpenCode 自带的免费回退模型,但响应速度可能较慢,并受到额度限制。

OMO 在两个位置使用模型:

  • 主代理:在 OpenCode 模型选择器中单独选择模型。本节不会更改该选择。
  • 子代理和任务类别:将 Qwen3.6-27B 分配给核心代理和高负载任务,将 Qwen3.5-9B 用于 Explore、Librarian 和轻量任务。

需要重启

每次编辑 oh-my-openagent.json 后,都需重启 OpenCode 才能使更改生效。

  1. 打开文件管理器,前往 Application/Data/opencode/.config/opencode/,找到 oh-my-openagent.json

    找到 oh-my-openagent.json

  2. 打开 oh-my-openagent.json,点击 edit_square 进入编辑模式。

  3. 更新 agents 部分,让子代理委派使用本地模型:

    a. 设置每个代理的 model 字段。该值必须包含 OpenCode 中使用的 provider 前缀,后接准确的模型名称。

    b. 将 Qwen3.6-27B 分配给核心代理,将 Qwen3.5-9B 分配给 Explore 和 Librarian。为使用 Ollama 模型的代理添加 "stream": false

    例如,如果 provider 名称分别为 qwen3.6-27bqwen3.5-9b

    json
    {
      "agents": {
        "sisyphus": { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
        "hephaestus": { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
        "prometheus": { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
        "atlas": { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
        "explore": { "model": "qwen3.5-9b/qwen3.5:9b", "stream": false },
        "librarian": { "model": "qwen3.5-9b/qwen3.5:9b", "stream": false }
      }
    }

    "stream": false 要求

    Ollama 的流式模式返回 SDK 无法解析的 NDJSON。如果缺少 "stream": false,使用工具的代理,尤其是 Librarian 和 Explore,会静默回退到模型链中的下一个模型。这是 Ollama 的已知限制。

  4. categories 部分,为 quickwriting 使用 Qwen3.5-9B,其他类别使用 Qwen3.6-27B。保留现有的 fallback_models 条目。例如:

    jsonc
    {
      "categories": {
        "visual-engineering": {
          "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
          "fallback_models": [
            // 保留现有的 fallback 条目
          ]
        },
        "quick": {
          "model": "qwen3.5-9b/qwen3.5:9b",
          "fallback_models": [
            // 保留现有的 fallback 条目
          ]
        },
        "writing": {
          "model": "qwen3.5-9b/qwen3.5:9b",
          "fallback_models": [
            // 保留现有的 fallback 条目
          ]
        }
      }
    }
categories 部分
json
{
  "categories": {
    "visual-engineering": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        {
          "model": "qwen3.5-9b/qwen3.5:9b"
        },
        {
          "model": "google/gemini-3.1-pro-preview",
          "variant": "high"
        },
        {
          "model": "github-copilot/gemini-3.1-pro-preview",
          "variant": "high"
        },
        {
          "model": "anthropic/claude-opus-4-6",
          "variant": "max"
        },
        {
          "model": "github-copilot/claude-opus-4.6",
          "variant": "max"
        },
        {
          "model": "opencode/big-pickle"
        }
      ]
    },
    "ultrabrain": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        {
          "model": "qwen3.5-9b/qwen3.5:9b"
        },
        {
          "model": "openai/gpt-5.4",
          "variant": "xhigh"
        },
        {
          "model": "google/gemini-3.1-pro-preview",
          "variant": "high"
        },
        {
          "model": "github-copilot/gemini-3.1-pro-preview",
          "variant": "high"
        },
        {
          "model": "anthropic/claude-opus-4-6",
          "variant": "max"
        },
        {
          "model": "github-copilot/claude-opus-4.6",
          "variant": "max"
        },
        {
          "model": "opencode/big-pickle"
        }
      ]
    },
    "deep": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        {
          "model": "qwen3.5-9b/qwen3.5:9b"
        },
        {
          "model": "openai/gpt-5.4",
          "variant": "medium"
        },
        {
          "model": "github-copilot/gpt-5.4",
          "variant": "medium"
        },
        {
          "model": "anthropic/claude-opus-4-6",
          "variant": "max"
        },
        {
          "model": "github-copilot/claude-opus-4.6",
          "variant": "max"
        },
        {
          "model": "google/gemini-3.1-pro-preview",
          "variant": "high"
        },
        {
          "model": "github-copilot/gemini-3.1-pro-preview",
          "variant": "high"
        },
        {
          "model": "opencode/big-pickle"
        }
      ]
    },
    "artistry": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        {
          "model": "qwen3.5-9b/qwen3.5:9b"
        },
        {
          "model": "google/gemini-3.1-pro-preview",
          "variant": "high"
        },
        {
          "model": "github-copilot/gemini-3.1-pro-preview",
          "variant": "high"
        },
        {
          "model": "anthropic/claude-opus-4-6",
          "variant": "max"
        },
        {
          "model": "github-copilot/claude-opus-4.6",
          "variant": "max"
        },
        {
          "model": "openai/gpt-5.4"
        },
        {
          "model": "github-copilot/gpt-5.4"
        },
        {
          "model": "opencode/big-pickle"
        }
      ]
    },
    "quick": {
      "model": "qwen3.5-9b/qwen3.5:9b",
      "fallback_models": [
        {
          "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M"
        },
        {
          "model": "openai/gpt-5.4-mini"
        },
        {
          "model": "github-copilot/gpt-5.4-mini"
        },
        {
          "model": "anthropic/claude-haiku-4-5"
        },
        {
          "model": "github-copilot/claude-haiku-4.5"
        },
        {
          "model": "google/gemini-3-flash-preview"
        },
        {
          "model": "github-copilot/gemini-3-flash-preview"
        },
        {
          "model": "opencode/gpt-5-nano"
        }
      ]
    },
    "unspecified-low": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        {
          "model": "qwen3.5-9b/qwen3.5:9b"
        },
        {
          "model": "anthropic/claude-sonnet-4-6"
        },
        {
          "model": "github-copilot/claude-sonnet-4.6"
        },
        {
          "model": "openai/gpt-5.3-codex",
          "variant": "medium"
        },
        {
          "model": "google/gemini-3-flash-preview"
        },
        {
          "model": "github-copilot/gemini-3-flash-preview"
        },
        {
          "model": "opencode/big-pickle"
        }
      ]
    },
    "unspecified-high": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        {
          "model": "qwen3.5-9b/qwen3.5:9b"
        },
        {
          "model": "anthropic/claude-sonnet-4-6"
        },
        {
          "model": "github-copilot/claude-sonnet-4.6"
        },
        {
          "model": "openai/gpt-5.3-codex",
          "variant": "medium"
        },
        {
          "model": "google/gemini-3-flash-preview"
        },
        {
          "model": "github-copilot/gemini-3-flash-preview"
        },
        {
          "model": "opencode/big-pickle"
        }
      ]
    },
    "writing": {
      "model": "qwen3.5-9b/qwen3.5:9b",
      "fallback_models": [
        {
          "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M"
        },
        {
          "model": "google/gemini-3-flash-preview"
        },
        {
          "model": "github-copilot/gemini-3-flash-preview"
        },
        {
          "model": "anthropic/claude-sonnet-4-6"
        },
        {
          "model": "github-copilot/claude-sonnet-4.6"
        },
        {
          "model": "opencode/big-pickle"
        }
      ]
    }
  }
}
  1. 为两个本地模型添加并发限制:

    json
    {
      "background_task": {
        "providerConcurrency": {
          "qwen3.6-27b": 1,
          "qwen3.5-9b": 1
        },
        "modelConcurrency": {
          "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M": 1,
          "qwen3.5-9b/qwen3.5:9b": 2
        }
      }
    }

    这样会将大模型限制为一个并发请求,同时允许轻量模型最多处理两个请求。

本地模型的 oh-my-openagent.json
json
{
  "$schema": "https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/dev/assets/oh-my-opencode.schema.json",
  "runtime_fallback": {
    "enabled": true,
    "max_fallback_attempts": 7
  },
  "agents": {
    "sisyphus": { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
    "hephaestus": { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
    "prometheus": { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
    "atlas": { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
    "explore": { "model": "qwen3.5-9b/qwen3.5:9b" },
    "librarian": { "model": "qwen3.5-9b/qwen3.5:9b" }
  },
  "categories": {
    "visual-engineering": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        { "model": "qwen3.5-9b/qwen3.5:9b" },
        { "model": "google/gemini-3.1-pro-preview", "variant": "high" },
        { "model": "github-copilot/gemini-3.1-pro-preview", "variant": "high" },
        { "model": "anthropic/claude-opus-4-6", "variant": "max" },
        { "model": "github-copilot/claude-opus-4.6", "variant": "max" },
        { "model": "opencode/big-pickle" }
      ]
    },
    "ultrabrain": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        { "model": "qwen3.5-9b/qwen3.5:9b" },
        { "model": "openai/gpt-5.4", "variant": "xhigh" },
        { "model": "google/gemini-3.1-pro-preview", "variant": "high" },
        { "model": "github-copilot/gemini-3.1-pro-preview", "variant": "high" },
        { "model": "anthropic/claude-opus-4-6", "variant": "max" },
        { "model": "github-copilot/claude-opus-4.6", "variant": "max" },
        { "model": "opencode/big-pickle" }
      ]
    },
    "deep": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        { "model": "qwen3.5-9b/qwen3.5:9b" },
        { "model": "openai/gpt-5.4", "variant": "medium" },
        { "model": "github-copilot/gpt-5.4", "variant": "medium" },
        { "model": "anthropic/claude-opus-4-6", "variant": "max" },
        { "model": "github-copilot/claude-opus-4.6", "variant": "max" },
        { "model": "google/gemini-3.1-pro-preview", "variant": "high" },
        { "model": "github-copilot/gemini-3.1-pro-preview", "variant": "high" },
        { "model": "opencode/big-pickle" }
      ]
    },
    "artistry": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        { "model": "qwen3.5-9b/qwen3.5:9b" },
        { "model": "google/gemini-3.1-pro-preview", "variant": "high" },
        { "model": "github-copilot/gemini-3.1-pro-preview", "variant": "high" },
        { "model": "anthropic/claude-opus-4-6", "variant": "max" },
        { "model": "github-copilot/claude-opus-4.6", "variant": "max" },
        { "model": "openai/gpt-5.4" },
        { "model": "github-copilot/gpt-5.4" },
        { "model": "opencode/big-pickle" }
      ]
    },
    "quick": {
      "model": "qwen3.5-9b/qwen3.5:9b",
      "fallback_models": [
        { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
        { "model": "openai/gpt-5.4-mini" },
        { "model": "github-copilot/gpt-5.4-mini" },
        { "model": "anthropic/claude-haiku-4-5" },
        { "model": "github-copilot/claude-haiku-4.5" },
        { "model": "google/gemini-3-flash-preview" },
        { "model": "github-copilot/gemini-3-flash-preview" },
        { "model": "opencode/gpt-5-nano" }
      ]
    },
    "unspecified-low": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        { "model": "qwen3.5-9b/qwen3.5:9b" },
        { "model": "anthropic/claude-sonnet-4-6" },
        { "model": "github-copilot/claude-sonnet-4.6" },
        { "model": "openai/gpt-5.3-codex", "variant": "medium" },
        { "model": "google/gemini-3-flash-preview" },
        { "model": "github-copilot/gemini-3-flash-preview" },
        { "model": "opencode/big-pickle" }
      ]
    },
    "unspecified-high": {
      "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M",
      "fallback_models": [
        { "model": "qwen3.5-9b/qwen3.5:9b" },
        { "model": "anthropic/claude-sonnet-4-6" },
        { "model": "github-copilot/claude-sonnet-4.6" },
        { "model": "openai/gpt-5.3-codex", "variant": "medium" },
        { "model": "google/gemini-3-flash-preview" },
        { "model": "github-copilot/gemini-3-flash-preview" },
        { "model": "opencode/big-pickle" }
      ]
    },
    "writing": {
      "model": "qwen3.5-9b/qwen3.5:9b",
      "fallback_models": [
        { "model": "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M" },
        { "model": "google/gemini-3-flash-preview" },
        { "model": "github-copilot/gemini-3-flash-preview" },
        { "model": "anthropic/claude-sonnet-4-6" },
        { "model": "github-copilot/claude-sonnet-4.6" },
        { "model": "opencode/big-pickle" }
      ]
    }
  },
  "background_task": {
    "providerConcurrency": {
      "qwen3.6-27b": 1,
      "qwen3.5-9b": 1
    },
    "modelConcurrency": {
      "qwen3.6-27b/unsloth/Qwen3.6-27B-GGUF:Q4_K_M": 1,
      "qwen3.5-9b/qwen3.5:9b": 2
    }
  }
}
  1. 保存文件。

  2. 重启 OpenCode:

    a. 打开设置,前往应用 > OpenCode

    b. 点击停止,然后点击恢复

确认插件已加载

启用 OMO 后,打开 OpenCode Web UI。你应该会在顶部的代理选择器中看到 Sisyphus、Prometheus、Atlas 和 Hephaestus。

Agent selector with OMO enabled

你也可以点击右上角的状态图标来确认 oh-my-openagent 出现在 plugin 下。

oh-my-openagent listed under plugin in the status panel

使用 OMO

OMO 附带一组专业代理,每个代理的提示都针对特定角色进行了调整。你从代理选择器中选择 Sisyphus、Prometheus、Atlas 或 Hephaestus 作为主代理。其余的代理在多代理协作期间自动调度。

代理角色如何访问
Sisyphus主编排器。r>在 ultrawork 模式下规划、委托给子代理并驱动并行
执行。
代理选择器
Hephaestus自主深度工作者。r>处理架构推理和长时间
自主编码会话。
代理选择器
Prometheus战略规划师。r>就需求采访你并生成
详细计划。
代理选择器
Atlas计划执行者。r>接管 Prometheus 计划并执行它。代理选择器,或在规划后使用 /start-work
Oracle只读架构顾问。r>就架构决策和复杂
调试提供建议,不修改文件。
ultrawork 中自动调度
Explore代码搜索代理。r>检索整个仓库的代码。ultrawork 中自动调度
Librarian文档搜索代理。r>搜索文档和代码。ultrawork 中自动调度

其他支持代理(如用于计划差距分析的 Metis、用于计划审查的 Momus,以及用于视觉输入的 Multimodal Looker)在需要时由 Sisyphus 自动调度。

单代理模式

启用 OMO 后,代理选择器从 Plan/Build 变为 Sisyphus、Prometheus、Atlas 和 Hephaestus。你不需要每次都启动多代理协作。没有 ultrawork 关键词时,每个代理独立运行,行为类似于原始的 Build 或 Plan 模式,没有额外的资源使用。

任务如何操作
直接编码
(以前的 Build)
选择 Sisyphus 并正常聊天。与
原始的 Build 模式体验相同。
先规划,再执行
(以前的 Plan)
选择 Prometheus。它采访你并生成
计划。输入 /start-work 交给 Atlas。
深度自主编码选择 Hephaestus。适合大型、复杂任务,可
自主运行。

多代理协作模式

在聊天框中输入 ultrawork(或别名 ulw)后跟任务描述。例如:

text
ulw Implement a REST API user registration feature with email verification.

OMO 分析任务,将其分配给专业代理,并并行运行它们直到任务完成。当 ultrawork 激活时,聊天框上方闪烁的颜色指示当前正在工作的代理。

ultrawork running multi-agent collaboration

Prometheus 规划模式

意外的技能触发

任务描述中的某些关键词可能会触发 OpenCode 调用 /web-preview 技能。如果发生这种情况,请要求代理忽略它并继续规划。

对于大型、复杂任务,先规划:

  1. 在代理选择器中切换到 Prometheus。

  2. 描述你的任务。例如:

    text
    Build a CLI tool that scans a folder and generates a summary report of its contents.
  3. 回答 Prometheus 的问题以明确范围和细节。

    Prometheus asking clarifying questions

  4. Prometheus 在 .sisyphus/plans/ 下生成计划文件后,输入 /start-work 将执行交给 Atlas。如果没有计划文件,/start-work 没有内容可传递给 Atlas,因此不会执行任何操作。

    规划期间请耐心等待

    如果 Prometheus 没有立即产生输出,或代理状态显示 background output,代理仍在工作。等待它完成后再发送另一条消息。

常用命令

命令描述
ultrawork / ulw启动多代理协作模式。在聊天框中作为关键词输入。
/start-work执行 Prometheus 生成的计划。
/init-deep为每个项目目录生成 AGENTS.md 上下文文件。
/ulw-loop循环运行 ultrawork 直到任务达到 100% 完成。
/handoff生成上下文摘要,以便你可以在新会话中继续工作。

使用内置 MCP 服务器

OMO 注册了三个远程 MCP 服务器,为代理提供对外部知识的实时访问。这些服务器不是 OpenCode 原生的。OMO 通过钩子注入它们。启用 OMO 后,你可以在 Settings 的 MCP 标签页下找到它们。

Built-in MCP servers

MCP 服务器使用场景API key
context7针对官方
文档的实时查询。
基本使用不需要。
添加 key 以获得更高配额。
grep_appGitHub 全站代码搜索。不需要。
websearch实时网页搜索。基本使用不需要。
添加 key 以获得更高配额,
或从 Exa 切换到 Tavily。

下面的示例显式命名 MCP 工具。你也可以让代理在检测到意图时自动选择。

要提高 context7 或 websearch 的配额,或将 websearch 提供方从 Exa 切换到 Tavily,请参阅 配置 API key

context7:实时官方文档

AI 的训练数据有截止日期。当你使用较新的库版本时,AI 可能会生成已弃用的 API 或不存在的方法。Context7(由 Upstash 在 https://mcp.context7.com/mcp 提供)直接从源文档中提取最新内容并将其注入对话中。

例如,输入:

text
Implement a form submission with React 19's useActionState Hook. use context7

context7 MCP in action

grep_app:GitHub 全站代码搜索

当 AI 不确定最佳实践或 API 用法时,它可以搜索 GitHub 项目中的真实代码作为参考。此 MCP 服务器由 Vercel 在 https://mcp.grep.app 提供。

例如,输入:

text
Find real examples of Drizzle ORM with PostgreSQL migrations. use grep_app

grep_app MCP searching GitHub code

websearch:实时网页搜索

此 MCP 服务器默认使用 Exa AI (https://mcp.exa.ai/mcp?tools=web_search_exa),可以通过配置切换到 Tavily。

例如,输入:

text
What are the major changes in Kubernetes 1.32 released in 2026? use websearch

websearch MCP returning real-time results

配置 API key 和切换提供方

context7 和 websearch 都可以在没有 key 的情况下工作,但添加 key 会提高你的配额并解除速率限制。你也可以将 websearch 从 Exa(默认)切换到 Tavily。grep_app 没有 key。

要配置任何这些,请在 ~/.config/opencode/oh-my-openagent.jsonmcp 字段下添加内置 MCP 定义的覆盖。覆盖会完全替换内置定义,因此 typeurlenabled 都必须存在。如果你设置多个覆盖,请将它们放在同一个 mcp 对象下。

需要重启

每次编辑 oh-my-openagent.json 后重启 OpenCode,以使新定义生效。

为 context7 添加 API key

context7.com 获取 key,然后将其添加到 oh-my-openagent.json

json
{
  "mcp": {
    "context7": {
      "type": "remote",
      "url": "https://mcp.context7.com/mcp",
      "enabled": true,
      "headers": {
        "CONTEXT7_API_KEY": "YOUR_CONTEXT7_KEY"
      }
    }
  }
}

要验证 key 是否激活,请要求代理使用 use context7 查找最近发布的库,然后检查你的 Context7 仪表板以了解使用量的增加。

为 websearch 添加 API key(Exa)

默认情况下,websearch 使用 Exa。从 exa.ai 获取 key,然后将其添加到 oh-my-openagent.json

json
{
  "mcp": {
    "websearch": {
      "type": "remote",
      "url": "https://mcp.exa.ai/mcp?tools=web_search_exa",
      "enabled": true,
      "headers": {
        "x-api-key": "YOUR_EXA_KEY"
      }
    }
  }
}

要验证 key 是否激活,请要求代理运行网页搜索,并在成功搜索后检查 dashboard.exa.ai 以了解使用量的增加。

将 websearch 从 Exa 切换到 Tavily

Tavily 是一个替代网页搜索提供方,每月提供 1,000 次免费搜索。从 app.tavily.com 获取 key,然后将 websearch 指向 Tavily:

json
{
  "mcp": {
    "websearch": {
      "type": "remote",
      "url": "https://mcp.tavily.com/mcp/",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer YOUR_TAVILY_KEY"
      }
    }
  }
}

要验证,请从代理运行网页搜索,并检查你的 Tavily 仪表板 以了解使用量的增加。要切换回 Exa,请用上面的 Exa 定义替换此块。

禁用特定 MCP 服务器

使用自托管的 Context7

OMO 的内置 context7 服务器在 https://mcp.context7.com/mcp 查询公共 Context7 云。要使用你自己的实例,请在 Olares 上安装 Context7 并在 OpenCode 中注册它。有关步骤,请参阅 将 Context7 连接到 OpenCode

opencode.json 中的条目优先于 OMO 的内置 MCP 服务器。如果你已经在 opencode.json 中有自托管的 Context7 条目,启用 OMO 时会发生什么取决于条目名称:

  • 如果名称不是 context7,你的自托管实例和 OMO 的内置 context7 服务器都会无冲突地加载。
  • 如果名称是 context7,它会与 OMO 的内置服务器冲突。在 opencode.json 中重命名你的条目(例如,改为 context7-local),或添加 "disabled_mcps": ["context7"]~/.config/opencode/oh-my-openagent.json 以禁用 OMO 的内置服务器。

高级配置

根据你的订阅重新生成 oh-my-openagent.json

预安装的配置启用了所有提供方。如果你只订阅了其中一些,请要求代理重新生成最佳配置。

使用 --claude--openai--gemini--copilot 标志(每个设置为 yesno)来匹配你的实际订阅。例如,如果你订阅了 Claude 和 Copilot 但没有订阅 OpenAI 或 Gemini,请在聊天窗口中输入:

text
Run: npx oh-my-opencode install --no-tui --claude=yes --openai=no --gemini=no --copilot=yes

根据你实际拥有的提供方调整 yes/no。这会更新 ~/.config/opencode/oh-my-openagent.json

版本要求

此命令需要 OpenCode 版本 1.4.0 或更高。它会重写所有代理的配置,但只有子代理模型从文件中生效。主代理始终使用你在 OpenCode UI 中选择的模型。

手动覆盖代理的模型

要为代理设置特定模型,请编辑 ~/.config/opencode/oh-my-openagent.json 并更新 model 字段:

json
{
  "agents": {
    "sisyphus": { "model": "kimi-for-coding/k2p5" },
    "oracle": { "model": "openai/gpt-5.4", "variant": "high" }
  }
}

WARNING

Explore 和 Librarian 是使用工具的代理。为它们分配高能力模型会增加 token 使用量而不会改善结果。

常见问题

ultrawork 无响应或抛出错误

要求 OpenCode 运行诊断:

text
Run: npx oh-my-opencode doctor

通常这意味着没有提供方已通过身份验证。

oh-my-openagent.json 中的设置与 UI 中选择的模型有什么关系?

UI 选择控制主代理(你与之聊天的代理)。oh-my-openagent.json 控制子代理,它们是通过 delegate_task 由主代理分派的后台任务。两者是独立的。

我可以同时使用多个提供方吗?

可以,而且推荐这样做。你配置的提供方越多,UI 选择器中可用的模型就越多,子代理委托可用的回退选项也越多。你仍然需要手动为主代理选择模型。

use context7use grep_appuse websearch 不起作用

确认 OMO 已启用。Settings 中的 MCP 标签页应在每个服务器旁边显示绿色圆点。如果服务器是灰色或断开连接的,远程端点可能暂时不可用。稍后再试。

首次启动时插件安装失败

检查 init-packages 容器的 Pod 日志并搜索 oh-my-opencode。如果 npm 下载超时,请确认你的 Olares 可以访问互联网。

重启后我的身份验证数据会保留吗?

会。身份验证存储在 ~/.config/opencode/ 下,重启后自动重新加载。

Olares 升级会覆盖我的配置吗?

不会。oh-my-openagent.json 仅在文件不存在时写入。全局 opencode.json 只管理 Olares 拥有的 plugininstructions 条目。你添加的任何其他条目都会被保留。技能文件(web-previewsystem-admin)在每次启动时强制更新到最新版本。

我会知道模型何时自动切换吗?

会。当 runtime_fallback 切换到另一个模型时,会出现一个 toast 通知,显示当前正在使用的模型。

了解更多