deer-flow 请求级 Trace 关联与嵌入式中级客户端架构:deerflow 包工程不变量深度解读
本文围绕仓库中 backend/packages/harness/deerflow/AGENTS.md 这份面向开发者与 AI Agent 的“工程不变量”文档展开,它是理解 deer-flow(backend 侧 Python harness 包)内部设计契约的第一手入口。本文将从请求级 Trace 关联(X-Trace-Id / deerflow_trace_id)、无需 HTTP 的进程内客户端 DeerFlowClient、以及 Lark CLI 凭据迁移、浏览器进度截图、AIO 受限沙箱、E2B 挂载上传等子系统约定入手,逐条给出文档原文背后的源码级依据,帮助你掌握:任意一次运行(HTTP、定时任务、MCP 通知、IM 入站、嵌入式调用)如何被唯一关联到日志、运行记录与远端追踪;如何在不开 Gateway 服务的情况下复用全部 DeerFlow 能力;以及沙箱/上传路径上的边界与不变量为什么这样设计。
1. AGENTS.md 是什么:harness 包的“不变量说明书”
backend/packages/harness/deerflow/ 是 deer-flow 的核心 Python 包(其相邻的 pyproject.toml 定义了包边界)。该目录下除了 config/、models/、sandbox/、subagents/、tracing/、tools/ 等子模块外,每个关键子模块还自带一份 AGENTS.md,它们是对工程师与编码型 Agent 的约束与背景说明,记录的是"为什么代码必须长成这样"的隐含规则——本次解读的根级 AGENTS.md 汇总了跨模块的六组约定:
- 请求级 Trace 关联(
trace_context.py); - 托管式 Lark CLI 凭据迁移(
integrations/lark_cli.py); - 浏览器进度截图编码(
community/browser_automation/); - 嵌入式客户端(
client.py); - AIO 受限沙箱网络策略(
community/aio_sandbox/); - E2B 沙箱挂载上传(
community/e2b_sandbox/)。
前三处源文件路径按 backend/ 前缀换算后的真实位置为 backend/packages/harness/deerflow/trace_context.py、backend/packages/harness/deerflow/integrations/lark_cli.py、backend/packages/harness/deerflow/community/browser_automation/。下面逐组展开。
2. 请求级 Trace 关联:ContextVar 是唯一事实来源
2.1 它是什么,以及不是什么
DeerFlow 的请求级关联 ID 是 X-Trace-Id 响应头与 deerflow_trace_id 元数据键背后的那个字符串。文档特别强调三个"不是":
- 不是 Langfuse 自己的 trace id;
- 不是 运行记录里的
run_id; - 不是 短命的 subagent 日志标签
trace_id。
它是一个独立于上述三者、横跨"一次请求/一次触发所产生的全部日志与运行记录"的关联键。源码中的三个常量直接定义了它的载体与形态(见 trace_context.py):
TRACE_ID_HEADER = "X-Trace-Id"(HTTP 响应头名称);DEERFLOW_TRACE_METADATA_KEY = "deerflow_trace_id"(运行时 metadata 键名);_MAX_TRACE_ID_LENGTH = 512(长度上限)。
ID 由 uuid.uuid4().hex 生成(L52-L54),即 32 位十六进制字符串,天然满足"只含可打印 ASCII"的约束。
2.2 核心不变量:"ContextVar 是唯一来源,下游一律视为非空 str"
这份文档里最值得反复咀嚼的一条设计是:
The ContextVar is the only source. Every path that reaches a run binds one first; downstream treats the id as a plain
str, noif trace_id:guards.
也就是说,凡是能到达一次 run 的路径,都必须先绑定一个 trace id;下游代码永远不需要写 if trace_id: 这类判空守卫,直接把 ID 当作非空字符串使用即可。这样带来的收益很直接:所有下游(run worker 的运行元数据、被委派的 subagent、后台记忆线程)只读取同一个 ContextVar,而不是各自对"可能没有 trace id"做分支处理。
在 trace_context.py 中,该 ContextVar 声明为:
_current_trace_id: Final[ContextVar[str | None]] = ContextVar("deerflow_current_trace_id", default=None)
唯一允许为空的读取入口是 get_current_trace_id()(L80-L89),它专门服务日志过滤器:在进入任何入口点之前(import 期、第三方线程)发出的记录会渲染为 trace_id=-。其余一切代码都必须走 ensure_trace_id() 或 resolve_trace_id()。
2.3 入口点与绑定器
文档列举了五类入口点,其中只有第一类是 HTTP,其余都运行在 ASGI 之外,因此绑定逻辑不能只活在中间件里:
| 入口类型 | 绑定器 |
|---|---|
| Gateway HTTP | TraceMiddleware |
| 定时任务触发 | ScheduledTaskService._attempt_queued_run → launch_scheduled_thread_run |
| MCP 任务通知 | launch_mcp_task_notification_run |
| IM 入站消息 | ChannelManager._worker_loop |
| 嵌入式 / TUI / CLI | DeerFlowClient.stream() |
对应代码位置:Gateway 应用在 app.py 通过 app.add_middleware(TraceMiddleware) 挂载 HTTP 路径;非 HTTP 的两个 launch 入口位于 backend/app/gateway/services.py(launch_scheduled_thread_run)与 backend/app/gateway/services.py(launch_mcp_task_notification_run),其 docstring 都明确写到"非 HTTP 入口点,TraceMiddleware 不会执行,因此每次 launch 单独打开作用域"。
作用域粒度是第二条关键约束:每个作用域只覆盖一个工作单元,绝不覆盖整个 poller 循环。原因很实际——如果一个常驻 worker task 上的绑定泄漏了,那么后续同线程处理的发生项会全部错误地打上第一个 trace id。ensure_trace_context 采用"继承"语义:如果外部已有作用域(例如在某个 Gateway 请求内部手动触发定时任务),就沿用调用方 trace,而不是新造一个竞争 ID;只有不存在外部作用域时才自起一个并保证退出时解绑。
2.4 派生输出与"绝不读回输入"
文档最反直觉的一条规则是:除 ContextVar 外,其他一切携带 trace id 的载体都是派生输出(derived output),永远不会被当作输入读回。这些载体包括:
worker._bind_trace_id写入的运行时 context 与config["metadata"];services.start_run写入的 run 记录;- 日志记录本身。
正因如此,调用方随请求体发送的 deerflow_trace_id(放在 body.metadata 或 body.config.context 里)会被替换而非采纳——如果采纳它,持久化的 run 记录就会与同一个请求已返回的响应头、以及日志不一致。一个不可信其与日志匹配的 trace id,比没有 trace id 更糟。需要跨服务固定关联 ID 的调用方,正确姿势是发送 X-Trace-Id 请求头。
围绕这条规则,文档点名了四个配套机制:
_SERVER_OWNED_RUNTIME_CONTEXT_KEYS:除 trace id 外,还拒绝调用方注入的沙箱 lease/scope 身份等服务器自有运行期键,见 worker.py;redact_config_secrets:对 kwargs 回显(runs.kwargs_json)做脱敏,实现位于 backend/packages/harness/deerflow/runtime/secret_context.py,并由 thread_runs.py 在入库前调用;build_run_config:把 metadata 合并到副本上,从而保证"盖章"永远不会反向污染body.config(函数本体在 services.py);- 响应头
X-Trace-Id就是给调用方"钉住" ID 用的。
**被接受的合理分歧(不是 bug)**也值得记录:崩溃恢复的定时任务启动通过幂等键复用 run 而不重新盖章——run 记录保留第一次尝试的 ID,重试的日志则记录新 ID;如果重写,就会覆盖一条已存在的记录。另外,thread 元数据整体省略该键,因为一个 thread 横跨多次 run。
2.5 两个 helper 拥有解析顺序,禁止到处手写 fallback
文档明确禁止在各调用点"开编码 fallback 链",统一由两个函数负责:
resolve_trace_id(*carriers):按调用方给出的载体顺序(权威者在前)返回第一个可用值,否则回落 ambient trace id。normalize_trace_id会把"键缺失"与"值非法"一视同仁地放行到下一个载体,最终兜底ensure_trace_id()(L105-L118)。ensure_trace_context(trace_id):优先复用周边作用域,否则开启一个自包含作用域。它的典型场景是执行边界穿越——SubagentExecutor._aexecute、记忆模块的trace_context_managerhook,以及所有非 HTTP 入口点。不传参时它负责铸造一个作用域 ID,退出时解绑,避免污染长生命周期 worker(L155-L183)。
注意两者语义的区别:request_trace_context(HTTP 专用,L138-L152)刻意不继承——一个精心构造的请求头绝不能悄悄回退到同一个 task 上"上一个请求"的 ID。这是 HTTP 路径防串号的最后一道闸。
为什么 trace id 需要"作为数据随行"?因为 ContextVar 是 task-local 的,裸线程跳转不会携带它。所以跨线程/跨后台任务/跨队列交接时,ID 必须作为数据被带过去,对侧再用 ensure_trace_context 重新绑定、用 resolve_trace_id 读取。
2.6 ID 校验的头部安全性细节
normalize_trace_id(L57-L77)的字符约束非常值得注意,它只接受可打印 ASCII(0x20–0x7E),理由分三层:
- trace id 要往返于 HTTP 响应头,而 Starlette 将响应头按 latin-1 编码;码点 > 0xFF 会在
MutableHeaders.__setitem__里触发UnicodeEncodeError,甚至可能在响应体发送前就把请求打成 500; - C1 控制符(0x80–0x9F)虽然技术上能编码,但会被 nginx / envoy / CloudFront 等加固型中间件剥离或拒绝,静默破坏响应;
- C0 控制符(<0x20)与 DEL(0x7F)被拒绝,除了头部安全之外还出于日志注入防御。
2.7 Gateway 侧的落地点:TraceMiddleware 实现细节
中间件位于 backend/app/gateway/trace_middleware.py,其实现印证了文档的多处论断:
- 头部在
http.response.start时写入(L55-L60),而不是在完整响应结束时,因此 SSE 等流式响应也能带上头部且无需消费 body; - 刻意不读 AppConfig:
logging.enhance.enabled只控制日志输出层(是否出现trace_id字段及格式),不控制 ID 是否存在、响应头或 run 元数据。因此logging属于需要重启才生效的STARTUP_ONLY_FIELDS["logging"]配置项,TraceMiddleware 与其解耦; X-Trace-Id被列入CORS_EXPOSED_HEADERS(而不是简单加入 safelist),见 csrf_middleware.py,这样跨域(split-origin)浏览器才能读回该头;- 未处理异常时自己发 500(L64-L92):Starlette 的
ServerErrorMiddleware位于所有用户中间件之外、走原始 send,它的 500 会是不带头部的"唯一一条记录"——恰是用户最需要与日志关联的那一条。TraceMiddleware 因此在响应未开始前发一个带X-Trace-Id的纯文本 500 并 re-raise。这个 500 是 CORS-opaque 的(中间件位于 CORSMiddleware 之外,异常早已回卷越过它),这是刻意不修的:在 CORSMiddleware 之外复刻 origin 白名单会让两套策略漂移。流中途(mid-stream)的失败则原样传播,因为不可能再发第二个 response start,已写下的头部会保留。
2.8 测试印证
文档列出了 trace 相关测试套件:backend/tests/test_trace_middleware.py 覆盖了"每个响应都带 trace id、跨域可读、继承入站值并绑定 context、缺省时生成、流式响应不消费 body 也带头部、覆盖下游重复值、拒绝构造的非 ASCII/C1 控制符、真实中间件栈接线、未处理异常 500 带头部、流中途异常不二次响应"等场景(见 test_trace_middleware.py 的函数命名)。此外还有 test_trace_entry_points.py、test_gateway_services.py、test_run_metadata_secret_safety.py,以及 tracing/AGENTS.md 所述的一整组 Langfuse 套件。
3. DeerFlowClient:把 Gateway 的能力搬进进程内
3.1 架构定位
backend/packages/harness/deerflow/client.py 中的 DeerFlowClient 提供不经 HTTP 服务的进程内访问路径,其架构要点是:
- 导入与 Gateway API 相同的
deerflow模块,共享同一份配置文件与数据目录; - 不依赖 FastAPI;
- 所有返回类型与 Gateway API 响应 schema 对齐,因此消费方代码在 HTTP 与嵌入式两种模式下可以原样运行。
它没有任何网络监听,纯粹是在当前进程内直接驱动 LangGraph agent。__init__(L177-L242)支持传入 config_path、checkpointer(跨轮对话持久化所必需)、model_name、thinking_enabled、subagent_enabled、plan_mode、agent_name、available_skills、自定义 middlewares、environment(写入 langfuse_tags)等参数;agent 采用惰性创建(首次调用时经 create_agent() + build_middlewares() 构建,与 make_lead_agent 同源),配置变化或显式调用 reset_agent() 后才重建。
3.2 对话与流式 API
两个核心方法:
chat(message, thread_id):同步方法,按 message-id 累积流式增量,返回最终 AI 文本(L1107)。stream(message, thread_id):同步生成器,订阅 LangGraph 的stream_mode=["values", "messages", "custom"],产出StreamEvent(L125-L141,type+data)。事件类型对齐 LangGraph SSE 协议:
| 事件类型 | 含义与要点 |
|---|---|
"values" |
完整状态快照(title、messages、artifacts);AI 文本已经在 messages 模式下送达,不会从快照重新合成以避免重复投递;序列化的 ToolMessage 保留非 None 的 native artifact |
"messages-tuple" |
逐块更新:AI 文本是增量(delta),需按 id 拼接还原全文;tool call 与 tool result 各自只发一次,tool result 保留非 None 的 native artifact |
"custom" |
由 StreamWriter 转发;内置 custom events 经 deerflow.utils.custom_events 双发,因此 astream_events(version="v2") 的消费者也能收到一次 on_custom_event(name=payload["type"]、payload 原样作为 data) |
"end" |
流结束,携带按 message-id 只计一次的累计 usage |
stream() 实现里还有一条同步生成器专用的 trace 绑定约束(L722-L774):绑定只发生在每次 next() 周边与 inner.close() 周边,绝不跨 yield。原因是 stream() 是同步生成器,与调用方共享 context——若作用域跨 yield 保持,会把 trace id 泄漏进调用方 context;更糟的是,当 GC 在另一个 context 中终结一个被遗弃的生成器时,会触发 ValueError: Token was created in a different Context。逐 next() set/reset 让 LangGraph 节点执行与其日志落在绑定之内,同时把控制权交还调用方时 ContextVar 已被还原。
3.3 custom-event 不变量
- 生产环境的 DeerFlow 发射器必须使用
emit_custom_event/aemit_custom_event,不能只调StreamWriter; - 每个内置 payload 必须携带非空字符串
type;无type的 payload 保持 writer-only,刻意不出现在astream_events中; - writer 先执行并保持对 Gateway、Web UI、嵌入式客户端兼容性的权威地位,callback 分发是 best-effort,绝不能破坏主链路;
- 异步图 hook 必须 await 异步 helper,不能在运行中的事件循环里同步分发。
3.4 等价方法一览(替代 Gateway API)
文档给出了与 Gateway 路由一一对应的客户端方法表(方法名均已在 client.py 中核实):
| 类别 | 方法 | 返回格式 |
|---|---|---|
| 模型 | list_models()、get_model(name) |
{"models": [...]}、{name, display_name, ...} |
| MCP | get_mcp_config()、update_mcp_config(servers) |
{"mcp_servers": {...}} |
| 技能 | list_skills()、get_skill(name)、update_skill(name, enabled)、install_skill(path) |
{"skills": [...]} |
| 目标 | get_goal(thread_id)、set_goal(thread_id, objective, max_continuations=8)、clear_goal(thread_id) |
{"goal": {...}} 或 {"goal": None} |
| 记忆 | get_memory()、reload_memory()、get_memory_config()、get_memory_status() |
dict |
| 上传 | upload_files(thread_id, files)、list_uploads(thread_id)、delete_upload(thread_id, filename) |
{"success": true, "files": [...]}、{"files": [...], "count": N} |
| 制品 | get_artifact(thread_id, path) |
(bytes, mime_type) 元组 |
3.5 与 Gateway 路径的关键差异
为什么不能让嵌入式客户端直接复用 Gateway 的 run_agent?_stream_turn 的 docstring(L808-L838)给出了三条理由:
run_agent是async def、用agent.astream();而客户端是同步生成器、用agent.stream(),让调用方写for event in client.stream(...)而无需接触 asyncio。桥接两者需要每次调用都起一个事件循环 + 线程;- Gateway 事件要经
serialize()做 JSON 序列化以走 SSE;客户端直接把进程内StreamEvent.data(纯 dict)交给消费者,省去 HTTP 投递的 JSON/SSE 层; StreamBridge是跨 HTTP 边界的 asyncio-queue(支持Last-Event-ID重放、心跳、多订阅者扇出),单进程直接迭代器的调用方完全不需要。
其余行为差异:上传接受本地 Path 而非 HTTP UploadFile,复制前拒绝目录路径,且当文档转换必须跑在活动事件循环内时复用单 worker;get_artifact 返回 (bytes, mime_type) 而非 HTTP Response;Gateway 独有的 thread 清理路由会在 LangGraph thread 删除后顺带清理 .deer-flow/threads/{thread_id},客户端暂无可对应方法;update_mcp_config() 与 update_skill() 会自动使缓存的 agent 失效。
两个并行路径必须保持对同一组 LangGraph stream mode 的订阅一致,这个不变量由 test_client.py 的 test_messages_mode_emits_token_deltas 用测试钉住(因为 Graph / Platform SDK / HTTP 三层各自的命名不同——messages vs messages-tuple——无法共享同一个字符串字面量)。
3.6 测试策略与 Gateway Conformance
backend/tests/test_client.py:离线单元测试,含TestGatewayConformance;backend/tests/test_client_live.py:在线集成测试,需要根目录config.yaml、有效 API 凭据,且必须通过make test-live或DEER_FLOW_RUN_LIVE_TESTS=1显式开启;该套件会调用真实外部 API,可能产生费用或创建本地沙箱/制品/文件,因此被标记为live,从make test排除、默认 CI 跳过。
TestGatewayConformance 的机制很精巧:每个返回 dict 的客户端方法都要通过对应 Gateway Pydantic 响应模型重新解析一次(覆盖 ModelsListResponse、ModelResponse、SkillsListResponse、SkillResponse、SkillInstallResponse、McpConfigResponse、UploadResponse、MemoryConfigResponse、MemoryStatusResponse)。一旦 Gateway 新增了客户端未提供的必填字段,Pydantic 立即抛 ValidationError,CI 就能捕获两者的漂移——这是"嵌入式路径与 HTTP 路径返回 schema 永不脱节"的执行保障。
关于 Gateway 与 DeerFlowClient 为何是并行路径、LangGraph
stream_mode语义、按 id 去重的不变量与回归策略的完整设计,见 docs/STREAMING.md。
4. 周边工程细节:Lark CLI 凭据迁移与浏览器截图编码
4.1 托管式 Lark CLI 凭据(integrations/lark_cli.py)
该模块的完整上下文见 lark_cli.py:集成会把官方 lark-* AI-agent 技能安装进全局只读的托管技能目录,走的是可信、带版本的一手集成包路径,而不是普通自定义技能归档路径。
AGENTS.md 记录的迁移不变量是:应用注册与直接 app 切换要事务化地取代旧的按用户 Lark 凭据树,且要在运行 lark-cli config init 之前清掉旧 OAuth 数据——在 Linux 上该命令会把新 app secret 写进数据目录下的文件型 keychain,若之后才清目录,config.json 就会残留悬空的 keychain 引用。事务快照仍然承担旧 OAuth 数据的登出职责,并在任一切换步骤失败时恢复完整的旧凭据树。
技能包版本跟随 Gateway 运行时 lark-cli 二进制版本(lark-cli --version),FALLBACK_LARK_CLI_VERSION 与 Dockerfile/npm 的 pin 对齐(backend/Dockerfile 的 ARG LARK_CLI_NPM_VERSION 与 docker/docker-compose*.yaml),仅在运行时二进制不可用或版本不可解析时才作为兜底。完整性校验不依赖逐版本归档字节哈希(GitHub 不保证源归档字节跨其内部 git 升级稳定),而是:下载源固定为官方 HTTPS 主机且版本仅来自运行时 CLI 或 pin 值;归档成员逐一通过结构守卫(zip-slip / symlink / 可执行二进制 / 大小 / 必需技能完备性 / SKILL.md 可解析);并对注入 DeerFlow 共享引导文本后的技能树内容做 SHA-256 记录进 manifest,使得内容变化可检测、可审计。
4.2 浏览器进度截图编码(community/browser_automation/)
浏览器自动化模块里的隐藏式"每个动作的浏览器进度帧"使用 JPEG quality 80,以把存储与传输成本约束在相对无损 PNG 的可控范围内;而显式的 browser_screenshot 工具仍用 PNG——因为它产出的是用户主动请求的 artifact。新的自动截图入口必须复用 backend/packages/harness/deerflow/community/browser_automation/ 下 tools.py 中共享的进度编码定义,否则字节编码与 .jpg 后缀可能各自漂移。
5. 沙箱与网络策略:AIO 受限沙箱与 E2B 挂载上传
5.1 AIO Sandbox Network Policy
受限(Restricted)AIO 模式把沙箱保持在内部网络,用一个每沙箱独立、禁用 ICC(容器间通信)的 sidecar 承担出口流量及其 token 认证的 API 中继。策略要点逐条如下:
- 严格解析请求头;策略拒绝的名称要在 DNS 之前被拒掉;对所有已通过校验的 DNS 应答都要尝试,而不是只试第一条;
- 认领最久未被揭露的 denial;subagent / 非交互式运行会被排干并拒绝(drain and deny);
- 批准永远不会重放工具;策略标签给复用(reuse)加上围栏;
- CONNECT/SNI 无法检视加密的权威(authority),因此加密流量不在检视范围;
- 发现与枚举只读,即使出现策略或网络模式不匹配也是如此;
- 只有在孤儿宽限期(orphan grace)、本地拆除预留、跨实例拆除 lease 都满足后,只有 provider 可以替换它;
- 销毁时沙箱、sidecar、两张网络一起销毁。
5.2 E2B Mount Uploads
E2B provider 在沙箱创建期间上传主机挂载,二进制文件对象直接透传给 E2B SDK。每个挂载与整个创建流程都有固定上限,且技能投影(skill projections)与配置的挂载共享同一预算:
| 维度 | 限制 |
|---|---|
| 单文件 | 100 MiB |
| 全部文件总计 | 512 MiB |
| 文件个数 | 2,000 |
| 完整沙箱创建流程 | 512 MiB / 2,000 个文件 |
上传流程有一个协作式截止时间,由 mount_upload_deadline_seconds 控制(默认 120 秒)。provider 在"每个挂载之前、目录 preflight 期间、每次 SDK 写入之前"都要检查该 deadline;但 deadline 不会打断正在进行的文件系统或 E2B SDK 调用。provider 在上传前先检查挂载限额,并在 SDK 上传前用 preflight 时的大小逐个 fd 复核。
对策略作用域(policy-scoped)的轮次而言,"清理四个受管远程技能类别并上传其准备好的投影"是每个 user/thread/skills-root 的一个临界区,与 acquire/release 共享。provider 在启动时对该规范根做快照,并把它带进 warm-pool 身份与 E2B metadata——来自其他 root 的 VM 永远不会被收养;第一次上传流程完成前,第二次策略同步不能重置远端技能树。
其余边界:单个无效挂载不阻塞后续挂载;每次成功上传都会记录来源、目标、文件数、字节数与耗时;被停止的流程会记录停止原因(限额)与耗时,并分别上报已尝试与已完成的上传计数。创建完成后 MountUploadResult 挂在 E2BSandbox.mount_upload_result 上:result.truncated 仅当流程被资源限额(deadline、文件数上限或字节预算)提前停止时为 True;单个挂载失败(宿主路径缺失、SDK 错误)只会记日志而不会置 truncated;被回收沙箱上的 None 表示"不可用"——结果在创建时记录,并经由 provider 级 map 在同一个 Gateway 进程生命周期内保留。
6. 延伸阅读:把不变量落到源码与测试
- Trace 核心:backend/packages/harness/deerflow/trace_context.py、backend/app/gateway/trace_middleware.py、run 侧绑定与服务器自有键 worker.py、secret_context.py;
- 非 HTTP 入口点:services.py 与 services.py;跨域暴露头 csrf_middleware.py;
- 嵌入式客户端:backend/packages/harness/deerflow/client.py(
stream见 L722、_stream_turn见 L776);设计总纲 backend/docs/STREAMING.md; - 测试证据:test_trace_middleware.py、test_trace_entry_points.py、test_gateway_services.py、test_client.py、test_run_metadata_secret_safety.py;
- 子系统目录:community/aio_sandbox/、community/e2b_sandbox/、integrations/lark_cli.py、tracing/AGENTS.md。
把握这套"不变量文档 → 源码常量/守卫 → 测试用例"的三层对应关系后,无论是排查一次跨 HTTP/调度/IM/嵌入式的调用链归属,还是扩展新的入口点、新的沙箱 provider 或新的上传挂载流程,都能先对齐同一套约束,再动手写代码。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00