Skill: zhouweico/qwen-omni-multimodal (version 0.2.0)

--- name: qwen-omni-multimodal version: 0.2.0 description: | 基于阿里云百炼 Qwen3.5-Omni 的全模态 skill。支持文本、图片、音频、视频理解，以及文本/语音输出。 当用户需要分析图片、转写或理解音频、理解视频、进行跨模态问答，或直接生成语音回复时，使用此 skill。 homepage: https://help.aliyun.com/zh/model-studio/qwen-omni metadata: openclaw: requires: env: - DASHSCOPE_API_KEY bins: - node primaryEnv: DASHSCOPE_API_KEY --- # Qwen Omni Multimodal 通过阿里云百炼 OpenAI 兼容接口调用 Qwen Omni 模型，默认使用 `qwen3.5-omni-flash`，自动选型时会在 `qwen3.5-omni-flash` 和 `qwen3.5-omni-plus` 之间切换；同时保留对 `qwen3-omni-flash` 与 `qwen-omni-turbo` 的显式兼容。支持文本、图片、音频、视频输入，并可返回文本或音频。 详细参数与约束见 `references/api.md`。 脚本支持单轮调用，也支持带本地会话历史的多轮对话。 ## Setup 1. 配置 API Key： ```bash export DASHSCOPE_API_KEY="sk-xxx" ``` 也可以在 skill 目录下创建 `config.json`： 可先参考 `config.example.json` 再复制为 `config.json`。 ```json { "apiKey": "sk-xxx", "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1", "selectionPolicy": "auto", "defaultModel": "qwen3.5-omni-flash", "modelCandidates": [ "qwen3.5-omni-flash", "qwen3.5-omni-plus" ], "voiceByModelFamily": { "qwen3.5-omni": "Tina", "qwen3-omni-flash": "Cherry", "qwen-omni-turbo": "Serena" }, "voice": "Tina" } ``` 2. 运行环境要求 `Node.js >= 18` 3. 可选：如果使用新加坡地域，覆盖 Base URL： ```bash export DASHSCOPE_BASE_URL="https://dashscope-intl.aliyuncs.com/compatible-mode/v1" ``` 配置优先级： - CLI 参数 - 环境变量 - `config.json` - 脚本默认值 具体覆盖规则： - 模型选择：`CLI --model > DASHSCOPE_MODEL > selectionPolicy=auto > config.defaultModel > config.model > 内置默认` - Base URL：`DASHSCOPE_BASE_URL > config.baseUrl > 内置默认` - 音色选择：`CLI --voice > DASHSCOPE_VOICE > config.voiceByModelFamily[模型家族] > config.voice > 内置默认` - API Key：`DASHSCOPE_API_KEY > config.apiKey` - `selectionPolicy=fixed|auto` - `fixed`：按默认模型走，不自动切换 - `auto`：音频/视频理解优先 `qwen3.5-omni-plus`，文本/图片理解与语音输出优先 `qwen3.5-omni-flash` - `config.modelCandidates` 用于维护候选模型列表；`selectionPolicy=auto` 时会优先在候选列表里选模型 - `config.voiceByModelFamily` 用于给不同模型家族配置不同默认音色，避免切模型后沿用不兼容音色 ## 何时使用 - 用户要看图说话、图像问答、图像对比 - 用户要识别、转写、总结音频 - 用户要理解视频内容，或同时利用视频中的视觉和音频信息 - 用户要求模型直接输出语音 - 用户明确提到 Qwen-Omni / Qwen3.5-Omni / Qwen3-Omni-Flash / 百炼全模态 ## 关键限制 - Qwen-Omni 只支持流式调用，脚本默认强制 `stream=true` - 一条 `user` 消息只允许包含文本和一种模态数据 - 输出音频时需要显式设置 `modalities=["text","audio"]` - `qwen3.5-omni-plus` 和 `qwen3.5-omni-flash` 为非思考模型，不支持 `--enable-thinking=true` - `qwen3-omni-flash` 开启思考模式时，不支持音频输出 - 图片列表形式的视频输入： - `Qwen3.5-Omni`：4 到 512 张图片 - `qwen3-omni-flash`：2 到 128 张图片 - 多轮模式下，脚本只保留当前活动话题；切到 `fresh` 时不会把旧话题继续注入给模型 ## 支持模型与选择建议 - 默认模型：`qwen3.5-omni-flash` - 自动选型默认优先： - 音频/视频理解：`qwen3.5-omni-plus` - 文本/图片理解、语音输出：`qwen3.5-omni-flash` - 也支持显式选择旧模型：`qwen3-omni-flash`、`qwen-omni-turbo` - 推荐在 `config.json` 中使用： - `selectionPolicy`：设置 `fixed` 或 `auto` - `defaultModel`：设置默认模型 - `modelCandidates`：维护允许 Agent 自动优先考虑的模型列表 - 当前脚本已内置价格提醒的模型家族： - `qwen3.5-omni-plus` - `qwen3.5-omni-plus-2026-03-15` - `qwen3.5-omni-flash` - `qwen3.5-omni-flash-2026-03-15` - `qwen3-omni-flash` - `qwen3-omni-flash-2025-12-01` - `qwen3-omni-flash-2025-09-15` - `qwen-omni-turbo` - `qwen-omni-turbo-latest` - `qwen-omni-turbo-2025-03-26` - `qwen-omni-turbo-2025-01-19` - 价格取舍基于你提供的中国内地价格表： - `qwen3.5-omni-flash`：成本更低，适合默认文本/图片理解与语音输出 - `qwen3.5-omni-plus`：长音频、长视频与复杂跨模态理解更稳 - `qwen-omni-turbo`：保留显式兼容，不再作为默认自动选型目标 - 当前 skill 默认切到 `qwen3.5-omni-flash` - 原因是新版能力更完整，同时更接近当前 skill 的默认成本档位 - 当 `selectionPolicy=auto` 时，会按任务类型在 `qwen3.5-omni-flash` 和 `qwen3.5-omni-plus` 之间自动二选一 ## 音色选择建议 - 当前脚本已内置模型家族音色表，并会在 `--with-audio` 时校验音色是否合法 - 可用 `--list-voices --model <model>` 查看当前模型家族支持的音色 - 推荐把默认音色维护在 `config.voiceByModelFamily` 中，而不是只写一个全局 `voice` - `qwen3.5-omni` 当前默认音色：`Tina(甜甜 Tina)` - `qwen3.5-omni` 当前内置音色示例： - `Tina(甜甜 Tina)`、`Serena(苏瑶 Serena)`、`Ethan(晨煦 Ethan)`、`Katerina(卡捷琳娜 Katerina)`、`Jennifer(詹妮弗 Jennifer)` - `Ryan(甜茶 Ryan)`、`Sunny(四川-晴儿 Sunny)`、`Dylan(北京-晓东 Dylan)`、`Rocky(粤语-阿强 Rocky)`、`Chloe(思怡 Chloe)` - 以及其余官方文档列出的全部 55 个音色，可通过 `--list-voices` 查看 - `qwen-omni-turbo` 当前内置音色： - `Cherry(辛悦)` - `Serena(苏瑶)` - `Ethan(晨煦)` - `Chelsie(千雪)` - `qwen3-omni-flash` 当前内置音色： - `Cherry(辛悦)`、`Ethan(晨煦)`、`Nofish(不吃鱼)`、`Jennifer(詹妮弗)`、`Ryan(甜茶)` - `Katerina(卡捷琳娜)`、`Elias(墨讲师)`、`Jada(上海-阿珍)`、`Dylan(北京-晓东)`、`Sunny(四川-晴儿)` - `Li(南京-老李)`、`Marcus(陕西-秦川)`、`Roy(闽南-阿杰)`、`Peter(天津-李彼得)`、`Rocky(粤语-阿强)`、`Kiki(粤语-阿清)`、`Eric(四川-程川)` - 经验建议： - 通用中文讲解默认优先 `Tina` - 温柔女声可优先 `Serena` - 标准男声可优先 `Ethan` - 方言或角色化表达再按模型支持表显式选 ## CLI 主要脚本：`node scripts/qwen-omni-chat.js` ### 文本 ```bash node scripts/qwen-omni-chat.js \ --selection-policy="auto" \ --prompt="用中文概括一下什么是全模态模型" ``` ### 图片理解 ```bash node scripts/qwen-omni-chat.js \ --prompt="描述这张图片，并指出最重要的三个细节" \ --image="/absolute/path/image.jpg" ``` 可重复 `--image` 传多张图。 ### 音频理解 ```bash node scripts/qwen-omni-chat.js \ --prompt="转写这段音频，并给出简短摘要" \ --audio="/absolute/path/audio.mp3" ``` ### 视频理解 ```bash node scripts/qwen-omni-chat.js \ --prompt="概括这个视频的主要内容" \ --video="/absolute/path/video.mp4" ``` ### 图片列表形式的视频 ```bash node scripts/qwen-omni-chat.js \ --prompt="描述这个动作序列发生了什么" \ --video-frames="/abs/1.jpg,/abs/2.jpg,/abs/3.jpg,/abs/4.jpg" ``` ### 文本加语音输出 ```bash node scripts/qwen-omni-chat.js \ --prompt="请用中文做一个 20 秒以内的语音自我介绍" \ --with-audio \ --voice="Tina" \ --audio-out="/tmp/qwen-omni.wav" ``` ### 查看某个模型支持的音色 ```bash node scripts/qwen-omni-chat.js --list-voices --model="qwen3.5-omni-flash" ``` ### 仅做预检，不实际调用 ```bash node scripts/qwen-omni-chat.js \ --prompt="描述这张图片，并指出最重要的三个细节" \ --image="/absolute/path/image.jpg" \ --dry-run ``` ### 多轮对话 ```bash node scripts/qwen-omni-chat.js \ --session="demo-chat" \ --prompt="先分析这张图片" \ --image="/abs/demo.jpg" ``` ```bash node scripts/qwen-omni-chat.js \ --session="demo-chat" \ --prompt="把刚才的结论总结成三点" \ --mode="continue" ``` ### 新话题切换 ```bash node scripts/qwen-omni-chat.js \ --session="demo-chat" \ --prompt="现在换个新问题，解释一下多模态模型训练难点" \ --mode="fresh" ``` ### 会话管理 ```bash node scripts/qwen-omni-chat.js --list-sessions node scripts/qwen-omni-chat.js --show-session --session="demo-chat" node scripts/qwen-omni-chat.js --clear-session --session="demo-chat" ``` ## 工作流 1. 先判断输入属于图片、音频、视频中的哪一种。 2. 如果用户一次给了多种非文本模态，先拆成多次调用，或让用户明确优先级。 3. 默认模型为 `qwen3.5-omni-flash`。只有在用户明确要求或你确认更合适时再切换模型。 - 音频或视频理解任务，优先尝试 `qwen3.5-omni-plus` - 文本/图片理解或语音输出，默认优先 `qwen3.5-omni-flash` - 只有在兼容旧调用或用户指定时，再显式切回 `qwen3-omni-flash` / `qwen-omni-turbo` 4. 需要语音回复时，关闭思考模式并保存脚本生成的 WAV 文件路径。 5. 需要延续当前话题时使用同一个 `--session`；需要切换新内容时使用 `--mode=fresh` 或直接新建 session。 6. 脚本会在调用前输出中国内地单价提醒；如果响应 `usage` 足够完整，还会输出本次费用估算。 ## 多轮策略 - `--mode=auto` - 默认模式 - 有新图片/音频/视频输入时，优先判为新话题 - 纯文本追问时，优先判为继续当前话题 - `--mode=continue` - 强制延续当前 session 的活动话题 - 会带最近几轮历史，以及更早历史的压缩摘要 - `--mode=fresh` - 强制开启新话题 - 保留 session 文件，但重置活动上下文，避免模型被旧内容拖住 会话文件保存在 `sessions/` 目录。 ## 会话与覆盖规则 - 会话模式：`CLI --mode > 默认 auto` - 会话标识：`CLI --session` 或 `--new-session` - 未指定 `--session` 时，只允许单轮调用；不能使用 `--mode=continue` - `--reset-session` 会在当前请求前重置活动上下文 - `--mode=fresh` 会重置当前活动话题，但保留同一个 session 文件 - `--dry-run` 不会写入或删除任何 session 文件；如果同时传了 `--reset-session`，只打印将要发生的变化 ## 参数约定 - `--prompt`：用户文本提示，必填 - `--session`：会话 ID，用于多轮对话 - `--selection-policy=fixed|auto`：模型选择策略，默认读配置，未配置时为 `fixed` - `--new-session`：创建新 session；不传值时自动生成 ID - `--mode=auto|continue|fresh`：会话路由模式，默认 `auto` - `--history-window`：多轮模式下保留的最近轮数，默认 `6` - `--reset-session`：在当前请求前重置活动上下文 - `--list-sessions`：列出已保存会话 - `--show-session`：查看某个会话摘要 - `--clear-session`：删除某个会话 - `--image`：图片路径、HTTP(S) URL 或 Data URL，可重复 - `--audio`：音频路径、HTTP(S) URL 或 Data URL - `--video`：视频路径、HTTP(S) URL 或 Data URL - `--video-frames`：逗号分隔的图片列表，按视频帧顺序传入 - `--with-audio`：启用音频输出 - `--voice`：输出音色，默认 `Tina` - `--list-voices`：查看当前模型家族支持的音色列表 - `--audio-out`：输出 WAV 文件路径，默认 `/tmp/qwen-omni-<timestamp>.wav` - `--enable-thinking=true|false`：是否开启思考模式，默认 `false` - `--system`：可选系统提示词 - `--dry-run`：只打印价格提醒和脱敏后的请求体，不实际调用 API，也不会落盘 session 变更 ## 推荐的 Agent 调用方式 - 默认优先单轮调用；只有明确存在追问、延续分析或会话管理需求时再传 `--session` - 日常优先把模型策略交给 `config.selectionPolicy + config.defaultModel + config.modelCandidates` 控制，不要反复改脚本 - 日常默认音色优先交给 `config.voiceByModelFamily` 控制；切模型家族时不要假设同一个音色参数总是可用 - 用户给了新的图片、音频或视频，且没有明确要求延续上下文时，优先用 `--mode=fresh` 或直接不带 session - 用户明确说“继续”“基于刚才”“上一轮”时，优先复用原 session，并使用 `--mode=continue` - 需要语音输出时，显式传 `--with-audio`，同时确保 `--enable-thinking=false`；不确定音色时先运行 `--list-voices` - 正式调用前先跑一次 `--dry-run`，确认模型来源、模态判定、会话模式、请求体预览和价格提醒 ## 成本提醒 - 脚本会先输出中国内地价格表对应的单价提醒 - `Qwen3.5-Omni` 当前内置价格按中国内地官方阶梯价提醒： - `qwen3.5-omni-flash` - 输入文本/图片/视频：`0.2 ~ 0.8 元/百万Token` - 输入音频：`1.24 元/百万Token` - 输出文本：`4.0 ~ 16.0 元/百万Token` - 输出音频：`25.551 元/百万Token` - `qwen3.5-omni-plus` - 输入文本/图片/视频：`0.8 ~ 2.0 元/百万Token` - 输入音频：`4.96 元/百万Token` - 输出文本：`9.6 ~ 24.0 元/百万Token` - 输出音频：`61.322 元/百万Token` - 文本相关单价会按单次请求输入 Token 阶梯自动判断 - 如果响应里的 `usage` 带了足够的 token 明细，脚本会进一步输出本次费用估算 - 这不是实时价格查询；如果官方价格变化，需要同步更新脚本 ## 失败时优先检查 - 是否缺少 `DASHSCOPE_API_KEY` - `config.json` 是否是合法 JSON - Node 版本是否低于 18 - 是否同时传入了多种非文本模态 - 是否给 `Qwen3.5-Omni` 传了 `--enable-thinking=true` - 是否在 `qwen3-omni-flash` 上同时传了 `--with-audio` 和 `--enable-thinking=true` - 多轮时是否忘记传 `--session` - 是否错误地把新话题用了 `--mode=continue` - 本地文件路径是否存在 - 视频帧数量是否满足要求

