Skip to content

v0.14.1 窄接口层(port)——不依赖 eino 的降级链/预算/成本

Choose a tag to compare

@zy84338719 zy84338719 released this 20 Oct 02:02
· 42 commits to main since this release
00272df

窄接口层(port):不依赖 eino 的降级链 / 预算 / 成本

本仓此前全部对外能力都长在 eino 的类型上(model.BaseChatModel / schema.Message)。非 eino 生态的宿主想接一个单方法窄接口,只能自己重写:拼请求体、解析响应、判错误码、算超时——代价不只是代码量,还有边界易错(HTTP 状态码判错就静默把失败当成功)。issue #11 里两个下游就在各写一遍。

type Completer interface {
    Complete(ctx context.Context, req Request) (string, error)
}

chain := port.NewChain(
    port.WithCompleter("gpt-4o", myCompleter),   // 先注册者优先
    port.WithCompleter("deepseek-chat", backup),  // 失败切下一环
    port.WithBudget(port.NewBudget(100000)),     // 预算耗尽 → 调用前拦下
    port.WithTracker(port.NewCostTracker()),     // 按价表计价并记账
)
out, err := chain.Complete(ctx, port.Request{Prompt: "…", Stage: "R1"})

降级链 / 任务级预算 / 成本记账在窄接口路径上真的生效(不是只把请求转发出去):

  • 预算判定在调用前(事后扣减等于没有预算),耗尽则一次都不调用模型;
  • 失败按错误分类重试或切下一环,每环节独立熔断分桶;
  • 成本按内建价表记账,价表未收录的模型记为未定价(不记 0——0 与「免费模型」不可区分);
  • 附 ClassifyStatus(按 HTTP 状态码判可重试),免得每个宿主各写一遍、各判错一遍。

依赖面:不引 eino

$ go list -deps ./port | grep -c cloudwego/eino
0
$ go list -deps ./port | grep -E '^[a-z0-9.-]+\.[a-z]+/' | sort -u
github.com/oagentkit/llm/port
github.com/oagentkit/textx/textutil
github.com/oekit/concurrency/breaker
github.com/oekit/concurrency/window
github.com/oekit/pkg/stringx

标准库 + oekit/concurrency(熔断)+ textx(token 估算)——无 eino、无 go-openai、无 sonic。

无 eino 的内核下沉,根包 API 不变

预算 / 成本 / 价表 / 熔断的实现本来就不依赖 eino,却原先住在根包 llm 里,而根包因为 client.go 依赖 eino 而「整包不可用」——宿主连「记一笔 token」都用不上。下沉到 port 后:

  • 根包 llm.Budget / llm.CostTracker / llm.Price / llm.PriceTable 全部是 port.X 的类型别名(=),对外 API 一字未变;
  • 两条路径共用同一份预算/成本/价表实现 ⇒ 口径完全一致,不会出现两套算账。

怎么选

场景 用哪条路径
已在 eino 生态(要 ToolCall / 多模态 / 流式 / JSON 解析进 struct) 根包 llm.NewClient / llm.NewResilient(能力更全)
不在 eino 生态(只要「一句话进、一句话出」,或不想把 eino 带进依赖图) port 包:宿主实现 Completer,本包管降级 / 预算 / 成本

关于 v0.14.0 → v0.14.1

v0.14.0 的 tag 快照缺它自己的版本段(打 tag 时用错了本地提交),而 tag 受 protect-tags ruleset 保护不可重打(实测 push 被拒)。按组织的根治路径补发补丁 tag:预写 → 提交 → 在该提交上打 tag。本 tag 的快照同时含 v0.14.0 与 v0.14.1 两段,消费方读到的发布说明是完整的;v0.14.0 作为存量欠账记进 matrix-tools/scripts/changelog_tag_debt.json。

代码内容两个版本完全一致(v0.14.1 只多一段 CHANGELOG)。

关联 issue #11