cue-ai 0.9.2 → 0.9.3
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/CHANGELOG.md +4 -3
- package/README.md +148 -170
- package/bin/cue-learnings +30 -4
- package/bin/cue-review-progress +0 -0
- package/bin/cue-review-watch +0 -0
- package/dist/cue.js +4328 -3108
- package/package.json +1 -1
- package/plugins/cue/commands/cue-switch.md +1 -1
- package/plugins/cue/commands/cue.md +1 -1
- package/profiles/backend/profile.yaml +4 -0
- package/profiles/browser/profile.yaml +4 -0
- package/profiles/career/profile.yaml +2 -13
- package/profiles/commerce/profile.yaml +0 -2
- package/profiles/coolify/profile.yaml +0 -1
- package/profiles/core/profile.yaml +78 -11
- package/profiles/dash-merge-test/profile.yaml +6 -1
- package/profiles/designer/profile.yaml +9 -1
- package/profiles/dropshipping/profile.yaml +69 -0
- package/profiles/frontend/profile.yaml +4 -0
- package/profiles/google-ads/profile.yaml +34 -0
- package/profiles/google-analytics/profile.yaml +34 -0
- package/profiles/google-drive/profile.yaml +34 -0
- package/profiles/gstack/profile.yaml +117 -29
- package/profiles/marketing/profile.yaml +0 -1
- package/profiles/media/README.md +70 -0
- package/profiles/media/profile.yaml +104 -0
- package/profiles/nano-banana/profile.yaml +52 -0
- package/profiles/ops/profile.yaml +1 -2
- package/profiles/secops/profile.yaml +3 -0
- package/profiles/skill-writer/profile.yaml +15 -0
- package/profiles/video/profile.yaml +3 -0
- package/profiles/web-frontend-base/profile.yaml +6 -0
- package/profiles/webshop/profile.yaml +0 -1
- package/profiles/webshop-google/profile.yaml +1 -0
- package/profiles/x-growth-bot/profile.yaml +2 -0
- package/resources/icons/generate-icons.py +2 -128
- package/resources/mcps/configs/claude.sanitized.json +88 -20
- package/resources/mcps/configs/claude_runtime.sanitized.json +40 -1
- package/resources/mcps/configs/codex.sanitized.json +29 -0
- package/resources/skills/skills/career/job-hunter/LICENSE +21 -0
- package/resources/skills/skills/career/job-hunter/README.md +323 -0
- package/resources/skills/skills/career/job-hunter/SKILL.md +91 -0
- package/resources/skills/skills/career/job-hunter/agents/README.md +96 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-assessment-prep.md +195 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-ats-scan.md +155 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-bias-audit.md +224 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-cover-letter.md +69 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-decode-jd.md +117 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-fit-score.md +183 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-linkedin-audit.md +74 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-linkedin-scrape.md +255 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-portfolio-brief.md +123 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-reality-check.md +164 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-reference-prep.md +150 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-rejection-analysis.md +172 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-resume.md +70 -0
- package/resources/skills/skills/career/job-hunter/agents/apply-skills-gap-filler.md +109 -0
- package/resources/skills/skills/career/job-hunter/agents/career-internal.md +94 -0
- package/resources/skills/skills/career/job-hunter/agents/career-linkedin-content.md +173 -0
- package/resources/skills/skills/career/job-hunter/agents/career-linkedin-scanner.md +262 -0
- package/resources/skills/skills/career/job-hunter/agents/career-network-message.md +108 -0
- package/resources/skills/skills/career/job-hunter/agents/career-promote.md +102 -0
- package/resources/skills/skills/career/job-hunter/agents/career-review.md +71 -0
- package/resources/skills/skills/career/job-hunter/agents/interview-debrief.md +117 -0
- package/resources/skills/skills/career/job-hunter/agents/interview-mock.md +171 -0
- package/resources/skills/skills/career/job-hunter/agents/interview-panel-decoder.md +152 -0
- package/resources/skills/skills/career/job-hunter/agents/interview-prep.md +184 -0
- package/resources/skills/skills/career/job-hunter/agents/interview-question-bank.md +133 -0
- package/resources/skills/skills/career/job-hunter/agents/interview-research.md +148 -0
- package/resources/skills/skills/career/job-hunter/agents/offer-compare.md +117 -0
- package/resources/skills/skills/career/job-hunter/agents/offer-counteroffer.md +144 -0
- package/resources/skills/skills/career/job-hunter/agents/offer-deadline-manager.md +148 -0
- package/resources/skills/skills/career/job-hunter/agents/offer-negotiate.md +126 -0
- package/resources/skills/skills/career/job-hunter/agents/offer-schedule.md +99 -0
- package/resources/skills/skills/career/job-hunter/agents/offer-thankyou.md +80 -0
- package/resources/skills/skills/career/job-hunter/agents/search-company-research.md +146 -0
- package/resources/skills/skills/career/job-hunter/agents/search-follow-up.md +129 -0
- package/resources/skills/skills/career/job-hunter/agents/search-ghost-job-detector.md +152 -0
- package/resources/skills/skills/career/job-hunter/agents/search-inbox-scan.md +193 -0
- package/resources/skills/skills/career/job-hunter/agents/search-interview-scorecard.md +164 -0
- package/resources/skills/skills/career/job-hunter/agents/search-jobs.md +149 -0
- package/resources/skills/skills/career/job-hunter/agents/search-momentum-check.md +194 -0
- package/resources/skills/skills/career/job-hunter/agents/search-outreach.md +85 -0
- package/resources/skills/skills/career/job-hunter/agents/search-referral-finder.md +124 -0
- package/resources/skills/skills/career/job-hunter/agents/search-salary.md +96 -0
- package/resources/skills/skills/career/job-hunter/agents/search-send-email.md +109 -0
- package/resources/skills/skills/career/job-hunter/agents/search-tracker-update.md +127 -0
- package/resources/skills/skills/career/job-hunter/inputs/README.md +26 -0
- package/resources/skills/skills/career/job-hunter/inputs/apply-linkedin-url.txt +8 -0
- package/resources/skills/skills/career/job-hunter/inputs/interview-context.md +24 -0
- package/resources/skills/skills/career/job-hunter/inputs/job-description.md +20 -0
- package/resources/skills/skills/career/job-hunter/inputs/job-search-criteria.md +36 -0
- package/resources/skills/skills/career/job-hunter/inputs/my-linkedin.md +24 -0
- package/resources/skills/skills/career/job-hunter/inputs/my-resume.md +28 -0
- package/resources/skills/skills/career/job-hunter/inputs/search-outreach-target.md +24 -0
- package/resources/skills/skills/career/job-hunter/rules/README.md +37 -0
- package/resources/skills/skills/career/job-hunter/rules/writing-rules.md +81 -0
- package/resources/skills/skills/design/banana/SKILL.md +375 -0
- package/resources/skills/skills/design/banana/references/cost-tracking.md +47 -0
- package/resources/skills/skills/design/banana/references/gemini-models.md +236 -0
- package/resources/skills/skills/design/banana/references/mcp-tools.md +145 -0
- package/resources/skills/skills/design/banana/references/post-processing.md +192 -0
- package/resources/skills/skills/design/banana/references/presets.md +69 -0
- package/resources/skills/skills/design/banana/references/prompt-engineering.md +481 -0
- package/resources/skills/skills/design/banana/scripts/batch.py +97 -0
- package/resources/skills/skills/design/banana/scripts/cost_tracker.py +191 -0
- package/resources/skills/skills/design/banana/scripts/edit.py +159 -0
- package/resources/skills/skills/design/banana/scripts/generate.py +168 -0
- package/resources/skills/skills/design/banana/scripts/presets.py +154 -0
- package/resources/skills/skills/design/banana/scripts/setup_mcp.py +151 -0
- package/resources/skills/skills/design/banana/scripts/validate_setup.py +133 -0
- package/resources/skills/skills/gstack/ship/SKILL.md +13 -0
- package/resources/skills/skills/media/3d-logo-animation/SKILL.md +59 -0
- package/resources/skills/skills/media/action-figure-generator/SKILL.md +48 -0
- package/resources/skills/skills/media/ad-creative/SKILL.md +79 -0
- package/resources/skills/skills/media/ai-clipping/SKILL.md +194 -0
- package/resources/skills/skills/media/ai-clipping/scripts/run-ai-clipping.sh +200 -0
- package/resources/skills/skills/media/ai-fight-scene/SKILL.md +132 -0
- package/resources/skills/skills/media/amazon-product-listing/SKILL.md +68 -0
- package/resources/skills/skills/media/animal-video-generator/SKILL.md +59 -0
- package/resources/skills/skills/media/award-ceremony-video/SKILL.md +87 -0
- package/resources/skills/skills/media/blog-header/SKILL.md +61 -0
- package/resources/skills/skills/media/brand-kit/SKILL.md +72 -0
- package/resources/skills/skills/media/brochures/SKILL.md +65 -0
- package/resources/skills/skills/media/cartoon-dance-animation/SKILL.md +62 -0
- package/resources/skills/skills/media/character-story-video/SKILL.md +84 -0
- package/resources/skills/skills/media/chibi-collage-effect/SKILL.md +63 -0
- package/resources/skills/skills/media/cinema-director/SKILL.md +93 -0
- package/resources/skills/skills/media/cinema-director/scripts/generate-film.sh +78 -0
- package/resources/skills/skills/media/color-analysis-board/SKILL.md +71 -0
- package/resources/skills/skills/media/core-edit/SKILL.md +48 -0
- package/resources/skills/skills/media/core-edit/edit-image.sh +54 -0
- package/resources/skills/skills/media/core-edit/enhance-image.sh +191 -0
- package/resources/skills/skills/media/core-edit/lipsync.sh +144 -0
- package/resources/skills/skills/media/core-edit/video-effects.sh +193 -0
- package/resources/skills/skills/media/core-media/SKILL.md +49 -0
- package/resources/skills/skills/media/core-media/create-music.sh +169 -0
- package/resources/skills/skills/media/core-media/generate-image.sh +161 -0
- package/resources/skills/skills/media/core-media/generate-video.sh +137 -0
- package/resources/skills/skills/media/core-media/image-to-video.sh +228 -0
- package/resources/skills/skills/media/core-media/schema_data.json +18708 -0
- package/resources/skills/skills/media/core-media/upload.sh +41 -0
- package/resources/skills/skills/media/core-platform/SKILL.md +41 -0
- package/resources/skills/skills/media/core-platform/check-result.sh +37 -0
- package/resources/skills/skills/media/core-platform/setup.sh +31 -0
- package/resources/skills/skills/media/couple-grid-creator/SKILL.md +47 -0
- package/resources/skills/skills/media/design-guide/SKILL.md +73 -0
- package/resources/skills/skills/media/drone-style-video/SKILL.md +61 -0
- package/resources/skills/skills/media/fashion-try-on/SKILL.md +61 -0
- package/resources/skills/skills/media/floor-plan-rendering/SKILL.md +56 -0
- package/resources/skills/skills/media/freeze-effect-video/SKILL.md +100 -0
- package/resources/skills/skills/media/giant-product-showcase/SKILL.md +61 -0
- package/resources/skills/skills/media/instagram-post/SKILL.md +58 -0
- package/resources/skills/skills/media/interior-design/SKILL.md +61 -0
- package/resources/skills/skills/media/interior-design-visualizer/SKILL.md +57 -0
- package/resources/skills/skills/media/jewelry-product-video/SKILL.md +61 -0
- package/resources/skills/skills/media/kdenlive/SKILL.md +106 -0
- package/resources/skills/skills/media/kdenlive/scripts/assemble.sh +57 -0
- package/resources/skills/skills/media/kdenlive/scripts/common.sh +30 -0
- package/resources/skills/skills/media/kdenlive/scripts/inspect.sh +19 -0
- package/resources/skills/skills/media/kdenlive/scripts/reframe.sh +22 -0
- package/resources/skills/skills/media/kdenlive/scripts/render.sh +16 -0
- package/resources/skills/skills/media/kdenlive/scripts/title-card.sh +25 -0
- package/resources/skills/skills/media/keyboard-art-maker/SKILL.md +44 -0
- package/resources/skills/skills/media/logo-branding/SKILL.md +70 -0
- package/resources/skills/skills/media/logo-creator/SKILL.md +80 -0
- package/resources/skills/skills/media/logo-creator/scripts/create-logo.sh +38 -0
- package/resources/skills/skills/media/logo-generator/SKILL.md +56 -0
- package/resources/skills/skills/media/multi-angle-reshoot/SKILL.md +70 -0
- package/resources/skills/skills/media/multi-angle-shots/SKILL.md +73 -0
- package/resources/skills/skills/media/music-video/SKILL.md +61 -0
- package/resources/skills/skills/media/nano-banana/SKILL.md +80 -0
- package/resources/skills/skills/media/nano-banana/scripts/generate-nano-art.sh +54 -0
- package/resources/skills/skills/media/one-shot-video/SKILL.md +56 -0
- package/resources/skills/skills/media/photo-pack-generator/SKILL.md +205 -0
- package/resources/skills/skills/media/photo-pack-generator/scripts/generate-pack.sh +241 -0
- package/resources/skills/skills/media/product-ad-cinematic/SKILL.md +78 -0
- package/resources/skills/skills/media/product-campaign/SKILL.md +76 -0
- package/resources/skills/skills/media/product-showcase-video/SKILL.md +60 -0
- package/resources/skills/skills/media/product-video-ad-maker/SKILL.md +59 -0
- package/resources/skills/skills/media/rednote-cover/SKILL.md +57 -0
- package/resources/skills/skills/media/seedance-2/SKILL.md +632 -0
- package/resources/skills/skills/media/seedance-2/scripts/generate-seedance.sh +701 -0
- package/resources/skills/skills/media/selfie-with-celebrities/SKILL.md +64 -0
- package/resources/skills/skills/media/social-media-video/SKILL.md +277 -0
- package/resources/skills/skills/media/social-media-video/scripts/run-social-video.sh +316 -0
- package/resources/skills/skills/media/social-pack/SKILL.md +58 -0
- package/resources/skills/skills/media/storyboard/SKILL.md +57 -0
- package/resources/skills/skills/media/storyboard-to-cooking-video/SKILL.md +143 -0
- package/resources/skills/skills/media/talking-baby-video/SKILL.md +57 -0
- package/resources/skills/skills/media/ugc-ads-workflow/SKILL.md +70 -0
- package/resources/skills/skills/media/ugc-lifestyle-try-on/SKILL.md +65 -0
- package/resources/skills/skills/media/ugc-video-factory/SKILL.md +134 -0
- package/resources/skills/skills/media/ui-design/SKILL.md +81 -0
- package/resources/skills/skills/media/ui-design/scripts/generate-mockup.sh +49 -0
- package/resources/skills/skills/media/url-to-design/SKILL.md +61 -0
- package/resources/skills/skills/media/workflow/SKILL.md +197 -0
- package/resources/skills/skills/media/workflow/scripts/discover-workflow.sh +18 -0
- package/resources/skills/skills/media/workflow/scripts/generate-workflow.sh +33 -0
- package/resources/skills/skills/media/workflow/scripts/interactive-run.sh +16 -0
- package/resources/skills/skills/media/workflow/scripts/list-workflows.sh +20 -0
- package/resources/skills/skills/media/workflow/scripts/run-workflow.sh +34 -0
- package/resources/skills/skills/media/youtube-shorts/SKILL.md +173 -0
- package/resources/skills/skills/media/youtube-shorts/scripts/run-youtube-shorts.sh +141 -0
- package/resources/skills/skills/media/youtube-thumbnail/SKILL.md +66 -0
- package/resources/skills/skills/meta/cue-developer/references/architecture.md +2 -2
- package/resources/skills/skills/meta/cue-usage/SKILL.md +1 -1
- package/resources/skills/skills/meta/profile-fit-monitor/SKILL.md +2 -2
- package/resources/skills/skills/meta/profile-optimizer/SKILL.md +1 -1
- package/resources/skills/skills/meta/profile-suggest/SKILL.md +7 -7
- package/resources/skills/skills/meta/profile-summon/SKILL.md +159 -0
- package/resources/skills/skills/meta/profile-summon/evals/evals.json +53 -0
- package/resources/skills/skills/meta/save-profile/SKILL.md +1 -1
- package/resources/skills/skills/meta/skill-reviewer/SKILL.md +3 -0
- package/resources/skills/skills/meta/skill-reviewer/references/tdd-for-skills.md +55 -0
- package/resources/skills/skills/research/find-skills/SKILL.md +1 -1
- package/resources/skills/skills/review/code-review-deep/SKILL.md +20 -0
- package/resources/skills/skills/security/trivy-scan/SKILL.md +139 -0
- package/resources/skills/skills/security/trivy-scan/scripts/ensure-trivy.sh +21 -0
- package/resources/skills/skills/tools/ccusage/SKILL.md +142 -0
- package/src/commands/_index.ts +8 -0
- package/src/commands/ai.ts +2 -2
- package/src/commands/auto-detect.test.ts +74 -0
- package/src/commands/auto-detect.ts +9 -7
- package/src/commands/cli.test.ts +20 -4
- package/src/commands/cli.ts +36 -20
- package/src/commands/create-profile.ts +2 -2
- package/src/commands/debug.ts +2 -2
- package/src/commands/discover.ts +14 -4
- package/src/commands/export-docker.ts +1 -1
- package/src/commands/features-batch1.test.ts +1 -1
- package/src/commands/gates.ts +1 -1
- package/src/commands/import-profile.ts +1 -1
- package/src/commands/init.ts +15 -11
- package/src/commands/install.test.ts +192 -0
- package/src/commands/install.ts +610 -0
- package/src/commands/launch-handoff.e2e.test.ts +33 -1
- package/src/commands/launch.e2e.test.ts +15 -10
- package/src/commands/launch.ts +73 -116
- package/src/commands/materialize.ts +2 -2
- package/src/commands/prune.ts +1 -1
- package/src/commands/security-audit.ts +1 -1
- package/src/commands/shell.ts +7 -7
- package/src/commands/skill-report.ts +1 -1
- package/src/commands/skills.ts +3 -3
- package/src/commands/snapshot.ts +2 -2
- package/src/commands/summon.test.ts +116 -0
- package/src/commands/summon.ts +338 -0
- package/src/commands/trigger-gaps.ts +1 -1
- package/src/commands/use.ts +47 -3
- package/src/commands/watch-live.ts +5 -5
- package/src/commands/watch.ts +8 -8
- package/src/index.ts +2 -0
- package/src/lib/active-sessions.test.ts +3 -3
- package/src/lib/active-sessions.ts +4 -4
- package/src/lib/auto-detect.test.ts +172 -8
- package/src/lib/auto-detect.ts +191 -136
- package/src/lib/codex-persona-parity.test.ts +58 -0
- package/src/lib/companion-detect.test.ts +43 -1
- package/src/lib/companion-detect.ts +35 -0
- package/src/lib/credentials-sync.test.ts +121 -1
- package/src/lib/credentials-sync.ts +95 -1
- package/src/lib/cwd-resolver.test.ts +8 -8
- package/src/lib/cwd-resolver.ts +2 -2
- package/src/lib/dashboard-merge.test.ts +9 -4
- package/src/lib/dashboard-server.ts +1 -1
- package/src/lib/picker.test.ts +1 -1
- package/src/lib/picker.ts +5 -5
- package/src/lib/profile-merge.test.ts +8 -0
- package/src/lib/profile-names.test.ts +3 -3
- package/src/lib/runtime-install.ts +166 -0
- package/src/lib/runtime-materializer.test.ts +137 -0
- package/src/lib/runtime-materializer.ts +105 -2
- package/src/lib/skill-router.test.ts +38 -0
- package/src/lib/skill-router.ts +65 -4
- package/profiles/eu-tender-research/README.md +0 -48
- package/profiles/eu-tender-research/logo.png +0 -0
- package/profiles/eu-tender-research/profile.yaml +0 -108
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# muapi.ai Image Editing
|
|
3
|
+
# Usage: ./edit-image.sh --image-url URL --prompt "..." [--model MODEL]
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
IMAGE_URL=""
|
|
8
|
+
IMAGE_FILE=""
|
|
9
|
+
PROMPT=""
|
|
10
|
+
MODEL="flux-kontext-pro"
|
|
11
|
+
ASPECT_RATIO="1:1"
|
|
12
|
+
NUM_IMAGES=1
|
|
13
|
+
ASYNC=false
|
|
14
|
+
JSON_ONLY=false
|
|
15
|
+
JQ_EXPR=""
|
|
16
|
+
TIMEOUT=300
|
|
17
|
+
|
|
18
|
+
while [[ $# -gt 0 ]]; do
|
|
19
|
+
case $1 in
|
|
20
|
+
--image-url) IMAGE_URL="$2"; shift 2 ;;
|
|
21
|
+
--file|-f) IMAGE_FILE="$2"; shift 2 ;;
|
|
22
|
+
--prompt|-p) PROMPT="$2"; shift 2 ;;
|
|
23
|
+
--model|-m) MODEL="$2"; shift 2 ;;
|
|
24
|
+
--aspect-ratio) ASPECT_RATIO="$2"; shift 2 ;;
|
|
25
|
+
--num-images) NUM_IMAGES="$2"; shift 2 ;;
|
|
26
|
+
--async) ASYNC=true; shift ;;
|
|
27
|
+
--timeout) TIMEOUT="$2"; shift 2 ;;
|
|
28
|
+
--json) JSON_ONLY=true; shift ;;
|
|
29
|
+
--jq) JQ_EXPR="$2"; shift 2 ;;
|
|
30
|
+
--help|-h)
|
|
31
|
+
echo "Usage: ./edit-image.sh --image-url URL --prompt \"...\" [options]"
|
|
32
|
+
echo ""
|
|
33
|
+
muapi image models
|
|
34
|
+
exit 0 ;;
|
|
35
|
+
*) shift ;;
|
|
36
|
+
esac
|
|
37
|
+
done
|
|
38
|
+
|
|
39
|
+
if [ -z "$PROMPT" ]; then echo "Error: --prompt is required" >&2; exit 1; fi
|
|
40
|
+
|
|
41
|
+
# Auto-upload local file if provided
|
|
42
|
+
if [ -n "$IMAGE_FILE" ]; then
|
|
43
|
+
echo "Uploading $(basename "$IMAGE_FILE")..." >&2
|
|
44
|
+
IMAGE_URL=$(bash "$(dirname "$0")/../media/upload.sh" --file "$IMAGE_FILE")
|
|
45
|
+
fi
|
|
46
|
+
|
|
47
|
+
if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url or --file is required" >&2; exit 1; fi
|
|
48
|
+
|
|
49
|
+
ARGS=(--model "$MODEL" --image "$IMAGE_URL" --aspect-ratio "$ASPECT_RATIO" --num-images "$NUM_IMAGES")
|
|
50
|
+
[ "$JSON_ONLY" = true ] && ARGS+=(--output-json)
|
|
51
|
+
[ -n "$JQ_EXPR" ] && ARGS+=(--jq "$JQ_EXPR")
|
|
52
|
+
[ "$ASYNC" = true ] && ARGS+=(--no-wait) || ARGS+=(--wait)
|
|
53
|
+
|
|
54
|
+
muapi image edit "$PROMPT" "${ARGS[@]}"
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# muapi.ai Image Enhancement (one-click operations)
|
|
3
|
+
# Usage: ./enhance-image.sh --op upscale --image-url URL
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
MUAPI_BASE="https://api.muapi.ai/api/v1"
|
|
8
|
+
|
|
9
|
+
OP=""
|
|
10
|
+
IMAGE_URL=""
|
|
11
|
+
IMAGE_FILE=""
|
|
12
|
+
FACE_URL=""
|
|
13
|
+
FACE_FILE=""
|
|
14
|
+
MASK_URL=""
|
|
15
|
+
MASK_FILE=""
|
|
16
|
+
PROMPT=""
|
|
17
|
+
ASYNC=false
|
|
18
|
+
JSON_ONLY=false
|
|
19
|
+
MAX_WAIT=300
|
|
20
|
+
POLL_INTERVAL=3
|
|
21
|
+
|
|
22
|
+
for arg in "$@"; do
|
|
23
|
+
if [ "$arg" = "--add-key" ]; then
|
|
24
|
+
shift
|
|
25
|
+
KEY_VALUE=""
|
|
26
|
+
if [[ -n "$1" && ! "$1" =~ ^-- ]]; then KEY_VALUE="$1"; fi
|
|
27
|
+
if [ -z "$KEY_VALUE" ]; then echo "Enter your muapi.ai API key:" >&2; read -r KEY_VALUE; fi
|
|
28
|
+
if [ -n "$KEY_VALUE" ]; then
|
|
29
|
+
grep -v "^MUAPI_KEY=" .env > .env.tmp 2>/dev/null || true
|
|
30
|
+
mv .env.tmp .env 2>/dev/null || true
|
|
31
|
+
echo "MUAPI_KEY=$KEY_VALUE" >> .env
|
|
32
|
+
echo "MUAPI_KEY saved to .env" >&2
|
|
33
|
+
fi
|
|
34
|
+
exit 0
|
|
35
|
+
fi
|
|
36
|
+
done
|
|
37
|
+
|
|
38
|
+
if [ -f ".env" ]; then source .env 2>/dev/null || true; fi
|
|
39
|
+
|
|
40
|
+
while [[ $# -gt 0 ]]; do
|
|
41
|
+
case $1 in
|
|
42
|
+
--op) OP="$2"; shift 2 ;;
|
|
43
|
+
--image-url) IMAGE_URL="$2"; shift 2 ;;
|
|
44
|
+
--file) IMAGE_FILE="$2"; shift 2 ;;
|
|
45
|
+
--face-url) FACE_URL="$2"; shift 2 ;;
|
|
46
|
+
--face-file) FACE_FILE="$2"; shift 2 ;;
|
|
47
|
+
--mask-url) MASK_URL="$2"; shift 2 ;;
|
|
48
|
+
--mask-file) MASK_FILE="$2"; shift 2 ;;
|
|
49
|
+
--prompt|-p) PROMPT="$2"; shift 2 ;;
|
|
50
|
+
--async) ASYNC=true; shift ;;
|
|
51
|
+
--timeout) MAX_WAIT="$2"; shift 2 ;;
|
|
52
|
+
--json) JSON_ONLY=true; shift ;;
|
|
53
|
+
--help|-h)
|
|
54
|
+
echo "muapi.ai Image Enhancement" >&2
|
|
55
|
+
echo "" >&2
|
|
56
|
+
echo "Usage: ./enhance-image.sh --op OPERATION --image-url URL" >&2
|
|
57
|
+
echo "" >&2
|
|
58
|
+
echo "Operations (--op):" >&2
|
|
59
|
+
echo " upscale Upscale image resolution" >&2
|
|
60
|
+
echo " background-remove Remove image background" >&2
|
|
61
|
+
echo " face-swap Swap face (requires --face-url)" >&2
|
|
62
|
+
echo " skin-enhance Smooth and enhance skin" >&2
|
|
63
|
+
echo " colorize Colorize black & white photo" >&2
|
|
64
|
+
echo " ghibli Studio Ghibli art style" >&2
|
|
65
|
+
echo " anime Anime style (optional --prompt)" >&2
|
|
66
|
+
echo " extend Extend/outpaint image" >&2
|
|
67
|
+
echo " product-shot Clean product shot background" >&2
|
|
68
|
+
echo " product-photo Professional product photography (requires --prompt)" >&2
|
|
69
|
+
echo " object-erase Erase object (requires --mask-url or --mask-file index)" >&2
|
|
70
|
+
echo "" >&2
|
|
71
|
+
echo "File Inputs:" >&2
|
|
72
|
+
echo " --file Main image file" >&2
|
|
73
|
+
echo " --face-file Face image for swap" >&2
|
|
74
|
+
echo " --mask-file Mask image for erase" >&2
|
|
75
|
+
exit 0 ;;
|
|
76
|
+
*) shift ;;
|
|
77
|
+
esac
|
|
78
|
+
done
|
|
79
|
+
|
|
80
|
+
if [ -z "$MUAPI_KEY" ]; then echo "Error: MUAPI_KEY not set" >&2; exit 1; fi
|
|
81
|
+
if [ -z "$OP" ]; then echo "Error: --op is required" >&2; exit 1; fi
|
|
82
|
+
|
|
83
|
+
HEADERS=(-H "x-api-key: $MUAPI_KEY" -H "Content-Type: application/json")
|
|
84
|
+
|
|
85
|
+
# Auto-upload local files
|
|
86
|
+
upload_file() {
|
|
87
|
+
local FPATH="$1"
|
|
88
|
+
if [ ! -f "$FPATH" ]; then echo "Error: File not found: $FPATH" >&2; exit 1; fi
|
|
89
|
+
[ "$JSON_ONLY" = false ] && echo "Uploading $(basename "$FPATH")..." >&2
|
|
90
|
+
local RESP=$(curl -s -X POST "${MUAPI_BASE}/upload_file" -H "x-api-key: $MUAPI_KEY" -F "file=@${FPATH}")
|
|
91
|
+
local URL=$(echo "$RESP" | jq -r '.url // empty')
|
|
92
|
+
if [ -z "$URL" ]; then
|
|
93
|
+
local ERR=$(echo "$RESP" | jq -r '.error // .detail // "Upload failed"')
|
|
94
|
+
echo "Error: $ERR" >&2; exit 1
|
|
95
|
+
fi
|
|
96
|
+
echo "$URL"
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if [ -n "$IMAGE_FILE" ]; then IMAGE_URL=$(upload_file "$IMAGE_FILE"); fi
|
|
100
|
+
if [ -n "$FACE_FILE" ]; then FACE_URL=$(upload_file "$FACE_FILE"); fi
|
|
101
|
+
if [ -n "$MASK_FILE" ]; then MASK_URL=$(upload_file "$MASK_FILE"); fi
|
|
102
|
+
|
|
103
|
+
if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url or --file is required" >&2; exit 1; fi
|
|
104
|
+
IMAGE_URL_CLEAN=$(echo "$IMAGE_URL" | tr -d '"')
|
|
105
|
+
|
|
106
|
+
# Map operation to endpoint and payload
|
|
107
|
+
PROMPT_JSON=$(echo "${PROMPT:-}" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().rstrip()))')
|
|
108
|
+
|
|
109
|
+
case $OP in
|
|
110
|
+
upscale)
|
|
111
|
+
ENDPOINT="ai-image-upscale"
|
|
112
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
|
|
113
|
+
background-remove)
|
|
114
|
+
ENDPOINT="ai-background-remover"
|
|
115
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
|
|
116
|
+
face-swap)
|
|
117
|
+
if [ -z "$FACE_URL" ]; then echo "Error: --face-url is required for face-swap" >&2; exit 1; fi
|
|
118
|
+
FACE_CLEAN=$(echo "$FACE_URL" | tr -d '"')
|
|
119
|
+
ENDPOINT="ai-image-face-swap"
|
|
120
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\", \"face_image_url\": \"$FACE_CLEAN\"}" ;;
|
|
121
|
+
skin-enhance)
|
|
122
|
+
ENDPOINT="ai-skin-enhancer"
|
|
123
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
|
|
124
|
+
colorize)
|
|
125
|
+
ENDPOINT="ai-color-photo"
|
|
126
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
|
|
127
|
+
ghibli)
|
|
128
|
+
ENDPOINT="ai-ghibli-style"
|
|
129
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
|
|
130
|
+
anime)
|
|
131
|
+
ENDPOINT="ai-anime-generator"
|
|
132
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\", \"prompt\": $PROMPT_JSON}" ;;
|
|
133
|
+
extend)
|
|
134
|
+
ENDPOINT="ai-image-extension"
|
|
135
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
|
|
136
|
+
product-shot)
|
|
137
|
+
ENDPOINT="ai-product-shot"
|
|
138
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\"}" ;;
|
|
139
|
+
product-photo)
|
|
140
|
+
ENDPOINT="ai-product-photography"
|
|
141
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\", \"prompt\": $PROMPT_JSON}" ;;
|
|
142
|
+
object-erase)
|
|
143
|
+
if [ -z "$MASK_URL" ]; then echo "Error: --mask-url is required for object-erase" >&2; exit 1; fi
|
|
144
|
+
MASK_CLEAN=$(echo "$MASK_URL" | tr -d '"')
|
|
145
|
+
ENDPOINT="ai-object-eraser"
|
|
146
|
+
PAYLOAD="{\"image_url\": \"$IMAGE_URL_CLEAN\", \"mask_url\": \"$MASK_CLEAN\"}" ;;
|
|
147
|
+
*)
|
|
148
|
+
echo "Error: Unknown operation '$OP'" >&2
|
|
149
|
+
echo "Valid: upscale, background-remove, face-swap, skin-enhance, colorize," >&2
|
|
150
|
+
echo " ghibli, anime, extend, product-shot, product-photo, object-erase" >&2
|
|
151
|
+
exit 1 ;;
|
|
152
|
+
esac
|
|
153
|
+
|
|
154
|
+
[ "$JSON_ONLY" = false ] && echo "Submitting $OP to $ENDPOINT..." >&2
|
|
155
|
+
|
|
156
|
+
SUBMIT=$(curl -s -X POST "${MUAPI_BASE}/${ENDPOINT}" "${HEADERS[@]}" -d "$PAYLOAD")
|
|
157
|
+
|
|
158
|
+
if echo "$SUBMIT" | grep -q '"error"\|"detail"'; then
|
|
159
|
+
ERR=$(echo "$SUBMIT" | grep -o '"detail":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
160
|
+
[ -z "$ERR" ] && ERR=$(echo "$SUBMIT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
161
|
+
echo "Error: ${ERR:-$SUBMIT}" >&2; exit 1
|
|
162
|
+
fi
|
|
163
|
+
|
|
164
|
+
REQUEST_ID=$(echo "$SUBMIT" | grep -oE '"request_id"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
|
|
165
|
+
if [ -z "$REQUEST_ID" ]; then echo "Error: No request_id" >&2; echo "$SUBMIT" >&2; exit 1; fi
|
|
166
|
+
[ "$JSON_ONLY" = false ] && echo "Request ID: $REQUEST_ID" >&2
|
|
167
|
+
|
|
168
|
+
if [ "$ASYNC" = true ]; then
|
|
169
|
+
[ "$JSON_ONLY" = false ] && echo "Check: bash check-result.sh --id \"$REQUEST_ID\"" >&2
|
|
170
|
+
echo "$SUBMIT"; exit 0
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
[ "$JSON_ONLY" = false ] && echo "Processing..." >&2
|
|
174
|
+
ELAPSED=0; LAST_STATUS=""
|
|
175
|
+
while [ $ELAPSED -lt $MAX_WAIT ]; do
|
|
176
|
+
sleep $POLL_INTERVAL; ELAPSED=$((ELAPSED + POLL_INTERVAL))
|
|
177
|
+
RESULT=$(curl -s -X GET "${MUAPI_BASE}/predictions/${REQUEST_ID}/result" "${HEADERS[@]}")
|
|
178
|
+
STATUS=$(echo "$RESULT" | grep -oE '"status"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
|
|
179
|
+
if [ "$STATUS" != "$LAST_STATUS" ] && [ "$JSON_ONLY" = false ]; then echo "Status: $STATUS" >&2; LAST_STATUS="$STATUS"; fi
|
|
180
|
+
case $STATUS in
|
|
181
|
+
completed)
|
|
182
|
+
[ "$JSON_ONLY" = false ] && echo "Done!" >&2
|
|
183
|
+
URL=$(echo "$RESULT" | grep -o '"outputs":\[[^]]*\]' | grep -o '"[^"]*\.\(png\|jpg\|jpeg\|webp\)"' | head -1 | tr -d '"')
|
|
184
|
+
[ -n "$URL" ] && [ "$JSON_ONLY" = false ] && echo "Image URL: $URL" >&2
|
|
185
|
+
echo "$RESULT"; exit 0 ;;
|
|
186
|
+
failed)
|
|
187
|
+
ERR=$(echo "$RESULT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
188
|
+
echo "Error: ${ERR:-Enhancement failed}" >&2; echo "$RESULT"; exit 1 ;;
|
|
189
|
+
esac
|
|
190
|
+
done
|
|
191
|
+
echo "Error: Timeout after ${MAX_WAIT}s — Request ID: $REQUEST_ID" >&2; exit 1
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# muapi.ai Lipsync
|
|
3
|
+
# Usage: ./lipsync.sh --video-url URL --audio-url URL [--model sync]
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
MUAPI_BASE="https://api.muapi.ai/api/v1"
|
|
8
|
+
|
|
9
|
+
VIDEO_URL=""
|
|
10
|
+
VIDEO_FILE=""
|
|
11
|
+
AUDIO_URL=""
|
|
12
|
+
AUDIO_FILE=""
|
|
13
|
+
MODEL="sync"
|
|
14
|
+
ASYNC=false
|
|
15
|
+
JSON_ONLY=false
|
|
16
|
+
MAX_WAIT=300
|
|
17
|
+
POLL_INTERVAL=5
|
|
18
|
+
|
|
19
|
+
for arg in "$@"; do
|
|
20
|
+
if [ "$arg" = "--add-key" ]; then
|
|
21
|
+
shift
|
|
22
|
+
KEY_VALUE=""
|
|
23
|
+
if [[ -n "$1" && ! "$1" =~ ^-- ]]; then KEY_VALUE="$1"; fi
|
|
24
|
+
if [ -z "$KEY_VALUE" ]; then echo "Enter your muapi.ai API key:" >&2; read -r KEY_VALUE; fi
|
|
25
|
+
if [ -n "$KEY_VALUE" ]; then
|
|
26
|
+
grep -v "^MUAPI_KEY=" .env > .env.tmp 2>/dev/null || true
|
|
27
|
+
mv .env.tmp .env 2>/dev/null || true
|
|
28
|
+
echo "MUAPI_KEY=$KEY_VALUE" >> .env
|
|
29
|
+
echo "MUAPI_KEY saved to .env" >&2
|
|
30
|
+
fi
|
|
31
|
+
exit 0
|
|
32
|
+
fi
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
if [ -f ".env" ]; then source .env 2>/dev/null || true; fi
|
|
36
|
+
|
|
37
|
+
while [[ $# -gt 0 ]]; do
|
|
38
|
+
case $1 in
|
|
39
|
+
--video-url) VIDEO_URL="$2"; shift 2 ;;
|
|
40
|
+
--video-file) VIDEO_FILE="$2"; shift 2 ;;
|
|
41
|
+
--audio-url) AUDIO_URL="$2"; shift 2 ;;
|
|
42
|
+
--audio-file) AUDIO_FILE="$2"; shift 2 ;;
|
|
43
|
+
--model|-m) MODEL="$2"; shift 2 ;;
|
|
44
|
+
--async) ASYNC=true; shift ;;
|
|
45
|
+
--timeout) MAX_WAIT="$2"; shift 2 ;;
|
|
46
|
+
--json) JSON_ONLY=true; shift ;;
|
|
47
|
+
--help|-h)
|
|
48
|
+
echo "muapi.ai Lipsync" >&2
|
|
49
|
+
echo "" >&2
|
|
50
|
+
echo "Usage: ./lipsync.sh --video-url URL --audio-url URL [options]" >&2
|
|
51
|
+
echo "" >&2
|
|
52
|
+
echo "Models (--model):" >&2
|
|
53
|
+
echo " sync Sync Labs — high quality (default)" >&2
|
|
54
|
+
echo " latent LatentSync — open source" >&2
|
|
55
|
+
echo " creatify Creatify — fast" >&2
|
|
56
|
+
echo " veed Veed — reliable" >&2
|
|
57
|
+
echo "" >&2
|
|
58
|
+
echo "File Inputs:" >&2
|
|
59
|
+
echo " --video-file Local video file" >&2
|
|
60
|
+
echo " --audio-file Local audio file" >&2
|
|
61
|
+
exit 0 ;;
|
|
62
|
+
*) shift ;;
|
|
63
|
+
esac
|
|
64
|
+
done
|
|
65
|
+
|
|
66
|
+
if [ -z "$MUAPI_KEY" ]; then echo "Error: MUAPI_KEY not set" >&2; exit 1; fi
|
|
67
|
+
|
|
68
|
+
# Auto-upload local files
|
|
69
|
+
upload_file() {
|
|
70
|
+
local FPATH="$1"
|
|
71
|
+
if [ ! -f "$FPATH" ]; then echo "Error: File not found: $FPATH" >&2; exit 1; fi
|
|
72
|
+
[ "$JSON_ONLY" = false ] && echo "Uploading $(basename "$FPATH")..." >&2
|
|
73
|
+
local RESP=$(curl -s -X POST "${MUAPI_BASE}/upload_file" -H "x-api-key: $MUAPI_KEY" -F "file=@${FPATH}")
|
|
74
|
+
local URL=$(echo "$RESP" | jq -r '.url // empty')
|
|
75
|
+
if [ -z "$URL" ]; then
|
|
76
|
+
local ERR=$(echo "$RESP" | jq -r '.error // .detail // "Upload failed"')
|
|
77
|
+
echo "Error: $ERR" >&2; exit 1
|
|
78
|
+
fi
|
|
79
|
+
echo "$URL"
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if [ -n "$VIDEO_FILE" ]; then VIDEO_URL=$(upload_file "$VIDEO_FILE"); fi
|
|
83
|
+
if [ -n "$AUDIO_FILE" ]; then AUDIO_URL=$(upload_file "$AUDIO_FILE"); fi
|
|
84
|
+
|
|
85
|
+
if [ -z "$VIDEO_URL" ]; then echo "Error: --video-url or --video-file is required" >&2; exit 1; fi
|
|
86
|
+
if [ -z "$AUDIO_URL" ]; then echo "Error: --audio-url or --audio-file is required" >&2; exit 1; fi
|
|
87
|
+
|
|
88
|
+
HEADERS=(-H "x-api-key: $MUAPI_KEY" -H "Content-Type: application/json")
|
|
89
|
+
|
|
90
|
+
VIDEO_CLEAN=$(echo "$VIDEO_URL" | tr -d '"')
|
|
91
|
+
AUDIO_CLEAN=$(echo "$AUDIO_URL" | tr -d '"')
|
|
92
|
+
|
|
93
|
+
case $MODEL in
|
|
94
|
+
sync) ENDPOINT="sync-lipsync" ;;
|
|
95
|
+
latent) ENDPOINT="latentsync-video" ;;
|
|
96
|
+
creatify) ENDPOINT="creatify-lipsync" ;;
|
|
97
|
+
veed) ENDPOINT="veed-lipsync" ;;
|
|
98
|
+
*)
|
|
99
|
+
echo "Error: Unknown model '$MODEL'" >&2
|
|
100
|
+
echo "Valid: sync, latent, creatify, veed" >&2
|
|
101
|
+
exit 1 ;;
|
|
102
|
+
esac
|
|
103
|
+
|
|
104
|
+
PAYLOAD="{\"video_url\": \"$VIDEO_CLEAN\", \"audio_url\": \"$AUDIO_CLEAN\"}"
|
|
105
|
+
|
|
106
|
+
[ "$JSON_ONLY" = false ] && echo "Submitting lipsync (model: $MODEL)..." >&2
|
|
107
|
+
|
|
108
|
+
SUBMIT=$(curl -s -X POST "${MUAPI_BASE}/${ENDPOINT}" "${HEADERS[@]}" -d "$PAYLOAD")
|
|
109
|
+
|
|
110
|
+
if echo "$SUBMIT" | grep -q '"error"\|"detail"'; then
|
|
111
|
+
ERR=$(echo "$SUBMIT" | grep -o '"detail":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
112
|
+
[ -z "$ERR" ] && ERR=$(echo "$SUBMIT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
113
|
+
echo "Error: ${ERR:-$SUBMIT}" >&2; exit 1
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
REQUEST_ID=$(echo "$SUBMIT" | grep -oE '"request_id"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
|
|
117
|
+
if [ -z "$REQUEST_ID" ]; then echo "Error: No request_id" >&2; echo "$SUBMIT" >&2; exit 1; fi
|
|
118
|
+
[ "$JSON_ONLY" = false ] && echo "Request ID: $REQUEST_ID" >&2
|
|
119
|
+
|
|
120
|
+
if [ "$ASYNC" = true ]; then
|
|
121
|
+
[ "$JSON_ONLY" = false ] && echo "Lipsync takes 30–120s. Check: bash check-result.sh --id \"$REQUEST_ID\"" >&2
|
|
122
|
+
echo "$SUBMIT"; exit 0
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
[ "$JSON_ONLY" = false ] && echo "Processing lipsync (30–120s)..." >&2
|
|
126
|
+
ELAPSED=0; LAST_STATUS=""
|
|
127
|
+
while [ $ELAPSED -lt $MAX_WAIT ]; do
|
|
128
|
+
sleep $POLL_INTERVAL; ELAPSED=$((ELAPSED + POLL_INTERVAL))
|
|
129
|
+
RESULT=$(curl -s -X GET "${MUAPI_BASE}/predictions/${REQUEST_ID}/result" "${HEADERS[@]}")
|
|
130
|
+
STATUS=$(echo "$RESULT" | grep -oE '"status"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
|
|
131
|
+
if [ "$STATUS" != "$LAST_STATUS" ] && [ "$JSON_ONLY" = false ]; then echo "Status: $STATUS (${ELAPSED}s)" >&2; LAST_STATUS="$STATUS"; fi
|
|
132
|
+
case $STATUS in
|
|
133
|
+
completed)
|
|
134
|
+
[ "$JSON_ONLY" = false ] && echo "" >&2
|
|
135
|
+
[ "$JSON_ONLY" = false ] && echo "Lipsync complete!" >&2
|
|
136
|
+
URL=$(echo "$RESULT" | grep -o '"outputs":\[[^]]*\]' | grep -o '"[^"]*\.mp4"' | head -1 | tr -d '"')
|
|
137
|
+
[ -n "$URL" ] && [ "$JSON_ONLY" = false ] && echo "Video URL: $URL" >&2
|
|
138
|
+
echo "$RESULT"; exit 0 ;;
|
|
139
|
+
failed)
|
|
140
|
+
ERR=$(echo "$RESULT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
141
|
+
echo "Error: ${ERR:-Lipsync failed}" >&2; echo "$RESULT"; exit 1 ;;
|
|
142
|
+
esac
|
|
143
|
+
done
|
|
144
|
+
echo "Error: Timeout after ${MAX_WAIT}s — Request ID: $REQUEST_ID" >&2; exit 1
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# muapi.ai Video Effects
|
|
3
|
+
# Usage: ./video-effects.sh --op face-swap --video-url URL --face-url URL
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
MUAPI_BASE="https://api.muapi.ai/api/v1"
|
|
8
|
+
|
|
9
|
+
OP=""
|
|
10
|
+
VIDEO_URL=""
|
|
11
|
+
VIDEO_FILE=""
|
|
12
|
+
IMAGE_URL=""
|
|
13
|
+
IMAGE_FILE=""
|
|
14
|
+
FACE_URL=""
|
|
15
|
+
FACE_FILE=""
|
|
16
|
+
AUDIO_URL=""
|
|
17
|
+
AUDIO_FILE=""
|
|
18
|
+
PROMPT=""
|
|
19
|
+
EFFECT=""
|
|
20
|
+
ASYNC=false
|
|
21
|
+
JSON_ONLY=false
|
|
22
|
+
MAX_WAIT=300
|
|
23
|
+
POLL_INTERVAL=5
|
|
24
|
+
|
|
25
|
+
for arg in "$@"; do
|
|
26
|
+
if [ "$arg" = "--add-key" ]; then
|
|
27
|
+
shift
|
|
28
|
+
KEY_VALUE=""
|
|
29
|
+
if [[ -n "$1" && ! "$1" =~ ^-- ]]; then KEY_VALUE="$1"; fi
|
|
30
|
+
if [ -z "$KEY_VALUE" ]; then echo "Enter your muapi.ai API key:" >&2; read -r KEY_VALUE; fi
|
|
31
|
+
if [ -n "$KEY_VALUE" ]; then
|
|
32
|
+
grep -v "^MUAPI_KEY=" .env > .env.tmp 2>/dev/null || true
|
|
33
|
+
mv .env.tmp .env 2>/dev/null || true
|
|
34
|
+
echo "MUAPI_KEY=$KEY_VALUE" >> .env
|
|
35
|
+
echo "MUAPI_KEY saved to .env" >&2
|
|
36
|
+
fi
|
|
37
|
+
exit 0
|
|
38
|
+
fi
|
|
39
|
+
done
|
|
40
|
+
|
|
41
|
+
if [ -f ".env" ]; then source .env 2>/dev/null || true; fi
|
|
42
|
+
|
|
43
|
+
while [[ $# -gt 0 ]]; do
|
|
44
|
+
case $1 in
|
|
45
|
+
--op) OP="$2"; shift 2 ;;
|
|
46
|
+
--video-url) VIDEO_URL="$2"; shift 2 ;;
|
|
47
|
+
--video-file) VIDEO_FILE="$2"; shift 2 ;;
|
|
48
|
+
--image-url) IMAGE_URL="$2"; shift 2 ;;
|
|
49
|
+
--image-file) IMAGE_FILE="$2"; shift 2 ;;
|
|
50
|
+
--face-url) FACE_URL="$2"; shift 2 ;;
|
|
51
|
+
--face-file) FACE_FILE="$2"; shift 2 ;;
|
|
52
|
+
--audio-url) AUDIO_URL="$2"; shift 2 ;;
|
|
53
|
+
--audio-file) AUDIO_FILE="$2"; shift 2 ;;
|
|
54
|
+
--prompt|-p) PROMPT="$2"; shift 2 ;;
|
|
55
|
+
--effect) EFFECT="$2"; shift 2 ;;
|
|
56
|
+
--async) ASYNC=true; shift ;;
|
|
57
|
+
--timeout) MAX_WAIT="$2"; shift 2 ;;
|
|
58
|
+
--json) JSON_ONLY=true; shift ;;
|
|
59
|
+
--help|-h)
|
|
60
|
+
echo "muapi.ai Video Effects" >&2
|
|
61
|
+
echo "" >&2
|
|
62
|
+
echo "Operations (--op):" >&2
|
|
63
|
+
echo " wan-effects Wan AI effects on image (--image-url, --prompt)" >&2
|
|
64
|
+
echo " video-effect Named effect on video (--video-url, --effect)" >&2
|
|
65
|
+
echo " image-effect Named effect on image (--image-url, --effect)" >&2
|
|
66
|
+
echo " dance Dance animation (--image-url, --audio-url)" >&2
|
|
67
|
+
echo " face-swap Face swap in video (--video-url, --face-url)" >&2
|
|
68
|
+
echo " dress-change Change outfit (--image-url, --prompt)" >&2
|
|
69
|
+
echo " luma-modify Modify video with prompt (--video-url, --prompt)" >&2
|
|
70
|
+
echo " luma-reframe Reframe video (--video-url, --prompt)" >&2
|
|
71
|
+
echo " vidu-reference Vidu character reference (--image-url, --prompt)" >&2
|
|
72
|
+
echo "" >&2
|
|
73
|
+
echo "File Inputs:" >&2
|
|
74
|
+
echo " --video-file Local video file" >&2
|
|
75
|
+
echo " --image-file Local image file" >&2
|
|
76
|
+
echo " --face-file Local face image file" >&2
|
|
77
|
+
echo " --audio-file Local audio file" >&2
|
|
78
|
+
exit 0 ;;
|
|
79
|
+
*) shift ;;
|
|
80
|
+
esac
|
|
81
|
+
done
|
|
82
|
+
|
|
83
|
+
if [ -z "$MUAPI_KEY" ]; then echo "Error: MUAPI_KEY not set" >&2; exit 1; fi
|
|
84
|
+
if [ -z "$OP" ]; then echo "Error: --op is required" >&2; exit 1; fi
|
|
85
|
+
|
|
86
|
+
HEADERS=(-H "x-api-key: $MUAPI_KEY" -H "Content-Type: application/json")
|
|
87
|
+
PROMPT_JSON=$(echo "${PROMPT:-}" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().rstrip()))')
|
|
88
|
+
EFFECT_JSON=$(echo "${EFFECT:-}" | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read().rstrip()))')
|
|
89
|
+
|
|
90
|
+
clean_url() { echo "$1" | tr -d '"'; }
|
|
91
|
+
|
|
92
|
+
# Auto-upload local files
|
|
93
|
+
upload_file() {
|
|
94
|
+
local FPATH="$1"
|
|
95
|
+
if [ ! -f "$FPATH" ]; then echo "Error: File not found: $FPATH" >&2; exit 1; fi
|
|
96
|
+
[ "$JSON_ONLY" = false ] && echo "Uploading $(basename "$FPATH")..." >&2
|
|
97
|
+
local RESP=$(curl -s -X POST "${MUAPI_BASE}/upload_file" -H "x-api-key: $MUAPI_KEY" -F "file=@${FPATH}")
|
|
98
|
+
local URL=$(echo "$RESP" | jq -r '.url // empty')
|
|
99
|
+
if [ -z "$URL" ]; then
|
|
100
|
+
local ERR=$(echo "$RESP" | jq -r '.error // .detail // "Upload failed"')
|
|
101
|
+
echo "Error: $ERR" >&2; exit 1
|
|
102
|
+
fi
|
|
103
|
+
echo "$URL"
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if [ -n "$VIDEO_FILE" ]; then VIDEO_URL=$(upload_file "$VIDEO_FILE"); fi
|
|
107
|
+
if [ -n "$IMAGE_FILE" ]; then IMAGE_URL=$(upload_file "$IMAGE_FILE"); fi
|
|
108
|
+
if [ -n "$FACE_FILE" ]; then FACE_URL=$(upload_file "$FACE_FILE"); fi
|
|
109
|
+
if [ -n "$AUDIO_FILE" ]; then AUDIO_URL=$(upload_file "$AUDIO_FILE"); fi
|
|
110
|
+
|
|
111
|
+
case $OP in
|
|
112
|
+
wan-effects)
|
|
113
|
+
if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url required" >&2; exit 1; fi
|
|
114
|
+
ENDPOINT="generate_wan_ai_effects"
|
|
115
|
+
PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"prompt\": $PROMPT_JSON}" ;;
|
|
116
|
+
video-effect)
|
|
117
|
+
if [ -z "$VIDEO_URL" ]; then echo "Error: --video-url required" >&2; exit 1; fi
|
|
118
|
+
ENDPOINT="video-effects"
|
|
119
|
+
PAYLOAD="{\"video_url\": \"$(clean_url "$VIDEO_URL")\", \"effect\": $EFFECT_JSON}" ;;
|
|
120
|
+
image-effect)
|
|
121
|
+
if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url required" >&2; exit 1; fi
|
|
122
|
+
ENDPOINT="image-effects"
|
|
123
|
+
PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"effect\": $EFFECT_JSON}" ;;
|
|
124
|
+
dance)
|
|
125
|
+
if [ -z "$IMAGE_URL" ] || [ -z "$AUDIO_URL" ]; then
|
|
126
|
+
echo "Error: --image-url and --audio-url are required for dance" >&2; exit 1
|
|
127
|
+
fi
|
|
128
|
+
ENDPOINT="ai-dance-effects"
|
|
129
|
+
PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"audio_url\": \"$(clean_url "$AUDIO_URL")\"}" ;;
|
|
130
|
+
face-swap)
|
|
131
|
+
if [ -z "$VIDEO_URL" ] || [ -z "$FACE_URL" ]; then
|
|
132
|
+
echo "Error: --video-url and --face-url are required for face-swap" >&2; exit 1
|
|
133
|
+
fi
|
|
134
|
+
ENDPOINT="ai-video-face-swap"
|
|
135
|
+
PAYLOAD="{\"video_url\": \"$(clean_url "$VIDEO_URL")\", \"face_image_url\": \"$(clean_url "$FACE_URL")\"}" ;;
|
|
136
|
+
dress-change)
|
|
137
|
+
if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url required" >&2; exit 1; fi
|
|
138
|
+
ENDPOINT="ai-dress-change"
|
|
139
|
+
PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"prompt\": $PROMPT_JSON}" ;;
|
|
140
|
+
luma-modify)
|
|
141
|
+
if [ -z "$VIDEO_URL" ]; then echo "Error: --video-url required" >&2; exit 1; fi
|
|
142
|
+
ENDPOINT="luma-modify-video"
|
|
143
|
+
PAYLOAD="{\"video_url\": \"$(clean_url "$VIDEO_URL")\", \"prompt\": $PROMPT_JSON}" ;;
|
|
144
|
+
luma-reframe)
|
|
145
|
+
if [ -z "$VIDEO_URL" ]; then echo "Error: --video-url required" >&2; exit 1; fi
|
|
146
|
+
ENDPOINT="luma-flash-reframe"
|
|
147
|
+
PAYLOAD="{\"video_url\": \"$(clean_url "$VIDEO_URL")\", \"prompt\": $PROMPT_JSON}" ;;
|
|
148
|
+
vidu-reference)
|
|
149
|
+
if [ -z "$IMAGE_URL" ]; then echo "Error: --image-url required" >&2; exit 1; fi
|
|
150
|
+
ENDPOINT="vidu-q1-reference"
|
|
151
|
+
PAYLOAD="{\"image_url\": \"$(clean_url "$IMAGE_URL")\", \"prompt\": $PROMPT_JSON}" ;;
|
|
152
|
+
*)
|
|
153
|
+
echo "Error: Unknown operation '$OP'" >&2; exit 1 ;;
|
|
154
|
+
esac
|
|
155
|
+
|
|
156
|
+
[ "$JSON_ONLY" = false ] && echo "Submitting $OP to $ENDPOINT..." >&2
|
|
157
|
+
|
|
158
|
+
SUBMIT=$(curl -s -X POST "${MUAPI_BASE}/${ENDPOINT}" "${HEADERS[@]}" -d "$PAYLOAD")
|
|
159
|
+
|
|
160
|
+
if echo "$SUBMIT" | grep -q '"error"\|"detail"'; then
|
|
161
|
+
ERR=$(echo "$SUBMIT" | grep -o '"detail":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
162
|
+
[ -z "$ERR" ] && ERR=$(echo "$SUBMIT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
163
|
+
echo "Error: ${ERR:-$SUBMIT}" >&2; exit 1
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
REQUEST_ID=$(echo "$SUBMIT" | grep -oE '"request_id"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
|
|
167
|
+
if [ -z "$REQUEST_ID" ]; then echo "Error: No request_id" >&2; echo "$SUBMIT" >&2; exit 1; fi
|
|
168
|
+
[ "$JSON_ONLY" = false ] && echo "Request ID: $REQUEST_ID" >&2
|
|
169
|
+
|
|
170
|
+
if [ "$ASYNC" = true ]; then
|
|
171
|
+
[ "$JSON_ONLY" = false ] && echo "Check: bash check-result.sh --id \"$REQUEST_ID\"" >&2
|
|
172
|
+
echo "$SUBMIT"; exit 0
|
|
173
|
+
fi
|
|
174
|
+
|
|
175
|
+
[ "$JSON_ONLY" = false ] && echo "Processing..." >&2
|
|
176
|
+
ELAPSED=0; LAST_STATUS=""
|
|
177
|
+
while [ $ELAPSED -lt $MAX_WAIT ]; do
|
|
178
|
+
sleep $POLL_INTERVAL; ELAPSED=$((ELAPSED + POLL_INTERVAL))
|
|
179
|
+
RESULT=$(curl -s -X GET "${MUAPI_BASE}/predictions/${REQUEST_ID}/result" "${HEADERS[@]}")
|
|
180
|
+
STATUS=$(echo "$RESULT" | grep -oE '"status"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*: *"//' | sed 's/"$//')
|
|
181
|
+
if [ "$STATUS" != "$LAST_STATUS" ] && [ "$JSON_ONLY" = false ]; then echo "Status: $STATUS (${ELAPSED}s)" >&2; LAST_STATUS="$STATUS"; fi
|
|
182
|
+
case $STATUS in
|
|
183
|
+
completed)
|
|
184
|
+
[ "$JSON_ONLY" = false ] && echo "Done!" >&2
|
|
185
|
+
URL=$(echo "$RESULT" | grep -o '"outputs":\[[^]]*\]' | grep -o '"[^"]*\.\(mp4\|gif\|png\|jpg\)"' | head -1 | tr -d '"')
|
|
186
|
+
[ -n "$URL" ] && [ "$JSON_ONLY" = false ] && echo "Result URL: $URL" >&2
|
|
187
|
+
echo "$RESULT"; exit 0 ;;
|
|
188
|
+
failed)
|
|
189
|
+
ERR=$(echo "$RESULT" | grep -o '"error":"[^"]*"' | head -1 | cut -d'"' -f4)
|
|
190
|
+
echo "Error: ${ERR:-Operation failed}" >&2; echo "$RESULT"; exit 1 ;;
|
|
191
|
+
esac
|
|
192
|
+
done
|
|
193
|
+
echo "Error: Timeout after ${MAX_WAIT}s — Request ID: $REQUEST_ID" >&2; exit 1
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: muapi-media-generation
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
description: Generate AI images, videos, music, and audio from the terminal via muapi.ai — supports 100+ models including Flux, Midjourney v7, Kling 3.0, Veo3, and Suno V5
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 🎨 MuAPI Media Generation
|
|
8
|
+
|
|
9
|
+
**Schema-driven generation primitives for images, videos, and audio.**
|
|
10
|
+
|
|
11
|
+
Generate professional-grade media directly from the terminal using 100+ state-of-the-art AI models. All scripts are powered by `schema_data.json` for dynamic model and endpoint resolution.
|
|
12
|
+
|
|
13
|
+
## Available Scripts
|
|
14
|
+
|
|
15
|
+
| Script | Description | Default Model |
|
|
16
|
+
| :--- | :--- | :--- |
|
|
17
|
+
| `generate-image.sh` | Text-to-image generation | `flux-dev` |
|
|
18
|
+
| `generate-video.sh` | Text-to-video generation | `minimax-pro` |
|
|
19
|
+
| `image-to-video.sh` | Animate a static image into video | `kling-pro` |
|
|
20
|
+
| `create-music.sh` | Music creation, remix, extend, text/video-to-audio | Suno V5 |
|
|
21
|
+
| `upload.sh` | Upload local files to CDN for use with other skills | — |
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Generate an image
|
|
27
|
+
bash generate-image.sh --prompt "a sunset over mountains" --model flux-dev --view
|
|
28
|
+
|
|
29
|
+
# Generate a video
|
|
30
|
+
bash generate-video.sh --prompt "ocean waves at golden hour" --model minimax-pro --view
|
|
31
|
+
|
|
32
|
+
# Animate an image
|
|
33
|
+
bash image-to-video.sh --image-url "https://..." --prompt "camera slowly pans right" --model kling-pro
|
|
34
|
+
|
|
35
|
+
# Create music
|
|
36
|
+
bash create-music.sh --style "lo-fi hip hop" --prompt "chill beats for studying"
|
|
37
|
+
|
|
38
|
+
# Upload a local file
|
|
39
|
+
bash upload.sh --file ./my-image.jpg
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Common Flags
|
|
43
|
+
|
|
44
|
+
All scripts support: `--async`, `--view`, `--json`, `--timeout N`, `--help`
|
|
45
|
+
|
|
46
|
+
## Requirements
|
|
47
|
+
|
|
48
|
+
- `MUAPI_KEY` environment variable (set via `core/platform/setup.sh`)
|
|
49
|
+
- `curl`, `jq`, `python3`
|