path: config.example.json
content: {
  "apiKey": "sk-xxxx",
  "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1",
  "selectionPolicy": "auto",
  "defaultModel": "qwen3.5-omni-flash",
  "modelCandidates": [
    "qwen3.5-omni-flash",
    "qwen3.5-omni-plus"
  ],
  "voiceByModelFamily": {
    "qwen3.5-omni": "Tina",
    "qwen3-omni-flash": "Cherry",
    "qwen-omni-turbo": "Serena"
  },
  "voice": "Tina"
}


path: package.json
content: {
  "name": "qwen-omni-multimodal",
  "version": "0.2.0",
  "private": true,
  "description": "Qwen3.5-Omni multimodal skill for qclaw",
  "engines": {
    "node": ">=18"
  },
  "scripts": {
    "omni": "node scripts/qwen-omni-chat.js"
  }
}


path: references/api.md
content: # Qwen-Omni API Notes

官方文档：

- https://help.aliyun.com/zh/model-studio/qwen-omni
- https://help.aliyun.com/zh/model-studio/developer-reference/use-qwen-by-calling-api
- https://help.aliyun.com/zh/model-studio/stream

## 当前 skill 使用方式

- 接口：`POST /chat/completions`
- Base URL（北京）：`https://dashscope.aliyuncs.com/compatible-mode/v1`
- 鉴权：`Authorization: Bearer $DASHSCOPE_API_KEY`
- 输出：强制流式
- 会话历史：由本地脚本管理，服务端仍然是标准 `messages` 多轮输入
- 凭证来源：优先读取环境变量，也支持本地 `config.json`

## 配置与覆盖规则

- 模型选择：`CLI --model > DASHSCOPE_MODEL > selectionPolicy=auto > config.defaultModel > config.model > 内置默认`
- Base URL：`DASHSCOPE_BASE_URL > config.baseUrl > 内置默认`
- 音色选择：`CLI --voice > DASHSCOPE_VOICE > config.voiceByModelFamily[模型家族] > config.voice > 内置默认`
- API Key：`DASHSCOPE_API_KEY > config.apiKey`
- `selectionPolicy=fixed|auto`
  - `fixed`：按默认模型走，不自动切换
  - `auto`：音频/视频理解优先 `qwen3.5-omni-plus`，文本/图片理解与语音输出优先 `qwen3.5-omni-flash`
- `config.modelCandidates` 用于维护候选模型列表；`selectionPolicy=auto` 时会优先在候选列表里选模型
- `config.voiceByModelFamily` 用于给不同模型家族配置不同默认音色
- `--dry-run` 不要求 API Key，但仍会校验本地文件、打印价格提醒和脱敏后的请求体预览

## 当前支持的模型选择

- 默认模型：`qwen3.5-omni-flash`
- 可显式切换到：
  - `qwen3.5-omni-plus`
  - `qwen3.5-omni-plus-2026-03-15`
  - `qwen3.5-omni-flash`
  - `qwen3.5-omni-flash-2026-03-15`
  - `qwen3-omni-flash`
  - `qwen3-omni-flash-2025-12-01`
  - `qwen3-omni-flash-2025-09-15`
  - `qwen-omni-turbo`
  - `qwen-omni-turbo-latest`
  - `qwen-omni-turbo-2025-03-26`
  - `qwen-omni-turbo-2025-01-19`
