rtw-ollama-agent
在LangChain+Ollama+MCP上运行的本地Plan-and-Execute代理。
正如“Reinventing The Wheel”之名,它不使用现有的代理框架,而是自行实施计划、执行、重放循环。
______________________________________________________________________
特徴
- 完全本地执行 —通过Ollama在本地移动模型(默认值:
qwen2.5:7b) - 计划和执行 —LLM将任务分解为编号步骤,然后依次执行
- 自动回复 -如果步骤失败或未完成的步骤仍然存在,请在继续完成的同时重新制定计划
- 路由器 —通过关键字判定将问候、闲谈直接分配给Chat路径,仅将需要工具的任务分配给Agent路径
- 输入固定器 —自动修改小型模型产生幻觉的工具名称、参数名称和转义字符,然后调用
- 护栏 —Watchdog(重复失败检测)、语言保护(日语强制)、超时(
EXEC_TIMEOUT),模板名称将采用不同的格式 - 计量 —每次会话后,TCA/ArgFit/StepCR
metrics.jsonl记录到 - MCP工具 —在容器中启动6种工具服务器
- 模块结构 —按职责分割文件,以纯函数为中心完善单体测试
______________________________________________________________________
体系结构
┌─────────────────────────────────────────────────────────┐
│ executor.py run() │
│ ├── _quick_classify() / classify_intent() ← Router │
│ ├── planner.py make_plan() │
│ │ └── gather_current_state() │
│ └── exec_loop.py run_exec_loop() │
│ ├── _fix_tool_name() ← Tool Name Fixer │
│ ├── _fix_args() ← Arg Fixer │
│ ├── _fix_content() ← Content Fixer │
│ ├── _invoke_tool() │
│ ├── _build_watchdog_hint() ← Watchdog │
│ └── planner.py _apply_replan() │
└─────────────────────────────────────────────────────────┘文件配置
app/
├── main.py # エントリポイント (argparse + asyncio.run)
├── executor.py # Router → plan → exec の接続
├── exec_loop.py # 実行ループ + Input Fixer + Watchdog + メトリクス
├── planner.py # LLM による計画生成・リプラン・状態収集
├── models.py # Step dataclass / parse_steps / format_checklist
├── prompts.py # 各フェーズのプロンプトテンプレート
├── utils.py # MetricsLogger / setup_logging / ヘルパー関数
├── config.py # 定数 (MAX_STEPS, EXEC_TIMEOUT など)
├── llm.py # Ollama クライアント + モデル別設定
├── servers/ # MCP サーバー設定
└── tests/ # 単体テスト (pytest)______________________________________________________________________
MCP工具
工具|用途| |---|---| 文件读写(/data/ 以下) | 执行命令(/workspace, /data) | 网页搜索+获取页面 在当前日期获取(JST) | sqlite | SQLite DB 操作 (/data/agent.db) | |memory|键值格式的注释持久化|
______________________________________________________________________
护栏
| 机能 | 说明 |
|---|
在别名表+difflib中修改幻觉工具名称 错误的参数名(cmd→command 等)根据方案进行修改 |内容修复器| write_file 的,之 \n 将文字转换为实际换行符(防止SyntaxError) 如果同一工具失败两次以上,则在重放时注入提示 | Language Guard | SYSTEM_PROMPTで日本语出力を强制| \\uEXEC_TIMEOUT \\uEXEC_TIMEOUT \\uEXEC_TIMEOUT asyncio.wait_for 剪切(默认值300秒)
______________________________________________________________________
计量
每次会话结束时 /app/logs/metrics.jsonl 对较大场景进行渲染期间已观察到该故障。
| 指标 | 说明 |
|---|
总体拥有成本-在旋转期间调用工具的百分比 在不修改参数的情况下匹配方案的工具调用百分比 步骤完成速率-在所有步骤中完成的百分比
______________________________________________________________________
安装,安装
前提: 已安装Docker/Docker Compose
git clone https://github.com/stanaka1110/rtw-ollama-agent.git
cd rtw-ollama-agent
# コンテナをビルド・起動 (初回は Ollama モデルのダウンロードに時間がかかります)
docker compose up -dollama 服务 healthcheck 通过的话可以使用代理。
docker compose ps______________________________________________________________________
用法
项目根目录 agent 通过脚本执行。
chmod +x agent # 初回のみ
./agent "ToDoリストに「買い物」を追加して"
./agent "現在時刻を教えて"
./agent "hello world を出力する Python を書いて実行して"
./agent "agent.db に users テーブルを作って3件のサンプルデータを挿入して"______________________________________________________________________
修改模型
docker-compose.yml 中所述修改相应参数的值。
environment:
- OLLAMA_MODEL=qwen2.5:7b # 任意の Ollama モデル更改后 docker compose up -d 重新启动交互渲染。
支持的型号(llm.py ),模板名称将采用不同的格式
|模型|尺寸|特征| |---|---|---| | qwen2.5:7b |7B|基线(默认)| | qwen2.5:14b | 14B |泛用| | llama3.1:8b | 8B | Meta泛用| | llama3.2:3b | 3B | 軽量 | | mistral:7b | 7B |泛用| | gemma3:4b \[4B\]笔记本电脑通用 | gemma3:9b | 9B | Google泛用| | phi4 | 14B | STEM・论理推论| | lfm2.5-thinking | 1.2B |超軽量・推论特化| | qwen3:30b-a3b 30B(MoE)|高效率旗舰| | deepseek-r1:14b | 14B |蒸留版・推论特化|
上述以外的模型为默认设置(temperature=0.0, num_ctx=4096)来定义自定义外观。
______________________________________________________________________
测试
单体测试
docker exec langchain_app python -m pytest tests/ -v|测试文件|对象| |---|---| | test_models.py | parse_steps / format_checklist | | test_utils.py | _sanitize / _task_message / _tool_descriptions | | test_planner.py | gather_current_state / _apply_replan | | test_exec_loop.py | _invoke_tool / _update_step |
模型比较测试
按顺序运行多个模型以比较结果和度量。
./test_models.sh结果是 test_results/YYYYMMDD_HHMMSS/ 保存如下:。
文件内容 |---|---| | model_test_results.txt 每个模型任务的结果和所需时间 | metrics_snapshot.jsonl 这次的生度量 | *_task*.stderr.log 每个模型/任务的详细日志
