|
|
vor 1 Monat | |
|---|---|---|
| .. | ||
| README_gemini_agent.md | vor 1 Monat | |
| __init__.py | vor 1 Monat | |
| baidu_search_agent.py | vor 1 Monat | |
| gemini_basic_agent.py | vor 1 Monat | |
| test-skill.md | vor 1 Monat | |
| test-tools.md | vor 1 Monat | |
| test-tools.py | vor 1 Monat | |
| tools_examples.py | vor 1 Monat | |
消息历史丢失
name 字段agent/runner.py:417name: tool_name 字段到 tool 消息架构设计不当
agent/llm/providers/gemini.py 模块SDK 兼容性问题
google-generativeai SDK 对参数格式要求严格,与 OpenAI JSON Schema 不兼容httpx)代替 SDK文件:agent/llm/providers/gemini.py
特性:
httpx 直接调用 Gemini REST APIsystemInstructionfunctionCall / functionResponse关键实现:
def _convert_messages_to_gemini(messages):
"""OpenAI -> Gemini 格式转换"""
# 1. system -> systemInstruction
# 2. assistant + tool_calls -> model + functionCall
# 3. tool -> user + functionResponse
# 4. 合并连续的 user 消息
...
def _convert_tools_to_gemini(tools):
"""工具定义转换,清理不支持的字段(default)"""
...
from agent.llm.providers.gemini import create_gemini_llm_call
from agent.runner import AgentRunner
# 创建 LLM 调用函数
gemini_llm_call = create_gemini_llm_call()
# 创建 Agent
runner = AgentRunner(
tool_registry=registry,
llm_call=gemini_llm_call
)
# 运行
async for event in runner.run(
task="你的任务",
model="gemini-2.5-pro",
tools=["tool1", "tool2"],
system_prompt="系统提示"
):
# 处理事件
...
任务:"北京今天的天气怎么样?顺便帮我计算一下 15 * 8 等于多少。"
执行流程:
1. [Gemini HTTP] Converted 1 messages: ['user']
→ 调用工具: get_current_weather, calculate
2. [Gemini HTTP] Converted 3 messages: ['user', 'model', 'user']
→ 生成答案: "北京今天天气晴朗,15摄氏度。15 * 8 的计算结果是 120。"
✓ Trace 完成
总 Tokens: 643
结果:✅ 完美运行,没有重复调用,正确结束
examples/
└── gemini_basic_agent.py # 包含所有逻辑
├── 工具定义
├── Gemini SDK 调用
└── Agent 运行
问题:
agent/
├── llm/
│ └── providers/
│ └── gemini.py # HTTP API 封装
├── tools/
│ └── registry.py # 工具注册
└── runner.py # Agent 运行器
examples/
└── gemini_basic_agent.py # 简洁的示例代码
├── 工具定义
└── 使用 agent.llm.providers
优势:
pip install httpx python-dotenv
# 如果有代理
pip install 'httpx[socks]'
# .env
GEMINI_API_KEY=your_api_key_here
/Users/sunlit/Code/Resonote/llm/providers/gemini.py可以扩展支持更多 LLM provider:
每个 provider 只需实现相同的接口:
async def llm_call(messages, model, tools, **kwargs) -> Dict