Files
LocalAgent/PRD.md
Mimikko-zeus 4b3286f546 Initial commit
2026-01-07 00:17:46 +08:00

233 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
====================
【产品目标】
====================
- 面向 Windows 小白用户:一句话输入
- 自动判断任务类型:
- chat普通对话如“今天天气怎么样”
- execution本地执行任务文件处理
- chat
- 直接调用 LLM 返回文本
- execution
- 生成执行计划
- 生成 Python 代码
- 安全校验
- 用户确认
- 一次性子进程执行
- 强制工作区副本目录:
workspace/input
workspace/output
workspace/logs
- MVP 明确不做:
- 联网任务(搜索 / 爬取)
- 鼠标 / 键盘自动化
- 后台常驻
- 多任务并行
- 核心安全原则:
- LLM 可以联网“思考”
- Executor执行器禁止联网“动手”
====================
【项目结构(必须严格按此生成)】
====================
LocalAgent/
main.py
requirements.txt
.env.example
ui/
chat_view.py
task_guide_view.py
llm/
client.py
prompts.py
intent/
classifier.py
labels.py
safety/
rule_checker.py
llm_reviewer.py
executor/
sandbox_runner.py
workspace/
input/
output/
logs/
====================
【统一 LLM 调用规则(非常重要)】
====================
- 所有模型(包括 qwen2.5:7b-instruct都通过同一个 API
https://api.siliconflow.cn/v1/chat/completions
- 不区分“本地 / 云端”客户端
- 区分只体现在:
- model name
- prompt
- temperature / max_tokens
.env.example 中必须包含:
LLM_API_URL=https://api.siliconflow.cn/v1/chat/completions
LLM_API_KEY=your_api_key_here
# 用于意图识别的小模型
INTENT_MODEL_NAME=qwen2.5:7b-instruct
# 用于对话 / 计划 / 代码生成的模型(可先用同一个)
GENERATION_MODEL_NAME=Pro/zai-org/GLM-4.7
====================
【llm/client.py 要求】
====================
实现统一的 LLMClient
- 使用 requests.post
- URL / API KEY 从 .env 读取
- 提供方法:
chat(
messages: list[dict],
model: str,
temperature: float,
max_tokens: int
) -> str
- payload 结构参考:
{
"model": model,
"messages": messages,
"stream": false,
"temperature": temperature,
"max_tokens": max_tokens
}
- headers:
Authorization: Bearer <API_KEY>
- 对网络异常 / 非 200 状态码做明确异常抛出
- 不要在 client 中写任何业务逻辑
====================
【意图识别(核心修改点)】
====================
实现 intent/classifier.py
- 使用“小参数 LLM”INTENT_MODEL_NAME例如 qwen2.5:7b-instruct
- 目标:二分类
- chat
- execution
- 要求输出结构化结果:
{
"label": "chat" | "execution",
"confidence": 0.0 ~ 1.0,
"reason": "中文解释,说明为什么这是执行任务/对话任务"
}
- Prompt 必须极短、强约束、可解析
- Prompt 模板放在 llm/prompts.py
- 对 LLM 输出:
- 尝试解析 JSON
- 若解析失败 / 字段缺失 → 走兜底逻辑(判为 chat
intent/labels.py
- 定义常量:
CHAT
EXECUTION
- 定义阈值:
EXECUTION_CONFIDENCE_THRESHOLD = 0.6
- 低于阈值一律判定为 chat宁可少执行不可误执行
====================
【Chat Task 流程】
====================
- 使用 GENERATION_MODEL_NAME
- messages = 用户原始输入
- 返回文本直接展示
- 不触碰本地、不产出文件
====================
【Execution Task 流程】
====================
1) 生成执行计划
- 可用 GENERATION_MODEL_NAME
- 输出中文、可读
- 明确:
- 会做什么
- 不会动原文件
- 输入 / 输出目录
- 可能失败的情况
2) 生成 Python 执行代码
- MVP 先内置“安全示例代码”:
- 遍历 workspace/input
- 复制文件到 workspace/output
- 不依赖第三方库
- 不修改原文件
- 保存为 workspace/task_<id>.py
3) safety/rule_checker.py硬规则
- 静态扫描执行代码:
- 禁止 requests / socket / urllib
- 禁止访问非 workspace 路径
- 禁止危险操作os.remove, shutil.rmtree, subprocess 等)
- 若违反,直接 fail
4) safety/llm_reviewer.py软规则
- 使用 GENERATION_MODEL_NAME
- 输入:用户需求 + 执行计划 + 代码
- 输出pass / fail + 中文原因
5) UI小白引导式方案 C
- 显示:
- 判定原因 reason
- 三步引导:
1) 把文件复制到 input
2) 我来处理
3) 去 output 取
- 执行计划
- 风险提示
- 【开始执行】按钮
6) executor/sandbox_runner.py
- 使用 subprocess 启动一次性 Python 子进程
- 工作目录限定为 workspace
- 捕获 stdout / stderr
- 写入 workspace/logs/task_<id>.log
- 执行完即退出
- 执行器层不允许任何联网能力(由 rule_checker 保证)
====================
【UITkinter最小可跑要求】
====================
- main.py 启动 Tkinter 窗口
- 顶部:输入框 + 发送按钮
- 中部:输出区
- 当识别为 execution
- 切换或弹出 task_guide_view
- 执行完成后展示:
- success / partial / failed
- 成功 / 失败数量
- 日志路径
====================
【requirements.txt最小集
====================
- python-dotenv
- requests
====================
【最小可跑验收标准】
====================
- 未配置 LLM_KEY 时给出明确错误提示
- 输入“今天天气怎么样” → chat
- 输入“把这个文件夹里的图片复制一份” → execution
- execution 能生成 task_<id>.py 并真正执行
- output / logs 中有真实文件
====================
【Plan 模式输出要求】
====================
1) 先输出整体实现计划(步骤、模块职责)
2) 列出所有文件及其责任说明
3) 再按文件路径逐个输出代码内容
4) 确保 main.py 可直接运行
5) main.py 顶部注释说明:
- 如何配置 .env
- 如何运行
- 如何测试(往 input 放文件)