Initial commit

This commit is contained in:
Mimikko-zeus
2026-01-07 00:17:46 +08:00
commit 4b3286f546
49 changed files with 2492 additions and 0 deletions

233
PRD.md Normal file
View File

@@ -0,0 +1,233 @@
====================
【产品目标】
====================
- 面向 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 放文件)