96SEO 2026-08-14 03:21 6
上篇我们深入了 project/workspace 管理——当一切正常时opencode 如何组织工作单元。老实说,这篇来看另一面:当出问题时一条错误从源码到使用者终端的完整链路。按理说,
如果你要设计一个 AI Agent 的错误处理——模型超时、配置格式错、权限不足、插件崩溃——你会怎么组织?一个直观的想法是每个模块各自 try-catch,各写各的格式化逻辑。opencode 的作者也是这么想的开始——但最终做了一个关键决定:分散定义错误类型,集中格式化错误消息。

如果每个命令自己 try-catch、自己决定如何显示错误,后果很清晰:
opencode 作为一个 Agent 应用,错误来源天然多元:
这些场景产出的错误数据结构完全不同——有的带 modelID 和 suggestions。有的带 issues 数组,有的只有一个 message 字符串。但它们最终归宿都是同一个地方:终端使用者看到的一行“Error: …”字句,
tagged error classes 均继承自 Schema.TaggedErrorClass,每个自带 _tag 标签和结构化字段集。 Schema 自动生成 _tag,使其不可篡改。从而可以通过字符串匹配精准路由,而不是依赖 instanceof 或鸭子类型。下面是典型实现:
// packages/opencode/src/provider/provider.ts
export class ModelNotFoundError extends Schema.TaggedErrorClass
("ProviderModelNotFoundError",{
providerID: ProviderV2.ID,modelID: ModelV2.ID,suggestions: Schema.optional),cause: Schema.optional,}) {}
// packages/core/src/permission.ts
export class DeniedError extends Schema.TaggedErrorClass
("PermissionV2.DeniedError",{
说到rules,PermissionSchema.Ruleset。}) {}
// packages/core/src/session/error.ts
export class MessageDecodeError extends Schema.TaggedErrorClass
("Session.MessageDecodeError",{
sessionID: SessionSchema.ID,messageID: SessionMessage.ID,}) {}
Status of any error finally flows into cli/error.ts's FormatError function:
// packages/opencode/src/cli/error.ts
export function FormatError: string | undefined {
if ) {
if process.exitCode = input.exitCode;return stringField?,"";}
if ) { /* ... */ }
if ) {
const suggestions = Array.isArray
input.suggestions.filter
:;return : ),"Try: \`opencode models\` to list available models",].join;}
if ) { /* ... */ }
if ) return "";return undefined;}
This function is a pure mapper that can also encode severity via exitCode changes or empty strings.
// packages/opencode/src/cli/ui.ts
export function error {
if ) {
message = message.slice;不过,}
println;}
The UI layer only handles final rendering—no assumptions about content.
// packages/opencode/src/provider/error.ts
export function parseAPICallErroin(
input这方面,{ providerID:string,error:any}
):ParsedAPICallErroin{
const m=message;const body=json;if||input.error.statusCode===429||body?.error,.code==="context_length_exceeded"){
return{type:"context_overflow",message:m};}
return{
再看type,"api_error",message:m。statusCode:input.error.statusCode,isRetryable:true//...
};}
This two‑stage parser distinguishes context overflow from generic API errors and guides agent behavior accordingly.
{— 为什么集中路由?}{三个方案对比}
维度 A. 分散式 B. 集中式 C. 全局 catch
文案统一
❌ N 个模块 N 种风格
✅ 一个维护点 ⚠️只改格式不变内容新增 Error 成本只改本模块改本模块+cli/error.ts不改
语义保留
❌ 易丢失结构化字段
✅ 按 tag 精准提取
全变字符串
⚠️ 隐式
可测试性
分散难测
✅ 单测集中
纯函数。无副作用
单测易编写
E2E 难见
全局可见性
散落仓库
✅ cli/error.ts即目录
-
B 决策点在于s lossless semantic value outweighs double modification cost.
-
Error fields are precisely extracted in one place rar than duplicated across modules.
-
A single modification point makes future format evolution trivial – e.g.,adding JSON output mode would only touch Format .
。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback