feat: 重构为 Go Web 脚手架——在线图片识别 Web 服务 + vision-cli 独立工具
- Gin + config.yaml + SQLite 后端骨架,JWT 登录 + 管理员初始化
- web/ 原生单页:拖拽多图上传 → Agnes 免费识别 → 结果复制
- HTTP API:/api/v1/vision/analyze 免鉴权 + 令牌桶限流,支持程序直调
- cmd/vision-cli 独立 CLI 工具(复用 service 层,不依赖 Web 服务)
- build.bat / build.sh 构建脚本,移除 mcp-server
- 统一响应格式 {code, message, data},CORS/JWT/限流中间件
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
177
README.md
177
README.md
@@ -1,21 +1,18 @@
|
||||
# vision-tool — 给 Claude Code 装上眼睛 👁️
|
||||
# vision-tool — 免费图片识别 👁️
|
||||
|
||||
基于 Go 构建的图片视觉分析 CLI 工具,对接 **Agnes-2.0-Flash** 免费视觉模型(Sapiens AI)。让 Claude Code 在不消耗昂贵多模态 token 的前提下"看懂"图片——适用于 **UI 设计稿分析、布局结构解读、页面内容/文字提取** 等场景。
|
||||
基于 Go 的图片视觉分析工具,对接 **Agnes-2.0-Flash** 免费视觉模型(Sapiens AI)。提供 **Web 在线识别页面** 和 **CLI 工具** 两种形态,适用于 **UI 设计稿分析、布局结构解读、页面内容/文字提取** 等场景。
|
||||
|
||||
```
|
||||
用户粘贴图片 → Claude Code 获取路径 → 调用 vision-tool.exe → 免费模型返回文本描述 → Claude Code 基于文本推理
|
||||
```
|
||||
|
||||
**核心思路:推理模型专心推理,图片理解交给免费小模型。各取所长,成本为零。**
|
||||
**核心思路:推理模型专心推理,图片理解交给免费小模型。成本为零。**
|
||||
|
||||
## ✨ 特性
|
||||
|
||||
- 🆓 完全免费(Agnes-2.0-Flash:Input $0 / Output $0)
|
||||
- 🖼️ 支持多图对比、base64 直传(无需图床/公网 URL)
|
||||
- 🌐 Web 在线识别页:拖拽/多图上传 → 识别 → 复制结果
|
||||
- 🖥️ 独立 CLI 工具(`vision-cli`):不依赖 Web 服务,适合脚本/Claude Code 调用
|
||||
- 🖼️ 多图对比、base64 直传(无需图床/公网 URL)
|
||||
- 🔁 指数退避自动重试(429/5xx:2s → 5s → 8s → 11s)
|
||||
- ⚡ `--no-think` 关闭思考模式,响应更快
|
||||
- 🔧 多源配置:命令行 > 环境变量 > 配置文件 > 内置默认
|
||||
- 🧩 附带 MCP Server(`mcp-server/`),可接入 MCP 客户端直接调用
|
||||
- 🔧 配置:命令行 > 环境变量 > config.yaml > 内置默认
|
||||
- 🔒 JWT 登录 + 管理员初始化(脚手架模板能力)
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
@@ -23,105 +20,131 @@
|
||||
|
||||
```bash
|
||||
cd vision-tool
|
||||
go build -o vision-tool.exe . # Windows
|
||||
# go build -o vision-tool . # Linux / macOS
|
||||
go build -o vision-tool.exe . # Web 服务(Windows)
|
||||
go build -o vision-cli.exe ./cmd/vision-cli # CLI 工具
|
||||
# 或直接运行 build.bat / build.sh
|
||||
```
|
||||
|
||||
### 基本用法
|
||||
### Web 使用
|
||||
|
||||
```bash
|
||||
# Claude Code 自动调用分析图片(推荐 -q 只输出结果)
|
||||
./vision-tool.exe -q <图片路径>
|
||||
|
||||
# 自定义提问(UI 设计分析场景)
|
||||
./vision-tool.exe -q -prompt "请分析这张 UI 设计稿:布局结构、配色、组件层级、文字内容" design.png
|
||||
|
||||
# 多图对比
|
||||
./vision-tool.exe -q screenshot1.png screenshot2.png
|
||||
|
||||
# 安静模式 + 关闭思考(Claude Code 推荐组合)
|
||||
./vision-tool.exe -q --no-think screenshot.png
|
||||
|
||||
# 指定 API Key(或设置环境变量 AGNES_API_KEY)
|
||||
./vision-tool.exe --apikey YOUR_KEY image.png
|
||||
|
||||
# 持久化保存 Key 到 config.json
|
||||
./vision-tool.exe --save-config --apikey YOUR_KEY
|
||||
go run . # 或 ./vision-tool.exe
|
||||
# 打开 http://localhost:8080
|
||||
```
|
||||
|
||||
### 参数一览
|
||||
1. 首次访问:初始化管理员账号(右上角)
|
||||
2. 拖拽或点击选择图片(可多张)
|
||||
3. (可选)输入自定义提问
|
||||
4. 点击「开始识别」→ 得到识别结果,可一键复制
|
||||
|
||||
| 参数 | 说明 |
|
||||
|---|---|
|
||||
| `-q` | 安静模式,只输出模型结果文本(Claude 调用推荐) |
|
||||
| `-prompt` | 自定义分析提问(默认:布局/元素/文字/要点结构化分析) |
|
||||
| `--no-think` | 关闭 thinking 模式(更快、更低负载) |
|
||||
| `--apikey` | API Key(优先于环境变量与配置文件) |
|
||||
| `-config` | 指定 config.json 路径 |
|
||||
| `--save-config` | 保存 API Key 后退出 |
|
||||
| `-provider` | 模型供应商(默认 `agnes`) |
|
||||
|
||||
### 默认分析 Prompt(可被 -prompt 覆盖)
|
||||
|
||||
> 请详细分析这张图片:1) 整体布局结构(区块划分/层级)2) UI 设计元素(颜色/字体/组件/间距)3) 所有文字内容(逐字提取)4) 交互与视觉要点。以结构化列表输出。
|
||||
|
||||
## 🤖 在 Claude Code 中在线调用
|
||||
|
||||
1. **构建 exe**:`go build -o vision-tool.exe .`
|
||||
2. **调用**:在 Claude Code 会话中,粘贴图片后告诉 Claude 图片的本地路径,Claude 会执行:
|
||||
### CLI 使用
|
||||
|
||||
```bash
|
||||
/path/to/vision-tool/vision-tool.exe -q --no-think "/path/to/your/image.png"
|
||||
./vision-cli.exe photo.jpg # 识别图片
|
||||
./vision-cli.exe -q --no-think screenshot.png # 安静模式 + 关闭思考(Claude Code 推荐)
|
||||
./vision-cli.exe -prompt "提取图中所有文字" img.png
|
||||
./vision-cli.exe -q img1.png img2.png # 多图对比
|
||||
./vision-cli.exe --apikey YOUR_KEY image.png # 指定 Key
|
||||
```
|
||||
|
||||
3. Claude 拿到模型返回的文本描述后,即可基于此进行 UI 分析、代码生成或内容提取。
|
||||
|
||||
**权限提示**:可在 Claude Code 配置中允许该命令,或直接执行(首次会询问权限)。
|
||||
|
||||
## 🧩 MCP Server(可选)
|
||||
|
||||
`mcp-server/` 提供 MCP(Model Context Protocol)服务,可注册到支持 MCP 的客户端:
|
||||
Claude Code 在线调用方式:粘贴图片后执行
|
||||
|
||||
```bash
|
||||
cd mcp-server
|
||||
npm install
|
||||
node server.js # stdio 传输,由 MCP 客户端拉起
|
||||
/path/to/vision-cli.exe -q --no-think "/path/to/image.png"
|
||||
```
|
||||
|
||||
环境变量:`AGNES_API_KEY` / `VISION_MODEL` / `VISION_BASE_URL`。
|
||||
## 📡 HTTP API
|
||||
|
||||
## ⚙️ 配置优先级
|
||||
统一响应格式:`{code, message, data}`(`code=0` 为成功)
|
||||
|
||||
`命令行参数 > 环境变量(AGNES_API_KEY)> 配置文件(config.json)> 内置默认`
|
||||
### 在线图片识别(免鉴权 + 限流)
|
||||
|
||||
config.json 结构:
|
||||
```bash
|
||||
curl -F "images=@a.png" -F "images=@b.png" \
|
||||
-F "prompt=比较这两张图的异同" \
|
||||
http://localhost:8080/api/v1/vision/analyze
|
||||
```
|
||||
|
||||
响应:
|
||||
|
||||
```json
|
||||
{
|
||||
"api_key": "sk-...",
|
||||
"model": "agnes-2.0-flash",
|
||||
"base_url": "https://apihub.agnes-ai.com/v1/chat/completions",
|
||||
"provider": "agnes"
|
||||
"code": 0,
|
||||
"message": "ok",
|
||||
"data": {
|
||||
"result": "……识别结果文本……",
|
||||
"images": ["/uploads/xxx.png"],
|
||||
"usage": {"prompt_tokens": 120, "completion_tokens": 80, "total_tokens": 200}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 完整接口清单
|
||||
|
||||
| 接口 | 方法 | 说明 |
|
||||
|---|---|---|
|
||||
| `/api/health` | GET | 健康检查 |
|
||||
| `/api/v1/admin/check` | GET | 管理员是否已初始化 |
|
||||
| `/api/v1/admin/init` | POST | 初始化管理员 `{username, password}` |
|
||||
| `/api/v1/auth/login` | POST | 登录 `{username, password}` → `{token}` |
|
||||
| `/api/v1/user/profile` | GET | 当前用户信息(需 `Authorization: Bearer <token>`) |
|
||||
| `/api/v1/vision/analyze` | POST | 图片识别(multipart:`images` × 1-N + 可选 `prompt`) |
|
||||
| `/uploads/*` | GET | 上传图片静态访问 |
|
||||
|
||||
## ⚙️ 配置(config.yaml)
|
||||
|
||||
```yaml
|
||||
server:
|
||||
port: 8080
|
||||
database:
|
||||
driver: sqlite # 当前仅 sqlite(pure-go,无需 CGO)
|
||||
path: ./data/app.db
|
||||
auto_migrate: true
|
||||
jwt:
|
||||
secret: "change-me-in-production"
|
||||
expire_hours: 720
|
||||
upload:
|
||||
path: uploads
|
||||
max_size: 10485760 # 10MB
|
||||
ai:
|
||||
api_key: "sk-..." # Agnes API Key(或环境变量 AGNES_API_KEY)
|
||||
base_url: "https://apihub.agnes-ai.com/v1/chat/completions"
|
||||
model: "agnes-2.0-flash"
|
||||
```
|
||||
|
||||
配置优先级:`命令行参数 > 环境变量(AGNES_API_KEY)> config.yaml > 内置默认(内置免费 Key)`
|
||||
|
||||
## 🧱 项目结构
|
||||
|
||||
```
|
||||
vision-tool/
|
||||
├── main.go # CLI 入口(参数解析/调用编排)
|
||||
├── vision.go # 视觉 API 客户端(请求构建/重试/多图)
|
||||
├── config.go # 配置加载(多源优先级/供应商预设)
|
||||
├── mcp-server/ # MCP 服务(server.js + package.json)
|
||||
└── go.mod # Go 1.25 module
|
||||
├── main.go # Web 服务入口(Gin + //go:embed web)
|
||||
├── config.yaml # 统一配置
|
||||
├── build.bat / build.sh # 构建脚本
|
||||
├── cmd/
|
||||
│ └── vision-cli/ # 独立 CLI 工具(打包为单个二进制)
|
||||
├── internal/
|
||||
│ ├── config/ # 配置加载(yaml + 环境变量覆盖)
|
||||
│ ├── database/ # GORM + SQLite 初始化 + AutoMigrate
|
||||
│ ├── model/ # 数据模型 + 统一响应格式
|
||||
│ ├── repository/ # 数据访问层
|
||||
│ ├── service/ # 业务逻辑(auth / vision 免费模型调用)
|
||||
│ ├── handler/ # HTTP 处理器
|
||||
│ ├── middleware/ # CORS / JWT / 令牌桶限流
|
||||
│ └── router/ # 路由注册 + 前端内嵌 + SPA 回退
|
||||
└── web/ # 原生单页(在线图片识别,内嵌进二进制)
|
||||
├── index.html
|
||||
├── css/style.css
|
||||
└── js/app.js
|
||||
```
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
- 支持图片格式:PNG / JPEG / GIF / WebP / BMP
|
||||
- Windows Git Bash 下经 curl 传中文请用 `--data-binary @file.json`(避免编码损坏)
|
||||
- 支持图片格式:PNG / JPG / GIF / WebP / BMP / TIFF
|
||||
- 单张图片上限 10MB(config.yaml 可调)
|
||||
- 识别接口免鉴权但有限流(10 req/s),如需生产部署请修改 JWT secret
|
||||
- 生产环境建议 `auto_migrate: false`,手动管理数据库结构
|
||||
- 图片过大时建议先压缩(降低延迟与体积)
|
||||
- API Key 为内置默认值,若需更换:`--apikey` 或 `--save-config`
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user