Commit Graph

77 Commits

Author SHA1 Message Date
Calesthio
494a95e62a Merge pull request #501 from calesthio/codex/atlas-media-model-expansion
Add Atlas Cloud media model gateway
2026-08-13 12:20:20 -07:00
calesthio
1267066bc4 Merge commit 'f72efb53d3cea7cce0943d5dc4e55e33e4e59af3' into codex/repair-pr-353
# Conflicts:
#	AGENT_GUIDE.md
#	docs/PROVIDERS.md
2026-08-13 11:40:09 -07:00
calesthio
97fcd3c025 Merge commit '1c7047fd1fa6ac63ff2ade67db886344fdebd8c7' into codex/repair-pr-353
# Conflicts:
#	docs/PROVIDERS.md
2026-08-13 11:29:26 -07:00
calesthio
9dc8e379ba Merge commit '1c7047fd1fa6ac63ff2ade67db886344fdebd8c7' into codex/repair-pr-371
# Conflicts:
#	docs/PROVIDERS.md
2026-08-13 11:29:26 -07:00
calesthio
dceea45387 Merge remote-tracking branch 'origin/main' into codex/repair-pr-353
# Conflicts:
#	docs/PROVIDERS.md
2026-08-13 11:20:19 -07:00
calesthio
00e4902348 Merge remote-tracking branch 'origin/main' into codex/repair-pr-371
# Conflicts:
#	docs/PROVIDERS.md
2026-08-13 11:20:19 -07:00
calesthio
ecfdbe5173 Merge remote-tracking branch 'origin/main' into codex/repair-pr-448
# Conflicts:
#	docs/PROVIDERS.md
2026-08-13 11:20:19 -07:00
calesthio
9f50874656 Merge remote-tracking branch 'origin/main' into codex/repair-pr-353
# Conflicts:
#	tests/contracts/test_phase3_contracts.py
2026-08-13 11:11:48 -07:00
calesthio
5f48d9afb7 Merge remote-tracking branch 'origin/main' into codex/repair-pr-448
# Conflicts:
#	.env.example
2026-08-13 11:11:48 -07:00
calesthio
329628a22b Merge remote-tracking branch 'origin/main' into codex/repair-pr-371 2026-08-13 11:11:02 -07:00
calesthio
e2a9e35c40 Merge remote-tracking branch 'origin/main' into codex/repair-pr-442 2026-08-13 11:11:02 -07:00
calesthio
ae9a74f1a2 feat: add Atlas Cloud media model gateway 2026-08-13 10:40:29 -07:00
calesthio
700046d33c Merge remote-tracking branch 'origin/main' into codex/repair-pr-482
# Conflicts:
#	docs/PROVIDERS.md
2026-08-13 10:17:12 -07:00
calesthio
3b966b06cf Merge remote-tracking branch 'origin/main' into codex/repair-pr-353 2026-08-13 10:15:44 -07:00
calesthio
be8cf96861 Merge remote-tracking branch 'origin/main' into codex/repair-pr-371 2026-08-13 10:15:43 -07:00
calesthio
91bd277a73 Merge remote-tracking branch 'origin/main' into codex/repair-pr-448 2026-08-13 10:15:41 -07:00
calesthio
0bb4c266d7 Merge remote-tracking branch 'origin/main' into codex/repair-pr-442 2026-08-13 10:15:35 -07:00
calesthio
41793226b5 fix: make ComfyUI history authoritative 2026-08-13 09:37:02 -07:00
calesthio
85dce1147a Merge remote-tracking branch 'origin/main' into codex/repair-pr-475 2026-08-13 09:33:40 -07:00
calesthio
7052f3999b Merge remote-tracking branch 'origin/main' into codex/repair-pr-353
# Conflicts:
#	.env.example
2026-08-13 09:28:52 -07:00
calesthio
a3c45aa3bf Merge remote-tracking branch 'origin/main' into codex/repair-pr-371
# Conflicts:
#	.env.example
2026-08-13 09:23:46 -07:00
calesthio
190d165d8b fix: enforce Hunyuan provider contracts 2026-08-13 09:16:22 -07:00
calesthio
bf55d498fb Merge remote-tracking branch 'origin/main' into codex/repair-pr-442
# Conflicts:
#	.env.example
2026-08-13 09:07:59 -07:00
clarkh
b6dded18fe Merge branch 'main' into feat/hunyuan_cloud_video 2026-08-12 21:24:23 +08:00
Codex
21d51ab9c8 add fal ElevenLabs speech and secure audio routing 2026-08-08 13:02:07 +00:00
Ntsako
cf1a13a722 feat: bundle a native-node ACE-Step v1 workflow for comfyui_music
ACE-Step v1's node-pack fragmentation turns out to be moot: ComfyUI ships
TextEncodeAceStepAudio/EmptyAceStepLatentAudio as native core nodes
(comfy_extras/nodes_ace.py), not a third-party pack, and Comfy-Org's own
workflow_templates repo has an official ACE-Step-v1 template built from
those plus long-stable core nodes. tools/_comfyui/workflows/ace-step-1-t2a.json
was built by cross-checking every node's class_type and input names against
ComfyUI's own source (nodes_ace.py, nodes_audio.py, nodes_latent.py,
nodes.py) rather than trusting the UI-format export directly.

