【TensorZero】核心架构与设计原理深度解析:Rust 打造的统一 LLMOps 平台
【TensorZero】核心架构与设计原理深度解析:Rust 打造的统一 LLMOps 平台
“TensorZero fuels ~1% of global LLM API spend today.” — 来自官方 README
一家由前 Rust 编译器维护者、Stanford/CMU 机器学习研究员组成的团队,在 OpenAI/Anthropic 同一批投资人的支持下,打造了今天我们要拆解的这套工业级 LLMOps 平台。它用 41 个 Rust crate 实现了 LLM Gateway、可观测性、评估、提示词优化、模型微调、A/B 实验六大能力,并把”数据 → 反馈 → 优化”的闭环做成一条全自动的飞轮。
本文将围绕 tensorzero/tensorzero(Apache-2.0,⭐11.7k,Rust 1.94)展开,拆解其工程实现上的关键设计:
InferenceProvidertrait —— 它如何用 4 个方法把所有 LLM 厂商(OpenAI/Anthropic/Bedrock/Vertex/Grok/vLLM…)的差异抹平- VariantConfig 枚举 —— ChatCompletion / BestOfN / DICL / MixtureOfN 四种推理策略的统一抽象
- 评估飞轮 ——
evaluationscrate 怎么把 inference 写回 ClickHouse、feedback 写回 Postgres,再用 LLM-as-judge 做端到端打分 - Rate Limiting 的 fail-closed 哲学 —— Valkey/Postgres 双后端的票务系统
- Autopilot —— 内置的”AI 工程师”,自动从生产数据里挖掘 prompt 优化方向
全文 9 张 Mermaid 图、7 段真实可运行代码块、1 个完整的本地启动链路。
1 项目定位与核心价值
1.1 一句话定义
TensorZero 是一个把 LLM Gateway、Observability、Evaluation、Optimization、Experimentation 五大能力融为一体的开源 LLMOps 平台,用 Rust 实现,对外提供 OpenAI 兼容 API + REST API + Python/Node 客户端 + TypeScript UI。
1.2 它要解决的”碎片化”问题
一个典型 LLM 应用上线后,团队手里会同时出现这些工具:
| 痛点 | 行业现状 | TensorZero 的解法 |
|---|---|---|
| 多家 LLM 厂商的协议不统一 | 每个 provider 写一套 SDK | 单一 OpenAI 兼容 API + tensorzero::model_name::<provider>::<model> 寻址 |
| 推理结果没存下来 | 只能依赖 SaaS 平台存 | ClickHouse 存 inference,Postgres 存 feedback、auth、rate limit |
| 评估标准不统一 | 各种脚本、LLM judge、human eval 各做各的 | evaluations crate 把 heuristic + LLM judge 抽象成 EvaluatorConfig |
| Prompt 优化靠手拍脑袋 | promptfoo、LangSmith 调研性工具多 | GEPA 算法 + SFT/RLHF + DICL 全链路 |
| 想做 A/B 测试 | 自己写路由 + 收集指标 | 函数(function) + 变体(variant)模型原生支持 A/B/routing/fallback |
| 看不到自己花钱烧在哪 | 各家账单分散 | cost.rs 集中追踪,支持自定义 rate limit + tag 维度切分 |
1.3 仓库统计(截至 2026-06-27)
| 字段 | 值 |
|---|---|
| ⭐ Stars | 11,673 |
| License | Apache-2.0 |
| 主语言 | Rust (1.94.0, edition 2024) |
| Workspace crate 数 | 41 |
| 仓库大小 | 228 MB |
| 最近一次 push | 2026-06-11 |
| 协作者背景 | 前 Rust 编译器维护者、Stanford/CMU ML 研究员 |
| 种子轮 | $7.3M(投资人同 ClickHouse、CockroachDB、OpenAI、Anthropic) |
| 生产规模 | ~1% 全球 LLM API 调用量;客户含 Fortune 10 |
2 整体架构:五个层次的同心圆
TensorZero 的架构可以拆成 5 层:
flowchart TB
subgraph L1["客户端层(Client Layer)"]
PY[Python Client<br/>pyo3 绑定]
NODE[Node Client<br/>napi-rs]
OAI[OpenAI SDK<br/>兼容模式]
TS[TypeScript UI<br/>React 19]
end
subgraph L2["接入层(Gateway Layer)"]
AX[axum Router<br/>HTTP/2 + HTTP/1.1]
AUTH[tensorzero-auth<br/>Auth Middleware]
DECOMPRESS[RequestDecompression<br/>gzip/br/zstd]
PROM[/metrics<br/>Prometheus Exporter/]
end
subgraph L3["编排层(Orchestration Layer)"]
FUNC[Function Config<br/>function_name → variants]
VAR[VariantConfig<br/>ChatCompletion/BestOfN/DICL/MixtureOfN]
TEMPLATE[minijinja 模板引擎]
TOOL[Tool Call Config<br/>dynamic_tool_params]
end
subgraph L4["执行层(Execution Layer)"]
INFER[InferenceProvider trait<br/>infer / infer_stream / batch]
POOL[Provider Pool<br/>15+ providers]
RETRY[Retry + Fallback<br/>rate_limiting_manager]
end
subgraph L5["存储层(Storage Layer)"]
CH[(ClickHouse<br/>inference/feedback)]
PG[(Postgres<br/>auth/rate-limit/config)]
VK[(Valkey/Redis<br/>cache + rate-limit)]
OBJ[(Object Store S3/GCS<br/>blob storage)]
end
PY --> AX
NODE --> AX
OAI --> AX
TS --> AX
AX --> AUTH
AX --> DECOMPRESS
AX --> FUNC
FUNC --> VAR
VAR --> TEMPLATE
VAR --> INFER
INFER --> POOL
POOL --> RETRY
RETRY --> CH
RETRY --> PG
RETRY --> VK
INFER --> OBJ关键设计点:
- 每一层都是独立 crate(41 个),编译时强隔离,演进路径互不干扰
- Storage 用了三种数据库:ClickHouse(OLAP,存 inference 体量大)+ Postgres(OLTP,存 metadata)+ Valkey(in-memory,cache + 票务)。这是”为工作负载挑工具”的经典实践
- Provider trait 是唯一抽象边界:从 OpenAI 到自托管的 vLLM/TGI,对内都是同一个
infer()调用
3 应用类型与 Function 模型
TensorZero 把所有 LLM 调用抽象成”函数(Function)”:
1 | // 来自 tensorzero-core/src/function/mod.rs |
每个 Function 可以挂载多个 Variant(变体),Variant 之间可以互为备份、互为候选:
flowchart LR
F[Function: extract_data] --> V1[Variant: gpt-4o]
F --> V2[Variant: claude-sonnet]
F --> V3[Variant: best_of_n]
F --> V4[Variant: dicl]
V3 --> V1
V3 --> V2调用方只需指定 function_name,TensorZero 会:
- 按 weight 采样(支持 A/B)
- 若失败自动 fallback 到下个变体
- 把每次 inference 的
variant_name写回 ClickHouse(后续评估有依据)
3.1 Function 配置示例(TOML)
1 | # tensorzero.toml |
对比传统做法:这一份 25 行的 TOML,相当于把 LangChain 的 RunnableBranch、LlamaIndex 的 RouterQueryEngine、内部 A/B 框架加起来的总和。
4 核心引擎一:InferenceProvider trait —— 全 LLM 厂商的统一接口
这是 TensorZero 整套架构的抽象心脏。位于 crates/tensorzero-inference-types/src/provider_trait.rs:
1 | // 来自 crates/tensorzero-inference-types/src/provider_trait.rs |
只有 4 个方法,却能覆盖:
- 单次推理(chat / completion / embeddings / image / audio)
- 流式输出(带 Peekable 支持,便于提前终止)
- 批处理(start + poll,符合 OpenAI Batch / Anthropic Message Batches 等异步协议)
4.1 16 个 Provider 的统一实现矩阵
classDiagram
class InferenceProvider {
<<trait>>
+infer()
+infer_stream()
+start_batch_inference()
+poll_batch_inference()
}
class WrappedProvider {
<<trait>>
+make_body()
+parse_response()
}
class OpenAIProvider
class AnthropicProvider
class AWSBedrockProvider
class AWSSageMakerProvider
class AzureProvider
class GCPVertexAnthropicProvider
class GCPVertexGeminiProvider
class GoogleAIStudioGeminiProvider
class DeepSeekProvider
class FireworksProvider
class GroqProvider
class MistralProvider
class OpenRouterProvider
class SGLangProvider
class TGIProvider
class TogetherProvider
class vLLMProvider
class XAIProvider
class HyperbolicProvider
InferenceProvider <|.. OpenAIProvider
InferenceProvider <|.. AnthropicProvider
InferenceProvider <|.. AWSBedrockProvider
InferenceProvider <|.. AWSSageMakerProvider
InferenceProvider <|.. AzureProvider
InferenceProvider <|.. GCPVertexAnthropicProvider
InferenceProvider <|.. GCPVertexGeminiProvider
InferenceProvider <|.. GoogleAIStudioGeminiProvider
InferenceProvider <|.. DeepSeekProvider
InferenceProvider <|.. FireworksProvider
InferenceProvider <|.. GroqProvider
InferenceProvider <|.. MistralProvider
InferenceProvider <|.. OpenRouterProvider
InferenceProvider <|.. SGLangProvider
InferenceProvider <|.. TGIProvider
InferenceProvider <|.. TogetherProvider
InferenceProvider <|.. vLLMProvider
InferenceProvider <|.. XAIProvider
InferenceProvider <|.. HyperbolicProvider
WrappedProvider <|.. OpenAIProvider : wrapped by
WrappedProvider <|.. AWSSageMakerProvider : consumesWrappedProvider 这个二级 trait 是个精妙设计:
AWS SageMaker 要求把请求包成 SigV4 签名再 POST,所以它”借用”了 OpenAIProvider 的
make_body()来构造请求体、自己的逻辑负责签名。一套代码,两种用途。
4.2 路由层组装(build_otel_enabled_routes)
1 | // 来自 crates/gateway/src/routes/external.rs |
注意只有这 5 类路由会生成 top-level OpenTelemetry span(POST /inference 等),其余路由(如 /v1/datasets/...)走另一组路由配置——这是”OTel 噪音管理”的工程实践。
5 核心引擎二:VariantConfig —— 四种推理策略的统一抽象
每个 Function 下的 Variant 有 4 种类型:
1 | // 来自 crates/tensorzero-core/src/variant/mod.rs |
| 变体 | 用途 | 核心思路 |
|---|---|---|
| ChatCompletion | 单次模型调用 | 默认 80% 场景 |
| BestOfN | 采样 N 个候选 → 用 evaluator 选最好的 | 牺牲 latency 换 quality |
| MixtureOfN | 采样 N 个 → 用 LLM 合成 | 多视角融合 |
| DICL | 从历史 inference 中检索 top-k 示例 → 拼到 prompt | 用生产数据”教”模型 |
5.1 BestOfN 工作流(sequenceDiagram)
sequenceDiagram
participant U as User Request
participant TZ as TensorZero Gateway
participant C1 as Candidate A (gpt-4o)
participant C2 as Candidate B (claude-sonnet)
participant C3 as Candidate C (llama-3.1)
participant EV as Evaluator (LLM Judge)
U->>TZ: POST /inference {function: "extract_data"}
TZ->>TZ: 按 weight 选中 best_of_n variant
par 并行采样
TZ->>C1: infer()
TZ->>C2: infer()
TZ->>C3: infer()
end
C1-->>TZ: candidate_1
C2-->>TZ: candidate_2
C3-->>TZ: candidate_3
TZ->>EV: 三个候选 + 原始输入
EV-->>TZ: scores + 最佳索引
TZ->>U: 返回最佳 candidate<br/>+ 完整 metadata
TZ->>CH: 写入 ClickHouse<br/>(all 3 candidates + score)为什么写全部 3 个候选 + score? 因为这是”学习数据”:TensorZero Autopilot 会从中挖掘 prompt 改进方向。
5.2 DICL:从生产数据动态学习
1 | // 来自 crates/tensorzero-core/src/variant/dicl.rs |
对比传统 RAG:
| 维度 | 传统 RAG | TensorZero DICL |
|---|---|---|
| 知识库来源 | 文档 | 生产 inference |
| Embedding 内容 | 文档分块 | 完整 (input, output) pair |
| 检索对象 | 静态知识 | 动态学习的样本 |
| 适用场景 | 知识问答 | 任务型 LLM(信息抽取、分类、改写) |
6 Provider 抽象层:三级抽象的”工厂模式”
flowchart TB
subgraph L3["L3: InferenceProvider trait<br/>(crates/tensorzero-inference-types/src/provider_trait.rs)"]
TRAIT[pub trait InferenceProvider]
end
subgraph L2["L2: Provider 实现<br/>(crates/tensorzero-core/src/providers/<name>.rs)"]
IMPL[16 个 provider 实现]
end
subgraph L1["L1: Provider 工厂<br/>(ProviderInferenceResponse { provider_type, model_name, raw_request, raw_response, latency })"]
RESP[ProviderInferenceResponse]
CHK[Cache Key 生成<br/>blake3 hash]
end
subgraph L0["L0: Provider Pool<br/>(crates/provider-proxy)"]
POOL[连接池 + 限流 + 重试]
end
TRAIT --> IMPL
IMPL --> RESP
RESP --> CHK
IMPL --> POOL关键代码(crates/tensorzero-core/src/providers/openai/mod.rs):
1 |
|
注意 provider_tools 和 api_type = "responses" 的耦合——只有 Responses API 支持 OpenAI 的内置工具(web search、code interpreter)。
7 评估与优化飞轮:evaluations crate
flowchart TB
subgraph INPUT["数据源"]
DS[Dataset<br/>v1/datasets/.../datapoints]
INF[Stored Inferences<br/>from ClickHouse]
end
subgraph EVAL["evaluations crate"]
CLI[CLI: docker compose run evaluations]
EVALCORE[run_evaluation_core]
STATS[stats.rs<br/>mean / std_deviation]
end
subgraph OUT["输出"]
W[写入 ClickHouse<br/>EvaluationRun + per-datapoint stats]
PROM[Prometheus metrics<br/>export]
end
DS --> EVALCORE
INF --> EVALCORE
EVALCORE --> STATS
STATS --> W
STATS --> PROM7.1 真实可执行的评估命令
1 | # 来自 README §Evaluation » CLI |
比一般框架强的地方:把 LLM judge 本身也当成 TensorZero Function,可以用同一套 GEPA / SFT 工具去优化 judge 的 prompt。
7.2 评估器类型(来自 evaluators/)
1 | // 来自 crates/evaluations/src/evaluators/mod.rs |
7.3 优化算法(tensorzero-optimizers crate)
| 优化器 | 说明 |
|---|---|
| SFT | 从带 feedback 的 inference 里抽 (input, output) 对做监督微调 |
| RLHF / DPO | 偏好数据微调 |
| GEPA | Genetic-Pareto 提示词进化算法(最新集成) |
| DICL | 把好样本动态塞回 prompt(无需训练) |
GEPA 是学术界最近提出的 prompt 进化算法(基于 Pareto 前沿 + LLM 反思),TensorZero 是首批生产化实现。
8 Rate Limiting:fail-closed 哲学 + 双后端票务
flowchart LR
REQ[HTTP Request] --> RL{RateLimitingManager}
RL --> CHECK[检查 RateLimitingConfig]
CHECK --> BACKEND{backend 类型}
BACKEND -->|Auto| VK[Valkey if available]
BACKEND -->|Auto| PG[Postgres fallback]
BACKEND -->|Valkey| VK
BACKEND -->|Postgres| PG
VK --> TICKET[Consume Ticket<br/>token bucket]
PG --> TICKET
TICKET -->|剩余 > 0| ALLOW[Allow + 记录 usage]
TICKET -->|耗尽| REJECT[Return 429]
TICKET -.->|fail-closed| REJECT核心代码(crates/tensorzero-core/src/rate_limiting/rate_limiting_manager.rs):
1 | //! Rate limiting manager for coordinating rate limiting operations. |
fail-closed 哲学:rate limit 用的后端挂了?宁可拒绝请求也别让用户去 LLM 那边烧钱。这是把”省钱”放在”高可用”之前的取舍,符合 TensorZero 面向”工业级 LLM 应用”的定位。
Scope 设计:rate limit 不是全局的,而是按 tag 维度:
1 | [[rate_limits]] |
9 端到端数据流:从客户端到 ClickHouse
sequenceDiagram
autonumber
participant Client as OpenAI Client (Python)
participant GW as TensorZero Gateway<br/>(axum)
participant Auth as Auth Middleware
participant Router as build_api_routes
participant Func as Function Config
participant Var as Variant (best_of_n)
participant Cand as Candidates (3 个 model)
participant Cache as Moka Cache
participant CH as ClickHouse
participant PG as Postgres
participant VK as Valkey
Client->>GW: POST /openai/v1/chat/completions
GW->>Auth: 验证 API key
Auth->>PG: SELECT * FROM api_keys
PG-->>Auth: ok
Auth-->>GW: pass
GW->>Router: dispatch
Router->>Func: 解析 function_name
Func->>Var: 选 variant (按 weight)
Var->>Cache: 查 cache key (blake3)
alt 缓存命中
Cache-->>Var: cached response
else 缓存未命中
Var->>Cand: 并行 infer 3 个候选
Cand-->>Var: 3 candidates
Var->>Var: evaluator 选最佳
end
Var->>VK: rate limit consume
VK-->>Var: 100 tokens remaining
Var-->>GW: 最佳 response
GW->>CH: 异步写入 inference<br/>(deferred_tasks)
GW-->>Client: 200 + response
Note over GW,CH: 后台任务:<br/>1. inference 写 ClickHouse<br/>2. 写 cost 统计<br/>3. 若有 feedback 关联 episode关键优化:deferred_tasks
- HTTP 响应不等 ClickHouse 写入——它走
tokio_util::TaskTracker异步刷盘 - 这把 p99 延迟压到 < 1ms(README 的核心卖点)
10 与同类项目对比
| 维度 | TensorZero | Portkey | OpenLIT | Langfuse | LiteLLM |
|---|---|---|---|---|---|
| 语言 | Rust | TypeScript | TypeScript | TypeScript | Python |
| 自托管 | ✅ | ✅ | ✅ | ✅ | ✅ |
| Gateway | ✅ (16 providers) | ✅ (200+) | ❌ (只做 OTel) | ❌ | ✅ (100+) |
| 可观测性 | ✅ (ClickHouse) | ✅ (内置) | ✅ (OTel-native) | ✅ (Postgres+ClickHouse) | 基础日志 |
| Evaluation | ✅ (heuristic + LLM) | 弱 | 弱 | ✅ | ❌ |
| Prompt 优化 | ✅ (GEPA + SFT + DICL) | 弱 | ❌ | ❌ | ❌ |
| A/B 实验 | ✅ (Function/Variant) | ✅ | ❌ | 弱 | ❌ |
| 多模态 | ✅ (image/audio/file) | ✅ | 取决于 backend | ✅ | ✅ |
| MCP | ✅ (同进程) | ❌ | ❌ | ❌ | ❌ |
| Python SDK | ✅ (pyo3, 同步) | ✅ | ✅ | ✅ | ✅ |
| p99 延迟 | < 1ms (10k QPS) | 中等 | N/A | N/A | 中等 |
| 部署复杂度 | 高 (3 个 DB) | 低 | 中 | 中 | 低 |
| 商业模式 | OSS + 付费 Autopilot | OSS + SaaS | OSS | OSS + SaaS | OSS + Enterprise |
TensorZero 的差异化定位:
“Langfuse 给你看到问题,LiteLLM 帮你调通 provider,Portkey 加一层网关——TensorZero 把这三件事加上优化和实验做成一条闭环飞轮。”
设计差异分析
- 存储选型:Langfuse 选 Postgres+ClickHouse 双 DB(业务和分析),TensorZero 在这之上额外加了 Valkey 做 rate limit + 短时缓存,把”实时决策”和”长期分析”彻底解耦。
- 优化能力:Langfuse/Portkey 都把”优化”留给用户自己。TensorZero 内置 GEPA + SFT + DICL,评估数据直接喂给优化器,不需要导出再导入。
- 多语言绑定:pyo3 同步绑定(不是 HTTP 回环),意味着 Python 调用 TensorZero 几乎和调用本地函数一样快,没有序列化开销。
- Rust 单体:相比 LiteLLM 的 Python 包装,TensorZero 的 Rust 单进程能扛住 10k+ QPS(p99 < 1ms overhead)。代价是部署时必须配 3 个数据库。
11 优缺点分析
| 维度 | 优势 | 代价 |
|---|---|---|
| 架构简洁性 | 单一 Rust 进程,axum 路由清晰,41 个 crate 解耦 | 部署需要 ClickHouse + Postgres + Valkey + Object Store 4 个依赖 |
| 扩展性 | 16 个 provider 已开箱,新增 provider 只需 impl 4 个 trait 方法 | 模板引擎用 minijinja(非主流),自定义模板要学 |
| 易用性 | OpenAI SDK 兼容 = 零迁移成本,TOML 声明式配置 | 自带 UI 还不够成熟(侧重 dashboard) |
| 性能 | < 1ms p99 overhead,10k+ QPS 单实例,moka 进程内缓存 | ClickHouse 写入是异步的,若 ClickHouse 挂了,数据可能丢(deferred_tasks 默认行为) |
| 复杂度 | 抽象层级合理(Function → Variant → Provider),trace 端到端 | Rust 工具链重,编译 41 个 crate 首次 ~5min |
| 维护性 | 41 crate 模块化,clippy lints forbid panic/expect/db宏/print | 自定义 evaluator 写 TypeScript,调试链路拉长 |
| 可观测性 | 5 类路由自动打 OpenTelemetry span + Prometheus exporter | 内部 trace 用 tracing,要熟悉 Rust 生态 |
| 优化闭环 | GEPA + SFT + RLHF 全链路,飞轮自动化 | Autopilot 是付费产品,开源部分需要自己接 |
核心 trade-off:
TensorZero 押注”LLM 应用是数据问题“——它用 ClickHouse + Postgres + Valkey 三件套把生产数据全抓住,然后用评估和优化器反向喂养。这是把”运维产品”做成”数据平台”——前期投入大,飞轮转起来后壁垒高。
12 实践:5 分钟本地启动
12.1 一键 Docker Compose
1 | # 1. 拉代码 |
12.2 第一个 inference 调用
1 | # examples/quickstart/client.py |
12.3 写一个 feedback(用生产数据反哺)
1 | # 上报 user 反馈 |
12.4 跑一次评估
1 | # 创建数据集:把带 feedback 的 inference 转成 datapoint |
12.5 触发一次 SFT 优化
1 | # POST /experimental_optimization_workflow |
13 趋势:为什么 Rust 实现的 LLMOps 是未来
13.1 趋势一:LLM API 调用会变成”基础设施级”流量
- 当前 1% 全球流量(TensorZero 自述)
- 5 年内多数 SaaS 内部都会嵌入 LLM 调用 → 多团队、多 Region 的网关需求 必然出现
- Rust 实现的 gateway 是唯一能扛住这个规模的开源选择
13.2 趋势二:评估 + 优化将成为 LLM 应用的”测试套件”
- 现在的 LLM 应用还在”上线后人工调 prompt”
- 未来 CI/CD 里会有
tensorzero eval阶段,PR 不通过”质量门禁”就不能合并 - InferenceStore + Evaluator 抽象 是这层基建的关键
13.3 趋势三:数据飞轮变成产品壁垒
- 同样的 prompt、同样的模型,有 6 个月生产数据的团队 比新团队效果好 20%+
- TensorZero 把这条飞轮内置到产品里,相当于把”MLOps 平台 + 数据湖”合并
- 未来所有 LLM 应用中间件都会朝这个方向走
13.4 趋势四:多 Agent 协作进入”工程化”阶段
- 现在的 multi-agent 框架还在 prompt 层面折腾(LangGraph、MetaGPT、ChatDev)
- 未来的 multi-agent 需要:稳定的 message passing、统一的 observability、a/b testing
- TensorZero 的 Function/Variant 模型天然适配 agent 编排(每个 agent = 一个 function,多个实现 = 多个 variant)
13.5 工程经验总结
读完 41 个 crate 的代码后,我提炼出 5 条值得借鉴的设计原则:
- 核心抽象要少而强:
InferenceProvider只有 4 个方法,却能覆盖 16 个 provider。”加法”不如”减法”。 - 存储选型 = 工作负载匹配:ClickHouse 存 OLAP 体量,Postgres 存 OLTP 元数据,Valkey 存瞬时决策。不要试图用一个数据库做所有事。
- fail-closed > fail-open:rate limit 后端挂了,拒绝请求比”放过去烧钱”更安全。生产级服务要有明确的失败策略。
- deferred 写入:HTTP 响应不等 ClickHouse 同步写入,p99 延迟压到 < 1ms 是这种解耦的结果。
- GitOps 配置:所有路由、function、variant 都用 TOML 声明,配合 Postgres config-in-database 走 GitOps 友好编排。配置即代码。
14 附录:关键资源
本文基于
tensorzero/tensorzero仓库 2026-06-11 的 main 分支(version2026.6.0)源码分析。代码引用均标注了源文件路径与行号范围,读者可直接对照查阅。