museav-cli 2.0.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/.github/workflows/ci.yml +19 -0
- package/.github/workflows/publish.yml +79 -0
- package/AGENTS.md +90 -0
- package/CHANGELOG.md +49 -0
- package/LICENSE +21 -0
- package/README.md +490 -0
- package/SECURITY.md +11 -0
- package/dist/client.d.ts +387 -0
- package/dist/client.js +372 -0
- package/dist/commands/assets.d.ts +14 -0
- package/dist/commands/assets.js +30 -0
- package/dist/commands/balance.d.ts +3 -0
- package/dist/commands/balance.js +11 -0
- package/dist/commands/bind-feishu.d.ts +3 -0
- package/dist/commands/bind-feishu.js +63 -0
- package/dist/commands/gen.d.ts +16 -0
- package/dist/commands/gen.js +88 -0
- package/dist/commands/image-to-template.d.ts +24 -0
- package/dist/commands/image-to-template.js +111 -0
- package/dist/commands/jobs.d.ts +11 -0
- package/dist/commands/jobs.js +27 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.js +67 -0
- package/dist/commands/models.d.ts +3 -0
- package/dist/commands/models.js +9 -0
- package/dist/commands/products.d.ts +9 -0
- package/dist/commands/products.js +16 -0
- package/dist/commands/reverse.d.ts +3 -0
- package/dist/commands/reverse.js +16 -0
- package/dist/commands/skills.d.ts +5 -0
- package/dist/commands/skills.js +22 -0
- package/dist/commands/templates.d.ts +28 -0
- package/dist/commands/templates.js +79 -0
- package/dist/commands/upload.d.ts +9 -0
- package/dist/commands/upload.js +8 -0
- package/dist/commands/video-templates.d.ts +21 -0
- package/dist/commands/video-templates.js +71 -0
- package/dist/commands/welcome.d.ts +6 -0
- package/dist/commands/welcome.js +93 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.js +14 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.js +93 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +292 -0
- package/dist/tenant-client.d.ts +31 -0
- package/dist/tenant-client.js +84 -0
- package/package.json +55 -0
- package/src/client.ts +636 -0
- package/src/commands/assets.ts +47 -0
- package/src/commands/balance.ts +12 -0
- package/src/commands/bind-feishu.ts +77 -0
- package/src/commands/gen.ts +111 -0
- package/src/commands/image-to-template.ts +150 -0
- package/src/commands/jobs.ts +37 -0
- package/src/commands/login.ts +80 -0
- package/src/commands/models.ts +12 -0
- package/src/commands/products.ts +38 -0
- package/src/commands/reverse.ts +21 -0
- package/src/commands/skills.ts +29 -0
- package/src/commands/templates.ts +98 -0
- package/src/commands/upload.ts +18 -0
- package/src/commands/video-templates.ts +89 -0
- package/src/commands/welcome.ts +108 -0
- package/src/commands/whoami.ts +19 -0
- package/src/config.ts +114 -0
- package/src/index.ts +318 -0
- package/src/tenant-client.ts +90 -0
- package/src/types/update-notifier.d.ts +31 -0
- package/tsconfig.json +19 -0
package/README.md
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<img src="https://museav.top/logo.svg" alt="studio" width="72" />
|
|
4
|
+
|
|
5
|
+
# museav(`museav-cli`)
|
|
6
|
+
|
|
7
|
+
[](https://www.npmjs.com/package/museav-cli)
|
|
8
|
+
[](./LICENSE)
|
|
9
|
+
[](package.json)
|
|
10
|
+
[](https://github.com/webkubor/museav-cli/actions/workflows/ci.yml)
|
|
11
|
+
|
|
12
|
+
**Agent-ready** — designed to be shelled out to directly, not just used by humans
|
|
13
|
+
|
|
14
|
+
[](https://github.com/webkubor/museav-cli/blob/main/AGENTS.md)
|
|
15
|
+
[](https://github.com/webkubor/museav-cli/blob/main/AGENTS.md)
|
|
16
|
+
[](https://github.com/webkubor/museav-cli/blob/main/AGENTS.md)
|
|
17
|
+
[](https://github.com/webkubor/museav-cli/blob/main/AGENTS.md)
|
|
18
|
+
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
> 命令行出图,一行配置就能用。背后的 [MUSE AV 中台](https://museav.top) 帮你搞定模型、密钥、路由、记账——你只管 prompt。
|
|
22
|
+
|
|
23
|
+
`museav` 是 [MUSE AV 出图中台](https://museav.top)(原 studio,API 走 [manager.museav.top](https://manager.museav.top))的命令行客户端。装上它,登录(或配一个 apiKey),就能在终端里出图、逆向、图生图。给 Agent 用的详细说明见 [AGENTS.md](./AGENTS.md)。
|
|
24
|
+
|
|
25
|
+
> ### ⚠️ 改名了:包名 → `museav-cli`,命令 → `museav`
|
|
26
|
+
>
|
|
27
|
+
> 产品叫 MUSE AV,命令却叫另一个名字,同一个东西两个叫法。现在统一到产品名:
|
|
28
|
+
>
|
|
29
|
+
> ```bash
|
|
30
|
+
> npm uninstall -g @kubor/studio-cli # 卸掉旧包(旧命令),否则两个命令并存
|
|
31
|
+
> npm install -g museav-cli # 装新包,命令名是 museav
|
|
32
|
+
> ```
|
|
33
|
+
>
|
|
34
|
+
> - **命令名**:把脚本/CI 里的旧命令全部换成 `museav xxx`,参数和行为一模一样。
|
|
35
|
+
> - **配置文件**:新路径 `~/.museav.json`。旧路径的配置**仍会被自动读取**,不用重新 login,也不用再找一次 apiKey;下次 `config` / `login` 写入时自动落到新路径。
|
|
36
|
+
> - **环境变量**:`STUDIO_API_KEY` / `STUDIO_BASE_URL` 继续有效,同时新增等价的 `MUSEAV_API_KEY` / `MUSEAV_BASE_URL`(新名优先)。
|
|
37
|
+
> - **当库用**:`import { StudioClient } from 'museav-cli'`(类名不变)。
|
|
38
|
+
> - **自报身份头**:新增 `X-Museav-Client`,旧的 `X-Studio-Client` 过渡期继续发,两个值都是 `museav-cli/<version>`。
|
|
39
|
+
> - 旧包停止更新,只会留一条 deprecate 提示指向这里。
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 我该用这个吗?(先看这段,别猜)
|
|
44
|
+
|
|
45
|
+
**适合你,如果**:
|
|
46
|
+
- 你想在终端里随手出一张图,不想开浏览器
|
|
47
|
+
- 你在写脚本/自动化任务,需要程序化出图(比如批量生成、定时任务)
|
|
48
|
+
- 你是个 Agent(Claude Code / Codex / Hermes 等),被要求帮用户出图
|
|
49
|
+
|
|
50
|
+
**不适合你,如果你在做一个真正的产品/网站**:这个 CLI 是给终端用的,**不是** SDK 或后端集成方案。举个真实例子——好易美的 `hym-admin`(一个跑在 Cloudflare Pages Functions 上的业务后台)需要出图能力时,走的是两条路,都跟这个 CLI 无关:
|
|
51
|
+
1. 人要用完整界面 → 用 SSO 直接内嵌 [MUSE AV 网页版](https://museav.top)(iframe,登录态自动同步)
|
|
52
|
+
2. 后端要程序化调用 → 直接 `fetch('https://manager.museav.top/api/generate', { headers: { 'X-API-Key': ... } })`,或者 `import { StudioClient } from 'museav-cli'` 当库用
|
|
53
|
+
|
|
54
|
+
**这不是随便选的**:Cloudflare Pages Functions/Workers 这类边缘运行时压根不能起子进程,`museav` 这个 CLI 二进制在那种环境里根本跑不起来。做产品集成,永远是调 HTTP API 或者拿 `StudioClient` 当库导入;CLI 是给"人在终端里"或"agent 跑 shell 命令"这两个场景用的,别的地方用不上也不该用。
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 这是什么?为什么要用它?
|
|
59
|
+
|
|
60
|
+
如果你做过 AI 出图,一定踩过这些坑:
|
|
61
|
+
|
|
62
|
+
- 上游模型 key 要自己申请、自己充值、自己保管
|
|
63
|
+
- gpt-image / 豆包 / 各家 API 格式不一样,得分别对接
|
|
64
|
+
- 某家挂了要手动切备用,限流要自己处理
|
|
65
|
+
- 成本要自己算、自己记账
|
|
66
|
+
|
|
67
|
+
**studio 中台把这些全包了。** 它是一个部署在 Cloudflare 上的出图能力服务,对外暴露统一的 HTTP API:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
你(个人 login / 租户 apiKey) studio 中台
|
|
71
|
+
│ │
|
|
72
|
+
├── 一个凭证(token 或 apiKey)───►│ 鉴权
|
|
73
|
+
├── prompt + 宽高比 ──────────────►│ 选模型 + 调上游 + 容错 + 记账
|
|
74
|
+
◄── 图片 URL ──────────────────────│
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
你永远不用接触上游 key,也不用关心用的哪个模型(除非你想指定)。
|
|
78
|
+
|
|
79
|
+
`museav` 这个 CLI 就是这套能力的命令行封装,**服务两类不同的使用者,鉴权方式也不一样**:
|
|
80
|
+
|
|
81
|
+
| 你是谁 | 怎么鉴权 | 适合场景 |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| **平台用户**——用中台网页版的个人账号 | `museav login`(网页登录,个人 JWT,7 天有效) | 自己出图、写个人脚本、agent 场景——你本人在用 |
|
|
84
|
+
| **租户**——要把出图能力接进自己的产品/服务对外提供 | apiKey(`sk-studio-xxx`,中台「租户管理」申请) | 服务端长期程序化调用、CI——代表一个"服务"在调,不依赖某个人的登录态 |
|
|
85
|
+
|
|
86
|
+
两条路径互不依赖,选跟你身份匹配的那条,不用两个都配。下面「快速开始」走的是平台用户(login)这条路;如果你是租户,直接跳到下面「B 端 / CI 场景」那一节。
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 快速开始
|
|
91
|
+
|
|
92
|
+
### 1. 安装
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# 从 npm 安装(推荐)
|
|
96
|
+
npm install -g museav-cli
|
|
97
|
+
|
|
98
|
+
# 或从 GitHub 全局安装
|
|
99
|
+
npm install -g github:webkubor/museav-cli
|
|
100
|
+
|
|
101
|
+
# 或克隆后本地构建
|
|
102
|
+
git clone https://github.com/webkubor/museav-cli.git
|
|
103
|
+
cd museav-cli && npm install && npm run build && npm link
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
要求 Node.js >= 20.19。
|
|
107
|
+
|
|
108
|
+
### 2. 登录
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
museav login
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
终端会显示一个验证码和链接,在浏览器打开链接、登录你的 [MUSE AV](https://museav.top) 账号、点批准,CLI 自动完成登录。登录态存到 `~/.museav.json`,7 天有效,过期重新 login 即可。
|
|
115
|
+
|
|
116
|
+
> **没有账号?** 这里说的是**平台用户的个人账号**(浏览器注册即可),跟下面「租户」的 apiKey 申请是两码事,不要混。先到 [museav.top](https://museav.top) 注册个人账号,再回来 login。
|
|
117
|
+
|
|
118
|
+
### 3. 出图
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
museav gen --prompt '演唱会海报,霓虹灯,赛博朋克'
|
|
122
|
+
# ✅ stdout 输出: https://img.webkubor.online/xxx.png
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
就这么简单。第一张图就这么出来了。
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### B 端 / CI 场景:用 apikey 代替登录
|
|
130
|
+
|
|
131
|
+
**这是租户走的路径**,跟上面平台用户的个人 login 是不同身份、不同鉴权:你在给自己的产品/服务接入出图能力,代表的是一个"服务"而不是某个登录的人,所以用 apikey,不需要也不应该用个人登录态。CI 环境同理(没有浏览器,走不了 login 那套授权):
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# 方式一:config 命令存到本地
|
|
135
|
+
museav config --apiKey sk-studio-xxx
|
|
136
|
+
|
|
137
|
+
# 方式二:环境变量(CI 友好,优先级最高)
|
|
138
|
+
export STUDIO_API_KEY=sk-studio-xxx
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
apikey(业务中台服务 key,统一形态 `sk-studio-<24位>`) 从中台「租户管理」获取,适合脚本/服务长期使用。
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## 完整用法
|
|
146
|
+
|
|
147
|
+
### 出图 `gen`
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# 基本出图
|
|
151
|
+
museav gen --prompt '一只在月球上的猫'
|
|
152
|
+
|
|
153
|
+
# 宽高比(不指定则纯 prompt 模式兜底 3:4;--skill/--template 模式默认用技能/模板自己的比例)
|
|
154
|
+
museav gen --prompt '海报' --ratio 9:16 # 可选: 3:4 / 9:16 / 1:1 / 4:3 / 16:9
|
|
155
|
+
|
|
156
|
+
# 指定模型(不指定则中台自动选最优)
|
|
157
|
+
museav gen --prompt '...' --model gpt-image-2
|
|
158
|
+
|
|
159
|
+
# 质量(仅 gpt-image 生效)
|
|
160
|
+
museav gen --prompt '...' --quality high
|
|
161
|
+
|
|
162
|
+
# 图生图(自动上传垫图,保持人物面容)
|
|
163
|
+
museav gen --prompt '保持面容,换成西装' --ref face.png
|
|
164
|
+
|
|
165
|
+
# 文生视频(模型如 seedance-2-fast / artsdance-2-0-pro-260801,自动轮询直到完成)
|
|
166
|
+
museav gen --video --prompt '一只橘猫在窗台上伸懒腰,阳光洒进来,电影感' --model seedance-2-fast --ratio 9:16
|
|
167
|
+
|
|
168
|
+
# 图生视频(--image 传首帧图,自动上传)
|
|
169
|
+
museav gen --video --image logo.png --prompt 'logo 缓缓发光,背景渐暗' --ratio 1:1
|
|
170
|
+
|
|
171
|
+
# 管道用法:拿到 URL 存变量
|
|
172
|
+
URL=$(museav gen --prompt '海报')
|
|
173
|
+
curl -o poster.png "$URL"
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 用图片模板出图 `gen --template`
|
|
177
|
+
|
|
178
|
+
图片模板是提前配置好的提示词模板(可能带占位符),跟 `--skill` 是同一种"黑盒展开"哲学——
|
|
179
|
+
提示词正文在服务端展开、不下发——区别是模板走**确定性字符串替换**,不经 chat 模型,没有 chat 成本;
|
|
180
|
+
`--skill` 是让模型根据一句业务描述自由发挥。
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
# 先查有哪些模板(自己租户建的 + 平台共享的)
|
|
184
|
+
museav templates
|
|
185
|
+
museav templates --category 电商白底图 # 按分类过滤
|
|
186
|
+
|
|
187
|
+
# 没有占位符的模板,直接用
|
|
188
|
+
museav gen --template <模板id>
|
|
189
|
+
|
|
190
|
+
# 带占位符的模板,用 --fields 传 JSON 补齐
|
|
191
|
+
museav gen --template <模板id> --fields '{"artist":"王嘉尔","city":"南京"}'
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
`templates` 命令的输出里,模板名后面跟着的"字段:xxx"就是需要传给 `--fields` 的 key。
|
|
195
|
+
|
|
196
|
+
### 新建图片模板 `templates create`
|
|
197
|
+
|
|
198
|
+
> 2026-08-10 新增。之前只能网页后台建模板,纯命令行/脚本化场景(比如没人会去点网页,或者
|
|
199
|
+
> 想批量导入一批固定套路)建不了新模板,只能靠每次手写 `--prompt`——但这满足不了"同一种图、
|
|
200
|
+
> 反复出、风格锁死"的固定业务场景。这个命令补上了这条路。
|
|
201
|
+
|
|
202
|
+
**归属不用自己传,账号身份自动决定**:租户 apiKey 建的模板自动归该租户(其他租户看不到);
|
|
203
|
+
平台管理员账号建的是 `tenant_id` 为空的平台共享模板(所有租户可见);个人账号(未登录成租户、
|
|
204
|
+
也不是管理员)会被服务端拒绝——这条权限规则在服务端强制执行,CLI 这层不做也不能绕过。
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
# 占位符用 {key} 形式,不传 --fields 会自动从 --prompt 里提取
|
|
208
|
+
museav templates create \
|
|
209
|
+
--name "演唱会巡演海报" \
|
|
210
|
+
--prompt "{artist} 在 {city} 的演唱会巡演海报,聚光灯氛围" \
|
|
211
|
+
--category 演唱会 \
|
|
212
|
+
--ratio 9:16
|
|
213
|
+
|
|
214
|
+
# 想要更友好的中文字段标签,自己传 --fields 覆盖自动提取的结果
|
|
215
|
+
museav templates create \
|
|
216
|
+
--name "产品白底图" \
|
|
217
|
+
--prompt "{product} 电商白底图,纯白背景,正面视角" \
|
|
218
|
+
--fields '[{"key":"product","label":"产品名称"}]'
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
stdout 输出新建模板的 id,可以直接接 `gen --template`:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
ID=$(museav templates create --name "..." --prompt "...")
|
|
225
|
+
museav gen --template "$ID" --fields '{"artist":"..."}'
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### 图片逆向 `reverse`
|
|
229
|
+
|
|
230
|
+
上传一张图,中台用 **SCULPT 六要素**(主体/构图/世界观/光影/输出/质感)逆推出图 prompt,可以直接拿去再出一张同风格的:
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
# 本地文件或图片 URL 都行
|
|
234
|
+
museav reverse photo.png
|
|
235
|
+
museav reverse https://example.com/photo.png
|
|
236
|
+
|
|
237
|
+
# 逆向 + 出图,一条龙
|
|
238
|
+
museav gen --prompt "$(museav reverse photo.png)"
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
分析详情打到 stderr(人看),**stdout 只输出英文 prompt**(机器用,方便管道)。
|
|
242
|
+
|
|
243
|
+
`reverse` **只读图**,不会顺手帮你建模板。要把图做成模板看下一节——中台 2026-08-16 把这两件事
|
|
244
|
+
拆成了两个接口,`reverse` 现在收到任何模板类参数都会直接报错,不会静默忽略。
|
|
245
|
+
|
|
246
|
+
### 图生模板 `image-to-template`
|
|
247
|
+
|
|
248
|
+
看中一张图,想以后只改几个字就批量出同款?这个命令把它做成模具:读图(SCULPT)+ **文字层逆向**
|
|
249
|
+
(图上每处文字的角色/字体/字重/颜色/位置/处理效果)+ 变量化,最后建成一个图片模板,
|
|
250
|
+
**原图会被转存并焊进模板当参考图**——所以换了文字之后风格还能对得上。
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
# 最常用:一张图直接建成模板(异步,终端会按阶段打进度)
|
|
254
|
+
museav image-to-template poster.jpg
|
|
255
|
+
# 🔄 接收图片 → 解析图片 → 抽取文字层 → 创建模板
|
|
256
|
+
# stdout: 新模板的 id
|
|
257
|
+
|
|
258
|
+
# 只想先看看会做成什么样,不真的建(同步返回草稿,stdout 是完整 JSON)
|
|
259
|
+
museav image-to-template poster.jpg --no-create
|
|
260
|
+
|
|
261
|
+
# 指定模板名 / slug / 分类(slug 全局唯一,撞了直接报错,绝不覆盖已有模板)
|
|
262
|
+
museav image-to-template poster.jpg --name "暗金演唱会主视觉" --slug gala-2026 --category 海报
|
|
263
|
+
|
|
264
|
+
# 收窄变量白名单:只允许改这几个,模型不能自己发明别的
|
|
265
|
+
museav image-to-template poster.jpg --variables title,subject,location
|
|
266
|
+
|
|
267
|
+
# 变量 key 是中台通用语义,展示成你自己的业务叫法用 --labels
|
|
268
|
+
museav image-to-template poster.jpg --labels '{"subject":"艺人","location":"城市"}'
|
|
269
|
+
|
|
270
|
+
# 图片 URL 也行
|
|
271
|
+
museav image-to-template https://example.com/poster.jpg
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
建完直接就能用:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
ID=$(museav image-to-template poster.jpg)
|
|
278
|
+
museav gen --template "$ID" --fields '{"title":"新的主标题"}'
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
几个容易踩的点:
|
|
282
|
+
|
|
283
|
+
- **变量 key 是固定白名单**(`title` / `subtitle` / `subject` / `date` / `location` / `watermark` /
|
|
284
|
+
`body` / `cta` / `style`),是通用语义不是某一家的业务词。你的叫法用 `--labels` 映射到表单显示名,
|
|
285
|
+
key 本身不变——这样同一套模板换个业务也能读懂。
|
|
286
|
+
- **建模板要租户 key 或平台管理员身份**。发给成员的个人账户 key 打不到这个能力(建模板是往组织的
|
|
287
|
+
模板库里添资产,跟出图不是一回事),这种情况下读图结果照常返回,只是模板建不成并说明原因。
|
|
288
|
+
- **降级不是失败**:文字层逆向 / 变量化 / 建模板任一步出问题,读图结果(SCULPT、prompt)照常给你,
|
|
289
|
+
只是没有模具。命令会明确告诉你卡在哪一步。
|
|
290
|
+
|
|
291
|
+
### 上传素材 `upload`
|
|
292
|
+
|
|
293
|
+
图片、音频、视频都能传,中台按**文件字节内容**判类型(不看扩展名,也不信客户端声明的 MIME),
|
|
294
|
+
返回公网直链:
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
museav upload face.png
|
|
298
|
+
# stdout: https://img.webkubor.online/refs/...
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
大小上限按类型分:图片 8MB / 音频 20MB / 视频 50MB;认不出类型的文件会被拒绝。
|
|
302
|
+
拿到的 URL 可以直接喂给 `gen --ref`、`gen --video --image`,或当作 `reverse` /
|
|
303
|
+
`image-to-template` 的图片 URL 入参。
|
|
304
|
+
|
|
305
|
+
> `gen --ref` / `gen --video --image` 内部已经自动帮你上传了,不需要先手动跑一次 `upload`。
|
|
306
|
+
> 单独用 `upload` 的场景是:同一张垫图要复用多次,或者你想把 URL 存下来给别的系统用。
|
|
307
|
+
|
|
308
|
+
### 查模型 / 余额
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
museav models # 中台当前可用的模型
|
|
312
|
+
museav balance # 各上游余额
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 查自己名下的工作流 `jobs`
|
|
316
|
+
|
|
317
|
+
租户额外多一项能力:能查到**自己业务下**的出图工作流,不止是刚提交的那一个任务:
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
museav jobs # 最近 20 条
|
|
321
|
+
museav jobs --limit 50 # 最近 50 条(服务端上限就是 50,--limit 只能在这以内截取,查不到更早的历史)
|
|
322
|
+
museav jobs --status failed # 只看失败的(本地过滤,不是服务端查询)
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
范围自动跟着你用的凭证走,不用额外传租户/用户 id:个人 login 只看到自己出的图;租户 apiKey 看到的是这个租户名下的全部记录(不管是谁、哪个服务调用生成的)。stdout 输出完整 JSON 数组,方便接自己的后台统计。
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
### 查所属租户自己的产品 / 素材 `products` / `assets`
|
|
330
|
+
|
|
331
|
+
> 2026-08-10 新增,**仅租户 apiKey 身份可用**,个人 login 用不了。
|
|
332
|
+
|
|
333
|
+
这两个命令跟前面所有命令不一样:数据**不在** studio 中台,而在租户自己的后台(好易美是
|
|
334
|
+
`hym-admin`,mzmeso 是 `manager`)——产品/素材是各租户自己业务侧的数据,物理上存在他们
|
|
335
|
+
自己的数据库里,中台从不代理这部分数据。CLI 会直接调租户自己的域名,用你配置的同一把
|
|
336
|
+
`sk-studio-xxx`(业务中台服务 key)当凭证(这把 key 反正租户后台自己也存着一份用来倒过来调中台,
|
|
337
|
+
两边共用,不用再单独申请一把):
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
museav products # 查所属租户自己的产品目录
|
|
341
|
+
museav assets # 查所属租户自己的素材/资产库
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
已知已接入的租户(hym / mzmeso)用**旧格式 key**(`sk-studio-<租户名>-<24位>`)不用额外配置,CLI 内置了它们后台的域名;
|
|
345
|
+
统一形态新 key(`sk-studio-<24位>`)不带租户名,需要显式配置后台域名(其他租户/本地联调同理):
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
museav config --tenantBaseUrl https://your-tenant-backend.example.com
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**不是每个租户都两个命令都能用**:比如好易美是演唱会海报/票务业务,没有"产品"这个概念,
|
|
352
|
+
它的后台没开通 `tenant-products`,调 `products` 会报错——这是预期行为,不是 bug。
|
|
353
|
+
`assets` 的返回结构也没有强行统一:好易美是 `{ celebrity_materials, stickers }`,
|
|
354
|
+
mzmeso 是一个扁平数组,CLI 会按返回形状分别展示。
|
|
355
|
+
|
|
356
|
+
典型用法——配合 `gen --template` 做"选参考图 + 模板 组合出图":
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
IMG=$(museav products | node -e "process.stdin.once('data',d=>console.log(JSON.parse(d)[0].cover_image_url))")
|
|
360
|
+
museav gen --template <模板id> --ref "$IMG"
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
## 编程调用
|
|
364
|
+
|
|
365
|
+
CLI 背后是一个干净的 `StudioClient` class,也可以当库用:
|
|
366
|
+
|
|
367
|
+
```ts
|
|
368
|
+
import { StudioClient } from 'museav-cli'
|
|
369
|
+
|
|
370
|
+
// 方式一:用 login 拿到的 token(个人用户)
|
|
371
|
+
const studio = new StudioClient({
|
|
372
|
+
baseUrl: 'https://manager.museav.top',
|
|
373
|
+
token: process.env.STUDIO_TOKEN!, // 或从 ~/.museav.json 读
|
|
374
|
+
})
|
|
375
|
+
|
|
376
|
+
// 方式二:用 apikey(租户/B 端)
|
|
377
|
+
const studio2 = new StudioClient({
|
|
378
|
+
baseUrl: 'https://manager.museav.top',
|
|
379
|
+
apiKey: process.env.STUDIO_API_KEY!,
|
|
380
|
+
})
|
|
381
|
+
|
|
382
|
+
// 出图(自动轮询直到完成)
|
|
383
|
+
const job = await studio.generateAndWait({ prompt: '一只猫', ratio: '3:4' })
|
|
384
|
+
console.log(job.cdn_url)
|
|
385
|
+
|
|
386
|
+
// 图片逆向
|
|
387
|
+
const r = await studio.reverse({ file: 'photo.png' })
|
|
388
|
+
console.log(r.prompt_cn) // 中文 prompt
|
|
389
|
+
console.log(r.sculpt.light) // 光影分析
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## 命令一览
|
|
395
|
+
|
|
396
|
+
| 命令 | 用途 | stdout 输出 |
|
|
397
|
+
|------|------|------------|
|
|
398
|
+
| `login` | 登录(设备授权) | — |
|
|
399
|
+
| `logout` | 退出登录 | — |
|
|
400
|
+
| `whoami` | 查当前账户 + 租户归属(仅个人 login) | JSON |
|
|
401
|
+
| `gen` | 出图 / 出视频(`--prompt` / `--skill` / `--template` 三选一;`--video` 切视频,`--image` 图生视频) | 图片/视频 URL |
|
|
402
|
+
| `skills` | 查可用技能:私有 + 租户专属 + 公共库(配合 `gen --skill`) | slug 列表(每行一个) |
|
|
403
|
+
| `templates` | 查可用图片模板(配合 `gen --template`) | JSON |
|
|
404
|
+
| `templates create` | 新建图片模板,归属按账号身份自动关联租户 | 新模板 id |
|
|
405
|
+
| `products` | 查所属租户自己的产品目录(数据在租户自己后台,非中台;仅租户 apiKey) | JSON |
|
|
406
|
+
| `assets` | 查所属租户自己的素材/资产库(数据在租户自己后台,非中台;仅租户 apiKey) | JSON |
|
|
407
|
+
| `reverse <file\|url>` | 读图,反推 prompt(**只读图**,不建模板) | 英文 prompt |
|
|
408
|
+
| `image-to-template <file\|url>` | 图生模板:读图 + 文字层逆向 + 变量化 → 建成可复用图片模板 | 模板 id(`--no-create` 时是草稿 JSON) |
|
|
409
|
+
| `upload <file>` | 上传素材(图片/音频/视频) | 公网直链 |
|
|
410
|
+
| `models` | 可用模型 | 模型名列表 |
|
|
411
|
+
| `balance` | 上游余额 | JSON |
|
|
412
|
+
| `jobs` | 查自己(租户则是自己业务下)的工作流 | JSON 数组 |
|
|
413
|
+
| `config` | 配置中台(B 端 apikey,含 `--tenantBaseUrl`) | — |
|
|
414
|
+
|
|
415
|
+
**stdout 只输出最终结果**,进度信息走 stderr——方便脚本和管道集成。
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## 关于 studio 中台
|
|
420
|
+
|
|
421
|
+
[museav.top](https://museav.top)(API 走 [manager.museav.top](https://manager.museav.top))是一个**出图能力中台**:聚合多家上游图像模型(gpt-image、豆包 Seedream 等),统一成一套 API 对外开放。
|
|
422
|
+
|
|
423
|
+
**它解决的问题**:
|
|
424
|
+
|
|
425
|
+
| 你不用管 | 中台替你做 |
|
|
426
|
+
|---------|-----------|
|
|
427
|
+
| 上游 key 的申请/充值/保管 | 密钥只在中心,永不下发 |
|
|
428
|
+
| 各家 API 格式差异 | 一套统一的 OpenAI 兼容接口 |
|
|
429
|
+
| 某家挂了/限流 | 自动路由 + 容错 + 降级 |
|
|
430
|
+
| 算成本/记账 | 每次调用自动记账,可查余额和用量 |
|
|
431
|
+
| 选哪个模型 | 默认自动调度,也可指定 |
|
|
432
|
+
|
|
433
|
+
**适合谁用**(对应本文最开始那张鉴权对照表):
|
|
434
|
+
|
|
435
|
+
- **平台用户**:自己写自动化脚本/agent 需要命令行出图、个人多个项目想统一收口到一个能力服务——`museav login` 就够,不需要申请 apiKey
|
|
436
|
+
- **租户**:做 AI 产品的开发者,要把出图能力接进自己对外提供的产品/服务,不想碰上游细节——申请 apiKey,走服务端集成。租户还多一项平台用户没有的能力:`museav jobs` 能查到自己业务下全部的出图工作流(不止是当前这一个任务),方便对账/统计/排查
|
|
437
|
+
|
|
438
|
+
**接入方式**:平台用户直接 `museav login`;租户到中台「租户管理」注册拿 apiKey,装上这个 CLI(或直接调 API)用 `config --apiKey` / `STUDIO_API_KEY` 配置。具体配额和计费见中台后台。
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## 发布(维护者)
|
|
443
|
+
|
|
444
|
+
CI 已接管发布,本机不用再 `npm publish`:
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
npm version patch # 或 minor / major,会自动打好 v* tag
|
|
448
|
+
git push --follow-tags # 推 tag 触发 .github/workflows/publish.yml
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
workflow 会跑 typecheck → build → 版本号与 tag 一致性校验 → 冒烟测试(`--version` / `--help`)→ 带
|
|
452
|
+
[provenance](https://docs.npmjs.com/generating-provenance-statements) 发布。
|
|
453
|
+
|
|
454
|
+
认证两种选一种,选好后 workflow 文件不用改:
|
|
455
|
+
|
|
456
|
+
| 方式 | 怎么配 | 说明 |
|
|
457
|
+
|---|---|---|
|
|
458
|
+
| **Trusted Publishing**(推荐) | npmjs.com → 本包 Settings → Trusted Publisher 绑定本仓库 + workflow 文件名 `publish.yml`;**不要**设 `NPM_TOKEN` | 走 OIDC,无 token、不受 2FA 影响、不会过期 |
|
|
459
|
+
| **NPM_TOKEN** | 建 Granular token(Read and write,范围勾 `@kubor` scope 或 All packages)→ 存仓库 Secrets 的 `NPM_TOKEN` | 兜底方案。**别只勾单个包**——那样能 deprecate 却发不了新包 |
|
|
460
|
+
|
|
461
|
+
本机手动发布(应急):账号 2FA 若为 `auth-and-writes`,每次 publish 都要 OTP;
|
|
462
|
+
`npm profile set twofa auth-only` 之后只有登录才要。
|
|
463
|
+
|
|
464
|
+
## License
|
|
465
|
+
|
|
466
|
+
MIT
|
|
467
|
+
|
|
468
|
+
## 发布(维护者专用)
|
|
469
|
+
|
|
470
|
+
正式发布**必须走 v tag**(触发 GitHub Actions `publish.yml`),不要本地 `npm publish`:
|
|
471
|
+
|
|
472
|
+
```bash
|
|
473
|
+
npm version patch # bump 版本(自动 commit + tag vX.Y.Z)
|
|
474
|
+
git push origin main # 推代码
|
|
475
|
+
git push origin vX.Y.Z # 推 tag → 触发 Actions
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
GitHub Actions 自动完成:
|
|
479
|
+
|
|
480
|
+
1. 校验 tag 与 package.json 版本一致 → `npm publish --provenance`
|
|
481
|
+
2. 回调业务中台 `POST /api/cli-release`(`CLI_RELEASE_TOKEN` 鉴权)——中台记录更新日志,并用 App 发卡片通知到下游群(mzmeso / 好易美等,群配置在业务中台 `CLI_RELEASE_CHAT_IDS`,改群只动中台)
|
|
482
|
+
3. 版本号由 `/api/cli-guide` 动态查 npm registry 自动同步(下游引导不用手动改)
|
|
483
|
+
|
|
484
|
+
前置条件:仓库 Secrets 需配置 `NPM_TOKEN`(或 npmjs 配 Trusted Publishing)和 `CLI_RELEASE_TOKEN`(= 业务中台 `secret://studio/cli-release-token` 的值)。
|
|
485
|
+
|
|
486
|
+
**坑(2026-08-15 实录)**:
|
|
487
|
+
|
|
488
|
+
- GitHub Actions 的 `if:` 表达式**不能直接用 `secrets`**(报 `Unrecognized named-value`),secret 要放 step `env` 再在 `run` 里判断。
|
|
489
|
+
- 改 workflow 后本地 `npx yaml-lint` 校验(GitHub 解析失败会显示 "workflow file issue")。
|
|
490
|
+
- 不要往租户群发"纯测试"卡片——发布链路验证用正式版本内容,发成功就是正式通知。
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
This CLI holds two kinds of credentials in `~/.studio-image.json`: a personal login token (7-day JWT) and/or a tenant apiKey. The file is written with `0600` permissions (owner read/write only).
|
|
4
|
+
|
|
5
|
+
## Reporting a vulnerability
|
|
6
|
+
|
|
7
|
+
If you find a security issue in this CLI or in the `manager.museav.top` platform it talks to, please open a GitHub issue on this repo, or contact the maintainer directly rather than filing a public issue if the report involves a live credential leak or an exploitable server-side bug.
|
|
8
|
+
|
|
9
|
+
## Scope
|
|
10
|
+
|
|
11
|
+
This repo covers the CLI client only. It does not hold or process upstream model-provider keys — those stay server-side on the studio platform and are never sent to or stored by this CLI.
|