fix: hardcode model list — Raycast runtime doesn't expose AI.Model object

@raycast/api ships only types, no runtime JS. AI.Model is injected by
Raycast at runtime and Object.entries() returned an unpredictable
(and incomplete) subset — so half the current models were missing
from the in-view dropdown.

Replace the dynamic derivation with an explicit curated list covering
all 55+ non-deprecated entries from the SDK type defs, ordered by
provider with the strongest models first. Update README to point at
src/ai.ts as the place to keep this in sync with future SDK bumps.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
muena
2026-05-20 07:18:27 +02:00
parent c0078ce339
commit cc4742cf38
2 changed files with 68 additions and 17 deletions

View File

@@ -17,7 +17,7 @@ Alle Werte sind in den Raycast-Einstellungen pro Extension einstellbar.
**Verhalten:**
- `Standard-Sitzungsmodus``Aktive Sitzung wiederverwenden` (Default), `Neue Sitzung pro Anfrage`, `Tagessitzung`
- `Ausgabe der Schnellbefehle``In die Zwischenablage kopieren` (Default) oder `Am Cursor einfügen`
- `Standard-Modell für AI-Befehle` — Modell-ID, die in den AI-Views vorausgewählt ist (Default `anthropic-claude-sonnet-4-6`, benötigt Raycast Pro). Die vollständige Modellliste leiten die Views dynamisch aus `AI.Model` der Raycast-API ab — sobald ein neues Modell verfügbar ist, taucht es ohne Code-Änderung im View-Dropdown auf.
- `Standard-Modell für AI-Befehle` — Modell-ID, die in den AI-Views vorausgewählt ist (Default `anthropic-claude-sonnet-4-6`, benötigt Raycast Pro). Die View-Dropdowns listen aktuelle Modelle aus `src/ai.ts`; neue Modelle dort eintragen, wenn Raycast sie ausrollt.
- `Eigener Name` — Default-Signatur für AI-generierte Email-Antworten, im Antwort-Befehl pro Aufruf überschreibbar
- `Maximale Anzahl gespeicherter Sitzungen` — älteste werden geprunt (Default 20)
- `Raycast nach Kopieren/Einfügen schließen` — Auto-Close und Pop-To-Root nach AI-Workflow-Abschluss (Default an)

View File

