# Pydantic AI UsageLimits：限制模型请求与工具次数，遇到循环时带用量退出

已在真实Pydantic AI中用离线FunctionModel分别触发请求/工具上限并捕获异常；没有真实模型调用或费用数据。

## 运行

在本目录使用独立虚拟环境并安装requirements.txt；脚本结果写入results。

```sh
python reference/audit.py
python reference/run_sdk.py
```

fixtures是原创输入与故意失败样本；作者真值、离线合成provider和实际SDK记录各自标明，不是模型正确率。需要真实模型/账号/GPU的步骤按正文另行授权运行。

## 1. 先识别没有停止条件的循环

negative-loop.json故意让下一步永远是lookup。限制不是用“请不要循环”提示词代替，而是放到运行时UsageLimits中。

## 2. 分开两种额度上限

limits.json分别设置request_limit=3和tool_calls_limit=2。一次模型响应可能请求多个工具，不能把请求次数和工具执行次数当同一个指标。

## 3. 建立可控的离线循环提供方

run_sdk.py使用真实SDK的FunctionModel，由作者函数每次返回lookup调用。它模拟持续请求工具的行为，没有读取环境里的API Key。

## 4. 单独触发请求次数上限

只设置request_limit运行第一组，记录provider_responses、tool_executions与UsageLimitExceeded。异常发生后不自动重开一个Agent绕过额度。

## 5. 单独触发工具次数上限

第二组只设置tool_calls_limit，继续保存实际执行次数。必须观察真正执行的lookup计数，不以模型想调用多少次代替。

## 6. 保留失败和未完成状态

将异常文本与已消耗计数写入sdk-contract.json。达限意味着任务未完成，不要把异常当正常最终答案，也不要无限重试。

## 7. 接真实模型前再核对计费

真实provider可能有缓存、重试与token费用；这些不由本题离线FunctionModel测得。保留运行时上限，同时在服务端账单中核对实际收费请求。

## 官方依据

- Pydantic AI 官方文档或源码：https://raw.githubusercontent.com/pydantic/pydantic-ai/main/docs/agent.md
