返回市场
胡萝卜AI

胡萝卜AI

作者:Xingsandesu72 星标更新:2025-05-10

项目介绍

CarrotAI

<div align="center"> <img src="public/icon.png" alt="CarrotAI Logo" width="200"/> <h3>支持多服务器流传输及多语言的AI代理</h3> <p>Flutter 前端 + FastAPI 后端</p> </div> <p align="center"> 🚀 <a href="https://chat.jintongshu.com/">现在在线体验</a> | <a href="https://jintongshu.com/download/">SaaS 客户端下载</a> </p> <p align="center"> 🇨🇳 <a href="README_zh.md">阅读中文文档</a> </p>

🥕 介绍

CarrotAI 是一款前沿的AI代理应用程序,通过服务器发送事件(SSE)和可流式传输的HTTP提供实时聊天,并内置了模型控制协议(MCP)集成。它支持同时连接多个SSE MCP服务器,并提供了英文、中文和日语的用户界面。

🚀 特性

  • AI代理:由SSE和MCP适配器驱动的实时聊天,提供无缝的对话体验。
  • 多服务器支持:同时连接并调用多个SSE MCP服务器以聚合智能响应。
  • 多语言:完全本地化为英文、中文和日语。
  • 深度思考模式:针对复杂或多步骤查询的高级分析。
  • 认证:使用JWT令牌的安全登录/注册流程。
  • 响应式UI:适用于移动设备、桌面和Web平台的自适应设计。
  • 主题定制:轻/暗模式,自定义种子颜色,以及通过dynamic_color实现的动态Material 3主题。
  • 文件上传:在对话中附加和解析文件以丰富上下文。

🤖 支持的模型API

  • DeepSeek:具有强大推理能力的先进语言模型

🛠️ 技术栈

前端

  • 框架:Flutter
  • 状态管理:Provider
  • UI:Material Design 3
  • 本地化:flutter gen-l10n
  • 主题:dynamic_color

后端

  • 框架:FastAPI
  • 流传输:服务器发送事件(SSE)
  • AI集成:DeepSeek LLM,MCP(模型控制协议)
  • 数据库:PostgreSQL + SQLAlchemy
  • 认证:JSON Web Tokens
  • 迁移:Alembic
  • 部署:Uvicorn & Gunicorn

📋 先决条件

  • Flutter SDK ^3.7.2
  • Python >=3.12
  • PostgreSQL

⚡ 快速开始

请确保已安装。uv

# 克隆仓库
git clone https://github.com/Xingsandesu/CarrotAI.git && cd CarrotAI

# 处理环境变量
mv backend/.env.example backend/.env && mv .env.example .env

# 编辑环境变量
vim .env
vim backend/.env

# 临时启动PostgreSQL
docker-compose -f docker-compose.yml -f docker-compose.override.yml up -d postgres

# 后端设置
uv run backend/scripts/startup.py --user --email <email> --username <name> --password <password>

# 停止PostgreSQL
docker-compose -f docker-compose.yml -f docker-compose.override.yml down

# 处理配置
vim config/

# 运行后端
docker compose up -d

🔧 安装

后端设置

  1. 导航到后端目录:
    cd backend
    
  2. 创建并激活虚拟环境:
    uv sync
    
  3. 复制示例环境文件:
    cp .env.example .env
    
  4. 应用数据库迁移:
    uv run scripts/init_db.py && uv run scripts/init_config.py
    
  5. 运行服务器:
    python main.py       # 开发模式
    python main.py prod  # 生产模式,使用Gunicorn
    

前端设置

  1. 返回项目根目录:
    cd ..
    
  2. 获取Flutter依赖项:
    flutter pub get
    
  3. 生成本地化文件:
    flutter gen-l10n
    
  4. 启动应用:
    flutter run
    
  5. 构建Web:
    flutter build web --wasm
    

🌐 配置

  • 前端:编辑lib/core/config/app_config.dart以设置API端点和主题默认值。
  • 后端:配置.envbackend/app/core/config.py以设置数据库和MCP服务器。

后端配置文件

后端使用位于backend/config/的JSON文件来定义模型、MCP服务器和自定义适配器。以下是默认文件夹结构:

backend/config/
├── model_configs.json       # LLM模型定义和元数据
├── mcp_servers.json         # SSE MCP服务器端点和环境设置
└── app/                     # 自定义适配器定义
    └── duckduckgo-search.json

model_configs.json

定义CarrotAI可用的LLM模型。每个条目包括:

  • id(字符串):唯一模型标识符。
  • icon(字符串):用于显示的图标名称。
  • translations(对象):本地化的名称和描述(zhenja)。
  • exclusiveRules(对象):功能开关和排除规则。

示例:

[
  {
    "id": "deepseek",
    "icon": "smart_toy_outlined",
    "translations": {
      "zh": { "name": "DeepSeek", "description": "专注于深度思考和复杂推理的满血模型" },
      "en": { "name": "DeepSeek", "description": "Powerful Chinese large model focused on deep thinking and complex reasoning" },
      "ja": { "name": "DeepSeek", "description": "深い思考と複雑な推論に特化した強力な中国語大規模モデル" }
    },
    "exclusiveRules": {
      "deepThinking": { "enabled": true, "excludes": ["mcpServices"] },
      "mcpServices": { "enabled": true, "excludes": ["deepThinking"] }
    }
  }
]

mcp_servers.json

指定SSE模型控制协议(MCP)端点。格式:

  • 键:服务名称。
  • url(字符串):SSE端点URL。
  • env(对象):适配器的环境变量。

示例:

{
  "serviceA": {
    "url": "http://localhost:10000/sse",
    "env": {
      "API_KEY": "your_api_key"
    }
  }
}

自定义适配器(app/*.json

将自定义MCP适配器放置在backend/config/app/下。每个文件定义:

  • id(字符串):适配器标识符。
  • icon(字符串):表情符号或图标名称。
  • mcpServer(对象):与mcp_servers.json中的条目相同结构。
  • translations(对象):本地化的UI元数据。

示例(duckduckgo-search.json):

{
  "id": "duckduckgo-search",
  "icon": "🔍",
  "mcpServer": {
    "url": "http://localhost:10000/duckduckgo-search",
    "env": {}
  },
  "transportType": "sse",
  "translations": {
    "en": { "name": "DuckDuckGo Search", "type": "Search Tool", "description": "Use DuckDuckGo search engine for secure and private web searches" },
    "zh": { "name": "DuckDuckGo搜索", "type": "搜索工具", "description": "使用DuckDuckGo搜索引擎进行安全、私密的网络搜索" },
    "ja": { "name": "DuckDuckGo検索", "type": "検索ツール", "description": "DuckDuckGo検索エンジンを使用して安全でプライベートなウェブ検索を行います" }
  }
}

使用方法

  1. 初始化默认配置:
    uv run scripts/init_config.py
    
  2. 修改backend/config/下的JSON文件以添加或更新模型和端点。
  3. 重启后端服务器以应用更改。

🔧 环境变量

后端(.env)

描述默认值
DATABASE_URLPostgreSQL连接URL必需
BACKEND_CORS_ORIGINS允许的CORS源(逗号分隔)[]
MCP_SERVERSJSON格式的SSE MCP服务器端点列表必需
SECRET_KEYJWT密钥必需

前端(lib/core/config/app_config.dart)

static String get baseUrl => "http://127.0.0.1:8000";

💡 使用方法

  1. 按照快速开始指南启动后端和前端。
  2. 在浏览器或移动模拟器中打开应用。
  3. 注册或登录以获取JWT令牌。
  4. 使用深度思考模式或默认聊天模式与AI代理互动。
  5. 在设置中切换MCP服务器或添加新的端点。

🔗 API参考

访问交互式的Swagger UI:

http://127.0.0.1:8000/docs

🛣️ 发展路线图

  • SSE多服务器支持
  • 多语言(EN,中文,日本语)
  • Docker Compose设置
  • 可流式传输的HTTP支持
  • 本地Stdio多服务器支持
  • 本地OCR支持
  • 支持更多上传接口格式
  • 前端自定义提示
  • 更多模型支持
  • 更多语言支持

🛡️ 安全

  • 认证:所有后端端点均使用JWT进行保护;令牌安全存储在加密存储中。
  • 数据保护:生产中使用HTTPS;通过.env中的BACKEND_CORS_ORIGINS配置允许的CORS源。
  • 密钥管理:在.env中定义SECRET_KEY;确保没有密钥提交到源代码控制。

🔍 监控与日志

  • 服务器日志:在gunicorn.conf.py中配置;访问和错误日志在logs/中。
  • 应用日志:使用Loguru进行结构化日志记录;前端在发布模式下禁用debugPrint

🚀 性能与优化

  • 缓存:前端缓存静态资源;后端使用异步连接池处理PostgreSQL。
  • 捆绑大小:使用--wasm构建Web工件以优化交付。

🗂️ 更新日志

所有显著变更记录在CHANGELOG.md中。

📱 屏幕截图

<div align="center"> <img src="images/home.png" width="280"/> <img src="images/shop.png" width="280"/> <img src="images/env.png" width="280"/> <img src="images/chat.png" width="280"/> <img src="images/myapps.png" width="280"/> <img src="images/settings.png" width="280"/> </div>

🤝 贡献

欢迎贡献!请打开带有建议的Pull Request。

📄 许可证

本项目根据CarrotAI开源许可证授权。详情见LICENSE文件。 </中文翻译>