- 当前 skill 支持受约束的自动选型；是否自动切换模型由 `selectionPolicy` 决定
- 推荐在 `config.json` 中使用 `selectionPolicy` 管理自动选型开关，用 `defaultModel` 管理兜底默认模型，用 `modelCandidates` 管理候选列表
- 价格取舍基于你提供的中国内地价格表：
  - `qwen3.5-omni-flash`：成本更低，适合默认文本/图片理解与语音输出
  - `qwen3.5-omni-plus`：长音频、长视频与复杂跨模态理解更稳
  - `qwen-omni-turbo`：保留显式兼容，不再作为默认自动选型目标
- 当前脚本的自动选型默认在 `qwen3.5-omni-flash` 和 `qwen3.5-omni-plus` 间切换；旧模型作为显式兼容项保留

## 当前支持的音色选择

- `--with-audio` 时，脚本会按模型家族校验 `voice`
- 可用 `--list-voices --model <model>` 查看当前模型家族支持的音色
- `qwen3.5-omni` 当前内置全部 55 个官方音色，默认音色为 `Tina(甜甜 Tina)`
- 常用示例：`Tina`、`Serena`、`Ethan`、`Katerina`、`Jennifer`、`Ryan`、`Sunny`、`Dylan`、`Rocky`、`Chloe`
- `qwen-omni-turbo` 当前内置音色：
  - `Cherry(辛悦)`、`Serena(苏瑶)`、`Ethan(晨煦)`、`Chelsie(千雪)`
- `qwen3-omni-flash` 当前内置音色：
  - `Cherry(辛悦)`、`Ethan(晨煦)`、`Nofish(不吃鱼)`、`Jennifer(詹妮弗)`、`Ryan(甜茶)`
  - `Katerina(卡捷琳娜)`、`Elias(墨讲师)`、`Jada(上海-阿珍)`、`Dylan(北京-晓东)`、`Sunny(四川-晴儿)`
  - `Li(南京-老李)`、`Marcus(陕西-秦川)`、`Roy(闽南-阿杰)`、`Peter(天津-李彼得)`、`Rocky(粤语-阿强)`、`Kiki(粤语-阿清)`、`Eric(四川-程川)`
- 如果配置或 CLI 指定了当前模型不支持的音色，脚本会直接报错，并给出可选列表

## 内容类型

- 文本：`{ "type": "text", "text": "..." }`
- 图片：`{ "type": "image_url", "image_url": { "url": "..." } }`
- 音频：`{ "type": "input_audio", "input_audio": { "data": "...", "format": "mp3" } }`
- 视频文件：`{ "type": "video_url", "video_url": { "url": "...", "fps": 2.0 } }`
- 图片列表形式视频：`{ "type": "video", "video": ["url1", "url2"] }`

本地文件应转换成 Base64 Data URL。

