Files

1 line
28 KiB
JSON

{"repo": "asphyksia/koda", "files": {"app/src/main/java/dev/koda/data/ProviderCatalog.java": {"f185e6061df93721ae703cda633bcd374423ee5f": {"t": 1785746114.605672, "n": 7596, "h": "f18ca48d4f0b9dc8", "c": "package dev.koda.data;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Static catalog of all LLM providers supported by Koda.\n * Add new providers here — no other code changes needed for basic support.\n */\npublic final class ProviderCatalog {\n\n private ProviderCatalog() {}\n\n // ─── RelayGPU ─────────────────────────────────────────────────────────────\n public static final ProviderDef RELAYGPU = new ProviderDef(\n \"relaygpu\",\n \"RelayGPU\",\n \"Multi-model relay — OpenAI and Anthropic endpoints\",\n \"⚡\",\n Arrays.asList(\n new ProviderDef.AccessMode(\n \"Anthropic Models\",\n ProviderDef.API_TYPE_ANTHROPIC,\n \"https://relay.opengpu.network/v2/anthropic/v1\",\n false, true,\n Arrays.asList(\n \"anthropic/claude-sonnet-4-6\",\n \"anthropic/claude-opus-4-6\"\n ),\n \"anthropic/claude-sonnet-4-6\"\n ),\n new ProviderDef.AccessMode(\n \"OpenAI-Compatible\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://relay.opengpu.network/v2/openai/v1\",\n false, true,\n Arrays.asList(\n \"openai/gpt-5.2\",\n \"openai/gpt-5.4\",\n \"deepseek-ai/DeepSeek-V3.1\",\n \"Qwen/Qwen3.5-397B-A17B-FP8\",\n \"moonshotai/kimi-k2.5\",\n \"infercom/DeepSeek-V3.1\",\n \"infercom/MiniMax-M2.5\"\n ),\n \"openai/gpt-5.2\"\n )\n )\n );\n\n // ─── Anthropic ────────────────────────────────────────────────────────────\n public static final ProviderDef ANTHROPIC = ProviderDef.standard(\n \"anthropic\", \"Anthropic\", \"Claude models — direct API\",\n \"🤖\",\n ProviderDef.API_TYPE_ANTHROPIC,\n \"https://api.anthropic.com/v1\",\n \"claude-sonnet-4-5\",\n \"claude-opus-4-5\", \"claude-sonnet-4-5\", \"claude-haiku-3-5\"\n );\n\n // ─── OpenAI ───────────────────────────────────────────────────────────────\n public static final ProviderDef OPENAI = ProviderDef.standard(\n \"openai\", \"OpenAI\", \"GPT models — direct API\",\n \"🟢\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.openai.com/v1\",\n \"gpt-4o\",\n \"gpt-4o\", \"gpt-4o-mini\", \"o3\", \"o4-mini\"\n );\n\n // ─── OpenRouter ───────────────────────────────────────────────────────────\n public static final ProviderDef OPENROUTER = ProviderDef.standard(\n \"openrouter\", \"OpenRouter\", \"Unified gateway to 200+ models\",\n \"🔀\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://openrouter.ai/api/v1\",\n \"anthropic/claude-sonnet-4-5\",\n \"anthropic/claude-opus-4-5\", \"anthropic/claude-sonnet-4-5\",\n \"openai/gpt-4o\", \"google/gemini-2.0-flash\"\n );\n\n // ─── Groq ─────────────────────────────────────────────────────────────────\n public static final ProviderDef GROQ = ProviderDef.standard(\n \"groq\", \"Groq\", \"Ultra-fast inference\",\n \"🚀\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.groq.com/openai/v1\",\n \"llama-3.3-70b-versatile\",\n \"llama-3.3-70b-versatile\", \"llama-3.1-8b-instant\", \"moonshotai/kimi-k2-instruct\"\n );\n\n // ─── DeepSeek ─────────────────────────────────────────────────────────────\n public static final ProviderDef DEEPSEEK = ProviderDef.standard(\n \"deepseek\", \"DeepSeek\", \"Reasoning and coding models\",\n \"🐋\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.deepseek.com/v1\",\n \"deepseek-chat\",\n \"deepseek-chat\", \"deepseek-reasoner\"\n );\n\n // ─── Mistral ──────────────────────────────────────────────────────────────\n public static final ProviderDef MISTRAL = ProviderDef.standard(\n \"mistral\", \"Mistral\", \"European open-weight models\",\n \"🌊\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.mistral.ai/v1\",\n \"mistral-large-latest\",\n \"mistral-large-latest\", \"mistral-small-latest\", \"codestral-latest\"\n );\n\n // ─── Together AI ──────────────────────────────────────────────────────────\n public static final ProviderDef TOGETHER = ProviderDef.standard(\n \"together\", \"Together AI\", \"Open-source models at scale\",\n \"🤝\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.together.xyz/v1\",\n \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n \"deepseek-ai/DeepSeek-V3\",\n \"Qwen/Qwen3-235B-A22B\"\n );\n\n // ─── NVIDIA NIM ───────────────────────────────────────────────────────────\n public static final ProviderDef NVIDIA = ProviderDef.standard(\n \"nvidia\", \"NVIDIA NIM\", \"133+ models on NVIDIA GPU cloud\",\n \"🖥️\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://integrate.api.nvidia.com/v1\",\n \"meta/llama-3.3-70b-instruct\",\n \"meta/llama-3.3-70b-instruct\",\n \"nvidia/llama-3.3-nemotron-super-49b-v1\",\n \"nvidia/llama-3.1-nemotron-ultra-253b-v1\",\n \"qwen/qwen3.5-397b-a17b\",\n \"mistralai/mistral-large-3-675b-instruct-2512\",\n \"deepseek-ai/deepseek-v3.2\",\n \"meta/llama-4-maverick-17b-128e-instruct\"\n );\n\n // ─── Azure OpenAI ─────────────────────────────────────────────────────────\n public static final ProviderDef AZURE = new ProviderDef(\n \"azure\",\n \"Azure OpenAI\",\n \"Microsoft-hosted OpenAI — custom endpoint\",\n \"☁️\",\n Collections.singletonList(\n new ProviderDef.AccessMode(\n \"Custom Deployment\",\n ProviderDef.API_TYPE_OPENAI,\n \"\", // user must supply their deployment URL\n true, true,\n Arrays.asList(\"gpt-4o\", \"gpt-4o-mini\", \"o3\"),\n \"gpt-4o\"\n )\n )\n );\n\n // ─── Custom ───────────────────────────────────────────────────────────────\n public static final ProviderDef CUSTOM = new ProviderDef(\n \"custom\",\n \"Custom Endpoint\",\n \"Any OpenAI-compatible API\",\n \"🔧\",\n Collections.singletonList(\n new ProviderDef.AccessMode(\n \"OpenAI-Compatible\",\n ProviderDef.API_TYPE_OPENAI,\n \"\",\n true, true,\n Collections.emptyList(),\n \"\"\n )\n )\n );\n\n // ─── Priority-ordered lists ───────────────────────────────────────────────\n\n /** Tier 1 — shown prominently at top */\n public static final List<ProviderDef> PRIORITY = Arrays.asList(\n RELAYGPU, ANTHROPIC, OPENAI, OPENROUTER, GROQ, DEEPSEEK\n );\n\n /** Tier 2 — shown in \"More providers\" section */\n public static final List<ProviderDef> SECONDARY = Arrays.asList(\n MISTRAL, TOGETHER, NVIDIA, AZURE\n );\n\n /** Tier 3 — always at bottom */\n public static final List<ProviderDef> ADVANCED = Collections.singletonList(\n CUSTOM\n );\n\n /** Flat list in display order */\n public static List<ProviderDef> all() {\n List<ProviderDef> all = new java.util.ArrayList<>();\n all.addAll(PRIORITY);\n all.addAll(SECONDARY);\n all.addAll(ADVANCED);\n return Collections.unmodifiableList(all);\n }\n\n /** Find a provider by its ID. Returns null if not found. */\n public static ProviderDef findById(String id) {\n if (id == null) return null;\n for (ProviderDef p : all()) {\n if (p.id.equals(id)) return p;\n }\n return null;\n }\n}\n"}, "a56e2c1e24a4881e164f15acf5aa1dca0972c288": {"t": 1785759976.1587071, "n": 7596, "h": "f18ca48d4f0b9dc8", "c": "package dev.koda.data;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Static catalog of all LLM providers supported by Koda.\n * Add new providers here — no other code changes needed for basic support.\n */\npublic final class ProviderCatalog {\n\n private ProviderCatalog() {}\n\n // ─── RelayGPU ─────────────────────────────────────────────────────────────\n public static final ProviderDef RELAYGPU = new ProviderDef(\n \"relaygpu\",\n \"RelayGPU\",\n \"Multi-model relay — OpenAI and Anthropic endpoints\",\n \"⚡\",\n Arrays.asList(\n new ProviderDef.AccessMode(\n \"Anthropic Models\",\n ProviderDef.API_TYPE_ANTHROPIC,\n \"https://relay.opengpu.network/v2/anthropic/v1\",\n false, true,\n Arrays.asList(\n \"anthropic/claude-sonnet-4-6\",\n \"anthropic/claude-opus-4-6\"\n ),\n \"anthropic/claude-sonnet-4-6\"\n ),\n new ProviderDef.AccessMode(\n \"OpenAI-Compatible\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://relay.opengpu.network/v2/openai/v1\",\n false, true,\n Arrays.asList(\n \"openai/gpt-5.2\",\n \"openai/gpt-5.4\",\n \"deepseek-ai/DeepSeek-V3.1\",\n \"Qwen/Qwen3.5-397B-A17B-FP8\",\n \"moonshotai/kimi-k2.5\",\n \"infercom/DeepSeek-V3.1\",\n \"infercom/MiniMax-M2.5\"\n ),\n \"openai/gpt-5.2\"\n )\n )\n );\n\n // ─── Anthropic ────────────────────────────────────────────────────────────\n public static final ProviderDef ANTHROPIC = ProviderDef.standard(\n \"anthropic\", \"Anthropic\", \"Claude models — direct API\",\n \"🤖\",\n ProviderDef.API_TYPE_ANTHROPIC,\n \"https://api.anthropic.com/v1\",\n \"claude-sonnet-4-5\",\n \"claude-opus-4-5\", \"claude-sonnet-4-5\", \"claude-haiku-3-5\"\n );\n\n // ─── OpenAI ───────────────────────────────────────────────────────────────\n public static final ProviderDef OPENAI = ProviderDef.standard(\n \"openai\", \"OpenAI\", \"GPT models — direct API\",\n \"🟢\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.openai.com/v1\",\n \"gpt-4o\",\n \"gpt-4o\", \"gpt-4o-mini\", \"o3\", \"o4-mini\"\n );\n\n // ─── OpenRouter ───────────────────────────────────────────────────────────\n public static final ProviderDef OPENROUTER = ProviderDef.standard(\n \"openrouter\", \"OpenRouter\", \"Unified gateway to 200+ models\",\n \"🔀\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://openrouter.ai/api/v1\",\n \"anthropic/claude-sonnet-4-5\",\n \"anthropic/claude-opus-4-5\", \"anthropic/claude-sonnet-4-5\",\n \"openai/gpt-4o\", \"google/gemini-2.0-flash\"\n );\n\n // ─── Groq ─────────────────────────────────────────────────────────────────\n public static final ProviderDef GROQ = ProviderDef.standard(\n \"groq\", \"Groq\", \"Ultra-fast inference\",\n \"🚀\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.groq.com/openai/v1\",\n \"llama-3.3-70b-versatile\",\n \"llama-3.3-70b-versatile\", \"llama-3.1-8b-instant\", \"moonshotai/kimi-k2-instruct\"\n );\n\n // ─── DeepSeek ─────────────────────────────────────────────────────────────\n public static final ProviderDef DEEPSEEK = ProviderDef.standard(\n \"deepseek\", \"DeepSeek\", \"Reasoning and coding models\",\n \"🐋\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.deepseek.com/v1\",\n \"deepseek-chat\",\n \"deepseek-chat\", \"deepseek-reasoner\"\n );\n\n // ─── Mistral ──────────────────────────────────────────────────────────────\n public static final ProviderDef MISTRAL = ProviderDef.standard(\n \"mistral\", \"Mistral\", \"European open-weight models\",\n \"🌊\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.mistral.ai/v1\",\n \"mistral-large-latest\",\n \"mistral-large-latest\", \"mistral-small-latest\", \"codestral-latest\"\n );\n\n // ─── Together AI ──────────────────────────────────────────────────────────\n public static final ProviderDef TOGETHER = ProviderDef.standard(\n \"together\", \"Together AI\", \"Open-source models at scale\",\n \"🤝\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.together.xyz/v1\",\n \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n \"deepseek-ai/DeepSeek-V3\",\n \"Qwen/Qwen3-235B-A22B\"\n );\n\n // ─── NVIDIA NIM ───────────────────────────────────────────────────────────\n public static final ProviderDef NVIDIA = ProviderDef.standard(\n \"nvidia\", \"NVIDIA NIM\", \"133+ models on NVIDIA GPU cloud\",\n \"🖥️\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://integrate.api.nvidia.com/v1\",\n \"meta/llama-3.3-70b-instruct\",\n \"meta/llama-3.3-70b-instruct\",\n \"nvidia/llama-3.3-nemotron-super-49b-v1\",\n \"nvidia/llama-3.1-nemotron-ultra-253b-v1\",\n \"qwen/qwen3.5-397b-a17b\",\n \"mistralai/mistral-large-3-675b-instruct-2512\",\n \"deepseek-ai/deepseek-v3.2\",\n \"meta/llama-4-maverick-17b-128e-instruct\"\n );\n\n // ─── Azure OpenAI ─────────────────────────────────────────────────────────\n public static final ProviderDef AZURE = new ProviderDef(\n \"azure\",\n \"Azure OpenAI\",\n \"Microsoft-hosted OpenAI — custom endpoint\",\n \"☁️\",\n Collections.singletonList(\n new ProviderDef.AccessMode(\n \"Custom Deployment\",\n ProviderDef.API_TYPE_OPENAI,\n \"\", // user must supply their deployment URL\n true, true,\n Arrays.asList(\"gpt-4o\", \"gpt-4o-mini\", \"o3\"),\n \"gpt-4o\"\n )\n )\n );\n\n // ─── Custom ───────────────────────────────────────────────────────────────\n public static final ProviderDef CUSTOM = new ProviderDef(\n \"custom\",\n \"Custom Endpoint\",\n \"Any OpenAI-compatible API\",\n \"🔧\",\n Collections.singletonList(\n new ProviderDef.AccessMode(\n \"OpenAI-Compatible\",\n ProviderDef.API_TYPE_OPENAI,\n \"\",\n true, true,\n Collections.emptyList(),\n \"\"\n )\n )\n );\n\n // ─── Priority-ordered lists ───────────────────────────────────────────────\n\n /** Tier 1 — shown prominently at top */\n public static final List<ProviderDef> PRIORITY = Arrays.asList(\n RELAYGPU, ANTHROPIC, OPENAI, OPENROUTER, GROQ, DEEPSEEK\n );\n\n /** Tier 2 — shown in \"More providers\" section */\n public static final List<ProviderDef> SECONDARY = Arrays.asList(\n MISTRAL, TOGETHER, NVIDIA, AZURE\n );\n\n /** Tier 3 — always at bottom */\n public static final List<ProviderDef> ADVANCED = Collections.singletonList(\n CUSTOM\n );\n\n /** Flat list in display order */\n public static List<ProviderDef> all() {\n List<ProviderDef> all = new java.util.ArrayList<>();\n all.addAll(PRIORITY);\n all.addAll(SECONDARY);\n all.addAll(ADVANCED);\n return Collections.unmodifiableList(all);\n }\n\n /** Find a provider by its ID. Returns null if not found. */\n public static ProviderDef findById(String id) {\n if (id == null) return null;\n for (ProviderDef p : all()) {\n if (p.id.equals(id)) return p;\n }\n return null;\n }\n}\n"}, "7da80902388b80a636d0ebf064666f5d48d395c4": {"t": 1785759978.1829531, "n": 7354, "h": "5fb8454a4e583c79", "c": "package dev.koda.data;\n\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.List;\n\n/**\n * Static catalog of all LLM providers supported by Koda.\n * Add new providers here — no other code changes needed for basic support.\n */\npublic final class ProviderCatalog {\n\n private ProviderCatalog() {}\n\n // ─── RelayGPU ─────────────────────────────────────────────────────────────\n public static final ProviderDef RELAYGPU = new ProviderDef(\n \"relaygpu\",\n \"RelayGPU\",\n \"Multi-model relay — OpenAI and Anthropic endpoints\",\n \"⚡\",\n Arrays.asList(\n new ProviderDef.AccessMode(\n \"Anthropic Models\",\n ProviderDef.API_TYPE_ANTHROPIC,\n \"https://relay.opengpu.network/v2/anthropic/v1\",\n false, true,\n Arrays.asList(\n \"anthropic/claude-sonnet-4-6\",\n \"anthropic/claude-opus-4-6\"\n ),\n \"anthropic/claude-sonnet-4-6\"\n ),\n new ProviderDef.AccessMode(\n \"OpenAI-Compatible\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://relay.opengpu.network/v2/openai/v1\",\n false, true,\n Arrays.asList(\n \"openai/gpt-5.2\",\n \"openai/gpt-5.4\",\n \"deepseek-ai/DeepSeek-V3.1\",\n \"Qwen/Qwen3.5-397B-A17B-FP8\",\n \"moonshotai/kimi-k2.5\",\n \"infercom/DeepSeek-V3.1\",\n \"infercom/MiniMax-M2.5\"\n ),\n \"openai/gpt-5.2\"\n )\n )\n );\n\n // ─── Anthropic ────────────────────────────────────────────────────────────\n public static final ProviderDef ANTHROPIC = ProviderDef.standard(\n \"anthropic\", \"Anthropic\", \"Claude models — direct API\",\n \"🤖\",\n ProviderDef.API_TYPE_ANTHROPIC,\n \"https://api.anthropic.com/v1\",\n \"claude-sonnet-4-5\",\n \"claude-opus-4-5\", \"claude-sonnet-4-5\", \"claude-haiku-3-5\"\n );\n\n // ─── OpenAI ───────────────────────────────────────────────────────────────\n public static final ProviderDef OPENAI = ProviderDef.standard(\n \"openai\", \"OpenAI\", \"GPT models — direct API\",\n \"🟢\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.openai.com/v1\",\n \"gpt-4o\",\n \"gpt-4o\", \"gpt-4o-mini\", \"o3\", \"o4-mini\"\n );\n\n // ─── OpenRouter ───────────────────────────────────────────────────────────\n public static final ProviderDef OPENROUTER = ProviderDef.standard(\n \"openrouter\", \"OpenRouter\", \"Unified gateway to 200+ models\",\n \"🔀\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://openrouter.ai/api/v1\",\n \"anthropic/claude-sonnet-4-5\",\n \"anthropic/claude-opus-4-5\", \"anthropic/claude-sonnet-4-5\",\n \"openai/gpt-4o\", \"google/gemini-2.0-flash\"\n );\n\n // ─── Groq ─────────────────────────────────────────────────────────────────\n public static final ProviderDef GROQ = ProviderDef.standard(\n \"groq\", \"Groq\", \"Ultra-fast inference\",\n \"🚀\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.groq.com/openai/v1\",\n \"llama-3.3-70b-versatile\",\n \"llama-3.3-70b-versatile\", \"llama-3.1-8b-instant\", \"moonshotai/kimi-k2-instruct\"\n );\n\n // ─── DeepSeek ─────────────────────────────────────────────────────────────\n public static final ProviderDef DEEPSEEK = ProviderDef.standard(\n \"deepseek\", \"DeepSeek\", \"Reasoning and coding models\",\n \"🐋\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.deepseek.com/v1\",\n \"deepseek-chat\",\n \"deepseek-chat\", \"deepseek-reasoner\"\n );\n\n // ─── Mistral ──────────────────────────────────────────────────────────────\n public static final ProviderDef MISTRAL = ProviderDef.standard(\n \"mistral\", \"Mistral\", \"European open-weight models\",\n \"🌊\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.mistral.ai/v1\",\n \"mistral-large-latest\",\n \"mistral-large-latest\", \"mistral-small-latest\", \"codestral-latest\"\n );\n\n // ─── Together AI ──────────────────────────────────────────────────────────\n public static final ProviderDef TOGETHER = ProviderDef.standard(\n \"together\", \"Together AI\", \"Open-source models at scale\",\n \"🤝\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://api.together.xyz/v1\",\n \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n \"meta-llama/Llama-3.3-70B-Instruct-Turbo\",\n \"deepseek-ai/DeepSeek-V3\",\n \"Qwen/Qwen3-235B-A22B\"\n );\n\n // ─── NVIDIA NIM ───────────────────────────────────────────────────────────\n public static final ProviderDef NVIDIA = ProviderDef.standard(\n \"nvidia\", \"NVIDIA NIM\", \"GPU-accelerated inference\",\n \"🖥️\",\n ProviderDef.API_TYPE_OPENAI,\n \"https://integrate.api.nvidia.com/v1\",\n \"meta/llama-3.3-70b-instruct\",\n \"meta/llama-3.3-70b-instruct\", \"nvidia/llama-3.1-nemotron-ultra-253b-v1\"\n );\n\n // ─── Azure OpenAI ─────────────────────────────────────────────────────────\n public static final ProviderDef AZURE = new ProviderDef(\n \"azure\",\n \"Azure OpenAI\",\n \"Microsoft-hosted OpenAI — custom endpoint\",\n \"☁️\",\n Collections.singletonList(\n new ProviderDef.AccessMode(\n \"Custom Deployment\",\n ProviderDef.API_TYPE_OPENAI,\n \"\", // user must supply their deployment URL\n true, true,\n Arrays.asList(\"gpt-4o\", \"gpt-4o-mini\", \"o3\"),\n \"gpt-4o\"\n )\n )\n );\n\n // ─── Custom ───────────────────────────────────────────────────────────────\n public static final ProviderDef CUSTOM = new ProviderDef(\n \"custom\",\n \"Custom Endpoint\",\n \"Any OpenAI-compatible API\",\n \"🔧\",\n Collections.singletonList(\n new ProviderDef.AccessMode(\n \"OpenAI-Compatible\",\n ProviderDef.API_TYPE_OPENAI,\n \"\",\n true, true,\n Collections.emptyList(),\n \"\"\n )\n )\n );\n\n // ─── Priority-ordered lists ───────────────────────────────────────────────\n\n /** Tier 1 — shown prominently at top */\n public static final List<ProviderDef> PRIORITY = Arrays.asList(\n RELAYGPU, ANTHROPIC, OPENAI, OPENROUTER, GROQ, DEEPSEEK\n );\n\n /** Tier 2 — shown in \"More providers\" section */\n public static final List<ProviderDef> SECONDARY = Arrays.asList(\n MISTRAL, TOGETHER, NVIDIA, AZURE\n );\n\n /** Tier 3 — always at bottom */\n public static final List<ProviderDef> ADVANCED = Collections.singletonList(\n CUSTOM\n );\n\n /** Flat list in display order */\n public static List<ProviderDef> all() {\n List<ProviderDef> all = new java.util.ArrayList<>();\n all.addAll(PRIORITY);\n all.addAll(SECONDARY);\n all.addAll(ADVANCED);\n return Collections.unmodifiableList(all);\n }\n\n /** Find a provider by its ID. Returns null if not found. */\n public static ProviderDef findById(String id) {\n if (id == null) return null;\n for (ProviderDef p : all()) {\n if (p.id.equals(id)) return p;\n }\n return null;\n }\n}\n"}}}}