十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

opencode GitHub Action 实战指南:在 Issue 与 PR 评论区驱动编码代理

opencode GitHub Action 实战指南:在 Issue 与 PR 评论区驱动编码代理 opencode GitHub Action 实战指南在 Issue 与 PR 评论区驱动编码代理【免费下载链接】opencodeThe open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/openc/opencodeopencode 提供了一套官方 GitHub Action把 opencode 编码代理直接嵌入 GitHub 工作流在 Issue 或 PR 中评论/opencodeAction 就会在 Actions Runner 上拉取代码、读取完整上下文、执行任务并把结果回复、新分支或 PR写回评论区。本文以仓库中的 github/README.md 为核心结合 github/index.ts 的完整实现与 github/action.yml 的输入参数定义逐段讲解该 Action 的使用方式、参数细节与本地调试方法。读完本文你可以独立完成安装、配置并能在不出触发真实 Workflow 的情况下用 Mock 事件复现全链路行为。四种典型用法README 给出了四类触发场景核心交互方式都是“评论里带上触发词”解释 Issue在 Issue 中留下评论/opencode explain this issueopencode 会读取整个线程包括全部评论并回复清晰的解释。修复 Issue评论/opencode fix thisopencode 会创建新分支、实现改动并自动开一个 PR 提交这些变更。评审并修改 PR在 PR 中留下评论如Delete the attachment from S3 when the note is removed /ocopencode 会实现所请求的修改并把提交直接推到该 PR 分支上。针对具体代码行评论在 PR 的 “Files” 标签页直接对某几行代码评论例如/oc add error handling hereopencode 会自动检测到被评论的文件、行号和 diff 上下文从而给出更精准的响应。从源码 github/index.ts 的getReviewCommentContext()可以看到它从pull_request_review_comment事件载荷中提取的信息包括被评审的精确文件路径payload.comment.path具体行号line/original_line/position周围的 diff hunkdiff_hunk提交定位信息commit_id/original_commit_id这意味着行级评论场景下无需手动写明文件路径和行号。触发词支持/opencode和/oc两种写法且必须作为独立 token 出现。这一点在 github/index.ts 的assertPayloadKeyword()中由正则(?:^|\s)(?:\/opencode|\/oc)(?$|\s)强制校验不满足时 Action 直接报错Comments must mention /opencode or /oc。安装与配置一键安装在仓库目录下的终端执行opencode github install该命令会引导你完成 GitHub App 安装、Workflow 文件创建和 Secrets 配置。命令的存在可以在 CLI 帮助快照中确认help-snapshots.test.ts.snap 中列出了opencode github installinstall the GitHub agent与opencode github runrun the GitHub agent两个子命令其处理逻辑位于 github.handler.ts。手动安装如果不想走交互流程可以手动完成三步安装名为opencode-agent的 GitHub App并确保它安装到了目标仓库上README 给出的 App 入口为github.com/apps/opencode-agent。在仓库中添加工作流文件.github/workflows/opencode.yml并按需设置model与环境变量中的 API Key。README 中的完整模板如下name: opencode on: issue_comment: types: [created] pull_request_review_comment: types: [created] jobs: opencode: if: | contains(github.event.comment.body, /oc) || contains(github.event.comment.body, /opencode) runs-on: ubuntu-latest permissions: id-token: write steps: - name: Checkout repository uses: actions/checkoutv6 with: fetch-depth: 1 persist-credentials: false - name: Run opencode uses: anomalyco/opencode/githublatest env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: model: anthropic/claude-sonnet-4-20250514 use_github_token: true注意几个关键细节on只监听issue_comment与pull_request_review_comment的created事件与 github/index.ts 中assertContextEvent(issue_comment, pull_request_review_comment)支持的事件类型严格一致其他事件类型会直接抛错。permissions: id-token: write是 OIDC 令牌交换所必需的源码中通过core.getIDToken(opencode-github-action)获取 OIDC 令牌见下文“令牌获取”小节。if条件做的是粗过滤真正的关键词校验由 Action 内部完成二者互补。模板中use_github_token: true表示直接使用GITHUB_TOKEN环境变量跳过 GitHub App 的 OIDC 令牌交换若不用该选项则由opencode-agentApp 的 Installation Token 访问你的仓库。在组织或项目的Settings → Secrets and variables → Actions中存储所需的 API Key如ANTHROPIC_API_KEY。Action 输入参数详解github/action.yml 将该 Action 声明为一个composite复合 Action并定义了如下输入项这是 README 未展开、但配置时非常实用的部分参数必填默认值说明model是—使用的模型格式必须为provider/model如anthropic/claude-sonnet-4-20250514agent否—使用的 Agent 名。必须是 primary agent找不到时回退到配置中的 default agent 或buildshare否公共仓库默认 true是否分享 opencode 会话链接prompt否—自定义 prompt覆盖默认提示词use_github_token否false为true时跳过 OIDC 交换直接使用GITHUB_TOKEN环境变量mentions否/opencode,/oc逗号分隔的触发词列表不区分大小写variant否—模型变体用于 provider 特定的推理强度如high、max、minimaloidc_base_url否https://api.opencode.aiOIDC 令牌交换 API 的基础地址仅自装 GitHub App 时需要model的格式校验在 github/index.ts 的useEnvModel()中实现按第一个/拆分为providerID与modelID任一部分为空即抛出Invalid model ... Model must be in the format provider/model。agent的处理见resolveAgent()github/index.ts通过 SDK 拉取 agent 列表做名称匹配若不存在或属于 subagent会告警并回退默认 agent。复合 Action 自身的执行步骤为获取版本请求 opencode 仓库的最新 release tag写入version输出缓存以opencode-${runner.os}-${runner.arch}-${version}为 key 缓存~/.opencode/bin安装缓存未命中时执行curl -fsSL https://opencode.ai/install | bash加入 PATH追加$HOME/.opencode/bin运行调用opencode github run并把上述输入项原样透传为环境变量MODEL、AGENT、SHARE、PROMPT、USE_GITHUB_TOKEN、MENTIONS、VARIANT、OIDC_BASE_URL见 action.yml。依赖方面该包 github/package.json 声明了actions/core、actions/github、octokit/rest、octokit/graphql与 workspace 内的opencode-ai/sdk即 GitHub 侧走 OctokitREST GraphQL与 opencode 服务端通信走官方 SDK。源码视角下的执行流程github/index.ts 的主流程第 127–229 行是一条线性 pipeline按顺序完成校验、准备、会话建立与结果写回理解它对排查线上问题很有帮助。1. 启动本地 opencode 服务并等待就绪createOpencode()github/index.ts通过spawn启动opencode serve --hostname127.0.0.1 --port4096并用createOpencodeClient({ baseUrl })建立客户端。随后assertOpencodeConnected()github/index.ts以 300ms 间隔、最多 30 次重试探测服务日志接口失败则抛出Failed to connect to opencode server。2. 令牌获取OIDC 交换 vs GITHUB_TOKENgetAccessToken()github/index.ts有三条路径若设置了TOKEN环境变量对应use_github_token: true直接使用该令牌正常生产路径core.getIDToken(opencode-github-action)换取 OIDC 令牌再 POST 到https://api.opencode.ai/exchange_github_app_token用opencode-agentApp 的 Installation 身份换取安装令牌Mock 路径本地调试以MOCK_TOKEN个人访问令牌POST 到.../exchange_github_app_token_with_pat同时带上{ owner, repo }。拿到令牌后assertPermissions()github/index.ts通过 REST 的getCollaboratorPermissionLevel检查发起评论的用户是否具备admin或write权限否则拒绝执行使用TOKEN时跳过该检查。3. Prompt 组装评论文本 图片附件getUserPrompt()github/index.ts负责把评论转化为发给模型的 prompt评论体恰好是/opencode或/oc时行级评论场景生成“评审指定文件与行的改动并给出改进建议”的模板含文件、行号、diff hunk普通场景则使用Summarize this thread。评论体包含触发词时直接取评论正文作为 prompt行级评论场景会额外追加Context: You are reviewing a comment on file ... at line ...与Diff context段落。图片与附件解析用两组正则分别匹配 Markdown 图片/链接语法!?\[.*?\]\((https:\/\/github\.com\/user-attachments\/[^)])\)与img src.../标签命中后逐个fetch下载带 Bearer 令牌把 prompt 中的原 URL 原地替换为文件名并把下载内容以 base64 形式存入promptFiles。这些文件随后在chat()github/index.ts中作为type: file的 partdata:${mime};base64,...形式的 URL随消息一起发送。content-type不是image/*时会按text/plain处理因此附件不限于图片。4. 会话创建与事件订阅主流程创建 opencode 会话client.session.create并通过subscribeSessionEvents()github/index.ts打开 SSE 事件流${server.url}/event实时把message.part.updated事件中的工具调用todowrite、bash、edit、glob、grep、list、read、write、websearch各配一种 ANSI 颜色前缀和文本输出打印到 Actions 日志方便在运行记录里观察 agent 行为。若允许分享SHARE环境变量未显式设置时私有仓库不分享会调用client.session.share并在后续回复中附带opencode.ai/s/8位会话尾缀的会话链接footer 还会生成一张基于会话标题的社交卡片图片和指向本次 GitHub Run 的链接。5. 三种执行分支代码按事件来源分成三个分支github/index.tsIssue 分支checkoutNewBranch()创建opencode/issue编号-时间戳形式的分支generateBranchName()github/index.ts通过 GraphQL 拉取 Issue 标题、正文、作者、全部评论buildPromptDataForIssue()github/index.ts 会剔除本次 Action 自己刚创建的占位评论和触发评论本身拼入issue上下文中发给模型。若工作区有改动branchIsDirty()检查git status --porcelain则推送新分支并创建 PRPR 正文包含模型回复与Closes #issue评论区更新为Created PR #n。若没有改动则直接把模型回复写回评论。同仓库 PR 分支checkoutLocalBranch()以max(commits.totalCount, 20)的深度 fetch 并 checkout 目标分支PR 上下文由buildPromptDataForPR()github/index.ts构建包含标题、正文、base/head 分支、增删行数、commit 列表、改动文件清单、全部 PR 评论以及所有 review含行级评论的path:line改动直接 commit 并 push 回该 PR 分支。Fork PR 分支checkoutForkBranch()github/index.ts添加名为fork的远程指向 fork 仓库fetch 后建本地跟踪分支完成后git push fork HEAD:原分支推回 fork保持 PR 可见。三个分支共同点提交信息是模型生成的短摘要——summarize()github/index.ts让模型把回复压到 40 字符以内失败时回退为Fix issue: issue 标题每次 commit 都会追加Co-authored-by: 评论者 评论者users.noreply.github.com。6. Git 凭据注入与清理configureGit()github/index.ts在开始前备份本地http.https://github.com/.extraheader并写入基于 App 令牌的AUTHORIZATION: basic base64(x-access-token:token)使 git push 使用 Installation 身份而不是 checkout 的凭据所以 Workflow 模板中persist-credentials: false。finally块github/index.ts保证无论如何都会关闭 opencode 服务、恢复原 git config、并调用revokeAppToken()github/index.ts向https://api.github.com/installation/token发 DELETE 请求吊销刚换取的 Installation 令牌。出错时含 bunShellError会取 stderr 作为消息同样会把错误信息写回评论并core.setFailed。本地调试不触发真实 Workflow 的 Mock 流程README 的 Development 一节提供了完整的本地复现方式。先切到任意测试仓库然后执行MODELanthropic/claude-sonnet-4-20250514 \ ANTHROPIC_API_KEYsk-ant-api03-1234567890 \ GITHUB_RUN_IDdummy \ MOCK_TOKENgithub_pat_1234567890 \ MOCK_EVENT{eventName:issue_comment,...} \ bun /path/to/opencode/github/index.ts各环境变量的含义MODELopencode 使用的模型与工作流中model输入一致须为provider/model格式ANTHROPIC_API_KEY模型 provider 的 API Key与工作流 env 中的 Key 对应GITHUB_RUN_ID伪造的 Run ID用于生成回复里的 GitHub Run 链接useEnvRunUrl()拼接为/owner/repo/actions/runs/idMOCK_TOKEN你的 GitHub 个人访问令牌用于验证你对测试仓库具有admin或write权限可在 GitHub 的个人访问令牌设置页生成设置MOCK_EVENT或MOCK_TOKEN任一即进入 Mock 模式isMock()github/index.ts此时useContext()改从MOCK_EVENTJSON 解析事件上下文MOCK_EVENT模拟的 GitHub 事件载荷模板见下/path/to/opencode你克隆的 opencode 仓库路径bun .../github/index.ts即运行你本地的 Action 入口。注意 Mock 模式下configureGit()会直接跳过不改本地 git 配置分享链接前缀也会切换为开发域名useShareUrl()返回https://dev.opencode.ai见 github/index.ts。事件模板Issue 评论事件MOCK_EVENT{eventName:issue_comment,repo:{owner:sst,repo:hello-world},actor:fwang,payload:{issue:{number:4},comment:{id:1,body:hey opencode, summarize thread}}}替换项owner:sst为仓库拥有者、repo:hello-world为仓库名、actor:fwang为评论者 GitHub 用户名、number:4为 Issue 编号、body为评论正文。带图片附件的 Issue 评论MOCK_EVENT{eventName:issue_comment,repo:{owner:sst,repo:hello-world},actor:fwang,payload:{issue:{number:4},comment:{id:1,body:hey opencode, what is in my image ![Image](https://github.com/user-attachments/assets/xxxxxxxx)}}}把https://github.com/user-attachments/assets/xxxxxxxx替换为有效的 GitHub 附件 URL可在任意 Issue 中发一条带图评论生成一个。PR 评论事件与 Issue 评论的区别是issue中带pull_request字段isPullRequest()据此判断MOCK_EVENT{eventName:issue_comment,repo:{owner:sst,repo:hello-world},actor:fwang,payload:{issue:{number:4,pull_request:{}},comment:{id:1,body:hey opencode, summarize thread}}}PR 行级评审评论事件对应pull_request_review_comment携带文件路径、diff hunk、行号等字段MOCK_EVENT{eventName:pull_request_review_comment,repo:{owner:sst,repo:hello-world},actor:fwang,payload:{pull_request:{number:7},comment:{id:1,body:hey opencode, add error handling,path:src/components/Button.tsx,diff_hunk: -45,8 45,11 \n- const handleClick () {\n- console.log(clicked)\n const handleClick useCallback(() {\n console.log(clicked)\n doSomething()\n }, [doSomething]),line:47,original_line:45,position:10,commit_id:abc123,original_commit_id:def456}}}延伸阅读仓库中的相关文件github/README.md本 Action 的官方使用文档即本文主骨架github/index.tsAction 入口完整实现事件校验、令牌交换、prompt 组装、三分支执行与清理逻辑github/action.yml复合 Action 定义与全部输入参数github/package.json依赖声明Octokit、actions 系列、opencode-ai/sdkpackages/opencode/src/cli/cmd/github.handler.tsopencode github install/opencode github run子命令的处理实现packages/function/src/api.ts其中exchange_github_app_token_with_pat端点用于本地测试opencode github run时用 PAT 换取 Installation 访问令牌。需要提醒的是README 在 Support 一节明确说明这是 early release本文所有行为描述均以当前仓库源码为准实际参数与端点若后续版本有调整请以仓库最新代码为最终依据。【免费下载链接】opencodeThe open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/openc/opencode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表