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

5.8 KiB
Raw Blame History

==================== 【产品目标】

  • 面向 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 调用规则(非常重要)】

.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_.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_.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_.py 并真正执行
  • output / logs 中有真实文件

==================== 【Plan 模式输出要求】

  1. 先输出整体实现计划(步骤、模块职责)
  2. 列出所有文件及其责任说明
  3. 再按文件路径逐个输出代码内容
  4. 确保 main.py 可直接运行
  5. main.py 顶部注释说明:
    • 如何配置 .env
    • 如何运行
    • 如何测试(往 input 放文件)