# qwen-agent **Repository Path**: mingwuda/qwen-agent ## Basic Information - **Project Name**: qwen-agent - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-03-29 - **Last Updated**: 2026-04-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Local Qwen Agent Console 本项目的目标是在本机搭建一套可用的本地 Agent 工作台,基于本地 Qwen GGUF 模型提供聊天、任务执行、技能路由、Memory 和记决策过程展示能力。 ## Quick Start ### One Command ```bash /Users/defanchuanmei/codes/agent/start_qwen.sh ``` 默认会启动: - `MODEL_PROVIDER=llama_cpp` 时,本地模型服务:`http://127.0.0.1:8000` - `MODEL_PROVIDER=lmstudio` 时,项目只启动 UI,并连接 `LM Studio` 默认地址:`http://127.0.0.1:1234` - `MODEL_PROVIDER=ollama` 时,项目只启动 UI,并连接本地 `Ollama` 默认地址:`http://127.0.0.1:11434` - 本地 Agent UI:`http://127.0.0.1:7860` ### Restart Service ```bash /Users/defanchuanmei/codes/agent/restart_qwen.sh ``` 切到 `LM Studio` 时可以这样启动: ```bash MODEL_PROVIDER=lmstudio LMSTUDIO_BASE_URL=http://127.0.0.1:1234 /Users/defanchuanmei/codes/agent/start_qwen.sh ``` 切到 `Ollama` 时可以这样启动: ```bash MODEL_PROVIDER=ollama OLLAMA_BASE_URL=http://127.0.0.1:11434 OLLAMA_MODEL=qwen3.5:latest /Users/defanchuanmei/codes/agent/start_qwen.sh ``` ### Manual Start 先启动模型服务: ```bash GGML_METAL_DEVICES='' ~/python/bin/python -m llama_cpp.server \ --model /Users/defanchuanmei/models/qwen3.5-4b/Qwen3.5-4B-Q4_K_M.gguf \ --host 127.0.0.1 \ --port 8000 \ --n_ctx 1024 \ --n_gpu_layers 0 \ --offload_kqv false ``` 再启动 Agent UI: ```bash cd /Users/defanchuanmei/codes/agent ~/python/bin/python -m uvicorn qwen_chat_ui:app --host 127.0.0.1 --port 7860 ``` 如果用 `LM Studio`,只需要先在 `LM Studio` 里打开本地服务器,然后启动 UI: ```bash cd /Users/defanchuanmei/codes/agent DEFAULT_MODEL_PROVIDER=lmstudio LMSTUDIO_BASE_URL=http://127.0.0.1:1234 ~/python/bin/python -m uvicorn qwen_chat_ui:app --host 127.0.0.1 --port 7860 ``` 如果用 `Ollama`,先启动本地 Ollama 服务并确认模型可用,再启动 UI: ```bash cd /Users/defanchuanmei/codes/agent DEFAULT_MODEL_PROVIDER=ollama OLLAMA_BASE_URL=http://127.0.0.1:11434 OLLAMA_MODEL=qwen3.5:latest ~/python/bin/python -m uvicorn qwen_chat_ui:app --host 127.0.0.1 --port 7860 ``` ### Open in Browser - Agent UI: [http://127.0.0.1:7860](http://127.0.0.1:7860) - Model API: [http://127.0.0.1:8000](http://127.0.0.1:8000) ## Architecture ``` ┌─────────────────────────────────────────────────────────────────┐ │ Agent Console UI │ │ (agent_console_template.html) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Chat UI │ │ Skills/ │ │ Decision │ │ │ │ │ │ Intents/ │ │ Trace │ │ │ │ │ │ Memory │ │ Panel │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ └─────────┼────────────────┼────────────────┼───────────────────┘ │ │ │ ▼ ▼ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Qwen Chat UI Service │ │ (qwen_chat_ui.py) │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Intent Router │ │ Skill Runner │ │ Memory Mgr │ │ │ │ - LLM-based │ │ - coding │ │ - write │ │ │ │ - Keyword │ │ - weather │ │ - recall │ │ │ │ - Fallback │ │ - web_search │ │ - summarize │ │ │ └──────┬───────┘ │ - general │ └──────────────┘ │ │ │ │ - shell │ │ │ │ │ - plugin │ │ │ │ └──────┬───────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────────────────────────────────────┐ │ │ │ ReAct Workflow │ │ │ │ Reasoning → Acting → Observation → Final │ │ │ └──────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Local Model Service │ │ (llama_cpp.server) │ │ http://127.0.0.1:8000 │ │ │ │ ┌─────────────────┐ ┌─────────────────────────┐ │ │ │ Qwen3.5-4B │ │ Tavily Search API │ │ │ │ (GGUF Model) │ │ (Web Search) │ │ │ └─────────────────┘ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` ## Project Goals - 提供一个可本地运行的 Agent 控制台 - 支持 ReAct 工作流 - `Reasoning -> Acting -> Observation -> Final Answer` - 支持基于意图识别的技能调用 - 支持 Memory 管理 - 支持插件化扩展 skill 和 intent - 提供可视化界面,方便调试和管理 ## Completed So Far ### Local Model Infrastructure - 已重建 `~/python` 为 Python 3.11 虚拟环境 - 已安装 `llama-cpp-python` - 已接入两个本地 GGUF 模型 - `Qwen3.5-4B-Q4_K_M.gguf` - `Qwen3.5-9B-Q4_K_M.gguf` ### Local Services - 本地模型服务运行在 `127.0.0.1:8000` - 本地 Agent UI 运行在 `127.0.0.1:7860` ### Chat and Agent UI - 聊天界面已支持流式输出 - 已支持多轮上下文控制 - 已支持 `System Prompt` - 已支持模型下拉切换 - 已支持展示 ReAct 决策轨迹 - 已支持 Skills / Intents / Memory / Settings 面板 ### Agent Capabilities - 已支持 LLM 意图路由 + 关键词意图路由 - 当前内置技能包括 - `coding` - `weather` - `web_search` (基于 Tavily Search API) - `memory_write` - `memory_recall` - `general` - 已支持 Skills / Intents / Memory 的基础管理能力 ### Plugin System - 已支持插件目录自动扫描 - 当前插件目录支持以下文件 - `skill.json` - `intent.json` - `plugin.json` (支持多 skill / 多 intent) - `SKILL.md` (OpenClaw 最小兼容) - `README.md` - `handler.py` - 已支持扫描以下 OpenClaw skill 目录 - `agent_plugins/*/SKILL.md` - `agent_skills/*/SKILL.md` - 已支持插件热重载 - 已支持插件代码执行 - 已支持更细的权限模型 - 已支持 OpenClaw skill 最小兼容 - 解析 `SKILL.md` frontmatter - 自动映射为内部 skill - 可自动生成默认 intent - 可由模型规划受限 shell 动作并执行 - 已提供正式插件 SDK - [PLUGIN_SDK.md](PLUGIN_SDK.md) - [agent_plugin_sdk.py](agent_plugin_sdk.py) ### Codebase Structure Improvements - 已将内置技能从主服务文件拆分到独立模块 - [agent_skills/coding.py](agent_skills/coding.py) - [agent_skills/weather.py](agent_skills/weather.py) - [agent_skills/web_search.py](agent_skills/web_search.py) - [agent_skills/memory.py](agent_skills/memory.py) - [agent_skills/shell.py](agent_skills/shell.py) ### Docs and Scripts - 已提供本地使用说明 - [LOCAL_QWEN_SETUP.md](LOCAL_QWEN_SETUP.md) - 已提供一键启动脚本 - [start_qwen.sh](start_qwen.sh) - 已提供重启服务脚本 - [restart_qwen.sh](restart_qwen.sh) ## Key Fixes Already Landed ### Coding Skill - `coding` 请求已区分为两类 - `generate` - `workspace` - 代码生成不再错误走工作区扫描 - 代码生成已改为使用 `chat/completions` - 已减少 ``、提示词碎片和异常补全文本 - Java 冒泡排序这类请求已经可以返回正常代码 ### Weather Skill - 已修复 `今天深圳天气怎么样` 被错误解析成 `今天深圳` 的问题 - 现在会优先抽取实际城市名,例如 `深圳` - 天气描述已翻译成中文 - 已支持 20+ 种天气描述的中文映射 ### General Skill - `general` 普通问答已统一使用 `chat/completions` API - 提供更符合对话场景的回答体验 ### Web Search Skill - 已接入 Tavily Search API,提供真实搜索能力 - 返回结构化搜索结果 - 支持 AI 生成的简要回答 ### Intent Routing - 已添加 LLM 意图识别功能 - 优先使用大模型理解用户意图 - 支持置信度评估 - 回退到关键词匹配 ### Agent Console UI - 决策面板已增强显示功能 - 当前步骤高亮 - 成功/失败状态色 ### Plugin System - 已支持更细的权限模型 - `save_state`: 保存状态权限 - `recall_memory`: 回忆记忆权限 - `run_command`: 运行命令权限 - `make_requests`: 发送 HTTP 请求权限 - 已支持多 skill / 多 intent 插件结构 (plugin.json) - 已支持 OpenClaw `SKILL.md` 最小兼容 - 通过 frontmatter 的 `name`、`description`、`patterns`、`priority` 建立 skill / intent - 通过 `metadata` 中声明的 `requires.bins` 约束可执行二进制 - 当前通用执行器首版支持受限 `shell` 工具 - 目前仍属于最小兼容,不等同于完整 OpenClaw runtime ### OpenClaw Skill Notes - 推荐最小 frontmatter 示例 ```md --- name: weather description: Get current weather and forecasts (no API key required). patterns: 天气,weather,天气预报,预报,气温 priority: 55 metadata: {"clawdbot":{"requires":{"bins":["curl"]}}} --- ``` - 当前兼容层的设计目标是“统一 skill 加载和受限动作执行”,不是逐个技能硬编码执行器 - 如果 skill 需要调用命令,建议在 `metadata` 里明确声明可用二进制,例如 `curl`、`rg` - 如果存在同名内置 skill 与 OpenClaw skill,当前会按相同 `key` 合并,后加载的 OpenClaw skill 会覆盖内置 skill - 如果希望并存,建议给 OpenClaw skill 使用不同的 `key` 或 `name` ## Next Steps ### 1. 记忆系统增强 - 添加记忆摘要功能,自动压缩历史信息 - 支持记忆分类和标签 - 添加记忆过期策略 ### 2. 插件向导 - 提供可视化的插件创建界面 - 简化插件开发流程 ### 3. 调试工具 - 添加更详细的日志面板 - 支持请求重放 - 添加性能分析 ### 4. 前端 UI 优化 - 添加快捷键支持 - 优化移动端体验 - 添加主题切换 ### 5. 代码质量 - 添加单元测试 - 完善错误处理 - 性能优化 ## Main Entry Points - 主服务: [qwen_chat_ui.py](qwen_chat_ui.py) - UI 模板: [agent_console_template.html](agent_console_template.html) - 插件 SDK: [agent_plugin_sdk.py](agent_plugin_sdk.py) - 插件文档: [PLUGIN_SDK.md](PLUGIN_SDK.md)