Merge remote-tracking branch 'origin/main' into feat/modernize-studio-upload
This commit is contained in:
commit
911bcdd558
5 changed files with 59 additions and 16 deletions
28
README.md
28
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.
|
> **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
|
## 🌐 Try it Online — No Install Required
|
||||||
|
|
||||||
**Hosted version:** [https://dev.muapi.ai/open-generative-ai](https://dev.muapi.ai/open-generative-ai)
|
**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 |
|
| 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 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.0.dmg](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.0/Open.Generative.AI-1.0.0.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.0.exe](https://github.com/Anil-matcha/Open-Generative-AI/releases/download/v1.0.0/Open.Generative.AI.Setup.1.0.0.exe) |
|
| 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` |
|
| 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)
|
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.
|
- **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.
|
- **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)
|
- **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.
|
- **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)
|
- **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)
|
- **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.
|
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
|
### 🎥 Cinema Studio Controls
|
||||||
|
|
||||||
The **Cinema Studio** offers precise control over the virtual camera, translating your choices into optimized prompt modifiers:
|
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/
|
├── packages/
|
||||||
│ └── studio/ # Shared React component library
|
│ └── studio/ # Shared React component library
|
||||||
│ └── src/
|
│ └── 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)
|
│ ├── models.js # 200+ model definitions (single source of truth)
|
||||||
│ ├── muapi.js # API client (named exports, apiKey as first param)
|
│ ├── muapi.js # API client (named exports, apiKey as first param)
|
||||||
│ └── components/
|
│ └── components/
|
||||||
│ ├── ImageStudio.jsx # Dual-mode t2i/i2i studio
|
│ ├── ImageStudio.jsx # Dual-mode t2i/i2i studio
|
||||||
│ ├── VideoStudio.jsx # Dual-mode t2v/i2v studio
|
│ ├── VideoStudio.jsx # Dual-mode t2v/i2v studio
|
||||||
│ ├── LipSyncStudio.jsx # Portrait/video + audio → talking video
|
│ ├── 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']
|
├── next.config.mjs # transpilePackages: ['studio']
|
||||||
├── tailwind.config.js
|
├── tailwind.config.js
|
||||||
└── package.json # workspaces: ["packages/studio"]
|
└── package.json # workspaces: ["packages/studio"]
|
||||||
|
|
|
||||||
29
afterPack.js
29
afterPack.js
|
|
@ -1,8 +1,35 @@
|
||||||
import { execSync } from 'child_process';
|
import { execSync } from 'child_process';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
import fs from 'fs';
|
||||||
|
|
||||||
export default async function afterPack({ appOutDir, packager }) {
|
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`);
|
const appPath = path.join(appOutDir, `${packager.appInfo.productName}.app`);
|
||||||
console.log(` • ad-hoc signing path=${appPath}`);
|
console.log(` • ad-hoc signing path=${appPath}`);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"name": "open-generative-ai",
|
"name": "open-generative-ai",
|
||||||
"description": "Open-source alternative to Higgsfield AI — AI image, video, cinema and lip sync studio",
|
"description": "Open-source alternative to Higgsfield AI — AI image, video, cinema and lip sync studio",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"packages/studio",
|
"packages/studio",
|
||||||
"packages/workflow-ui",
|
"packages/workflow-ui",
|
||||||
|
|
@ -54,8 +54,7 @@
|
||||||
{
|
{
|
||||||
"target": "nsis",
|
"target": "nsis",
|
||||||
"arch": [
|
"arch": [
|
||||||
"x64",
|
"x64"
|
||||||
"arm64"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
import { getModelById, getVideoModelById, getI2IModelById, getI2VModelById, getV2VModelById, getLipSyncModelById } from './models.js';
|
import { getModelById, getVideoModelById, getI2IModelById, getI2VModelById, getV2VModelById, getLipSyncModelById } from './models.js';
|
||||||
|
|
||||||
const BASE_URL = 'https://api.muapi.ai'; // Legacy direct URL
|
const BASE_URL = 'https://api.muapi.ai';
|
||||||
const PROXY_APP_BASE = '/api/app';
|
|
||||||
const PROXY_WF_BASE = '/api/workflow';
|
const PROXY_WF_BASE = '/api/workflow';
|
||||||
|
|
||||||
async function pollForResult(requestId, key, maxAttempts = 900, interval = 2000) {
|
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++) {
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||||
await new Promise(resolve => setTimeout(resolve, interval));
|
await new Promise(resolve => setTimeout(resolve, interval));
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -2162,7 +2162,7 @@ export const t2vModels = [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "seedance-v2.0-t2v",
|
"id": "seedance-v2.0-t2v",
|
||||||
"name": "Seedance 2.0",
|
"name": "SD 2",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"prompt": { "type": "string", "title": "Prompt", "name": "prompt", "description": "The prompt to generate the video" },
|
"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" },
|
"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",
|
"id": "seedance-v2.0-extend",
|
||||||
"name": "Seedance 2.0 Extend",
|
"name": "SD 2 Extend",
|
||||||
"requiresRequestId": true,
|
"requiresRequestId": true,
|
||||||
"inputs": {
|
"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." },
|
"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 },
|
"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" }
|
"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",
|
"id": "seedance-v2.0-i2v",
|
||||||
"name": "Seedance 2.0 I2V",
|
"name": "SD 2 I2V",
|
||||||
"endpoint": "seedance-v2.0-i2v",
|
"endpoint": "seedance-v2.0-i2v",
|
||||||
"family": "seedance-v2.0",
|
"family": "seedance-v2.0",
|
||||||
"imageField": "images_list",
|
"imageField": "images_list",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue