diff --git a/README.md b/README.md index 5e702bd..f048a7b 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ > **The free, open-source, unrestricted alternative to Higgsfield AI, Freepik, Krea, Openart AI.** Generate AI images and videos using 200+ state-of-the-art models — no content filters, no closed ecosystem, no subscription fees. +> 💡 **Looking for GPT-Image-2 prompts?** Check out [Awesome GPT-Image-2 API Prompts](https://github.com/Anil-matcha/Awesome-GPT-Image-2-API-Prompts) — a curated collection of 40+ ready-to-use prompts for the OpenAI `gpt-image-2` API covering portraits, posters, UI mockups, game screenshots, and more. + ## 🌐 Try it Online — No Install Required **Hosted version:** [https://dev.muapi.ai/open-generative-ai](https://dev.muapi.ai/open-generative-ai) @@ -22,9 +24,9 @@ One-click installers — no Node.js or terminal required. | Platform | Download | |---|---| -| macOS Apple Silicon (M1/M2/M3/M4) | [Open Generative AI-1.0.0-arm64.dmg](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.0/Open.Generative.AI-1.0.0-arm64.dmg) | -| macOS Intel (x64) | [Open Generative AI-1.0.0.dmg](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.0/Open.Generative.AI-1.0.0.dmg) | -| Windows (x64 + ARM64) | [Open Generative AI Setup 1.0.0.exe](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.0/Open.Generative.AI.Setup.1.0.0.exe) | +| macOS Apple Silicon (M1/M2/M3/M4) | [Open Generative AI-1.0.2-arm64.dmg](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.2/Open.Generative.AI-1.0.2-arm64.dmg) | +| macOS Intel (x64) | [Open Generative AI-1.0.2.dmg](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.2/Open.Generative.AI-1.0.2.dmg) | +| Windows (x64 + ARM64) | [Open Generative AI Setup 1.0.2.exe](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.2/Open.Generative.AI.Setup.1.0.2.exe) | | Linux (Ubuntu x64) | Build locally with `npm run electron:build:linux` | All releases: [github.com/Anil-matcha/Open-Generative-AI/releases](https://github.com/Anil-matcha/Open-Generative-AI/releases) @@ -125,6 +127,7 @@ For a deep dive into the technical architecture and the philosophy behind the "I - **Video Studio** — Generate videos from text prompts (40+ text-to-video models) or animate a start-frame image (60+ image-to-video models). Same intelligent mode switching as Image Studio. - **Lip Sync Studio** — Animate portrait images or sync lips on existing videos using audio. 9 dedicated models across two modes: portrait image + audio → talking video, and video + audio → lipsync video. - **Cinema Studio** — Interface for photorealistic cinematic shots with pro camera controls (Lens, Focal Length, Aperture) +- **Workflow Studio** — Build and run multi-step AI pipelines visually. Chain image, video, and audio models into automated flows. Browse community templates, create your own with a node-based editor, and run them via an interactive playground. - **Upload History** — Reference images are uploaded once and stored locally. A picker panel lets you reuse any previously uploaded image across sessions — no re-uploading. - **Smart Controls** — Dynamic aspect ratio, resolution/quality, and duration pickers that adapt to each model's capabilities (including t2i models with resolution or quality options) - **Generation History** — Browse, revisit, and download all past generations (persisted in browser storage) @@ -233,6 +236,20 @@ The **Lip Sync Studio** generates audio-driven talking videos using 9 models acr Generation history is saved separately in `lipsync_history` and pending jobs resume automatically on page reload. +### 🔀 Workflow Studio + +The **Workflow Studio** lets you build and run multi-step AI pipelines without writing code. + +**Key capabilities:** +- **Templates** — Start from pre-built workflows (image chains, video pipelines, and more) +- **My Workflows** — Save and manage your own custom pipelines +- **Community** — Browse and run workflows published by other users +- **Node-based Builder** — Drag-and-drop visual editor to connect models and route outputs between steps +- **Playground** — Run any workflow interactively with a form UI; results render inline +- **API execution** — Every workflow is also callable via the Muapi API + +> 💡 **Want to add workflows to your own app?** Check out **[Vibe Workflow](https://github.com/SamurAIGPT/Vibe-Workflow)** — the open-source workflow engine powering this feature. Drop it into any project. + ### 🎥 Cinema Studio Controls The **Cinema Studio** offers precise control over the virtual camera, translating your choices into optimized prompt modifiers: @@ -323,14 +340,15 @@ Open-Generative-AI/ ├── packages/ │ └── studio/ # Shared React component library │ └── src/ -│ ├── index.js # Exports: ImageStudio, VideoStudio, LipSyncStudio, CinemaStudio +│ ├── index.js # Exports: ImageStudio, VideoStudio, LipSyncStudio, CinemaStudio, WorkflowStudio │ ├── models.js # 200+ model definitions (single source of truth) │ ├── muapi.js # API client (named exports, apiKey as first param) │ └── components/ │ ├── ImageStudio.jsx # Dual-mode t2i/i2i studio │ ├── VideoStudio.jsx # Dual-mode t2v/i2v studio │ ├── LipSyncStudio.jsx # Portrait/video + audio → talking video -│ └── CinemaStudio.jsx # Pro studio with camera controls +│ ├── CinemaStudio.jsx # Pro studio with camera controls +│ └── WorkflowStudio.jsx # Multi-step pipeline builder & playground ├── next.config.mjs # transpilePackages: ['studio'] ├── tailwind.config.js └── package.json # workspaces: ["packages/studio"] diff --git a/afterPack.js b/afterPack.js index 869b8ce..f407ee0 100644 --- a/afterPack.js +++ b/afterPack.js @@ -1,8 +1,35 @@ import { execSync } from 'child_process'; import path from 'path'; +import fs from 'fs'; export default async function afterPack({ appOutDir, packager }) { - if (packager.platform.name !== 'mac') return; + const platformName = packager.platform.name; + + // Remove Next.js SWC native binaries that don't belong on this target platform. + // They are bundled because `next` is in dependencies, but only the host-platform + // binary is ever used at runtime in the Electron app. + const nextDir = path.join(appOutDir, + platformName === 'mac' + ? `${packager.appInfo.productName}.app/Contents/Resources` + : 'resources', + 'app.asar.unpacked/node_modules/@next' + ); + + if (fs.existsSync(nextDir)) { + const keepPrefix = platformName === 'mac' ? 'swc-darwin' + : platformName === 'windows' ? 'swc-win32' + : 'swc-linux'; + + for (const entry of fs.readdirSync(nextDir)) { + if (entry.startsWith('swc-') && !entry.startsWith(keepPrefix)) { + const fullPath = path.join(nextDir, entry); + fs.rmSync(fullPath, { recursive: true, force: true }); + console.log(` • removed foreign SWC binary path=${fullPath}`); + } + } + } + + if (platformName !== 'mac') return; const appPath = path.join(appOutDir, `${packager.appInfo.productName}.app`); console.log(` • ad-hoc signing path=${appPath}`); diff --git a/package.json b/package.json index 21367df..84d1060 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "open-generative-ai", "description": "Open-source alternative to Higgsfield AI — AI image, video, cinema and lip sync studio", "private": true, - "version": "1.0.1", + "version": "1.0.2", "workspaces": [ "packages/studio", "packages/workflow-ui", @@ -54,8 +54,7 @@ { "target": "nsis", "arch": [ - "x64", - "arm64" + "x64" ] } ] diff --git a/packages/studio/src/muapi.js b/packages/studio/src/muapi.js index 6a01056..ba9773f 100644 --- a/packages/studio/src/muapi.js +++ b/packages/studio/src/muapi.js @@ -1,11 +1,10 @@ import { getModelById, getVideoModelById, getI2IModelById, getI2VModelById, getV2VModelById, getLipSyncModelById } from './models.js'; -const BASE_URL = 'https://api.muapi.ai'; // Legacy direct URL -const PROXY_APP_BASE = '/api/app'; +const BASE_URL = 'https://api.muapi.ai'; const PROXY_WF_BASE = '/api/workflow'; async function pollForResult(requestId, key, maxAttempts = 900, interval = 2000) { - const pollUrl = `${PROXY_APP_BASE}/v1/predictions/${requestId}/result`; + const pollUrl = `${BASE_URL}/api/v1/predictions/${requestId}/result`; for (let attempt = 1; attempt <= maxAttempts; attempt++) { await new Promise(resolve => setTimeout(resolve, interval)); try { diff --git a/src/lib/models.js b/src/lib/models.js index 0a9a010..f4c4073 100644 --- a/src/lib/models.js +++ b/src/lib/models.js @@ -2162,7 +2162,7 @@ export const t2vModels = [ }, { "id": "seedance-v2.0-t2v", - "name": "Seedance 2.0", + "name": "SD 2", "inputs": { "prompt": { "type": "string", "title": "Prompt", "name": "prompt", "description": "The prompt to generate the video" }, "aspect_ratio": { "enum": ["16:9", "9:16", "4:3", "3:4"], "title": "Aspect Ratio", "name": "aspect_ratio", "type": "string", "description": "Aspect ratio of the output video.", "default": "16:9" }, @@ -2172,10 +2172,10 @@ export const t2vModels = [ }, { "id": "seedance-v2.0-extend", - "name": "Seedance 2.0 Extend", + "name": "SD 2 Extend", "requiresRequestId": true, "inputs": { - "request_id": { "type": "string", "title": "Request ID", "name": "request_id", "description": "Request ID of the original Seedance 2.0 video generation.", "placeholder": "abcdefg-123-456-789-a1b2c3d4e5f6" }, + "request_id": { "type": "string", "title": "Request ID", "name": "request_id", "description": "Request ID of the original SD 2 video generation.", "placeholder": "abcdefg-123-456-789-a1b2c3d4e5f6" }, "prompt": { "type": "string", "title": "Prompt", "name": "prompt", "description": "Optional prompt to guide the extension. If omitted, the model continues with the original scene." }, "duration": { "enum": [5, 10, 15], "title": "Duration", "name": "duration", "type": "int", "description": "The duration of the generated video extension in seconds", "default": 5 }, "quality": { "enum": ["high", "basic"], "title": "Quality", "name": "quality", "type": "string", "description": "Quality of the generated video.", "default": "basic" } @@ -7938,7 +7938,7 @@ export const i2vModels = [ }, { "id": "seedance-v2.0-i2v", - "name": "Seedance 2.0 I2V", + "name": "SD 2 I2V", "endpoint": "seedance-v2.0-i2v", "family": "seedance-v2.0", "imageField": "images_list",