comfyui_music now defaults to this bundled workflow: prompt maps to
ACE-Step's tags field (matching suno_music's "prompt = music description"
convention), lyrics/duration_seconds/steps/cfg/lyrics_strength/seed are all
patchable, and missing ace_step_v1_3.5b.safetensors surfaces through the
same missing_models contract as image/video. workflow_json/workflow_path +
output_node remains available for ACE-Step 1.5, other node packs, or
different audio models entirely.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 15:10:48 +02:00
Ntsako
172acca6ea feat: ship comfyui_music as a custom-workflow-only ACE-Step tool
Resolves the "music generation" open question from the adapter plan.
Unlike comfyui_image/comfyui_video there is no bundled workflow: ACE-Step's
ComfyUI node interface isn't standardized across custom node packs
(AceStepModelLoader vs native TextEncodeAceStepAudio, etc.), so instead of
picking one pack and breaking for everyone else, comfyui_music always
requires a caller-supplied workflow_json/workflow_path + output_node --
the same override contract image/video offer as an alternative, just
mandatory here. prompt is provenance-only, never injected into the graph.

Routed through the existing registry.get_by_capability("music_generation")
path alongside suno_music/music_gen -- no dedicated selector needed.
ComfyUIClient.generate() now also reads the "audio" output key (what
ComfyUI's native SaveAudio node writes), and gets timeout/resume/websocket-
wait/multi-server support for free via the shared client. Duration is a
best-effort ffprobe probe of the downloaded file since a custom workflow
gives no other way to know it ahead of time.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 14:19:05 +02:00
Ntsako
2f114682e8 feat: support per-capability ComfyUI server URLs for image/video
Resolves the "multi-server" open question from the adapter plan.
ComfyUIClient(capability="image"|"video") now resolves its server URL
from COMFYUI_IMAGE_SERVER_URL / COMFYUI_VIDEO_SERVER_URL first, falling
back to the shared COMFYUI_SERVER_URL and then the localhost default —
so comfyui_image and comfyui_video can point at separate ComfyUI
instances (different GPUs, different model sets) with zero extra config
for single-server setups. is_default_url/unavailable_reason() and the
setup_offer metadata account for the override.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 12:49:57 +02:00
Ntsako
ca203e49b7 feat: wait on ComfyUI websocket feed instead of polling for completion
Resolves the "async generation" open question from the adapter plan.
generate() now watches ComfyUI's websocket events (executing/progress/
execution_error) and reacts immediately instead of sleeping between REST
polls, with an optional on_progress callback that comfyui_video uses to
print step progress on long renders. websocket-client is an optional
import; _wait() falls back to the original poll() loop (with the
remaining time budget, not a fresh one) when it's unavailable or the
connection drops, so resume_prompt_id recovery is unaffected either way.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 12:31:24 +02:00
Ntsako
ceee7c7d56 fix: raise ComfyUI video timeout default and add job resume support
Non-accelerated local-GPU workflows (e.g. Wan 1.3B at 832x480/81-97
frames) routinely took ~1360-1630s, so the old 900s default false-failed
real renders that were still completing server-side. Timeout is now a
configurable timeout_seconds input (default 3600s), and ComfyUIError
carries the prompt_id on error/timeout so a timed-out-but-still-running
job can be resumed via resume_prompt_id instead of resubmitted.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 10:55:56 +02:00
calesthio
9482eddeff fix: recover bounded defects from PR backlog 2026-08-03 02:14:01 -07:00
clarkh
2237a9bcf9 refactor: remove TENCENT_TOKENHUB_MODEL env var, relocate Hunyuan entry in .env.example
The env var added complexity without meaningful benefit — explicit model
selection via the "model" input parameter is sufficient for both image and
video TokenHub tools.

