yzhclcl/dsh-omni-modal ↗★ 0

dsh-omni-modal

配置多模态生成端点并向模型提供工具 适合需要配置OpenAI兼容的图像和视频生成端点并让模型直接调用生成工具的用户。

包名
dsh-omni-modal
兼容性
待验证
Harness 依赖范围
>=0.1.5-rc.1
Cordis 依赖范围
^4.0.1
版本
0.1.0
许可证
MIT
最近更新
2026年10月13日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:yzhclcl/dsh-omni-modal

Usage

Once installed, just talk to the agent:

  • "Draw a strawberry on a pale blue plate." → generate_image
  • "Make a short video of a paper boat drifting down a stream." → generate_video, then check_video

Settings page

SectionContents
Config profilesPick the active profile, rename it, add one (copied from the current) / delete one
ImageBase URL, API key, model, request path, default size, extra request params
VideoBase URL, API key, model, submit path, query path, default resolution, default duration, extra request params
Task recordsSubmitted video tasks with their status and artifact path

Notes:

  • Saving takes effect immediately for the tools — no restart.

  • The base URL must be the address alone. Documentation examples are easy to copy verbatim as POST https://api.example.com/v1; the plugin strips a leading POST/GET/… automatically, but writing just https://api.example.com/v1 is safer.

  • The query path accepts two forms: a relative path (/videos/generations/{id}) appended to the base URL, or a full URL (https://api.example.com/agnesapi?video_id={id}&model_name={model}) used as-is. The full form is necessary when the query endpoint does not live under the base URL.

  • Placeholders available in the query path:

    PlaceholderReplaced with
    {id}the task id returned by the submit call
    {model}the model name configured in that profile
  • The tools always use the active profile unless you pass profile explicitly.

Tools

generate_image(prompt, size?, model?, profile?, save_to?)
generate_video(prompt, model?, profile?, size?, seconds?, image_url?)
check_video(task_id, profile?, save_to?)
  • generate_image returns synchronously. The file lands in the plugin data directory's media/ and, if the attachment service is available, an image attachment is produced so the picture shows up in the conversation. The model itself cannot see the pixels — to actually look at the image, call read_image on the returned path.
  • generate_video is asynchronous: it returns a taskId right away. Call check_video(task_id) later; when the status becomes succeeded the artifact is downloaded into media/ automatically.
  • Passing a non-existent profile is a hard error that lists the available profiles, rather than silently falling back to another one — otherwise the model would quietly use the wrong endpoint and model while the result still claims the profile it asked for.
  • check_video failures are soft failures: a missing task (404), an unreachable download URL or a failed download return status: "failed" / "succeeded" plus a message, instead of throwing. These are expected business outcomes, and throwing would abort the whole tool-calling round.
  • Video URL extraction covers the common response shapes: video_url / videoUrl / url, nested video.url, data.*, output.*, result.*, videos[0].url, and more.
  • Task id extraction prefers video_id / videoId over id / task_id — some services (Agnes, for instance) return an internal id that cannot be used for polling.
  • 429 (rate limit) / 503 (busy, queue full) responses come back with a "retry in a moment" hint: they are retryable server states, not configuration errors.