基于 **Python + asyncio** 的模块化 AI Agent 框架,支持多 Provider、动态路由、流式响应和工具确认机制。
Project description
MindBot
English | 中文
基于 Python + asyncio 的模块化 AI Agent 框架,支持多 Provider、动态路由、流式响应和工具确认机制。
特性
| 特性 | 说明 |
|---|---|
| 统一入口 | AgentOrchestrator 自主决策,无需预选模式 |
| 流式响应 | 实时事件流,用户可看到 Agent 思考过程 |
| 工具确认 | 多级安全确认机制(安全级别、白名单、危险工具检测) |
| 智能路由 | 根据内容类型/复杂度/关键词自动选择模型 |
| 多 Provider | OpenAI / Ollama / Transformers / llama.cpp |
| 可中断执行 | 用户可随时中止 Agent 运行 |
| 记忆系统 | 短期/长期记忆,向量检索,自动归档 |
| Skills 机制 | SKILL.md 技能包按需注入 prompt,默认摘要、命中后展开正文 |
| 上下文管理 | Token 预算管理,自动压缩 |
| 多通道支持 | CLI、HTTP、飞书、Telegram |
| 对话追踪 | Tracer 记录完整对话日志 |
运行环境要求
| 要求 | 版本 |
|---|---|
| Python | >= 3.10 |
| asyncio | 内置 |
安装
git clone https://github.com/SyJarvis/mindbot.git
cd mindbot
pip install -e .
快速开始
1. 配置 LLM
本地 Ollama(推荐)
ollama pull qwen3
云服务
export OPENAI_API_KEY=your-api-key
# 或
export MOONSHOT_API_KEY=your-api-key
2. 初始化配置
mindbot generate-config
这会创建 ~/.mindbot/settings.json 和 ~/.mindbot/SYSTEM.md。
3. 编辑配置
~/.mindbot/settings.json(JSONC 格式,支持注释和尾随逗号):
{
// Provider 实例 - 支持多账号、负载均衡
"providers": {
// 本地 Ollama 实例
"local-ollama": {
"type": "ollama",
"strategy": "round-robin",
"endpoints": [
{
"base_url": "http://localhost:11434",
"weight": 1,
"models": [
{ "id": "qwen3", "role": "chat", "level": "medium", "vision": false },
{ "id": "qwen3-vl:8b", "role": "chat", "level": "high", "vision": true }
]
}
]
},
// Moonshot(OpenAI 兼容)
"moonshot": {
"type": "openai",
"strategy": "priority",
"endpoints": [
{
"base_url": "https://api.moonshot.cn/v1",
"api_key": "{env:MOONSHOT_API_KEY}",
"weight": 1,
"models": [
{ "id": "kimi-k2.5", "role": "chat", "level": "high", "vision": true }
]
}
]
}
},
// 默认模型: "instance_name/model_id"
"agent": {
"model": "local-ollama/qwen3",
"temperature": 0.7,
"max_tokens": 8192,
"max_tool_iterations": 20
},
// 动态路由
"routing": {
"auto": true,
"rules": [
{ "keywords": ["代码", "code", "编程"], "level": "high", "priority": 10 },
{ "keywords": ["你好", "简单"], "level": "low", "priority": 5 }
]
},
// 记忆配置
"memory": {
"storage_path": "~/.mindbot/data/memory.db",
"markdown_path": "~/.mindbot/data/memory",
"short_term_retention_days": 7
},
// Prompt-layer skills
"skills": {
"enabled": true,
"skill_dirs": [],
"always_include": ["mindbot-self-knowledge"],
"max_visible": 8,
"max_detail_load": 2,
"trigger_mode": "metadata-match"
},
// 上下文配置
"context": {
"max_tokens": 8000,
"compression": "truncate",
"blocks": {
"skills_overview": 640,
"skills_detail": 1200
}
},
// 会话记录
"session_journal": {
"enabled": true,
"path": "~/.mindbot/data/journal"
},
// 多模态配置
"multimodal": {
"max_images": 10,
"max_file_size_mb": 20.0
},
// 通道配置
"channels": {
"http": { "enabled": false, "host": "0.0.0.0", "port": 31211 },
"cli": { "enabled": false },
"feishu": { "enabled": false, "app_id": "", "app_secret": "" },
"telegram": { "enabled": false, "token": "" }
}
}
注意:YAML 配置格式已弃用,请使用 JSON/JSONC 格式。可使用
mindbot config migrate迁移旧配置。
3.1 Skills 机制
- 内置 skill 位于
mindbot/skills/<skill-name>/SKILL.md - 用户自定义 skill 位于
~/.mindbot/skills/<skill-name>/SKILL.md - 每轮对话默认只向模型暴露 skill 摘要
- 当用户问题命中 skill metadata 时,MindBot 才会把对应
SKILL.md正文注入 prompt - skill 负责知识、流程和约束提示;tool 仍负责真实动作执行
4. 验证配置
mindbot config validate
5. 基本使用
import asyncio
from mindbot import MindBot
async def main():
bot = MindBot()
# 简单对话
response = await bot.chat(
"你好,请介绍一下自己",
session_id="user123",
)
print(response.content)
# 带工具事件回调
response = await bot.chat(
"帮我计算 25 * 37",
session_id="user123",
on_event=lambda e: print(f"[{e.type}] {e.data}"),
)
print(response.content)
asyncio.run(main())
CLI 命令
mindbot <command> [options]
Commands:
generate-config 初始化默认配置(别名: onboard)
serve 启动服务(多通道)
shell 进入交互式 shell
chat 发送单条消息
status 显示状态
config show 显示当前配置
config validate 验证配置
config migrate 将 YAML 配置迁移到 JSON
Options:
-c, --config <path> 配置文件路径
-v, --verbose 详细日志模式
-h, --help 显示帮助
--version 显示版本
交互式 Shell 命令
在 mindbot shell 中支持以下 slash 命令:
| 命令 | 说明 |
|---|---|
/model |
列出可用模型 |
/model <name> |
切换模型(如 /model local-ollama/qwen3) |
/status |
显示当前状态 |
/help |
显示帮助 |
exit, quit, bye |
退出 shell |
Examples
示例代码位于 examples/,建议直接运行文件:
python examples/01_simple_chat.py
| 示例 | 说明 |
|---|---|
01_simple_chat.py |
单轮对话 |
02_multi_turn.py |
多轮会话与 session_id |
03_streaming.py |
流式输出 |
04_event_callbacks.py |
事件回调 |
05_system_prompt.py |
系统提示词 |
06_tool_approval.py |
工具审批 |
07_multi_agent.py |
多 Agent 编排 |
08_config_from_code.py |
纯代码配置 |
09_tool_whitelist.py |
工具白名单 |
10_child_agent.py |
子 Agent |
11_tool_example.py |
@tool 工具定义 |
架构
分层文档入口:docs/architecture/layers/README.md
统一执行流图(ASCII):
UserInput
|
v
[L1 Interface/Transport]
channels/* + bus/* + cli/*
|
v
[L2 Application/Orchestration]
MindBot.chat() -> Agent/MindAgent -> Scheduler.assemble()
|
v
[L3 Conversation Domain]
context manager/models/compression
|
v
[L5 Provider Adapters]
providers/* (LLM inference)
|
+--> if tool_calls --> [L2 Approval] --> [L4 Capability Tool Executor]
| capability/backends/tooling/*
v
[L2 Commit]
Scheduler.commit() + memory append
|
v
AssistantResponse
核心模块
| 模块 | 路径 | 说明 |
|---|---|---|
| Bot | bot.py |
对外主入口 |
| Agent | agent/ |
核心执行引擎 |
| Provider | providers/ |
LLM 提供商抽象 |
| Routing | routing/ |
智能模型路由 |
| Context | context/ |
上下文管理 |
| Memory | memory/ |
记忆系统 |
| Capability Tooling | capability/backends/tooling/ |
工具注册与执行 |
| Channels | channels/ |
多通道支持 |
| Config | config/ |
配置管理(JSON/JSONC) |
| Session | session/ |
会话日志与类型 |
Agent 子系统
| 组件 | 文件 | 说明 |
|---|---|---|
MindBot |
bot.py |
用户侧统一 API |
MindAgent |
agent/core.py |
Supervisor(主 Agent + 子 Agent 管理) |
Agent |
agent/agent.py |
基础会话执行单元 |
AgentOrchestrator |
agent/orchestrator.py |
LLM + tool loop 编排 |
Scheduler |
agent/scheduler.py |
assemble/commit 回合消息 |
StreamingExecutor |
agent/streaming.py |
流式与带工具调用执行 |
ApprovalManager |
agent/approval.py |
工具审批与白名单 |
智能路由
路由优先级
- 媒体规则 - 包含图片 → 选择 vision 模型
- 关键词规则 - 按优先级匹配用户输入
- 复杂度评分 - 自动分析文本特征
- 默认模型 -
agent.model配置
配置示例
{
"routing": {
"auto": true,
"rules": [
{ "keywords": ["代码", "code", "函数"], "level": "high", "priority": 10 },
{ "keywords": ["天气", "time"], "level": "low", "priority": 5 }
]
},
"providers": {
"deepseek": {
"type": "openai",
"endpoints": [{
"base_url": "https://api.deepseek.com/v1",
"api_key": "{env:DEEPSEEK_API_KEY}",
"models": [
{ "id": "deepseek-chat", "level": "medium" },
{ "id": "deepseek-reasoner", "level": "high" }
]
}]
}
}
}
工具确认机制
安全级别
| 级别 | 说明 |
|---|---|
DENY |
所有工具被拒绝 |
ALLOWLIST |
白名单工具自动批准,其他根据 ask 参数 |
FULL |
所有工具可访问,根据 ask 参数决定 |
确认模式
| 模式 | 说明 |
|---|---|
OFF |
从不请求确认 |
ON_MISS |
白名单外请求确认 |
ALWAYS |
总是请求确认 |
配置示例
{
"agent": {
"approval": {
"security": "allowlist",
"ask": "on_miss",
"timeout": 300,
"whitelist": {
"calculator": [".*"],
"search": [".*"]
},
"dangerous_tools": [
"delete_file",
"shell",
"execute_command"
]
}
}
}
LLM Provider
模型格式
instance_name/model_id(如 local-ollama/qwen3、moonshot/kimi-k2.5)
环境变量替换
配置中可以使用 {env:VAR_NAME} 语法引用环境变量:
{
"api_key": "{env:OPENAI_API_KEY}"
}
Ollama(本地)
{
"providers": {
"local-ollama": {
"type": "ollama",
"endpoints": [{
"base_url": "http://localhost:11434",
"models": [
{ "id": "qwen3", "role": "chat", "level": "medium" }
]
}]
}
}
}
OpenAI / 兼容服务
{
"providers": {
"openai": {
"type": "openai",
"endpoints": [{
"base_url": "https://api.openai.com/v1",
"api_key": "{env:OPENAI_API_KEY}",
"models": [
{ "id": "gpt-4", "role": "chat", "level": "high", "vision": true }
]
}]
},
"deepseek": {
"type": "openai",
"endpoints": [{
"base_url": "https://api.deepseek.com/v1",
"api_key": "{env:DEEPSEEK_API_KEY}",
"models": [
{ "id": "deepseek-chat", "role": "chat", "level": "high" }
]
}]
}
}
}
多端点配置(负载均衡/故障转移)
{
"providers": {
"moonshot": {
"type": "openai",
"strategy": "round-robin",
"endpoints": [
{
"base_url": "https://api.moonshot.cn/v1",
"api_key": "{env:MOONSHOT_KEY_1}",
"weight": 2,
"models": [{ "id": "kimi-k2.5", "level": "high" }]
},
{
"base_url": "https://api.moonshot.cn/v1",
"api_key": "{env:MOONSHOT_KEY_2}",
"weight": 1,
"models": [{ "id": "kimi-k2.5", "level": "high" }]
}
]
}
}
}
数据目录
~/.mindbot/
├── settings.json # 用户配置(JSON/JSONC)
├── SYSTEM.md # 系统提示词
├── skills/ # 自定义技能
├── memory/ # Markdown 记忆存储
├── history/ # CLI 历史记录
├── data/
│ ├── memory.db # 记忆数据库
│ └── journal/ # 会话记录
├── logs/ # 日志文件
└── sessions/ # 会话存储
项目结构
mindbot/
├── src/mindbot/
│ ├── bot.py # 对外主入口 MindBot
│ ├── agent/ # Agent 编排与执行
│ ├── context/ # 上下文与消息模型
│ ├── memory/ # 记忆系统
│ ├── capability/ # 能力层(含 tooling backend)
│ ├── providers/ # LLM 提供商适配
│ ├── routing/ # 模型路由
│ ├── channels/ # CLI / HTTP / Feishu / Telegram
│ ├── bus/ # 消息总线
│ ├── session/ # 会话存储与类型
│ ├── generation/ # 动态工具生成
│ ├── builders/ # 构建器
│ ├── multimodal/ # 多模态支持
│ ├── cron/ # 定时任务
│ ├── config/ # 配置模型与加载(JSON/JSONC)
│ └── cli/ # CLI 命令实现
├── docs/ # 文档
├── tests/ # 测试
├── examples/ # 示例代码
└── pyproject.toml # 项目配置
通道配置
飞书
{
"channels": {
"feishu": {
"enabled": true,
"app_id": "cli_xxx",
"app_secret": "xxx",
"encrypt_key": "xxx",
"verification_token": "xxx"
}
}
}
飞书通道支持原生附件发送。出站消息中:
content会渲染为飞书卡片消息media可以放本地文件路径列表,通道会先上传再发送原生image或file消息
from mindbot.agent.models import AgentResponse
from mindbot.bus import OUTBOUND_MESSAGE_METADATA_KEY
response = AgentResponse(
content="报告已生成",
metadata={
OUTBOUND_MESSAGE_METADATA_KEY: {
"media": ["/tmp/report.pdf"],
}
},
)
HTTP
{
"channels": {
"http": {
"enabled": true,
"host": "0.0.0.0",
"port": 31211
}
}
}
Telegram
{
"channels": {
"telegram": {
"enabled": true,
"token": "{env:TELEGRAM_BOT_TOKEN}"
}
}
}
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mindbot-0.3.0.tar.gz.
File metadata
- Download URL: mindbot-0.3.0.tar.gz
- Upload date:
- Size: 251.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.0 CPython/3.13.11 Darwin/25.2.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d2cf19501cc9538c7da31e06ba9b6168ae7bf12c4b5a04924999eb363e812ec
|
|
| MD5 |
d1aecc8a61a7ddb5471d765423ce1853
|
|
| BLAKE2b-256 |
6c86f3672a85364fa02fcdf5415120d41e52fd7dc73fde016e46f6ea814b2338
|
File details
Details for the file mindbot-0.3.0-py3-none-any.whl.
File metadata
- Download URL: mindbot-0.3.0-py3-none-any.whl
- Upload date:
- Size: 319.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.0 CPython/3.13.11 Darwin/25.2.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96fcabb4130020c8d8c76a66d83ce60e6347f8c006548552264b841dc92e205f
|
|
| MD5 |
7d303461d3c8a7f8fd198f64caec7c1a
|
|
| BLAKE2b-256 |
df488fee190919e35444627540c61a56cb449c4858bc471ae1e184b8dafaa65c
|