Agent的出现,导致每次任务的token消耗量都特别的大,所以Cursor我也不再订阅了,使用Claude-Code和Codex进行平时的开发。
之前用OpenAI的codex进行项目开发,发现效果非常一般,但是GPT-5出来之后,改变了我的看法。
我的目标是用Rust写一个shell_gpt,这是生成的结果 https://github.com/xuzhougeng/sgpt-rs ,确实完成了我的需求,大概就说了如下一些话
- 阅读 shellgpt 项目,我计划使用Rust对该项目进行重构,请制定一个项目规划
- 仅支持原生 JSON 工具 ; termimad(更终端友好); 自行 reqwest 保持更灵活; 然后将规划写到Plan.md中
- 请继续搭建 Rust 项目骨架(目录结构与最小 main/CLI 参数)
- yes proceed with handler routing + config loader next
- start on the reqwest-based LLM streaming client?
- 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 ;
- implement ChatSession persistence and use it in --chat/–repl next
- first add usage into readme
- Plan.md 根据进度表,我们现在是到了哪一步,下一步做什么?
- 需要的!
- 先把 --show-chat 做成更易读的格式, 开始开始接通 Shell/Code/Describe
- 我觉得需要接入termimad了
- 需要
- 需要
- shell模式不太行,是不是还不能执行命令?
- Plan.md 根据计划,我们现在到了哪一步?
-
- 接入 DEFAULT_EXECUTE_SHELL_CMD 并完善 Shell 交互
- 可以,完善README
- 需要的
- 请这样子做!
- 需要
- README.md 区分版本,中文版本在README_zh.md 原来的版本是英文
- 增加一个.gitignore
- staget this change and commit with git
- add other file and commit
- use git status check and add file and commit with message
- yes
- 我目前已经按照 Plan.md 仿照 shell_gpt 开发了一部分的 sgpt_rs, 请问的项目支持 git diff | sgpt “Generate git commit message, for my changes” 使用方法吗?
- $ tree -L 2 | sgpt-rs ‘描述下项目’
Error: LLM error: 422 Unprocessable Entity - 无法通过build …(长错误日志)
- 在错误输出中附带更加明确的修复建议(如检测到 422 且包含 “tool_choice” 时提示 --no-functions)
- 我觉得参数 --no-functions 换成–functions 默认不用tools, 除非手动要求启动
- 当前的sgpt-rs项目如何读取变量,从 .sgptrc 文件吗?
- 修改读取路径为 ~/.config/sgpt_rs/.sgptrc
- 不仅仅是配置文件读取路径,应该是配置目录就是 ~/.config/sgpt_rs
- 需要的
- i found use cargo build have many warnings , try to fix
- following warnings: …(长 warning 输出)
- sgpt的配置文件的路径哪个?
- 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 - use git to check change and stage and commmit
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)。
- trait LlmClient:
3. 模块映射(Python → Rust)
- sgpt/app.py →
crate::cli
:clap 命令与 flags、入口main
、互斥与默认值。 - handlers/* →
crate::handlers::{default, chat, repl, code, shell, describe}
。 - role.py →
crate::role::{SystemRole, DefaultRoles, store}
。 - printer.py →
crate::printer::{TextPrinter, MarkdownPrinter(termimad)}
。 - config.py →
crate::config::{loader, env_merge, defaults}
。 - cache.py →
crate::cache::{request_cache, chat_cache}
。 - function.py + llm_functions →
crate::functions::{schema, registry, executor}
(原生 JSON 工具)。 - utils.py →
crate::utils::{editor, run_command, install_integration, version}
。 - integration.py →
crate::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__
协议。
- Shell/Code 模式禁用 markdown;三者(shell/describe/code)互斥;REPL 支持
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_url
与api_key
;stream=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 先描述再执行。