* feat(baoyu-imagine): add DashScope Wan 2.7 image model support
Closes#139.
Adds the new `wan2.7-image-pro` and `wan2.7-image` model family to the
DashScope provider so users can call Wan 2.7 directly through the
official Aliyun (Bailian) API instead of going through Replicate.
- Register `wan2.7-image-pro` and `wan2.7-image` as a new `wan27` family
in the DashScope provider with their own size resolution rules:
pixel range `[768*768, 4096*4096]` for `wan2.7-image-pro` text-to-image,
`[768*768, 2048*2048]` for `wan2.7-image-pro` with refs and for the
base `wan2.7-image` model in any mode, with aspect ratios validated
against the documented `[1:8, 8:1]` band.
- Allow up to 9 reference images per request (image editing /
multi-image fusion). Local files are inlined as base64 data URLs;
`http(s)://` paths are forwarded as-is. Other DashScope models still
reject `--ref` with a hint to switch to a wan2.7 model or another
provider.
- Drop `prompt_extend` from the request body for the Wan 2.7 family
(not part of the Wan 2.7 API surface) and skip the Qwen-only negative
prompt for this family.
- Allow `--provider dashscope --ref ...` in `detectProvider` so users
can opt into Wan 2.7 reference workflows, while keeping Wan 2.7 out
of the auto-detect ref priority list.
- Add provider, reference, and usage-example documentation, plus
unit tests covering family routing, size derivation across the
three pixel-budget modes, ratio rejection, explicit-size validation,
and the new `--provider dashscope` ref opt-in path.
Made-with: Cursor
* fix(baoyu-imagine): force n=1 for DashScope wan2.7 to avoid silent multi-image billing
Cross-checked the implementation against the official Wan 2.7 image
generation & editing API reference and found that the API defaults
`parameters.n` to 4 in non-collage mode (1-4 range, billed per image).
baoyu-imagine has single-image save semantics — only the first image
in the response is kept — so without an explicit `n: 1` users would
silently pay for 3 discarded images per request.
- Always send `parameters.n: 1` in the wan2.7 request body
- Reject `--n > 1` for wan2.7 with a clear error pointing at the
single-image save semantics
- Add tests asserting the request body shape (n=1, no prompt_extend,
no negative_prompt) and the --n>1 rejection
- Document the defaults-vs-skill mismatch in the dashscope reference
Made-with: Cursor
* Fix DashScope Wan 2.7 review feedback
Add --imageApiDialect flag, OPENAI_IMAGE_API_DIALECT env var, and
default_image_api_dialect config for gateways that expect aspect-ratio
size plus metadata.resolution instead of pixel size.
* Align Replicate image behavior with the models we actually support
Replicate image generation in baoyu-imagine no longer assumes that every model
accepts the nano-banana request schema. The Replicate provider now defaults to
google/nano-banana-2, routes supported model families through family-specific
builders and validators, blocks misleading multi-output requests before they
reach the API, and updates user-facing docs/config guidance to match the actual
contract.
Constraint: Replicate model families expose different input schemas
Constraint: Current Replicate path only saves one output image per request
Constraint: Must not change non-Replicate providers
Rejected: Keep one nano-banana-style payload for all Replicate models | triggers remote schema errors on Seedream and Wan
Rejected: Continue accepting multi-image Replicate requests and save only the first result | silently drops outputs
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Add a family-specific validator and input builder before exposing more Replicate model IDs or multi-output flags
Tested: npm test
Tested: node --test skills/baoyu-imagine/scripts/providers/replicate.test.ts skills/baoyu-imagine/scripts/main.test.ts
Not-tested: Live Replicate API calls against production models
Co-authored-by: justnode <justnode@users.noreply.github.com>
* Preserve Replicate compatibility when shared defaults leak across providers
Addressed the new PR review findings by teaching baoyu-imagine to track
where aspect-ratio defaults came from, mirroring the earlier imageSize fix,
so unsupported Replicate models can still run prompt-only requests when the
value was inherited from shared config. Also corrected Seedream 4.5 custom
size encoding to use the API's custom width/height schema instead of sending
literal WxH strings.
Constraint: Shared EXTEND defaults still need to apply globally for providers that support them
Constraint: Seedream 4.5 custom sizes must follow Replicate's documented custom size schema
Rejected: Ignore all aspect ratios for unknown Replicate models | would hide explicit unsupported CLI/task input
Rejected: Keep Seedream custom sizes as literal strings | validated locally but fails against the provider API
Confidence: high
Scope-risk: narrow
Reversibility: clean
Directive: Any future inherited-default validation for provider-specific flags should record the source explicitly before rejecting it
Tested: node --import tsx --test skills/baoyu-imagine/scripts/main.test.ts skills/baoyu-imagine/scripts/providers/replicate.test.ts
Tested: npm test
Not-tested: Live Replicate API calls for Seedream 4.5 custom-size requests
---------
Co-authored-by: justnode <justnode@users.noreply.github.com>
Adds the Z.AI (智谱) provider supporting glm-image and cogview-4-250304
models via the Z.AI sync image API. Configure with ZAI_API_KEY (or
BIGMODEL_API_KEY for backward compat). Reference images are not supported yet.