diff --git a/search_agent/.env b/search_agent/.env index 209f7cf..2d257f6 100644 --- a/search_agent/.env +++ b/search_agent/.env @@ -5,10 +5,10 @@ OPENAI_BASE_URL=https://litellm.graystone-fb459c5d.southeastasia.azurecontainera OPENAI_API_KEY=sk # Serper 搜索 API -SERPER_API_KEY=8253b4f240b520194065312f90e85f9be0fa205f +SERPER_API_KEY=499940576bc8a7211ac98a3f3b83a4826bb8105b # Jina API -JINA_API_KEY=jina_e26dc30420a44a1e859216528065b203TkMRmsoz-FgMDQC5FZX9jr5oF2CI +JINA_API_KEY=jina_643661fd3d7c4342968e1e6d594f6547CEzzf-kRyNl7Tqlvai8vlchyzJMN # Agent 配置 MAX_ITERATIONS=3 diff --git a/search_agent/USAGE.md b/search_agent/USAGE.md index fc0fd7a..57d7a38 100644 --- a/search_agent/USAGE.md +++ b/search_agent/USAGE.md @@ -1,34 +1,85 @@ -# 智能搜索 Agent + 企业级 AI 搜索解决方案 + +> 基于 Google A2A 协议官方 SDK 构建的下一代智能搜索 Agent +> 让 AI 像研究员一样理解查询、规划搜索、整合信息,为业务提供可验证的高质量答案 --- -本 Agent 提供基于 **多源搜索与AI生成** 的智能问答能力,通过 **HTTP API** 与 **MCP(Model Context Protocol)** 对外提供服务。 -核心能力: -- **查询理解**:分析用户意图,提取关键实体,生成扩展查询 -- **多源搜索**:支持 Web 搜索和新闻搜索 -- **内容提取**:智能提取网页核心内容 -- **结果排序**:基于相关性重排搜索结果 -- **答案生成**:综合信息生成结构化回答 -- **自我反思**:评估答案质量,决定是否迭代 +### 行业标准协议支持 + +- 兼容 MCP / API / A2A 协议标准 + - 基于官方 `a2a-sdk` 构建,保证协议兼容性 + - 可与其他 A2A Agent 无缝互操作 + - 通过官方 A2A Inspector 验证 + - MCP 同理,保持协议一致性与可移植性 + +- 面向未来的协议演进能力 + - 无需手动维护协议实现 + - SDK 自动适配协议升级 + - 始终保持行业标准合规性 + +### 超越传统搜索的智能能力 + +#### 1. 深度理解查询意图 +不再是简单的关键词匹配。Agent 能够: +- 理解自然语言查询的真实意图 +- 识别模糊表达背后的实际需求 +- 自动扩展并优化搜索关键词与检索角度 + +#### 2. 智能搜索策略规划 +像专业研究员一样组织信息收集过程: +- 自动分解复杂问题为多个子任务 +- 并行执行多种检索策略 +- 根据中间结果动态调整搜索方向与深度 + +#### 3. 多源信息整合 +从多个渠道获取更全面、更可靠的信息: +- Web 搜索(支持 Serper API) +- 新闻搜索 +- 内容提取(支持 Jina Reader) +- 智能去重与优先级排序 + +#### 4. 高质量答案生成 +不是简单罗列结果,而是可交付的答案: +- 基于多个来源综合生成结论 +- 自动添加来源引用,便于溯源与核验 +- 结构化 Markdown 输出,适配文档与工单系统 +- 保留完整来源链接,便于二次验证 --- -## 功能概览 +## 企业级性能与可靠性 -提供智能搜索的 **查询分析、多源检索、内容提取、答案生成** 能力,返回带来源引用的结构化答案。 +### 高性能体验 +- 异步并发处理,降低整体等待时间 +- 支持 SSE 流式响应,实时返回内容 +- 可配置缓存策略,提高重复查询效率 -支持能力: - -- 多轮迭代搜索与自我反思 -- 多语言查询扩展 -- 网页内容智能提取 -- 基于相关性的结果重排 -- 带来源引用的答案生成 +### 企业级能力 +- 灵活的 API Key 管理(支持请求级与环境级配置) +- 完整的日志与监控支持,便于排障与审计 +- 完善的错误处理与异常恢复机制 --- +## 灵活易用的集成方式 + +### 标准 A2A 协议调用示例 +```json +{ + "jsonrpc": "2.0", + "method": "message/send", + "params": { + "message": { + "role": "user", + "parts": [{"kind": "text", "text": "你的查询"}] + } + } +} +``` + ## 1⃣ search — 智能搜索 ### 功能说明 @@ -190,7 +241,45 @@ api-key: {your-api-key} --- -## 2️⃣ quick_search — 快速搜索 +## 2️⃣ search/stream — 流式搜索(SSE) + +### 功能说明 + +执行 **流式搜索**,在搜索过程中实时推送进度和中间结果。适合需要实时反馈的场景,如前端进度展示。 + +--- + +### REST API 调用 + +``` +POST /api/v1/search/stream +Content-Type: application/json +api-key: {your-api-key} +Accept: text/event-stream +``` + +```json +{ + "query": "2024年诺贝尔物理学奖得主是谁", + "max_iterations": 3 +} +``` + +--- + +### 参数说明 + +| 参数 | 类型 | 必需 | 默认值 | 说明 | +| --- | --- | --- | --- | --- | +| query | string | ✅ | - | 搜索查询问题 | +| max_iterations | integer | ❌ | 3 | 最大迭代次数(1-10) | + +--- + + +--- + +## 3️⃣ quick_search — 快速搜索 ### 功能说明 @@ -330,6 +419,7 @@ api-key: {your-api-key} | /mcp | POST | MCP JSON-RPC | | /mcp/sse | GET/POST | MCP SSE 流式 | | /api/v1/search | POST | 智能搜索(多轮迭代) | +| /api/v1/search/stream | POST | **流式搜索(SSE 实时推送)** | | /api/v1/quick_search | POST | 快速搜索(单次迭代) | | /api/v1/tools | GET | 获取可用工具列表 | @@ -374,3 +464,11 @@ API 调用需要通过以下方式之一传递 API Key: | MAX_RESULTS_PER_QUERY | ❌ | 10 | 每次查询最大结果数 | | CONTENT_MAX_LENGTH | ❌ | 5000 | 内容最大长度 | + + + + + + + + diff --git a/search_agent/build.log b/search_agent/build.log new file mode 100644 index 0000000..4bbcd26 --- /dev/null +++ b/search_agent/build.log @@ -0,0 +1,607 @@ +#0 building with "arm64-builder" instance using docker-container driver + +#1 [internal] load build definition from Dockerfile +#1 transferring dockerfile: 476B done +#1 DONE 0.0s + +#2 [internal] load metadata for docker.io/library/python:3.12-slim +#2 DONE 1.1s + +#3 [internal] load .dockerignore +#3 transferring context: 2B done +#3 DONE 0.0s + +#4 [internal] load build context +#4 transferring context: 2.64kB done +#4 DONE 0.0s + +#5 [1/6] FROM docker.io/library/python:3.12-slim@sha256:ccc7089399c8bb65dd1fb3ed6d55efa538a3f5e7fca3f5988ac3b5b87e593bf0 +#5 resolve docker.io/library/python:3.12-slim@sha256:ccc7089399c8bb65dd1fb3ed6d55efa538a3f5e7fca3f5988ac3b5b87e593bf0 0.0s done +#5 DONE 0.0s + +#6 [2/6] WORKDIR /app +#6 CACHED + +#7 [3/6] RUN apt-get update && apt-get install -y gcc curl && rm -rf /var/lib/apt/lists/* +#7 CACHED + +#8 [4/6] COPY requirements.txt . +#8 CACHED + +#9 [5/6] RUN pip install --no-cache-dir -r requirements.txt +#9 22.17 Collecting pydantic-ai>=0.0.14 (from -r requirements.txt (line 2)) +#9 22.39 Downloading pydantic_ai-1.67.0-py3-none-any.whl.metadata (14 kB) +#9 22.69 Collecting mcp>=0.9.0 (from -r requirements.txt (line 5)) +#9 22.71 Downloading mcp-1.26.0-py3-none-any.whl.metadata (89 kB) +#9 23.27 Collecting fastmcp>=0.1.0 (from -r requirements.txt (line 6)) +#9 23.29 Downloading fastmcp-3.1.0-py3-none-any.whl.metadata (8.1 kB) +#9 24.35 Collecting fastapi>=0.109.0 (from -r requirements.txt (line 9)) +#9 24.37 Downloading fastapi-0.135.1-py3-none-any.whl.metadata (30 kB) +#9 24.91 Collecting uvicorn>=0.27.0 (from uvicorn[standard]>=0.27.0->-r requirements.txt (line 10)) +#9 24.93 Downloading uvicorn-0.41.0-py3-none-any.whl.metadata (6.7 kB) +#9 26.94 Collecting pydantic>=2.5.0 (from -r requirements.txt (line 11)) +#9 26.96 Downloading pydantic-2.12.5-py3-none-any.whl.metadata (90 kB) +#9 34.90 Collecting aiohttp>=3.9.0 (from -r requirements.txt (line 14)) +#9 34.92 Downloading aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (8.1 kB) +#9 35.15 Collecting python-dotenv>=1.0.0 (from -r requirements.txt (line 17)) +#9 35.17 Downloading python_dotenv-1.2.2-py3-none-any.whl.metadata (27 kB) +#9 35.31 Collecting loguru>=0.7.0 (from -r requirements.txt (line 20)) +#9 35.33 Downloading loguru-0.7.3-py3-none-any.whl.metadata (22 kB) +#9 36.15 Collecting pydantic-ai-slim==1.67.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 36.17 Downloading pydantic_ai_slim-1.67.0-py3-none-any.whl.metadata (7.2 kB) +#9 36.91 Collecting genai-prices>=0.0.48 (from pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 36.93 Downloading genai_prices-0.0.55-py3-none-any.whl.metadata (6.5 kB) +#9 36.99 Collecting griffelib>=2.0 (from pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 37.04 Downloading griffelib-2.0.0-py3-none-any.whl.metadata (1.3 kB) +#9 37.29 Collecting httpx>=0.27 (from pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 37.31 Downloading httpx-0.28.1-py3-none-any.whl.metadata (7.1 kB) +#9 37.61 Collecting opentelemetry-api>=1.28.0 (from pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 37.63 Downloading opentelemetry_api-1.40.0-py3-none-any.whl.metadata (1.5 kB) +#9 38.51 Collecting pydantic-graph==1.67.0 (from pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 38.53 Downloading pydantic_graph-1.67.0-py3-none-any.whl.metadata (3.9 kB) +#9 38.88 Collecting typing-inspection>=0.4.0 (from pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 38.90 Downloading typing_inspection-0.4.2-py3-none-any.whl.metadata (2.6 kB) +#9 39.41 Collecting ag-ui-protocol>=0.1.10 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 39.43 Downloading ag_ui_protocol-0.1.13-py3-none-any.whl.metadata (2.5 kB) +#9 39.99 Collecting starlette>=0.45.3 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 40.01 Downloading starlette-0.52.1-py3-none-any.whl.metadata (6.3 kB) +#9 40.56 Collecting anthropic>=0.80.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 40.57 Downloading anthropic-0.84.0-py3-none-any.whl.metadata (3.0 kB) +#9 46.65 Collecting boto3>=1.42.14 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 46.66 Downloading boto3-1.42.63-py3-none-any.whl.metadata (6.7 kB) +#9 47.03 Collecting argcomplete>=3.5.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 47.05 Downloading argcomplete-3.6.3-py3-none-any.whl.metadata (16 kB) +#9 47.56 Collecting prompt-toolkit>=3 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 47.58 Downloading prompt_toolkit-3.0.52-py3-none-any.whl.metadata (6.4 kB) +#9 47.70 Collecting pyperclip>=1.9.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 47.72 Downloading pyperclip-1.11.0-py3-none-any.whl.metadata (2.4 kB) +#9 48.39 Collecting rich>=13 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 48.41 Downloading rich-14.3.3-py3-none-any.whl.metadata (18 kB) +#9 49.19 Collecting cohere>=5.20.6 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 49.21 Downloading cohere-5.20.7-py3-none-any.whl.metadata (3.6 kB) +#9 49.79 Collecting pydantic-evals==1.67.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 49.81 Downloading pydantic_evals-1.67.0-py3-none-any.whl.metadata (7.9 kB) +#9 50.33 Collecting google-genai>=1.56.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 50.35 Downloading google_genai-1.66.0-py3-none-any.whl.metadata (51 kB) +#9 50.65 Collecting groq>=0.25.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 50.67 Downloading groq-1.1.0-py3-none-any.whl.metadata (16 kB) +#9 51.45 Collecting huggingface-hub<2.0.0,>=1.3.4 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 51.47 Downloading huggingface_hub-1.6.0-py3-none-any.whl.metadata (13 kB) +#9 52.40 Collecting logfire>=4.16.0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 52.42 Downloading logfire-4.27.0-py3-none-any.whl.metadata (10 kB) +#9 53.04 Collecting mistralai>=1.9.11 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 53.07 Downloading mistralai-1.12.4-py3-none-any.whl.metadata (33 kB) +#9 54.40 Collecting openai>=2.25.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 54.42 Downloading openai-2.26.0-py3-none-any.whl.metadata (29 kB) +#9 54.95 Collecting tiktoken>=0.12.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 54.98 Downloading tiktoken-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl.metadata (6.7 kB) +#9 55.19 Collecting tenacity>=8.2.3 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 55.21 Downloading tenacity-9.1.4-py3-none-any.whl.metadata (1.2 kB) +#9 55.49 Collecting temporalio==1.20.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 55.51 Downloading temporalio-1.20.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (93 kB) +#9 56.25 Collecting google-auth>=2.36.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 56.28 Downloading google_auth-2.49.0-py3-none-any.whl.metadata (6.2 kB) +#9 56.79 Collecting requests>=2.32.2 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 56.81 Downloading requests-2.32.5-py3-none-any.whl.metadata (4.9 kB) +#9 56.92 Collecting xai-sdk>=1.5.0 (from pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 56.95 Downloading xai_sdk-1.8.0-py3-none-any.whl.metadata (26 kB) +#9 57.28 Collecting anyio>=0 (from pydantic-evals==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 57.30 Downloading anyio-4.12.1-py3-none-any.whl.metadata (4.3 kB) +#9 58.02 Collecting logfire-api>=3.14.1 (from pydantic-evals==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 58.04 Downloading logfire_api-4.27.0-py3-none-any.whl.metadata (972 bytes) +#9 58.54 Collecting pyyaml>=6.0.2 (from pydantic-evals==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 58.56 Downloading pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (2.4 kB) +#9 58.94 Collecting nexus-rpc==1.2.0 (from temporalio==1.20.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 58.96 Downloading nexus_rpc-1.2.0-py3-none-any.whl.metadata (2.9 kB) +#9 61.73 Collecting protobuf<7.0.0,>=3.20 (from temporalio==1.20.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 61.75 Downloading protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl.metadata (593 bytes) +#9 62.16 Collecting types-protobuf>=3.20 (from temporalio==1.20.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 62.19 Downloading types_protobuf-6.32.1.20260221-py3-none-any.whl.metadata (2.2 kB) +#9 62.41 Collecting typing-extensions<5,>=4.2.0 (from temporalio==1.20.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 62.43 Downloading typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB) +#9 62.73 Collecting httpx-sse>=0.4 (from mcp>=0.9.0->-r requirements.txt (line 5)) +#9 62.74 Downloading httpx_sse-0.4.3-py3-none-any.whl.metadata (9.7 kB) +#9 63.20 Collecting jsonschema>=4.20.0 (from mcp>=0.9.0->-r requirements.txt (line 5)) +#9 63.22 Downloading jsonschema-4.26.0-py3-none-any.whl.metadata (7.6 kB) +#9 63.44 Collecting pydantic-settings>=2.5.2 (from mcp>=0.9.0->-r requirements.txt (line 5)) +#9 63.46 Downloading pydantic_settings-2.13.1-py3-none-any.whl.metadata (3.4 kB) +#9 64.08 Collecting pyjwt>=2.10.1 (from pyjwt[crypto]>=2.10.1->mcp>=0.9.0->-r requirements.txt (line 5)) +#9 64.10 Downloading pyjwt-2.11.0-py3-none-any.whl.metadata (4.0 kB) +#9 64.25 Collecting python-multipart>=0.0.9 (from mcp>=0.9.0->-r requirements.txt (line 5)) +#9 64.27 Downloading python_multipart-0.0.22-py3-none-any.whl.metadata (1.8 kB) +#9 64.51 Collecting sse-starlette>=1.6.1 (from mcp>=0.9.0->-r requirements.txt (line 5)) +#9 64.54 Downloading sse_starlette-3.3.2-py3-none-any.whl.metadata (14 kB) +#9 65.33 Collecting authlib>=1.6.5 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 65.35 Downloading authlib-1.6.9-py2.py3-none-any.whl.metadata (9.8 kB) +#9 65.78 Collecting cyclopts>=4.0.0 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 65.80 Downloading cyclopts-4.8.0-py3-none-any.whl.metadata (12 kB) +#9 66.01 Collecting exceptiongroup>=1.2.2 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 66.04 Downloading exceptiongroup-1.3.1-py3-none-any.whl.metadata (6.7 kB) +#9 66.20 Collecting jsonref>=1.1.0 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 66.22 Downloading jsonref-1.1.0-py3-none-any.whl.metadata (2.7 kB) +#9 66.33 Collecting jsonschema-path>=0.3.4 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 66.35 Downloading jsonschema_path-0.4.5-py3-none-any.whl.metadata (5.9 kB) +#9 66.58 Collecting openapi-pydantic>=0.5.1 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 66.60 Downloading openapi_pydantic-0.5.1-py3-none-any.whl.metadata (10 kB) +#9 66.92 Collecting packaging>=24.0 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 66.95 Downloading packaging-26.0-py3-none-any.whl.metadata (3.3 kB) +#9 67.20 Collecting platformdirs>=4.0.0 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 67.23 Downloading platformdirs-4.9.4-py3-none-any.whl.metadata (4.7 kB) +#9 67.32 Collecting py-key-value-aio<0.5.0,>=0.4.4 (from py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 67.34 Downloading py_key_value_aio-0.4.4-py3-none-any.whl.metadata (15 kB) +#9 68.13 Collecting uncalled-for>=0.2.0 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 68.15 Downloading uncalled_for-0.2.0-py3-none-any.whl.metadata (2.9 kB) +#9 69.47 Collecting watchfiles>=1.0.0 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 69.49 Downloading watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (4.9 kB) +#9 71.05 Collecting websockets>=15.0.1 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 71.07 Downloading websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (6.8 kB) +#9 71.92 Collecting annotated-doc>=0.0.2 (from fastapi>=0.109.0->-r requirements.txt (line 9)) +#9 71.94 Downloading annotated_doc-0.0.4-py3-none-any.whl.metadata (6.6 kB) +#9 72.21 Collecting click>=7.0 (from uvicorn>=0.27.0->uvicorn[standard]>=0.27.0->-r requirements.txt (line 10)) +#9 72.23 Downloading click-8.3.1-py3-none-any.whl.metadata (2.6 kB) +#9 72.32 Collecting h11>=0.8 (from uvicorn>=0.27.0->uvicorn[standard]>=0.27.0->-r requirements.txt (line 10)) +#9 72.34 Downloading h11-0.16.0-py3-none-any.whl.metadata (8.3 kB) +#9 72.44 Collecting annotated-types>=0.6.0 (from pydantic>=2.5.0->-r requirements.txt (line 11)) +#9 72.46 Downloading annotated_types-0.7.0-py3-none-any.whl.metadata (15 kB) +#9 82.94 Collecting pydantic-core==2.41.5 (from pydantic>=2.5.0->-r requirements.txt (line 11)) +#9 82.96 Downloading pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (7.3 kB) +#9 83.29 Collecting aiohappyeyeballs>=2.5.0 (from aiohttp>=3.9.0->-r requirements.txt (line 14)) +#9 83.31 Downloading aiohappyeyeballs-2.6.1-py3-none-any.whl.metadata (5.9 kB) +#9 83.38 Collecting aiosignal>=1.4.0 (from aiohttp>=3.9.0->-r requirements.txt (line 14)) +#9 83.39 Downloading aiosignal-1.4.0-py3-none-any.whl.metadata (3.7 kB) +#9 83.56 Collecting attrs>=17.3.0 (from aiohttp>=3.9.0->-r requirements.txt (line 14)) +#9 83.58 Downloading attrs-25.4.0-py3-none-any.whl.metadata (10 kB) +#9 84.81 Collecting frozenlist>=1.1.1 (from aiohttp>=3.9.0->-r requirements.txt (line 14)) +#9 84.83 Downloading frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (20 kB) +#9 88.61 Collecting multidict<7.0,>=4.5 (from aiohttp>=3.9.0->-r requirements.txt (line 14)) +#9 88.63 Downloading multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (5.3 kB) +#9 89.42 Collecting propcache>=0.2.0 (from aiohttp>=3.9.0->-r requirements.txt (line 14)) +#9 89.44 Downloading propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (13 kB) +#9 93.55 Collecting yarl<2.0,>=1.17.0 (from aiohttp>=3.9.0->-r requirements.txt (line 14)) +#9 93.57 Downloading yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (79 kB) +#9 94.20 Collecting httptools>=0.6.3 (from uvicorn[standard]>=0.27.0->-r requirements.txt (line 10)) +#9 94.22 Downloading httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (3.5 kB) +#9 94.90 Collecting uvloop>=0.15.1 (from uvicorn[standard]>=0.27.0->-r requirements.txt (line 10)) +#9 94.92 Downloading uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (4.9 kB) +#9 95.37 Collecting idna>=2.8 (from anyio>=0->pydantic-evals==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 95.40 Downloading idna-3.11-py3-none-any.whl.metadata (8.4 kB) +#9 98.73 Collecting cryptography (from authlib>=1.6.5->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 98.75 Downloading cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl.metadata (5.7 kB) +#9 99.07 Collecting docstring-parser<4.0,>=0.15 (from cyclopts>=4.0.0->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 99.09 Downloading docstring_parser-0.17.0-py3-none-any.whl.metadata (3.5 kB) +#9 99.21 Collecting rich-rst<2.0.0,>=1.3.1 (from cyclopts>=4.0.0->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 99.23 Downloading rich_rst-1.3.2-py3-none-any.whl.metadata (6.1 kB) +#9 100.0 Collecting certifi (from httpx>=0.27->pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 100.0 Downloading certifi-2026.2.25-py3-none-any.whl.metadata (2.5 kB) +#9 100.3 Collecting httpcore==1.* (from httpx>=0.27->pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 100.3 Downloading httpcore-1.0.9-py3-none-any.whl.metadata (21 kB) +#9 100.7 Collecting jsonschema-specifications>=2023.03.6 (from jsonschema>=4.20.0->mcp>=0.9.0->-r requirements.txt (line 5)) +#9 100.8 Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl.metadata (2.9 kB) +#9 101.1 Collecting referencing>=0.28.4 (from jsonschema>=4.20.0->mcp>=0.9.0->-r requirements.txt (line 5)) +#9 101.2 Downloading referencing-0.37.0-py3-none-any.whl.metadata (2.8 kB) +#9 105.5 Collecting rpds-py>=0.25.0 (from jsonschema>=4.20.0->mcp>=0.9.0->-r requirements.txt (line 5)) +#9 105.5 Downloading rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (4.1 kB) +#9 105.6 Collecting pathable<0.6.0,>=0.5.0 (from jsonschema-path>=0.3.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 105.7 Downloading pathable-0.5.0-py3-none-any.whl.metadata (5.9 kB) +#9 106.9 Collecting importlib-metadata<8.8.0,>=6.0 (from opentelemetry-api>=1.28.0->pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 106.9 Downloading importlib_metadata-8.7.1-py3-none-any.whl.metadata (4.7 kB) +#9 107.4 Collecting beartype>=0.20.0 (from py-key-value-aio<0.5.0,>=0.4.4->py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 107.4 Downloading beartype-0.22.9-py3-none-any.whl.metadata (37 kB) +#9 108.2 Collecting aiofile>=3.5.0 (from py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 108.2 Downloading aiofile-3.9.0-py3-none-any.whl.metadata (14 kB) +#9 108.9 Collecting keyring>=25.6.0 (from py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 108.9 Downloading keyring-25.7.0-py3-none-any.whl.metadata (21 kB) +#9 109.2 Collecting cachetools>=5.0.0 (from py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 109.2 Downloading cachetools-7.0.4-py3-none-any.whl.metadata (5.6 kB) +#9 109.5 Collecting email-validator>=2.0.0 (from pydantic[email]>=2.11.7->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 109.5 Downloading email_validator-2.3.0-py3-none-any.whl.metadata (26 kB) +#9 110.3 Collecting markdown-it-py>=2.2.0 (from rich>=13->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 110.3 Downloading markdown_it_py-4.0.0-py3-none-any.whl.metadata (7.3 kB) +#9 110.7 Collecting pygments<3.0.0,>=2.13.0 (from rich>=13->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 110.7 Downloading pygments-2.19.2-py3-none-any.whl.metadata (2.5 kB) +#9 113.0 Collecting caio<0.10.0,>=0.9.0 (from aiofile>=3.5.0->py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 113.0 Downloading caio-0.9.25-cp312-cp312-manylinux_2_34_aarch64.whl.metadata (3.3 kB) +#9 113.3 Collecting distro<2,>=1.7.0 (from anthropic>=0.80.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 113.3 Downloading distro-1.9.0-py3-none-any.whl.metadata (6.8 kB) +#9 114.6 Collecting jiter<1,>=0.4.0 (from anthropic>=0.80.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 114.6 Downloading jiter-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (5.2 kB) +#9 114.7 Collecting sniffio (from anthropic>=0.80.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 114.7 Downloading sniffio-1.3.1-py3-none-any.whl.metadata (3.9 kB) +#9 124.0 Collecting botocore<1.43.0,>=1.42.63 (from boto3>=1.42.14->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 124.0 Downloading botocore-1.42.63-py3-none-any.whl.metadata (5.9 kB) +#9 124.2 Collecting jmespath<2.0.0,>=0.7.1 (from boto3>=1.42.14->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 124.2 Downloading jmespath-1.1.0-py3-none-any.whl.metadata (7.6 kB) +#9 124.4 Collecting s3transfer<0.17.0,>=0.16.0 (from boto3>=1.42.14->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 124.5 Downloading s3transfer-0.16.0-py3-none-any.whl.metadata (1.7 kB) +#9 126.7 Collecting fastavro<2.0.0,>=1.9.4 (from cohere>=5.20.6->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 126.8 Downloading fastavro-1.12.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (5.8 kB) +#9 129.5 Collecting tokenizers<1,>=0.15 (from cohere>=5.20.6->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 129.5 Downloading tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.metadata (7.3 kB) +#9 130.1 Collecting types-requests<3.0.0,>=2.0.0 (from cohere>=5.20.6->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 130.2 Downloading types_requests-2.32.4.20260107-py3-none-any.whl.metadata (2.0 kB) +#9 132.3 Collecting cffi>=2.0.0 (from cryptography->authlib>=1.6.5->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 132.3 Downloading cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (2.6 kB) +#9 132.5 Collecting dnspython>=2.0.0 (from email-validator>=2.0.0->pydantic[email]>=2.11.7->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 132.6 Downloading dnspython-2.8.0-py3-none-any.whl.metadata (5.7 kB) +#9 133.0 Collecting pyasn1-modules>=0.2.1 (from google-auth>=2.36.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 133.0 Downloading pyasn1_modules-0.4.2-py3-none-any.whl.metadata (3.5 kB) +#9 133.7 Collecting rsa<5,>=3.1.4 (from google-auth>=2.36.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 133.7 Downloading rsa-4.9.1-py3-none-any.whl.metadata (5.6 kB) +#9 135.4 Collecting filelock>=3.10.0 (from huggingface-hub<2.0.0,>=1.3.4->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 135.4 Downloading filelock-3.25.0-py3-none-any.whl.metadata (2.0 kB) +#9 135.7 Collecting fsspec>=2023.5.0 (from huggingface-hub<2.0.0,>=1.3.4->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 135.8 Downloading fsspec-2026.2.0-py3-none-any.whl.metadata (10 kB) +#9 137.0 Collecting hf-xet<2.0.0,>=1.3.2 (from huggingface-hub<2.0.0,>=1.3.4->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 137.1 Downloading hf_xet-1.3.2-cp37-abi3-manylinux_2_28_aarch64.whl.metadata (4.9 kB) +#9 137.7 Collecting tqdm>=4.42.1 (from huggingface-hub<2.0.0,>=1.3.4->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 137.7 Downloading tqdm-4.67.3-py3-none-any.whl.metadata (57 kB) +#9 138.1 Collecting typer (from huggingface-hub<2.0.0,>=1.3.4->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 138.1 Downloading typer-0.24.1-py3-none-any.whl.metadata (16 kB) +#9 138.6 Collecting zipp>=3.20 (from importlib-metadata<8.8.0,>=6.0->opentelemetry-api>=1.28.0->pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 138.7 Downloading zipp-3.23.0-py3-none-any.whl.metadata (3.6 kB) +#9 139.1 Collecting SecretStorage>=3.2 (from keyring>=25.6.0->py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 139.1 Downloading secretstorage-3.5.0-py3-none-any.whl.metadata (4.0 kB) +#9 139.2 Collecting jeepney>=0.4.2 (from keyring>=25.6.0->py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 139.2 Downloading jeepney-0.9.0-py3-none-any.whl.metadata (1.2 kB) +#9 139.3 Collecting jaraco.classes (from keyring>=25.6.0->py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 139.3 Downloading jaraco.classes-3.4.0-py3-none-any.whl.metadata (2.6 kB) +#9 139.5 Collecting jaraco.functools (from keyring>=25.6.0->py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 139.6 Downloading jaraco_functools-4.4.0-py3-none-any.whl.metadata (3.0 kB) +#9 139.7 Collecting jaraco.context (from keyring>=25.6.0->py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 139.7 Downloading jaraco_context-6.1.1-py3-none-any.whl.metadata (4.3 kB) +#9 139.9 Collecting executing>=2.0.1 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 139.9 Downloading executing-2.2.1-py2.py3-none-any.whl.metadata (8.9 kB) +#9 140.2 Collecting opentelemetry-exporter-otlp-proto-http<1.40.0,>=1.39.0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 140.2 Downloading opentelemetry_exporter_otlp_proto_http-1.39.1-py3-none-any.whl.metadata (2.4 kB) +#9 140.5 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 140.5 Downloading opentelemetry_instrumentation-0.61b0-py3-none-any.whl.metadata (7.2 kB) +#9 140.8 Collecting opentelemetry-sdk<1.40.0,>=1.39.0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 140.8 Downloading opentelemetry_sdk-1.39.1-py3-none-any.whl.metadata (1.5 kB) +#9 141.9 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 141.9 Downloading opentelemetry_instrumentation_httpx-0.61b0-py3-none-any.whl.metadata (7.4 kB) +#9 142.0 Collecting mdurl~=0.1 (from markdown-it-py>=2.2.0->rich>=13->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 142.0 Downloading mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB) +#9 142.1 Collecting eval-type-backport>=0.2.0 (from mistralai>=1.9.11->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 142.2 Downloading eval_type_backport-0.3.1-py3-none-any.whl.metadata (2.4 kB) +#9 142.4 Collecting invoke<3.0.0,>=2.2.0 (from mistralai>=1.9.11->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 142.5 Downloading invoke-2.2.1-py3-none-any.whl.metadata (3.3 kB) +#9 142.9 Collecting python-dateutil>=2.8.2 (from mistralai>=1.9.11->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 142.9 Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB) +#9 143.7 Collecting wcwidth (from prompt-toolkit>=3->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 143.7 Downloading wcwidth-0.6.0-py3-none-any.whl.metadata (30 kB) +#9 145.6 Collecting charset_normalizer<4,>=2 (from requests>=2.32.2->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 145.6 Downloading charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (39 kB) +#9 146.2 Collecting urllib3<3,>=1.21.1 (from requests>=2.32.2->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 146.3 Downloading urllib3-2.6.3-py3-none-any.whl.metadata (6.9 kB) +#9 146.7 Collecting docutils (from rich-rst<2.0.0,>=1.3.1->cyclopts>=4.0.0->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 146.7 Downloading docutils-0.22.4-py3-none-any.whl.metadata (15 kB) +#9 153.2 Collecting regex>=2022.1.18 (from tiktoken>=0.12.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 153.2 Downloading regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (40 kB) +#9 154.1 Collecting googleapis-common-protos<2,>=1.65.0 (from xai-sdk>=1.5.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 154.1 Downloading googleapis_common_protos-1.73.0-py3-none-any.whl.metadata (9.4 kB) +#9 162.2 Collecting grpcio<2,>=1.72.1 (from xai-sdk>=1.5.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 162.2 Downloading grpcio-1.78.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.metadata (3.8 kB) +#9 162.5 Collecting packaging>=24.0 (from fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 162.5 Downloading packaging-25.0-py3-none-any.whl.metadata (3.3 kB) +#9 163.9 Collecting pycparser (from cffi>=2.0.0->cryptography->authlib>=1.6.5->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 164.0 Downloading pycparser-3.0-py3-none-any.whl.metadata (8.2 kB) +#9 167.4 Collecting opentelemetry-exporter-otlp-proto-common==1.39.1 (from opentelemetry-exporter-otlp-proto-http<1.40.0,>=1.39.0->logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 167.4 Downloading opentelemetry_exporter_otlp_proto_common-1.39.1-py3-none-any.whl.metadata (1.8 kB) +#9 167.6 Collecting opentelemetry-proto==1.39.1 (from opentelemetry-exporter-otlp-proto-http<1.40.0,>=1.39.0->logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 167.7 Downloading opentelemetry_proto-1.39.1-py3-none-any.whl.metadata (2.3 kB) +#9 170.0 Collecting opentelemetry-semantic-conventions==0.61b0 (from opentelemetry-instrumentation>=0.41b0->logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 170.1 Downloading opentelemetry_semantic_conventions-0.61b0-py3-none-any.whl.metadata (2.5 kB) +#9 172.7 Collecting wrapt<2.0.0,>=1.0.0 (from opentelemetry-instrumentation>=0.41b0->logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 172.8 Downloading wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.metadata (6.4 kB) +#9 173.7 Collecting opentelemetry-util-http==0.61b0 (from opentelemetry-instrumentation-httpx>=0.42b0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 173.7 Downloading opentelemetry_util_http-0.61b0-py3-none-any.whl.metadata (2.6 kB) +#9 174.2 INFO: pip is looking at multiple versions of opentelemetry-sdk to determine which version is compatible with other requirements. This could take a while. +#9 174.2 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 174.3 Downloading opentelemetry_instrumentation_httpx-0.60b1-py3-none-any.whl.metadata (7.3 kB) +#9 174.5 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 174.5 Downloading opentelemetry_instrumentation-0.60b1-py3-none-any.whl.metadata (7.2 kB) +#9 174.6 INFO: pip is looking at multiple versions of opentelemetry-instrumentation-httpx to determine which version is compatible with other requirements. This could take a while. +#9 174.6 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 174.6 Downloading opentelemetry_instrumentation_httpx-0.60b0-py3-none-any.whl.metadata (7.3 kB) +#9 174.8 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 174.8 Downloading opentelemetry_instrumentation-0.60b0-py3-none-any.whl.metadata (7.2 kB) +#9 174.9 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 175.0 Downloading opentelemetry_instrumentation_httpx-0.59b0-py3-none-any.whl.metadata (7.3 kB) +#9 175.1 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 175.1 Downloading opentelemetry_instrumentation-0.59b0-py3-none-any.whl.metadata (7.1 kB) +#9 175.2 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 175.2 Downloading opentelemetry_instrumentation_httpx-0.58b0-py3-none-any.whl.metadata (7.3 kB) +#9 175.4 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 175.4 Downloading opentelemetry_instrumentation-0.58b0-py3-none-any.whl.metadata (7.1 kB) +#9 175.5 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 175.5 Downloading opentelemetry_instrumentation_httpx-0.57b0-py3-none-any.whl.metadata (7.3 kB) +#9 175.7 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 175.7 Downloading opentelemetry_instrumentation-0.57b0-py3-none-any.whl.metadata (6.7 kB) +#9 175.8 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 175.8 Downloading opentelemetry_instrumentation_httpx-0.56b0-py3-none-any.whl.metadata (7.3 kB) +#9 176.0 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 176.0 Downloading opentelemetry_instrumentation-0.56b0-py3-none-any.whl.metadata (6.7 kB) +#9 176.1 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 176.1 Downloading opentelemetry_instrumentation_httpx-0.55b1-py3-none-any.whl.metadata (7.3 kB) +#9 176.3 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 176.3 Downloading opentelemetry_instrumentation-0.55b1-py3-none-any.whl.metadata (6.7 kB) +#9 176.4 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 176.4 Downloading opentelemetry_instrumentation_httpx-0.55b0-py3-none-any.whl.metadata (7.3 kB) +#9 176.6 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 176.6 Downloading opentelemetry_instrumentation-0.55b0-py3-none-any.whl.metadata (6.7 kB) +#9 176.7 INFO: pip is still looking at multiple versions of opentelemetry-instrumentation-httpx to determine which version is compatible with other requirements. This could take a while. +#9 176.7 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 176.7 Downloading opentelemetry_instrumentation_httpx-0.54b1-py3-none-any.whl.metadata (7.4 kB) +#9 176.9 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 176.9 Downloading opentelemetry_instrumentation-0.54b1-py3-none-any.whl.metadata (6.8 kB) +#9 177.0 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 177.1 Downloading opentelemetry_instrumentation_httpx-0.54b0-py3-none-any.whl.metadata (7.4 kB) +#9 177.2 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 177.2 Downloading opentelemetry_instrumentation-0.54b0-py3-none-any.whl.metadata (6.8 kB) +#9 177.3 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 177.3 Downloading opentelemetry_instrumentation_httpx-0.53b1-py3-none-any.whl.metadata (7.3 kB) +#9 177.5 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 177.5 Downloading opentelemetry_instrumentation-0.53b1-py3-none-any.whl.metadata (6.8 kB) +#9 177.6 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 177.7 Downloading opentelemetry_instrumentation_httpx-0.53b0-py3-none-any.whl.metadata (7.3 kB) +#9 177.8 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 177.8 Downloading opentelemetry_instrumentation-0.53b0-py3-none-any.whl.metadata (6.8 kB) +#9 177.9 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 177.9 Downloading opentelemetry_instrumentation_httpx-0.52b1-py3-none-any.whl.metadata (7.1 kB) +#9 178.1 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 178.1 Downloading opentelemetry_instrumentation-0.52b1-py3-none-any.whl.metadata (6.8 kB) +#9 178.2 INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime. See https://pip.pypa.io/warnings/backtracking for guidance. If you want to abort this run, press Ctrl + C. +#9 178.2 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 178.2 Downloading opentelemetry_instrumentation_httpx-0.52b0-py3-none-any.whl.metadata (7.1 kB) +#9 178.4 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 178.4 Downloading opentelemetry_instrumentation-0.52b0-py3-none-any.whl.metadata (6.8 kB) +#9 178.5 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 178.5 Downloading opentelemetry_instrumentation_httpx-0.51b0-py3-none-any.whl.metadata (7.1 kB) +#9 178.7 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 178.7 Downloading opentelemetry_instrumentation-0.51b0-py3-none-any.whl.metadata (6.3 kB) +#9 178.8 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 178.8 Downloading opentelemetry_instrumentation_httpx-0.50b0-py3-none-any.whl.metadata (7.0 kB) +#9 179.0 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 179.0 Downloading opentelemetry_instrumentation-0.50b0-py3-none-any.whl.metadata (6.1 kB) +#9 179.1 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 179.1 Downloading opentelemetry_instrumentation_httpx-0.49b2-py3-none-any.whl.metadata (7.0 kB) +#9 179.2 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 179.3 Downloading opentelemetry_instrumentation-0.49b2-py3-none-any.whl.metadata (6.1 kB) +#9 179.4 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 179.4 Downloading opentelemetry_instrumentation_httpx-0.49b1-py3-none-any.whl.metadata (7.0 kB) +#9 179.5 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 179.5 Downloading opentelemetry_instrumentation-0.49b1-py3-none-any.whl.metadata (6.2 kB) +#9 179.6 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 179.7 Downloading opentelemetry_instrumentation_httpx-0.49b0-py3-none-any.whl.metadata (7.0 kB) +#9 179.8 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 179.8 Downloading opentelemetry_instrumentation-0.49b0-py3-none-any.whl.metadata (6.2 kB) +#9 179.9 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 179.9 Downloading opentelemetry_instrumentation_httpx-0.48b0-py3-none-any.whl.metadata (7.0 kB) +#9 180.1 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 180.1 Downloading opentelemetry_instrumentation-0.48b0-py3-none-any.whl.metadata (6.1 kB) +#9 180.2 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 180.2 Downloading opentelemetry_instrumentation_httpx-0.47b0-py3-none-any.whl.metadata (7.0 kB) +#9 180.4 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 180.4 Downloading opentelemetry_instrumentation-0.47b0-py3-none-any.whl.metadata (6.1 kB) +#9 180.5 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 180.5 Downloading opentelemetry_instrumentation_httpx-0.46b0-py3-none-any.whl.metadata (6.9 kB) +#9 180.6 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 180.7 Downloading opentelemetry_instrumentation-0.46b0-py3-none-any.whl.metadata (6.1 kB) +#9 180.8 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 180.8 Downloading opentelemetry_instrumentation_httpx-0.45b0-py3-none-any.whl.metadata (6.9 kB) +#9 180.9 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 180.9 Downloading opentelemetry_instrumentation-0.45b0-py3-none-any.whl.metadata (6.1 kB) +#9 181.0 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 181.1 Downloading opentelemetry_instrumentation_httpx-0.44b0-py3-none-any.whl.metadata (7.1 kB) +#9 181.2 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 181.2 Downloading opentelemetry_instrumentation-0.44b0-py3-none-any.whl.metadata (6.1 kB) +#9 181.4 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 181.4 Downloading opentelemetry_instrumentation_httpx-0.43b0-py3-none-any.whl.metadata (7.1 kB) +#9 181.5 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 181.5 Downloading opentelemetry_instrumentation-0.43b0-py3-none-any.whl.metadata (5.9 kB) +#9 181.6 Collecting opentelemetry-instrumentation-httpx>=0.42b0 (from logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 181.7 Downloading opentelemetry_instrumentation_httpx-0.42b0-py3-none-any.whl.metadata (6.1 kB) +#9 181.8 Collecting opentelemetry-instrumentation>=0.41b0 (from logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 181.8 Downloading opentelemetry_instrumentation-0.42b0-py3-none-any.whl.metadata (5.9 kB) +#9 182.1 Collecting opentelemetry-semantic-conventions==0.60b1 (from opentelemetry-instrumentation>=0.41b0->logfire>=4.16.0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 182.1 Downloading opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl.metadata (2.4 kB) +#9 182.3 Collecting opentelemetry-api>=1.28.0 (from pydantic-ai-slim==1.67.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 182.3 Downloading opentelemetry_api-1.39.1-py3-none-any.whl.metadata (1.5 kB) +#9 182.8 Collecting opentelemetry-util-http==0.60b1 (from opentelemetry-instrumentation-httpx>=0.42b0->logfire[httpx]>=4.16.0; extra == "logfire"->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 182.9 Downloading opentelemetry_util_http-0.60b1-py3-none-any.whl.metadata (2.6 kB) +#9 183.7 Collecting pyasn1<0.7.0,>=0.6.1 (from pyasn1-modules>=0.2.1->google-auth>=2.36.0->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 183.7 Downloading pyasn1-0.6.2-py3-none-any.whl.metadata (8.4 kB) +#9 183.9 Collecting six>=1.5 (from python-dateutil>=2.8.2->mistralai>=1.9.11->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 184.0 Downloading six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB) +#9 192.2 Collecting more-itertools (from jaraco.classes->keyring>=25.6.0->py-key-value-aio[filetree,keyring,memory]<0.5.0,>=0.4.4->fastmcp>=0.1.0->-r requirements.txt (line 6)) +#9 192.2 Downloading more_itertools-10.8.0-py3-none-any.whl.metadata (39 kB) +#9 192.9 Collecting shellingham>=1.3.0 (from typer->huggingface-hub<2.0.0,>=1.3.4->pydantic-ai-slim[ag-ui,anthropic,bedrock,cli,cohere,evals,fastmcp,google,groq,huggingface,logfire,mcp,mistral,openai,retries,temporal,ui,vertexai,xai]==1.67.0->pydantic-ai>=0.0.14->-r requirements.txt (line 2)) +#9 192.9 Downloading shellingham-1.5.4-py2.py3-none-any.whl.metadata (3.5 kB) +#9 194.1 Downloading pydantic_ai-1.67.0-py3-none-any.whl (7.2 kB) +#9 194.1 Downloading pydantic_ai_slim-1.67.0-py3-none-any.whl (567 kB) +#9 194.2 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 567.9/567.9 kB 41.9 MB/s eta 0:00:00 +#9 194.2 Downloading pydantic_evals-1.67.0-py3-none-any.whl (67 kB) +#9 194.2 Downloading pydantic_graph-1.67.0-py3-none-any.whl (72 kB) +#9 194.2 Downloading temporalio-1.20.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (11.8 MB) +#9 194.5 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.8/11.8 MB 43.5 MB/s eta 0:00:00 +#9 194.6 Downloading nexus_rpc-1.2.0-py3-none-any.whl (28 kB) +#9 194.6 Downloading mcp-1.26.0-py3-none-any.whl (233 kB) +#9 194.6 Downloading fastmcp-3.1.0-py3-none-any.whl (633 kB) +#9 194.6 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 633.7/633.7 kB 43.4 MB/s eta 0:00:00 +#9 194.7 Downloading fastapi-0.135.1-py3-none-any.whl (116 kB) +#9 194.7 Downloading uvicorn-0.41.0-py3-none-any.whl (68 kB) +#9 194.7 Downloading pydantic-2.12.5-py3-none-any.whl (463 kB) +#9 194.7 Downloading pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.9 MB) +#9 194.8 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.9/1.9 MB 43.8 MB/s eta 0:00:00 +#9 194.8 Downloading aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (1.7 MB) +#9 194.9 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 44.0 MB/s eta 0:00:00 +#9 194.9 Downloading python_dotenv-1.2.2-py3-none-any.whl (22 kB) +#9 194.9 Downloading loguru-0.7.3-py3-none-any.whl (61 kB) +#9 194.9 Downloading aiohappyeyeballs-2.6.1-py3-none-any.whl (15 kB) +#9 195.0 Downloading aiosignal-1.4.0-py3-none-any.whl (7.5 kB) +#9 195.0 Downloading annotated_doc-0.0.4-py3-none-any.whl (5.3 kB) +#9 195.0 Downloading annotated_types-0.7.0-py3-none-any.whl (13 kB) +#9 195.0 Downloading anyio-4.12.1-py3-none-any.whl (113 kB) +#9 195.0 Downloading attrs-25.4.0-py3-none-any.whl (67 kB) +#9 195.1 Downloading authlib-1.6.9-py2.py3-none-any.whl (244 kB) +#9 195.1 Downloading click-8.3.1-py3-none-any.whl (108 kB) +#9 195.1 Downloading cyclopts-4.8.0-py3-none-any.whl (201 kB) +#9 195.1 Downloading exceptiongroup-1.3.1-py3-none-any.whl (16 kB) +#9 195.2 Downloading frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (243 kB) +#9 195.2 Downloading h11-0.16.0-py3-none-any.whl (37 kB) +#9 195.2 Downloading httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (511 kB) +#9 195.2 Downloading httpx-0.28.1-py3-none-any.whl (73 kB) +#9 195.2 Downloading httpcore-1.0.9-py3-none-any.whl (78 kB) +#9 195.3 Downloading httpx_sse-0.4.3-py3-none-any.whl (9.0 kB) +#9 195.3 Downloading jsonref-1.1.0-py3-none-any.whl (9.4 kB) +#9 195.3 Downloading jsonschema-4.26.0-py3-none-any.whl (90 kB) +#9 195.3 Downloading jsonschema_path-0.4.5-py3-none-any.whl (19 kB) +#9 195.3 Downloading multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (258 kB) +#9 195.4 Downloading openapi_pydantic-0.5.1-py3-none-any.whl (96 kB) +#9 195.4 Downloading platformdirs-4.9.4-py3-none-any.whl (21 kB) +#9 195.4 Downloading propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (225 kB) +#9 195.4 Downloading py_key_value_aio-0.4.4-py3-none-any.whl (152 kB) +#9 195.5 Downloading pydantic_settings-2.13.1-py3-none-any.whl (58 kB) +#9 195.5 Downloading pyjwt-2.11.0-py3-none-any.whl (28 kB) +#9 195.5 Downloading pyperclip-1.11.0-py3-none-any.whl (11 kB) +#9 195.5 Downloading python_multipart-0.0.22-py3-none-any.whl (24 kB) +#9 195.5 Downloading pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (775 kB) +#9 195.6 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 775.1/775.1 kB 44.8 MB/s eta 0:00:00 +#9 195.6 Downloading rich-14.3.3-py3-none-any.whl (310 kB) +#9 195.6 Downloading sse_starlette-3.3.2-py3-none-any.whl (14 kB) +#9 195.6 Downloading starlette-0.52.1-py3-none-any.whl (74 kB) +#9 195.7 Downloading typing_extensions-4.15.0-py3-none-any.whl (44 kB) +#9 195.7 Downloading typing_inspection-0.4.2-py3-none-any.whl (14 kB) +#9 195.7 Downloading uncalled_for-0.2.0-py3-none-any.whl (11 kB) +#9 195.7 Downloading uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (4.3 MB) +#9 195.8 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.3/4.3 MB 44.4 MB/s eta 0:00:00 +#9 195.9 Downloading watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (449 kB) +#9 195.9 Downloading websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (186 kB) +#9 195.9 Downloading yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (97 kB) +#9 195.9 Downloading ag_ui_protocol-0.1.13-py3-none-any.whl (8.1 kB) +#9 196.0 Downloading aiofile-3.9.0-py3-none-any.whl (19 kB) +#9 196.0 Downloading anthropic-0.84.0-py3-none-any.whl (455 kB) +#9 196.0 Downloading argcomplete-3.6.3-py3-none-any.whl (43 kB) +#9 196.0 Downloading beartype-0.22.9-py3-none-any.whl (1.3 MB) +#9 196.1 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/1.3 MB 43.4 MB/s eta 0:00:00 +#9 196.1 Downloading boto3-1.42.63-py3-none-any.whl (140 kB) +#9 196.2 Downloading cachetools-7.0.4-py3-none-any.whl (13 kB) +#9 196.2 Downloading cohere-5.20.7-py3-none-any.whl (323 kB) +#9 196.2 Downloading cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl (4.3 MB) +#9 196.3 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.3/4.3 MB 44.2 MB/s eta 0:00:00 +#9 196.3 Downloading docstring_parser-0.17.0-py3-none-any.whl (36 kB) +#9 196.4 Downloading email_validator-2.3.0-py3-none-any.whl (35 kB) +#9 196.4 Downloading genai_prices-0.0.55-py3-none-any.whl (62 kB) +#9 196.4 Downloading google_auth-2.49.0-py3-none-any.whl (240 kB) +#9 196.4 Downloading google_genai-1.66.0-py3-none-any.whl (732 kB) +#9 196.5 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 732.2/732.2 kB 42.0 MB/s eta 0:00:00 +#9 196.5 Downloading griffelib-2.0.0-py3-none-any.whl (142 kB) +#9 196.5 Downloading groq-1.1.0-py3-none-any.whl (139 kB) +#9 196.5 Downloading huggingface_hub-1.6.0-py3-none-any.whl (612 kB) +#9 196.6 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 612.9/612.9 kB 43.1 MB/s eta 0:00:00 +#9 196.6 Downloading idna-3.11-py3-none-any.whl (71 kB) +#9 196.6 Downloading importlib_metadata-8.7.1-py3-none-any.whl (27 kB) +#9 196.6 Downloading jsonschema_specifications-2025.9.1-py3-none-any.whl (18 kB) +#9 196.7 Downloading keyring-25.7.0-py3-none-any.whl (39 kB) +#9 196.7 Downloading logfire-4.27.0-py3-none-any.whl (301 kB) +#9 196.7 Downloading markdown_it_py-4.0.0-py3-none-any.whl (87 kB) +#9 196.7 Downloading mistralai-1.12.4-py3-none-any.whl (509 kB) +#9 196.8 Downloading openai-2.26.0-py3-none-any.whl (1.1 MB) +#9 196.8 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 43.9 MB/s eta 0:00:00 +#9 196.8 Downloading pathable-0.5.0-py3-none-any.whl (16 kB) +#9 196.8 Downloading prompt_toolkit-3.0.52-py3-none-any.whl (391 kB) +#9 196.9 Downloading pygments-2.19.2-py3-none-any.whl (1.2 MB) +#9 196.9 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 43.8 MB/s eta 0:00:00 +#9 196.9 Downloading referencing-0.37.0-py3-none-any.whl (26 kB) +#9 197.0 Downloading requests-2.32.5-py3-none-any.whl (64 kB) +#9 197.0 Downloading certifi-2026.2.25-py3-none-any.whl (153 kB) +#9 197.0 Downloading rich_rst-1.3.2-py3-none-any.whl (12 kB) +#9 197.0 Downloading rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (390 kB) +#9 197.1 Downloading tenacity-9.1.4-py3-none-any.whl (28 kB) +#9 197.1 Downloading tiktoken-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl (1.1 MB) +#9 197.1 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 42.8 MB/s eta 0:00:00 +#9 197.2 Downloading xai_sdk-1.8.0-py3-none-any.whl (242 kB) +#9 197.2 Downloading packaging-25.0-py3-none-any.whl (66 kB) +#9 197.2 Downloading botocore-1.42.63-py3-none-any.whl (14.6 MB) +#9 197.6 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.6/14.6 MB 43.2 MB/s eta 0:00:00 +#9 197.6 Downloading caio-0.9.25-cp312-cp312-manylinux_2_34_aarch64.whl (81 kB) +#9 197.6 Downloading cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (220 kB) +#9 197.7 Downloading charset_normalizer-3.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (189 kB) +#9 197.7 Downloading distro-1.9.0-py3-none-any.whl (20 kB) +#9 197.7 Downloading dnspython-2.8.0-py3-none-any.whl (331 kB) +#9 197.7 Downloading eval_type_backport-0.3.1-py3-none-any.whl (6.1 kB) +#9 197.8 Downloading executing-2.2.1-py2.py3-none-any.whl (28 kB) +#9 197.8 Downloading fastavro-1.12.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (3.4 MB) +#9 197.9 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.4/3.4 MB 43.0 MB/s eta 0:00:00 +#9 197.9 Downloading filelock-3.25.0-py3-none-any.whl (26 kB) +#9 197.9 Downloading fsspec-2026.2.0-py3-none-any.whl (202 kB) +#9 197.9 Downloading googleapis_common_protos-1.73.0-py3-none-any.whl (297 kB) +#9 198.0 Downloading grpcio-1.78.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (6.5 MB) +#9 198.1 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.5/6.5 MB 44.2 MB/s eta 0:00:00 +#9 198.2 Downloading hf_xet-1.3.2-cp37-abi3-manylinux_2_28_aarch64.whl (4.0 MB) +#9 198.3 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.0/4.0 MB 44.1 MB/s eta 0:00:00 +#9 198.3 Downloading invoke-2.2.1-py3-none-any.whl (160 kB) +#9 198.3 Downloading jeepney-0.9.0-py3-none-any.whl (49 kB) +#9 198.4 Downloading jiter-0.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (348 kB) +#9 198.4 Downloading jmespath-1.1.0-py3-none-any.whl (20 kB) +#9 198.4 Downloading logfire_api-4.27.0-py3-none-any.whl (121 kB) +#9 198.4 Downloading mdurl-0.1.2-py3-none-any.whl (10.0 kB) +#9 198.4 Downloading opentelemetry_exporter_otlp_proto_http-1.39.1-py3-none-any.whl (19 kB) +#9 198.5 Downloading opentelemetry_exporter_otlp_proto_common-1.39.1-py3-none-any.whl (18 kB) +#9 198.5 Downloading opentelemetry_proto-1.39.1-py3-none-any.whl (72 kB) +#9 198.5 Downloading opentelemetry_instrumentation-0.60b1-py3-none-any.whl (33 kB) +#9 198.5 Downloading opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl (219 kB) +#9 198.6 Downloading opentelemetry_api-1.39.1-py3-none-any.whl (66 kB) +#9 198.6 Downloading opentelemetry_instrumentation_httpx-0.60b1-py3-none-any.whl (15 kB) +#9 198.6 Downloading opentelemetry_util_http-0.60b1-py3-none-any.whl (8.9 kB) +#9 198.6 Downloading opentelemetry_sdk-1.39.1-py3-none-any.whl (132 kB) +#9 198.6 Downloading protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl (324 kB) +#9 198.7 Downloading pyasn1_modules-0.4.2-py3-none-any.whl (181 kB) +#9 198.7 Downloading python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB) +#9 198.7 Downloading regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (796 kB) +#9 198.8 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 796.8/796.8 kB 43.6 MB/s eta 0:00:00 +#9 198.8 Downloading rsa-4.9.1-py3-none-any.whl (34 kB) +#9 198.8 Downloading s3transfer-0.16.0-py3-none-any.whl (86 kB) +#9 198.8 Downloading secretstorage-3.5.0-py3-none-any.whl (15 kB) +#9 198.8 Downloading tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.3 MB) +#9 198.9 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 44.0 MB/s eta 0:00:00 +#9 199.0 Downloading tqdm-4.67.3-py3-none-any.whl (78 kB) +#9 199.0 Downloading types_protobuf-6.32.1.20260221-py3-none-any.whl (77 kB) +#9 199.0 Downloading types_requests-2.32.4.20260107-py3-none-any.whl (20 kB) +#9 199.1 Downloading urllib3-2.6.3-py3-none-any.whl (131 kB) +#9 199.1 Downloading zipp-3.23.0-py3-none-any.whl (10 kB) +#9 199.1 Downloading docutils-0.22.4-py3-none-any.whl (633 kB) +#9 199.1 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 633.2/633.2 kB 43.3 MB/s eta 0:00:00 +#9 199.2 Downloading jaraco.classes-3.4.0-py3-none-any.whl (6.8 kB) +#9 199.2 Downloading jaraco_context-6.1.1-py3-none-any.whl (7.0 kB) +#9 199.2 Downloading jaraco_functools-4.4.0-py3-none-any.whl (10 kB) +#9 199.2 Downloading sniffio-1.3.1-py3-none-any.whl (10 kB) +#9 199.2 Downloading typer-0.24.1-py3-none-any.whl (56 kB) +#9 199.3 Downloading wcwidth-0.6.0-py3-none-any.whl (94 kB) +#9 199.3 Downloading pyasn1-0.6.2-py3-none-any.whl (83 kB) +#9 199.3 Downloading shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB) +#9 199.3 Downloading six-1.17.0-py2.py3-none-any.whl (11 kB) +#9 199.3 Downloading wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (88 kB) +#9 199.3 Downloading more_itertools-10.8.0-py3-none-any.whl (69 kB) +#9 199.4 Downloading pycparser-3.0-py3-none-any.whl (48 kB) +#9 207.4 Installing collected packages: pyperclip, zipp, wrapt, websockets, wcwidth, uvloop, urllib3, uncalled-for, typing-extensions, types-protobuf, tqdm, tenacity, sniffio, six, shellingham, rpds-py, regex, pyyaml, python-multipart, python-dotenv, pyjwt, pygments, pycparser, pyasn1, protobuf, propcache, platformdirs, pathable, packaging, opentelemetry-util-http, multidict, more-itertools, mdurl, loguru, logfire-api, jsonref, jmespath, jiter, jeepney, jaraco.context, invoke, idna, httpx-sse, httptools, hf-xet, h11, griffelib, fsspec, frozenlist, filelock, fastavro, executing, eval-type-backport, docutils, docstring-parser, dnspython, distro, click, charset_normalizer, certifi, caio, cachetools, beartype, attrs, argcomplete, annotated-types, annotated-doc, aiohappyeyeballs, yarl, uvicorn, typing-inspection, types-requests, rsa, requests, referencing, python-dateutil, pydantic-core, pyasn1-modules, py-key-value-aio, prompt-toolkit, opentelemetry-proto, nexus-rpc, markdown-it-py, jaraco.functools, jaraco.classes, importlib-metadata, httpcore, grpcio, googleapis-common-protos, exceptiongroup, email-validator, cffi, anyio, aiosignal, aiofile, watchfiles, tiktoken, temporalio, starlette, rich, pydantic, opentelemetry-exporter-otlp-proto-common, opentelemetry-api, jsonschema-specifications, jsonschema-path, httpx, cryptography, botocore, aiohttp, typer, sse-starlette, SecretStorage, s3transfer, rich-rst, pydantic-settings, pydantic-graph, opentelemetry-semantic-conventions, openapi-pydantic, openai, jsonschema, groq, google-auth, genai-prices, fastapi, authlib, anthropic, ag-ui-protocol, pydantic-ai-slim, opentelemetry-sdk, opentelemetry-instrumentation, mcp, keyring, huggingface-hub, cyclopts, boto3, xai-sdk, tokenizers, pydantic-evals, opentelemetry-instrumentation-httpx, opentelemetry-exporter-otlp-proto-http, google-genai, mistralai, logfire, fastmcp, cohere, pydantic-ai diff --git a/search_agent/run_api_server.py b/search_agent/run_api_server.py index c4416b0..0ef49b8 100644 --- a/search_agent/run_api_server.py +++ b/search_agent/run_api_server.py @@ -11,7 +11,7 @@ if __name__ == '__main__': import os host = os.getenv('API_HOST', '0.0.0.0') - port = int(os.getenv('API_PORT', '8000')) + port = int(os.getenv('API_PORT', '8080')) print(f"🚀 启动 Search Agent API: http://{host}:{port}") uvicorn.run(app, host=host, port=port, log_level="info") diff --git a/search_agent/src/server/api_server.py b/search_agent/src/server/api_server.py index dcfa2f5..2cd4968 100644 --- a/search_agent/src/server/api_server.py +++ b/search_agent/src/server/api_server.py @@ -280,6 +280,88 @@ async def api_quick_search( raise HTTPException(status_code=500, detail=str(e)) +@app.post("/api/v1/search/stream") +async def api_search_stream( + request: SearchRequest, + api_key: str = Depends(verify_api_key) +): + """ + 流式搜索(SSE 模式) + + 在搜索过程中实时推送进度和中间结果。 + + 事件类型: + - search_start: 搜索开始 + - query_analysis: 查询分析完成 + - search_plan: 搜索计划生成 + - search_progress: 搜索进度更新 + - extraction_progress: 内容提取进度 + - ranking_complete: 排序完成 + - answer_start: 开始生成答案 + - answer_complete: 答案生成完成 + - reflection: 反思评估结果 + - iteration_start: 新迭代开始 + - complete: 搜索完成 + - error: 错误 + """ + from .core.agent import SearchAgent + from .core.config import Config + + async def stream() -> AsyncGenerator[str, None]: + # 设置 API Key 到环境变量 + old_key = os.environ.get('OPENAI_API_KEY') + os.environ['OPENAI_API_KEY'] = api_key + + try: + # 从环境变量创建配置,传入 API Key + config = Config.from_env(api_key=api_key) + # 覆盖最大迭代次数 + if request.max_iterations: + config = Config( + llm_base_url=config.llm_base_url, + llm_api_key=api_key, + llm_model=config.llm_model, + serper_api_key=config.serper_api_key, + jina_api_key=config.jina_api_key, + max_iterations=request.max_iterations, + max_results_per_query=config.max_results_per_query, + content_max_length=config.content_max_length, + log_level=config.log_level, + timeout=config.timeout, + max_concurrent_extraction=config.max_concurrent_extraction, + enable_pipeline_mode=config.enable_pipeline_mode, + enable_fast_return=config.enable_fast_return + ) + + agent = SearchAgent(config) + + # 流式搜索 + async for event in agent.search_stream(request.query): + yield event.to_sse() + + except Exception as e: + import json + error_event = { + "event": "error", + "data": {"error": str(e)}, + "iteration": 0 + } + yield f"event: error\ndata: {json.dumps(error_event, ensure_ascii=False)}\n\n" + finally: + if old_key: + os.environ['OPENAI_API_KEY'] = old_key + + return StreamingResponse( + stream(), + media_type="text/event-stream", + headers={ + "Cache-Control": "no-cache", + "Connection": "keep-alive", + "X-Accel-Buffering": "no" + } + ) + + @app.get("/api/v1/tools") async def api_tools(): """获取可用工具列表""" diff --git a/search_agent/src/server/core/agent.py b/search_agent/src/server/core/agent.py index d240cca..13d66cd 100644 --- a/search_agent/src/server/core/agent.py +++ b/search_agent/src/server/core/agent.py @@ -6,10 +6,11 @@ - 流水线并行:搜索完成后立即开始内容提取,不等待所有搜索完成 - 高置信度快速返回:简单查询跳过反思评估 - 可配置的并发数:支持更高的内容提取并发 +- SSE 流式返回:实时推送搜索进度和中间结果 """ import asyncio -from typing import List, Optional, Set +from typing import List, Optional, Set, AsyncGenerator from loguru import logger from .config import Config @@ -23,6 +24,8 @@ from .schemas import ( Answer, AgentResponse, Intent, + SSEEvent, + SSEEventType, ) from .modules.query_analyzer import QueryAnalyzer from .modules.search_planner import SearchPlanner @@ -340,3 +343,277 @@ class SearchAgent: ) logger.info(f"[快速搜索] 完成: confidence={answer.confidence}") return answer + + async def search_stream(self, query: str) -> AsyncGenerator[SSEEvent, None]: + """ + 流式搜索(SSE 模式) + + 在搜索过程中实时推送进度和中间结果 + + Args: + query: 用户查询 + + Yields: + SSEEvent 对象 + """ + logger.info(f"="*60) + logger.info(f"[SSE] 开始流式搜索: {query}") + logger.info(f"="*60) + + iteration = 0 + all_documents: List[Document] = [] + all_queries: List[str] = [] + seen_urls: Set[str] = set() + + # 发送搜索开始事件 + yield SSEEvent( + event=SSEEventType.SEARCH_START, + data={"query": query, "max_iterations": self.config.max_iterations}, + iteration=0 + ) + + try: + # 1. 查询理解 + analysis = await self.query_analyzer.analyze(query) + logger.info(f"[SSE] 查询分析完成: intent={analysis.intent.value}") + + yield SSEEvent( + event=SSEEventType.QUERY_ANALYSIS, + data=analysis.to_dict(), + iteration=0 + ) + + answer: Optional[Answer] = None + + while iteration < self.config.max_iterations: + iteration += 1 + logger.info(f"\n[SSE] --- 迭代 {iteration}/{self.config.max_iterations} ---") + + # 发送迭代开始事件 + yield SSEEvent( + event=SSEEventType.ITERATION_START, + data={"iteration": iteration, "max_iterations": self.config.max_iterations}, + iteration=iteration + ) + + # 2. 搜索规划 + if iteration == 1: + plan = await self.search_planner.plan(analysis) + else: + plan = self.search_planner.plan_supplementary( + query, + analysis.expanded_queries + ) + + all_queries.extend([t.query for t in plan.tasks]) + logger.info(f"[SSE] 搜索计划: {len(plan.tasks)} 个任务") + + yield SSEEvent( + event=SSEEventType.SEARCH_PLAN, + data={ + "tasks_count": len(plan.tasks), + "queries": [t.query for t in plan.tasks] + }, + iteration=iteration + ) + + # 3. 搜索执行(流式) + search_results: List[SearchResult] = [] + completed_tasks = 0 + total_tasks = len(plan.tasks) + + # 创建搜索协程 + search_coros = [ + self.search_executor._execute_task(task) + for task in plan.tasks + ] + + # 流式处理搜索结果 + for coro in asyncio.as_completed(search_coros): + try: + results = await coro + completed_tasks += 1 + + if results: + search_results.extend(results) + + # 发送搜索进度 + yield SSEEvent( + event=SSEEventType.SEARCH_PROGRESS, + data={ + "completed": completed_tasks, + "total": total_tasks, + "results_count": len(results) + }, + iteration=iteration + ) + except Exception as e: + logger.warning(f"[SSE] 搜索任务失败: {e}") + completed_tasks += 1 + + logger.info(f"[SSE] 搜索结果: {len(search_results)} 条") + + if not search_results: + logger.warning("[SSE] 没有搜索结果") + if answer is None: + answer = self.answer_generator._empty_answer() + break + + # 4. 内容提取(流式) + new_results = [] + for r in search_results: + if r.url not in seen_urls: + seen_urls.add(r.url) + new_results.append(r) + + yield SSEEvent( + event=SSEEventType.EXTRACTION_PROGRESS, + data={ + "total_urls": len(new_results), + "status": "starting" + }, + iteration=iteration + ) + + documents = await self.content_extractor.extract_batch( + new_results, + max_urls=10 + ) + + all_documents.extend(documents) + logger.info(f"[SSE] 提取文档: {len(documents)} 个") + + yield SSEEvent( + event=SSEEventType.EXTRACTION_PROGRESS, + data={ + "extracted_count": len(documents), + "status": "complete" + }, + iteration=iteration + ) + + if not documents: + logger.warning("[SSE] 没有成功提取到文档内容") + if answer is None: + answer = self.answer_generator._empty_answer() + break + + # 5. 结果处理(去重+重排序) + ranked_docs, all_ranked_docs = await self.result_processor.process_all( + query=query, + documents=all_documents, + top_k=5 + ) + logger.info(f"[SSE] 排序结果: top {len(ranked_docs)} 个,共 {len(all_ranked_docs)} 个") + + yield SSEEvent( + event=SSEEventType.RANKING_COMPLETE, + data={ + "top_count": len(ranked_docs), + "total_count": len(all_ranked_docs), + "top_sources": [ + {"title": d.document.title, "url": d.document.url, "score": d.relevance_score} + for d in ranked_docs[:3] + ] + }, + iteration=iteration + ) + + if not ranked_docs: + logger.warning("[SSE] 没有有效的排序结果") + continue + + # 6. 生成答案 + yield SSEEvent( + event=SSEEventType.ANSWER_START, + data={"status": "generating"}, + iteration=iteration + ) + + answer = await self.answer_generator.generate( + query=query, + documents=ranked_docs, + all_ranked_documents=all_ranked_docs + ) + logger.info(f"[SSE] 答案生成完成: confidence={answer.confidence}") + + yield SSEEvent( + event=SSEEventType.ANSWER_COMPLETE, + data={ + "confidence": answer.confidence, + "sources_count": len(answer.sources), + "content_preview": answer.content[:200] + "..." if len(answer.content) > 200 else answer.content + }, + iteration=iteration + ) + + # 7. 高置信度快速返回 + if self.config.enable_fast_return and self._should_fast_return(answer, analysis): + logger.info("[SSE] 高置信度答案,跳过反思评估,快速返回") + break + + # 8. 反思评估 + assessment = await self.reflector.assess(query, answer) + + yield SSEEvent( + event=SSEEventType.REFLECTION, + data={ + "completeness": assessment.completeness, + "needs_more_search": assessment.needs_more_search, + "missing_aspects": assessment.missing_aspects, + "suggested_queries": assessment.suggested_queries + }, + iteration=iteration + ) + + # 9. 判断是否继续迭代 + if not self.reflector.should_continue(assessment, iteration): + break + + # 更新分析,准备下一轮搜索 + if assessment.suggested_queries: + analysis.expanded_queries = assessment.suggested_queries + logger.info(f"[SSE] 补充搜索: {assessment.suggested_queries}") + + # 确保有答案返回 + if answer is None: + answer = self.answer_generator._empty_answer() + + # 去重统计 + unique_urls = set(d.url for d in all_documents) + + response = AgentResponse( + answer=answer, + iterations=iteration, + total_sources_consulted=len(unique_urls), + search_queries_used=list(set(all_queries)) + ) + + logger.info(f"\n[SSE] {'='*60}") + logger.info(f"[SSE] 搜索完成!") + logger.info(f"[SSE] 迭代次数: {iteration}") + logger.info(f"[SSE] 参考来源: {len(unique_urls)}") + logger.info(f"[SSE] {'='*60}\n") + + # 发送完成事件 + yield SSEEvent( + event=SSEEventType.COMPLETE, + data={ + "success": True, + "answer": answer.to_dict(), + "statistics": { + "iterations": iteration, + "total_sources_consulted": len(unique_urls), + "search_queries_used": list(set(all_queries)) + } + }, + iteration=iteration + ) + + except Exception as e: + logger.error(f"[SSE] 搜索错误: {e}") + yield SSEEvent( + event=SSEEventType.ERROR, + data={"error": str(e)}, + iteration=iteration + ) diff --git a/search_agent/src/server/core/schemas.py b/search_agent/src/server/core/schemas.py index ab41dfe..3e59e50 100644 --- a/search_agent/src/server/core/schemas.py +++ b/search_agent/src/server/core/schemas.py @@ -4,7 +4,7 @@ """ from dataclasses import dataclass, field -from typing import List, Optional +from typing import List, Optional, Any from enum import Enum @@ -237,3 +237,56 @@ class AgentResponse: "total_sources_consulted": self.total_sources_consulted, "search_queries_used": self.search_queries_used } + + +class SSEEventType(Enum): + """SSE 事件类型""" + # 搜索阶段 + SEARCH_START = "search_start" # 搜索开始 + QUERY_ANALYSIS = "query_analysis" # 查询分析完成 + SEARCH_PLAN = "search_plan" # 搜索计划生成 + SEARCH_PROGRESS = "search_progress" # 搜索进度更新 + SEARCH_RESULT = "search_result" # 单个搜索结果 + EXTRACTION_PROGRESS = "extraction_progress" # 内容提取进度 + DOCUMENT_EXTRACTED = "document_extracted" # 文档提取完成 + RANKING_COMPLETE = "ranking_complete" # 排序完成 + + # 答案生成阶段 + ANSWER_START = "answer_start" # 开始生成答案 + ANSWER_CHUNK = "answer_chunk" # 答案内容片段(流式) + ANSWER_COMPLETE = "answer_complete" # 答案生成完成 + + # 反思阶段 + REFLECTION = "reflection" # 反思评估结果 + ITERATION_START = "iteration_start" # 新迭代开始 + + # 完成 + COMPLETE = "complete" # 搜索完成 + ERROR = "error" # 错误 + + +@dataclass +class SSEEvent: + """SSE 事件""" + event: SSEEventType # 事件类型 + data: Any # 事件数据 + iteration: int = 1 # 当前迭代次数 + + def to_dict(self) -> dict: + """转换为字典""" + data_dict = self.data + if hasattr(self.data, 'to_dict'): + data_dict = self.data.to_dict() + elif isinstance(self.data, dict): + data_dict = self.data + + return { + "event": self.event.value, + "data": data_dict, + "iteration": self.iteration + } + + def to_sse(self) -> str: + """转换为 SSE 格式字符串""" + import json + return f"event: {self.event.value}\ndata: {json.dumps(self.to_dict(), ensure_ascii=False)}\n\n" diff --git a/search_agent/usage-en.md b/search_agent/usage-en.md new file mode 100644 index 0000000..7bd0f00 --- /dev/null +++ b/search_agent/usage-en.md @@ -0,0 +1,465 @@ +Enterprise AI Search Solution + +> Next-generation intelligent search Agent built on Google A2A Protocol official SDK +> Let AI understand queries, plan searches, and integrate information like a researcher, providing verifiable high-quality answers for your business + +--- + + + +### Industry Standard Protocol Support + +- Compatible with MCP / API / A2A protocol standards + - Built on official `a2a-sdk` to ensure protocol compatibility + - Seamlessly interoperable with other A2A Agents + - Verified through official A2A Inspector + - MCP follows the same principle, maintaining protocol consistency and portability + +- Future-proof protocol evolution capability + - No manual protocol implementation maintenance required + - SDK automatically adapts to protocol upgrades + - Always maintains industry standard compliance + +### Intelligent Capabilities Beyond Traditional Search + +#### 1. Deep Query Intent Understanding +No longer simple keyword matching. The Agent can: +- Understand the true intent of natural language queries +- Identify actual needs behind ambiguous expressions +- Automatically expand and optimize search keywords and retrieval angles + +#### 2. Intelligent Search Strategy Planning +Organize information collection like a professional researcher: +- Automatically decompose complex problems into multiple subtasks +- Execute multiple retrieval strategies in parallel +- Dynamically adjust search direction and depth based on intermediate results + +#### 3. Multi-source Information Integration +Obtain more comprehensive and reliable information from multiple channels: +- Web search (supports Serper API) +- News search +- Content extraction (supports Jina Reader) +- Intelligent deduplication and priority ranking + +#### 4. High-quality Answer Generation +Not simply listing results, but deliverable answers: +- Generate conclusions based on multiple sources +- Automatically add source citations for traceability and verification +- Structured Markdown output, compatible with documentation and ticketing systems +- Preserve complete source links for secondary verification + +--- + +## Enterprise-grade Performance and Reliability + +### High Performance Experience +- Asynchronous concurrent processing to reduce overall wait time +- Support for SSE streaming responses with real-time content delivery +- Configurable caching strategies to improve repeated query efficiency + +### Enterprise-grade Capabilities +- Flexible API Key management (supports request-level and environment-level configuration) +- Complete logging and monitoring support for troubleshooting and auditing +- Comprehensive error handling and exception recovery mechanisms + +--- + +## Flexible and Easy Integration Methods + +### Standard A2A Protocol Call Example +```json +{ + "jsonrpc": "2.0", + "method": "message/send", + "params": { + "message": { + "role": "user", + "parts": [{"kind": "text", "text": "your query"}] + } + } +} +``` + +## 1⃣ search — Intelligent Search + +### Function Description + +Execute **multi-iteration search**: analyze query intent, plan search strategy, retrieve information from multiple sources, generate high-quality answers, and evaluate answer quality through self-reflection to decide whether to continue iterating. + +--- + +### REST API Call + +``` +POST /api/v1/search +Content-Type: application/json +api-key: {your-api-key} +``` + +```json +{ + "query": "Who won the 2024 Nobel Prize in Physics", + "max_iterations": 3 +} +``` + +--- + +### MCP Call + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "tools/call", + "params": { + "name": "search", + "arguments": { + "query": "Who won the 2024 Nobel Prize in Physics", + "max_iterations": 3 + } + } +} +``` + +--- + +### Parameter Description + +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| query | string | ✅ | - | Search query question | +| max_iterations | integer | ❌ | 3 | Maximum iterations (1-10) | + +--- + +### Search Process + +| Phase | Module | Description | +| --- | --- | --- | +| 1 | Query Analysis | Analyze user intent, extract key entities, generate expanded queries | +| 2 | Search Planning | Plan search tasks (Web/News) based on query type | +| 3 | Search Execution | Execute multiple search tasks in parallel | +| 4 | Content Extraction | Extract core content from web pages in search results | +| 5 | Result Processing | Re-rank search results based on relevance | +| 6 | Answer Generation | Generate answers with source citations by synthesizing information | +| 7 | Self-reflection | Evaluate answer quality and decide whether to continue iterating | + +--- + +### Response Result + +```json +{ + "success": true, + "answer": { + "content": "# 2024 Nobel Prize in Physics Winners\n\nThe 2024 Nobel Prize in Physics was awarded to...\n\n---\n**References**:\n1. [Nobel Prize Official Website](https://www.nobelprize.org/)\n2. [Wikipedia](https://en.wikipedia.org/)", + "sources": [ + { + "index": 1, + "title": "Nobel Prize Official Website", + "url": "https://www.nobelprize.org/", + "relevance": "high", + "relevance_score": 0.892 + }, + { + "index": 2, + "title": "Wikipedia", + "url": "https://en.wikipedia.org/", + "relevance": "high", + "relevance_score": 0.856 + } + ], + "confidence": "high", + "all_sources": { + "high": [ + { + "index": 1, + "title": "Nobel Prize Official Website", + "url": "https://www.nobelprize.org/", + "relevance": "high", + "relevance_score": 0.892 + }, + { + "index": 2, + "title": "Wikipedia", + "url": "https://en.wikipedia.org/", + "relevance": "high", + "relevance_score": 0.856 + } + ], + "medium": [ + { + "index": 3, + "title": "Xinhua News", + "url": "https://www.xinhuanet.com/", + "relevance": "medium", + "relevance_score": 0.623 + } + ], + "low": [ + { + "index": 4, + "title": "Some Blog", + "url": "https://example.com/blog", + "relevance": "low", + "relevance_score": 0.312 + } + ] + } + }, + "statistics": { + "iterations": 1, + "total_sources_consulted": 10, + "search_queries_used": [ + "2024 Nobel Prize in Physics winner", + "Who won the 2024 Nobel Prize in Physics" + ] + } +} +``` + +--- + +### Response Field Description + +| Field | Type | Description | +| --- | --- | --- | +| success | boolean | Whether processing was successful | +| answer.content | string | Answer content in Markdown format | +| answer.sources | array | List of sources cited in the answer | +| answer.sources[].relevance | string | Source relevance level (high/medium/low) | +| answer.sources[].relevance_score | number | Source relevance score (0-1) | +| answer.confidence | string | Answer confidence level (high/medium/low) | +| answer.all_sources | object | **All search sources (grouped by relevance)** | +| answer.all_sources.high | array | High relevance sources (score >= 0.7) | +| answer.all_sources.medium | array | Medium relevance sources (0.4 <= score < 0.7) | +| answer.all_sources.low | array | Low relevance sources (score < 0.4) | +| statistics.iterations | integer | Actual number of iterations | +| statistics.total_sources_consulted | integer | Total number of sources consulted | +| statistics.search_queries_used | array | List of search queries used | + +--- + +## 2️⃣ search/stream — Streaming Search (SSE) + +### Function Description + +Execute **streaming search**, pushing progress and intermediate results in real-time during the search process. Suitable for scenarios requiring real-time feedback, such as frontend progress display. + +--- + +### REST API Call + +``` +POST /api/v1/search/stream +Content-Type: application/json +api-key: {your-api-key} +Accept: text/event-stream +``` + +```json +{ + "query": "Who won the 2024 Nobel Prize in Physics", + "max_iterations": 3 +} +``` + +--- + +### Parameter Description + +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| query | string | ✅ | - | Search query question | +| max_iterations | integer | ❌ | 3 | Maximum iterations (1-10) | + +--- + + +--- + +## 3️⃣ quick_search — Quick Search + +### Function Description + +Execute **single-iteration search**, suitable for simple questions with faster execution. Limits the number of search tasks and quickly generates answers. + +--- + +### REST API Call + +``` +POST /api/v1/quick_search +Content-Type: application/json +api-key: {your-api-key} +``` + +```json +{ + "query": "What is artificial intelligence" +} +``` + +--- + +### MCP Call + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "tools/call", + "params": { + "name": "quick_search", + "arguments": { + "query": "What is artificial intelligence" + } + } +} +``` + +--- + +### Parameter Description + +| Parameter | Type | Required | Default | Description | +| --- | --- | --- | --- | --- | +| query | string | ✅ | - | Search query question | + +--- + +### Response Result + +```json +{ + "success": true, + "answer": { + "content": "# What is Artificial Intelligence\n\nArtificial Intelligence (AI) is a broad field of computer science...\n\n---\n**References**:\n1. [IBM](https://www.ibm.com/)\n2. [Google Cloud](https://cloud.google.com/)", + "sources": [ + { + "index": 1, + "title": "IBM - Artificial Intelligence", + "url": "https://www.ibm.com/topics/artificial-intelligence", + "relevance": "high", + "relevance_score": 0.912 + }, + { + "index": 2, + "title": "Google Cloud - What is Artificial Intelligence", + "url": "https://cloud.google.com/learn/what-is-artificial-intelligence", + "relevance": "high", + "relevance_score": 0.878 + } + ], + "confidence": "high", + "all_sources": { + "high": [ + { + "index": 1, + "title": "IBM - Artificial Intelligence", + "url": "https://www.ibm.com/topics/artificial-intelligence", + "relevance": "high", + "relevance_score": 0.912 + }, + { + "index": 2, + "title": "Google Cloud - What is Artificial Intelligence", + "url": "https://cloud.google.com/learn/what-is-artificial-intelligence", + "relevance": "high", + "relevance_score": 0.878 + } + ], + "medium": [ + { + "index": 3, + "title": "Wikipedia - Artificial Intelligence", + "url": "https://en.wikipedia.org/wiki/Artificial_intelligence", + "relevance": "medium", + "relevance_score": 0.654 + } + ], + "low": [] + } + } +} +``` + +--- + +## Unified Error Format + +Success: + +```json +{ + "success": true, + "answer": {}, + "statistics": {} +} +``` + +Failure: + +```json +{ + "success": false, + "error": "Error description" +} +``` + +--- + +## Service Endpoints + +| Endpoint | Method | Description | +| --- | --- | --- | +| / | GET | Service status | +| /health | GET | Health check | +| /mcp | POST | MCP JSON-RPC | +| /mcp/sse | GET/POST | MCP SSE streaming | +| /api/v1/search | POST | Intelligent search (multi-iteration) | +| /api/v1/search/stream | POST | **Streaming search (SSE real-time push)** | +| /api/v1/quick_search | POST | Quick search (single iteration) | +| /api/v1/tools | GET | Get available tools list | + +--- + +## Authentication Methods + +API calls require passing the API Key through one of the following methods: + +1. **Request header api-key**: + ``` + api-key: your-api-key + ``` + +2. **Authorization Bearer**: + ``` + Authorization: Bearer your-api-key + ``` + +--- + +## Deployment Information + +| Configuration | Value | +| --- | --- | +| Image Name | search-agent:latest | +| Service Port | 8000 | +| Health Check | /health | + +--- + +## Environment Variables + +| Variable Name | Required | Default | Description | +| --- | --- | --- | --- | +| OPENAI_BASE_URL | ❌ | LiteLLM Gateway | LLM API base URL | +| OPENAI_API_KEY | ❌ | sk | LLM API key (can be passed via request header) | +| MODEL_NAME | ❌ | taiji/gpt-4o-mini | Model name | +| SERPER_API_KEY | ❌ | Built-in | Serper search API key | +| JINA_API_KEY | ❌ | Built-in | Jina API key | +| MAX_ITERATIONS | ❌ | 3 | Default maximum iterations | +| MAX_RESULTS_PER_QUERY | ❌ | 10 | Maximum results per query | +| CONTENT_MAX_LENGTH | ❌ | 5000 | Maximum content length |