- tools/video/hunyuan_cloud_video.py: drop env var fallback from
  _resolve_model(), remove mention from install_instructions
- tests/contracts/test_hunyuan_cloud_video.py: remove
  test_resolve_model_from_env and test_resolve_model_input_overrides_env
- .env.example: move TENCENT_TOKENHUB_API_KEY to a dedicated "Tencent
  Hunyuan TokenHub API" section, drop TENCENT_TOKENHUB_MODEL comment,
  broaden description from "video generation" to generic "Tencent Hunyuan
  via TokenHub API"
2026-07-30 10:53:33 +08:00
clarkh
287c77fa64 feat: add Tencent Hunyuan cloud video provider via TokenHub API
Introduce a new video generation provider backed by the Tencent TokenHub
API (tokenhub.tencentmaas.com), an OpenAI-compatible gateway for Tencent
Hunyuan video models with simple Bearer-token auth.

- Add hunyuan_cloud_video tool (submit → poll → download) supporting
  both text-to-video (hy-video-1.5) and image-to-video (yt-video-2.0)
- Add env vars: TENCENT_TOKENHUB_API_KEY, TENCENT_TOKENHUB_MODEL
- Add contract tests for the new tool
- Document setup, API flow, model pricing, and schema constraints in
  PROVIDERS.md
- Update provider tables and capability matrix throughout docs
2026-07-28 16:48:06 +08:00
zzzxtnt
b71f9b1f3e feat(video): add direct Volcengine Ark Seedance 2.0 provider 2026-07-27 11:24:07 +08:00
Calesthio
0af32ce5e1 Merge pull request #341 from yiyabo/feat/jimeng-video
Add Volcengine Jimeng (即梦 AI) video provider with V4 signing
2026-07-23 07:59:05 -07:00
Yiyabo
d4426f6e94 fix: declare env dependencies and map selector duration to frames
- Add env:VOLC_ACCESSKEY and env:VOLC_SECRETKEY to dependencies
- Map selector 'duration' (seconds) to Jimeng 'frames' (121/241)
- Add 4 selector duration mapping regression tests
- 59 tests pass

Fixes calesthio's third review feedback on PR #341.
2026-07-23 01:33:36 +08:00
Tomofumi Yagi
990d7f9a2c fix: address selector contract, promo pricing, idempotency, and registry metadata review
- Require 'model' in the input schema and accept 'model_id' as a
  selector-compatible alias (tts_selector exposes model_id); add a
  selector-routing regression test
- Document s2.1-pro-free as promotional (free through end of July 2026,
  Fair Use, no SLA, possible request retention, commercial-use
  restrictions) in PROVIDERS.md and the Layer 3 skill; estimate_cost()
  falls back to the paid s2.1-pro rate after the promo window
- Normalize voice_id/reference_id and model_id/model aliases before
  computing the idempotency key, and include all output-affecting inputs
  (bitrate, sample_rate, temperature, top_p, repetition_penalty, latency,
  prosody, normalize, chunk_length) with API defaults applied
- Declare env:FISH_AUDIO_API_KEY in dependencies so registry metadata
  reports the requirement
- Add fish_audio to the TTS provider set in the phase3 registry contract
  test
2026-07-22 19:00:46 +09:00
Yiyabo
53773cd5fc fix: tighten input_schema per Volcengine Jimeng 3.0 Pro contract
- frames: enum [121, 241] (was minimum 1)
- prompt: maxLength 800 (was 2000)
- seed: minimum -1 (was unbounded)
- Add 9 schema validation rejection tests
- Add authoritative API reference link to PROVIDERS.md
- Document CVSync2Async* route choice and schema constraints

Fixes calesthio's second review feedback on PR #341.
2026-07-19 21:47:06 +08:00
calesthio
0ff7bb30e3 feat(music): add Google Lyria generation skill 2026-07-18 16:47:35 -07:00
amartya-dev
e08a2ec740 test: add azure to the expected TTS provider inventory
test_registry_catalog_views pins the exact TTS provider set discovered by
the registry; azure_tts joins it.
2026-07-13 20:54:52 +05:30
Yiyabo
8414c485ad fix: restore requests module after test_lazy_imports_requests
Use monkeypatch.delitem instead of manual del sys.modules['requests']
so pytest automatically restores the module after the test. This
prevents 12 downstream Google auth/music/Veo tests from failing with
AttributeError: module 'requests' has no attribute 'exceptions'.

Fixes calesthio's review feedback on PR #341.
2026-07-13 12:55:27 +08:00
xucailiang
6b9ba782d8 fix: complete Kling idempotency inputs
Include every request field that can alter Kling video, image, avatar, or lip-sync media in the public idempotency contract. Add a shared regression matrix that detects future cache-key collisions while excluding transport-only controls.
2026-07-10 21:24:11 +08:00
xucailiang
b9b9b82b64 fix: harden Kling integration verification
Isolate Kling contract tests from the singleton registry so discovery state cannot leak into later selector tests. Align lip-sync face, audio, and timing payloads with the current official API and extend the live smoke coverage.
2026-07-10 20:53:45 +08:00
Yiyabo
2ad71dd591 fix: use minimax_video (not minimax_tokenplan_video) in fallback_tools
minimax_tokenplan_video does not exist in main branch (added in PR #297,
not yet merged). Use minimax_video which is the existing tool.

Fixes Copilot review comments on fallback_tools reference and
contract test assertion.
2026-07-10 18:54:25 +08:00
xucailiang
2b6d717f00 Merge remote-tracking branch 'origin/main' into codex/kling-official-phase-1
# Conflicts:
#	.agents/skills/ai-video-gen/SKILL.md
#	.env.example
#	docs/PROVIDERS.md
2026-07-10 14:02:30 +08:00
Yiyabo
e06f56d26a jimeng: add Volcengine Jimeng (即梦 AI) video provider with V4 signing
Implements the Jimeng/Volcengine part of issue #249, as agreed with
@xucailiang (who is handling the Kling provider separately).

Adds a first-class Jimeng video provider that calls the Volcengine
visual API directly (visual.volcengineapi.com) using HMAC-SHA256 V4
request signing with IAM AK/SK credentials. This is the first provider
in OpenMontage to use V4 signing (all others use Bearer token auth).

API flow: POST CVSync2AsyncSubmitTask -> poll CVSync2AsyncGetResult ->
download video_url.

Features:
- Text-to-video and image-to-video (Jimeng 3.0 Pro)
- Configurable frame count (121=5s, 241=10s at 24fps)
- Aspect ratio selection (16:9, 9:16, 1:1, etc.)
- Seed for reproducibility
- Full V4 HMAC-SHA256 request signing (not Bearer token)
- Error handling with Jimeng code 10000 success convention
- API key redaction in error messages (both env vars, no empty-string bug)

Env vars: VOLC_ACCESSKEY + VOLC_SECRETKEY (IAM AK/SK pair).
Idempotency keys include all output-affecting fields.

Files:
- tools/video/jimeng_video.py — new tool (V4 signing + submit/poll/download)
- tests/contracts/test_jimeng_video.py — 46 contract tests (no AK/SK needed)
- .env.example — VOLC_ACCESSKEY + VOLC_SECRETKEY
- docs/PROVIDERS.md — Volcengine Jimeng provider section

End-to-end tested with real Volcengine IAM credentials: generated a
1920x1088 H.264 5.04s video, ffprobe verified.

Test results:
  python -m pytest tests/contracts/test_jimeng_video.py -q  # 46 passed
2026-07-10 10:50:43 +08:00
calesthio
ad02ce3639 fix(ci): stabilize character HyperFrames contract test 2026-07-09 07:32:21 -07:00
Karl Weinmeister
30018a6a8f feat(tools): add Google Lyria and direct Google Veo generation tools 2026-07-09 07:11:06 -07:00
xucailiang
8e1128400b Clean up Kling official PR artifacts 2026-07-07 15:34:23 +08:00
xucailiang
1471ef47c3 test: consolidate Kling official contract tests 2026-07-07 15:07:50 +08:00