@yanickxia/agent-vision 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +175 -36
- package/dist/analyze.d.ts.map +1 -1
- package/dist/analyze.js +3 -3
- package/dist/analyze.js.map +1 -1
- package/dist/cli.js +65 -9
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +19 -5
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +273 -35
- package/dist/config.js.map +1 -1
- package/dist/generate.d.ts +16 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +167 -0
- package/dist/generate.js.map +1 -0
- package/dist/generation-provider.d.ts +24 -0
- package/dist/generation-provider.d.ts.map +1 -0
- package/dist/generation-provider.js +101 -0
- package/dist/generation-provider.js.map +1 -0
- package/dist/image.d.ts +1 -0
- package/dist/image.d.ts.map +1 -1
- package/dist/image.js +1 -1
- package/dist/image.js.map +1 -1
- package/dist/provider.d.ts +8 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +69 -9
- package/dist/provider.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +37 -2
- package/dist/server.js.map +1 -1
- package/dist/video.d.ts +1 -1
- package/dist/video.d.ts.map +1 -1
- package/dist/video.js +8 -8
- package/dist/video.js.map +1 -1
- package/package.json +3 -2
- package/skills/agent-vision/SKILL.md +64 -37
- package/skills/agent-vision/references/configuration.md +156 -5
package/README.md
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
# agent-vision
|
|
2
2
|
|
|
3
3
|
一个小而直接的视觉 MCP Server + Agent Skill:让纯文本 Agent 通过一个
|
|
4
|
-
OpenAI-compatible
|
|
4
|
+
OpenAI-compatible 视觉模型理解图片和视频,也能通过生图模型从文字生成图片。
|
|
5
5
|
|
|
6
6
|
- 纯 Node.js / TypeScript,`npx` 自动下载运行
|
|
7
|
-
- MCP 工具:`analyze_image`、`analyze_video`
|
|
8
|
-
- Agent Skills 标准目录:`skills/agent-vision
|
|
7
|
+
- MCP 工具:`analyze_image`、`analyze_video`、`generate_image`
|
|
8
|
+
- Agent Skills 标准目录:`skills/agent-vision/`,能力自适应:能看图的 Agent 直接看,纯文本 Agent 直接跑 CLI
|
|
9
9
|
- 图片:本地路径、HTTP(S) URL、Data URI
|
|
10
10
|
- 视频:本地路径或 URL,自动下载 npm 内的 ffmpeg 并均匀抽帧
|
|
11
|
-
-
|
|
11
|
+
- 识图多 provider 多模型并发竞速:所有 target 同时请求,谁先成功用谁,其余请求 abort
|
|
12
|
+
- 生图:支持 OpenAI-compatible 和火山方舟 Seedream,独立配置 provider / model,按顺序失败回退
|
|
12
13
|
|
|
13
14
|
## 为什么做这个项目
|
|
14
15
|
|
|
@@ -19,25 +20,54 @@ OpenAI-compatible 视觉模型理解图片和视频。
|
|
|
19
20
|
- [vision-tool](https://github.com/farhanic017/vision-tool):支持视频抽帧,但包含大量 provider 探测、并行 fallback 和安装逻辑,并采用 GPL-3.0。
|
|
20
21
|
- [agent-vision-toolkit](https://github.com/Anionex/agent-vision-toolkit):Skill 和任务工作流很强,但核心是多组 Python/Shell CLI,不是 MCP 视频服务。
|
|
21
22
|
|
|
22
|
-
`agent-vision`
|
|
23
|
+
`agent-vision` 保持两条简单链路:
|
|
24
|
+
|
|
25
|
+
- 理解:**MCP/CLI → 图片或视频帧 → 你配置的视觉 API → 文本**
|
|
26
|
+
- 生成:**MCP/CLI → 文字描述 → 你配置的生图 API → 图片**
|
|
23
27
|
本仓库是独立实现,没有复制 `vision-tool` 的 GPL 源码。
|
|
24
28
|
|
|
25
29
|
## 要求
|
|
26
30
|
|
|
27
31
|
- Node.js 20+
|
|
28
|
-
-
|
|
32
|
+
- 图片/视频理解:支持 `/chat/completions` 和 `image_url` 的 OpenAI-compatible 视觉模型
|
|
33
|
+
- 生图:OpenAI-compatible 生图模型,或火山方舟 Seedream(API Key 鉴权);理解和生图可以单独配置
|
|
29
34
|
|
|
30
35
|
ffmpeg 由 `@ffmpeg-installer/ffmpeg` 按平台自动安装,无需另行安装。
|
|
31
36
|
|
|
32
37
|
## 配置
|
|
33
38
|
|
|
39
|
+
推荐用配置文件(一次配置,所有宿主共用):
|
|
40
|
+
|
|
34
41
|
```bash
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
42
|
+
mkdir -p ~/.config/agent-vision
|
|
43
|
+
cat > ~/.config/agent-vision/settings.json <<'EOF'
|
|
44
|
+
{
|
|
45
|
+
"providers": [
|
|
46
|
+
{
|
|
47
|
+
"name": "dashscope",
|
|
48
|
+
"baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
|
|
49
|
+
"apiKey": "sk-...",
|
|
50
|
+
"models": ["qwen-vl-max", "qwen-vl-plus"]
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "openai",
|
|
54
|
+
"baseUrl": "https://api.openai.com/v1",
|
|
55
|
+
"apiKey": "sk-...",
|
|
56
|
+
"models": ["gpt-4o"]
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
EOF
|
|
61
|
+
chmod 600 ~/.config/agent-vision/settings.json
|
|
38
62
|
```
|
|
39
63
|
|
|
40
|
-
|
|
64
|
+
- 位置:`$AGENT_VISION_CONFIG` 显式路径,或 `$XDG_CONFIG_HOME/agent-vision/settings.json`(默认 `~/.config/agent-vision/settings.json`)
|
|
65
|
+
- `providers` 用于图片/视频理解,每个 provider × model 是一个 target;多个 target 时**并发请求,第一个成功者胜出**,其余请求 abort。注意成本:N 个 target 意味着每次分析最多 N 份上传与推理费用
|
|
66
|
+
- provider 字段:`baseUrl`(必填)、`models`(必填非空)、`name`/`apiKey`/`headers`(可选;`apiKey` 缺省回退环境变量)
|
|
67
|
+
- 顶层可选:`maxTokens`、`timeoutMs`、`headers`、`maxImageMb`、`maxVideoMb`、`allowPrivateUrls`、`ffmpegPath`
|
|
68
|
+
- 文件定义的字段优先于环境变量;含 key 的文件建议 `chmod 600`
|
|
69
|
+
|
|
70
|
+
环境变量作为回退仍然完整支持(无配置文件时):
|
|
41
71
|
|
|
42
72
|
| 设置 | 兼容回退 |
|
|
43
73
|
|---|---|
|
|
@@ -45,33 +75,111 @@ export AGENT_VISION_MODEL="your-vision-model"
|
|
|
45
75
|
| `AGENT_VISION_BASE_URL` | `VISION_BASE_URL` → `OPENAI_BASE_URL` |
|
|
46
76
|
| `AGENT_VISION_MODEL` | `VISION_MODEL` → `OPENAI_MODEL` |
|
|
47
77
|
|
|
48
|
-
|
|
78
|
+
### 生图配置
|
|
79
|
+
|
|
80
|
+
在同一个 `settings.json` 中添加 `generationProviders`,字段与识图的 `providers`
|
|
81
|
+
类似,额外通过 `type` 选择生图协议;也可以只配置生图,不配置识图:
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"generationProviders": [
|
|
86
|
+
{
|
|
87
|
+
"name": "image-api",
|
|
88
|
+
"type": "openai-images",
|
|
89
|
+
"baseUrl": "https://your-image-api.example/v1",
|
|
90
|
+
"apiKey": "sk-...",
|
|
91
|
+
"models": ["your-image-generation-model"]
|
|
92
|
+
}
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
- 识图与生图模型完全分开,不会把视觉聊天模型自动当作生图模型。
|
|
98
|
+
- `type` 支持 `openai-images`(默认,兼容旧配置)和 `volcengine-ark`。按显式协议适配请求,不根据域名或模型名称猜测;未知类型会报配置错误。
|
|
99
|
+
- `generationProviders` 内按 provider、model 的配置顺序依次尝试,拿到第一张有效图片就停止,**不并发竞速**。失败回退仍可能产生多次费用(例如上游超时但实际已完成生成);只想调用一个模型时配置一个 target。
|
|
100
|
+
- 每次只生成一张图片;目前支持文生图,不包含参考图编辑或异步任务轮询。
|
|
101
|
+
- 两种协议均支持 `data[0].b64_json` 或 `data[0].url` 返回。`openai-images` 省略 `response_format`,避免不支持该参数的模型报错;`volcengine-ark` 请求 base64 返回。参考 [OpenAI 官方 Images API 文档](https://developers.openai.com/api/reference/resources/images/methods/generate)。
|
|
102
|
+
- 与识图共用顶层 `timeoutMs`、`maxImageMb`、`headers`、`allowPrivateUrls`,生图较慢时可调高 `timeoutMs`。
|
|
103
|
+
- `doctor` 会分别列出识图和生图 targets,并显示生图协议,只配置生图时不要求 ffmpeg。
|
|
104
|
+
|
|
105
|
+
#### 火山引擎方舟(Seedream)
|
|
106
|
+
|
|
107
|
+
在已有配置中加入下面的生图部分即可,保留原来的 `providers`:
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"generationProviders": [
|
|
112
|
+
{
|
|
113
|
+
"name": "volcengine",
|
|
114
|
+
"type": "volcengine-ark",
|
|
115
|
+
"baseUrl": "https://ark.cn-beijing.volces.com/api/v3",
|
|
116
|
+
"apiKey": "你的方舟 API Key",
|
|
117
|
+
"models": ["doubao-seedream-5-0-lite-260128"]
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
`models` 填写你已开通的 Seedream Model ID,也支持配置了生图模型的 `ep-...` 接入点 ID。
|
|
124
|
+
`apiKey` 可省略并从 `ARK_API_KEY` 读取;若设置了 `AGENT_VISION_GENERATION_API_KEY`,则后者优先。
|
|
125
|
+
方舟不会自动继承识图的 `AGENT_VISION_API_KEY` / `OPENAI_API_KEY`,避免把其他服务的 key 发给火山。
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npx -y @yanickxia/agent-vision generate \
|
|
129
|
+
--prompt "一只坐在窗边的橘猫,水彩风格" --output ./cat.jpg --size 2K
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
- 使用方舟原生 `/api/v3/images/generations` 参数,不发送 OpenAI 的 `n` 或 `quality`;传 `--quality` 会在调用前报错,不静默忽略。
|
|
133
|
+
- `--size` 可用模型支持的分辨率档位(例如 `2K`)或 `宽x高`,省略时采用模型默认值。
|
|
134
|
+
- 保持服务端的单图、非流式默认行为,不发送部分 Seedream 模型不支持的组图/流式开关。
|
|
135
|
+
- 保留模型默认水印和输出格式;Seedream 通常返回 JPEG,文件扩展名不会触发转码。
|
|
136
|
+
- 能解析火山的 HTTP 错误及成功 HTTP 响应中的顶层/单图错误,保留错误码与消息。
|
|
137
|
+
|
|
138
|
+
协议依据:[方舟官方图片生成 API](https://ark.volcengine.com/region:cn-beijing/docs/image-generation-api.md)。
|
|
139
|
+
本适配针对**方舟 Seedream 文生图**,不是“视觉智能/即梦”的 AK/SK 签名接口,不包含图生图、组图或图层拆分。
|
|
140
|
+
|
|
141
|
+
#### 生图环境变量
|
|
142
|
+
|
|
143
|
+
也可以用环境变量配置生图:
|
|
144
|
+
|
|
145
|
+
| 变量 | 回退 / 说明 |
|
|
146
|
+
|---|---|
|
|
147
|
+
| `AGENT_VISION_GENERATION_TYPE` | 默认 `openai-images`;火山方舟设为 `volcengine-ark` |
|
|
148
|
+
| `AGENT_VISION_GENERATION_MODEL` | 生图模型名称,必须显式设置;不回退到识图模型 |
|
|
149
|
+
| `AGENT_VISION_GENERATION_BASE_URL` | OpenAI 协议回退到识图 URL 及其别名;方舟协议默认 `https://ark.cn-beijing.volces.com/api/v3`,不继承识图 URL |
|
|
150
|
+
| `AGENT_VISION_GENERATION_API_KEY` | OpenAI 协议回退到识图 key 及其别名;方舟协议回退到 `ARK_API_KEY` |
|
|
151
|
+
| `ARK_API_KEY` | 仅用于 `volcengine-ark` 的 key 回退 |
|
|
152
|
+
| `AGENT_VISION_GENERATION_HEADERS` | 生图专用额外请求头 JSON,覆盖通用环境变量请求头 |
|
|
153
|
+
|
|
154
|
+
文件中 `generationProviders` 优先于环境变量生图 target;provider 的 `apiKey`
|
|
155
|
+
省略时使用上述生图 key 回退,显式 `"apiKey": ""` 可关闭 key 回退。
|
|
156
|
+
文件内未指定 `type` 的 provider 始终是 `openai-images`,不受环境变量的 `TYPE` 影响。
|
|
157
|
+
请求头优先级:通用环境变量 → 生图环境变量 → 文件顶层 → provider。
|
|
158
|
+
|
|
159
|
+
### 通用选项
|
|
160
|
+
|
|
161
|
+
以下可选变量与对应的配置文件字段等价:
|
|
49
162
|
|
|
50
163
|
| 变量 | 默认值 | 说明 |
|
|
51
164
|
|---|---:|---|
|
|
52
165
|
| `AGENT_VISION_MAX_TOKENS` | `4096` | 最大输出 tokens |
|
|
53
166
|
| `AGENT_VISION_TIMEOUT_MS` | `120000` | 下载和 API 超时 |
|
|
54
|
-
| `AGENT_VISION_MAX_IMAGE_MB` | `20` |
|
|
167
|
+
| `AGENT_VISION_MAX_IMAGE_MB` | `20` | 输入和生成图片的大小上限 |
|
|
55
168
|
| `AGENT_VISION_MAX_VIDEO_MB` | `200` | 视频大小上限 |
|
|
56
169
|
| `AGENT_VISION_HEADERS` | `{}` | 额外请求头 JSON |
|
|
57
|
-
| `AGENT_VISION_ALLOW_PRIVATE_URLS` | `false` |
|
|
170
|
+
| `AGENT_VISION_ALLOW_PRIVATE_URLS` | `false` | 允许私网图片/视频来源及生图结果 URL |
|
|
58
171
|
| `AGENT_VISION_FFMPEG_PATH` | 自动发现 | 指定 ffmpeg 可执行文件;默认先用 PATH,再用 npm 内置版本 |
|
|
59
172
|
|
|
60
173
|
## MCP 安装
|
|
61
174
|
|
|
62
|
-
### npm
|
|
175
|
+
### npm(推荐)
|
|
63
176
|
|
|
64
177
|
```json
|
|
65
178
|
{
|
|
66
179
|
"mcpServers": {
|
|
67
180
|
"agent-vision": {
|
|
68
181
|
"command": "npx",
|
|
69
|
-
"args": ["-y", "@yanickxia/agent-vision"]
|
|
70
|
-
"env": {
|
|
71
|
-
"AGENT_VISION_BASE_URL": "https://your-endpoint.example/v1",
|
|
72
|
-
"AGENT_VISION_API_KEY": "your-key",
|
|
73
|
-
"AGENT_VISION_MODEL": "your-vision-model"
|
|
74
|
-
}
|
|
182
|
+
"args": ["-y", "@yanickxia/agent-vision"]
|
|
75
183
|
}
|
|
76
184
|
}
|
|
77
185
|
}
|
|
@@ -84,17 +192,15 @@ export AGENT_VISION_MODEL="your-vision-model"
|
|
|
84
192
|
"mcpServers": {
|
|
85
193
|
"agent-vision": {
|
|
86
194
|
"command": "npx",
|
|
87
|
-
"args": ["-y", "github:yanickxia/agent-vision"]
|
|
88
|
-
"env": {
|
|
89
|
-
"AGENT_VISION_BASE_URL": "https://your-endpoint.example/v1",
|
|
90
|
-
"AGENT_VISION_API_KEY": "your-key",
|
|
91
|
-
"AGENT_VISION_MODEL": "your-vision-model"
|
|
92
|
-
}
|
|
195
|
+
"args": ["-y", "github:yanickxia/agent-vision"]
|
|
93
196
|
}
|
|
94
197
|
}
|
|
95
198
|
}
|
|
96
199
|
```
|
|
97
200
|
|
|
201
|
+
无需 env 块:配置从 `~/.config/agent-vision/settings.json` 读取(见上文「配置」)。
|
|
202
|
+
也可以继续用环境变量,在 `env` / `environment` 块里传入。
|
|
203
|
+
|
|
98
204
|
Claude Desktop、Claude Code、Cursor、Cline 等使用上面的标准
|
|
99
205
|
`mcpServers` 格式。
|
|
100
206
|
|
|
@@ -106,12 +212,7 @@ Claude Desktop、Claude Code、Cursor、Cline 等使用上面的标准
|
|
|
106
212
|
"agent-vision": {
|
|
107
213
|
"type": "local",
|
|
108
214
|
"command": ["npx", "-y", "@yanickxia/agent-vision"],
|
|
109
|
-
"enabled": true
|
|
110
|
-
"environment": {
|
|
111
|
-
"AGENT_VISION_BASE_URL": "https://your-endpoint.example/v1",
|
|
112
|
-
"AGENT_VISION_API_KEY": "your-key",
|
|
113
|
-
"AGENT_VISION_MODEL": "your-vision-model"
|
|
114
|
-
}
|
|
215
|
+
"enabled": true
|
|
115
216
|
}
|
|
116
217
|
}
|
|
117
218
|
}
|
|
@@ -123,9 +224,22 @@ Claude Desktop、Claude Code、Cursor、Cline 等使用上面的标准
|
|
|
123
224
|
npx skills add yanickxia/agent-vision --skill agent-vision -g -y
|
|
124
225
|
```
|
|
125
226
|
|
|
126
|
-
也可以复制 `skills/agent-vision/` 到 Agent 的 skills 目录。Skill
|
|
127
|
-
Agent
|
|
128
|
-
|
|
227
|
+
也可以复制 `skills/agent-vision/` 到 Agent 的 skills 目录。Skill 是能力自适应
|
|
228
|
+
的:Agent 自己能看图就直接看;看不了(或输入是视频)就由 Skill 指导 Agent
|
|
229
|
+
直接跑 CLI 完成分析。生图不受「能否看图」限制,任何 Agent 都可以使用。
|
|
230
|
+
|
|
231
|
+
**MCP 和 Skill/CLI 都支持火山方舟生图**,共用同一份 `settings.json` 中的
|
|
232
|
+
`generationProviders` 配置。Skill 直接执行 CLI,不依赖启动或安装 MCP Server。
|
|
233
|
+
|
|
234
|
+
| 入口 | 调用 | 输出 |
|
|
235
|
+
|---|---|---|
|
|
236
|
+
| MCP | `generate_image`,传 `prompt`、可选 `size` / `output_path` | 图片内容和元数据,可选保存文件 |
|
|
237
|
+
| Skill / CLI | `agent-vision generate --prompt ... --output ...` | 保存文件,stdout 返回绝对路径 |
|
|
238
|
+
|
|
239
|
+
从源码使用尚未发布的功能时,先在仓库中运行 `npm run build`,然后用
|
|
240
|
+
`node /绝对路径/agent-vision/dist/cli.js generate ...` 运行 CLI。
|
|
241
|
+
本地 MCP 配置也可使用 `command: "node"`、`args: ["/绝对路径/agent-vision/dist/cli.js"]`,
|
|
242
|
+
不要加 `generate` 参数,无子命令时即启动 MCP stdio 服务。
|
|
129
243
|
|
|
130
244
|
## CLI
|
|
131
245
|
|
|
@@ -136,9 +250,18 @@ npx -y @yanickxia/agent-vision image ./screenshot.png \
|
|
|
136
250
|
npx -y @yanickxia/agent-vision video ./demo.mp4 \
|
|
137
251
|
--prompt "按时间顺序总结 UI 操作" --frames 8
|
|
138
252
|
|
|
253
|
+
npx -y @yanickxia/agent-vision generate \
|
|
254
|
+
--prompt "一只坐在窗边的橘猫,水彩风格" --output ./cat.png --size 1024x1024
|
|
255
|
+
|
|
139
256
|
npx -y @yanickxia/agent-vision doctor
|
|
140
257
|
```
|
|
141
258
|
|
|
259
|
+
`generate` 必须提供 `--prompt`(或一个带引号的位置参数)和 `--output`。
|
|
260
|
+
可选 `--size` 原样传给生图 API;`--quality` 仅用于 OpenAI-compatible 协议。
|
|
261
|
+
省略时采用 provider 默认值,支持值取决于模型。
|
|
262
|
+
输出文件的父目录必须存在,已有文件不会被覆盖;成功时 stdout 输出保存的绝对路径。
|
|
263
|
+
图片保留 API 返回的实际格式,不会因输出文件的扩展名而转码。
|
|
264
|
+
|
|
142
265
|
## MCP 工具
|
|
143
266
|
|
|
144
267
|
### `analyze_image`
|
|
@@ -166,12 +289,28 @@ npx -y @yanickxia/agent-vision doctor
|
|
|
166
289
|
`max_frames` 范围 1–16,默认 8。实现会均匀抽取 JPEG 帧,并带时间点一起发给
|
|
167
290
|
模型。它不是逐帧转写,快速变化可能被漏掉。
|
|
168
291
|
|
|
292
|
+
### `generate_image`
|
|
293
|
+
|
|
294
|
+
```json
|
|
295
|
+
{
|
|
296
|
+
"prompt": "一只坐在窗边的橘猫,水彩风格",
|
|
297
|
+
"output_path": "/absolute/path/to/cat.png",
|
|
298
|
+
"size": "1024x1024"
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
只有 `prompt` 必填。`output_path` 可选,不传时仅返回 MCP 图片内容,不写本地文件。
|
|
303
|
+
`size`、`quality` 可选。返回一个 text 内容块(JSON 元数据:模型、MIME 类型、字节数、
|
|
304
|
+
可选输出路径和上游改写的 prompt)以及一个 image 内容块。路径是 MCP Server 所在机器上的路径。
|
|
305
|
+
|
|
169
306
|
## 隐私与安全
|
|
170
307
|
|
|
171
308
|
- 图片会发送到你配置的视觉 API。
|
|
309
|
+
- 生图 prompt 会发送到你配置的生图 API;如果上游返回图片 URL,会下载该图片,但不会向图片下载地址转发生图 API key 或自定义请求头。
|
|
172
310
|
- 视频不会整体发给模型;远程视频先下载到本地临时目录,然后只发送抽出的 JPEG 帧。
|
|
173
311
|
- 临时目录在成功或失败后都会删除。
|
|
174
|
-
- 用户提供的远程图片/视频 URL 默认拒绝 localhost、私网、链路本地和云元数据地址。
|
|
312
|
+
- 用户提供的远程图片/视频 URL 和上游返回的生图 URL 默认拒绝 localhost、私网、链路本地和云元数据地址。
|
|
313
|
+
- 生图失败会删除本次预留的输出文件;成功的生图文件会保留,不会作为临时文件清理。
|
|
175
314
|
- stdio 模式不向 stdout 写日志,避免破坏 MCP 协议。
|
|
176
315
|
|
|
177
316
|
## 开发
|
package/dist/analyze.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAS7E,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAQ5B;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAe5B"}
|
package/dist/analyze.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { loadConfig } from "./config.js";
|
|
2
2
|
import { loadImage } from "./image.js";
|
|
3
|
-
import {
|
|
3
|
+
import { raceVisionCompletions } from "./provider.js";
|
|
4
4
|
import { extractVideoFrames } from "./video.js";
|
|
5
5
|
const DEFAULT_IMAGE_PROMPT = "Describe this image accurately. Include visible text, layout, objects, colors, and details relevant to understanding it. Do not invent details that are not visible.";
|
|
6
6
|
const DEFAULT_VIDEO_PROMPT = "Analyze these evenly sampled video frames as one timeline. Describe the sequence of events, scene or UI changes, actions, and visible text. Distinguish observations from uncertainty.";
|
|
7
7
|
export async function analyzeImage(options) {
|
|
8
8
|
const config = options.config ?? loadConfig();
|
|
9
9
|
const image = await loadImage(options.source, config);
|
|
10
|
-
return
|
|
10
|
+
return raceVisionCompletions({
|
|
11
11
|
config,
|
|
12
12
|
prompt: options.prompt?.trim() || DEFAULT_IMAGE_PROMPT,
|
|
13
13
|
images: [{ dataUrl: image.dataUrl, label: image.label }],
|
|
@@ -21,7 +21,7 @@ export async function analyzeVideo(options) {
|
|
|
21
21
|
config,
|
|
22
22
|
});
|
|
23
23
|
const userPrompt = options.prompt?.trim();
|
|
24
|
-
return
|
|
24
|
+
return raceVisionCompletions({
|
|
25
25
|
config,
|
|
26
26
|
prompt: userPrompt
|
|
27
27
|
? `${DEFAULT_VIDEO_PROMPT}\n\nUser question: ${userPrompt}`
|
package/dist/analyze.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../src/analyze.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAyB,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,oBAAoB,GACxB,sKAAsK,CAAC;AAEzK,MAAM,oBAAoB,GACxB,wLAAwL,CAAC;AAE3L,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAIlC;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,qBAAqB,CAAC;QAC3B,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,oBAAoB;QACtD,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;KACzD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAKlC;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,CAAC;QACjC,MAAM;KACP,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1C,OAAO,qBAAqB,CAAC;QAC3B,MAAM;QACN,MAAM,EAAE,UAAU;YAChB,CAAC,CAAC,GAAG,oBAAoB,sBAAsB,UAAU,EAAE;YAC3D,CAAC,CAAC,oBAAoB;QACxB,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;AACL,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { parseArgs } from "node:util";
|
|
2
3
|
import { analyzeImage, analyzeVideo } from "./analyze.js";
|
|
3
4
|
import { loadConfig } from "./config.js";
|
|
4
5
|
import { errorMessage } from "./errors.js";
|
|
6
|
+
import { generateImage } from "./generate.js";
|
|
5
7
|
import { SERVER_VERSION, startStdioServer } from "./server.js";
|
|
6
8
|
import { ensureFfmpeg } from "./video.js";
|
|
7
9
|
const HELP = `agent-vision ${SERVER_VERSION}
|
|
@@ -10,11 +12,15 @@ Usage:
|
|
|
10
12
|
agent-vision Start the MCP stdio server
|
|
11
13
|
agent-vision image <source> [options]
|
|
12
14
|
agent-vision video <source> [options]
|
|
15
|
+
agent-vision generate --prompt <text> --output <path> [options]
|
|
13
16
|
agent-vision doctor
|
|
14
17
|
|
|
15
18
|
Options:
|
|
16
|
-
-p, --prompt <text>
|
|
19
|
+
-p, --prompt <text> Analysis question or image generation prompt
|
|
17
20
|
--frames <1-16> Video frames to sample (default: 8)
|
|
21
|
+
-o, --output <path> Save generated image (must not exist)
|
|
22
|
+
--size <value> Generation size, e.g. 1024x1024 or Ark 2K
|
|
23
|
+
--quality <value> OpenAI-compatible quality (not supported by Ark)
|
|
18
24
|
-h, --help Show help
|
|
19
25
|
-v, --version Show version
|
|
20
26
|
`;
|
|
@@ -44,22 +50,72 @@ async function runCli(args) {
|
|
|
44
50
|
const config = loadConfig();
|
|
45
51
|
let ffmpeg = "unavailable";
|
|
46
52
|
try {
|
|
47
|
-
ffmpeg = await ensureFfmpeg();
|
|
53
|
+
ffmpeg = await ensureFfmpeg(config.ffmpegPath);
|
|
48
54
|
}
|
|
49
55
|
catch {
|
|
50
56
|
// Report below without failing before the full doctor output is printed.
|
|
51
57
|
}
|
|
52
|
-
const
|
|
53
|
-
`
|
|
54
|
-
`base URL: ${config.baseUrl}`,
|
|
55
|
-
`API key: ${config.apiKey ? "configured" : "not configured (allowed for local endpoints)"}`,
|
|
56
|
-
`ffmpeg: ${ffmpeg}`,
|
|
58
|
+
const lines = [
|
|
59
|
+
`config file: ${config.configFile ?? "not found (using environment variables)"}`,
|
|
57
60
|
];
|
|
58
|
-
|
|
59
|
-
|
|
61
|
+
if (config.targets.length === 0) {
|
|
62
|
+
lines.push("targets: none configured");
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
lines.push("targets:");
|
|
66
|
+
config.targets.forEach((target, index) => {
|
|
67
|
+
lines.push(` ${index + 1}. ${target.label} ${target.baseUrl} key: ${target.apiKey ? "configured" : "not configured"}`);
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (config.generationTargets.length === 0) {
|
|
71
|
+
lines.push("generation targets: none configured (optional)");
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
lines.push("generation targets (sequential fallback):");
|
|
75
|
+
config.generationTargets.forEach((target, index) => {
|
|
76
|
+
lines.push(` ${index + 1}. ${target.label} ${target.baseUrl} key: ${target.apiKey ? "configured" : "not configured"} type: ${target.type ?? "openai-images"}`);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
lines.push(`ffmpeg: ${ffmpeg}`);
|
|
80
|
+
process.stdout.write(`${lines.join("\n")}\n`);
|
|
81
|
+
if ((config.targets.length === 0 && config.generationTargets.length === 0) ||
|
|
82
|
+
(config.targets.length > 0 && ffmpeg === "unavailable"))
|
|
60
83
|
process.exitCode = 1;
|
|
61
84
|
return;
|
|
62
85
|
}
|
|
86
|
+
if (command === "generate") {
|
|
87
|
+
const { values, positionals } = parseArgs({
|
|
88
|
+
args: args.slice(1),
|
|
89
|
+
allowPositionals: true,
|
|
90
|
+
options: {
|
|
91
|
+
prompt: { type: "string", short: "p" },
|
|
92
|
+
output: { type: "string", short: "o" },
|
|
93
|
+
size: { type: "string" },
|
|
94
|
+
quality: { type: "string" },
|
|
95
|
+
help: { type: "boolean", short: "h" },
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
if (values.help) {
|
|
99
|
+
process.stdout.write(HELP);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (positionals.length > 1 || (positionals.length > 0 && values.prompt !== undefined)) {
|
|
103
|
+
throw new Error("generate accepts one prompt, either positional or via --prompt");
|
|
104
|
+
}
|
|
105
|
+
const prompt = values.prompt ?? positionals[0];
|
|
106
|
+
if (!prompt?.trim())
|
|
107
|
+
throw new Error("generate requires --prompt <text>");
|
|
108
|
+
if (!values.output?.trim())
|
|
109
|
+
throw new Error("generate requires --output <path>");
|
|
110
|
+
const result = await generateImage({
|
|
111
|
+
prompt,
|
|
112
|
+
outputPath: values.output,
|
|
113
|
+
...(values.size !== undefined ? { size: values.size } : {}),
|
|
114
|
+
...(values.quality !== undefined ? { quality: values.quality } : {}),
|
|
115
|
+
});
|
|
116
|
+
process.stdout.write(`${result.outputPath}\n`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
63
119
|
if (command !== "image" && command !== "video") {
|
|
64
120
|
throw new Error(`Unknown command: ${command}\n\n${HELP}`);
|
|
65
121
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,IAAI,GAAG,gBAAgB,cAAc
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,17 +1,31 @@
|
|
|
1
|
-
export interface
|
|
2
|
-
|
|
3
|
-
baseUrl: string;
|
|
1
|
+
export interface ModelTarget {
|
|
2
|
+
label: string;
|
|
4
3
|
model: string;
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
apiKey?: string;
|
|
6
|
+
headers: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export type GenerationProviderType = "openai-images" | "volcengine-ark";
|
|
9
|
+
export interface GenerationTarget extends ModelTarget {
|
|
10
|
+
type?: GenerationProviderType;
|
|
11
|
+
}
|
|
12
|
+
export declare const VOLCENGINE_ARK_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3";
|
|
13
|
+
export interface VisionConfig {
|
|
14
|
+
targets: ModelTarget[];
|
|
15
|
+
generationTargets: GenerationTarget[];
|
|
16
|
+
configFile?: string;
|
|
5
17
|
maxTokens: number;
|
|
6
18
|
timeoutMs: number;
|
|
7
19
|
headers: Record<string, string>;
|
|
8
20
|
maxImageBytes: number;
|
|
9
21
|
maxVideoBytes: number;
|
|
10
22
|
allowPrivateUrls: boolean;
|
|
23
|
+
ffmpegPath?: string;
|
|
11
24
|
}
|
|
12
25
|
type Environment = Record<string, string | undefined>;
|
|
13
|
-
export
|
|
14
|
-
export declare function
|
|
26
|
+
export type SettingsReader = (filePath: string) => string | undefined;
|
|
27
|
+
export declare function loadConfig(env?: Environment, readSettings?: SettingsReader): VisionConfig;
|
|
15
28
|
export declare function chatCompletionsUrl(baseUrl: string): string;
|
|
29
|
+
export declare function imageGenerationsUrl(baseUrl: string): string;
|
|
16
30
|
export {};
|
|
17
31
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,sBAAsB,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAExE,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IAEnD,IAAI,CAAC,EAAE,sBAAsB,CAAC;CAC/B;AAED,eAAO,MAAM,uBAAuB,6CAA6C,CAAC;AAElF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA0BD,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEtD,MAAM,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAmOtE,wBAAgB,UAAU,CACxB,GAAG,GAAE,WAAyB,EAC9B,YAAY,GAAE,cAAsC,GACnD,YAAY,CAsId;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|