ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

198、【Agent】【OpenCode】TuiThreadCommand handler:transport 双形态的触发与误区

198、【Agent】【OpenCode】TuiThreadCommand handler:transport 双形态的触发与误区 【声明】本博客所有内容均为个人业余时间创作所述技术案例均来自公开开源项目如GithubApache基金会不涉及任何企业机密或未公开技术如有侵权请联系删除标题198、【Agent】【OpenCode】TuiThreadCommand handlertransport 双形态的触发与误区背景上篇 blog【Agent】【OpenCode】TuiThreadCommand handlerstop 的幂等清理拆了 handler 的收尾清理stop用stopped闭包标志thread.ts:155-168实现调用 N 次 1 次——首次撤监听、发 shutdown RPC5 秒超时、terminate兜底强杀它只在tui()的finallythread.ts:217-219里被触发一次触发链是exit() → onExit → resolve → await tui 返回 → finally → stop → 外层 finally → exit(0)幂等是防御性设计防多入口 async 穿插与unguard的done标志同源。197 拆了怎么收尾本篇往前看启动链路的核心transport——193 篇拆过它的判定与组装本篇专门回答两个问题内部/外部模式各自如何被触发以及一个常见误区internal/external 到底是不是内部大模型 / 外部大模型的意思OpenCode先说结论避免带着错误预期往下读internal/external说的是TUI 与后端服务之间怎么通信跟用哪个大模型没有半点关系。模型是另一条独立的轴。下面先讲透这个误区再讲触发条件。⚠️误区澄清internal/external ≠ 内部/外部大模型这是两条完全正交的轴轴回答的问题判断依据transport内部/外部模式TUI 与后端服务worker 里的 opencode 核心之间怎么传数据有没有监听端口走进程内 RPC 还是真实 HTTP模型内部/外部大模型worker 用哪个模型提供方本地 Ollama / 云端 DeepSeek·OpenAI…opencode 配置的 provider/model与 transport 无关代码佐证thread.ts:211的model: args.model只是把用户选的provider/model传进 TUI 的 args模型解析与调用全在 worker 里无论 internal 还是 externalworker 都用配置好的那一个模型。“内部模式” “TUI 和 worker 同进程、走 RPC 通信”绝不是用本地模型“外部模式” “给服务开个端口让外部客户端连”也不是用云端模型。两者互不决定。如何触发外部模式external判定代码在 thread.ts:177-195constexternalprocess.argv.includes(--port)||// ① CLI 显式给了 --portprocess.argv.includes(--hostname)||// ② CLI 显式给了 --hostnameprocess.argv.includes(--mdns)||// ③ CLI 显式给了 --mdnsnetwork.mdns||// ④ 解析后 mdns 为 truenetwork.port!0||// ⑤ 端口不是 0network.hostname!127.0.0.1// ⑥ hostname 不是默认回环地址network来自resolveNetworkOptionsnetwork.ts:39-59注意它不止看命令行还会读全局配置config.server.port/hostname/mdns。所以外部模式有六大触发路径触发方式例子CLI 显式--portopencode --port 8083CLI 显式--hostnameopencode --hostname 0.0.0.0CLI 显式--mdnsopencode --mdnshostname 会被抬成 0.0.0.0配置server.mdnsconfig 里开 mdns配置server.port非 0config 里server.port 8083配置server.hostname非 127.0.0.1config 里改 hostnameopencode serve --port 8083 --hostname 0.0.0.0这种对外服务写法必然命中外部模式。如何触发内部模式internal内部模式 上面六条全不满足即交互式opencode不带任何--port/--hostname/--mdns且全局配置里也没设server.port/hostname/mdns保持默认port0、hostname127.0.0.1、mdnsfalse见 network.ts:4-31。场景命令模式本机交互式 TUIopencode不带网络参数internal对外服务opencode serve --port 8083external局域网发现opencode --mdnsexternal外部模式的行为worker 真起 HTTP server命中 external 时transport 长这样{url:(awaitclient.call(server,network)).url,// 让 worker 真起 server返回真实 URLfetch:undefined,// TUI 用标准 fetch 直连events:undefined,// TUI 用标准 EventSource 直连}worker 通过 RPC 指令真实启动一个 HTTP serverurl是能真连的地址fetch/events都是undefined—— 有真实网络TUI 直接用标准 fetch EventSource 连那个 url 即可不需要任何代理代价暴露端口有真实网络栈开销内部模式的行为RPC 把 worker 伪装成服务命中 internal 时{url:http://opencode.internal,// 伪地址不真连接fetch:createWorkerFetch(client),// RPC 代理events:createEventSource(client),// RPC 事件转发}不监听任何端口http://opencode.internal是占位伪地址——不会被 DNS 解析、不会建连接因为 TUI 的请求全被createWorkerFetch拦截走 RPC、事件走 RPCevent频道根本不会发起真实 HTTPcreateWorkerFetchthread.ts:24-40请求序列化成{url, method, headers, body}→ RPC 发给 worker 执行 → 结果包成标准Response返回TUI 无感知createEventSourcethread.ts:42-49订阅 RPCevent频道收事件流零端口开销两种模式对比维度内部模式internal外部模式external触发全默认无网络参数/config任一 CLI 标志或 config server 非默认端口零端口真实监听url伪地址http://opencode.internalserver RPC 返回的真实 URLfetchcreateWorkerFetchRPC 代理undefined标准 fetch 直连eventscreateEventSourceRPC 频道undefined标准 EventSource 直连数据通道进程内 RPC真实网络栈模型与模型无关与模型无关一句话记忆internal/external 是TUI 怎么够到 worker默认交互式 内部模式走进程内 RPC、零端口、伪地址带--port/--hostname/--mdns或 config 设了 server 外部模式开真端口、标准 HTTP。它不是内部/外部大模型——模型由 worker 按配置调用与 transport 完全正交。OK本篇先到这里如有疑问欢迎评论区留言讨论祝各位功力大涨技术更上一层楼更多内容见下篇 blog
返回列表