Orin · Agent Platform
1 / 1
团队技术分享 · 2026

Orin —— 一个生产级
Agent 平台的工程实践

从「为什么自己做」讲到「怎么做」:标准 harness、核心架构与技术选型、LangGraph 的图、AG-UI 协议,以及这条路上的工程经验。
后端
FastAPI · LangGraph
前端
React 19 · AG-UI
模型
Claude · Opus 4.8

今天讲什么

为什么做 → 标准是什么 → 我们怎么做 → 协议与趋势
1

为什么做 Orin

通用 Agent 做不到的事、范式为何刚成熟、主流框架横评。

2

标准 harness

brain / hands / session 加九个组件。

3

核心实现与架构

系统架构图、技术选型、核心链路。

4

LangGraph 的图

为什么只用低层 StateGraph 原语。

5

AG-UI 过程流

为什么 Agent 必须把过程实时推给前端。

6

经验 + 趋势

四条踩坑原则;瓶颈正从模型转向工程。

01

为什么我们要自己做

通用 Agent 很强,但解决不了「公司共享」这件事。

通用 Agent 做不到的事

Claude Code、Codex 能力极强,但它们是个人工具,不是共享基础设施

Orin 的目标:搭一个公司共享的 Agent 后端,把知识库、Skill、业务渠道集中接入一次,所有人开箱即用

为什么现在做:范式刚刚成熟

一问一答 → 自主多步 → 真正的长任务智能体
2017.06
Transformer
现代 LLM 基础架构
2022.11
ChatGPT
"模型够用了"共识
2023.03
AutoGPT
首个自主 agent demo
2023.06
Function Call
工具调用结构化
2023
Cursor
code agent 可用性
2024.11
MCP
工具标准协议
2025.01
DeepSeek R1
推理低成本复现
2025.02
Claude Code
ACI 成标配
2025.10
Skills
能力单元标准封装
2026.02
Harness Eng
Harness 概念提出

结论:模型能力是起点,让 agent 真正可用的是工具链和范式的成熟 —— 现在搭一个生产级 Agent 是工程问题,不再是研究问题

主流 Agent 框架横评

框架定位得到主要限制
LangGraph低层编排原语(StateGraph)控制流透明、checkpoint/HITL/时间旅行免费、不绑模型harness 要自己搭,曲线陡
CrewAI高层角色/任务 DSL原型极快、内置 memory 与角色层级生产可靠性弱,深度定制绕框架走
Claude Agent SDK高层 harness,MCP 原生电池全包,MCP 生态最广,官方维护只能用 Claude,深度控制流较弱
OpenAI Agents SDK轻量原语 + handoffagent 间交接一等公民,内置 tracing绑 OpenAI,成熟度较低
Vercel AI SDK前端 / TS 向流式工具包多模型、Next.js 深度集成、流式 UI 最好后端编排非强项,TS only
MS Agent Framework企业级(AutoGen + SK 合并)OpenTelemetry、Entra ID、Python/.NET 双栈两套历史包袱,复杂度高
CopilotKit / AG-UI前端协议层(非 agent 框架)工具卡/思考链/状态同步标准事件只解决 UI,后端要另选

我们的选择:LangGraph(后端编排)+ AG-UI(前端事件流)—— 一个要控制力、一个要前端标准化,两者都选「不锁死、可组合」。

02

标准的 Agent harness 长什么样

先看行业共识,再看我们的实现。

一个 Agent = brain + hands + session

Anthropic 对 Agent SDK 的拆法,是当下最清晰的口径

Brain

Claude + harness:决定下一步、把工具调用路由出去。

Hands

沙箱与工具:真正读文件、跑代码、执行 git、查网络。

Session

append-only 日志:发生过的一切,可持久、可恢复。

«we actually spent more time optimizing our tools than the overall prompt
模型是 brain,但决定它好不好用的是 hands 和 session。
AnthropicBuilding Effective Agents2024-12
Ch2 · 2025 新共识词

这一圈工程,有了名字:Context Engineering

不是新发明,是 prompt engineering 在多轮 agent 场景下的工程化升级。
«context engineering is the delicate art and science of filling the context window with just the right information for the next step.»
Andrej Karpathyx.com/karpathy2025-06
官方背书
«Context engineering is the natural progression of prompt engineering
AnthropicEffective context engineering2025-09

标准 harness 的九个组件

下一章逐一对照 Orin 的实现
01

Agent Loop

think → act → observe 主循环。

02

Tool Ecosystem

文件 / bash / web / MCP。

03

Context Mgmt

compaction 压缩,跨会话续命。

04

Memory

跨交互保留什么、检索什么。

05

Subagents

