omniroute 3.7.2 → 3.7.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/app/.next/BUILD_ID +1 -1
- package/app/.next/app-path-routes-manifest.json +15 -15
- package/app/.next/build-manifest.json +3 -3
- package/app/.next/prerender-manifest.json +3 -3
- package/app/.next/react-loadable-manifest.json +3 -3
- package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/audit/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/batch/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cache/media/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cache/media/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cache/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/logs/page.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/memory/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error.html +1 -1
- package/app/.next/server/app/_global-error.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/acp/agents/route.js.nft.json +1 -1
- package/app/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next/server/app/api/batches/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cache/entries/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cache/reasoning/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cache/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cache/stats/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/backups/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/backups/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/cline-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/codex-profiles/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/codex-profiles/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/codex-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/guide-settings/[toolId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/keys/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/kilo-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw/auto-order/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/qwen-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/qwen-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/runtime/[toolId]/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/runtime/[toolId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/status/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/status/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cloud/auth/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cloud/credentials/update/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cloud/model/resolve/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cloud/models/alias/route.js.nft.json +1 -1
- package/app/.next/server/app/api/combos/[id]/route.js +1 -1
- package/app/.next/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/combos/builder/options/route.js.nft.json +1 -1
- package/app/.next/server/app/api/combos/metrics/route.js.nft.json +1 -1
- package/app/.next/server/app/api/combos/reorder/route.js.nft.json +1 -1
- package/app/.next/server/app/api/combos/route.js +1 -1
- package/app/.next/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next/server/app/api/combos/test/route.js +1 -1
- package/app/.next/server/app/api/combos/test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/compliance/audit-log/route.js.nft.json +1 -1
- package/app/.next/server/app/api/db-backups/export/route.js.nft.json +1 -1
- package/app/.next/server/app/api/db-backups/exportAll/route.js.nft.json +1 -1
- package/app/.next/server/app/api/db-backups/import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/db-backups/route.js.nft.json +1 -1
- package/app/.next/server/app/api/evals/[suiteId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/evals/route.js.nft.json +1 -1
- package/app/.next/server/app/api/evals/scorecard/route.js.nft.json +1 -1
- package/app/.next/server/app/api/evals/suites/[suiteId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/evals/suites/route.js.nft.json +1 -1
- package/app/.next/server/app/api/fallback/chains/route.js.nft.json +1 -1
- package/app/.next/server/app/api/files/[id]/content/route.js.nft.json +1 -1
- package/app/.next/server/app/api/files/route.js.nft.json +1 -1
- package/app/.next/server/app/api/init/route.js.nft.json +1 -1
- package/app/.next/server/app/api/internal/codex-responses-ws/route.js.nft.json +1 -1
- package/app/.next/server/app/api/keys/[id]/reveal/route.js.nft.json +1 -1
- package/app/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next/server/app/api/logs/active/route.js.nft.json +1 -1
- package/app/.next/server/app/api/logs/console/route.js.nft.json +1 -1
- package/app/.next/server/app/api/logs/detail/route.js.nft.json +1 -1
- package/app/.next/server/app/api/logs/export/route.js.nft.json +1 -1
- package/app/.next/server/app/api/mcp/sse/route.js.nft.json +1 -1
- package/app/.next/server/app/api/mcp/status/route.js.nft.json +1 -1
- package/app/.next/server/app/api/mcp/stream/route.js.nft.json +1 -1
- package/app/.next/server/app/api/memory/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/memory/health/route.js.nft.json +1 -1
- package/app/.next/server/app/api/memory/route.js.nft.json +1 -1
- package/app/.next/server/app/api/model-combo-mappings/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/model-combo-mappings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next/server/app/api/models/catalog/route.js.nft.json +1 -1
- package/app/.next/server/app/api/models/openrouter-catalog/route.js.nft.json +1 -1
- package/app/.next/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/monitoring/health/route.js +1 -1
- package/app/.next/server/app/api/monitoring/health/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next/server/app/api/openapi/try/route.js.nft.json +1 -1
- package/app/.next/server/app/api/policies/route.js.nft.json +1 -1
- package/app/.next/server/app/api/pricing/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next/server/app/api/pricing/sync/route.js.nft.json +1 -1
- package/app/.next/server/app/api/provider-metrics/route.js.nft.json +1 -1
- package/app/.next/server/app/api/provider-models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/codex-auth/apply-local/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/codex-auth/export/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/refresh/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/sync-models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/test-batch/route.js +1 -1
- package/app/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/zed/import/route.js.nft.json +1 -1
- package/app/.next/server/app/api/rate-limits/route.js.nft.json +1 -1
- package/app/.next/server/app/api/resilience/reset/route.js.nft.json +1 -1
- package/app/.next/server/app/api/resilience/route.js.nft.json +1 -1
- package/app/.next/server/app/api/restart/route.js.nft.json +1 -1
- package/app/.next/server/app/api/search/providers/route.js.nft.json +1 -1
- package/app/.next/server/app/api/search/stats/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/auto-disable-accounts/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/background-degradation/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/cache-config/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/cache-metrics/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/combo-defaults/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/export-json/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/favicon/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/import-json/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/ip-filter/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/lkgp-cache/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/memory/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/model-aliases/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/models-dev/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/payload-rules/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/proxies/assignments/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/proxies/bulk-assign/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/proxies/health/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/proxies/migrate/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/proxies/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/proxy/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/proxy/test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/purge-logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/system-prompt/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/task-routing/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/thinking-budget/route.js.nft.json +1 -1
- package/app/.next/server/app/api/shutdown/route.js.nft.json +1 -1
- package/app/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/skills/executions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/skills/install/route.js.nft.json +1 -1
- package/app/.next/server/app/api/skills/marketplace/install/route.js.nft.json +1 -1
- package/app/.next/server/app/api/skills/marketplace/route.js.nft.json +1 -1
- package/app/.next/server/app/api/skills/route.js.nft.json +1 -1
- package/app/.next/server/app/api/skills/skillssh/install/route.js.nft.json +1 -1
- package/app/.next/server/app/api/skills/skillssh/route.js.nft.json +1 -1
- package/app/.next/server/app/api/storage/health/route.js.nft.json +1 -1
- package/app/.next/server/app/api/sync/bundle/route.js.nft.json +1 -1
- package/app/.next/server/app/api/sync/cloud/route.js.nft.json +1 -1
- package/app/.next/server/app/api/sync/initialize/route.js.nft.json +1 -1
- package/app/.next/server/app/api/sync/tokens/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/sync/tokens/route.js.nft.json +1 -1
- package/app/.next/server/app/api/synced-available-models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/system/env/repair/route.js.nft.json +1 -1
- package/app/.next/server/app/api/system/version/route.js +1 -1
- package/app/.next/server/app/api/system/version/route.js.nft.json +1 -1
- package/app/.next/server/app/api/token-health/route.js.nft.json +1 -1
- package/app/.next/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnels/cloudflared/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnels/tailscale/check/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnels/tailscale/disable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnels/tailscale/enable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnels/tailscale/install/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnels/tailscale/login/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnels/tailscale/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnels/tailscale/start-daemon/route.js.nft.json +1 -1
- package/app/.next/server/app/api/upstream-proxy/[providerId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/analytics/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/budget/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/call-logs/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/call-logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/combo-health/route.js +1 -1
- package/app/.next/server/app/api/usage/combo-health/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/provider-limits/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/proxy-logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/quota/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/utilization/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/accounts/[id]/limits/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/batches/[id]/cancel/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/batches/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/batches/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/completions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/db/health/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/files/[id]/content/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/files/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/files/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/images/edits/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/issues/report/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/management/proxies/assignments/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/management/proxies/bulk-assign/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/management/proxies/health/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/management/proxies/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/moderations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/music/generations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/chat/completions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/embeddings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/images/generations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/providers/[provider]/limits/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/quotas/check/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/registered-keys/[id]/revoke/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/registered-keys/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/registered-keys/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/rerank/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/responses/[...path]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/search/analytics/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/videos/generations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/ws/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1beta/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/version-manager/check-update/route.js +1 -1
- package/app/.next/server/app/api/version-manager/check-update/route.js.nft.json +1 -1
- package/app/.next/server/app/api/version-manager/install/route.js +1 -1
- package/app/.next/server/app/api/version-manager/install/route.js.nft.json +1 -1
- package/app/.next/server/app/api/version-manager/restart/route.js +1 -1
- package/app/.next/server/app/api/version-manager/restart/route.js.nft.json +1 -1
- package/app/.next/server/app/api/version-manager/start/route.js +1 -1
- package/app/.next/server/app/api/version-manager/start/route.js.nft.json +1 -1
- package/app/.next/server/app/api/version-manager/status/route.js +1 -1
- package/app/.next/server/app/api/version-manager/status/route.js.nft.json +1 -1
- package/app/.next/server/app/api/version-manager/stop/route.js +1 -1
- package/app/.next/server/app/api/version-manager/stop/route.js.nft.json +1 -1
- package/app/.next/server/app/api/webhooks/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/webhooks/[id]/test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/webhooks/route.js.nft.json +1 -1
- package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/docs/page.js +1 -1
- package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +15 -15
- package/app/.next/server/chunks/12767.js +1 -1
- package/app/.next/server/chunks/19849.js +1 -1
- package/app/.next/server/chunks/20236.js +1 -1
- package/app/.next/server/chunks/36040.js +4 -4
- package/app/.next/server/chunks/3832.js +1 -1
- package/app/.next/server/chunks/39548.js +1 -1
- package/app/.next/server/chunks/39859.js +1 -1
- package/app/.next/server/chunks/44088.js +1 -1
- package/app/.next/server/chunks/45415.js +1 -1
- package/app/.next/server/chunks/55672.js +1 -0
- package/app/.next/server/chunks/59092.js +2 -2
- package/app/.next/server/chunks/66094.js +1 -1
- package/app/.next/server/chunks/69105.js +1 -1
- package/app/.next/server/chunks/75225.js +1 -1
- package/app/.next/server/chunks/77044.js +1 -1
- package/app/.next/server/chunks/83648.js +1 -1
- package/app/.next/server/chunks/93831.js +4 -4
- package/app/.next/server/chunks/9679.js +3 -3
- package/app/.next/server/chunks/99168.js +2 -2
- package/app/.next/server/middleware-build-manifest.js +1 -1
- package/app/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/app/.next/server/middleware.js +2 -2
- package/app/.next/server/pages/500.html +1 -1
- package/app/.next/server/server-reference-manifest.js +1 -1
- package/app/.next/server/server-reference-manifest.json +1 -1
- package/app/.next/static/chunks/{1999-fefe90c60eaa3b23.js → 1999-8cf58c233346f980.js} +1 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/cache/media/page-ad8091c5b7536b7a.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/logs/page-ccc65d29bbb19d51.js +1 -0
- package/app/.next/static/chunks/app/{layout-3e3b043f9b52bb80.js → layout-fbebdd84c4996160.js} +1 -1
- package/app/.next/static/chunks/{webpack-117eac5998a94c69.js → webpack-ea5983ad4b51e934.js} +1 -1
- package/app/.next/static/css/7caa8a6802c65def.css +1 -0
- package/app/docs/openapi.yaml +1 -1
- package/app/open-sse/mcp-server/server.js +15 -1
- package/app/package.json +1 -1
- package/package.json +1 -1
- package/app/.next/server/chunks/80812.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/cache/media/page-f0289617f824bbf2.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/logs/page-f24fde8a3f731108.js +0 -1
- package/app/.next/static/css/8d36e4e21725013b.css +0 -1
- /package/app/.next/static/{yvJ6rPtn4eb7sOBUCBGrF → qmeYzerLcoUXZ06JXgit3}/_buildManifest.js +0 -0
- /package/app/.next/static/{yvJ6rPtn4eb7sOBUCBGrF → qmeYzerLcoUXZ06JXgit3}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=20236,exports.ids=[20236],exports.modules={58247:(a,b,c)=>{c.d(b,{J:()=>f});let d={"256x256":"1:1","512x512":"1:1","1024x1024":"1:1","1792x1024":"16:9","1024x1792":"9:16","1536x1024":"3:2","1024x1536":"2:3"},e=/^\d+:\d+$/;function f(a){return a?e.test(a)?a:d[a]??"1:1":"1:1"}},80641:(a,b,c)=>{c.d(b,{De:()=>g,NT:()=>k,Uk:()=>i,bV:()=>h,lw:()=>j});let d={"flux-kontext":{provider:"pollinations",model:"flux-kontext",name:"FLUX Kontext",listInCatalog:!0,inputModalities:["text","image"]},"flux-kontext-max":{provider:"together",model:"black-forest-labs/FLUX.1.1-pro",name:"FLUX Kontext Max",listInCatalog:!0,inputModalities:["text","image"]},"flux-redux":{provider:"together",model:"black-forest-labs/FLUX.1-redux",name:"FLUX Redux",listInCatalog:!0,inputModalities:["text","image"]},"flux-depth":{provider:"together",model:"black-forest-labs/FLUX.1-depth",name:"FLUX Depth",listInCatalog:!0,inputModalities:["text","image"]},"flux-canny":{provider:"together",model:"black-forest-labs/FLUX.1-canny",name:"FLUX Canny",listInCatalog:!0,inputModalities:["text","image"]},"flux-dev-lora":{provider:"together",model:"black-forest-labs/FLUX.1-dev-lora",name:"FLUX Dev LoRA",listInCatalog:!0},kontext:{provider:"pollinations",model:"flux-kontext",name:"FLUX Kontext",listInCatalog:!1},"pollinations/kontext":{provider:"pollinations",model:"flux-kontext",name:"FLUX Kontext",listInCatalog:!1}};function e(a){let b=d[a];return b?{provider:b.provider,model:b.model}:null}function f(a,b){let c=g[a];return c&&c.models.find(a=>a.id===b)||null}let g={openai:{id:"openai",baseUrl:"https://api.openai.com/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"gpt-image-1",name:"GPT Image 1"},{id:"dall-e-3",name:"DALL-E 3"},{id:"dall-e-2",name:"DALL-E 2"}],supportedSizes:["1024x1024","1024x1792","1792x1024","256x256","512x512"]},codex:{id:"codex",alias:"cx",baseUrl:"https://chatgpt.com/backend-api/codex/responses",authType:"oauth",authHeader:"bearer",format:"codex-responses",models:[{id:"gpt-5.4",name:"GPT 5.4 (Codex Image)"},{id:"gpt-5.3-codex",name:"GPT 5.3 Codex (Image)"},{id:"gpt-5.1-codex-max",name:"GPT 5.1 Codex Max (Image)"}],supportedSizes:["512x512","1024x1024","1024x1536","1536x1024"]},"chatgpt-web":{id:"chatgpt-web",alias:"cgpt-web",baseUrl:"https://chatgpt.com/backend-api/f/conversation",authType:"apikey",authHeader:"cookie",format:"chatgpt-web",models:[{id:"gpt-5.3-instant",name:"GPT-5.3 Instant (ChatGPT Web Image)"}],supportedSizes:["1024x1024","1024x1536","1536x1024"]},xai:{id:"xai",baseUrl:"https://api.x.ai/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"grok-2-image-1212",name:"Grok 2 Image"}],supportedSizes:["1024x1024"]},together:{id:"together",baseUrl:"https://api.together.xyz/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"black-forest-labs/FLUX.1.1-pro",name:"FLUX 1.1 Pro",inputModalities:["text","image"],description:"Advanced contextual image editing and image-to-image generation"},{id:"black-forest-labs/FLUX.1-schnell-Free",name:"FLUX 1 Schnell (Free)"},{id:"stabilityai/stable-diffusion-xl-base-1.0",name:"SDXL Base 1.0"},{id:"black-forest-labs/FLUX.1-redux",name:"FLUX.1 Redux",inputModalities:["text","image"],description:"Generate prompt-guided variations from an input image"},{id:"black-forest-labs/FLUX.1-depth",name:"FLUX.1 Depth",inputModalities:["text","image"],description:"Depth-conditioned image generation from an input image"},{id:"black-forest-labs/FLUX.1-canny",name:"FLUX.1 Canny",inputModalities:["text","image"],description:"Canny edge guided image generation from an input image"},{id:"black-forest-labs/FLUX.1-dev-lora",name:"FLUX.1 Dev LoRA"}],supportedSizes:["1024x1024","512x512"]},fireworks:{id:"fireworks",baseUrl:"https://api.fireworks.ai/inference/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"accounts/fireworks/models/flux-1-dev-fp8",name:"FLUX 1 Dev FP8"},{id:"accounts/fireworks/models/stable-diffusion-xl-1024-v1-0",name:"SDXL 1024 v1.0"}],supportedSizes:["1024x1024","512x512"]},antigravity:{id:"antigravity",baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",authType:"oauth",authHeader:"bearer",format:"gemini-image",models:[],supportedSizes:["1024x1024"]},nebius:{id:"nebius",baseUrl:"https://api.tokenfactory.nebius.com/v1/images/generations",fallbackUrl:"https://api.studio.nebius.com/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"black-forest-labs/flux-schnell",name:"FLUX.1 Schnell"},{id:"black-forest-labs/flux-dev",name:"FLUX.1 Dev"}],supportedSizes:["1024x1024","512x512"]},hyperbolic:{id:"hyperbolic",baseUrl:"https://api.hyperbolic.xyz/v1/image/generation",authType:"apikey",authHeader:"bearer",format:"hyperbolic",models:[{id:"SDXL1.0-base",name:"SDXL 1.0 Base"},{id:"SD2",name:"Stable Diffusion 2"},{id:"FLUX.1-dev",name:"FLUX.1 Dev"}],supportedSizes:["1024x1024","512x512"]},nanobanana:{id:"nanobanana",baseUrl:"https://api.nanobananaapi.ai/api/v1/nanobanana/generate",proUrl:"https://api.nanobananaapi.ai/api/v1/nanobanana/generate-pro",statusUrl:"https://api.nanobananaapi.ai/api/v1/nanobanana/record-info",authType:"apikey",authHeader:"bearer",format:"nanobanana",models:[{id:"nanobanana-flash",name:"NanoBanana Flash (Gemini 2.5 Flash)"},{id:"nanobanana-pro",name:"NanoBanana Pro (Gemini 3 Pro)"}],supportedSizes:["1024x1024","1024x1280","1024x1536","1536x1024","1280x1024"]},sdwebui:{id:"sdwebui",baseUrl:"http://localhost:7860/sdapi/v1/txt2img",authType:"none",authHeader:"none",format:"sdwebui",models:[{id:"stable-diffusion-v1-5",name:"Stable Diffusion v1.5"},{id:"sdxl-base-1.0",name:"SDXL Base 1.0"}],supportedSizes:["512x512","768x768","1024x1024"]},comfyui:{id:"comfyui",baseUrl:"http://localhost:8188",authType:"none",authHeader:"none",format:"comfyui",models:[{id:"flux-dev",name:"FLUX Dev"},{id:"sdxl",name:"SDXL"}],supportedSizes:["512x512","768x768","1024x1024"]},openrouter:{id:"openrouter",baseUrl:"https://openrouter.ai/api/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"openai/dall-e-3",name:"DALL-E 3 (via OpenRouter)"},{id:"openai/gpt-image-1",name:"GPT Image 1 (via OpenRouter)"},{id:"google/imagen-3.0-generate-002",name:"Imagen 3 (via OpenRouter)"},{id:"black-forest-labs/FLUX.1-schnell",name:"FLUX.1 Schnell (via OpenRouter)"}],supportedSizes:["1024x1024","1024x1792","1792x1024","256x256","512x512"]},pollinations:{id:"pollinations",alias:"pol",baseUrl:"https://gen.pollinations.ai/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"flux",name:"Flux Schnell"},{id:"zimage",name:"Z-Image Turbo"},{id:"klein",name:"FLUX.2 Klein 4B"},{id:"gptimage",name:"GPT Image 1 Mini"},{id:"qwen-image",name:"Qwen Image Plus"},{id:"wan-image",name:"Wan 2.7 Image"},{id:"flux-kontext",name:"FLUX.1 Kontext",inputModalities:["text","image"],description:"Context-aware image editing with optional source image"},{id:"flux-kontext-max",name:"FLUX.1 Kontext Max",inputModalities:["text","image"],description:"Higher quality Kontext editing with optional source image"},{id:"gptimage-large",name:"GPT Image 1.5"}],supportedSizes:["1024x1024","512x512"]},"fal-ai":{id:"fal-ai",baseUrl:"https://fal.run",authType:"apikey",authHeader:"key",format:"fal-ai",models:[{id:"fal-ai/flux-pro/v1.1",name:"FLUX.1 Pro v1.1"},{id:"fal-ai/flux-pro/v1.1-ultra",name:"FLUX.1 Pro v1.1 Ultra"},{id:"fal-ai/flux/schnell",name:"FLUX.1 Schnell"},{id:"bria/text-to-image/3.2",name:"Bria 3.2"},{id:"fal-ai/bytedance/seedream/v3/text-to-image",name:"SeeDream V3"},{id:"fal-ai/bytedance/dreamina/v3.1/text-to-image",name:"Dreamina V3.1"},{id:"fal-ai/ideogram/v3",name:"Ideogram V3"},{id:"fal-ai/imagen4/preview",name:"Imagen 4 Preview"},{id:"fal-ai/imagen4/preview/fast",name:"Imagen 4 Preview Fast"},{id:"fal-ai/imagen4/preview/ultra",name:"Imagen 4 Preview Ultra"},{id:"fal-ai/recraft/v3/text-to-image",name:"Recraft V3 via Fal"},{id:"fal-ai/stable-diffusion-v35-medium",name:"Stable Diffusion v3.5 Medium"}],supportedSizes:["1024x1024","1024x1280","1280x1024"]},"stability-ai":{id:"stability-ai",baseUrl:"https://api.stability.ai",authType:"apikey",authHeader:"bearer",format:"stability-ai",models:[{id:"sd3",name:"sd3"},{id:"sd3-large",name:"sd3-large"},{id:"sd3-large-turbo",name:"sd3-large-turbo"},{id:"sd3-medium",name:"sd3-medium"},{id:"sd3.5-large",name:"sd3.5-large"},{id:"sd3.5-large-turbo",name:"sd3.5-large-turbo"},{id:"sd3.5-medium",name:"sd3.5-medium"},{id:"stable-image-ultra",name:"Stable Image Ultra"},{id:"stable-image-core",name:"Stable Image Core"},{id:"inpaint",name:"Inpaint",inputModalities:["text","image"]},{id:"outpaint",name:"Outpaint",inputModalities:["text","image"]},{id:"erase",name:"Erase",inputModalities:["image"]},{id:"search-and-replace",name:"Search and Replace",inputModalities:["text","image"]},{id:"search-and-recolor",name:"Search and Recolor",inputModalities:["text","image"]},{id:"remove-background",name:"Remove Background",inputModalities:["image"]},{id:"replace-background-and-relight",name:"Replace Background and Relight",inputModalities:["text","image"]},{id:"fast",name:"Fast Upscale",inputModalities:["image"]},{id:"conservative",name:"Conservative Upscale",inputModalities:["image"]},{id:"creative",name:"Creative Upscale",inputModalities:["text","image"]},{id:"sketch",name:"Sketch Control",inputModalities:["text","image"]},{id:"structure",name:"Structure Control",inputModalities:["text","image"]},{id:"style",name:"Style Control",inputModalities:["text","image"]},{id:"style-transfer",name:"Style Transfer",inputModalities:["text","image"]}],supportedSizes:["1024x1024","1024x1280","1280x1024"]},"black-forest-labs":{id:"black-forest-labs",baseUrl:"https://api.bfl.ai",authType:"apikey",authHeader:"x-key",format:"black-forest-labs",models:[{id:"flux-kontext-pro",name:"flux-kontext-pro",inputModalities:["text","image"]},{id:"flux-kontext-max",name:"flux-kontext-max",inputModalities:["text","image"]},{id:"flux-pro-1.0-fill",name:"flux-pro-1.0-fill",inputModalities:["text","image"]},{id:"flux-pro-1.0-expand",name:"flux-pro-1.0-expand",inputModalities:["text","image"]},{id:"flux-pro-1.1",name:"flux-pro-1.1"},{id:"flux-pro-1.1-ultra",name:"flux-pro-1.1-ultra"},{id:"flux-dev",name:"flux-dev"},{id:"flux-pro",name:"flux-pro"}],supportedSizes:["1024x1024","1024x1280","1280x1024"]},recraft:{id:"recraft",baseUrl:"https://external.api.recraft.ai",authType:"apikey",authHeader:"bearer",format:"recraft",models:[{id:"recraftv2",name:"recraftv2"},{id:"recraftv3",name:"recraftv3"}],supportedSizes:["1024x1024","1024x1280","1280x1024"]},topaz:{id:"topaz",baseUrl:"https://api.topazlabs.com",authType:"apikey",authHeader:"x-api-key",format:"topaz",models:[{id:"topaz-enhance",name:"topaz-enhance",inputModalities:["image"]}],supportedSizes:["1024x1024"]}};function h(a){return g[a]||null}function i(a){if(!a)return{provider:null,model:null};let b=e(a);if(b)return b;for(let[b,c]of Object.entries(g)){if(a.startsWith(b+"/")){let c=a.slice(b.length+1);return e(`${b}/${c}`)||e(c)||{provider:b,model:c}}if(c.alias&&a.startsWith(c.alias+"/")){let d=a.slice(c.alias.length+1);return e(`${b}/${d}`)||e(d)||{provider:b,model:d}}}for(let[b,c]of Object.entries(g))if(c.models.some(b=>b.id===a))return{provider:b,model:a};return{provider:null,model:a}}function j(){let a=[];for(let[b,c]of Object.entries(g))for(let d of c.models)a.push({id:`${b}/${d.id}`,name:d.name,provider:b,supportedSizes:c.supportedSizes,inputModalities:d.inputModalities||["text"],description:d.description||void 0});for(let[b,c]of Object.entries(d)){if(!c.listInCatalog)continue;let d=g[c.provider],e=f(c.provider,c.model);a.push({id:b,name:c.name||e?.name||b,provider:c.provider,supportedSizes:d?.supportedSizes||[],inputModalities:c.inputModalities||e?.inputModalities||["text"],description:c.description||e?.description||void 0})}return a}function k(a){if(!a)return null;let b=d[a];if(b){let a=f(b.provider,b.model);return{provider:b.provider,model:b.model,inputModalities:b.inputModalities||a?.inputModalities||["text"],description:b.description||a?.description||void 0}}let{provider:c,model:e}=i(a);if(!c||!e)return null;let g=f(c,e);return g?{provider:c,model:e,inputModalities:g.inputModalities||["text"],description:g.description||void 0}:null}},97855:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{ky:()=>o});var e=c(55511),f=c(80641),g=c(58247),h=c(22803),i=c(98398),j=c(67323);c(77598);var k=c(11283),l=c(99465),m=c(73152),n=a([k]);k=(n.then?(await n)():n)[0];let T=new Set(["black-forest-labs/FLUX.1-redux","black-forest-labs/FLUX.1-depth","black-forest-labs/FLUX.1-canny","black-forest-labs/FLUX.1.1-pro","FLUX.1-redux","FLUX.1-depth","FLUX.1-canny","FLUX.1.1-pro","flux-kontext-max","flux-kontext","flux-kontext-pro"]),U={"flux-kontext-pro":"/v1/flux-kontext-pro","flux-kontext-max":"/v1/flux-kontext-max","flux-pro-1.0-fill":"/v1/flux-pro-1.0-fill","flux-pro-1.0-expand":"/v1/flux-pro-1.0-expand","flux-pro-1.1":"/v1/flux-pro-1.1","flux-pro-1.1-ultra":"/v1/flux-pro-1.1-ultra","flux-dev":"/v1/flux-dev","flux-pro":"/v1/flux-pro"},V=new Set(["flux-kontext-pro","flux-kontext-max","flux-pro-1.0-fill","flux-pro-1.0-expand"]),W=new Set(["Error","Failed","Content Moderated","Request Moderated"]),X={sd3:"/v2beta/stable-image/generate/sd3","sd3-large":"/v2beta/stable-image/generate/sd3","sd3-large-turbo":"/v2beta/stable-image/generate/sd3","sd3-medium":"/v2beta/stable-image/generate/sd3","sd3.5-large":"/v2beta/stable-image/generate/sd3","sd3.5-large-turbo":"/v2beta/stable-image/generate/sd3","sd3.5-medium":"/v2beta/stable-image/generate/sd3","stable-image-ultra":"/v2beta/stable-image/generate/ultra","stable-image-core":"/v2beta/stable-image/generate/core"},Y={inpaint:"/v2beta/stable-image/edit/inpaint",outpaint:"/v2beta/stable-image/edit/outpaint",erase:"/v2beta/stable-image/edit/erase","search-and-replace":"/v2beta/stable-image/edit/search-and-replace","search-and-recolor":"/v2beta/stable-image/edit/search-and-recolor","remove-background":"/v2beta/stable-image/edit/remove-background","replace-background-and-relight":"/v2beta/stable-image/edit/replace-background-and-relight",fast:"/v2beta/stable-image/upscale/fast",conservative:"/v2beta/stable-image/upscale/conservative",creative:"/v2beta/stable-image/upscale/creative",sketch:"/v2beta/stable-image/control/sketch",structure:"/v2beta/stable-image/control/structure",style:"/v2beta/stable-image/control/style","style-transfer":"/v2beta/stable-image/control/style-transfer"},Z=new Set(["sketch","structure","style","style-transfer"]),$={"1024x1024":"square_hd","512x512":"square","1792x1024":"landscape_16_9","1024x1792":"portrait_16_9","1024x768":"landscape_4_3","768x1024":"portrait_4_3","1536x1024":"landscape_3_2","1024x1536":"portrait_3_2","576x1024":"portrait_16_9","1024x576":"landscape_16_9"};async function o({body:a,credentials:b,log:c,resolvedProvider:d=null,signal:e=null,clientHeaders:g=null}){let h,i;if(d){h=d;let b=a.model||"";i=b.startsWith(h+"/")?b.slice(h.length+1):b}else{let b=(0,f.Uk)(a.model);h=b.provider,i=b.model}if(!h)return{success:!1,status:400,error:`Invalid image model: ${a.model}. Use format: provider/model`};let j=(0,f.bV)(h);if(!j){if(!d)return{success:!1,status:400,error:`Unknown image provider: ${h}`};c&&c.info("IMAGE",`Custom model ${h}/${i} — using OpenAI-compatible handler`);let e={id:h,baseUrl:b?.baseUrl||"https://generativelanguage.googleapis.com/v1beta/openai/images/generations",authType:"apikey",authHeader:"bearer",format:"openai"};return q({model:i,provider:h,providerConfig:e,body:a,credentials:b,log:c})}return"gemini-image"===j.format?p({model:i,providerConfig:j,body:a,credentials:b,log:c}):"imagen3"===j.format?S({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"hyperbolic"===j.format?L({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"fal-ai"===j.format?s({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"stability-ai"===j.format?t({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"black-forest-labs"===j.format?u({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"recraft"===j.format?v({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"topaz"===j.format?w({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"chatgpt-web"===j.format?r({model:i,provider:h,body:a,credentials:b,log:c,signal:e,clientHeaders:g}):"nanobanana"===j.format?M({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"sdwebui"===j.format?Q({model:i,provider:h,providerConfig:j,body:a,log:c}):"comfyui"===j.format?R({model:i,provider:h,providerConfig:j,body:a,log:c}):"codex-responses"===j.format?H({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):q({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c})}async function p({model:a,providerConfig:b,body:c,credentials:d,log:e}){let f=Date.now(),g=`${b.baseUrl}/${a}:generateContent`,h="antigravity",i={model:c.model,prompt:"string"==typeof c.prompt?c.prompt.slice(0,200):String(c.prompt??"").slice(0,200),size:c.size||"default",n:c.n||1},j={contents:[{parts:[{text:c.prompt}]}],generationConfig:{responseModalities:["TEXT","IMAGE"]}},l=d.accessToken||d.apiKey,m={"Content-Type":"application/json",Authorization:`Bearer ${l}`};if(e){let b="string"==typeof c.prompt?c.prompt.slice(0,60):String(c.prompt??"").slice(0,60);e.info("IMAGE",`antigravity/${a} (gemini) | prompt: "${b}..." | format: gemini-image`)}try{let b=await fetch(g,{method:"POST",headers:m,body:JSON.stringify(j)});if(!b.ok){let c=await b.text();return e&&e.error("IMAGE",`antigravity error ${b.status}: ${c.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:b.status,model:`antigravity/${a}`,provider:h,duration:Date.now()-f,error:c.slice(0,500),requestBody:i}).catch(()=>{}),{success:!1,status:b.status,error:c}}let d=await b.json(),l=[];for(let a of d.candidates||[]){let b=a.content?.parts||[];for(let a of b)a.inlineData&&l.push({b64_json:a.inlineData.data,revised_prompt:b.find(a=>a.text)?.text||c.prompt})}return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`antigravity/${a}`,provider:h,duration:Date.now()-f,tokens:{prompt_tokens:0,completion_tokens:0},requestBody:i,responseBody:{images_count:l.length}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:l}}}catch(b){return e&&e.error("IMAGE",`antigravity fetch error: ${b.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`antigravity/${a}`,provider:h,duration:Date.now()-f,error:b.message,requestBody:i}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${b.message}`}}}async function q({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g=Date.now(),h={model:d.model,prompt:"string"==typeof d.prompt?d.prompt.slice(0,200):String(d.prompt??"").slice(0,200),size:d.size||"default",n:d.n||1,quality:d.quality||void 0},i={model:a,prompt:d.prompt};void 0!==d.n&&(i.n=d.n),void 0!==d.size&&(i.size=d.size),void 0!==d.quality&&(i.quality=d.quality),void 0!==d.response_format&&(i.response_format=d.response_format),void 0!==d.style&&(i.style=d.style);let{imageUrl:j}=y(d);j&&T.has(a)&&(i.image_url=j);let l={"Content-Type":"application/json"},m=e.apiKey||e.accessToken;if("bearer"===c.authHeader?l.Authorization=`Bearer ${m}`:"x-api-key"===c.authHeader&&(l["x-api-key"]=m),f){let c="string"==typeof d.prompt?d.prompt.slice(0,60):String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} | prompt: "${c}..." | size: ${d.size||"default"}`)}let n=JSON.stringify(i),o=await K(c.baseUrl,l,n,b,f);return!o.success&&c.fallbackUrl&&[404,410,502,503].includes(o.status)&&(f&&f.info("IMAGE",`${b}: primary URL failed (${o.status}), trying fallback...`),o=await K(c.fallbackUrl,l,n,b,f)),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:o.status||(o.success?200:502),model:`${b}/${a}`,provider:b,duration:Date.now()-g,tokens:{prompt_tokens:0,completion_tokens:0},error:o.success?null:"string"==typeof o.error?o.error.slice(0,500):null,requestBody:h,responseBody:o.success?{images_count:o.data?.data?.length||0}:null}).catch(()=>{}),o}let _=/!\[[^\]]*\]\(([^)\s]+)\)/g,aa=/\/v1\/chatgpt-web\/image\/([a-f0-9]{16,64})(?=[?\s"'<>)]|$)/i;async function r({model:a,provider:b,body:c,credentials:d,log:e,signal:f,clientHeaders:g}){let h=Date.now(),k="string"==typeof c.prompt?c.prompt.trim():"";if(!k)return J({provider:b,model:a,status:400,startTime:h,error:"Prompt is required for ChatGPT Web image generation"});if(!d?.apiKey)return J({provider:b,model:a,status:401,startTime:h,error:"ChatGPT Web credentials missing session cookie"});let l=Number.isInteger(c.n)&&c.n>0?c.n:1;if(l>4)return J({provider:b,model:a,status:400,startTime:h,error:`ChatGPT Web image generation supports n=1..4 (got ${l}); each n is a separate ~30s chat turn.`});e&&l>1&&e.warn("IMAGE",`ChatGPT Web returns one image per chat turn; requested n=${l} will run sequentially`);let m="b64_json"===c.response_format,n=[],o={model:a,prompt:k.slice(0,500),size:c.size||void 0,quality:c.quality||void 0};for(let k=0;k<l;k++){let k=new i.RF,l=await k.execute({model:a,body:{messages:[{role:"user",content:function(a){let b=String(a.prompt||"").trim(),c=[`Create an image for this prompt: ${b}`];return"string"==typeof a.size&&a.size.trim()&&c.push(`Requested size: ${a.size.trim()}.`),"string"==typeof a.quality&&a.quality.trim()&&c.push(`Requested quality: ${a.quality.trim()}.`),"string"==typeof a.style&&a.style.trim()&&c.push(`Requested style: ${a.style.trim()}.`),c.join("\n")}(c)}]},stream:!1,credentials:d,signal:f,log:e,clientHeaders:g}),p=await l.response.text();if(l.response.status>=400)return J({provider:b,model:a,status:l.response.status,startTime:h,error:p,requestBody:o});let q="";try{let a=JSON.parse(p);q=String(a?.choices?.[0]?.message?.content||"")}catch{q=p}let r=function(a){let b=[];for(let c of a.matchAll(_))c[1]&&b.push(c[1]);return b}(q);if(0===r.length)return J({provider:b,model:a,status:502,startTime:h,error:`ChatGPT Web completed without returning image markdown: ${q.slice(0,300)}`,requestBody:o});for(let c of r){if(!m){n.push({url:c});continue}let d=c.match(aa)?.[1],e=d?(0,j.Zb)(d):null;if(!e)return J({provider:b,model:a,status:502,startTime:h,error:"ChatGPT Web image bytes expired before b64_json conversion",requestBody:o});n.push({b64_json:e.bytes.toString("base64")})}}return I({provider:b,model:a,startTime:h,requestBody:o,responseBody:{images_count:n.length},images:n})}async function s({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){var h;let i=Date.now(),j=e.apiKey||e.accessToken,{imageUrl:k,imageUrls:l}=y(d),m={prompt:d.prompt,sync_mode:d.sync_mode??!0};void 0!==d.n&&(m.num_images=Number(d.n)||1),d.negative_prompt&&(m.negative_prompt=d.negative_prompt),void 0!==d.seed&&(m.seed=d.seed),d.style&&(h=d.style,m.style="vivid"===h?"digital_illustration":"natural"===h?"realistic_image":h);let n=B(d,"png");if(n&&(m.output_format=n),a.includes("flux-pro/v1.1")&&!a.includes("ultra")?m.image_size=C(d.size,"landscape_4_3"):a.includes("bytedance/")||a.includes("stable-diffusion")||a.includes("ideogram")||a.includes("recraft/v3")?m.image_size=C(d.size,"square_hd"):m.aspect_ratio=d.aspect_ratio||function(a,b="1:1"){return a?(0,g.J)(a):b}(d.size,"1:1"),"hd"===d.quality&&a.includes("ultra")&&(m.raw=!0),k&&a.includes("flux-pro/v1.1-ultra")&&(m.image_url=k),l.length>0&&a.includes("ideogram")&&(m.image_urls=l),f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (fal-ai) | prompt: "${c}..."`)}try{let e=await fetch(`${c.baseUrl.replace(/\/$/,"")}/${a}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Key ${j}`},body:JSON.stringify(m)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:e.status,startTime:i,error:c,requestBody:m})}let g=await e.json(),h=await D(g,d,f);return I({provider:b,model:a,startTime:i,requestBody:m,responseBody:{images_count:h.length},created:g.created,images:h})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:i,error:`Image provider error: ${c.message}`})}}async function t({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let h=Date.now(),i=e.apiKey||e.accessToken,j=X[a]||Y[a];if(!j)return{success:!1,status:400,error:`Unsupported Stability AI image model: ${a}`};let{imageUrl:k,maskUrl:l}=y(d),m={output_format:"remove-background"===a?B(d,"png",["png","webp"]):B(d,"png")};d.prompt&&(m.prompt=d.prompt),d.negative_prompt&&(m.negative_prompt=d.negative_prompt),void 0!==d.seed&&(m.seed=d.seed);try{var n;let e;if(X[a]?(a.startsWith("sd3")&&"sd3"!==a&&(m.model=a),k?(m.mode="image-to-image",m.image=(await z(k)).base64,void 0!==d.strength&&(m.strength=d.strength)):m.mode="text-to-image",a.startsWith("sd3")&&k||(m.aspect_ratio=d.aspect_ratio||(0,g.J)(d.size)),d.style_preset&&(m.style_preset=d.style_preset)):(k&&(m.image=(await z(k)).base64),l&&(n=a,new Set(["inpaint","erase","search-and-replace","search-and-recolor","replace-background-and-relight"]).has(n))&&(m.mask=(await z(l)).base64),d.search_prompt&&(m.search_prompt=d.search_prompt),void 0!==d.grow_mask&&(m.grow_mask=d.grow_mask),void 0!==d.control_strength&&(m.control_strength=d.control_strength),void 0!==d.creativity&&(m.creativity=d.creativity),void 0!==d.left&&(m.left=d.left),void 0!==d.right&&(m.right=d.right),void 0!==d.up&&(m.up=d.up),void 0!==d.down&&(m.down=d.down),d.style_preset&&(m.style_preset=d.style_preset),Z.has(a)&&!m.prompt&&(m.prompt=d.prompt||"")),f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (stability-ai) | prompt: "${c}..."`)}let o=await fetch(`${c.baseUrl.replace(/\/$/,"")}${j}`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify(m)});if(!o.ok){let c=await o.text();return f&&f.error("IMAGE",`${b} error ${o.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:o.status,startTime:h,error:c,requestBody:m})}e=(o.headers.get("content-type")||"").includes("application/json")?await o.json():{image:Buffer.from(await o.arrayBuffer()).toString("base64")};let p=await D(e,d,f);return I({provider:b,model:a,startTime:h,requestBody:m,responseBody:{images_count:p.length},created:e.created,images:p})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:h,error:`Image provider error: ${c.message}`})}}async function u({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let h=Date.now(),i=e.apiKey||e.accessToken,j=U[a];if(!j)return{success:!1,status:400,error:`Unsupported Black Forest Labs image model: ${a}`};let{imageUrl:k,maskUrl:l}=y(d),m={prompt:d.prompt,output_format:B(d,"png")};try{if(V.has(a)&&k?m.input_image=(await z(k)).base64:k&&G(k)&&(m.image_url=k),l&&("flux-pro-1.0-fill"===a||"flux-kontext-pro"===a)&&(m.mask=(await z(l)).base64),"flux-kontext-pro"===a||"flux-kontext-max"===a)m.aspect_ratio=d.aspect_ratio||(0,g.J)(d.size);else if("string"==typeof d.size&&d.size.includes("x")){let{width:a,height:b}=A(d.size,1024);m.width=a,m.height=b}if(void 0!==d.seed&&(m.seed=d.seed),void 0!==d.n&&a.includes("ultra")&&(m.num_images=Number(d.n)||1),"hd"===d.quality&&a.includes("ultra")&&(m.raw=!0),void 0!==d.left&&(m.left=d.left),void 0!==d.right&&(m.right=d.right),void 0!==d.top&&(m.top=d.top),void 0!==d.bottom&&(m.bottom=d.bottom),void 0!==d.steps&&(m.steps=d.steps),void 0!==d.guidance&&(m.guidance=d.guidance),void 0!==d.grow_mask&&(m.grow_mask=d.grow_mask),void 0!==d.safety_tolerance&&(m.safety_tolerance=d.safety_tolerance),f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (black-forest-labs) | prompt: "${c}..."`)}let e=await fetch(`${c.baseUrl.replace(/\/$/,"")}${j}`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-key":i},body:JSON.stringify(m)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:e.status,startTime:h,error:c,requestBody:m})}let n=await e.json(),o=n.polling_url?await x({pollingUrl:n.polling_url,token:i,body:d,log:f}):n,p=await D(o,d,f);return I({provider:b,model:a,startTime:h,requestBody:m,responseBody:{images_count:p.length},created:o.created,images:p})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:h,error:`Image provider error: ${c.message}`})}}async function v({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g=Date.now(),h=e.apiKey||e.accessToken,i={model:a,prompt:d.prompt};if(void 0!==d.n&&(i.n=d.n),void 0!==d.size&&(i.size=d.size),void 0!==d.response_format&&(i.response_format=d.response_format),void 0!==d.style&&(i.style=d.style),f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (recraft) | prompt: "${c}..."`)}try{let e=await fetch(`${c.baseUrl.replace(/\/$/,"")}/v1/images/generations`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${h}`},body:JSON.stringify(i)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:e.status,startTime:g,error:c,requestBody:i})}let j=await e.json(),k=await D(j,d,f);return I({provider:b,model:a,startTime:g,requestBody:i,responseBody:{images_count:k.length},created:j.created,images:k})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:g,error:`Image provider error: ${c.message}`})}}async function w({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g=Date.now(),h=e.apiKey||e.accessToken,{imageUrl:i}=y(d);if(!i)return{success:!1,status:400,error:`Topaz model ${a} requires an input image`};try{let e=await z(i),j=new FormData,k=new Blob([e.buffer],{type:e.contentType||"image/png"});if(j.append("image",k,"image.png"),"string"==typeof d.size&&d.size.includes("x")){let{width:a,height:b}=A(d.size,1024);j.append("output_width",String(a)),j.append("output_height",String(b))}if(f){let c=String(d.prompt??"enhance image").slice(0,60);f.info("IMAGE",`${b}/${a} (topaz) | prompt: "${c}..."`)}let l=await fetch(`${c.baseUrl.replace(/\/$/,"")}/image/v1/enhance`,{method:"POST",headers:{Accept:"image/jpeg","X-API-Key":h},body:j});if(!l.ok){let c=await l.text();return f&&f.error("IMAGE",`${b} error ${l.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:l.status,startTime:g,error:c})}let m=l.headers.get("content-type")||"image/jpeg",n=Buffer.from(await l.arrayBuffer()).toString("base64"),o=["b64_json"===d.response_format?{b64_json:n,revised_prompt:d.prompt}:{url:`data:${m};base64,${n}`,revised_prompt:d.prompt}];return I({provider:b,model:a,startTime:g,responseBody:{images_count:o.length},images:o})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:g,error:`Image provider error: ${c.message}`})}}async function x({pollingUrl:a,token:b,body:c,log:d}){let e=O(c.timeout_ms,3e5),f=O(c.poll_interval_ms,1500),g=Date.now()+e;for(;Date.now()<g;){let c=await fetch(a,{method:"GET",headers:{"x-key":b}});if(!c.ok){let a=await c.text();throw Error(`BFL polling failed (${c.status}): ${a}`)}let e=await c.json(),g=e?.status;if("Ready"===g)return e;if(W.has(g))throw Error(`BFL image generation failed: ${g}`);d&&d.info("IMAGE",`black-forest-labs polling status: ${String(g||"Pending")}`),await P(f)}throw Error(`BFL polling timed out after ${e}ms`)}function y(a){let b=[],c=new Set,d=a=>{if("string"!=typeof a)return;let d=a.trim();!d||c.has(d)||(c.add(d),b.push(d))};if(d(a?.image_url),d(a?.image),Array.isArray(a?.imageUrls))for(let b of a.imageUrls)d(b);if(Array.isArray(a?.image_urls))for(let b of a.image_urls)d(b);if(Array.isArray(a?.messages)){for(let b of a.messages)if(Array.isArray(b?.content))for(let a of b.content)a?.type==="image_url"&&d(a?.image_url?.url)}return{imageUrl:b[0]||null,imageUrls:b,maskUrl:"string"==typeof a?.mask_url?a.mask_url:"string"==typeof a?.mask?a.mask:null}}async function z(a){if("string"!=typeof a||0===a.trim().length)throw Error("Invalid image source");let b=a.trim(),c=/^data:([^;]+);base64,(.+)$/i.exec(b);if(c){let[,a,b]=c;return{buffer:Buffer.from(b,"base64"),base64:b,contentType:a}}if(G(b)){let a=await (0,m.I)(b);return{buffer:a.buffer,base64:a.buffer.toString("base64"),contentType:a.contentType}}return{buffer:Buffer.from(b,"base64"),base64:b,contentType:"application/octet-stream"}}function A(a,b=1024){if("string"!=typeof a||!a.includes("x"))return{width:b,height:b};let[c,d]=a.split("x"),e=Number(c),f=Number(d);return{width:Number.isFinite(e)&&e>0?e:b,height:Number.isFinite(f)&&f>0?f:b}}function B(a,b="png",c=["jpeg","png","webp"]){let d="string"==typeof a?.output_format?a.output_format.toLowerCase():"string"!=typeof a?.response_format||["url","b64_json"].includes(a.response_format.toLowerCase())?b:a.response_format.toLowerCase();return c.includes(d)?d:b}function C(a,b="square_hd"){if("string"!=typeof a)return b;if($[a])return $[a];if(a.includes("x")){let{width:b,height:c}=A(a,1024);return{width:b,height:c}}return b}async function D(a,b,c){let d=[],e=a=>{null!=a&&d.push(a)};if(Array.isArray(a?.data))for(let b of a.data)e(b);if(Array.isArray(a?.images))for(let b of a.images)e(b);if(a?.image&&e({b64_json:a.image}),a?.url&&e({url:a.url}),a?.sample&&e({url:a.sample}),a?.result?.sample&&e({url:a.result.sample}),Array.isArray(a?.result?.images))for(let b of a.result.images)e(b);let f=[];for(let a of d){let c=await E(a,b);c&&f.push(c)}return 0===f.length&&c&&c.warn("IMAGE",`Provider returned no recognizable image payload: ${JSON.stringify(a).slice(0,240)}`),f}async function E(a,b){let c=b?.response_format==="b64_json",d=null,e=null;if("string"==typeof a){let b=/^data:[^;]+;base64,(.+)$/i.exec(a);b?e=b[1]:G(a)?d=a:e=a}else a&&"object"==typeof a&&(d=F(a.url,a.image_url,a.sample,a.file_url)||null,e=F(a.b64_json,a.image,a.base64,a.data)||null);return(c&&!e&&d&&(e=(await z(d)).base64),d&&!c)?{url:d,revised_prompt:b?.prompt}:e?{b64_json:e,revised_prompt:b?.prompt}:d?{url:d,revised_prompt:b?.prompt}:null}function F(...a){for(let b of a)if("string"==typeof b&&b.length>0)return b;return null}function G(a){return"string"==typeof a&&/^https?:\/\//i.test(a)}async function H({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g,i=Date.now(),j="string"==typeof d.prompt?d.prompt:"";if(!j.trim())return J({provider:b,model:a,status:400,startTime:i,error:"Prompt is required for Codex image generation"});let k=Number.isInteger(d.n)&&d.n>0?d.n:1;f&&k>1&&f.warn("IMAGE",`Codex hosted image_generation returns one image per call; requested n=${k} will run sequentially`);let l=e?.accessToken||e?.apiKey;if(!l)return J({provider:b,model:a,status:401,startTime:i,error:"Codex credentials missing accessToken — reconnect the Codex provider"});let m=e?.providerSpecificData&&"object"==typeof e.providerSpecificData&&!Array.isArray(e.providerSpecificData)?e.providerSpecificData.workspaceId:void 0,n={type:"image_generation",output_format:"png"};"string"==typeof d.size&&d.size.trim()&&(n.size=d.size.trim()),"string"==typeof d.quality&&d.quality.trim()&&(g=d.quality.trim().toLowerCase(),n.quality="standard"===g?"medium":"hd"===g?"high":g);let o={model:a,instructions:"You must call the image_generation tool exactly once to fulfill the user's request. Do not add narration.",input:[{role:"user",content:[{type:"input_text",text:j}]}],tools:[n],stream:!0,store:!1},p={"Content-Type":"application/json",Accept:"text/event-stream",Authorization:`Bearer ${l}`,Version:(0,h.zq)(),"User-Agent":(0,h.EQ)(),originator:"codex_cli_rs"};"string"==typeof m&&m&&(p["chatgpt-account-id"]=m,p.session_id=m),f&&f.info("IMAGE",`${b}/${a} (codex-responses) | prompt: "${j.slice(0,60)}..."`);let q=[];for(let d=0;d<k;d++){let d;try{d=await fetch(c.baseUrl,{method:"POST",headers:p,body:JSON.stringify(o)})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:i,error:`Image provider error: ${c.message}`,requestBody:o})}if(!d.ok){let c=await d.text();return f&&f.error("IMAGE",`${b} error ${d.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:d.status,startTime:i,error:c,requestBody:o})}let e=await d.text(),g=function(a){let b=[];for(let c of String(a||"").split("\n")){let a,d=c.trim();if(!d.startsWith("data:"))continue;let e=d.slice(5).trim();if(!e||"[DONE]"===e)continue;try{a=JSON.parse(e)}catch{continue}if(a?.type!=="response.output_item.done")continue;let f=a.item;if(!f||"image_generation_call"!==f.type)continue;let g="string"==typeof f.result?f.result:"";if(!g)continue;let h="string"==typeof f.revised_prompt?f.revised_prompt:null;b.push({b64:g,revisedPrompt:h})}return b}(e);if(0===g.length)return J({provider:b,model:a,status:502,startTime:i,error:"Codex completed without producing an image_generation_call — the model may have declined the tool",requestBody:o});for(let a of g)q.push({b64_json:a.b64,...a.revisedPrompt?{revised_prompt:a.revisedPrompt}:{}})}let r="b64_json"!==d.response_format?q.map(a=>({url:`data:image/png;base64,${a.b64_json}`,...a.revised_prompt?{revised_prompt:a.revised_prompt}:{}})):q;return I({provider:b,model:a,startTime:i,requestBody:o,responseBody:{images_count:r.length},images:r})}function I({provider:a,model:b,startTime:c,requestBody:d=null,responseBody:e=null,created:f=null,images:g}){return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${a}/${b}`,provider:a,duration:Date.now()-c,requestBody:d,responseBody:e}).catch(()=>{}),{success:!0,data:{created:f||Math.floor(Date.now()/1e3),data:g}}}function J({provider:a,model:b,status:c,startTime:d,error:e,requestBody:f=null}){return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:c,model:`${a}/${b}`,provider:a,duration:Date.now()-d,error:"string"==typeof e?e.slice(0,500):String(e).slice(0,500),requestBody:f}).catch(()=>{}),{success:!1,status:c,error:e}}async function K(a,b,c,d,e){try{let f=await fetch(a,{method:"POST",headers:b,body:c});if(!f.ok){let a=await f.text();return e&&e.error("IMAGE",`${d} error ${f.status}: ${a.slice(0,200)}`),{success:!1,status:f.status,error:a}}let g=await f.json();return{success:!0,data:{created:g.created||Math.floor(Date.now()/1e3),data:g.data||[]}}}catch(a){return e&&e.error("IMAGE",`${d} fetch error: ${a.message}`),{success:!1,status:502,error:`Image provider error: ${a.message}`}}}async function L({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g=Date.now(),h=e.apiKey||e.accessToken,[i,j]=(d.size||"1024x1024").split("x").map(Number),l={model_name:a,prompt:d.prompt,height:j||1024,width:i||1024,backend:"auto"};if(f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (hyperbolic) | prompt: "${c}..."`)}try{let e=await fetch(c.baseUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${h}`},body:JSON.stringify(l)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:e.status,model:`${b}/${a}`,provider:b,duration:Date.now()-g,error:c.slice(0,500)}).catch(()=>{}),{success:!1,status:e.status,error:c}}let i=((await e.json()).images||[]).map(a=>({b64_json:a.image,revised_prompt:d.prompt}));return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-g,responseBody:{images_count:i.length}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:i}}}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-g,error:c.message}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c.message}`}}}async function M({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let h=Date.now(),i=e.apiKey||e.accessToken,j="nanobanana-pro"===a,l=j&&c.proUrl?c.proUrl:c.baseUrl,m=c.statusUrl,n="string"==typeof d.aspectRatio?d.aspectRatio:"string"==typeof d.aspect_ratio?d.aspect_ratio:(0,g.J)(d.size),o="string"==typeof d.resolution?d.resolution:function(a){if("string"!=typeof a)return null;let[b,c]=a.split("x"),d=Number(b),e=Number(c);if(!Number.isFinite(d)||!Number.isFinite(e)||d<=0||e<=0)return null;let f=Math.max(d,e);return f<=1024?"1K":f<=2048?"2K":"4K"}(d.size)||"1K";"hd"===d.quality&&"1K"===o&&(o="2K");let p=j?{prompt:d.prompt,resolution:o,aspectRatio:n,...Array.isArray(d.imageUrls)?{imageUrls:d.imageUrls}:{}}:{prompt:d.prompt,type:Array.isArray(d.imageUrls)&&d.imageUrls.length>0?"IMAGETOIAMGE":"TEXTTOIAMGE",numImages:Number.isFinite(d.n)?Math.max(1,Number(d.n)):1,image_size:n,...Array.isArray(d.imageUrls)?{imageUrls:d.imageUrls}:{}};if(f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (nanobanana ${j?"pro":"flash"}) | prompt: "${c}..."`)}try{let c=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify(p)});if(!c.ok){let d=await c.text();return f&&f.error("IMAGE",`${b} submit error ${c.status}: ${d.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:c.status,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:d.slice(0,500)}).catch(()=>{}),{success:!1,status:c.status,error:d}}let e=await c.json();if(e?.image||Array.isArray(e?.images)||Array.isArray(e?.data)||e?.data?.[0]?.url||e?.data?.[0]?.b64_json){let c=function(a,b){let c=[];if(a.image)c.push({b64_json:a.image,revised_prompt:b});else if(Array.isArray(a.images))for(let d of a.images)c.push({b64_json:"string"==typeof d?d:d?.image||d?.data,revised_prompt:b});else if(Array.isArray(a.data))for(let b of a.data)b&&c.push(b);return{data:c.filter(Boolean)}}(e,d.prompt);return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-h,responseBody:{images_count:c.data?.length||0,mode:"sync"}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:c.data}}}let g=e?.data?.taskId||e?.taskId;if(!g){let c=`NanoBanana submit did not return taskId: ${JSON.stringify(e).slice(0,400)}`;return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c}).catch(()=>{}),{success:!1,status:502,error:c}}if(!m){let c="NanoBanana statusUrl is not configured";return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:500,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c}).catch(()=>{}),{success:!1,status:500,error:c}}let j=O(d.timeout_ms,O(process.env.NANOBANANA_POLL_TIMEOUT_MS,12e4)),n=O(d.poll_interval_ms,O(process.env.NANOBANANA_POLL_INTERVAL_MS,2500)),o=null,q=Date.now()+j;for(;Date.now()<q;){let c=await fetch(`${m}?taskId=${encodeURIComponent(g)}`,{method:"GET",headers:{Authorization:`Bearer ${i}`}});if(!c.ok){let a=await c.text();return f&&f.error("IMAGE",`${b} poll error ${c.status}: ${a.slice(0,200)}`),{success:!1,status:c.status,error:a}}let e=await c.json(),j=e?.data||e;o=j;let l=Number(j?.successFlag);if(1===l){let c=await N(j,d,f);return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-h,responseBody:{images_count:c.length,mode:"async",taskId:g}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:c}}}if(2===l||3===l){let c=j?.errorMessage||`NanoBanana task failed (successFlag=${String(l)})`;return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c.slice(0,500),responseBody:{taskId:g,successFlag:l,errorCode:j?.errorCode??null}}).catch(()=>{}),{success:!1,status:502,error:c}}await P(n)}let r=`NanoBanana task timeout after ${j}ms (taskId=${g}, successFlag=${String(o?.successFlag??"unknown")})`;return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:504,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:r,responseBody:{taskId:g,lastSuccessFlag:o?.successFlag??null}}).catch(()=>{}),{success:!1,status:504,error:r}}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c.message}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c.message}`}}}async function N(a,b,c){let d=a?.response||{},e=[d?.resultImageUrl,d?.originImageUrl,a?.resultImageUrl,a?.originImageUrl].filter(a=>"string"==typeof a&&a.length>0);if(Array.isArray(d?.resultImageUrls))for(let a of d.resultImageUrls)"string"==typeof a&&a.length>0&&e.push(a);let f=[d?.resultImageBase64,d?.resultImage,a?.resultImageBase64,a?.resultImage].filter(a=>"string"==typeof a&&a.length>0);if(Array.isArray(d?.resultImageBase64List))for(let a of d.resultImageBase64List)"string"==typeof a&&a.length>0&&f.push(a);if("b64_json"===b.response_format){if(f.length>0)return f.map(a=>({b64_json:a,revised_prompt:b.prompt}));if(e.length>0){let a=e[0];return[{b64_json:(await (0,m.I)(a)).buffer.toString("base64"),revised_prompt:b.prompt}]}}return e.length>0?e.map(a=>({url:a,revised_prompt:b.prompt})):f.length>0?f.map(a=>({b64_json:a,revised_prompt:b.prompt})):(c&&c.warn("IMAGE",`NanoBanana task completed without image payload: ${JSON.stringify(a).slice(0,240)}`),[])}function O(a,b){let c=Number(a);return!Number.isFinite(c)||c<=0?b:Math.floor(c)}function P(a){return new Promise(b=>setTimeout(b,a))}async function Q({model:a,provider:b,providerConfig:c,body:d,log:e}){let f=Date.now(),[g,h]=(d.size||"512x512").split("x").map(Number),i={prompt:d.prompt,negative_prompt:d.negative_prompt||"",width:g||512,height:h||512,steps:d.steps||20,cfg_scale:d.cfg_scale||7,sampler_name:d.sampler||"Euler a",batch_size:d.n||1,override_settings:{sd_model_checkpoint:a}};if(e){let c=String(d.prompt??"").slice(0,60);e.info("IMAGE",`${b}/${a} (sdwebui) | prompt: "${c}..."`)}try{let g=await fetch(c.baseUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!g.ok){let c=await g.text();return e&&e.error("IMAGE",`${b} error ${g.status}: ${c.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:g.status,model:`${b}/${a}`,provider:b,duration:Date.now()-f,error:c.slice(0,500)}).catch(()=>{}),{success:!1,status:g.status,error:c}}let h=((await g.json()).images||[]).map(a=>({b64_json:a,revised_prompt:d.prompt}));return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-f,responseBody:{images_count:h.length}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:h}}}catch(c){return e&&e.error("IMAGE",`${b} sdwebui error: ${c.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-f,error:c.message}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c.message}`}}}async function R({model:a,provider:b,providerConfig:c,body:d,log:f}){let g=Date.now(),[h,i]=(d.size||"1024x1024").split("x").map(Number),j={3:{class_type:"KSampler",inputs:{seed:parseInt((0,e.randomUUID)().replace(/-/g,"").substring(0,8),16)%0x100000000,steps:d.steps||20,cfg:d.cfg_scale||7,sampler_name:"euler",scheduler:"normal",denoise:1,model:["4",0],positive:["6",0],negative:["7",0],latent_image:["5",0]}},4:{class_type:"CheckpointLoaderSimple",inputs:{ckpt_name:a}},5:{class_type:"EmptyLatentImage",inputs:{width:h||1024,height:i||1024,batch_size:d.n||1}},6:{class_type:"CLIPTextEncode",inputs:{text:d.prompt,clip:["4",1]}},7:{class_type:"CLIPTextEncode",inputs:{text:d.negative_prompt||"",clip:["4",1]}},8:{class_type:"VAEDecode",inputs:{samples:["3",0],vae:["4",2]}},9:{class_type:"SaveImage",inputs:{filename_prefix:"omniroute",images:["8",0]}}};if(f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (comfyui) | prompt: "${c}..."`)}try{let e=await (0,l.ep)(c.baseUrl,j),f=await (0,l.VA)(c.baseUrl,e),h=(0,l.AC)(f),i=[];for(let a of h){let b=await (0,l.Uh)(c.baseUrl,a.filename,a.subfolder,a.type),e=Buffer.from(b).toString("base64");i.push({b64_json:e,revised_prompt:d.prompt})}return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-g,responseBody:{images_count:i.length}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:i}}}catch(c){return f&&f.error("IMAGE",`${b} comfyui error: ${c.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-g,error:c.message}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c.message}`}}}async function S({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let h=Date.now(),i=e.apiKey||e.accessToken,j=(0,g.J)(d.size),l={prompt:d.prompt,aspect_ratio:j,number_of_images:d.n??1};if(f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (imagen3) | prompt: "${c}..." | aspect_ratio: ${j}`)}try{let e=await fetch(c.baseUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify(l)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:e.status,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c.slice(0,500),requestBody:l}).catch(()=>{}),{success:!1,status:e.status,error:c}}let g=await e.json(),j=[];return Array.isArray(g.images)?j.push(...g.images.map(a=>({b64_json:a.image??a.b64_json??a.url??a,revised_prompt:d.prompt}))):Array.isArray(g.data)?j.push(...g.data):(g.url||g.b64_json||g.image)&&j.push({b64_json:g.image||g.b64_json||g.url,url:g.url,revised_prompt:d.prompt}),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-h,responseBody:{images_count:j.length}}).catch(()=>{}),{success:!0,data:{created:g.created||Math.floor(Date.now()/1e3),data:j}}}catch(d){let c=d instanceof Error?d.message:String(d);return f&&f.error("IMAGE",`${b} fetch error: ${c}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c}`}}}d()}catch(a){d(a)}})},99465:(a,b,c)=>{function d(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}async function e(a,b){let c=await fetch(`${a}/prompt`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:b})});if(!c.ok){let a=await c.text();throw Error(`ComfyUI submit failed (${c.status}): ${a}`)}let e=d(await c.json()).prompt_id;if("string"!=typeof e||!e)throw Error("ComfyUI submit failed: missing prompt_id");return e}async function f(a,b,c=12e4){let e=Date.now();for(;Date.now()-e<c;){await new Promise(a=>setTimeout(a,2e3));let c=await fetch(`${a}/history/${b}`);if(!c.ok)continue;let e=d(await c.json()),f=d(e[b]);if(f&&f.outputs&&Object.keys(f.outputs).length>0)return f}throw Error(`ComfyUI prompt ${b} timed out after ${c}ms`)}async function g(a,b,c,d){let e=new URL(`${a}/view`);e.searchParams.set("filename",b),e.searchParams.set("subfolder",c),e.searchParams.set("type",d);let f=await fetch(e.toString());if(!f.ok)throw Error(`ComfyUI fetch output failed (${f.status})`);return f.arrayBuffer()}function h(a){let b=[];for(let c of Object.values(a.outputs||{}))for(let a of c.images||c.gifs||c.audio||[])b.push({filename:a.filename,subfolder:a.subfolder||"",type:a.type||"output"});return b}c.d(b,{AC:()=>h,Uh:()=>g,VA:()=>f,ep:()=>e})}};
|
|
1
|
+
"use strict";exports.id=20236,exports.ids=[20236],exports.modules={58247:(a,b,c)=>{c.d(b,{J:()=>f});let d={"256x256":"1:1","512x512":"1:1","1024x1024":"1:1","1792x1024":"16:9","1024x1792":"9:16","1536x1024":"3:2","1024x1536":"2:3"},e=/^\d+:\d+$/;function f(a){return a?e.test(a)?a:d[a]??"1:1":"1:1"}},80641:(a,b,c)=>{c.d(b,{De:()=>g,NT:()=>k,Uk:()=>i,bV:()=>h,lw:()=>j});let d={"flux-kontext":{provider:"black-forest-labs",model:"flux-kontext-pro",name:"FLUX Kontext Pro",listInCatalog:!0,inputModalities:["text","image"]},"flux-kontext-max":{provider:"black-forest-labs",model:"flux-kontext-max",name:"FLUX Kontext Max",listInCatalog:!0,inputModalities:["text","image"]},"flux-2-max":{provider:"black-forest-labs",model:"flux-2-max",name:"FLUX.2 Max",listInCatalog:!0,inputModalities:["text","image"]},"flux-2-pro":{provider:"black-forest-labs",model:"flux-2-pro",name:"FLUX.2 Pro",listInCatalog:!0,inputModalities:["text","image"]},"flux-2-flex":{provider:"black-forest-labs",model:"flux-2-flex",name:"FLUX.2 Flex",listInCatalog:!0,inputModalities:["text","image"]},"flux-2-dev":{provider:"together",model:"black-forest-labs/FLUX.2-dev",name:"FLUX.2 Dev",listInCatalog:!0,inputModalities:["text","image"]},kontext:{provider:"black-forest-labs",model:"flux-kontext-pro",name:"FLUX Kontext Pro",listInCatalog:!1,inputModalities:["text","image"]},"pollinations/kontext":{provider:"black-forest-labs",model:"flux-kontext-pro",name:"FLUX Kontext Pro",listInCatalog:!1,inputModalities:["text","image"]}};function e(a){let b=d[a];return b?{provider:b.provider,model:b.model}:null}function f(a,b){let c=g[a];return c&&c.models.find(a=>a.id===b)||null}let g={openai:{id:"openai",baseUrl:"https://api.openai.com/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"gpt-image-2",name:"GPT Image 2"},{id:"gpt-image-1.5",name:"GPT Image 1.5"},{id:"gpt-image-1-mini",name:"GPT Image 1 Mini"}],supportedSizes:["1024x1024","1024x1792","1792x1024"]},codex:{id:"codex",alias:"cx",baseUrl:"https://chatgpt.com/backend-api/codex/responses",authType:"oauth",authHeader:"bearer",format:"codex-responses",models:[{id:"gpt-5.5",name:"GPT 5.5 (Codex Image)"},{id:"gpt-5.4",name:"GPT 5.4 (Codex Image)"},{id:"gpt-5.3-codex",name:"GPT 5.3 Codex (Image)"}],supportedSizes:["1024x1024","1024x1536","1536x1024"]},"chatgpt-web":{id:"chatgpt-web",alias:"cgpt-web",baseUrl:"https://chatgpt.com/backend-api/f/conversation",authType:"apikey",authHeader:"cookie",format:"chatgpt-web",models:[{id:"gpt-5.3-instant",name:"GPT-5.3 Instant (ChatGPT Web Image)"}],supportedSizes:["1024x1024","1024x1536","1536x1024"]},xai:{id:"xai",baseUrl:"https://api.x.ai/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"grok-imagine-image",name:"Grok Imagine Image"}],supportedSizes:["1024x1024"]},together:{id:"together",baseUrl:"https://api.together.xyz/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"black-forest-labs/FLUX.2-max",name:"FLUX.2 Max",inputModalities:["text","image"]},{id:"black-forest-labs/FLUX.2-pro",name:"FLUX.2 Pro",inputModalities:["text","image"]},{id:"black-forest-labs/FLUX.2-flex",name:"FLUX.2 Flex",inputModalities:["text","image"]},{id:"black-forest-labs/FLUX.2-dev",name:"FLUX.2 Dev",inputModalities:["text","image"]},{id:"openai/gpt-image-1.5",name:"GPT Image 1.5",inputModalities:["text","image"]},{id:"Wan-AI/Wan2.6-image",name:"Wan 2.6 Image",inputModalities:["text","image"]},{id:"Qwen/Qwen-Image-2.0-Pro",name:"Qwen Image 2.0 Pro",inputModalities:["text","image"]},{id:"Qwen/Qwen-Image-2.0",name:"Qwen Image 2.0",inputModalities:["text","image"]},{id:"google/flash-image-3.1",name:"NanoBanana 2",inputModalities:["text","image"]},{id:"google/gemini-3-pro-image",name:"NanoBanana Pro",inputModalities:["text","image"]}],supportedSizes:["1024x1024","512x512"]},fireworks:{id:"fireworks",baseUrl:"https://api.fireworks.ai/inference/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"accounts/fireworks/flux-kontext-max",name:"FLUX Kontext Max"},{id:"accounts/fireworks/flux-kontext-pro",name:"FLUX Kontext Pro"},{id:"accounts/fireworks/flux-1-schnell-fp8",name:"FLUX.1 schnell"},{id:"accounts/fireworks/models/flux-1-dev-fp8",name:"FLUX 1 Dev FP8"},{id:"accounts/fireworks/models/stable-diffusion-xl-1024-v1-0",name:"SDXL 1024 v1.0"}],supportedSizes:["1024x1024","512x512"]},antigravity:{id:"antigravity",baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",authType:"oauth",authHeader:"bearer",format:"gemini-image",models:[],supportedSizes:["1024x1024"]},nebius:{id:"nebius",baseUrl:"https://api.tokenfactory.nebius.com/v1/images/generations",fallbackUrl:"https://api.studio.nebius.com/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"black-forest-labs/flux-schnell",name:"No Model yet"}],supportedSizes:["1024x1024"]},hyperbolic:{id:"hyperbolic",baseUrl:"https://api.hyperbolic.xyz/v1/image/generation",authType:"apikey",authHeader:"bearer",format:"hyperbolic",models:[{id:"SDXL1.0-base",name:"No Model yet"}],supportedSizes:["1024x1024"]},nanobanana:{id:"nanobanana",baseUrl:"https://api.nanobananaapi.ai/api/v1/nanobanana/generate",proUrl:"https://api.nanobananaapi.ai/api/v1/nanobanana/generate-pro",statusUrl:"https://api.nanobananaapi.ai/api/v1/nanobanana/record-info",authType:"apikey",authHeader:"bearer",format:"nanobanana",models:[{id:"nanobanana-flash",name:"NanoBanana Flash (Gemini 2.5 Flash)"},{id:"nanobanana-pro",name:"NanoBanana Pro (Gemini 3 Pro)"}],supportedSizes:["1024x1024","1024x1280","1024x1536","1536x1024","1280x1024"]},sdwebui:{id:"sdwebui",baseUrl:"http://localhost:7860/sdapi/v1/txt2img",authType:"none",authHeader:"none",format:"sdwebui",models:[{id:"stable-diffusion-v1-5",name:"Stable Diffusion v1.5"},{id:"sdxl-base-1.0",name:"SDXL Base 1.0"}],supportedSizes:["512x512","768x768","1024x1024"]},comfyui:{id:"comfyui",baseUrl:"http://localhost:8188",authType:"none",authHeader:"none",format:"comfyui",models:[{id:"flux-dev",name:"FLUX Dev"},{id:"sdxl",name:"SDXL"}],supportedSizes:["512x512","768x768","1024x1024"]},openrouter:{id:"openrouter",baseUrl:"https://openrouter.ai/api/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"openai/gpt-5.4-image-2",name:"GPT Image 2 (via OpenRouter)"},{id:"openai/gpt-5-image-mini",name:"GPT Image 1 Mini (via OpenRouter)"},{id:"google/gemini-3.1-flash-image-preview",name:"Nano Banana 2 (via OpenRouter)"},{id:"google/gemini-3-pro-image-preview",name:"Nano Banana Pro (via OpenRouter)"},{id:"black-forest-labs/flux.2-max",name:"FLUX.2 Max (via OpenRouter)"},{id:"black-forest-labs/flux.2-pro",name:"FLUX.2 Pro (via OpenRouter)"},{id:"black-forest-labs/flux.2-flex",name:"FLUX.2 Flex (via OpenRouter)"}],supportedSizes:["1024x1024","1024x1792","1792x1024"]},pollinations:{id:"pollinations",alias:"pol",baseUrl:"https://gen.pollinations.ai/v1/images/generations",authType:"apikey",authHeader:"bearer",format:"openai",models:[{id:"klein",name:"FLUX.2 Klein 4B"},{id:"flux",name:"Flux Schnell"},{id:"zimage",name:"Z-Image Turbo"},{id:"qwen-image",name:"Qwen Image Plus"},{id:"wan-image",name:"Wan 2.7 Image"},{id:"gpt-image-2",name:"GPT Image 2"},{id:"gptimage-large",name:"GPT Image 1.5"},{id:"gptimage",name:"GPT Image 1 Mini"}],supportedSizes:["1024x1024","512x512"]},"fal-ai":{id:"fal-ai",baseUrl:"https://fal.run",authType:"apikey",authHeader:"key",format:"fal-ai",models:[{id:"fal-ai/flux-2-max",name:"FLUX.2 Max"},{id:"fal-ai/flux-2-pro",name:"FLUX.2 Pro"},{id:"fal-ai/flux-2-flex",name:"FLUX.2 Flex"},{id:"bria/text-to-image/3.2",name:"Bria 3.2"},{id:"fal-ai/bytedance/seedream/v4.5/text-to-image",name:"SeeDream V4.5"},{id:"fal-ai/bytedance/dreamina/v3.1/text-to-image",name:"Dreamina V3.1"},{id:"fal-ai/ideogram/v3",name:"Ideogram V3"},{id:"fal-ai/nano-banana-pro",name:"Nano Banana Pro"},{id:"fal-ai/nano-banana-2",name:"Nano Banana 2"},{id:"fal-ai/recraft/v4/pro/text-to-image",name:"Recraft V4 Pro via Fal"},{id:"fal-ai/recraft/v4/text-to-image",name:"Recraft V4 via Fal"},{id:"fal-ai/stable-diffusion-v35-medium",name:"Stable Diffusion v3.5 Medium"}],supportedSizes:["1024x1024","1024x1280","1280x1024"]},"stability-ai":{id:"stability-ai",baseUrl:"https://api.stability.ai",authType:"apikey",authHeader:"bearer",format:"stability-ai",models:[{id:"stable-image-ultra",name:"Stable Image Ultra"},{id:"stable-image-core",name:"Stable Image Core"},{id:"sd3.5-large-turbo",name:"sd3.5-large-turbo"},{id:"sd3.5-large",name:"sd3.5-large"},{id:"sd3.5-medium",name:"sd3.5-medium"},{id:"sd3.5-flash",name:"sd3.5-flash"},{id:"erase",name:"Erase",inputModalities:["image"]},{id:"inpaint",name:"Inpaint",inputModalities:["text","image"]},{id:"outpaint",name:"Outpaint",inputModalities:["text","image"]},{id:"remove-background",name:"Remove Background",inputModalities:["image"]},{id:"search-and-replace",name:"Search and Replace",inputModalities:["text","image"]},{id:"search-and-recolor",name:"Search and Recolor",inputModalities:["text","image"]},{id:"replace-background-and-relight",name:"Replace Background and Relight",inputModalities:["text","image"]},{id:"creative",name:"Creative Upscale",inputModalities:["text","image"]},{id:"fast",name:"Fast Upscale",inputModalities:["image"]},{id:"conservative",name:"Conservative Upscale",inputModalities:["image"]},{id:"sketch",name:"Sketch Control",inputModalities:["text","image"]},{id:"structure",name:"Structure Control",inputModalities:["text","image"]},{id:"style",name:"Style Control",inputModalities:["text","image"]},{id:"style-transfer",name:"Style Transfer",inputModalities:["text","image"]}],supportedSizes:["1024x1024","1024x1280","1280x1024"]},"black-forest-labs":{id:"black-forest-labs",baseUrl:"https://api.bfl.ai",authType:"apikey",authHeader:"x-key",format:"black-forest-labs",models:[{id:"flux-2-max",name:"FLUX.2 Max"},{id:"flux-2-pro",name:"FLUX.2 Pro"},{id:"flux-2-flex",name:"FLUX.2 Flex"},{id:"flux-pro-1.1-ultra",name:"flux-pro-1.1-ultra"},{id:"flux-pro-1.1",name:"flux-pro-1.1"},{id:"flux-2-klein-9b",name:"flux 2 Klein 9B"},{id:"flux-2-klein-4b",name:"flux 2 Klein 4B"},{id:"flux-kontext-max",name:"flux-kontext-max",inputModalities:["text","image"]},{id:"flux-kontext-pro",name:"flux-kontext-pro",inputModalities:["text","image"]},{id:"flux-dev",name:"flux-dev"},{id:"flux-pro",name:"flux-pro"}],supportedSizes:["1024x1024","1024x1280","1280x1024"]},recraft:{id:"recraft",baseUrl:"https://external.api.recraft.ai",authType:"apikey",authHeader:"bearer",format:"recraft",models:[{id:"recraftv4_pro",name:"Recraft V4 Pro"},{id:"recraftv4",name:"Recraft V4"},{id:"recraftv3",name:"Recraft V3"},{id:"recraftv2",name:"Recraft V2"}],supportedSizes:["1024x1024","1024x1280","1280x1024"]},topaz:{id:"topaz",baseUrl:"https://api.topazlabs.com",authType:"apikey",authHeader:"x-api-key",format:"topaz",models:[{id:"topaz-enhance",name:"topaz-enhance",inputModalities:["image"]}],supportedSizes:["1024x1024"]}};function h(a){return g[a]||null}function i(a){if(!a)return{provider:null,model:null};let b=e(a);if(b)return b;for(let[b,c]of Object.entries(g)){if(a.startsWith(b+"/")){let c=a.slice(b.length+1);return e(`${b}/${c}`)||e(c)||{provider:b,model:c}}if(c.alias&&a.startsWith(c.alias+"/")){let d=a.slice(c.alias.length+1);return e(`${b}/${d}`)||e(d)||{provider:b,model:d}}}for(let[b,c]of Object.entries(g))if(c.models.some(b=>b.id===a))return{provider:b,model:a};return{provider:null,model:a}}function j(){let a=[];for(let[b,c]of Object.entries(g))for(let d of c.models)a.push({id:`${b}/${d.id}`,name:d.name,provider:b,supportedSizes:c.supportedSizes,inputModalities:d.inputModalities||["text"],description:d.description||void 0});for(let[b,c]of Object.entries(d)){if(!c.listInCatalog)continue;let d=g[c.provider],e=f(c.provider,c.model);a.push({id:b,name:c.name||e?.name||b,provider:c.provider,supportedSizes:d?.supportedSizes||[],inputModalities:c.inputModalities||e?.inputModalities||["text"],description:c.description||e?.description||void 0})}return a}function k(a){if(!a)return null;let b=d[a];if(b){let a=f(b.provider,b.model);return{provider:b.provider,model:b.model,inputModalities:b.inputModalities||a?.inputModalities||["text"],description:b.description||a?.description||void 0}}let{provider:c,model:e}=i(a);if(!c||!e)return null;let g=f(c,e);return g?{provider:c,model:e,inputModalities:g.inputModalities||["text"],description:g.description||void 0}:null}},97855:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{ky:()=>o});var e=c(55511),f=c(80641),g=c(58247),h=c(22803),i=c(98398),j=c(67323);c(77598);var k=c(11283),l=c(99465),m=c(73152),n=a([k]);k=(n.then?(await n)():n)[0];let T=new Set(["black-forest-labs/FLUX.2-max","black-forest-labs/FLUX.2-pro","black-forest-labs/FLUX.2-flex","black-forest-labs/FLUX.2-dev","openai/gpt-image-1.5","Wan-AI/Wan2.6-image","Qwen/Qwen-Image-2.0-Pro","Qwen/Qwen-Image-2.0","google/flash-image-3.1","google/gemini-3-pro-image","flux-kontext-max","flux-kontext","flux-kontext-pro"]),U={"flux-2-max":"/v1/flux-2-max","flux-2-pro":"/v1/flux-2-pro","flux-2-flex":"/v1/flux-2-flex","flux-2-klein-9b":"/v1/flux-2-klein-9b","flux-2-klein-4b":"/v1/flux-2-klein-4b","flux-kontext-pro":"/v1/flux-kontext-pro","flux-kontext-max":"/v1/flux-kontext-max","flux-pro-1.1":"/v1/flux-pro-1.1","flux-pro-1.1-ultra":"/v1/flux-pro-1.1-ultra","flux-dev":"/v1/flux-dev","flux-pro":"/v1/flux-pro"},V=new Set(["flux-2-max","flux-2-pro","flux-2-flex","flux-kontext-pro","flux-kontext-max"]),W=new Set(["Error","Failed","Content Moderated","Request Moderated"]),X={"sd3.5-large":"/v2beta/stable-image/generate/sd3","sd3.5-large-turbo":"/v2beta/stable-image/generate/sd3","sd3.5-medium":"/v2beta/stable-image/generate/sd3","sd3.5-flash":"/v2beta/stable-image/generate/sd3","stable-image-ultra":"/v2beta/stable-image/generate/ultra","stable-image-core":"/v2beta/stable-image/generate/core"},Y={inpaint:"/v2beta/stable-image/edit/inpaint",outpaint:"/v2beta/stable-image/edit/outpaint",erase:"/v2beta/stable-image/edit/erase","search-and-replace":"/v2beta/stable-image/edit/search-and-replace","search-and-recolor":"/v2beta/stable-image/edit/search-and-recolor","remove-background":"/v2beta/stable-image/edit/remove-background","replace-background-and-relight":"/v2beta/stable-image/edit/replace-background-and-relight",fast:"/v2beta/stable-image/upscale/fast",conservative:"/v2beta/stable-image/upscale/conservative",creative:"/v2beta/stable-image/upscale/creative",sketch:"/v2beta/stable-image/control/sketch",structure:"/v2beta/stable-image/control/structure",style:"/v2beta/stable-image/control/style","style-transfer":"/v2beta/stable-image/control/style-transfer"},Z=new Set(["sketch","structure","style","style-transfer"]),$={"1024x1024":"square_hd","512x512":"square","1792x1024":"landscape_16_9","1024x1792":"portrait_16_9","1024x768":"landscape_4_3","768x1024":"portrait_4_3","1536x1024":"landscape_3_2","1024x1536":"portrait_3_2","576x1024":"portrait_16_9","1024x576":"landscape_16_9"};async function o({body:a,credentials:b,log:c,resolvedProvider:d=null,signal:e=null,clientHeaders:g=null}){let h,i;if(d){h=d;let b=a.model||"";i=b.startsWith(h+"/")?b.slice(h.length+1):b}else{let b=(0,f.Uk)(a.model);h=b.provider,i=b.model}if(!h)return{success:!1,status:400,error:`Invalid image model: ${a.model}. Use format: provider/model`};let j=(0,f.bV)(h);if(!j){if(!d)return{success:!1,status:400,error:`Unknown image provider: ${h}`};c&&c.info("IMAGE",`Custom model ${h}/${i} — using OpenAI-compatible handler`);let e={id:h,baseUrl:b?.baseUrl||"https://generativelanguage.googleapis.com/v1beta/openai/images/generations",authType:"apikey",authHeader:"bearer",format:"openai"};return q({model:i,provider:h,providerConfig:e,body:a,credentials:b,log:c})}return"gemini-image"===j.format?p({model:i,providerConfig:j,body:a,credentials:b,log:c}):"imagen3"===j.format?S({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"hyperbolic"===j.format?L({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"fal-ai"===j.format?s({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"stability-ai"===j.format?t({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"black-forest-labs"===j.format?u({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"recraft"===j.format?v({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"topaz"===j.format?w({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"chatgpt-web"===j.format?r({model:i,provider:h,body:a,credentials:b,log:c,signal:e,clientHeaders:g}):"nanobanana"===j.format?M({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):"sdwebui"===j.format?Q({model:i,provider:h,providerConfig:j,body:a,log:c}):"comfyui"===j.format?R({model:i,provider:h,providerConfig:j,body:a,log:c}):"codex-responses"===j.format?H({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c}):q({model:i,provider:h,providerConfig:j,body:a,credentials:b,log:c})}async function p({model:a,providerConfig:b,body:c,credentials:d,log:e}){let f=Date.now(),g=`${b.baseUrl}/${a}:generateContent`,h="antigravity",i={model:c.model,prompt:"string"==typeof c.prompt?c.prompt.slice(0,200):String(c.prompt??"").slice(0,200),size:c.size||"default",n:c.n||1},j={contents:[{parts:[{text:c.prompt}]}],generationConfig:{responseModalities:["TEXT","IMAGE"]}},l=d.accessToken||d.apiKey,m={"Content-Type":"application/json",Authorization:`Bearer ${l}`};if(e){let b="string"==typeof c.prompt?c.prompt.slice(0,60):String(c.prompt??"").slice(0,60);e.info("IMAGE",`antigravity/${a} (gemini) | prompt: "${b}..." | format: gemini-image`)}try{let b=await fetch(g,{method:"POST",headers:m,body:JSON.stringify(j)});if(!b.ok){let c=await b.text();return e&&e.error("IMAGE",`antigravity error ${b.status}: ${c.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:b.status,model:`antigravity/${a}`,provider:h,duration:Date.now()-f,error:c.slice(0,500),requestBody:i}).catch(()=>{}),{success:!1,status:b.status,error:c}}let d=await b.json(),l=[];for(let a of d.candidates||[]){let b=a.content?.parts||[];for(let a of b)a.inlineData&&l.push({b64_json:a.inlineData.data,revised_prompt:b.find(a=>a.text)?.text||c.prompt})}return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`antigravity/${a}`,provider:h,duration:Date.now()-f,tokens:{prompt_tokens:0,completion_tokens:0},requestBody:i,responseBody:{images_count:l.length}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:l}}}catch(b){return e&&e.error("IMAGE",`antigravity fetch error: ${b.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`antigravity/${a}`,provider:h,duration:Date.now()-f,error:b.message,requestBody:i}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${b.message}`}}}async function q({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g=Date.now(),h={model:d.model,prompt:"string"==typeof d.prompt?d.prompt.slice(0,200):String(d.prompt??"").slice(0,200),size:d.size||"default",n:d.n||1,quality:d.quality||void 0},i={model:a,prompt:d.prompt};void 0!==d.n&&(i.n=d.n),void 0!==d.size&&(i.size=d.size),void 0!==d.quality&&(i.quality=d.quality),void 0!==d.response_format&&(i.response_format=d.response_format),void 0!==d.style&&(i.style=d.style);let{imageUrl:j}=y(d);j&&T.has(a)&&(i.image_url=j);let l={"Content-Type":"application/json"},m=e.apiKey||e.accessToken;if("bearer"===c.authHeader?l.Authorization=`Bearer ${m}`:"x-api-key"===c.authHeader&&(l["x-api-key"]=m),f){let c="string"==typeof d.prompt?d.prompt.slice(0,60):String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} | prompt: "${c}..." | size: ${d.size||"default"}`)}let n=JSON.stringify(i),o=await K(c.baseUrl,l,n,b,f);return!o.success&&c.fallbackUrl&&[404,410,502,503].includes(o.status)&&(f&&f.info("IMAGE",`${b}: primary URL failed (${o.status}), trying fallback...`),o=await K(c.fallbackUrl,l,n,b,f)),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:o.status||(o.success?200:502),model:`${b}/${a}`,provider:b,duration:Date.now()-g,tokens:{prompt_tokens:0,completion_tokens:0},error:o.success?null:"string"==typeof o.error?o.error.slice(0,500):null,requestBody:h,responseBody:o.success?{images_count:o.data?.data?.length||0}:null}).catch(()=>{}),o}let _=/!\[[^\]]*\]\(([^)\s]+)\)/g,aa=/\/v1\/chatgpt-web\/image\/([a-f0-9]{16,64})(?=[?\s"'<>)]|$)/i;async function r({model:a,provider:b,body:c,credentials:d,log:e,signal:f,clientHeaders:g}){let h=Date.now(),k="string"==typeof c.prompt?c.prompt.trim():"";if(!k)return J({provider:b,model:a,status:400,startTime:h,error:"Prompt is required for ChatGPT Web image generation"});if(!d?.apiKey)return J({provider:b,model:a,status:401,startTime:h,error:"ChatGPT Web credentials missing session cookie"});let l=Number.isInteger(c.n)&&c.n>0?c.n:1;if(l>4)return J({provider:b,model:a,status:400,startTime:h,error:`ChatGPT Web image generation supports n=1..4 (got ${l}); each n is a separate ~30s chat turn.`});e&&l>1&&e.warn("IMAGE",`ChatGPT Web returns one image per chat turn; requested n=${l} will run sequentially`);let m="b64_json"===c.response_format,n=[],o={model:a,prompt:k.slice(0,500),size:c.size||void 0,quality:c.quality||void 0};for(let k=0;k<l;k++){let k=new i.RF,l=await k.execute({model:a,body:{messages:[{role:"user",content:function(a){let b=String(a.prompt||"").trim(),c=[`Create an image for this prompt: ${b}`];return"string"==typeof a.size&&a.size.trim()&&c.push(`Requested size: ${a.size.trim()}.`),"string"==typeof a.quality&&a.quality.trim()&&c.push(`Requested quality: ${a.quality.trim()}.`),"string"==typeof a.style&&a.style.trim()&&c.push(`Requested style: ${a.style.trim()}.`),c.join("\n")}(c)}]},stream:!1,credentials:d,signal:f,log:e,clientHeaders:g}),p=await l.response.text();if(l.response.status>=400)return J({provider:b,model:a,status:l.response.status,startTime:h,error:p,requestBody:o});let q="";try{let a=JSON.parse(p);q=String(a?.choices?.[0]?.message?.content||"")}catch{q=p}let r=function(a){let b=[];for(let c of a.matchAll(_))c[1]&&b.push(c[1]);return b}(q);if(0===r.length)return J({provider:b,model:a,status:502,startTime:h,error:`ChatGPT Web completed without returning image markdown: ${q.slice(0,300)}`,requestBody:o});for(let c of r){if(!m){n.push({url:c});continue}let d=c.match(aa)?.[1],e=d?(0,j.Zb)(d):null;if(!e)return J({provider:b,model:a,status:502,startTime:h,error:"ChatGPT Web image bytes expired before b64_json conversion",requestBody:o});n.push({b64_json:e.bytes.toString("base64")})}}return I({provider:b,model:a,startTime:h,requestBody:o,responseBody:{images_count:n.length},images:n})}async function s({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){var h;let i=Date.now(),j=e.apiKey||e.accessToken,{imageUrl:k,imageUrls:l}=y(d),m={prompt:d.prompt,sync_mode:d.sync_mode??!0};void 0!==d.n&&(m.num_images=Number(d.n)||1),d.negative_prompt&&(m.negative_prompt=d.negative_prompt),void 0!==d.seed&&(m.seed=d.seed),d.style&&(h=d.style,m.style="vivid"===h?"digital_illustration":"natural"===h?"realistic_image":h);let n=B(d,"png");if(n&&(m.output_format=n),a.includes("flux-pro/v1.1")&&!a.includes("ultra")?m.image_size=C(d.size,"landscape_4_3"):a.includes("bytedance/")||a.includes("stable-diffusion")||a.includes("ideogram")||a.includes("recraft/v3")?m.image_size=C(d.size,"square_hd"):m.aspect_ratio=d.aspect_ratio||function(a,b="1:1"){return a?(0,g.J)(a):b}(d.size,"1:1"),"hd"===d.quality&&a.includes("ultra")&&(m.raw=!0),k&&a.includes("flux-pro/v1.1-ultra")&&(m.image_url=k),l.length>0&&a.includes("ideogram")&&(m.image_urls=l),f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (fal-ai) | prompt: "${c}..."`)}try{let e=await fetch(`${c.baseUrl.replace(/\/$/,"")}/${a}`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Key ${j}`},body:JSON.stringify(m)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:e.status,startTime:i,error:c,requestBody:m})}let g=await e.json(),h=await D(g,d,f);return I({provider:b,model:a,startTime:i,requestBody:m,responseBody:{images_count:h.length},created:g.created,images:h})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:i,error:`Image provider error: ${c.message}`})}}async function t({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let h=Date.now(),i=e.apiKey||e.accessToken,j=X[a]||Y[a];if(!j)return{success:!1,status:400,error:`Unsupported Stability AI image model: ${a}`};let{imageUrl:k,maskUrl:l}=y(d),m={output_format:"remove-background"===a?B(d,"png",["png","webp"]):B(d,"png")};d.prompt&&(m.prompt=d.prompt),d.negative_prompt&&(m.negative_prompt=d.negative_prompt),void 0!==d.seed&&(m.seed=d.seed);try{var n;let e;if(X[a]?(a.startsWith("sd3.5")&&(m.model=a),k?(m.mode="image-to-image",m.image=(await z(k)).base64,void 0!==d.strength&&(m.strength=d.strength)):m.mode="text-to-image",a.startsWith("sd3.5")&&k||(m.aspect_ratio=d.aspect_ratio||(0,g.J)(d.size)),d.style_preset&&(m.style_preset=d.style_preset)):(k&&(m.image=(await z(k)).base64),l&&(n=a,new Set(["inpaint","erase","search-and-replace","search-and-recolor","replace-background-and-relight"]).has(n))&&(m.mask=(await z(l)).base64),d.search_prompt&&(m.search_prompt=d.search_prompt),void 0!==d.grow_mask&&(m.grow_mask=d.grow_mask),void 0!==d.control_strength&&(m.control_strength=d.control_strength),void 0!==d.creativity&&(m.creativity=d.creativity),void 0!==d.left&&(m.left=d.left),void 0!==d.right&&(m.right=d.right),void 0!==d.up&&(m.up=d.up),void 0!==d.down&&(m.down=d.down),d.style_preset&&(m.style_preset=d.style_preset),Z.has(a)&&!m.prompt&&(m.prompt=d.prompt||"")),f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (stability-ai) | prompt: "${c}..."`)}let o=await fetch(`${c.baseUrl.replace(/\/$/,"")}${j}`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify(m)});if(!o.ok){let c=await o.text();return f&&f.error("IMAGE",`${b} error ${o.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:o.status,startTime:h,error:c,requestBody:m})}e=(o.headers.get("content-type")||"").includes("application/json")?await o.json():{image:Buffer.from(await o.arrayBuffer()).toString("base64")};let p=await D(e,d,f);return I({provider:b,model:a,startTime:h,requestBody:m,responseBody:{images_count:p.length},created:e.created,images:p})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:h,error:`Image provider error: ${c.message}`})}}async function u({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let h=Date.now(),i=e.apiKey||e.accessToken,j=U[a];if(!j)return{success:!1,status:400,error:`Unsupported Black Forest Labs image model: ${a}`};let{imageUrl:k,maskUrl:l}=y(d),m={prompt:d.prompt,output_format:B(d,"png")};try{if(V.has(a)&&k?m.input_image=(await z(k)).base64:k&&G(k)&&(m.image_url=k),l&&("flux-pro-1.0-fill"===a||"flux-kontext-pro"===a)&&(m.mask=(await z(l)).base64),"flux-kontext-pro"===a||"flux-kontext-max"===a)m.aspect_ratio=d.aspect_ratio||(0,g.J)(d.size);else if("string"==typeof d.size&&d.size.includes("x")){let{width:a,height:b}=A(d.size,1024);m.width=a,m.height=b}if(void 0!==d.seed&&(m.seed=d.seed),void 0!==d.n&&a.includes("ultra")&&(m.num_images=Number(d.n)||1),"hd"===d.quality&&a.includes("ultra")&&(m.raw=!0),void 0!==d.left&&(m.left=d.left),void 0!==d.right&&(m.right=d.right),void 0!==d.top&&(m.top=d.top),void 0!==d.bottom&&(m.bottom=d.bottom),void 0!==d.steps&&(m.steps=d.steps),void 0!==d.guidance&&(m.guidance=d.guidance),void 0!==d.grow_mask&&(m.grow_mask=d.grow_mask),void 0!==d.safety_tolerance&&(m.safety_tolerance=d.safety_tolerance),f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (black-forest-labs) | prompt: "${c}..."`)}let e=await fetch(`${c.baseUrl.replace(/\/$/,"")}${j}`,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json","x-key":i},body:JSON.stringify(m)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:e.status,startTime:h,error:c,requestBody:m})}let n=await e.json(),o=n.polling_url?await x({pollingUrl:n.polling_url,token:i,body:d,log:f}):n,p=await D(o,d,f);return I({provider:b,model:a,startTime:h,requestBody:m,responseBody:{images_count:p.length},created:o.created,images:p})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:h,error:`Image provider error: ${c.message}`})}}async function v({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g=Date.now(),h=e.apiKey||e.accessToken,i={model:a,prompt:d.prompt};if(void 0!==d.n&&(i.n=d.n),void 0!==d.size&&(i.size=d.size),void 0!==d.response_format&&(i.response_format=d.response_format),void 0!==d.style&&(i.style=d.style),f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (recraft) | prompt: "${c}..."`)}try{let e=await fetch(`${c.baseUrl.replace(/\/$/,"")}/v1/images/generations`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${h}`},body:JSON.stringify(i)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:e.status,startTime:g,error:c,requestBody:i})}let j=await e.json(),k=await D(j,d,f);return I({provider:b,model:a,startTime:g,requestBody:i,responseBody:{images_count:k.length},created:j.created,images:k})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:g,error:`Image provider error: ${c.message}`})}}async function w({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g=Date.now(),h=e.apiKey||e.accessToken,{imageUrl:i}=y(d);if(!i)return{success:!1,status:400,error:`Topaz model ${a} requires an input image`};try{let e=await z(i),j=new FormData,k=new Blob([e.buffer],{type:e.contentType||"image/png"});if(j.append("image",k,"image.png"),"string"==typeof d.size&&d.size.includes("x")){let{width:a,height:b}=A(d.size,1024);j.append("output_width",String(a)),j.append("output_height",String(b))}if(f){let c=String(d.prompt??"enhance image").slice(0,60);f.info("IMAGE",`${b}/${a} (topaz) | prompt: "${c}..."`)}let l=await fetch(`${c.baseUrl.replace(/\/$/,"")}/image/v1/enhance`,{method:"POST",headers:{Accept:"image/jpeg","X-API-Key":h},body:j});if(!l.ok){let c=await l.text();return f&&f.error("IMAGE",`${b} error ${l.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:l.status,startTime:g,error:c})}let m=l.headers.get("content-type")||"image/jpeg",n=Buffer.from(await l.arrayBuffer()).toString("base64"),o=["b64_json"===d.response_format?{b64_json:n,revised_prompt:d.prompt}:{url:`data:${m};base64,${n}`,revised_prompt:d.prompt}];return I({provider:b,model:a,startTime:g,responseBody:{images_count:o.length},images:o})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:g,error:`Image provider error: ${c.message}`})}}async function x({pollingUrl:a,token:b,body:c,log:d}){let e=O(c.timeout_ms,3e5),f=O(c.poll_interval_ms,1500),g=Date.now()+e;for(;Date.now()<g;){let c=await fetch(a,{method:"GET",headers:{"x-key":b}});if(!c.ok){let a=await c.text();throw Error(`BFL polling failed (${c.status}): ${a}`)}let e=await c.json(),g=e?.status;if("Ready"===g)return e;if(W.has(g))throw Error(`BFL image generation failed: ${g}`);d&&d.info("IMAGE",`black-forest-labs polling status: ${String(g||"Pending")}`),await P(f)}throw Error(`BFL polling timed out after ${e}ms`)}function y(a){let b=[],c=new Set,d=a=>{if("string"!=typeof a)return;let d=a.trim();!d||c.has(d)||(c.add(d),b.push(d))};if(d(a?.image_url),d(a?.image),Array.isArray(a?.imageUrls))for(let b of a.imageUrls)d(b);if(Array.isArray(a?.image_urls))for(let b of a.image_urls)d(b);if(Array.isArray(a?.messages)){for(let b of a.messages)if(Array.isArray(b?.content))for(let a of b.content)a?.type==="image_url"&&d(a?.image_url?.url)}return{imageUrl:b[0]||null,imageUrls:b,maskUrl:"string"==typeof a?.mask_url?a.mask_url:"string"==typeof a?.mask?a.mask:null}}async function z(a){if("string"!=typeof a||0===a.trim().length)throw Error("Invalid image source");let b=a.trim(),c=/^data:([^;]+);base64,(.+)$/i.exec(b);if(c){let[,a,b]=c;return{buffer:Buffer.from(b,"base64"),base64:b,contentType:a}}if(G(b)){let a=await (0,m.I)(b);return{buffer:a.buffer,base64:a.buffer.toString("base64"),contentType:a.contentType}}return{buffer:Buffer.from(b,"base64"),base64:b,contentType:"application/octet-stream"}}function A(a,b=1024){if("string"!=typeof a||!a.includes("x"))return{width:b,height:b};let[c,d]=a.split("x"),e=Number(c),f=Number(d);return{width:Number.isFinite(e)&&e>0?e:b,height:Number.isFinite(f)&&f>0?f:b}}function B(a,b="png",c=["jpeg","png","webp"]){let d="string"==typeof a?.output_format?a.output_format.toLowerCase():"string"!=typeof a?.response_format||["url","b64_json"].includes(a.response_format.toLowerCase())?b:a.response_format.toLowerCase();return c.includes(d)?d:b}function C(a,b="square_hd"){if("string"!=typeof a)return b;if($[a])return $[a];if(a.includes("x")){let{width:b,height:c}=A(a,1024);return{width:b,height:c}}return b}async function D(a,b,c){let d=[],e=a=>{null!=a&&d.push(a)};if(Array.isArray(a?.data))for(let b of a.data)e(b);if(Array.isArray(a?.images))for(let b of a.images)e(b);if(a?.image&&e({b64_json:a.image}),a?.url&&e({url:a.url}),a?.sample&&e({url:a.sample}),a?.result?.sample&&e({url:a.result.sample}),Array.isArray(a?.result?.images))for(let b of a.result.images)e(b);let f=[];for(let a of d){let c=await E(a,b);c&&f.push(c)}return 0===f.length&&c&&c.warn("IMAGE",`Provider returned no recognizable image payload: ${JSON.stringify(a).slice(0,240)}`),f}async function E(a,b){let c=b?.response_format==="b64_json",d=null,e=null;if("string"==typeof a){let b=/^data:[^;]+;base64,(.+)$/i.exec(a);b?e=b[1]:G(a)?d=a:e=a}else a&&"object"==typeof a&&(d=F(a.url,a.image_url,a.sample,a.file_url)||null,e=F(a.b64_json,a.image,a.base64,a.data)||null);return(c&&!e&&d&&(e=(await z(d)).base64),d&&!c)?{url:d,revised_prompt:b?.prompt}:e?{b64_json:e,revised_prompt:b?.prompt}:d?{url:d,revised_prompt:b?.prompt}:null}function F(...a){for(let b of a)if("string"==typeof b&&b.length>0)return b;return null}function G(a){return"string"==typeof a&&/^https?:\/\//i.test(a)}async function H({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g,i=Date.now(),j="string"==typeof d.prompt?d.prompt:"";if(!j.trim())return J({provider:b,model:a,status:400,startTime:i,error:"Prompt is required for Codex image generation"});let k=Number.isInteger(d.n)&&d.n>0?d.n:1;f&&k>1&&f.warn("IMAGE",`Codex hosted image_generation returns one image per call; requested n=${k} will run sequentially`);let l=e?.accessToken||e?.apiKey;if(!l)return J({provider:b,model:a,status:401,startTime:i,error:"Codex credentials missing accessToken — reconnect the Codex provider"});let m=e?.providerSpecificData&&"object"==typeof e.providerSpecificData&&!Array.isArray(e.providerSpecificData)?e.providerSpecificData.workspaceId:void 0,n={type:"image_generation",output_format:"png"};"string"==typeof d.size&&d.size.trim()&&(n.size=d.size.trim()),"string"==typeof d.quality&&d.quality.trim()&&(g=d.quality.trim().toLowerCase(),n.quality="standard"===g?"medium":"hd"===g?"high":g);let o={model:a,instructions:"You must call the image_generation tool exactly once to fulfill the user's request. Do not add narration.",input:[{role:"user",content:[{type:"input_text",text:j}]}],tools:[n],stream:!0,store:!1},p={"Content-Type":"application/json",Accept:"text/event-stream",Authorization:`Bearer ${l}`,Version:(0,h.zq)(),"User-Agent":(0,h.EQ)(),originator:"codex_cli_rs"};"string"==typeof m&&m&&(p["chatgpt-account-id"]=m,p.session_id=m),f&&f.info("IMAGE",`${b}/${a} (codex-responses) | prompt: "${j.slice(0,60)}..."`);let q=[];for(let d=0;d<k;d++){let d;try{d=await fetch(c.baseUrl,{method:"POST",headers:p,body:JSON.stringify(o)})}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),J({provider:b,model:a,status:502,startTime:i,error:`Image provider error: ${c.message}`,requestBody:o})}if(!d.ok){let c=await d.text();return f&&f.error("IMAGE",`${b} error ${d.status}: ${c.slice(0,200)}`),J({provider:b,model:a,status:d.status,startTime:i,error:c,requestBody:o})}let e=await d.text(),g=function(a){let b=[];for(let c of String(a||"").split("\n")){let a,d=c.trim();if(!d.startsWith("data:"))continue;let e=d.slice(5).trim();if(!e||"[DONE]"===e)continue;try{a=JSON.parse(e)}catch{continue}if(a?.type!=="response.output_item.done")continue;let f=a.item;if(!f||"image_generation_call"!==f.type)continue;let g="string"==typeof f.result?f.result:"";if(!g)continue;let h="string"==typeof f.revised_prompt?f.revised_prompt:null;b.push({b64:g,revisedPrompt:h})}return b}(e);if(0===g.length)return J({provider:b,model:a,status:502,startTime:i,error:"Codex completed without producing an image_generation_call — the model may have declined the tool",requestBody:o});for(let a of g)q.push({b64_json:a.b64,...a.revisedPrompt?{revised_prompt:a.revisedPrompt}:{}})}let r="b64_json"!==d.response_format?q.map(a=>({url:`data:image/png;base64,${a.b64_json}`,...a.revised_prompt?{revised_prompt:a.revised_prompt}:{}})):q;return I({provider:b,model:a,startTime:i,requestBody:o,responseBody:{images_count:r.length},images:r})}function I({provider:a,model:b,startTime:c,requestBody:d=null,responseBody:e=null,created:f=null,images:g}){return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${a}/${b}`,provider:a,duration:Date.now()-c,requestBody:d,responseBody:e}).catch(()=>{}),{success:!0,data:{created:f||Math.floor(Date.now()/1e3),data:g}}}function J({provider:a,model:b,status:c,startTime:d,error:e,requestBody:f=null}){return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:c,model:`${a}/${b}`,provider:a,duration:Date.now()-d,error:"string"==typeof e?e.slice(0,500):String(e).slice(0,500),requestBody:f}).catch(()=>{}),{success:!1,status:c,error:e}}async function K(a,b,c,d,e){try{let f=await fetch(a,{method:"POST",headers:b,body:c});if(!f.ok){let a=await f.text();return e&&e.error("IMAGE",`${d} error ${f.status}: ${a.slice(0,200)}`),{success:!1,status:f.status,error:a}}let g=await f.json();return{success:!0,data:{created:g.created||Math.floor(Date.now()/1e3),data:g.data||[]}}}catch(a){return e&&e.error("IMAGE",`${d} fetch error: ${a.message}`),{success:!1,status:502,error:`Image provider error: ${a.message}`}}}async function L({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let g=Date.now(),h=e.apiKey||e.accessToken,[i,j]=(d.size||"1024x1024").split("x").map(Number),l={model_name:a,prompt:d.prompt,height:j||1024,width:i||1024,backend:"auto"};if(f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (hyperbolic) | prompt: "${c}..."`)}try{let e=await fetch(c.baseUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${h}`},body:JSON.stringify(l)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:e.status,model:`${b}/${a}`,provider:b,duration:Date.now()-g,error:c.slice(0,500)}).catch(()=>{}),{success:!1,status:e.status,error:c}}let i=((await e.json()).images||[]).map(a=>({b64_json:a.image,revised_prompt:d.prompt}));return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-g,responseBody:{images_count:i.length}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:i}}}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-g,error:c.message}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c.message}`}}}async function M({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let h=Date.now(),i=e.apiKey||e.accessToken,j="nanobanana-pro"===a,l=j&&c.proUrl?c.proUrl:c.baseUrl,m=c.statusUrl,n="string"==typeof d.aspectRatio?d.aspectRatio:"string"==typeof d.aspect_ratio?d.aspect_ratio:(0,g.J)(d.size),o="string"==typeof d.resolution?d.resolution:function(a){if("string"!=typeof a)return null;let[b,c]=a.split("x"),d=Number(b),e=Number(c);if(!Number.isFinite(d)||!Number.isFinite(e)||d<=0||e<=0)return null;let f=Math.max(d,e);return f<=1024?"1K":f<=2048?"2K":"4K"}(d.size)||"1K";"hd"===d.quality&&"1K"===o&&(o="2K");let p=j?{prompt:d.prompt,resolution:o,aspectRatio:n,...Array.isArray(d.imageUrls)?{imageUrls:d.imageUrls}:{}}:{prompt:d.prompt,type:Array.isArray(d.imageUrls)&&d.imageUrls.length>0?"IMAGETOIAMGE":"TEXTTOIAMGE",numImages:Number.isFinite(d.n)?Math.max(1,Number(d.n)):1,image_size:n,...Array.isArray(d.imageUrls)?{imageUrls:d.imageUrls}:{}};if(f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (nanobanana ${j?"pro":"flash"}) | prompt: "${c}..."`)}try{let c=await fetch(l,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify(p)});if(!c.ok){let d=await c.text();return f&&f.error("IMAGE",`${b} submit error ${c.status}: ${d.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:c.status,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:d.slice(0,500)}).catch(()=>{}),{success:!1,status:c.status,error:d}}let e=await c.json();if(e?.image||Array.isArray(e?.images)||Array.isArray(e?.data)||e?.data?.[0]?.url||e?.data?.[0]?.b64_json){let c=function(a,b){let c=[];if(a.image)c.push({b64_json:a.image,revised_prompt:b});else if(Array.isArray(a.images))for(let d of a.images)c.push({b64_json:"string"==typeof d?d:d?.image||d?.data,revised_prompt:b});else if(Array.isArray(a.data))for(let b of a.data)b&&c.push(b);return{data:c.filter(Boolean)}}(e,d.prompt);return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-h,responseBody:{images_count:c.data?.length||0,mode:"sync"}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:c.data}}}let g=e?.data?.taskId||e?.taskId;if(!g){let c=`NanoBanana submit did not return taskId: ${JSON.stringify(e).slice(0,400)}`;return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c}).catch(()=>{}),{success:!1,status:502,error:c}}if(!m){let c="NanoBanana statusUrl is not configured";return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:500,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c}).catch(()=>{}),{success:!1,status:500,error:c}}let j=O(d.timeout_ms,O(process.env.NANOBANANA_POLL_TIMEOUT_MS,12e4)),n=O(d.poll_interval_ms,O(process.env.NANOBANANA_POLL_INTERVAL_MS,2500)),o=null,q=Date.now()+j;for(;Date.now()<q;){let c=await fetch(`${m}?taskId=${encodeURIComponent(g)}`,{method:"GET",headers:{Authorization:`Bearer ${i}`}});if(!c.ok){let a=await c.text();return f&&f.error("IMAGE",`${b} poll error ${c.status}: ${a.slice(0,200)}`),{success:!1,status:c.status,error:a}}let e=await c.json(),j=e?.data||e;o=j;let l=Number(j?.successFlag);if(1===l){let c=await N(j,d,f);return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-h,responseBody:{images_count:c.length,mode:"async",taskId:g}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:c}}}if(2===l||3===l){let c=j?.errorMessage||`NanoBanana task failed (successFlag=${String(l)})`;return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c.slice(0,500),responseBody:{taskId:g,successFlag:l,errorCode:j?.errorCode??null}}).catch(()=>{}),{success:!1,status:502,error:c}}await P(n)}let r=`NanoBanana task timeout after ${j}ms (taskId=${g}, successFlag=${String(o?.successFlag??"unknown")})`;return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:504,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:r,responseBody:{taskId:g,lastSuccessFlag:o?.successFlag??null}}).catch(()=>{}),{success:!1,status:504,error:r}}catch(c){return f&&f.error("IMAGE",`${b} fetch error: ${c.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c.message}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c.message}`}}}async function N(a,b,c){let d=a?.response||{},e=[d?.resultImageUrl,d?.originImageUrl,a?.resultImageUrl,a?.originImageUrl].filter(a=>"string"==typeof a&&a.length>0);if(Array.isArray(d?.resultImageUrls))for(let a of d.resultImageUrls)"string"==typeof a&&a.length>0&&e.push(a);let f=[d?.resultImageBase64,d?.resultImage,a?.resultImageBase64,a?.resultImage].filter(a=>"string"==typeof a&&a.length>0);if(Array.isArray(d?.resultImageBase64List))for(let a of d.resultImageBase64List)"string"==typeof a&&a.length>0&&f.push(a);if("b64_json"===b.response_format){if(f.length>0)return f.map(a=>({b64_json:a,revised_prompt:b.prompt}));if(e.length>0){let a=e[0];return[{b64_json:(await (0,m.I)(a)).buffer.toString("base64"),revised_prompt:b.prompt}]}}return e.length>0?e.map(a=>({url:a,revised_prompt:b.prompt})):f.length>0?f.map(a=>({b64_json:a,revised_prompt:b.prompt})):(c&&c.warn("IMAGE",`NanoBanana task completed without image payload: ${JSON.stringify(a).slice(0,240)}`),[])}function O(a,b){let c=Number(a);return!Number.isFinite(c)||c<=0?b:Math.floor(c)}function P(a){return new Promise(b=>setTimeout(b,a))}async function Q({model:a,provider:b,providerConfig:c,body:d,log:e}){let f=Date.now(),[g,h]=(d.size||"512x512").split("x").map(Number),i={prompt:d.prompt,negative_prompt:d.negative_prompt||"",width:g||512,height:h||512,steps:d.steps||20,cfg_scale:d.cfg_scale||7,sampler_name:d.sampler||"Euler a",batch_size:d.n||1,override_settings:{sd_model_checkpoint:a}};if(e){let c=String(d.prompt??"").slice(0,60);e.info("IMAGE",`${b}/${a} (sdwebui) | prompt: "${c}..."`)}try{let g=await fetch(c.baseUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!g.ok){let c=await g.text();return e&&e.error("IMAGE",`${b} error ${g.status}: ${c.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:g.status,model:`${b}/${a}`,provider:b,duration:Date.now()-f,error:c.slice(0,500)}).catch(()=>{}),{success:!1,status:g.status,error:c}}let h=((await g.json()).images||[]).map(a=>({b64_json:a,revised_prompt:d.prompt}));return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-f,responseBody:{images_count:h.length}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:h}}}catch(c){return e&&e.error("IMAGE",`${b} sdwebui error: ${c.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-f,error:c.message}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c.message}`}}}async function R({model:a,provider:b,providerConfig:c,body:d,log:f}){let g=Date.now(),[h,i]=(d.size||"1024x1024").split("x").map(Number),j={3:{class_type:"KSampler",inputs:{seed:parseInt((0,e.randomUUID)().replace(/-/g,"").substring(0,8),16)%0x100000000,steps:d.steps||20,cfg:d.cfg_scale||7,sampler_name:"euler",scheduler:"normal",denoise:1,model:["4",0],positive:["6",0],negative:["7",0],latent_image:["5",0]}},4:{class_type:"CheckpointLoaderSimple",inputs:{ckpt_name:a}},5:{class_type:"EmptyLatentImage",inputs:{width:h||1024,height:i||1024,batch_size:d.n||1}},6:{class_type:"CLIPTextEncode",inputs:{text:d.prompt,clip:["4",1]}},7:{class_type:"CLIPTextEncode",inputs:{text:d.negative_prompt||"",clip:["4",1]}},8:{class_type:"VAEDecode",inputs:{samples:["3",0],vae:["4",2]}},9:{class_type:"SaveImage",inputs:{filename_prefix:"omniroute",images:["8",0]}}};if(f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (comfyui) | prompt: "${c}..."`)}try{let e=await (0,l.ep)(c.baseUrl,j),f=await (0,l.VA)(c.baseUrl,e),h=(0,l.AC)(f),i=[];for(let a of h){let b=await (0,l.Uh)(c.baseUrl,a.filename,a.subfolder,a.type),e=Buffer.from(b).toString("base64");i.push({b64_json:e,revised_prompt:d.prompt})}return(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-g,responseBody:{images_count:i.length}}).catch(()=>{}),{success:!0,data:{created:Math.floor(Date.now()/1e3),data:i}}}catch(c){return f&&f.error("IMAGE",`${b} comfyui error: ${c.message}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-g,error:c.message}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c.message}`}}}async function S({model:a,provider:b,providerConfig:c,body:d,credentials:e,log:f}){let h=Date.now(),i=e.apiKey||e.accessToken,j=(0,g.J)(d.size),l={prompt:d.prompt,aspect_ratio:j,number_of_images:d.n??1};if(f){let c=String(d.prompt??"").slice(0,60);f.info("IMAGE",`${b}/${a} (imagen3) | prompt: "${c}..." | aspect_ratio: ${j}`)}try{let e=await fetch(c.baseUrl,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${i}`},body:JSON.stringify(l)});if(!e.ok){let c=await e.text();return f&&f.error("IMAGE",`${b} error ${e.status}: ${c.slice(0,200)}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:e.status,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c.slice(0,500),requestBody:l}).catch(()=>{}),{success:!1,status:e.status,error:c}}let g=await e.json(),j=[];return Array.isArray(g.images)?j.push(...g.images.map(a=>({b64_json:a.image??a.b64_json??a.url??a,revised_prompt:d.prompt}))):Array.isArray(g.data)?j.push(...g.data):(g.url||g.b64_json||g.image)&&j.push({b64_json:g.image||g.b64_json||g.url,url:g.url,revised_prompt:d.prompt}),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:200,model:`${b}/${a}`,provider:b,duration:Date.now()-h,responseBody:{images_count:j.length}}).catch(()=>{}),{success:!0,data:{created:g.created||Math.floor(Date.now()/1e3),data:j}}}catch(d){let c=d instanceof Error?d.message:String(d);return f&&f.error("IMAGE",`${b} fetch error: ${c}`),(0,k.gK)({method:"POST",path:"/v1/images/generations",status:502,model:`${b}/${a}`,provider:b,duration:Date.now()-h,error:c}).catch(()=>{}),{success:!1,status:502,error:`Image provider error: ${c}`}}}d()}catch(a){d(a)}})},99465:(a,b,c)=>{function d(a){return a&&"object"==typeof a&&!Array.isArray(a)?a:{}}async function e(a,b){let c=await fetch(`${a}/prompt`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({prompt:b})});if(!c.ok){let a=await c.text();throw Error(`ComfyUI submit failed (${c.status}): ${a}`)}let e=d(await c.json()).prompt_id;if("string"!=typeof e||!e)throw Error("ComfyUI submit failed: missing prompt_id");return e}async function f(a,b,c=12e4){let e=Date.now();for(;Date.now()-e<c;){await new Promise(a=>setTimeout(a,2e3));let c=await fetch(`${a}/history/${b}`);if(!c.ok)continue;let e=d(await c.json()),f=d(e[b]);if(f&&f.outputs&&Object.keys(f.outputs).length>0)return f}throw Error(`ComfyUI prompt ${b} timed out after ${c}ms`)}async function g(a,b,c,d){let e=new URL(`${a}/view`);e.searchParams.set("filename",b),e.searchParams.set("subfolder",c),e.searchParams.set("type",d);let f=await fetch(e.toString());if(!f.ok)throw Error(`ComfyUI fetch output failed (${f.status})`);return f.arrayBuffer()}function h(a){let b=[];for(let c of Object.values(a.outputs||{}))for(let a of c.images||c.gifs||c.audio||[])b.push({filename:a.filename,subfolder:a.subfolder||"",type:a.type||"output"});return b}c.d(b,{AC:()=>h,Uh:()=>g,VA:()=>f,ep:()=>e})}};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";exports.id=36040,exports.ids=[36040],exports.modules={30417:(a,b,c)=>{c.d(b,{$:()=>d});let d={"Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, PATCH, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, x-api-key, anthropic-version, x-omniroute-connection, x-internal-test, accept"}},31488:(a,b,c)=>{c.d(b,{Gp:()=>j,IZ:()=>i,g8:()=>e});var d=c(56757);let e={AUTO:"auto",PASSTHROUGH:"passthrough",CUSTOM:"custom",ADAPTIVE:"adaptive"},f={none:0,low:1024,medium:10240,high:131072,max:131072,xhigh:131072},g={none:0,low:4096,medium:8192,high:24576,max:131072,xhigh:131072},h={...{mode:e.PASSTHROUGH,customBudget:10240,effortLevel:"medium"}};function i(){return{...h}}function j(a,b=null){let c=b||h;if(!a||"object"!=typeof a)return a;let i="string"==typeof a.model?a.model:"";if(i&&!(0,d.t5)(i))return k(a);let m=function(a){if(!a||"object"!=typeof a)return a;let b={...a},c=b.thinkingLevel||b.thinking_level;if("string"==typeof c&&void 0!==g[c.toLowerCase()]){let a=g[c.toLowerCase()],e=(0,d.kG)(b.model||"",a);b.thinking={type:e>0?"enabled":"disabled",budget_tokens:e},delete b.thinkingLevel,delete b.thinking_level}let e=b.generationConfig?.thinkingConfig?.thinkingLevel||b.generationConfig?.thinking_config?.thinkingLevel;if("string"==typeof e&&void 0!==g[e.toLowerCase()]){let a=g[e.toLowerCase()],c=(0,d.kG)(b.model||"",a);b.generationConfig={...b.generationConfig,thinkingConfig:{...b.generationConfig.thinkingConfig,thinkingBudget:c}},b.generationConfig.thinkingConfig&&delete b.generationConfig.thinkingConfig.thinkingLevel,b.generationConfig.thinking_config&&delete b.generationConfig.thinking_config}return b}(a);switch(m=function(a){if(!a||"object"!=typeof a)return a;let b=a.model||"";if(!b.endsWith("-thinking")||a.thinking)return a;let c={...a};return c.thinking={type:"enabled",budget_tokens:(0,d.d)(b)||f.medium},c}(m),c.mode){case e.AUTO:return k(m);case e.PASSTHROUGH:return m;case e.CUSTOM:return l(m,c.customBudget);case e.ADAPTIVE:return function(a,b){let c=a.messages||a.input||[],e=c.length,g=(a.tools||[]).length,h=0;for(let a=c.length-1;a>=0;a--){let b=c[a];if("user"===b.role){h="string"==typeof b.content?b.content.length:JSON.stringify(b.content||"").length;break}}let i=1;e>10&&(i+=.5),g>3&&(i+=.5),h>2e3&&(i+=.3);let j=f[b.effortLevel]||(0,d.d)(a.model||"")||f.medium,k=(0,d.kG)(a.model||"",Math.ceil(j*i));return l(a,k)}(m,c);default:return m}}function k(a){let b={...a};return delete b.thinking,delete b.reasoning_effort,delete b.reasoning,b.generationConfig&&(b.generationConfig={...b.generationConfig},delete b.generationConfig.thinking_config,delete b.generationConfig.thinkingConfig),b}function l(a,b){let c,e,f={...a};return(f.thinking||(c=f.model||"",!0===(e=(0,d.w8)(c)).supportsThinking||!1!==e.supportsThinking&&(c.includes("claude")||c.includes("o1")||c.includes("o3")||c.includes("o4")||c.includes("gemini")||c.endsWith("-thinking")||c.includes("thinking"))))&&(f.thinking={type:b>0?"enabled":"disabled",budget_tokens:b}),(void 0!==f.reasoning_effort||void 0!==f.reasoning)&&(b<=0?(delete f.reasoning_effort,delete f.reasoning):b<=1024?f.reasoning_effort="low":b<=10240?f.reasoning_effort="medium":b<131072?f.reasoning_effort="high":f.reasoning_effort="max"),(f.generationConfig?.thinking_config||f.generationConfig?.thinkingConfig)&&(f.generationConfig={...f.generationConfig,thinking_config:{thinking_budget:b}}),f}},34410:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{RU:()=>g,rs:()=>h,wG:()=>i,wb:()=>s});var e=c(43712),f=a([e]);e=(f.then?(await f)():f)[0];let j={qoder:{id:"qoder",alias:"if",name:"Qoder AI",icon:"water_drop",color:"#6366F1"},qwen:{id:"qwen",alias:"qw",name:"Qwen Code",icon:"psychology",color:"#10B981",deprecated:!0,deprecationReason:"Qwen OAuth free tier was discontinued on 2026-04-15. Use 'alicode', 'alicode-intl', or 'openrouter' provider with API key instead."},"gemini-cli":{id:"gemini-cli",alias:"gemini-cli",name:"Gemini CLI",icon:"terminal",color:"#4285F4",deprecated:!0,deprecationReason:"Google restricts third-party OAuth usage for Gemini CLI (Mar 2026). Pro models require paid plans. Use 'gemini' (API key) provider instead."},kiro:{id:"kiro",alias:"kr",name:"Kiro AI",icon:"psychology_alt",color:"#FF6B35"},"amazon-q":{id:"amazon-q",alias:"aq",name:"Amazon Q",icon:"cloud",color:"#FF9900",textIcon:"AQ",website:"https://aws.amazon.com/q/developer/",authHint:"Uses the same AWS Builder ID or imported refresh-token flow as Kiro, but keeps Amazon Q connections separate."}},k={claude:{id:"claude",alias:"cc",name:"Claude Code",icon:"smart_toy",color:"#D97757"},antigravity:{id:"antigravity",alias:void 0,name:"Antigravity",icon:"rocket_launch",color:"#F59E0B"},codex:{id:"codex",alias:"cx",name:"OpenAI Codex",icon:"code",color:"#3B82F6"},github:{id:"github",alias:"gh",name:"GitHub Copilot",icon:"code",color:"#333333"},"gitlab-duo":{id:"gitlab-duo",alias:"gitlab-duo",name:"GitLab Duo",icon:"hub",color:"#FC6D26",textIcon:"GL",website:"https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/",authHint:"OAuth application with ai_features + read_user scopes. Configure GITLAB_DUO_OAUTH_CLIENT_ID and optionally GITLAB_DUO_OAUTH_CLIENT_SECRET on this OmniRoute instance."},cursor:{id:"cursor",alias:"cu",name:"Cursor IDE",icon:"edit_note",color:"#00D4AA"},"kimi-coding":{id:"kimi-coding",alias:"kmc",name:"Kimi Coding",icon:"psychology",color:"#1E40AF",textIcon:"KC"},kilocode:{id:"kilocode",alias:"kc",name:"Kilo Code",icon:"code",color:"#FF6B35",textIcon:"KC"},cline:{id:"cline",alias:"cl",name:"Cline",icon:"smart_toy",color:"#5B9BD5",textIcon:"CL"}},l={"chatgpt-web":{id:"chatgpt-web",alias:"cgpt-web",name:"ChatGPT Web (Plus/Pro)",icon:"auto_awesome",color:"#10A37F",textIcon:"CG",website:"https://chatgpt.com",authHint:"Paste your __Secure-next-auth.session-token cookie value from chatgpt.com"},"grok-web":{id:"grok-web",alias:"gw",name:"Grok Web (Subscription)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"GW",website:"https://grok.com",authHint:"Paste your sso= cookie value from grok.com"},"perplexity-web":{id:"perplexity-web",alias:"pplx-web",name:"Perplexity Web (Pro/Max)",icon:"search",color:"#20808D",textIcon:"PW",website:"https://www.perplexity.ai",authHint:"Paste your __Secure-next-auth.session-token cookie value from perplexity.ai"},"blackbox-web":{id:"blackbox-web",alias:"bb-web",name:"Blackbox Web (Subscription)",icon:"view_in_ar",color:"#1A1A2E",textIcon:"BW",website:"https://app.blackbox.ai",authHint:"Paste your __Secure-authjs.session-token value or full cookie header from app.blackbox.ai"},"muse-spark-web":{id:"muse-spark-web",alias:"ms-web",name:"Muse Spark Web (Meta AI)",icon:"auto_awesome",color:"#0866FF",textIcon:"MS",website:"https://www.meta.ai",authHint:"Paste your abra_sess value or full cookie header from meta.ai"}},m={agentrouter:{id:"agentrouter",alias:"agentrouter",name:"AgentRouter",icon:"router",color:"#10B981",textIcon:"AR",passthroughModels:!0,website:"https://agentrouter.org",apiHint:"Get $200 free credits at https://agentrouter.org/register — no credit card required."},openrouter:{id:"openrouter",alias:"openrouter",name:"OpenRouter",icon:"router",color:"#F97316",textIcon:"OR",passthroughModels:!0,website:"https://openrouter.ai"},qianfan:{id:"qianfan",alias:"qianfan",name:"Baidu Qianfan",icon:"cloud",color:"#2468F2",textIcon:"BD",website:"https://cloud.baidu.com/product/wenxinworkshop",passthroughModels:!0,apiHint:"Use a Qianfan API key from Baidu AI Cloud. The default endpoint is OpenAI-compatible v2."},glm:{id:"glm",alias:"glm",name:"GLM Coding",icon:"code",color:"#2563EB",textIcon:"GL",website:"https://open.bigmodel.cn"},"glm-cn":{id:"glm-cn",alias:"glmcn",name:"GLM Coding (China)",icon:"code",color:"#DC2626",textIcon:"GC",website:"https://open.bigmodel.cn"},glmt:{id:"glmt",alias:"glmt",name:"GLM Thinking",icon:"psychology",color:"#1D4ED8",textIcon:"GT",website:"https://open.bigmodel.cn",apiHint:"Preset GLM profile with higher token budget, thinking enabled, and longer timeout."},"bailian-coding-plan":{id:"bailian-coding-plan",alias:"bcp",name:"Alibaba Coding Plan",icon:"code",color:"#FF6A00",textIcon:"BCP",website:"https://www.alibabacloud.com/help/en/model-studio/coding-plan"},kimi:{id:"kimi",alias:"kimi",name:"Kimi",icon:"psychology",color:"#1E3A8A",textIcon:"KM",website:"https://kimi.moonshot.cn"},"kimi-coding-apikey":{id:"kimi-coding-apikey",alias:"kmca",name:"Kimi Coding (API Key)",icon:"psychology",color:"#1E40AF",textIcon:"KC",website:"https://kimi.com"},minimax:{id:"minimax",alias:"minimax",name:"Minimax Coding",icon:"memory",color:"#7C3AED",textIcon:"MM",website:"https://www.minimaxi.com"},"minimax-cn":{id:"minimax-cn",alias:"minimax-cn",name:"Minimax (China)",icon:"memory",color:"#DC2626",textIcon:"MC",website:"https://www.minimaxi.com"},crof:{id:"crof",alias:"crof",name:"CrofAI",icon:"auto_awesome",color:"#0EA5E9",textIcon:"CR",website:"https://crof.ai"},alicode:{id:"alicode",alias:"alicode",name:"Alibaba",icon:"cloud",color:"#FF6A00",textIcon:"ALi",website:"https://bailian.console.aliyun.com"},"alicode-intl":{id:"alicode-intl",alias:"alicode-intl",name:"Alibaba Intl",icon:"cloud",color:"#FF6A00",textIcon:"ALi",website:"https://modelstudio.console.alibabacloud.com"},openai:{id:"openai",alias:"openai",name:"OpenAI",icon:"auto_awesome",color:"#10A37F",textIcon:"OA",website:"https://platform.openai.com"},"azure-openai":{id:"azure-openai",alias:"azure",name:"Azure OpenAI",icon:"cloud",color:"#0078D4",textIcon:"AZ",website:"https://azure.microsoft.com/products/ai-services/openai-service",authHint:"Use your Azure OpenAI API key. Base URL should be your resource endpoint, for example https://my-resource.openai.azure.com.",passthroughModels:!0},"azure-ai":{id:"azure-ai",alias:"azure-ai",name:"Azure AI Foundry",icon:"cloud",color:"#2563EB",textIcon:"AF",website:"https://learn.microsoft.com/azure/ai-foundry/",authHint:"Use your Azure AI Foundry key. Base URL can be https://<resource>.services.ai.azure.com/openai/v1/ or https://<resource>.openai.azure.com/openai/v1/.",apiHint:"Foundry uses the OpenAI v1 surface with deployment names as models. OmniRoute normalizes root resource URLs to the v1 chat and /models endpoints.",passthroughModels:!0},bedrock:{id:"bedrock",alias:"bedrock",name:"Amazon Bedrock",icon:"cloud",color:"#FF9900",textIcon:"BR",website:"https://aws.amazon.com/bedrock/",authHint:"Use your Amazon Bedrock API key in Authorization: Bearer <key>. OmniRoute defaults to the OpenAI-compatible bedrock-mantle endpoint in us-east-1; set a regional base URL if your account uses another region or the bedrock-runtime /openai/v1 path.",apiHint:"This integration targets Amazon Bedrock's current OpenAI-compatible surface. bedrock-mantle is the default for /models and chat; advanced users can also point baseUrl to bedrock-runtime/.../openai/v1 for runtime-specific model IDs.",passthroughModels:!0},watsonx:{id:"watsonx",alias:"watsonx",name:"IBM watsonx.ai Gateway",icon:"hub",color:"#0F62FE",textIcon:"WX",website:"https://www.ibm.com/products/watsonx-ai",authHint:"Use your watsonx bearer token. Base URL can be https://<region>.ml.cloud.ibm.com/ml/gateway/v1/ or a self-managed /ml/gateway/v1 endpoint.",apiHint:"The watsonx model gateway exposes OpenAI-compatible /chat/completions and /models under /ml/gateway/v1.",passthroughModels:!0},oci:{id:"oci",alias:"oci",name:"OCI Generative AI",icon:"cloud",color:"#C74634",textIcon:"OCI",website:"https://www.oracle.com/artificial-intelligence/generative-ai/",authHint:"Use your OCI Generative AI API key or IAM bearer token. Base URL can be https://inference.generativeai.<region>.oci.oraclecloud.com/openai/v1/.",apiHint:"OCI exposes OpenAI-compatible chat and responses endpoints. Project ID is optional in OmniRoute but may be required for Responses and agentic workflows.",passthroughModels:!0},sap:{id:"sap",alias:"sap",name:"SAP Generative AI Hub",icon:"business",color:"#0FAAFF",textIcon:"SAP",website:"https://help.sap.com/docs/sap-ai-core/sap-ai-core-service-guide/generative-ai-hub-in-sap-ai-core",authHint:"Use your SAP AI Core bearer token. Base URL can be your AI_API_URL root or a deploymentUrl from Generative AI Hub.",apiHint:"Model discovery uses /v2/lm/scenarios/foundation-models/models on AI_API_URL. Chat requests use deploymentUrl/chat/completions and require AI-Resource-Group.",passthroughModels:!0},modal:{id:"modal",alias:"mdl",name:"Modal",icon:"cloud_queue",color:"#7C3AED",textIcon:"MDL",website:"https://modal.com/docs",authHint:"Use the bearer token that protects your Modal deployment, if enabled. Base URL should point to your OpenAI-compatible Modal app, for example https://<workspace>--<app>.modal.run/v1.",apiHint:"Modal commonly serves user-hosted OpenAI-compatible apps on /v1. OmniRoute will probe /v1/models and route chat traffic to /v1/chat/completions.",hasFree:!0,freeNote:"$30/month free credits for new accounts",passthroughModels:!0},reka:{id:"reka",alias:"reka",name:"Reka",icon:"auto_awesome",color:"#111827",textIcon:"RK",website:"https://docs.reka.ai/chat/overview",authHint:"Use your Reka API key. OmniRoute supports the OpenAI-compatible base URL https://api.reka.ai/v1 and sends both Authorization and X-Api-Key headers for compatibility.",apiHint:"Reka Chat is OpenAI-compatible on /v1. OmniRoute probes /v1/models and routes chat traffic to /v1/chat/completions.",passthroughModels:!0},nlpcloud:{id:"nlpcloud",alias:"nlpc",name:"NLP Cloud",icon:"psychology",color:"#2196F3",textIcon:"NLPC",website:"https://docs.nlpcloud.com",authHint:"Use your NLP Cloud API key in Authorization: Token <key>. OmniRoute targets the chatbot endpoint on https://api.nlpcloud.io/v1/gpu/<model>/chatbot by default.",apiHint:"NLP Cloud uses a proprietary chatbot API instead of OpenAI chat/completions. OmniRoute adapts OpenAI messages to input/context/history and exposes a local catalog of supported chatbot models.",hasFree:!0,freeNote:"Trial credits for new accounts"},runwayml:{id:"runwayml",alias:"runway",name:"Runway",icon:"movie",color:"#111827",textIcon:"RW",website:"https://docs.dev.runwayml.com",authHint:"Use your Runway API key in Authorization: Bearer <key>. OmniRoute targets the current Runway API at https://api.dev.runwayml.com/v1 and sends the required X-Runway-Version header automatically.",apiHint:"Runway video generation is task-based. OmniRoute submits text-to-video or image-to-video jobs, polls /v1/tasks/{id}, and normalizes the finished video outputs back into the OpenAI-like /v1/videos/generations response."},anthropic:{id:"anthropic",alias:"anthropic",name:"Anthropic",icon:"smart_toy",color:"#D97757",textIcon:"AN",website:"https://console.anthropic.com"},gemini:{id:"gemini",alias:"gemini",name:"Gemini (Google AI Studio)",icon:"diamond",color:"#4285F4",textIcon:"GE",website:"https://ai.google.dev",hasFree:!0,freeNote:"Free forever: 1,500 req/day for Gemini 2.5 Flash — no credit card, get key at aistudio.google.com"},deepseek:{id:"deepseek",alias:"ds",name:"DeepSeek",icon:"bolt",color:"#4D6BFE",textIcon:"DS",website:"https://deepseek.com"},groq:{id:"groq",alias:"groq",name:"Groq",icon:"speed",color:"#F55036",textIcon:"GQ",website:"https://groq.com",hasFree:!0,freeNote:"Free tier: 30 RPM / 14.4K RPD — no credit card"},blackbox:{id:"blackbox",alias:"bb",name:"Blackbox AI",icon:"view_in_ar",color:"#1A1A2E",textIcon:"BB",website:"https://blackbox.ai"},xai:{id:"xai",alias:"xai",name:"xAI (Grok)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"XA",website:"https://x.ai"},mistral:{id:"mistral",alias:"mistral",name:"Mistral",icon:"air",color:"#FF7000",textIcon:"MI",website:"https://mistral.ai"},perplexity:{id:"perplexity",alias:"pplx",name:"Perplexity",icon:"search",color:"#20808D",textIcon:"PP",website:"https://www.perplexity.ai"},together:{id:"together",alias:"together",name:"Together AI",icon:"group_work",color:"#0F6FFF",textIcon:"TG",website:"https://www.together.ai",hasFree:!0,freeNote:"$25 signup credits + 3 permanently free models: Llama 3.3 70B, Vision, DeepSeek-R1 distill"},fireworks:{id:"fireworks",alias:"fireworks",name:"Fireworks AI",icon:"local_fire_department",color:"#7B2EF2",textIcon:"FW",website:"https://fireworks.ai"},cerebras:{id:"cerebras",alias:"cerebras",name:"Cerebras",icon:"memory",color:"#FF4F00",textIcon:"CB",website:"https://inference.cerebras.ai",hasFree:!0,freeNote:"Free: 1M tokens/day, 60K TPM — world's fastest inference"},cohere:{id:"cohere",alias:"cohere",name:"Cohere",icon:"hub",color:"#39594D",textIcon:"CO",website:"https://cohere.com"},nvidia:{id:"nvidia",alias:"nvidia",name:"NVIDIA NIM",icon:"developer_board",color:"#76B900",textIcon:"NV",website:"https://build.nvidia.com",hasFree:!0,freeNote:"Free dev access: ~40 RPM, 70+ models (Kimi K2.5, GLM 4.7, DeepSeek V3.2...)"},nebius:{id:"nebius",alias:"nebius",name:"Nebius AI",icon:"cloud",color:"#6C5CE7",textIcon:"NB",website:"https://nebius.com"},siliconflow:{id:"siliconflow",alias:"siliconflow",name:"SiliconFlow",icon:"cloud_queue",color:"#5B6EF5",textIcon:"SF",website:"https://cloud.siliconflow.com"},hyperbolic:{id:"hyperbolic",alias:"hyp",name:"Hyperbolic",icon:"bolt",color:"#00D4FF",textIcon:"HY",website:"https://hyperbolic.xyz"},nanobanana:{id:"nanobanana",alias:"nb",name:"NanoBanana",icon:"image",color:"#FFD700",textIcon:"NB",website:"https://nanobananaapi.ai"},"ollama-cloud":{id:"ollama-cloud",alias:"ollamacloud",name:"Ollama Cloud",icon:"cloud",color:"#58A6FF",textIcon:"OC",website:"https://ollama.com/settings/api-keys"},huggingface:{id:"huggingface",alias:"hf",name:"HuggingFace",icon:"face",color:"#FFD21E",textIcon:"HF",website:"https://huggingface.co",hasFree:!0,freeNote:"Free Inference API for thousands of models (Whisper, VITS, SDXL…)"},synthetic:{id:"synthetic",alias:"synthetic",name:"Synthetic",icon:"verified_user",color:"#6366F1",textIcon:"SY",website:"https://synthetic.new",passthroughModels:!0},"kilo-gateway":{id:"kilo-gateway",alias:"kg",name:"Kilo Gateway",icon:"hub",color:"#617A91",textIcon:"KG",website:"https://kilo.ai",passthroughModels:!0},vertex:{id:"vertex",alias:"vertex",name:"Vertex AI",icon:"cloud",color:"#4285F4",textIcon:"VA",website:"https://cloud.google.com/vertex-ai",authHint:"Provide Service Account JSON or OAuth access_token"},"vertex-partner":{id:"vertex-partner",alias:"vp",name:"Vertex AI Partners",icon:"cloud",color:"#34A853",textIcon:"VP",website:"https://cloud.google.com/vertex-ai",authHint:"Provide the same Service Account JSON used for Vertex AI partner models."},zai:{id:"zai",alias:"zai",name:"Z.AI",icon:"psychology",color:"#2563EB",textIcon:"ZA",website:"https://open.bigmodel.cn",apiHint:"API key from https://open.bigmodel.cn/usercenter/apikeys"},"opencode-zen":{id:"opencode-zen",alias:"opencode-zen",name:"OpenCode Zen",icon:"opencode",color:"#6366f1",website:"https://opencode.ai/zen"},"opencode-go":{id:"opencode-go",alias:"opencode-go",name:"OpenCode Go",icon:"opencode",color:"#6366f1",website:"https://opencode.ai/zen/go"},alibaba:{id:"alibaba",alias:"ali",name:"Alibaba Cloud (DashScope)",icon:"cloud_queue",color:"#FF6600",textIcon:"AL",website:"https://dashscope-intl.aliyuncs.com",hasFree:!1},longcat:{id:"longcat",alias:"lc",name:"LongCat AI",icon:"auto_awesome",color:"#FF6B9D",textIcon:"LC",website:"https://longcat.chat",hasFree:!0,freeNote:"50M tokens/day (Flash-Lite) + 500K/day (Chat/Thinking) — 100% free while public beta"},pollinations:{id:"pollinations",alias:"pol",name:"Pollinations AI",icon:"local_florist",color:"#4CAF50",textIcon:"PO",website:"https://pollinations.ai",hasFree:!1,freeNote:"API key required. Spore tier: ~0.01 pollen/hour ($0.01/hr)."},puter:{id:"puter",alias:"pu",name:"Puter AI",icon:"cloud_circle",color:"#6366F1",textIcon:"PU",website:"https://puter.com",hasFree:!0,freeNote:"500+ models (GPT-5, Claude Opus 4, Gemini 3 Pro, Grok 4, DeepSeek V3...) — Users pay via free Puter account",passthroughModels:!0,authHint:"Get token at puter.com/dashboard → Copy Auth Token"},"cloudflare-ai":{id:"cloudflare-ai",alias:"cf",name:"Cloudflare Workers AI",icon:"cloud",color:"#F48120",textIcon:"CF",website:"https://developers.cloudflare.com/workers-ai/",hasFree:!0,freeNote:"Free 10K Neurons/day: ~150 LLM responses or 500s Whisper audio — edge inference globally",authHint:"Requires API Token AND Account ID (found at dash.cloudflare.com)"},scaleway:{id:"scaleway",alias:"scw",name:"Scaleway AI",icon:"cloud",color:"#4F0599",textIcon:"SCW",website:"https://www.scaleway.com/en/ai/generative-apis/",hasFree:!0,freeNote:"1M free tokens for new accounts — EU/GDPR compliant (Paris), Qwen3 235B & Llama 70B"},deepinfra:{id:"deepinfra",alias:"deepinfra",name:"DeepInfra",icon:"hub",color:"#2563EB",textIcon:"DI",website:"https://deepinfra.com"},"vercel-ai-gateway":{id:"vercel-ai-gateway",alias:"vag",name:"Vercel AI Gateway",icon:"route",color:"#111827",textIcon:"VAI",website:"https://vercel.com/docs/ai-gateway"},"lambda-ai":{id:"lambda-ai",alias:"lambda",name:"Lambda AI",icon:"bolt",color:"#7C3AED",textIcon:"LA",website:"https://lambda.ai"},sambanova:{id:"sambanova",alias:"samba",name:"SambaNova",icon:"memory",color:"#DC2626",textIcon:"SN",website:"https://sambanova.ai"},nscale:{id:"nscale",alias:"nscale",name:"nScale",icon:"token",color:"#0891B2",textIcon:"NS",website:"https://nscale.com"},ovhcloud:{id:"ovhcloud",alias:"ovh",name:"OVHcloud AI",icon:"cloud",color:"#2563EB",textIcon:"OVH",website:"https://www.ovhcloud.com"},baseten:{id:"baseten",alias:"baseten",name:"Baseten",icon:"deployed_code",color:"#111827",textIcon:"BT",website:"https://baseten.co"},publicai:{id:"publicai",alias:"publicai",name:"PublicAI",icon:"public",color:"#059669",textIcon:"PA",website:"https://publicai.co"},moonshot:{id:"moonshot",alias:"moonshot",name:"Moonshot AI",icon:"rocket_launch",color:"#1E40AF",textIcon:"MS",website:"https://platform.moonshot.ai"},"meta-llama":{id:"meta-llama",alias:"meta",name:"Meta Llama API",icon:"smart_toy",color:"#0F766E",textIcon:"ML",website:"https://llama.developer.meta.com"},"v0-vercel":{id:"v0-vercel",alias:"v0",name:"v0 (Vercel)",icon:"code_blocks",color:"#111827",textIcon:"V0",website:"https://v0.dev"},morph:{id:"morph",alias:"morph",name:"Morph",icon:"auto_fix_high",color:"#2563EB",textIcon:"MP",website:"https://morphllm.com"},"featherless-ai":{id:"featherless-ai",alias:"featherless",name:"Featherless AI",icon:"flutter_dash",color:"#EA580C",textIcon:"FL",website:"https://featherless.ai"},friendliai:{id:"friendliai",alias:"friendli",name:"FriendliAI",icon:"handshake",color:"#EC4899",textIcon:"FR",website:"https://friendli.ai"},llamagate:{id:"llamagate",alias:"llamagate",name:"LlamaGate",icon:"gate",color:"#16A34A",textIcon:"LG",website:"https://llamagate.ai"},heroku:{id:"heroku",alias:"heroku",name:"Heroku AI",icon:"cloud_upload",color:"#7C3AED",textIcon:"HK",website:"https://www.heroku.com"},galadriel:{id:"galadriel",alias:"galadriel",name:"Galadriel",icon:"auto_awesome",color:"#F59E0B",textIcon:"GA",website:"https://galadriel.com"},databricks:{id:"databricks",alias:"databricks",name:"Databricks",icon:"table_chart",color:"#F97316",textIcon:"DB",website:"https://www.databricks.com"},datarobot:{id:"datarobot",alias:"datarobot",name:"DataRobot",icon:"precision_manufacturing",color:"#6D28D9",textIcon:"DR",website:"https://docs.datarobot.com",authHint:"Use your DataRobot API token. Optional Base URL can be the account root (for LLM Gateway) or a deployment URL under /api/v2/deployments/<id>.",apiHint:"The default gateway catalogs active models from /genai/llmgw/catalog/. Deployment URLs are also supported for direct OpenAI-compatible chat requests.",passthroughModels:!0},clarifai:{id:"clarifai",alias:"clarifai",name:"Clarifai",icon:"hub",color:"#7C3AED",textIcon:"CF",website:"https://docs.clarifai.com",authHint:"Use your Clarifai PAT or app-specific API key. OmniRoute targets the OpenAI-compatible endpoint at https://api.clarifai.com/v2/ext/openai/v1 and authenticates with Authorization: Key <token>.",apiHint:"Clarifai exposes OpenAI-compatible chat, responses and /models on /v2/ext/openai/v1. Public/community models typically require a PAT; app-scoped keys only work for resources inside that app.",passthroughModels:!0},snowflake:{id:"snowflake",alias:"snowflake",name:"Snowflake Cortex",icon:"ac_unit",color:"#29B5E8",textIcon:"SF",website:"https://www.snowflake.com"},wandb:{id:"wandb",alias:"wandb",name:"Weights & Biases Inference",icon:"monitoring",color:"#FFBE0B",textIcon:"WB",website:"https://wandb.ai"},volcengine:{id:"volcengine",alias:"volcengine",name:"Volcengine",icon:"local_fire_department",color:"#DC2626",textIcon:"VE",website:"https://www.volcengine.com"},ai21:{id:"ai21",alias:"ai21",name:"AI21 Labs",icon:"psychology_alt",color:"#0284C7",textIcon:"AI21",website:"https://www.ai21.com"},gigachat:{id:"gigachat",alias:"gigachat",name:"GigaChat (Sber)",icon:"lock_person",color:"#10B981",textIcon:"GC",website:"https://developers.sber.ru"},venice:{id:"venice",alias:"venice",name:"Venice.ai",icon:"travel_explore",color:"#0EA5E9",textIcon:"VN",website:"https://venice.ai"},codestral:{id:"codestral",alias:"codestral",name:"Codestral",icon:"terminal",color:"#FF7000",textIcon:"CS",website:"https://mistral.ai"},upstage:{id:"upstage",alias:"upstage",name:"Upstage",icon:"trending_up",color:"#0F766E",textIcon:"UP",website:"https://www.upstage.ai"},maritalk:{id:"maritalk",alias:"maritalk",name:"Maritalk",icon:"translate",color:"#1D4ED8",textIcon:"MT",website:"https://www.maritaca.ai"},"xiaomi-mimo":{id:"xiaomi-mimo",alias:"mimo",name:"Xiaomi MiMo",icon:"devices",color:"#EA580C",textIcon:"MM",website:"https://www.mi.com"},"inference-net":{id:"inference-net",alias:"inet",name:"Inference.net",icon:"dns",color:"#2563EB",textIcon:"IN",website:"https://inference.net"},nanogpt:{id:"nanogpt",alias:"nanogpt",name:"NanoGPT",icon:"chat",color:"#4F46E5",textIcon:"NG",website:"https://nano-gpt.com"},predibase:{id:"predibase",alias:"predibase",name:"Predibase",icon:"deployed_code_history",color:"#0F766E",textIcon:"PB",website:"https://predibase.com"},bytez:{id:"bytez",alias:"bytez",name:"Bytez",icon:"api",color:"#6366F1",textIcon:"BZ",website:"https://bytez.com"},aimlapi:{id:"aimlapi",alias:"aiml",name:"AI/ML API",icon:"hub",color:"#6366F1",textIcon:"AI",website:"https://aimlapi.com",hasFree:!0,freeNote:"$0.025/day free credits — 200+ models (GPT-4o, Claude, Gemini, Llama) via single endpoint",passthroughModels:!0},novita:{id:"novita",alias:"novita",name:"Novita AI",icon:"auto_awesome",color:"#FF4081",textIcon:"NV",website:"https://novita.ai",passthroughModels:!0},piapi:{id:"piapi",alias:"pi",name:"PiAPI",icon:"api",color:"#7C4DFF",textIcon:"PI",website:"https://piapi.ai",passthroughModels:!0},getgoapi:{id:"getgoapi",alias:"ggo",name:"GoAPI",icon:"rocket_launch",color:"#FF6D00",textIcon:"GO",website:"https://api.getgoapi.com",passthroughModels:!0},laozhang:{id:"laozhang",alias:"lz",name:"LaoZhang AI",icon:"hub",color:"#FF1744",textIcon:"LZ",website:"https://api.laozhang.ai",passthroughModels:!0},glhf:{id:"glhf",alias:"glhf",name:"GLHF Chat",icon:"hub",color:"#10B981",textIcon:"GH",website:"https://glhf.chat",authHint:"Bearer API key for the GLHF OpenAI-compatible gateway.",passthroughModels:!0},cablyai:{id:"cablyai",alias:"cablyai",name:"CablyAI",icon:"hub",color:"#FF4081",textIcon:"CA",website:"https://cablyai.com",authHint:"Bearer API key for the CablyAI OpenAI-compatible gateway.",passthroughModels:!0},thebai:{id:"thebai",alias:"thebai",name:"TheB.AI",icon:"hub",color:"#3B82F6",textIcon:"TB",website:"https://theb.ai",authHint:"Bearer API key for the TheB.AI OpenAI-compatible gateway.",passthroughModels:!0},fenayai:{id:"fenayai",alias:"fenayai",name:"FenayAI",icon:"hub",color:"#FF9800",textIcon:"FN",website:"https://fenayai.com",authHint:"Bearer API key for the FenayAI OpenAI-compatible gateway.",passthroughModels:!0},empower:{id:"empower",alias:"empower",name:"Empower",icon:"hub",color:"#14B8A6",textIcon:"EM",website:"https://docs.empower.dev",authHint:"Bearer API key for the Empower OpenAI-compatible endpoint.",apiHint:"Empower exposes OpenAI-compatible chat on https://app.empower.dev/api/v1 with tool-calling support on empower-functions.",passthroughModels:!0},"nous-research":{id:"nous-research",alias:"nous",name:"Nous Research",icon:"hub",color:"#2563EB",textIcon:"NO",website:"https://portal.nousresearch.com/help",authHint:"Use your Nous Portal API key. OmniRoute targets the official OpenAI-compatible inference endpoint at https://inference-api.nousresearch.com/v1.",apiHint:"Nous exposes an OpenAI-compatible /v1 surface with a large remote /models catalog. The /chat/completions endpoint requires a valid API key for programmatic inference.",passthroughModels:!0},petals:{id:"petals",alias:"petals",name:"Petals",icon:"hub",color:"#10B981",textIcon:"PT",website:"https://chat.petals.dev",authHint:"No API key is required for the public research endpoint. Leave the field blank, or provide a bearer token if your self-hosted Petals gateway uses auth.",apiHint:"Petals exposes a public HTTP API at https://chat.petals.dev/api/v1/generate and a WebSocket API at /api/v2/generate. OmniRoute targets the HTTP generate endpoint and supports self-hosted base URLs."},poe:{id:"poe",alias:"poe",name:"Poe",icon:"hub",color:"#F97316",textIcon:"PO",website:"https://creator.poe.com/api-reference",authHint:"Bearer API key for the Poe OpenAI-compatible API.",apiHint:"Poe exposes OpenAI-compatible chat and responses on https://api.poe.com/v1, with authenticated balance checks on /usage/current_balance.",passthroughModels:!0},gitlab:{id:"gitlab",alias:"gitlab",name:"GitLab Duo PAT",icon:"hub",color:"#FC6D26",textIcon:"GL",website:"https://docs.gitlab.com/user/duo_agent_platform/code_suggestions/",authHint:"GitLab personal access token for the public Code Suggestions API. Configure a self-hosted base URL when not using gitlab.com."},chutes:{id:"chutes",alias:"chutes",name:"Chutes.ai",icon:"hub",color:"#06B6D4",textIcon:"CH",website:"https://chutes.ai",authHint:"Bearer API key for the Chutes OpenAI-compatible gateway.",passthroughModels:!0},"voyage-ai":{id:"voyage-ai",alias:"voyage",name:"Voyage AI",icon:"blur_on",color:"#0F766E",textIcon:"VA",website:"https://www.voyageai.com",authHint:"Bearer API key for Voyage AI embeddings and rerank APIs."},"jina-ai":{id:"jina-ai",alias:"jina",name:"Jina AI",icon:"sort",color:"#2563EB",textIcon:"JA",website:"https://jina.ai",authHint:"Bearer API key for the Jina AI rerank API."},"fal-ai":{id:"fal-ai",alias:"fal",name:"Fal.ai",icon:"image",color:"#2563EB",textIcon:"FL",website:"https://fal.ai"},"stability-ai":{id:"stability-ai",alias:"stability",name:"Stability AI",icon:"image",color:"#8B5CF6",textIcon:"SA",website:"https://stability.ai"},"black-forest-labs":{id:"black-forest-labs",alias:"bfl",name:"Black Forest Labs",icon:"image",color:"#111827",textIcon:"BF",website:"https://blackforestlabs.ai"},recraft:{id:"recraft",alias:"recraft",name:"Recraft",icon:"image",color:"#EC4899",textIcon:"RC",website:"https://recraft.ai"},topaz:{id:"topaz",alias:"topaz",name:"Topaz",icon:"image",color:"#059669",textIcon:"TP",website:"https://topazlabs.com"}},n={"lm-studio":{id:"lm-studio",alias:"lmstudio",name:"LM Studio",icon:"server",color:"#4A148C",textIcon:"LM",website:"https://lmstudio.ai",authHint:"API key optional. Configure the local LM Studio OpenAI-compatible base URL (default: http://localhost:1234/v1).",localDefault:"http://localhost:1234/v1",passthroughModels:!0},vllm:{id:"vllm",alias:"vllm",name:"vLLM",icon:"memory",color:"#0F766E",textIcon:"VL",website:"https://github.com/vllm-project/vllm",authHint:"API key optional. Configure the local vLLM OpenAI-compatible base URL (default: http://localhost:8000/v1).",localDefault:"http://localhost:8000/v1",passthroughModels:!0},lemonade:{id:"lemonade",alias:"lemonade",name:"Lemonade Server",icon:"bolt",color:"#F59E0B",textIcon:"LM",website:"https://lemonade-server.ai",authHint:"API key optional. Configure the local Lemonade OpenAI-compatible base URL (default: http://localhost:13305/api/v1).",localDefault:"http://localhost:13305/api/v1",passthroughModels:!0},llamafile:{id:"llamafile",alias:"llamafile",name:"Llamafile",icon:"article",color:"#EA580C",textIcon:"LF",website:"https://github.com/Mozilla-Ocho/llamafile",authHint:"API key optional. Configure the local Llamafile OpenAI-compatible base URL (default: http://127.0.0.1:8080/v1).",localDefault:"http://127.0.0.1:8080/v1",passthroughModels:!0},triton:{id:"triton",alias:"triton",name:"NVIDIA Triton",icon:"developer_board",color:"#76B900",textIcon:"TR",website:"https://developer.nvidia.com/triton-inference-server",authHint:"API key optional. Configure the Triton OpenAI-compatible base URL (default: http://localhost:8000/v1).",localDefault:"http://localhost:8000/v1",passthroughModels:!0},"docker-model-runner":{id:"docker-model-runner",alias:"dmr",name:"Docker Model Runner",icon:"inventory_2",color:"#2496ED",textIcon:"DM",website:"https://docs.docker.com/ai/model-runner/",authHint:"API key optional. Configure the local Docker Model Runner OpenAI-compatible base URL (default: http://localhost:12434/v1).",localDefault:"http://localhost:12434/v1",passthroughModels:!0},xinference:{id:"xinference",alias:"xinference",name:"XInference",icon:"hub",color:"#DC2626",textIcon:"XI",website:"https://inference.readthedocs.io",authHint:"API key optional. Configure the local XInference OpenAI-compatible base URL (default: http://localhost:9997/v1).",localDefault:"http://localhost:9997/v1",passthroughModels:!0},oobabooga:{id:"oobabooga",alias:"ooba",name:"oobabooga",icon:"dns",color:"#8B5CF6",textIcon:"OO",website:"https://github.com/oobabooga/text-generation-webui",authHint:"API key optional. Configure the local oobabooga OpenAI-compatible base URL (default: http://localhost:5000/v1).",localDefault:"http://localhost:5000/v1",passthroughModels:!0},sdwebui:{id:"sdwebui",alias:"sdwebui",name:"SD WebUI",icon:"brush",color:"#FF7043",textIcon:"SD",website:"https://github.com/AUTOMATIC1111/stable-diffusion-webui",authHint:"No API key required. Configure the local WebUI base URL (default: http://localhost:7860).",localDefault:"http://localhost:7860"},comfyui:{id:"comfyui",alias:"comfyui",name:"ComfyUI",icon:"account_tree",color:"#4CAF50",textIcon:"CF",website:"https://github.com/comfyanonymous/ComfyUI",authHint:"No API key required. Configure the local ComfyUI base URL (default: http://localhost:8188).",localDefault:"http://localhost:8188"}},o={"perplexity-search":{id:"perplexity-search",alias:"pplx-search",name:"Perplexity Search",icon:"search",color:"#20808D",textIcon:"PS",website:"https://docs.perplexity.ai/guides/search-quickstart",authHint:"Same API key as Perplexity (pplx-...)"},"serper-search":{id:"serper-search",alias:"serper-search",name:"Serper Search",icon:"search",color:"#4285F4",textIcon:"SP",website:"https://serper.dev",authHint:"API key from serper.dev dashboard"},"brave-search":{id:"brave-search",alias:"brave-search",name:"Brave Search",icon:"travel_explore",color:"#FB542B",textIcon:"BR",website:"https://brave.com/search/api",authHint:"Subscription token from Brave Search API dashboard"},"exa-search":{id:"exa-search",alias:"exa-search",name:"Exa Search",icon:"neurology",color:"#1E40AF",textIcon:"EX",website:"https://exa.ai",authHint:"API key from dashboard.exa.ai"},"tavily-search":{id:"tavily-search",alias:"tavily-search",name:"Tavily Search",icon:"manage_search",color:"#5B4FDB",textIcon:"TV",website:"https://tavily.com",authHint:"API key from app.tavily.com (format: tvly-...)"},"google-pse-search":{id:"google-pse-search",alias:"google-pse",name:"Google Programmable Search",icon:"travel_explore",color:"#4285F4",textIcon:"GP",website:"https://developers.google.com/custom-search/v1/overview",authHint:"Requires a Google API key and your Programmable Search Engine ID (cx)"},"linkup-search":{id:"linkup-search",alias:"linkup",name:"Linkup Search",icon:"public",color:"#0F766E",textIcon:"LU",website:"https://docs.linkup.so",authHint:"Bearer API key from the Linkup dashboard"},"searchapi-search":{id:"searchapi-search",alias:"searchapi",name:"SearchAPI",icon:"manage_search",color:"#2563EB",textIcon:"SA",website:"https://www.searchapi.io/docs",authHint:"API key from SearchAPI (query param or Bearer auth)"},"youcom-search":{id:"youcom-search",alias:"youcom-search",name:"You.com Search",icon:"travel_explore",color:"#2563EB",textIcon:"YOU",website:"https://you.com/docs/search/overview",authHint:"X-API-Key from the You.com platform dashboard"},"searxng-search":{id:"searxng-search",alias:"searxng",name:"SearXNG Search",icon:"search",color:"#1A237E",textIcon:"SX",website:"https://docs.searxng.org",authHint:"API key is optional. Set your SearXNG base URL. Some instances may require a bearer token for access."}},p={deepgram:{id:"deepgram",alias:"dg",name:"Deepgram",icon:"mic",color:"#13EF93",textIcon:"DG",website:"https://deepgram.com"},assemblyai:{id:"assemblyai",alias:"aai",name:"AssemblyAI",icon:"record_voice_over",color:"#0062FF",textIcon:"AA",website:"https://assemblyai.com"},elevenlabs:{id:"elevenlabs",alias:"el",name:"ElevenLabs",icon:"record_voice_over",color:"#6C47FF",textIcon:"EL",website:"https://elevenlabs.io"},cartesia:{id:"cartesia",alias:"cartesia",name:"Cartesia",icon:"spatial_audio",color:"#FF4F8B",textIcon:"CA",website:"https://cartesia.ai"},playht:{id:"playht",alias:"playht",name:"PlayHT",icon:"play_circle",color:"#00B4D8",textIcon:"PH",website:"https://play.ht"},inworld:{id:"inworld",alias:"inworld",name:"Inworld",icon:"voice_chat",color:"#7B2EF2",textIcon:"IW",website:"https://inworld.ai"},"aws-polly":{id:"aws-polly",alias:"polly",name:"AWS Polly",icon:"record_voice_over",color:"#FF9900",textIcon:"PL",website:"https://aws.amazon.com/polly/",authHint:"Use AWS Secret Access Key as API key; set providerSpecificData.accessKeyId and optional region."}},q={cliproxyapi:{id:"cliproxyapi",alias:"cpa",name:"CLIProxyAPI",icon:"proxy",color:"#6366F1",textIcon:"CPA",website:"https://github.com/router-for-me/CLIProxyAPI",defaultPort:8317,healthEndpoint:"/v1/models",managementPrefix:"/v0/management",configDir:"~/.cli-proxy-api",binaryName:"cli-proxy-api",githubRepo:"router-for-me/CLIProxyAPI"}};function g(a){return"string"==typeof a&&Object.prototype.hasOwnProperty.call(n,a)}let r={...j,...k,...m,...l,...n,...o,...p,...q};function h(a){let b=function(a){for(let b of Object.values(r))if(b.alias===a||b.id===a)return b;return null}(a);return b?.id||a}function i(a){let b=Object.prototype.hasOwnProperty.call(r,a)?r[a]:void 0;return b?.alias||a}Object.values(r).reduce((a,b)=>(b.alias&&(a[b.alias]=b.id),a),{}),Object.values(r).reduce((a,b)=>(a[b.id]=b.alias||b.id,a),{});let s=["antigravity","gemini-cli","kiro","amazon-q","github","codex","claude","kimi-coding","glm","glmt","minimax","minimax-cn","crof"];(0,e.LA)(j,"FREE_PROVIDERS"),(0,e.LA)(k,"OAUTH_PROVIDERS"),(0,e.LA)(m,"APIKEY_PROVIDERS"),(0,e.LA)(l,"WEB_COOKIE_PROVIDERS"),(0,e.LA)(n,"LOCAL_PROVIDERS"),(0,e.LA)(o,"SEARCH_PROVIDERS"),(0,e.LA)(p,"AUDIO_ONLY_PROVIDERS"),(0,e.LA)(q,"UPSTREAM_PROXY_PROVIDERS"),d()}catch(a){d(a)}})},43712:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{LA:()=>g});var e=c(42971),f=a([e]);let h=(e=(f.then?(await f)():f)[0]).z.object({id:e.z.string().min(1),alias:e.z.string().min(1).optional(),name:e.z.string().min(1),icon:e.z.string().min(1),color:e.z.string().regex(/^#[0-9A-Fa-f]{6}$/,"Must be a valid hex color (#RRGGBB)"),textIcon:e.z.string().optional(),website:e.z.string().url().optional(),passthroughModels:e.z.boolean().optional(),deprecated:e.z.boolean().optional(),deprecationReason:e.z.string().optional(),hasFree:e.z.boolean().optional(),freeNote:e.z.string().optional(),authHint:e.z.string().optional(),apiHint:e.z.string().optional()}),i=e.z.record(e.z.string(),h);function g(a,b){let c=i.safeParse(a);if(!c.success){let a=c.error.issues.map(a=>` ${a.path.join(".")}: ${a.message}`).join("\n");throw console.error(`[PROVIDER VALIDATION] ${b} has invalid entries:
|
|
2
|
-
${a}`),Error(`Provider validation failed for ${b}`)}}d()}catch(a){d(a)}})},98275:(a,b,c)=>{let d;c.d(b,{T1:()=>
|
|
2
|
+
${a}`),Error(`Provider validation failed for ${b}`)}}d()}catch(a){d(a)}})},98275:(a,b,c)=>{let d;c.d(b,{T1:()=>E,kn:()=>t,t6:()=>q,IM:()=>r,H5:()=>s});var e=c(5834),f=c(62894);let g=`You are Codex, based on GPT-5. You are running as a coding agent in the Codex CLI on a user's computer.
|
|
3
3
|
|
|
4
4
|
## General
|
|
5
5
|
|
|
@@ -115,10 +115,10 @@ You are producing plain text that will later be styled by the CLI. Follow these
|
|
|
115
115
|
* Optionally include line/column (1‑based): :line[:column] or #Lline[Ccolumn] (column defaults to 1).
|
|
116
116
|
* Do not use URIs like file://, vscode://, or https://.
|
|
117
117
|
* Do not provide range of lines
|
|
118
|
-
* Examples: src/app.ts, src/app.ts:42, b/server/index.js#L10, C:\\repo\\project\\main.rs:12:5`;var h=c(49193),i=c(22803),j=c(73511),k=c(31488),l=c(30417);let m=null,n=!1;function o(){if(void 0!==d)return d;if(n)return m;n=!0;try{let a=c(3725);m="function"==typeof a.websocket?a.websocket:null}catch{m=null}return m}let p=[{pattern:"codex-spark",scope:"spark"},{pattern:"spark",scope:"spark"},{pattern:"codex",scope:"codex"},{pattern:"gpt-5",scope:"codex"}];function q(a){let b=a.toLowerCase();for(let{pattern:a,scope:c}of p)if(b.includes(a))return c;return"codex"}function r(a,b){return`${a}:${q(b)}`}function s(a){let b=a.get("x-codex-5h-usage"),c=a.get("x-codex-5h-limit"),d=a.get("x-codex-5h-reset-at"),e=a.get("x-codex-7d-usage"),f=a.get("x-codex-7d-limit"),g=a.get("x-codex-7d-reset-at");return b||c||d||e||f||g?{usage5h:b?parseFloat(b):0,limit5h:c?parseFloat(c):1/0,resetAt5h:d??null,usage7d:e?parseFloat(e):0,limit7d:f?parseFloat(f):1/0,resetAt7d:g??null}:null}function t(a,b=.95){let c=Date.now(),d=a.limit7d>0&&Number.isFinite(a.limit7d)?a.usage7d/a.limit7d:0,e=a.limit5h>0&&Number.isFinite(a.limit5h)?a.usage5h/a.limit5h:0;if(d>=b&&a.resetAt7d){let b=new Date(a.resetAt7d).getTime();if(b>c)return{cooldownMs:b-c,window:"7d"}}if(e>=b&&a.resetAt5h){let b=new Date(a.resetAt5h).getTime();if(b>c)return{cooldownMs:b-c,window:"5h"}}return{cooldownMs:0,window:"none"}}let u=["none","low","medium","high","xhigh"],v="wss://chatgpt.com/backend-api/codex/responses";function w(a){let b="string"==typeof a?a:"";for(let a of u)if(b.endsWith(`-${a}`))return{baseModel:b.slice(0,-`-${a}`.length),effort:a};return{baseModel:b,effort:null}}
|
|
118
|
+
* Examples: src/app.ts, src/app.ts:42, b/server/index.js#L10, C:\\repo\\project\\main.rs:12:5`;var h=c(49193),i=c(22803),j=c(73511),k=c(31488),l=c(30417);let m=null,n=!1;function o(){if(void 0!==d)return d;if(n)return m;n=!0;try{let a=c(3725);m="function"==typeof a.websocket?a.websocket:null}catch{m=null}return m}let p=[{pattern:"codex-spark",scope:"spark"},{pattern:"spark",scope:"spark"},{pattern:"codex",scope:"codex"},{pattern:"gpt-5",scope:"codex"}];function q(a){let b=a.toLowerCase();for(let{pattern:a,scope:c}of p)if(b.includes(a))return c;return"codex"}function r(a,b){return`${a}:${q(b)}`}function s(a){let b=a.get("x-codex-5h-usage"),c=a.get("x-codex-5h-limit"),d=a.get("x-codex-5h-reset-at"),e=a.get("x-codex-7d-usage"),f=a.get("x-codex-7d-limit"),g=a.get("x-codex-7d-reset-at");return b||c||d||e||f||g?{usage5h:b?parseFloat(b):0,limit5h:c?parseFloat(c):1/0,resetAt5h:d??null,usage7d:e?parseFloat(e):0,limit7d:f?parseFloat(f):1/0,resetAt7d:g??null}:null}function t(a,b=.95){let c=Date.now(),d=a.limit7d>0&&Number.isFinite(a.limit7d)?a.usage7d/a.limit7d:0,e=a.limit5h>0&&Number.isFinite(a.limit5h)?a.usage5h/a.limit5h:0;if(d>=b&&a.resetAt7d){let b=new Date(a.resetAt7d).getTime();if(b>c)return{cooldownMs:b-c,window:"7d"}}if(e>=b&&a.resetAt5h){let b=new Date(a.resetAt5h).getTime();if(b>c)return{cooldownMs:b-c,window:"5h"}}return{cooldownMs:0,window:"none"}}let u=["none","low","medium","high","xhigh"],v="wss://chatgpt.com/backend-api/codex/responses";function w(a){let b="string"==typeof a?a:"";for(let a of u)if(b.endsWith(`-${a}`))return{baseModel:b.slice(0,-`-${a}`.length),effort:a};return{baseModel:b,effort:null}}let x=new Set(["image_generation","web_search","web_search_preview","file_search","computer","computer_use_preview","code_interpreter","mcp","local_shell"]);function y(a){let b=String(a||"").replace(/\/+$/,"").match(/(?:^|\/)responses(?:(\/.*))?$/i);return b?b[1]||"":null}function z(a){return y(a)?.toLowerCase()==="/compact"}let A={"gpt-5.3-codex":"xhigh","gpt-5.2-codex":"xhigh","gpt-5.1-codex-max":"xhigh","gpt-5-mini":"high","gpt-5.1-mini":"high","gpt-4.1-mini":"high"};function B(a,b){let c=A[a]??"xhigh";return u.indexOf(b)>u.indexOf(c)?(console.debug(`[Codex] clampEffort: "${b}" → "${c}" (model: ${a})`),c):b}function C(a){if("string"==typeof a)return a.trim().toLowerCase()||void 0}function D(a){if("number"==typeof a&&Number.isInteger(a)&&a>=400&&a<=599)return a;if("string"==typeof a&&/^\d{3}$/.test(a.trim())){let b=Number(a.trim());return b>=400&&b<=599?b:null}return null}class E extends f.Hv{constructor(){super("codex",h.xq.codex)}async execute(a){var b;let c;if(a.model,c=(b=a.credentials)&&"object"==typeof b?b.providerSpecificData:null,!(c?.codexTransport==="websocket"&&o()))return super.execute(a);let d=function(a){let b={};for(let[c,d]of Object.entries(a)){let a=c.toLowerCase();"host"!==a&&"connection"!==a&&"upgrade"!==a&&"sec-websocket-key"!==a&&"sec-websocket-version"!==a&&"sec-websocket-extensions"!==a&&(b[c]=d)}return b.Origin="https://chatgpt.com",b}(this.buildHeaders(a.credentials,!0));(0,f._F)(d,a.upstreamExtraHeaders);let e=await this.transformRequest(a.model,a.body,!0,a.credentials);e.model=w(e.model||a.model).baseModel,delete e.stream,delete e.stream_options;let g=JSON.stringify({type:"response.create",...e}),h=o();if(!h)return{response:new Response(JSON.stringify({error:{code:"wreq_unavailable",message:"Codex WebSocket transport unavailable: wreq-js native module is missing for this platform"}}),{status:503,headers:{"Content-Type":"application/json",...l.$}}),url:v,headers:d,transformedBody:e};let i=new TextEncoder,j=!1,k=null,m=null,n=null,p=({reason:b,emitDone:c=!0,closeController:d=!0,closeSocket:e=!0})=>{if(j)return;j=!0,n&&(a.signal?.removeEventListener("abort",n),n=null),e&&(a=>{try{k?.close(1e3,a)}catch{}})(b);let f=m;if(f&&d){if(c)try{f.enqueue(i.encode("data: [DONE]\n\n"))}catch{}try{f.close()}catch{}}},q=(a,b)=>{if(j)return;let c=m,d=JSON.stringify({type:"response.failed",response:{id:null,status:"failed",error:{code:a,message:b}}});try{c?.enqueue(i.encode(`event: response.failed
|
|
119
119
|
data: ${d}
|
|
120
120
|
|
|
121
|
-
`))}catch{}p({reason:"upstream_failed"})},r=new ReadableStream({async start(b){m=b,n=()=>{p({reason:"client_aborted"})},a.signal?.addEventListener("abort",n,{once:!0});try{if(k=await h(v.startsWith("wss://")||v.startsWith("ws://")?v:v.startsWith("https://")?`wss://${v.slice(8)}`:v.startsWith("http://")?`ws://${v.slice(7)}`:v,{browser:"chrome_142",os:"windows",headers:d}),j)return;if(a.signal?.aborted)return void p({reason:"client_aborted"});k.onmessage=a=>{if(j)return;let c="string"==typeof a.data?a.data:Buffer.from(a.data).toString("utf8"),d=function(a){let b="message",c=a,d=!1;try{let e=JSON.parse(a);if(e&&"string"==typeof e.type&&e.type.trim()){if(b=e.type.trim(),"error"===b||"response.failed"===b){let a,d,f,g,h,i,j,k,l=(a=e.response&&"object"==typeof e.response&&!Array.isArray(e.response)?e.response:null,d=a?.error&&"object"==typeof a.error&&!Array.isArray(a.error)?a.error:e.error&&"object"==typeof e.error&&!Array.isArray(e.error)?e.error:e,f="string"==typeof d.code?d.code:"string"==typeof d.type?d.type:"upstream_error",g="string"==typeof d.type?d.type:"",h="string"==typeof d.message&&d.message.trim()?d.message:"Codex upstream error",i={code:f,message:h},k=
|
|
121
|
+
`))}catch{}p({reason:"upstream_failed"})},r=new ReadableStream({async start(b){m=b,n=()=>{p({reason:"client_aborted"})},a.signal?.addEventListener("abort",n,{once:!0});try{if(k=await h(v.startsWith("wss://")||v.startsWith("ws://")?v:v.startsWith("https://")?`wss://${v.slice(8)}`:v.startsWith("http://")?`ws://${v.slice(7)}`:v,{browser:"chrome_142",os:"windows",headers:d}),j)return;if(a.signal?.aborted)return void p({reason:"client_aborted"});k.onmessage=a=>{if(j)return;let c="string"==typeof a.data?a.data:Buffer.from(a.data).toString("utf8"),d=function(a){let b="message",c=a,d=!1;try{let e=JSON.parse(a);if(e&&"string"==typeof e.type&&e.type.trim()){if(b=e.type.trim(),"error"===b||"response.failed"===b){let a,d,f,g,h,i,j,k,l=(a=e.response&&"object"==typeof e.response&&!Array.isArray(e.response)?e.response:null,d=a?.error&&"object"==typeof a.error&&!Array.isArray(a.error)?a.error:e.error&&"object"==typeof e.error&&!Array.isArray(e.error)?e.error:e,f="string"==typeof d.code?d.code:"string"==typeof d.type?d.type:"upstream_error",g="string"==typeof d.type?d.type:"",h="string"==typeof d.message&&d.message.trim()?d.message:"Codex upstream error",i={code:f,message:h},k=D(e.status_code)??D(e.status)??D(a?.status_code)??D(a?.status)??D(d.status_code)??D(d.status)??((j=`${f} ${g} ${h}`.toLowerCase()).includes("usage_limit_reached")||j.includes("rate_limit")||j.includes("rate limit")||j.includes("quota")||j.includes("too many requests")||j.includes("limit has been reached")||j.includes("limit reached")?429:null),g&&(i.type=g),null!==k&&(i.status_code=k),{type:"response.failed",response:{id:"string"==typeof a?.id?a.id:null,status:"failed",error:i}});c=JSON.stringify(l),b="response.failed"}d="response.completed"===b||"response.failed"===b}}catch{}return{sse:`event: ${b}
|
|
122
122
|
data: ${c}
|
|
123
123
|
|
|
124
|
-
`,terminal:d}}(c);if(!j){try{b.enqueue(i.encode(d.sse))}catch{p({reason:"downstream_closed",emitDone:!1,closeController:!1});return}d.terminal&&p({reason:"terminal_event"})}},k.onerror=a=>{q("upstream_websocket_error",a.message||"Codex upstream WebSocket error")},k.onclose=()=>{p({reason:"upstream_closed",closeSocket:!1})},j||k.send(g)}catch(a){q("upstream_websocket_connect_failed",a instanceof Error?a.message:String(a))}},cancel(){p({reason:"client_cancelled",emitDone:!1,closeController:!1})}});return{response:new Response(r,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}}),url:v,headers:d,transformedBody:e}}buildUrl(a,b,c=0,d=null){let e=
|
|
124
|
+
`,terminal:d}}(c);if(!j){try{b.enqueue(i.encode(d.sse))}catch{p({reason:"downstream_closed",emitDone:!1,closeController:!1});return}d.terminal&&p({reason:"terminal_event"})}},k.onerror=a=>{q("upstream_websocket_error",a.message||"Codex upstream WebSocket error")},k.onclose=()=>{p({reason:"upstream_closed",closeSocket:!1})},j||k.send(g)}catch(a){q("upstream_websocket_connect_failed",a instanceof Error?a.message:String(a))}},cancel(){p({reason:"client_cancelled",emitDone:!1,closeController:!1})}});return{response:new Response(r,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}}),url:v,headers:d,transformedBody:e}}buildUrl(a,b,c=0,d=null){let e=y(d?.requestEndpointPath);if(null!==e){let a=String(this.config.baseUrl||"").replace(/\/$/,"");return a.endsWith("/responses")?`${a}${e}`:`${a}/responses${e}`}return super.buildUrl(a,b,c,d)}buildHeaders(a,b=!0){let c=z(a?.requestEndpointPath),d=super.buildHeaders(a,!c);d.Version=(0,i.zq)(),(0,f.Uv)(d,(0,i.EQ)());let e=a?.providerSpecificData?.workspaceId;e&&(d["chatgpt-account-id"]=e),d.originator="codex_cli_rs";let g=this.getPromptCacheSessionId(a,null);return g&&(d.session_id=g),d}getPromptCacheSessionId(a,b){let c=b?.session_id??b?.conversation_id;return"string"==typeof c&&c.length>0?c:a?.providerSpecificData?.workspaceId||null}async refreshCredentials(a,b){if(!a?.refreshToken)return b?.warn?.("TOKEN_REFRESH","Codex: no refresh token available, re-authentication required"),null;let c=await (0,j.iD)("codex",a,b);return!c||c.error?(b?.warn?.("TOKEN_REFRESH",`Codex: token refresh failed${c?.error?` (${c.error})`:""} — re-authentication required`),null):c}transformRequest(a,b,c,d){b=b&&"object"==typeof b?structuredClone(b):{};let f=b?._nativeCodexPassthrough===!0,h=z(d?.requestEndpointPath),i=(0,e.vr)(d?.providerSpecificData),j=(0,k.IZ)().mode===k.g8.PASSTHROUGH;(m=b)._omnirouteResponsesStore,delete m._omnirouteResponsesStore,h?(delete b.stream,delete b.stream_options):b.stream=!0,delete b._nativeCodexPassthrough;let l=function(a){if("string"!=typeof a)return;let b=a.trim().toLowerCase();if(b)return"fast"===b?"priority":b}(b.service_tier);l?b.service_tier=l:i.serviceTier&&(b.service_tier=i.serviceTier);var m,n=b;if(Array.isArray(n.input))for(let a of n.input){if(!a||"object"!=typeof a||Array.isArray(a))continue;let b="string"==typeof a.role?a.role:"",c="string"==typeof a.type?a.type:"";"system"!==b||c&&"message"!==c||(a.role="developer")}if(f)b.instructions&&("string"!=typeof b.instructions||""!==b.instructions.trim())||(b.instructions="Follow the developer instructions in the conversation.");else{let a=Array.isArray(b.tools)&&b.tools.length>0;b.instructions&&("string"!=typeof b.instructions||""!==b.instructions.trim())||(a?b.instructions=g:b.instructions="You are a ChatGPT agent.")}!0===(d?.providerSpecificData&&"object"==typeof d.providerSpecificData&&!Array.isArray(d.providerSpecificData)?d.providerSpecificData.openaiStoreEnabled:void 0)?b.store=!0:b.store=!1,function(a){if(!Array.isArray(a.tools))return;let b=new Set;if(a.tools=a.tools.filter(a=>{if(!a||"object"!=typeof a||Array.isArray(a))return!1;let c="string"==typeof a.type?a.type:"";if("namespace"===c){if(Array.isArray(a.tools)){for(let c of a.tools)if(c&&"object"==typeof c&&!Array.isArray(c)){let a="string"==typeof c.name?c.name.trim():"";a&&b.add(a)}}return!0}if("function"!==c){let b=a.function&&"object"==typeof a.function,d="string"==typeof a.name;return!!c&&!b&&!d&&(!!x.has(c)||(console.debug(`[Codex] dropping unknown hosted tool type: ${c}`),!1))}let d=("string"==typeof a.name?a.name:a.function&&"object"==typeof a.function&&!Array.isArray(a.function)&&"string"==typeof a.function.name?a.function.name:"").trim();return!!d&&(b.add(d),!0)}),a.tool_choice&&"object"==typeof a.tool_choice&&!Array.isArray(a.tool_choice)){let c=a.tool_choice;if("function"===c.type){let d="string"==typeof c.name?c.name.trim():"";d&&b.has(d)||delete a.tool_choice}}}(b),function(a){if(delete a.previous_response_id,!Array.isArray(a.input))return;let b=/^(rs|fc|resp|msg)_/,c=0;a.input=a.input.filter(a=>"string"==typeof a&&b.test(a)||a&&"object"==typeof a&&!Array.isArray(a)&&"item_reference"===a.type?(c++,!1):(a&&"object"==typeof a&&!Array.isArray(a)&&"string"==typeof a.id&&b.test(a.id)&&(delete a.id,c++),!0)),c>0&&console.debug(`[Codex] stripStoredItemReferences: sanitized ${c} server-generated ID(s) from input`)}(b),delete b.messages,delete b.prompt;let o=null,p="string"==typeof b.model?b.model:a,q=w(p);q.effort&&(o=q.effort,b.model=q.baseModel,p=b.model);let r=C(b?.reasoning?.effort),s=C(b.reasoning_effort),t=j?i.reasoningEffort||"medium":void 0,u=r||s||o||t;if(r?b.reasoning={...b.reasoning&&"object"==typeof b.reasoning?b.reasoning:{},effort:B(p,r)}:u&&(b.reasoning={...b.reasoning&&"object"==typeof b.reasoning?b.reasoning:{},effort:B(p,u)}),delete b.reasoning_effort,delete b.max_tokens,delete b.max_output_tokens,delete b.background,!b.prompt_cache_key){let a=this.getPromptCacheSessionId(d,b);a&&(b.prompt_cache_key=a)}return delete b.session_id,delete b.conversation_id,f||(delete b.temperature,delete b.top_p,delete b.frequency_penalty,delete b.presence_penalty,delete b.logprobs,delete b.top_logprobs,delete b.n,delete b.seed,delete b.user,delete b.prompt_cache_retention,delete b.metadata,delete b.stream_options,delete b.safety_identifier),b}}}};
|