## 约束

- Qwen-Omni 只支持流式调用
- 一条 `user` 消息只允许文本加一种模态
- `Qwen3.5-Omni` 的图片列表视频要求 4 到 512 帧
- `qwen3-omni-flash` 的图片列表视频要求 2 到 128 帧
- 文本加音频输出时，要传 `modalities: ["text", "audio"]`
- `qwen3.5-omni-plus` 和 `qwen3.5-omni-flash` 不支持思考模式
- `qwen3-omni-flash` 开启思考模式时，不支持音频输出

## 当前脚本的多轮策略

- 会话文件保存在 `sessions/<session-id>.json`
- `auto` 模式下，新图片/音频/视频输入默认视为新话题
- `continue` 模式下，脚本会带上最近几轮原始历史
- 更早历史不会原样无限累加，而是压缩成一段系统摘要
- `fresh` 模式下，脚本重置当前活动上下文，避免旧话题污染新问题

## 会话调用规则

- 默认推荐单轮调用；只有确实需要延续上下文时才传 `--session`
- 未指定 `--session` 时，不能使用 `--mode=continue`
- `--reset-session` 会在当前请求前重置活动上下文
- `--mode=fresh` 只重置当前活动话题，不会删除整个 session 文件
- `--dry-run` 不会写入、更新或删除 session 文件；所有会话变更仅做预览

## 推荐的 Agent 调用方式

- 看图、听音频、看视频这类一次性理解任务，默认不带 session
- 默认模型选择优先依赖 `config.selectionPolicy`、`config.defaultModel` 和 `config.modelCandidates`
- 默认音色优先依赖 `config.voiceByModelFamily`
- 明显追问时，复用同一个 `--session` 并使用 `--mode=continue`
- 用户给了新模态输入且没有说“基于刚才”时，优先 `--mode=fresh`
- 需要语音输出时，传 `--with-audio`，并确保 `--enable-thinking=false`
- 不确定音色时，先运行 `--list-voices --model <model>` 再决定 `--voice`
- 正式请求前先运行 `--dry-run`，确认模型来源、模态类型、会话模式、价格提醒和请求体预览

## 当前脚本的价格提醒

- 基于你提供的中国内地价格表内置单价提醒
- 调用前显示当前输入/输出模式对应的单价；`Qwen3.5-Omni` 会按单次请求输入 Token 阶梯显示区间价
- 若 `usage` 中包含足够的 token 明细，调用后追加 best-effort 费用估算
- 费用估算依赖服务端返回的统计字段，字段不完整时只显示单价提醒

## 最小请求体

```json
{
  "model": "qwen3.5-omni-flash",
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "这段音频讲了什么？" },
        {
          "type": "input_audio",
          "input_audio": {
            "data": "data:audio/mp3;base64,...",
            "format": "mp3"
          }
        }
      ]
    }
  ],
  "stream": true,
  "stream_options": {
    "include_usage": true
  }
}
```


Security scan verdicts — ClawScan: clean | static analysis: suspicious | VirusTotal: clean | SkillSpector: clean (LOW)