mar-ai-studio-v2. Repository navigation Code Issues Pull requests Commit eb56a5e bgmar77-lang bgmar77-lang authored 16 hours ago Verified Add files via upload main 0 parents commit eb56a5e 3 files changed +138 Lines changed: 138 additions & 0 deletions Search within code ‎README.txt‎ Original file line number Diff line number Diff line change @@ -0,0 +1,28 @@ MAR AI STUDIO V5 — PERBAIKAN DIAGNOSTIK FOTO AI + JENIS KONTEN ISI PAKET - index.html — generator konten V5 dengan dropdown Jenis Konten + UI foto AI - functions/api/generate-image.js — Cloudflare Pages Function POST untuk membuat foto, GET untuk pemeriksaan kesehatan CARA CEK SETELAH DEPLOY 1. Buka https://mar-ai-studio.pages.dev/api/generate-image di browser. 2. Jika Function sudah benar-benar ter-deploy, akan tampil JSON berisi ok, service, apiKeyConfigured, dan message. 3. Jika muncul halaman 404 Cloudflare/HTML, Pages Function belum ter-deploy. Upload aset statis/drag-and-drop saja biasanya tidak cukup untuk menjalankan folder functions; deploy lewat Git integration atau Wrangler Pages. 4. Jika apiKeyConfigured false, pastikan OPENAI_API_KEY ditambahkan sebagai Secret pada environment/deployment yang aktif, lalu deploy ulang. 5. Setelah cek GET berhasil, buka situs utama, refresh, lalu uji tombol Buat Foto Sekarang. DEPLOY - Pertahankan struktur folder: index.html dan functions/api/generate-image.js (folder functions harus berada di root proyek). - Untuk Pages Functions, gunakan Cloudflare Pages Git integration atau Wrangler Pages deployment, bukan hanya upload index.html. - Pastikan Secret OPENAI_API_KEY tersedia di Settings > Variables and Secrets untuk Production (dan Preview bila diuji di Preview). - Jangan menaruh API Key di index.html, jangan mengirimkannya lewat chat. ERROR - GET /api/generate-image menghasilkan JSON: Function aktif. - HTTP 404 / halaman HTML: Function tidak ter-deploy atau path salah. - HTTP 503 dengan apiKeyConfigured false: Secret belum tersedia di deployment yang diuji. - HTTP 401/403: periksa validitas API Key, akses proyek/model, dan billing. - HTTP 429: periksa kuota, rate limit, dan billing API. - Respons front-end kini menampilkan status HTTP dan cuplikan respons HTML agar diagnosis tidak lagi hanya mengatakan “Respons server tidak terbaca”. Model image generation/edit memakai model GPT Image yang tercantum dalam dokumentasi resmi OpenAI. Pemakaian API dapat dikenakan biaya. ‎generate-image.js‎ Original file line number Diff line number Diff line change @@ -0,0 +1,69 @@ const json = (data, status = 200) => new Response(JSON.stringify(data), { status, headers: { "Content-Type": "application/json; charset=utf-8", "Cache-Control": "no-store" } }); // Health check: open /api/generate-image in a browser to verify Pages Functions is deployed. export async function onRequestGet({ env }) { return json({ ok: true, service: "MAR AI Studio image API", route: "/api/generate-image", apiKeyConfigured: Boolean(env.OPENAI_API_KEY), message: env.OPENAI_API_KEY ? "Function aktif dan Secret ditemukan." : "Function aktif, tetapi Secret OPENAI_API_KEY belum terpasang pada environment ini." }, env.OPENAI_API_KEY ? 200 : 503); } export async function onRequestPost({ request, env }) { if (!env.OPENAI_API_KEY) return json({ error: "Secret OPENAI_API_KEY belum tersedia pada deployment ini. Tambahkan sebagai Secret pada environment yang aktif lalu deploy ulang." }, 500); try { const incoming = await request.formData(); const prompt = String(incoming.get("prompt") || "").slice(0, 12000); const size = String(incoming.get("size") || "1024x1536"); const quality = String(incoming.get("quality") || "medium"); const image = incoming.get("image"); if (!prompt.trim()) return json({ error: "Instruksi foto masih kosong." }, 400); if (!["1024x1024", "1024x1536", "1536x1024"].includes(size)) return json({ error: "Rasio gambar tidak valid." }, 400); if (!["low", "medium", "high"].includes(quality)) return json({ error: "Kualitas gambar tidak valid." }, 400); let endpoint, body; if (image && typeof image !== "string" && image.size > 0) { if (image.size > 10 * 1024 * 1024) return json({ error: "Foto referensi maksimal 10 MB." }, 413); if (!["image/png", "image/jpeg", "image/webp"].includes(image.type || "")) return json({ error: "Format foto harus PNG, JPG, atau WebP." }, 400); endpoint = "https://api.openai.com/v1/images/edits"; body = new FormData(); body.append("model", "gpt-image-2.5-sunburst"); body.append("prompt", prompt); body.append("size", size); body.append("quality", quality); body.append("image[]", image, image.name || "reference.png"); } else { endpoint = "https://api.openai.com/v1/images/generations"; body = new FormData(); body.append("model", "gpt-image-2.5-flare"); body.append("prompt", prompt); body.append("size", size); body.append("quality", quality); } const upstream = await fetch(endpoint, { method: "POST", headers: { Authorization: `Bearer ${env.OPENAI_API_KEY}` }, body }); const raw = await upstream.text(); let payload; try { payload = raw ? JSON.parse(raw) : {}; } catch { return json({ error: `OpenAI mengembalikan respons yang tidak terbaca (HTTP ${upstream.status}). Periksa log request di OpenAI Platform.`, upstream_status: upstream.status, request_id: upstream.headers.get("x-request-id") || null }, 502); } if (!upstream.ok) { const message = payload?.error?.message || `OpenAI API error HTTP ${upstream.status}`; return json({ error: message, upstream_status: upstream.status, request_id: upstream.headers.get("x-request-id") || null }, upstream.status >= 400 && upstream.status < 600 ? upstream.status : 502); } const imageData = payload?.data?.[0]?.b64_json; if (!imageData) return json({ error: "OpenAI API tidak mengembalikan data gambar.", request_id: upstream.headers.get("x-request-id") || null }, 502); return json({ image: imageData, request_id: upstream.headers.get("x-request-id") || null }); } catch (err) { return json({ error: "Kesalahan pada Pages Function: " + (err?.message || "unknown error") }, 500); } } ‎index.html‎ Original file line number Diff line number Diff line change @@ -0,0 +1,41 @@ MAR AI Studio V5 — Creator + Foto AI
MAR AI STUDIO • CREATOR TOOLS

V5 — TikTok Affiliate Creator

Generator konten TikTok + pembuat foto produk AI. Pilihan Jenis Konten tetap tersedia.

1. Jenis konten dan detail produk

2. Pengaturan video

Catatan: generator ini membuat naskah dan prompt; belum terhubung ke layanan AI eksternal dan belum merender video.

3. Buat Foto Produk AI

Buat foto produk langsung dari MAR AI Studio. Unggah foto referensi untuk menjaga bentuk dan detail produk tetap mendekati aslinya.

Pratinjau foto referensi

Format PNG, JPG, WebP; maksimal 10 MB. Untuk hasil yang mirip, unggah foto produk yang jelas.

Foto diproses melalui OpenAI API. Penggunaan API dapat dikenakan biaya. Periksa kembali logo, label, dan detail produk sebelum digunakan.

MAR AI Studio V5 • Pastikan klaim produk dan promo sesuai fakta.