委派子任务到独立上下文。

06

Permissions / HITL

工具分级、人工检查点。

07

Session Persist

状态可落盘、可恢复孤儿任务。

08

Hooks

生命周期注入点,扩展不改主循环。

09

Verification

测试 / eval 闭环。

03

核心实现、架构与技术选型

LangGraph 负责跑,Sandbox 负责做,Postgres 负责记,SSE 负责送达。

系统架构

按「能力」切包:llm / context / knowledge / turn / infra / runtime / tools / server
接入层
React 19 · @assistant-ui
AG-UI 事件 + SSE
飞书 Bot
lark-channel
边界
FastAPI
/chat · /runs · /admin
编排
call_model
capability 洋葱
route
tool_calls? 继续 / END
tools
执行后回 call_model
工具层
CF Sandbox
真实 Shell · bash
KnowledgeSource
联邦检索
mem0
ADUN 记忆
Skill
SKILL.md 按需
存储/观测
Postgres + pgvector
Aegra checkpoint
R2
产物持久化
Dify
工单 + QA
Langfuse
trace · eval

技术选型:每一层只解决一个问题

后端掌控执行,前端掌控体验,状态必须可恢复,工具必须可替换
选型作用
编排LangGraph控制 ReAct 循环、工具调用、状态流转
后端Python 3.12 + FastAPI提供 /chat、/runs、/admin 接口
模型Claude API推理、规划、工具调用决策
沙箱Cloudflare Sandbox(E2B 备选)真实 shell、文件系统、代码执行
持久化Postgres + pgvector会话、checkpoint、记忆、向量检索
知识库Dify + KnowledgeSource 注册表接入工单、QA、业务知识库
产物R2文件、图表、报告等最终交付物
交互/观测AG-UI 事件流 · Langfuse实时渲染 + trace / eval

核心链路:一个请求进来后发生什么

图保持简单,复杂能力放在图外的 harness 里
1
用户发起任务
2
FastAPI 创建 run / thread
3
LangGraph 进入 ReAct 循环
4
call_model 让模型决定下一步
5
需要工具 → 进 tools 执行
6
结果回模型,继续下一轮
7
最终回答 + 产物经事件流送达
     START
       │
       ▼
  call_model ─▶ route ─┬─▶ tools ─▶ call_model
                     │
                     ├─▶ human_approval ─▶ tools
                     │
                     └─▶ finalize ─▶ END

图只负责三件事:调模型 · 跑工具 · 判断继续还是结束。上下文压缩 / 权限 / 记忆 / 检索 / 持久化 / 异常收尾,都在外围模块。

Orin 的 Harness:围着模型的一圈工程

Harness 组件Orin 里的实现
Agent LoopLangGraph ReAct 循环
Tool Ecosystem沙箱、知识库、记忆、Skill、文件工具
Context Management长上下文裁剪、摘要、tail-window 保留
Memorymem0 + pgvector,异步写入用户长期记忆
KnowledgeDify 双 dataset + KnowledgeSource 注册表
SkillsSKILL.md 按需加载,封装业务操作手册
Permissions / HITL高风险动作预留人工确认,沙箱隔离兜底
Session PersistencePostgres checkpoint,任务可恢复
Verification失败 trace 转 eval,沉淀本地回归测试

观点:Agent 能不能稳定完成任务,关键不只在模型,也在这圈 harness —— 模型负责判断下一步,harness 负责给它正确上下文、工具、权限、反馈,以及失败后的恢复路径。

04

LangGraph:为什么只用低层图原语

不是为了用大而全的框架,而是为了拿到四个低层原语。

LangGraph 解决的是控制流

Orin 的图没有复杂角色、没有多 agent 花活 —— 核心就是一个 ReAct 循环

State

保存当前会话状态。

Node

一个函数做一件事。

Conditional Edge

根据状态决定下一步。

Interrupt

中途暂停,等人工确认或外部事件。

价值:① 控制流透明 ② 每一步状态可检查 ③ checkpoint 天然支持恢复 ④ HITL / 时间旅行调试 / 失败重放都有扩展空间。

为什么不直接用更高层框架

高层框架原型很快,但生产系统最怕两件事

① 控制流藏在框架里

出问题时看不到模型实际收到什么、走了哪条路径。

② 很难定位是哪一步坏了

黑盒 agent executor 让调试变成猜谜。

不用重型 wrapper,不用黑盒 executor —— 只用 StateGraph 原语,业务能力自己挂到 harness 上

Orin 是内部生产平台:接知识库、接飞书、跑长任务、写文件、恢复任务、持久化产物 —— 最重要的是可控性。开发成本更高,但问题定位清楚、架构边界清楚。

