# my-chat-agent **Repository Path**: lsq2025/my-chat-agent ## Basic Information - **Project Name**: my-chat-agent - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-03 - **Last Updated**: 2026-05-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Pegasus Chat Agent 轻量级智能对话 Agent 服务,支持多 LLM Provider 降级重试、多模态图片识别、分布式会话管理。 > **部署环境**: cloud1 (120.77.206.206) > **容器端口**: 30085:8000 > **核心特性**: 3阶段主循环 + 5 Provider 降级 + Redis Session + SSE 流式输出 --- ## 目录 - [核心特性](#核心特性) - [架构设计](#架构设计) - [项目结构](#项目结构) - [安装配置](#安装配置) - [LLM Provider 配置](#llm-provider-配置) - [API 接口](#api-接口) - [工具系统](#工具系统) - [会话管理](#会话管理) - [Docker 部署](#docker-部署) - [与 v1/v2 对比](#与-v1v2-对比) - [License](#license) --- ## 核心特性 ### 🔄 3阶段主循环 简化架构,告别复杂的6阶段流程: ``` THINKING → EXECUTING → ANSWERING → COMPLETE ``` | 阶段 | 功能 | 说明 | |------|------|------| | THINKING | 分析推理 | 流式调用 LLM,累积 tool_calls | | EXECUTING | 工具执行 | 执行本地/远程工具,获取结果 | | ANSWERING | 生成回答 | 流式输出,打字机效果 | | COMPLETE | 完成返回 | 返回最终结果和数据来源 | ### 🎯 多 Provider 降级重试 配置 5 个 LLM Provider,自动降级切换: | Priority | Provider | Model | 说明 | |----------|----------|-------|------| | 0 | aliyun | qwen3.6-plus | 最高优先级 | | 1 | doubao | doubao-seed-1-6-flash-250615 | 火山引擎豆包 | | 2 | gemini_lite | gemini-3.1-flash-lite-preview | Gemini Lite | | 3 | gemini_flash | gemini-3-flash-preview | Gemini Flash | **降级规则**: - 首选 Priority 1 Provider - 失败后自动切换下一 Provider - 每个 Provider 可配置重试次数和延迟 - 可重试错误码:429、500、502、503、504、timeout、connection ### 🖼️ 多模态图片识别 支持两种图片输入方式: - **Base64**: 直接传输图片数据(推荐,避免跨境下载超时) - **URL**: 图片链接地址 支持格式:JPEG、PNG、GIF、WebP ### 📡 SSE 流式输出 Server-Sent Events 实时推送: ``` event: thinking data: {"phase":"thinking","type":"status","content":"Analyzing..."} event: executing data: {"phase":"executing","type":"status","content":"Fetching data...", "metadata":{"tools":["get_weather"]}} event: answering data: {"phase":"answering","type":"delta","content":"南京"} event: answering data: {"phase":"answering","type":"delta","content":"当前"} event: complete data: {"phase":"complete","type":"final","content":"南京当前天气:晴...", "metadata":{"sources":[{"tool":"get_weather","summary":"..."}]}} ``` ### 🔧 合并工具管理器 远程工具 + 本地工具合并执行: | 类型 | 来源 | 工具 | |------|------|------| | **本地工具** | tools/local.py | get_weather (wttr.in)、get_current_time | ### 💾 Redis 分布式会话 完整的分布式会话管理: - **分布式锁**: 防止并发冲突 - **TTL 自动清理**: 会话过期自动删除 - **用户隔离**: `session:{agent_id}:{user_id}:{session_id}` - **序列管理**: 自动生成会话序号 - **Token 裁剪**: 超限自动裁剪历史消息 - **请求幂等**: request_id 防重复请求 --- ## 架构设计 ### 系统架构图 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ Pegasus Chat Agent 轻量版) │ │ 约 1,500 行代码 │ └─────────────────────────────────────────────────────────────────────────────┘ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Flutter │ │ FastAPI │ │ Agent │ │ Fallback │ │ 前端 │────▶│ API │────▶│ 核心 │────▶│ LLM │ │ │ │ (SSE) │ │ (3阶段循环) │ │ (5 Provider) │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ │ SSE 流 │ │ │ ▼ ▼ ▼ ▼ 用户界面 路由/数据模型 主循环/事件 降级重试/流式 打字机效果 SSE 推送 工具调用 tool_calls ``` ### 模块依赖关系 ``` ┌──────────────┐ │ main.py │ │ CLI 入口 │ └──────────────┘ │ ▼ ┌──────────────┐ │ server.py │ │ FastAPI入口 │ └──────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────────────────┐ │ api/ │ │ ┌────────────────────┐ ┌────────────────────┐ │ │ │ routes/assistant.py │ │ routes/session.py │ │ │ │ • POST /chat │ │ • 会话管理 │ │ │ │ • GET /health │ │ • 序列查询 │ │ │ │ • SSE Streaming │ │ │ │ │ └────────────────────┘ └────────────────────┘ │ │ ┌────────────────────┐ ┌────────────────────┐ │ │ │ schemas/assistant │ │ schemas/session │ │ │ │ • ChatRequest │ │ • 请求/响应模型 │ │ │ │ • EventResponse │ │ │ │ │ └────────────────────┘ └────────────────────┘ │ └──────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────────────────┐ │ agent/ │ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │ │ │ agent.py │ │ events.py │ │ context.py │ │ │ │ • 主循环 │ │ • Event │ │ • AgentContext│ │ │ │ • run() │ │ • Phase │ │ │ │ │ │ • 多模态 │ │ • EventType │ │ │ │ │ └────────────────┘ └────────────────┘ └────────────────┘ │ └──────────────────────────────────────────────────────────────────────────────┘ │ │ │ ▼ ▼ ▼ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ llm/ │ │ tools/ │ │ session/ │ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ ┌──────────────┐ │ │ │fallback_client│ │ │ │ combined.py │ │ │ │ redis_manager │ │ │ │ • 5 Provider │ │ │ │ • 远程+本地 │ │ │ │ • 分布式锁 │ │ │ │ │ • 降级重试 │ │ │ │ │ │ │ │ • TTL │ │ │ │ │ • 流式dict │ │ │ │ │ │ │ │ • 幂等性 │ │ │ │ ├──────────────┤ │ │ ├──────────────┤ │ │ └──────────────┘ │ │ │ openai.py │ │ │ │ remote.py │ │ │ └──────────────┘ │ │ │ gemini.py │ │ │ │ local.py │ │ │ │ │ │ claude.py │ │ │ └──────────────┘ │ │ │ │ │ doubao.py │ │ │ │ │ │ │ └──────────────┘ │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────────────────┐ │ 外部依赖 │ │ ┌────────────────┐ ┌────────────────────┐ ┌────────────────────┐ │ │ │ doubao API │ │ pufferfish-server │ │ Redis │ │ │ │ gemini API │ │ /tools/specs │ │ 端口 30071 │ │ │ │ claude API │ │ /tools/execute │ │ 密码已配置 │ │ │ └────────────────┘ └────────────────────┘ └────────────────────┘ │ └──────────────────────────────────────────────────────────────────────────────┘ ``` ### 主循环流程 ``` 用户输入: "帮我查一下南京的天气" │ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 1. THINKING 阶段(流式推理) │ │ │ │ stream_iter = llm.chat_completion_stream(messages, tools, tool_choice) │ │ async for chunk_data in stream_iter: │ │ if "tool_calls" in chunk_data: │ │ tool_calls_accumulated.extend(chunk_data["tool_calls"]) │ │ if content: │ │ yield Event(phase="answering", type="delta", content=content) │ │ │ │ 优化:基础对话只需 1 次流式调用(节省 ~50% 时间) │ └─────────────────────────────────────────────────────────────────────────────┘ │ ├─── 有 tool_calls ────┐ │ │ ▼ ▼ ┌─────────────────┐ ┌─────────────────────────────────────────────────────┐ │ 直接回复 │ │ 2. EXECUTING 阶段 │ │ │ │ │ │ yield Event( │ │ results = tools.execute_tools(tool_calls) │ │ phase=ANSWERING│ │ │ │ ) │ │ 区分本地工具和远程工具: │ │ │ │ • get_weather → LocalToolManager │ │ │ │ • 其他 → pufferfish-server │ └─────────────────┘ └─────────────────────────────────────────────────────┘ │ │ │ ▼ │ ┌─────────────────────────────────────────────────────┐ │ │ 3. ANSWERING 阶段(第二次流式调用) │ │ │ │ │ │ messages.append(tool_results) │ │ │ stream_iter = llm.chat_completion_stream( │ │ │ messages, tools=None │ │ │ ) │ │ │ async for delta in stream_iter: │ │ │ yield Event(phase="answering", delta=delta) │ │ └─────────────────────────────────────────────────────┘ │ │ └ │ ▼ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 4. COMPLETE 阶段 │ │ │ │ yield Event( │ │ phase=Phase.COMPLETE, │ │ type=EventType.FINAL, │ │ content=full_text, │ │ metadata={"sources": [{"tool": "get_weather", "summary": "..."}]} │ │ ) │ │ │ │ 更新会话历史:session.add_assistant_message(full_text) │ │ 保存会话:sessions.save_session(session) │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## 项目结构 ``` pegasus-chat-agent/ ├── agent/ # Agent 核心模块 │ ├── __init__.py # 导出 create_agent │ ├── agent.py # 主循环 (THINKING → EXECUTING → ANSWERING) │ ├── events.py # Event, Phase, EventType │ └── context.py # AgentContext(可选) │ ├── api/ # API 层 │ ├── __init__.py │ ├── routes/ │ │ ├── __init__.py │ │ ├── assistant.py # POST /chat, GET /health (SSE) │ │ └── session.py # 会话管理 API │ └── schemas/ │ │ ├── __init__.py │ │ ├── assistant.py # ChatRequest, EventResponse │ │ └── session.py # SessionResponse │ ├── llm/ # LLM 客户端 │ ├── __init__.py # create_llm_client 工厂 │ ├── openai.py # OpenAI 客户端 │ ├── gemini.py # Gemini 客户端 │ ├── claude.py # Claude 客户端 │ ├── doubao.py # 豆包客户端(火山引擎) │ └── fallback_client.py # 多 Provider 降级重试 │ ├── tools/ # 工具系统 │ ├── __init__.py │ ├── combined.py # 合并工具管理器(远程+本地) │ ├── remote.py # pufferfish 远程工具 │ └── local.py # 本地工具(天气、时间) │ ├── session/ # 会话管理 │ ├── __init__.py │ ├── manager.py # Session 基类 │ └── redis_manager.py # Redis 分布式会话 │ ├── utils/ # 工具函数 │ ├── __init__.py │ ├── logger.py # 日志配置 │ └── time_resolver.py # 时间解析 │ ├── workspace/ # 工作目录(文件会话存储) ├── logs/ # 日志目录 │ ├── main.py # CLI 入口 ├── server.py # FastAPI 服务入口 ├── requirements.txt # Python 依赖 ├── Dockerfile # Docker 构建文件 ├── docker-compose.yml # Docker Compose 配置(5 Provider) ├── .env # 环境变量配置 ├── switch_provider.sh # Provider 切换脚本 ├── ARCHITECTURE.md # 架构文档 ├── DOCKER.md # Docker 文档 └── README.md # 本文档 ``` --- ## 安装配置 ### 安装依赖 ```bash pip install -r requirements.txt ``` 依赖列表: ``` fastapi>=0.100.0 # API 框架 uvicorn>=0.23.0 # ASGI 服务器 httpx>=0.24.0 # HTTP 客户端 redis>=4.5.0 # Redis 客户端 pytz>=2023.3 # 时区支持 python-dotenv>=1.0.0 # 环境变量 ``` ### 环境配置 创建 `.env` 文件: ```env # ========== LLM Provider 配置 ========== # Provider 优先级列表(逗号分隔) LLM_PROVIDERS=doubao,gemini_lite,gemini_flash,claude_key1,claude_key2 # 全局重试配置 LLM_MAX_RETRIES=2 LLM_RETRY_DELAY=1.0 # ========== Provider 1: 豆包(最高优先级) ========== PROVIDER_doubao_TYPE=doubao PROVIDER_doubao_MODEL=doubao-seed-1-6-flash-250615 PROVIDER_doubao_API_KEY=your-doubao-api-key PROVIDER_doubao_BASE_URL=https://ark.cn-beijing.volces.com/api/v3 PROVIDER_doubao_PRIORITY=1 PROVIDER_doubao_MAX_RETRIES=2 PROVIDER_doubao_RETRY_DELAY=1 # ========== Provider 2-5: Gemini / Claude ========== # ... 其他 Provider 配置 ... # ========== 其他配置 ========== # pufferfish 远程工具服务 PUFFERFISH_URL=https://admin.qqvu.org/api SERVICE_TOKEN=your-service-token # Redis 配置 REDIS_HOST=172.17.0.1 REDIS_PORT=30071 REDIS_PASSWORD=your-password REDIS_DB=0 # 会话配置 SESSION_STORAGE=redis SESSION_TTL=86400 SESSION_LOCK_TTL=30 SESSION_MAX_MESSAGES=100 SESSION_MAX_TOKENS=10000 REQUEST_CACHE_TTL=3600 # 日志配置 LOG_LEVEL=DEBUG LOG_DIR=./logs LOG_CONSOLE=true LOG_FILE=true # 服务配置 PORT=8000 ``` --- ## LLM Provider 配置 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ FallbackLLMClient 降级流程 │ └─────────────────────────────────────────────────────────────────────────────┘ 请求到达 │ ▼ ┌─────────────────┐ │ Provider 1 │ │ doubao │ │ Priority=1 │ └─────────────────┘ │ ├─── 成功 ──────────────────────▶ 返回结果 │ ├─── 失败 (429/500/timeout) ────┐ │ │ │ 重试 MAX_RETRIES 次 │ │ │ ├─── 重试耗尽 ──────────────────┤ │ │ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ Provider 2 │ │ Provider 3 │ │ gemini_lite │ │ gemini_flash │ │ Priority=2 │ │ Priority=3 │ └─────────────────┘ └─────────────────┘ │ │ ├─── 成功 ──────▶ 返回 ├─── 成功 ──────▶ 返回 │ │ ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ Provider 4 │ │ Provider 5 │ │ claude_key1 │ │ claude_key2 │ └─────────────────┘ └─────────────────┘ │ │ ├─── 成功 ──────▶ 返回 ├─── 成功 ──────▶ 返回 │ │ ▼ ▼ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 所有 Provider 失败 │ │ │ │ 返回: "Sorry, all AI services are currently busy. Please try again later." │ └─────────────────────────────────────────────────────────────────────────────┘ ``` ### 配置示例 **单 Provider(简单模式):** ```env LLM_PROVIDER=openai LLM_MODEL=gpt-4.1-mini LLM_API_KEY=your-key LLM_BASE_URL=https://api.openai.com/v1 ``` **多 Provider(降级模式):** ```env LLM_PROVIDERS=doubao,gemini,claude PROVIDER_doubao_TYPE=doubao PROVIDER_doubao_MODEL=doubao-seed-1-6-flash-250615 PROVIDER_doubao_API_KEY=key1 PROVIDER_doubao_PRIORITY=1 PROVIDER_gemini_TYPE=gemini PROVIDER_gemini_MODEL=gemini-3-flash-preview PROVIDER_gemini_API_KEY=key2 PROVIDER_gemini_PRIORITY=2 PROVIDER_claude_TYPE=claude PROVIDER_claude_MODEL=claude-opus-4-6 PROVIDER_claude_API_KEY=key3 PROVIDER_claude_PRIORITY=3 ``` --- ## API 接口 ### POST /internal/v1/assistant/chat 聊天接口,SSE 流式输出。 **请求体:** ```json { "message": "帮我查一下南京的天气", "user_id": "12345", "session_id": "session-001", "agent_id": "default-assistant", "request_id": "req-uuid-123", "metadata": { "timezone": "Asia/Shanghai" }, "input_info": { "attachments": [ { "type": "image", "url": "https://example.com/image.jpg", "data": "base64-data", "mime_type": "image/jpeg" } ] } } ``` **响应(SSE):** ``` event: thinking data: {"phase":"thinking","type":"status","content":"Analyzing..."} event: executing data: {"phase":"executing","type":"status","content":"Fetching data...", "metadata":{"tools":["get_weather"]}} event: answering data: {"phase":"answering","type":"delta","content":"南京"} event: answering data: {"phase":"answering","type":"delta","content":"当前"} event: complete data: {"phase":"complete","type":"final","content":"南京当前天气:晴...", "metadata":{"sources":[{"tool":"get_weather","summary":"..."}]}} ``` ### GET /internal/v1/assistant/health 健康检查接口。 **响应:** ```json { "status": "ok", "service": "pegasus-chat-agent-v3", "redis": { "status": "ok", "redis_connected": true, "used_memory_human": "1.2M" } } ``` ### Session API | 接口 | 说明 | |------|------| | `GET /internal/v1/session/list` | 用户会话列表 | | `POST /internal/v1/session/create` | 创建新会话 | | `GET /internal/v1/session/messages` | 获取会话消息 | | `DELETE /internal/v1/session` | 删除会话 | --- ## 工具系统 ### 合并工具管理器 ```python class CombinedToolManager: """合并远程工具和本地工具""" async def get_tools(self) -> List[Dict]: # 1. 获取远程工具(pufferfish) remote_tools = await self.remote.get_tools() # 2. 获取本地工具 local_tools = self.local.get_tool_specs() # 3. 合并返回 return remote_tools + local_tools async def execute_tools(self, tool_calls): # 区分执行 for tc in tool_calls: if tc.name in LOCAL_TOOL_NAMES: # 本地执行 result = await self.local.execute(tc.name, tc.args) else: # 远程执行 result = await self.remote.execute_tools(tc) ``` ### 本地工具 | 工具 | 说明 | API | |------|------|-----| | `get_weather` | 查询天气 | wttr.in(免费无需 API Key) | | `get_current_time` | 查询时间 | pytz(本地) | **get_weather 参数:** ```json { "city": "南京", "format": "now" // now(实时)或 3d(3天预报) } ``` **get_current_time 参数:** ```json { "timezone": "Asia/Shanghai" // 时区名称 } ``` ### 远程工具 通过 pufferfish-server 动态获取: | 接口 | 说明 | |------|------| | `GET /tools/specs` | 获取工具清单 | | `POST /tools/execute` | 执行工具调用 | **支持的远程工具(示例):** - 查询数据库 - 发送消息 - 搜索知识库 - 业务定制工具 --- ## 会话管理 ### Redis 会话管理器 **Key 结构:** ``` session:{agent_id}:{user_id}:{session_id} # 会话数据 lock:session:{agent_id}:{user_id}:{session_id} # 分布式锁 user_sessions:{agent_id}:{user_id} # 用户会话集合 agent_sessions:{agent_id} # Agent 会话集合 request_status:{request_id} # 请求状态 request_result:{request_id} # 请求结果缓存 user_session_seq:{user_id} # 会话序号 user_last_session:{agent_id}:{user_id} # 最近会话 ``` **核心功能:** | 功能 | 方法 | 说明 | |------|------|------| | 分布式锁 | `acquire_lock`, `release_lock` | 防止并发冲突 | | 会话获取 | `get_or_create` | 获取或创建会话 | | 会话保存 | `save_session` | TTL + Token 裁剪 | | 会话删除 | `delete_session` | 删除会话 | | 会话列表 | `list_sessions`, `list_sessions_detail` | 用户会话列表 | | 序列管理 | `get_next_sequence`, `create_next_session` | 自动序号 | | 幂等检查 | `check_request_idempotent` | request_id 防重复 | | 健康检查 | `health_check` | Redis 连接状态 | ### Token 裁剪机制 ```python # 配置 SESSION_MAX_TOKENS = 10000 # 自动裁剪 if session.token_count > max_tokens: session.messages = trim_messages(session.messages, max_tokens) ``` ### 幂等性保证 ```python # 请求幂等检查 cached = session_manager.check_request_idempotent(request_id) if cached: # 返回缓存结果 return cached["events"] # 标记处理中 session_manager.mark_request_processing(request_id) # 处理完成后缓存 session_manager.cache_request_result(request_id, events) ``` --- ## Docker 部署 ### Dockerfile ```dockerfile FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD ["python", "server.py"] ``` ### docker-compose.yml ```yaml services: my-agent: build: context: . dockerfile: Dockerfile container_name: my-chat-agent ports: - "30085:8000" environment: # 5 Provider 配置 - LLM_PROVIDERS=doubao,gemini_lite,gemini_flash,claude_key1,claude_key2 - LLM_MAX_RETRIES=2 - LLM_RETRY_DELAY=1.0 # Provider 1-5 配置(见上文) # ... # Redis 配置 - REDIS_HOST=172.17.0.1 - REDIS_PORT=30071 - REDIS_PASSWORD=${REDIS_PASSWORD} # 会话配置 - SESSION_STORAGE=redis - SESSION_TTL=86400 # 其他 - PUFFERFISH_URL=https://admin.qqvu.org/api - SERVICE_TOKEN=${SERVICE_TOKEN} volumes: - ./workspace:/app/workspace - ./logs:/app/logs restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/internal/v1/assistant/health"] interval: 30s timeout: 10s retries: 3 ``` ### 启动命令 ```bash # 构建并启动 docker-compose up -d --build # 查看日志 docker-compose logs -f my-agent # 健康检查 curl http://localhost:30085/internal/v1/assistant/health # 停止 docker-compose down ``` ### Provider 切换脚本 ```bash # switch_provider.sh 使用示例 bash switch_provider.sh gemini # 切换到 Gemini bash switch_provider.sh claude # 切换到 Claude bash switch_provider.sh doubao # 切换到豆包 ``` --- ## 与 v1/v2 对比 ### 架构对比 | 维度 | v1/v2(复杂版) | v3(轻量版) | |------|----------------|-------------| | **主循环阶段** | 6 阶段 | 3 阶段 | | | UNDERSTAND → PLAN → ACT | THINKING → EXECUTING → ANSWERING | | | → OBSERVE → REFLECT → RESPOND | → COMPLETE | | **代码量** | ~7,000 行 | ~1,500 行 | | **LLM Provider** | 单一 Provider | 5 Provider 降级 | | **会话管理** | 内存/文件 | Redis 分布式 | | **工具管理** | 本地硬编码 | 远程 + 本地合并 | | **API** | 无 | FastAPI + SSE | | **Docker** | 无 | docker-compose | ### 功能对比 | 功能 | v1/v2 | v3 | |------|-------|-----| | Reflect 智能判断 | ✅ | ❌(简化) | | 任务类型区分 | ✅ S2 | ❌(LLM 自动判断) | | 无效循环检测 | ✅ | ❌(降级切换) | | 多模态图片 | ❌ | ✅ | | 分布式会话 | ❌ | ✅ Redis | | 请求幂等 | ❌ | ✅ | | SSE 流式 | ❌ | ✅ | | Docker 部署 | ❌ | ✅ | ### 设计原则 ``` v1/v2(复杂版): - 规则代替 LLM 判断 - 硬编码城市列表 - 本地工具注册 - 无 API 层 v3(轻量版): ✅ LLM 自动判断意图 ✅ 无硬编码 ✅ 远程工具动态获取 ✅ FastAPI + SSE ✅ 多 Provider 降级 ✅ Redis 分布式会话 ✅ Docker 部署 ``` --- ## License MIT License --- ## 作者 LANSHANQUAN © 2026 --- ## 版本发布 采用月末发布策略,每月最后一个工作日发布新版本。 ### 当前版本 | 版本号 | 发布日期 | |--------|----------| | 2026.04 | 2026-04-29 | ### 版本历史 | 版本 | 发布日期 | 主要更新 | |------|----------|----------| | 2026.04 | 2026-04-29 | 多 Provider 降级(6 Provider)、时区支持、工具调用、Redis 分布式会话 |