@@ -1,5 +1,3 @@
import { AI } from "@raycast/api";
export type Creativity = "none" | "low" | "medium" | "high";
export const CREATIVITY_OPTIONS: Creativity[] = [
@@ -11,20 +9,73 @@ export const CREATIVITY_OPTIONS: Creativity[] = [
export type ModelOption = { value: string; title: string };
function buildModelOptions(): ModelOption[] {
const seen = new Set<string>();
const options: ModelOption[] = [];
for (const [key, value] of Object.entries(AI.Model) as Array<
[string, string]
>) {
if (seen.has(value)) continue;
seen.add(value);
options.push({ value, title: key.replace(/_/g, " ") });
}
return options;
}
export const MODEL_OPTIONS: ModelOption[] = buildModelOptions();
export const MODEL_OPTIONS: ModelOption[] = [
{ value: "anthropic-claude-opus-4-7", title: "Claude 4.7 Opus" },
{ value: "anthropic-claude-sonnet-4-6", title: "Claude 4.6 Sonnet" },
{ value: "anthropic-claude-opus-4-6", title: "Claude 4.6 Opus" },
{ value: "anthropic-claude-sonnet-4-5", title: "Claude 4.5 Sonnet" },
{ value: "anthropic-claude-opus-4-5", title: "Claude 4.5 Opus" },
{ value: "anthropic-claude-4-5-haiku", title: "Claude 4.5 Haiku" },
{ value: "anthropic-claude-sonnet-4", title: "Claude 4 Sonnet" },
{ value: "openai-gpt-5.4", title: "OpenAI GPT-5.4" },
{ value: "openai-gpt-5.4-mini", title: "OpenAI GPT-5.4 Mini" },
{ value: "openai-gpt-5.4-nano", title: "OpenAI GPT-5.4 Nano" },
{ value: "openai-gpt-5.3-instant", title: "OpenAI GPT-5.3 Instant" },
{ value: "openai-gpt-5.3-codex", title: "OpenAI GPT-5.3 Codex" },
{ value: "openai-gpt-5.2", title: "OpenAI GPT-5.2" },
{ value: "openai-gpt-5.2-instant", title: "OpenAI GPT-5.2 Instant" },
{ value: "openai-gpt-5.1", title: "OpenAI GPT-5.1" },
{ value: "openai-gpt-5.1-instant", title: "OpenAI GPT-5.1 Instant" },
{ value: "openai-gpt-5.1-codex", title: "OpenAI GPT-5.1 Codex" },
{ value: "openai_o1-gpt-5", title: "OpenAI GPT-5" },
{ value: "openai-gpt-5-mini", title: "OpenAI GPT-5 Mini" },
{ value: "openai-gpt-5-nano", title: "OpenAI GPT-5 Nano" },
{ value: "openai-gpt-4.1", title: "OpenAI GPT-4.1" },
{ value: "openai-gpt-4.1-mini", title: "OpenAI GPT-4.1 Mini" },
{ value: "openai-gpt-4.1-nano", title: "OpenAI GPT-4.1 Nano" },
{ value: "openai-gpt-4o", title: "OpenAI GPT-4o" },
{ value: "openai-gpt-4o-mini", title: "OpenAI GPT-4o mini" },
{ value: "openai_o1-o3", title: "OpenAI o3" },
{ value: "openai_o1-o3-mini", title: "OpenAI o3-mini" },
{ value: "openai_o1-o4-mini", title: "OpenAI o4-mini" },
{ value: "openai_o1-o1", title: "OpenAI o1" },
{ value: "google-gemini-3.1-pro", title: "Google Gemini 3.1 Pro" },
{ value: "google-gemini-3-flash", title: "Google Gemini 3 Flash" },
{
value: "google-gemini-3.1-flash-lite",
title: "Google Gemini 3.1 Flash Lite",
},
{ value: "google-gemini-2.5-pro", title: "Google Gemini 2.5 Pro" },
{ value: "google-gemini-2.5-flash", title: "Google Gemini 2.5 Flash" },
{
value: "google-gemini-2.5-flash-lite",
title: "Google Gemini 2.5 Flash Lite",
},
{ value: "xai-grok-4.20", title: "xAI Grok 4.20" },
{ value: "xai-grok-4", title: "xAI Grok 4" },
{ value: "xai-grok-4-fast", title: "xAI Grok 4 Fast" },
{ value: "xai-grok-4-1-fast", title: "xAI Grok 4.1 Fast" },
{ value: "xai-grok-code-fast", title: "xAI Grok Code Fast" },
{ value: "perplexity-sonar-pro", title: "Perplexity Sonar Pro" },
{ value: "perplexity-sonar", title: "Perplexity Sonar" },
{ value: "mistral-mistral-large-latest", title: "Mistral Large" },
{ value: "mistral-mistral-medium-latest", title: "Mistral Medium" },
{ value: "mistral-mistral-small-latest", title: "Mistral Small" },
{ value: "mistral-codestral-latest", title: "Mistral Codestral" },
{ value: "mistral-open-mistral-nemo", title: "Mistral Nemo" },
{ value: "groq-llama-3.3-70b-versatile", title: "Groq Llama 3.3 70B" },
{
value: "groq-meta-llama/llama-4-scout-17b-16e-instruct",
title: "Groq Llama 4 Scout",
},
{ value: "groq-llama-3.1-8b-instant", title: "Groq Llama 3.1 8B" },
{ value: "groq-qwen/qwen3-32b", title: "Groq Qwen3 32B" },
{ value: "groq-openai/gpt-oss-120b", title: "Groq GPT-OSS 120B" },
{ value: "groq-openai/gpt-oss-20b", title: "Groq GPT-OSS 20B" },
{ value: "together-deepseek-ai/DeepSeek-R1", title: "DeepSeek R1" },
{ value: "together-deepseek-ai/DeepSeek-V3", title: "DeepSeek V3" },
{ value: "together-moonshotai/Kimi-K2.5", title: "Kimi K2.5" },
];
export const STRICT_PLACEHOLDER_RULE = [
"STRENGE REGEL: Gib jeden Platzhalter zeichengetreu (inklusive spitzer Klammern, Großbuchstaben und Unterstrich + Nummer) zurück.",