成熟度与安装基线
这些技巧适用于预览 Pydantic AI Agent 适配器、仅 Source LangGraph 适配器和 仅 Source LangChain 中间件。
需要可复现时应固定版本源码安装。把可变分支作为发布输入的可复现性 Not validated。本页对真实外部模型提供方往返验证也只标记为 Not validated;有无模型适配器检查时,先从那里开始。
最小测试 harness
三个框架都使用同一句查询和固定项目 Scope:PowerContextClient 连接,不能自己启动 embedded Server。
待测试的执行流程
1. Scope:不要让 cwd 选择租户
Scope 优先顺序并不统一:
Pydantic AI 会把过长的显式 Scope 哈希成有界 ID。LangGraph 和 LangChain 没有本地后备路径。它们的 missing-Scope 错误位于自动 fail-open 边界内,但显式工具仍会报告失败。
错误做法
让长期运行的服务从进程 cwd 派生 Scope,或让回调对所有运行返回同一个常量。观察
为租户 A 写入一条 Memory,再用同一句查询请求租户 B。如果 B 召回 A 的条目,即使认证正确,适配器也已经跨越了数据分区。修复
每个运行都从已经认证/授权信息的租户/项目标识显式映射:断言
2. 令牌与传输层:凭证不能进入模型可见的数据
三个适配器都接收裸令牌,由客户端构造授权信息请求头。错误做法
把Bearer opaque-token 存入图状态、消息元数据、URL 或模型可见的工具 argument。另一个常见错误是通过非本机回环地址明文 HTTP 发送令牌。
观察
检查状态/检查点时可能直接看到凭证。Pydantic AI 适配器会拒绝完整授权信息值;LangGraph 和 LangChain 虽然文档要求不带前缀的令牌,但适配器边界不会严格校验这种语法。另一方面,如果调用方没有提供并显式信任自己的传输层,PowerContextClient 会拒绝非本机回环地址 HTTP。
修复
把裸值放在部署敏感信息 management 或客户端配置。离开本机回环地址就用 HTTPS。repr=False 和 SecretStr 只能减少常规显示,都不是敏感信息 vault。
断言
http://powercontext.internal:8000 URL 应在发出请求前被拒绝。
3. Untrusted 证据:旧文本不能授权当前动作
错误做法
把召回的内容作为 authoritative 系统指令注入。先 种子 一条 Memory:观察
模型可能把旧用户/模型 statement 当作当前策略。Citation 只能证明 来源 和版本,不能证明它现在仍获授权。修复
使用适配器已有的 trust 封装和临时频道:- Pydantic AI prepend 当前运行的系统请求,并在新运行替换旧标记内容块;
- LangGraph 写
llm_input_messages; - LangChain 覆盖值当前
ModelRequest.system_message。
断言
4. History pollution:召回属于当前请求,不属于 storage
错误做法
每个轮次都向持久messages 追加一条召回的系统消息。
观察
三轮后旧内容块开始累积。启用检查点存储器后,它们会成为持久化的状态;部分模型提供方还会拒绝这种不连续的多个系统消息。修复
使用集成的临时路径,从干净历史内容重建模型输入。Pydantic AI 在分派前移除可识别的旧标记,LangGraph 使用 last-valuellm_input_messages 频道,LangChain 只修改当前请求。
断言
all_messages()。适配器能在下一次分派前替换自己的标记,但不能改写应用数据库策略。
5. Fresh 准备:按框架生命周期处理
错误做法
承诺所有适配器都会在每个模型步骤准备,或跨运行复用同一个已准备内容块。观察
LangGraph 会在一个 human-turn 工具循环内有意复用同一已准备值。Pydantic AI 只在新运行开始时再次准备。LangChain 则每个模型请求都准备。修复
Freshness 必须绑定宿主生命周期。新运行或用户轮次应按表中频率重新准备。不能因为对话历史内容被复用,就继续使用上一轮内容块。断言
6. UTF-8 预算:查询字符与上下文字节分开
通用查询上限是 8192 字符。PreparedContextmax_bytes 是 UTF-8 字节预算,范围 512–32768,适配器默认 8000。LangChain 已完成轮次采集还有另一项限制:包含 framing 后不超过 200,000 字符。
错误做法
用len(content) 检查 PreparedContext 大小,再假设 9000 个中文字符只会触发一种限制。
观察
一个中文字符通常占多个 UTF-8 字节。Query clamp 与上下文 截断 位于不同边界;LangChain 采集又回到 character-based 上限。修复
分别测试每个契约。用 9000 个多字节字符测试查询 clamp,用较小max_bytes 测试 PreparedContext 截断,再在 200,000-character 附近测试 LangChain 采集 framing。
断言
7. 只采集、不刷新:Source 不是 Memory
错误做法
开启采集,运行一个轮次,然后立刻断言 Memory 搜索能找到已采集 文本。观察
采集可能成功,但搜索仍为空。LangChain 会保存已完成轮次 Source,却不会刷新。LangGraph 没有采集路径。Pydantic AI 在采集开启时可以尝试检查点/最终刷新,但抽取仍可能无变更。修复
保留采集回执和位置。先确认 处理游标到达该位置,再检查 Memory 条目的source_refs。最后才运行搜索或准备。
断言
8. 失败语义:只有自动辅助程序才 fail-open
错误做法
把所有 Server 错误都转换成空结果 Memory,或因为召回是 best-effort,就吞掉显式修改操作失败。观察
模型无法区分“没有匹配 Memory”、认证失败和 中断。更糟的是,失败的写入可能看起来像成功。修复
自动与显式路径必须分开:
401/403 诊断信息不能包含令牌、查询、Scope 内容或响应体。
断言
9. 失败与隐私实验
Server offline
关闭 Server,重复宿主请求。原任务应继续。随后调用显式记住工具,确认模型能看到失败。错误 令牌
使用无效令牌。401/403 不能变成“没有 Memory”,诊断信息也不能包含内容。Same 查询, different Scope
Seed Scope A,不 种子 B。在两边运行同一句查询,断言 B 收不到 A 的内容。History pollution
启用检查点存储器或持久消息保存。连续运行多个轮次,检查持久化的历史内容中是否出现召回的内容块。采集隐私
Opt in 前,分别发送 credential-like 文本 和普通 business-sensitive 文本。Pydantic AI 只脱敏已知凭证结构,不会清除每一种业务敏感值。LangChain 不承诺全面脱敏。当前不支持或未验证
完成检查
- 每个租户/运行都显式传 Scope,并有跨 Scope 负向测试。
- 裸令牌只留在客户端/部署配置,不进入模型可见的频道。
- 非本机回环地址流量使用 HTTPS,除非传输层安全性被显式信任。
- 召回的证据标为不可信,并保持临时。
- 准备调用次数符合各框架生命周期。
- Query 字符、PreparedContext UTF-8 字节与 LangChain 采集字符分开测试。
- 采集回执、游标 progress 与 Memory 证据链按顺序检查。
- 自动 fail-open 与显式失败保持不同语义。
- Unsupported 与 Not validated 分开记录。
如果唯一断言只是“模型回答了”,发布还没完成。应继续检查 Scope、请求输入、持久化的历史内容、Source 位置、游标、证据链和失败诊断信息。

