diff --git a/package.json b/package.json index a541e3f..73c7426 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "figma-ai-plugin", - "version": "0.1.11", + "version": "0.1.12", "private": true, "dependencies": { "@create-figma-plugin/ui": "^4.0.3", diff --git a/src/apinex-models.ts b/src/apinex-models.ts new file mode 100644 index 0000000..4852ab0 --- /dev/null +++ b/src/apinex-models.ts @@ -0,0 +1,33 @@ +// Auto-generated from apinex /v1/models (bundled; Figma plugin sandbox has no network egress). +export const APINEX_MODELS: string[] = [ + "claude-fable-5.1", + "claude-opus-5", + "claude-sonnet-5", + "deepseek-v4-flash", + "deepseek-v4-pro", + "deepseek-v4.1-flash", + "free/claude-opus-4.6", + "free/claude-sonnet-4.6", + "free/deepseek-v4-flash-0731", + "free/deepseek-v4-pro-0813", + "free/deepseek-v4.1-flash", + "free/glm-5.3-flash", + "free/gemini-3.1-pro", + "free/gemini-3.8-flash", + "free/gpt-5.6-luna", + "free/hy4", + "free/kimi-k3", + "free/mimo-v2.5", + "free/muse-spark-1.3", + "free/qwen-3.8-max", + "gemini-3.1-pro", + "gemini-3.8-flash", + "kimi-k3", + "gpt-5.6-luna", + "gpt-5.6-sol", + "gpt-5.6-terra", + "gpt-6-astra", + "glm-5.3", + "glm-5.3-flash", + "grok-4.6" +] diff --git a/src/settings.ts b/src/settings.ts index deca9ce..22ca1cf 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -3,6 +3,8 @@ // No server auth yet — everything lives on the Figma file locally. Backup/restore // is just a JSON export/import of this same document. (Server auth comes later.) +import { APINEX_MODELS } from './apinex-models' + export type ProviderType = 'apinex' export interface ProviderConfig { @@ -47,7 +49,7 @@ export function createApinexProvider (): ProviderConfig { baseUrl: APINEX_BASE_URL, apiKey: '', defaultModel: '', - models: [] + models: APINEX_MODELS } } diff --git a/src/ui.tsx b/src/ui.tsx index d19e8c4..d54de82 100644 --- a/src/ui.tsx +++ b/src/ui.tsx @@ -22,6 +22,7 @@ import { h, Fragment, Component } from 'preact' import { useState, useEffect, useRef } from 'preact/hooks' import MenuItem from './MenuItem' import { type Settings, type ProviderConfig, defaultSettings, loadSettings, saveSettings, settingsToJSON, settingsFromJSON, APINEX_BASE_URL } from './settings' +import { APINEX_MODELS } from './apinex-models' const MIN_WINDOW_SIZE = { width: 320, height: 200 } // No static max: "maximize" targets the whole viewport (maxViewport from main), @@ -29,7 +30,7 @@ const MIN_WINDOW_SIZE = { width: 320, height: 200 } // very high — actual clamp is done by main via clampWindowSize (bounds*zoom). // Full plugin version shown in the footer status bar. Keep in sync with package.json "version". -const PLUGIN_VERSION = '0.1.11' +const PLUGIN_VERSION = '0.1.12' const fieldStyle = { display: 'flex', @@ -121,7 +122,7 @@ function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) : 'Failed to load models' logEvent(' error: ' + msg) if (payload.raw != null) logEvent(' RAW: ' + String(payload.raw).slice(0, 1000)) - setModelsError(msg) + setModelsError('Live fetch unavailable (sandbox has no internet) — using bundled list') return } logEvent(' models parsed=' + (payload.models ? payload.models.length : 0)) @@ -197,6 +198,8 @@ function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) return No provider configured. } + const modelOptions = (provider.models && provider.models.length > 0) ? provider.models : APINEX_MODELS + return (
@@ -218,10 +221,10 @@ function SettingsPanel (props: { settings: Settings, setSettings: (s: Settings) Default model
0 ? 'Select model' : 'Fetch models first'} + placeholder='Select model' value={provider.defaultModel === '' ? null : provider.defaultModel} onValueChange={function (id: string) { patch({ defaultModel: id }) }} - options={(provider.models || []).map(function (m) { return { value: m, text: m } })} + options={modelOptions.map(function (m) { return { value: m, text: m } })} />