使用Codex模仿shell_gpt

Agent的出现,导致每次任务的token消耗量都特别的大,所以Cursor我也不再订阅了,使用Claude-Code和Codex进行平时的开发。

之前用OpenAI的codex进行项目开发,发现效果非常一般,但是GPT-5出来之后,改变了我的看法。

我的目标是用Rust写一个shell_gpt,这是生成的结果 https://github.com/xuzhougeng/sgpt-rs ,确实完成了我的需求,大概就说了如下一些话

  1. 阅读 shellgpt 项目,我计划使用Rust对该项目进行重构,请制定一个项目规划
  2. 仅支持原生 JSON 工具 ; termimad(更终端友好); 自行 reqwest 保持更灵活; 然后将规划写到Plan.md中
  3. 请继续搭建 Rust 项目骨架(目录结构与最小 main/CLI 参数)
  4. yes proceed with handler routing + config loader next
  5. start on the reqwest-based LLM streaming client?
  6. before you start, let me give your a basic information; API_BASE_URL=https://api.deepseek.com OPENAI_API_KEY=sk- DEFAULT_MODEL=deepseek-chat ; you should set this to env and use for following test; plase go on toto wire the client into the Default and Chat handlers next, using a simple text printer and START/STOP streaming ;
  7. implement ChatSession persistence and use it in --chat/–repl next
  8. first add usage into readme
  9. Plan.md 根据进度表,我们现在是到了哪一步,下一步做什么?
  10. 需要的!
  11. 先把 --show-chat 做成更易读的格式, 开始开始接通 Shell/Code/Describe
  12. 我觉得需要接入termimad了
  13. 需要
  14. 需要
  15. shell模式不太行,是不是还不能执行命令?
  16. Plan.md 根据计划,我们现在到了哪一步?
    1. 接入 DEFAULT_EXECUTE_SHELL_CMD 并完善 Shell 交互
  17. 可以,完善README
  18. 需要的
  19. 请这样子做!
  20. 需要
  21. README.md 区分版本,中文版本在README_zh.md 原来的版本是英文
  22. 增加一个.gitignore
  23. staget this change and commit with git
  24. add other file and commit
  25. use git status check and add file and commit with message
  26. yes
  27. 我目前已经按照 Plan.md 仿照 shell_gpt 开发了一部分的 sgpt_rs, 请问的项目支持 git diff | sgpt “Generate git commit message, for my changes” 使用方法吗?
  28. $ tree -L 2 | sgpt-rs ‘描述下项目’
    Error: LLM error: 422 Unprocessable Entity
  29. 无法通过build …(长错误日志)
  30. 在错误输出中附带更加明确的修复建议(如检测到 422 且包含 “tool_choice” 时提示 --no-functions)
  31. 我觉得参数 --no-functions 换成–functions 默认不用tools, 除非手动要求启动
  32. 当前的sgpt-rs项目如何读取变量,从 .sgptrc 文件吗?
  33. 修改读取路径为 ~/.config/sgpt_rs/.sgptrc
  34. 不仅仅是配置文件读取路径,应该是配置目录就是 ~/.config/sgpt_rs
  35. 需要的
  36. i found use cargo build have many warnings , try to fix
  37. following warnings: …(长 warning 输出)
  38. sgpt的配置文件的路径哪个?
  39. i have set ~/.config/sgpt_rs/.sgptrc, but Error: LLM error: 401 Unauthorized {“error”:{“message”:“Authentication Fails, Your api key: ****wjIA is invalid”,“type”:“authentication_error”,“param”:null,“code”:“invalid_request_error”}}
    Hint: Set OPENAI_API_KEY or export it in your shell
  40. use git to check change and stage and commmit

如下是他的计划Plan.md

ShellGPT Rust 重构规划(Plan)

决策确认(来自你的偏好):

  • 工具调用:仅支持原生 JSON 工具(不再兼容 Python 函数类定义)。
  • Markdown 渲染:使用 termimad(更终端友好)。
  • LLM 客户端:基于 reqwest 自行实现(保持更高灵活性),不绑定 async-openai。

1. 目标与范围

  • 目标:
    • 复刻现有 CLI 行为与输出(参数、互斥关系、REPL、Chat/Cache/Role 等),在性能、稳定性、跨平台(Linux/macOS/Windows)上显著提升。
    • 可扩展:统一 LLM 适配、原生工具调用(JSON 工具)、可插拔渲染与打印。
  • 非目标:
    • 迁移或执行旧版 Python 函数生态;不破坏现有配置与用户数据(会话、缓存、角色)。

