Agent Runner

提供商抽象层、工具编排与 LLM 路由引擎

概述

Agent Runner 是 Hermes Agent 的核心执行层,负责提供商抽象、会话循环管理、工具编排以及请求路由到相应的大语言模型后端。该层设计为提供商无关的架构,可在不同 LLM 服务之间无缝切换。

Runner 采用"消息输入、函数调用输出"的模型,用户消息触发持续的推理、工具调用和响应生成循环,直至任务完成。

提供商架构

所有 LLM 提供商均实现统一的 BaseAdapter 接口,确保不同后端之间的行为一致性。每个适配器处理提供商特定的 API 格式、响应解析和错误处理。

# 提供商抽象流程 ┌─────────────────────────────────────────┐ │ AgentRunner │ │ ┌───────────────────────────────────┐ │ │ │ ProviderManager │ │ │ │ ┌─────────────────────────────┐ │ │ │ │ │ LLM Router │ │ │ │ │ │ ┌─────────────────────────┐ │ │ │ │ │ │ │ OpenAI Adapter │ │ │ │ │ │ │ │ Anthropic Adapter │ │ │ │ │ │ │ │ Gemini Adapter │ │ │ │ │ │ │ │ MiniMax Adapter │ │ │ │ │ │ │ │ GLM Adapter │ │ │ │ │ │ │ │ Ollama Adapter │ │ │ │ │ │ │ └─────────────────────────┘ │ │ │ │ │ └─────────────────────────────┘ │ │ │ └───────────────────────────────────┘ │ └─────────────────────────────────────────┘

支持的提供商

OpenAI
GPT-4, GPT-4 Turbo, GPT-3.5 Turbo
Anthropic
Claude 3.5 Sonnet, Claude 3 Opus
Gemini
Gemini 1.5 Pro, Gemini 1.5 Flash
MiniMax
MiniMax-Text-01, MiniMax-V01
GLM
GLM-4, GLM-4V, GLM-3
Ollama
本地模型 (Llama, Mistral 等)

适配器文件

每个提供商在 astrbot/core/model_providers/ 目录下都有对应的适配器文件:

🐙 openai_adapter.py
🧠 anthropic_adapter.py
gemini_native_adapter.py
🔵 minimax_adapter.py
🔶 glm_adapter.py
🐳 ollama_adapter.py

基础适配器接口

class BaseAdapter(ABC):
    async def chat(messages, tools, model):
        """Send chat request to provider"""
        pass

    async def vision(image_url, prompt):
        """Handle image understanding"""
        pass

    async def count_tokens(text, model):
        """Count tokens for context management"""
        pass

    def parse_response(response):
        """Parse provider-specific response"""
        pass

工具编排

# Tool execution flow
user_message
    ↓
LLM generates function_call
    ↓
ToolRegistry.find_tool(name)
    ↓
Tool.execute(arguments)
    ↓
Result fed back to LLM
    ↓
Final response

LLM 路由逻辑

ProviderManager 根据以下条件选择合适的适配器:

def route_request(model_name, task_type):
    if model_name.startswith("gpt"):
        return OpenAIAdapter()
    elif model_name.startswith("claude"):
        return AnthropicAdapter()
    elif model_name.startswith("gemini"):
        return GeminiAdapter()
    # ... other providers

会话循环

# 完整的会话执行循环 ┌─────────────────────────────────────────┐ │ 1. 接收用户消息 │ │ ↓ │ │ 2. 加载对话历史 │ │ ↓ │ │ 3. 构建系统提示词 + 上下文 │ │ ↓ │ │ 4. 发送到 LLM(通过适配器) │ │ ↓ │ │ 5. 接收响应 / function_call │ │ ↓ │ │ ┌─── 是否为 function_call? ────┐ │ │ │ 是 │ 否 │ │ ↓ ↓ │ │ 6a. 执行工具 6b. 返回 │ │ 7a. 存储结果 响应 │ │ 8a. 返回步骤 4 ──────────────┘