# prompt-optimizer
**Repository Path**: eferaw/prompt-optimizer
## Basic Information
- **Project Name**: prompt-optimizer
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-24
- **Last Updated**: 2026-08-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# PromptOrb
**轻量常驻 Prompt 优化器 & Claude Code 启动器** · Windows 桌面工具
PromptOrb 是一个仅支持 Windows 的常驻后台工具,提供 **Prompt 优化** 和 **Claude Code 快速启动** 两大核心功能。它使用 C++20、原生 Win32 API、WinHTTP 和 Windows DPAPI,不依赖任何第三方运行环境或动态库。
---
## 目录
- [功能一览](#功能一览)
- [截图](#截图)
- [项目架构](#项目架构)
- [快速开始](#快速开始)
- [构建指南](#构建指南)
- [配置参考](#配置参考)
- [安全模型](#安全模型)
- [API 服务商](#api-服务商)
- [使用说明](#使用说明)
- [测试](#测试)
- [开发指南](#开发指南)
- [发布检查清单](#发布检查清单)
- [路线图](#路线图)
- [许可](#许可)
---
## 功能一览
### 🖱️ 桌面宠物与系统托盘
| 功能 | 说明 |
|---|---|
| 动态 GIF 桌宠 | 置顶透明窗口,逐帧播放 GIF 动画(自研 GIF/LZW 解码,不依赖系统图像编解码器) |
| Claude Code 状态联动 | 轮询 `~/.claude/projects/**` 会话转录:无 Claude Code 进程→待机1.gif;Claude Code 打开等待输入→待机3.gif;思考→思考.gif;执行→执行.gif;完成→完成.gif(约 15 秒庆祝后回待机;回看最近状态事件,跳过辅助事件,`end_turn` 被辅助事件覆盖也能正确识别) |
| 多窗口优先级 | 多个 Claude Code 窗口时:完成 > 执行 > 思考 > 待机 |
| 交互 | 可拖动、边缘吸附、位置记忆;滚轮缩放 40–200%(步进 25%);设置窗口「常规」页有桌宠大小滑条;双击打开优化器、右键菜单;透明像素点击穿透 |
| 自定义 GIF | 设置窗口「常规」页可为 5 个状态(待机1/待机2/思考/执行/完成)分别指定 GIF 文件,留空使用内置动画;保存后立即生效(存入 `settings.ini` 的 `[PetGifs]` 段) |
| 置顶守卫 | 每秒自检 + 看门狗强制重新置顶——全屏应用(如照片查看器)把桌宠压到 Z 序底层后 1 秒内自动恢复 |
| 多显示器支持 | 跟随所在显示器 DPI 缩放、位置记忆(重启后恢复);位置在屏幕外时自动移回主屏 |
| 降级路径 | GIF 资源缺失时回退为旧版 42×42 悬浮球并记录错误 |
| 系统托盘图标 | Explorer 崩溃后自动重建、右键菜单 |
| 全局快捷键 | `Ctrl+Alt+P` 打开优化器 · `Ctrl+Alt+C` 启动 Claude Code |
### ✨ Prompt 优化
| 功能 | 说明 |
|---|---|
| 输入/输出编辑框 | 原生 Win32 编辑框,自适应大小 |
| 长度比例控制 | 0.25× ~ 3.00× 滑条调节 |
| 有效字符统计 | 不计空格、换行、制表符 |
| ±5% 容差 | 输出在目标范围内即视为达标 |
| 快速模式(默认) | 单次请求完成优化 |
| 严格长度修正(可选) | 结果不满足目标时,自动执行一次修正请求 |
| 停止按钮 | 设置取消标记,当前网络阶段结束后响应 |
| 复制结果 | 一键复制优化后的 Prompt |
### 🚀 Claude Code 启动
| 功能 | 说明 |
|---|---|
| 智能目录识别 | 自动检测前台资源管理器窗口的当前目录,支持 Windows 11 多标签页——跟随当前激活选项卡(点击选项卡后约 0.5 秒内记录) |
| 选择项目启动 | 弹出文件夹选择对话框 |
| 最近项目 | 自动记录最近 10 个项目目录,去重 |
| 自定义命令 | 可配置可执行文件名称和启动参数 |
| 预设 Effort 等级 | 启动时自动附加 `--effort <等级>`(low/medium/high/xhigh/max) |
| Windows Terminal | 通过 `CreateProcessW` 启动 `wt.exe`,始终可见终端窗口 |
### 👁️ 视觉 MCP 服务
| 功能 | 说明 |
|---|---|
| `analyze_image` 工具 | 为 Claude Code 提供外置视觉能力:图片路径 → 视觉模型描述 → 文本回传上下文 |
| 一键注册/移除 | 设置窗口中一键 `claude mcp add/remove`,user 级注册、全局可用 |
| 服务总开关 | 关闭时 MCP 工具直接返回「服务已禁用」 |
| 自动路径修复 | 检测到注册路径与当前 EXE 不一致时自动重注册 |
| 密钥安全 | 视觉 API Key 仍走 DPAPI 加密存储,不写入 `~/.claude.json` |
| 独立密钥 | 视觉 MCP 可配置独立的 Base URL 与 API Key,与提示词优化服务商解耦;留空则回退使用所选服务商的配置 |
### ⚙️ 设置与管理
| 功能 | 说明 |
|---|---|
| 多服务商支持 | OpenRouter、硅基流动、DeepSeek、自定义 OpenAI 兼容 API |
| API Key 加密 | Windows DPAPI `CryptProtectData` 加密后存储,配置文件无明文密钥 |
| 开机启动 | 可选当前用户开机自启,自动跟踪 EXE 路径变更 |
| 错误日志 | `error.log` 带时间戳的错误记录 |
---
## 截图
> TODO: 添加悬浮球、优化窗口、设置窗口的截图
| 悬浮球 | Prompt 优化窗口 | 设置窗口 |
|---|---|---|
|  | — | — |
---
## 项目架构
```
PromptOrb.exe
├─ app.cpp / app.h ← 主应用:桌宠/悬浮球、系统托盘、窗口管理、UI 交互
│ ├─ 桌宠窗口 (BallProc,ULW 逐像素透明)
│ ├─ 优化器窗口 (OptimizerProc)
│ └─ 设置窗口 (SettingsProc)
├─ pet_gif.cpp / pet_gif.h ← GIF 动画引擎:帧合成、缩放、透明度渲染(纯 C++)
├─ gif_meta.cpp / gif_meta.h ← 自研 GIF89a 结构解析 + LZW 解码(可单测)
├─ claude_monitor.cpp/.h ← Claude Code 会话转录扫描 → 宠物状态(可单测)
├─ config.cpp / config.h ← 配置管理、INI 读写、DPAPI 加解密、开机启动
├─ api_client.cpp / api.h ← LLM API 调用(WinHTTP + OpenAI Chat Completions)
├─ prompt_utils.cpp / .h ← 文本工具:字符统计、JSON 转义/解析、UTF-8、base64
├─ claude_launcher.cpp / .h ← Claude Code 启动:前台目录识别、WT 启动
├─ mcp_protocol.cpp / .h ← MCP JSON-RPC 2.0 纯协议层(可单测)
├─ mcp_server.cpp / .h ← stdio MCP 服务循环(`--mcp` 入口,analyze_image 工具)
├─ mcp_registration.cpp/.h ← Claude Code MCP 注册/检测/移除(claude CLI + 配置解析)
├─ main.cpp ← 入口点:wWinMain → App::Run
├─ resource.h / PromptOrb.rc ← 图标资源与清单
├─ CMakeLists.txt ← CMake 构建配置
├─ assets/ ← 图标资源
├─ tests/ ← 单元测试
└─ docs/ ← 验收文档
```
### 数据流:Prompt 优化
```
用户输入 Prompt
↓
长度目标计算 (CalculateLengthTarget)
↓
系统 Prompt 组装 + 用户 Prompt
↓
WinHTTP POST → 服务商 Chat Completions API
↓
解析响应 (ParseAssistantContent)
↓
有效字符统计 (CountEffectiveCharacters)
↓
是否在目标范围内?
├─ 是 → 显示结果
└─ 否 → (可选) 发送修正请求 → 显示结果
```
### 数据流:Claude Code 启动
```
检测前台窗口
↓
遍历 ShellWindows → 匹配 HWND
↓
Windows 11 多标签 → 优先活跃标签
↓
URL → 文件系统路径
↓
CreateProcessW("wt.exe -d <目录> cmd /k claude <参数>")
```
---
## 快速开始
### 先决条件
- Windows 10 或 Windows 11
- [Windows Terminal](https://apps.microsoft.com/detail/9n0dx20hk701)(推荐,Claude Code 启动需要)
- [Claude Code](https://docs.anthropic.com/en/docs/claude-code)(可选,用于启动功能)
- 任一 LLM API 服务商的 API Key
### 下载与运行
1. 从 [Releases](https://github.com/your/repo/releases) 下载最新 `PromptOrb.exe`
2. 双击运行,图标出现在系统托盘
3. 右键托盘图标 → 「设置」
4. 选择服务商,填写 API Key 和模型
5. 填写默认项目目录和 Claude 参数(可选)
6. 保存,开始使用
### 首次使用
1. **打开优化器**:双击悬浮球,或按 `Ctrl+Alt+P`,或托盘右键 → 「Prompt 优化」
2. **输入 Prompt**:在输入框中粘贴或输入需要优化的文本
3. **设置比例**:拖动滑条调节输出长度比例(0.25× ~ 3.00×)
4. **选择严格修正**(可选):勾选「严格长度修正」以获得更精确的长度控制
5. **点击优化**:等待 API 返回结果
6. **复制结果**:点击「复制结果」使用优化后的 Prompt
---
## 构建指南
### 环境要求
- Visual Studio 2022(含「使用 C++ 的桌面开发」工作负载)
- CMake 组件(VS2022 安装时勾选)
- Windows SDK(VS2022 自带)
### 构建步骤
```powershell
# 1. 配置 CMake(仅首次)
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
# 2. 编译 Release
cmake --build build --config Release
# 3. 运行单元测试
ctest --test-dir build -C Release --output-on-failure
# 4. 安装到 dist/
cmake --install build --prefix dist --config Release
```
输出程序:`build/Release/PromptOrb.exe`
> **提示**:也可以在 VS2022 中选择「打开本地文件夹」并打开项目根目录,IDE 会自动识别 `CMakeLists.txt`。
### 构建配置说明
CMakeLists.txt 的关键配置:
| 配置项 | 值 | 说明 |
|---|---|---|
| C++ 标准 | C++20 | `CMAKE_CXX_STANDARD` |
| 运行时库 | 静态链接 | `/MT`(Release)· `/MTd`(Debug) |
| 编译器标记 | `/W4 /permissive- /utf-8 /EHsc` | 严格警告、标准合规、UTF-8 源、C++ EH |
| 链接选项 | `/MANIFEST:NO` | 使用自定义 manifest |
| 依赖库 | `winhttp crypt32 comctl32 shell32 shlwapi ole32 advapi32` | 均为 Windows 系统 DLL |
---
## 配置参考
配置文件存储在:`%LOCALAPPDATA%\PromptOrb\settings.ini`
### settings.ini 完整字段
```ini
[General]
StartWithWindows=1 ; 是否开机启动 (0/1)
ShowFloatingBall=1 ; 是否显示悬浮球 (0/1)
[FloatingBall]
X=1800 ; 悬浮球/桌宠 X 坐标(-1 为居中)
Y=500 ; 悬浮球/桌宠 Y 坐标(-1 为居中)
Size=42 ; 旧版悬浮球大小 (32~96,桌宠模式下忽略)
Opacity=220 ; 桌宠透明度 (80~255)
PetScale=100 ; 桌宠缩放百分比 (50~200,滚轮调节)
[PromptOptimizer]
Provider=OpenRouter ; 当前服务商 (OpenRouter/SiliconFlow/DeepSeek/Custom)
DefaultRatio=1.20 ; 默认输出比例 (0.25~3.00)
MinimumRatio=0.25 ; 最小比例
MaximumRatio=3.00 ; 最大比例
LengthTolerance=0.05 ; 长度容差 (±5%)
StrictLengthCorrection=0 ; 严格长度修正 (0=快速/1=严格)
[ClaudeCode]
Executable=claude ; Claude Code 可执行文件名
Effort=medium ; 预设 Effort 等级 (low/medium/high/xhigh/max)
DefaultProject=D:\Projects ; 默认项目目录
Arguments=--dangerously-skip-permissions ; 启动参数(若已含 --effort 则优先)
Terminal=WindowsTerminal ; 终端类型(固定值)
[Provider.OpenRouter]
BaseUrl=https://openrouter.ai/api/v1
Model=openai/gpt-4o-mini
EncryptedKey=
[Provider.SiliconFlow]
BaseUrl=https://api.siliconflow.cn/v1
Model=deepseek-ai/DeepSeek-V3
EncryptedKey=
[Provider.DeepSeek]
BaseUrl=https://api.deepseek.com
Model=deepseek-v4-flash
EncryptedKey=
[Provider.Custom]
BaseUrl=
Model=
EncryptedKey=
[VisionModel]
Provider=OpenRouter ; 视觉模型服务商(可复用其 BaseUrl/API Key,也可独立配置)
BaseUrl= ; 视觉专用 API 地址(空则使用所选服务商的 BaseUrl)
EncryptedKey= ; 视觉专用 API Key(DPAPI 加密,空则使用所选服务商的密钥)
Model=openai/gpt-4o ; 视觉模型名(空则按服务商使用默认值)
Enabled=0 ; 视觉 MCP 服务总开关
McpName=promptorb-vision ; 注册到 Claude Code 的服务名
```
### 其他文件
| 文件 | 路径 | 说明 |
|---|---|---|
| `settings.ini` | `%LOCALAPPDATA%\PromptOrb\` | 主配置文件(UTF-16LE BOM) |
| `recent_projects.txt` | `%LOCALAPPDATA%\PromptOrb\` | 最近项目列表(最多 10 条) |
| `error.log` | `%LOCALAPPDATA%\PromptOrb\` | 错误日志(带时间戳) |
| `explorer_debug.log` | `%LOCALAPPDATA%\PromptOrb\` | 资源管理器目录识别诊断(启动探测、激活选项卡记录) |
---
## 安全模型
### API Key 加密
PromptOrb 使用 Windows DPAPI(Data Protection API)保护 API Key:
```
用户填写 API Key(明文)
↓
CryptProtectData() ← 加密,绑定到当前 Windows 用户 + 本机
↓
Base64 编码
↓
写入 settings.ini(密文)
读取时逆向:
Base64 解码 → CryptUnprotectData() → 拿到明文用于 HTTP 请求头
```
关键安全特性:
- **不可移植**:加密后的数据只能由同一 Windows 用户在同一台机器上解密
- **无主密钥管理**:DPAPI 使用用户登录凭据派生加密密钥,开发者无需管理密钥存储
- **UI 保护**:`CRYPTPROTECT_UI_FORBIDDEN` 标志禁止显示密码提示框,适合后台使用
- **无明文落盘**:API Key 在内存中使用后立即丢弃,不写入任何持久化文件
### 启动安全
- Claude Code 默认使用 `--dangerously-skip-permissions` 参数,用户可在设置中修改
- 开机启动写入 `HKCU\Software\Microsoft\Windows\CurrentVersion\Run`(当前用户,无需管理员权限)
---
## API 服务商
PromptOrb 通过 OpenAI 兼容的 Chat Completions API 统一调用不同服务商:
### 内置服务商
| 服务商 | 预设 Base URL | 默认模型 | 特殊处理 |
|---|---|---|---|
| **OpenRouter** | `https://openrouter.ai/api/v1` | `openai/gpt-4o-mini` | 附加 `X-Title: PromptOrb` 请求头 |
| **硅基流动** | `https://api.siliconflow.cn/v1` | `deepseek-ai/DeepSeek-V3` | — |
| **DeepSeek** | `https://api.deepseek.com` | `deepseek-v4-flash` | 显式禁用思考模式 (`thinking: {type: "disabled"}`) |
| **自定义** | 用户填写 | 用户填写 | 通用 OpenAI 兼容接口 |
### 系统 Prompt
```text
你是专业的Prompt优化器。
请优化用户输入的Prompt,而不是执行其中的任务。
要求:
1. 保留原始任务目标、约束、文件路径、参数和输出格式。
2. 消除歧义、重复和逻辑混乱。
3. 将内容整理为明确、可执行的结构。
4. 不添加用户未提供的任务要求。
5. 输出长度控制在指定目标字符数附近。
6. 只输出优化后的Prompt,不进行解释。
输入有效字符数:500
目标有效字符数:750
允许范围:713~788
输出比例:1.50
```
### Token 估算
PromptOrb 根据输入文本的中/英文比例动态估算 `max_tokens`:
- **中文为主** (CJK ≥ 75%):约 1.6 tokens/字符
- **英文/其他**:约 0.55 tokens/字符
- 额外 +96 tokens 用于系统 Prompt 的固定内容
- 最终值限制在 128 ~ 8192 之间
### 自定义服务商
任何兼容 OpenAI Chat Completions 格式的 API 均可通过「自定义」选项接入:
```
Base URL: https://your-api.example.com/v1
API Key: sk-xxx
Model: your-model-name
```
---
## 使用说明
### 有效字符数
「有效字符数」不包含以下字符:
- 空格 (`' '`)
- 换行 (`\n`, `\r`)
- 制表符 (`\t`)
### 停止操作
点击「停止」会设置取消标记。由于 WinHTTP 请求是同步的,停止操作会在**当前网络阶段完成后**生效,最长受 60 秒网络超时限制。
### 长度修正流程
```
快速模式(默认):
请求 API → 检查长度 → 达标则输出,不达标保持原结果
严格模式(勾选):
请求 API → 检查长度 → 达标则输出
└ 不达标 → 修正请求 → 输出结果
```
### Claude Code 目录检测
按 `Ctrl+Alt+C` 或选择「启动 Claude Code」时:
1. 检测当前前台窗口是否为**文件资源管理器**
2. 若是 → 获取当前**激活选项卡**的目录路径(支持 Windows 11 多标签页)
3. 若识别失败 → 使用该窗口最近记录的激活选项卡目录(后台每 0.5 秒跟随一次选项卡切换,点击选项卡或 Ctrl+Tab 后自动更新)
4. 若仍无有效目录 → 使用设置的默认项目目录
5. 若默认目录为空 → 弹出项目选择对话框
**多标签激活选项卡识别**:程序每 0.5 秒探测前台资源管理器窗口并记录激活选项卡目录(按窗口独立记录)。识别综合两个独立信号——窗口标题栏前缀与各选项卡的名称/完整路径比对(标题栏始终以激活选项卡名称开头,其后为「- 文件资源管理器」等系统后缀),以及各选项卡视图窗口的可见性。每次识别与记录均写入 `%LOCALAPPDATA%\PromptOrb\explorer_debug.log`,便于排查「识别到错误选项卡」的情况。
启动时自动附加预设的 Effort 等级(设置 → Effort 等级,默认 `medium`),例如 `claude --dangerously-skip-permissions --effort high`。若「命令参数」中已手动包含 `--effort`,则以手动填写的为准,不再附加。
### 视觉 MCP 服务
为 Claude Code 提供外置图片识别能力(`analyze_image` 工具):
1. 打开设置 → 视觉 MCP 页:选择视觉模型服务商与模型(DeepSeek 不提供视觉模型,需使用 OpenRouter / 硅基流动 / 自定义)。默认复用该服务商的 Base URL 与 API Key;如需独立凭据,直接填写页内「Base URL」「API Key」(留空则继续复用服务商配置);
2. 勾选「启用视觉 MCP 服务」→ 保存(若已启用但未注册会提示一键注册);
3. 注册成功后需重启 Claude Code 会话生效(`claude --continue` 可恢复上下文);
4. 会话中直接问图片内容即可,例如「描述这张图片:assets/screenshot.png」。
MCP 模式入口为 `PromptOrb.exe --mcp`:由 Claude Code 按需拉起,不创建任何窗口,stdio 关闭即退出,可多会话并存。视觉 API Key 由 MCP 进程自行从 `settings.ini` 解密读取,不会写入 `~/.claude.json`。
---
## 测试
### 运行测试
```powershell
cmake --build build --config Release
ctest --test-dir build -C Release --output-on-failure
```
### 测试覆盖
单元测试覆盖以下功能(`tests/prompt_utils_tests.cpp`):
| 测试项 | 验证内容 |
|---|---|
| `CountEffectiveCharacters` | 中英文混合 + 空白字符过滤 |
| `CalculateLengthTarget` | 目标长度、±5% 容差边界 |
| `IsWithinTarget` | 范围内/外判断 |
| `EscapeJson` | 特殊字符转义 |
| `ParseAssistantContent` | Chat Completions 响应解析 |
| UTF-8 往返转换 | Wide ↔ UTF-8 互转一致性 |
---
## 开发指南
### 编码规范
- C++20 标准
- 命名空间 `promptorb`
- Windows 类型使用 `Windows.h` 前缀(`DWORD`, `HWND` 等)
- 字符串使用 `std::wstring`(UTF-16LE)
- 与 API 交互时使用 UTF-8(`WideToUtf8` / `Utf8ToWide`)
- 所有 `windows.h` 相关定义使用 `WIN32_LEAN_AND_MEAN` 和 `NOMINMAX`
### 项目约定
- `app.cpp` 负责所有 UI 交互,保持窗口过程清晰
- `api_client.cpp` 只处理 HTTP 请求与响应解析
- `config.cpp` 封装所有配置 I/O 和加密逻辑
- 避免引入第三方依赖:使用 Win32 API 和 C++ 标准库完成所有功能
### 调试技巧
- 使用 `OutputDebugStringW` 输出调试信息
- 设置 `DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2` 支持高 DPI
- 悬浮球使用 `WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST` 样式
- 全局快捷键通过 `RegisterHotKey` 注册,无需消息循环改造
---
## 发布检查清单
在发布新版本前,完成以下验证:
- [ ] 三个服务商分别使用有效 API Key 测试优化功能
- [ ] 用明显偏短/偏长的模型结果确认长度修正提示
- [ ] 多显示器间拖动悬浮球并重启,确认吸附和位置恢复
- [ ] 托盘菜单、全局快捷键、Explorer 重启后托盘恢复
- [ ] 带空格和中文的项目路径启动 Claude Code
- [ ] 最近项目去重验证
- [ ] 启用/关闭开机启动,检查注册表值
- [ ] `dumpbin /dependents` 确认无第三方 DLL 依赖
- [ ] 单元测试全部通过
---
## 路线图
### v1.0 ✅ (当前版本)
- [x] 悬浮球与系统托盘
- [x] Prompt 输入/输出与长度比例控制
- [x] 多服务商 API 配置与 DPAPI 密钥加密
- [x] Claude Code 一键启动与最近项目
- [x] 全局快捷键
### v1.1(规划中)
- [ ] 流式输出(打字机效果)
- [ ] 在线模型列表获取
- [ ] 多套 Prompt 模板(精简/标准/扩展/Codex GOAL)
- [ ] 剪贴板快速优化
- [ ] API 请求费用和 Token 统计
### v1.2 ✅(当前版本)
- [x] 视觉 MCP 服务(`analyze_image` 工具 + 一键注册/启停 + 自动路径修复)
---
## 许可
> TODO: 添加许可证信息
---
## 相关文档
- [设计方案](设计方案.md) — 完整的技术方案与设计文档
- [v1.0 验收矩阵](docs/V1_ACCEPTANCE.md) — 功能验收清单与验证方式