05

AG-UI —— agent 和用户之间的「过程流」

传统聊天只关心最终回答,Agent 产品必须展示过程。

为什么不能只返回最终答案

Agent 会查知识库、调工具、跑 shell、生成文件、等长任务、失败重试、要用户确认 —— 只给一个 loading,用户很快失去信任

把过程实时推给前端

开始思考 → 正在调用工具 → 工具参数 → 执行结果 → 正在生成文件 → 失败在哪 → 最终产物在哪。

AG-UI 这类协议的价值

把 Agent 的过程拆成标准事件,让前端可以稳定渲染 —— 工具卡 / 思考链 / 状态同步直接消费。

与 MCP 互补:MCP 解决 agent 怎么连工具,AG-UI 解决 agent 怎么把过程交给用户。

Orin 的事件流范式

三类事件 + 一条工程纪律
事件类型前端表现
文本事件打字机输出
工具事件工具卡片、参数、执行结果
状态事件任务进度、错误、完成、产物链接
RUN_STARTEDTEXT_MESSAGE_START / CONTENTTOOL_CALL_START / ARGS / ENDTEXT_MESSAGE_CONTENTARTIFACT_CREATEDRUN_FINISHED

工程纪律:无论成功还是失败,后端都必须发 closing event。异常直接逃逸 → SSE 流断 → 前端永远卡在 thinking。graph 内部要兜住异常,把失败也变成一条可展示、可记录、可恢复的事件。

06

工程经验:踩坑后留下的四条原则

Agent 系统很难靠一次设计变稳定。
原则一

先收敛真实路径,再堆能力

早期踩坑:做了影子路径,架构看起来很完整,但用户真实请求根本不走那里。
不在用户真实路径上的能力 = 0

所以 Orin 收敛成唯一 live 图 build_chat_graph,所有能力(上下文压缩 / 知识检索 / 记忆 / Skill / 沙箱 / 产物 / 事件流 / trace+eval)都必须挂到真实路径上。先保证一条主链路可靠,再在这条链路上加能力。

原则二

能力做成可插拔,不要塞进主循环

call_model 最容易变成垃圾场 —— 全塞一个函数里,后面一定改不动。
guardrail软着陆 / 防空转
compression先压历史
reminderKB / 任务注入
vision图片转写
call_model
真正的 LLM 调用
每层只做一件事

加能力 = 加一个 capability,删能力 = 摘掉一个 capability。主循环保持稳定,能力持续演进。

落地现状 · 迁移中

guardrail / compression / reminder 已拆成独立 capability;只剩 vision 还内置在 legacy_turn。结构对了,迁移还差这一步。

原则三

长任务一定要持久化

用户关页面 / 服务重启 / 沙箱超时 / 工具失败 / 模型断流 / 产物生成了没送达 / 任务成功了前端没收到。

DB 是 source of truth

run 状态、thread 状态、checkpoint、产物链接、失败原因 —— 全在 DB。

进程挂了也能恢复

恢复孤儿任务,至少能告诉用户:成功、失败、还是需要重试。

Agent 一旦跑长任务就会遇到大量现实问题 —— 唯一可靠的兜底,是把状态全落到 DB。

原则四

把事故变成 eval

生产里每个坏 case 都有价值 —— 坏 trace 不该只停在聊天记录里,应该变成回归测试。
1
线上失败 trace
2
抽象成 eval case
3
写入 evals/tasks/*.yaml
4
本地 baseline 跑一遍
5
以后改 harness 不能把这个 case 再弄坏

真正有效的方法,是持续把事故沉淀成评测集。

07

业内趋势:瓶颈正在转向工程系统

过去拼模型,现在拼 harness。

过去拼模型,现在拼 harness

模型已经足够强,新瓶颈是:上下文怎么放、工具怎么接、权限怎么控、任务怎么恢复、过程怎么展示、失败怎么评测、成本怎么压

context

更好的 context engineering

sandbox

更安全的沙箱

MCP

更标准的 tool protocol

AG-UI

更稳定的 frontend protocol

observability

更强的可观测 + eval

HITL

更清晰的权限 / 人工确认

Skills

更易复用的能力单元

cost

更可控的成本

Agent 平台的竞争,会越来越像基础设施竞争。

收束 · 好的 harness 应该是薄的
模型负责智能
harness 负责秩序

harness 写死太多流程,下一代模型变强后旧规则会反过来限制它。Orin 的取向:控制权尽量给模型,确定性能力交给工具,安全边界放在权限和沙箱,状态管理放在 DB,失败样本交给 eval。

harness 不替模型思考,它提供环境、工具、边界和反馈。 · Q & A