2. 总体架构

  • 分层:
    • CLI 层:参数解析、命令路由、互斥校验。
    • 应用层:角色与消息拼装、模式处理器(默认/聊天/REPL/代码/命令)、打印器。
    • 领域层:配置、请求缓存、会话存储、角色管理、原生 JSON 工具、OS/Shell 检测与执行。
    • LLM 适配层:OpenAI 兼容端点/LiteLLM/自托管端点统一抽象,使用 reqwest 实现流式解析。
  • 关键抽象:
    • trait LlmClient:chat_stream(messages, params) -> impl Stream<Item = Delta>,屏蔽供应商差异(tool_calls、增量/终止原因)。
    • trait Printer:live_print(stream), static_print(text);实现 Text 与 Markdown(termimad)。
    • Handler(基类):生成 messages、驱动 LLM、打印输出;派生 Default/Chat/Repl/Code/Shell/DescribeShell。
    • Cache/ChatSession:请求级缓存、会话消息 JSON 存储与截断(保留首条 system)。

3. 模块映射(Python → Rust)

  • sgpt/app.py → crate::cli:clap 命令与 flags、入口 main、互斥与默认值。
  • handlers/* → crate::handlers::{default, chat, repl, code, shell, describe}
  • role.pycrate::role::{SystemRole, DefaultRoles, store}
  • printer.pycrate::printer::{TextPrinter, MarkdownPrinter(termimad)}
  • config.pycrate::config::{loader, env_merge, defaults}
  • cache.pycrate::cache::{request_cache, chat_cache}
  • function.py + llm_functions → crate::functions::{schema, registry, executor}(原生 JSON 工具)。
  • utils.pycrate::utils::{editor, run_command, install_integration, version}
  • integration.pycrate::integration::{bash, zsh}

4. 技术选型

  • CLI/REPL:clap v4 + rustyline/reedline(行编辑、历史、多行输入)。
  • 异步/HTTP:tokio + reqwest(自实现 OpenAI 兼容 Chat Completions 流式接口,SSE 或 chunked)。
  • 终端与颜色:crossterm + owo-colors。
  • Markdown 渲染:termimad(主题可调,匹配 CODE_THEME 近似语义)。
  • 语法高亮:syntect(代码块高亮,主题近似映射)。
  • 序列化:serde/serde_json。
  • 路径与平台:directories + sysinfo。
  • 错误:anyhow/thiserror。
  • 测试:assert_cmd、insta(快照)、mockito(HTTP 模拟)、proptest(必要时)。

5. CLI 兼容矩阵

  • 全量还原参数与互斥:
    • 通用:--model --temperature --top-p --md/--no-md --editor --cache/--no-cache --version
    • Assistance:--shell/-s --interaction/--no-interaction --describe-shell/-d --code/-c --functions/--no-functions
    • Chat:--chat --repl --show-chat --list-chats/-lc
    • Role:--role --create-role --show-role --list-roles/-lr
    • 隐藏:--install-integration --install-functions
  • 行为一致性:
    • Shell/Code 模式禁用 markdown;三者(shell/describe/code)互斥;REPL 支持 """ 多行;stdin 拼接含 __sgpt__eof__ 协议。

6. 配置与数据布局

  • 兼容路径:~/.config/shell_gpt/.sgptrc(优先 env 后配置文件)。
  • 默认键与语义保持一致:DEFAULT_MODEL, CACHE_PATH, CHAT_CACHE_PATH, CODE_THEME, ...
  • 会话与请求缓存:JSON 文件;会话截断保留首条 system;缓存命中键与 Python 逻辑一致(忽略含 @FunctionCall 的结果)。

7. LLM 适配(reqwest 实现)

  • 协议:OpenAI Chat Completions 兼容(/v1/chat/completions),支持 base_urlapi_keystream=true 增量解析(SSE/分块)。
  • tool_calls:解析增量中的 tool_calls,在 finish_reason=tool_calls 事件时进入工具执行分支并继续对话。
  • 超时/重试:继承 REQUEST_TIMEOUT,实现指数退避(可配置重试次数与 429/5xx 策略)。
  • LiteLLM:通过 base_url 适配(OpenAI 兼容模式),不引入额外依赖。

8. 原生 JSON 工具(Functions)

  • 目录:~/.config/shell_gpt/functions
  • 每个工具一个 JSON 文件,示例:
    {
      "name": "execute_shell_command",
      "description": "Execute a shell command and return stdout/stderr.",
      "parameters": {
        "type": "object",
        "properties": {
          "cmd": {"type": "string"}
        },
        "required": ["cmd"]
      },
      "exec": {
        "program": "/bin/sh",
        "args_template": ["-c", "{{cmd}}"],
        "stdin": false,
        "timeout_sec": 60
      }
    }
    
  • 约定:
    • parameters 使用 JSON Schema(draft-07 近似)供 LLM 工具调用描述。
    • exec 描述执行方式:
      • program 可执行路径;args_template 支持 {{param}} 占位符替换;
      • stdin=true 则将完整参数 JSON 通过 stdin 传入;
      • timeout_sec 超时终止并返回非零状态描述。
  • 执行与安全:
    • OPENAI_USE_FUNCTIONS 总开关控制;SHOW_FUNCTIONS_OUTPUT 控制是否原样回显输出块。
    • 仅加载 JSON 工具(忽略 .py);目录白名单限制,禁止递归外部路径。

9. 交互与 Shell 集成

  • --shell:生成后进入 [E]xecute / [M]odify / [D]escribe / [A]bort(或 --no-interaction 直出)。
  • 执行:按 OS/SHELL 构造命令(PowerShell/CMD/bash/zsh),与 Python 逻辑一致。
  • REPL:信息提示一致;e/d 特殊指令保留;历史可视化;termimad 渲染(在默认角色与 describe 模式)。
  • Shell integration:复用现有注入脚本(bash/zsh),Windows 后续 PowerShell Profile 支持。

10. 测试与质量保障

  • 单测:
    • 参数解析与互斥;消息构造;缓存/会话裁剪;JSON 工具解析与执行(mock 进程)。
    • 配置加载/合并;OS/SHELL 路径分支。
  • 集成测:
    • 模拟 LLM 流(本地 HTTP mock,SSE/分块),校验 Printer 与增量输出。
  • 端到端:
    • 覆盖现有 Python 测试场景的等价用例(默认/代码/命令/聊天/REPL/角色/显示聊天等)。
  • 快照:
    • termimad 渲染与文本颜色输出使用 insta 快照。
  • CI:
    • Linux/macOS/Windows 矩阵;fmt+clippy+test;最小化网络依赖(完全使用本地 mock)。

11. 发布与交付

  • 构建:cargo build --release;提供多平台产物(x86_64/aarch64)。
  • 包装:Homebrew tap、Scoop、AUR、.deb/.rpm(分阶段推进)。
  • 文档:README 与迁移指南(JSON 工具编写规范、示例库、常见问题)。
  • 版本:0.x 快速迭代可用;达完全兼容后 1.0。

12. 迁移与兼容

  • 配置:首次启动检测 .sgptrc,保留现有键并补全缺省;仍优先 ENV。
  • 角色/会话/缓存:无损继承现有 JSON 文件;路径可配置;结构不变。
  • 参数与帮助:名称/互斥逻辑一致,帮助文案同步。
  • 函数生态:新增 JSON 工具方案与脚手架,不再执行旧 .py 函数;提供迁移示例。

13. 里程碑与时间线(建议)

  • M0 需求冻结与设计评审(0.5 周)
    • 产出:该 Plan.md 确认、JSON 工具规范定稿、termimad 主题策略。
  • M1 CLI 骨架 + 配置加载 + TextPrinter(1 周)
    • clap 参数/互斥/帮助;.sgptrc/env 合并;版本输出;基础颜色输出。
  • M2 LLM 适配 + 流式打印 + 默认模式(1 周)
    • reqwest SSE/分块解析;DefaultHandler;请求缓存;超时/重试。
  • M3 Chat/REPL/会话(1 周)
    • ChatSession JSON 存储与裁剪;REPL(多行、e/d);显示聊天与列表。
  • M4 Shell/Code/Describe 模式 + 命令执行(1 周)
    • Shell 执行器(多平台);Describe 走 markdown;Code 模式禁 md。
  • M5 原生 JSON 工具 V1 + 默认函数安装(1 周)
    • JSON schema 校验、执行器;示例函数库与安装;tool_calls 分支闭环。
  • M6 termimad 渲染完善 + 测试矩阵 + 打包(1 周)
    • 主题映射;端到端与快照;多平台产物。
  • M7 文档/迁移指南/候选发布(0.5 周)
    • README、示例、已知问题;RC 发版。
  • 总计:6–7 周(部分并行可压缩至 4–5 周)。

14. 风险与对策

  • Markdown 实时渲染卡顿:termimad 增量更新;必要时降级静态打印。
  • Windows 兼容:尽早纳入 CI;优先验证 PowerShell/CMD 执行路径。
  • LLM 兼容差异:对 LiteLLM/OpenAI 细节通过 HTTP mock 收敛;保留可配置字段透传。
  • JSON 工具误用与安全:目录白名单;默认关闭执行;超时与返回码处理;输出可选回显。

附:JSON 工具最佳实践(简版)

  • 用最小参数面向任务;参数命名清晰,与模板占位符一致。
  • 失败时输出结构化错误 JSON({"error": {"code": , "message": }}),便于 LLM 复述与纠偏。
  • 避免副作用命令或明确在 description 中警示;必要时让 LLM 先描述再执行。
# AI 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×