{
  "app": "infinite-canvas",
  "version": 1,
  "exportedAt": "2026-10-05T09:17:12.000Z",
  "config": {
    "channelMode": "local",
    "baseUrl": "https://img.apixgo.com",
    "apiKey": "",
    "apiFormat": "openai",
    "channels": [
      {
        "id": "apixgo-img",
        "name": "Apixgo 图/视频 (img.apixgo.com)",
        "baseUrl": "https://img.apixgo.com",
        "apiKey": "",
        "apiFormat": "openai",
        "models": [
          {
            "name": "grok-imagine-image",
            "capability": "image"
          },
          {
            "name": "grok-imagine-image-2.0",
            "capability": "image"
          },
          {
            "name": "grok-imagine-image-quality",
            "capability": "image"
          },
          {
            "name": "grok-imagine-video-1.5",
            "capability": "video",
            "script": "/**\n * Apixgo / NewAPI · grok-imagine-video-1.5\n * POST /v1/video/generations → poll GET /v1/video/generations/{task_id}\n * Requires exactly one reference image (top-level \"image\"). Text-to-video is not supported.\n * @param {string} prompt\n * @param {string[]} images - reference images as data URLs; must contain exactly 1\n * @param {object} params\n * @param {string|number} params.seconds - duration 1–15\n * @param {string} params.size - e.g. \"1280x720\" / \"720x1280\"\n * @param {string} [params.ratio] - e.g. \"16:9\" / \"9:16\"\n * @param {string} params.resolution - e.g. \"720p\" / \"480p\"\n * @param {string} model\n * @param {string} baseUrl - e.g. https://img.apixgo.com\n * @param {string} apiKey\n * @param {function} request\n * @param {function} poll\n * @returns {Promise<{url: string}>}\n */\nasync function generateVideo({\n  prompt,\n  images,\n  params: {\n    seconds,\n    size,\n    ratio,\n    resolution,\n  },\n  model,\n  baseUrl,\n  apiKey,\n  request,\n  poll,\n}) {\n  if (!images || images.length !== 1) {\n    throw new Error(\"grok-imagine-video-1.5 requires exactly one reference image.\");\n  }\n\n  const aspectRatioMap = {\n    \"1280x720\": \"16:9\",\n    \"1920x1080\": \"16:9\",\n    \"1792x1024\": \"16:9\",\n    \"720x1280\": \"9:16\",\n    \"1080x1920\": \"9:16\",\n    \"1024x1792\": \"9:16\",\n    \"1024x1024\": \"1:1\",\n  };\n  let aspect_ratio = ratio || aspectRatioMap[size] || \"16:9\";\n  if (aspect_ratio !== \"16:9\" && aspect_ratio !== \"9:16\") {\n    aspect_ratio = aspectRatioMap[size] || \"16:9\";\n  }\n\n  const sec = Math.max(1, Math.min(15, Number(seconds) || 6));\n  const headers = {\n    \"Content-Type\": \"application/json\",\n    Authorization: `Bearer ${apiKey}`,\n  };\n\n  const created = await request({\n    method: \"post\",\n    url: `${baseUrl}/v1/video/generations`,\n    headers,\n    data: {\n      model: model || \"grok-imagine-video-1.5\",\n      prompt: prompt,\n      seconds: String(sec),\n      size: size || (aspect_ratio === \"9:16\" ? \"720x1280\" : \"1280x720\"),\n      aspect_ratio: aspect_ratio,\n      resolution: resolution || \"720p\",\n      image: images[0],\n    },\n  });\n\n  const taskId = created.task_id || created.id;\n  if (!taskId) {\n    throw new Error(\"No task_id returned: \" + JSON.stringify(created));\n  }\n\n  return await poll(\n    async () => {\n      const result = await request({\n        method: \"get\",\n        url: `${baseUrl}/v1/video/generations/${taskId}`,\n        headers: { Authorization: `Bearer ${apiKey}` },\n      });\n      const task = result.data || result;\n      const status = task.status;\n      if (status === \"FAILURE\" || status === \"failed\") {\n        throw new Error(task.fail_reason || result.message || \"video generation failed\");\n      }\n      if (status === \"SUCCESS\" || status === \"completed\") {\n        const videoUrl =\n          (task.data && task.data.video_url) ||\n          task.video_url ||\n          task.result_url ||\n          result.video_url;\n        if (videoUrl) return { url: videoUrl };\n      }\n      return null;\n    },\n    (value) => value,\n    { intervalMs: 5000, timeoutMs: 1200000 },\n  );\n}\n\nreturn await generateVideo({\n  prompt,\n  images,\n  params,\n  model,\n  baseUrl,\n  apiKey,\n  request,\n  poll,\n});\n"
          }
        ]
      },
      {
        "id": "apixgo-coding",
        "name": "Apixgo 对话 (coding.apixgo.com)",
        "baseUrl": "https://coding.apixgo.com",
        "apiKey": "",
        "apiFormat": "openai",
        "models": [
          {
            "name": "grok-4.7",
            "capability": "text"
          },
          {
            "name": "grok-4.7-build-fast",
            "capability": "text"
          },
          {
            "name": "grok-build-0.1",
            "capability": "text"
          }
        ]
      }
    ],
    "model": "apixgo-img::grok-imagine-image-2.0",
    "imageModel": "apixgo-img::grok-imagine-image-2.0",
    "videoModel": "apixgo-img::grok-imagine-video-1.5",
    "textModel": "apixgo-coding::grok-4.7",
    "audioModel": "",
    "audioVoice": "alloy",
    "audioFormat": "mp3",
    "audioSpeed": "1",
    "audioInstructions": "",
    "videoSeconds": "6",
    "vquality": "720",
    "videoGenerateAudio": "true",
    "videoWatermark": "false",
    "videoMode": "reference",
    "systemPrompt": "",
    "reasoningEffort": "auto",
    "models": [
      "apixgo-img::grok-imagine-image",
      "apixgo-img::grok-imagine-image-2.0",
      "apixgo-img::grok-imagine-image-quality",
      "apixgo-img::grok-imagine-video-1.5",
      "apixgo-coding::grok-4.7",
      "apixgo-coding::grok-4.7-build-fast",
      "apixgo-coding::grok-build-0.1"
    ],
    "quality": "auto",
    "size": "16:9",
    "background": "",
    "count": "1",
    "canvasImageCount": "3",
    "proxyEnabled": false,
    "proxyUrl": "http://127.0.0.1:23210"
  },
  "webdav": {
    "url": "",
    "username": "",
    "password": "",
    "directory": "infinite-canvas",
    "lastSyncedAt": ""
  },
  "promptSources": {
    "sources": [
      {
        "id": "banana-prompt-quicker",
        "name": "Banana Prompt Quicker",
        "url": "https://raw.githubusercontent.com/yukkcat/image-prompts/main/dist/sources/banana-prompt-quicker.json",
        "homepage": "https://glidea.github.io/banana-prompt-quicker/",
        "enabled": true,
        "builtIn": true
      },
      {
        "id": "davidwu-gpt-image2-prompts",
        "name": "DavidWu GPT Image 2",
        "url": "https://raw.githubusercontent.com/yukkcat/image-prompts/main/dist/sources/davidwu-gpt-image2-prompts.json",
        "homepage": "https://github.com/davidwuw0811-boop/awesome-gpt-image2-prompts",
        "enabled": true,
        "builtIn": true
      },
      {
        "id": "freestylefly-gpt-image-2",
        "name": "Freestylefly GPT Image 2",
        "url": "https://raw.githubusercontent.com/yukkcat/image-prompts/main/dist/sources/freestylefly-gpt-image-2.json",
        "homepage": "https://github.com/freestylefly/awesome-gpt-image-2",
        "enabled": true,
        "builtIn": true
      },
      {
        "id": "awesome-gpt-image",
        "name": "Awesome GPT Image",
        "url": "https://raw.githubusercontent.com/yukkcat/image-prompts/main/dist/sources/awesome-gpt-image.json",
        "homepage": "https://github.com/ZeroLu/awesome-gpt-image",
        "enabled": true,
        "builtIn": true
      },
      {
        "id": "awesome-gpt4o-image-prompts",
        "name": "Awesome GPT-4o",
        "url": "https://raw.githubusercontent.com/yukkcat/image-prompts/main/dist/sources/awesome-gpt4o-image-prompts.json",
        "homepage": "https://github.com/ImgEdify/Awesome-GPT4o-Image-Prompts",
        "enabled": true,
        "builtIn": true
      },
      {
        "id": "youmind-gpt-image-2",
        "name": "YouMind GPT Image 2",
        "url": "https://raw.githubusercontent.com/yukkcat/image-prompts/main/dist/sources/youmind-gpt-image-2.json",
        "homepage": "https://github.com/YouMind-OpenLab/awesome-gpt-image-2",
        "enabled": true,
        "builtIn": true
      },
      {
        "id": "youmind-nano-banana-pro",
        "name": "YouMind Nano Banana Pro",
        "url": "https://raw.githubusercontent.com/yukkcat/image-prompts/main/dist/sources/youmind-nano-banana-pro.json",
        "homepage": "https://github.com/YouMind-OpenLab/awesome-nano-banana-pro-prompts",
        "enabled": true,
        "builtIn": true
      }
    ],
    "schedule": {
      "intervalMinutes": 30,
      "lastFetchedAt": ""
    }
  }
}
