From 122370a43403c7146059e929f9ed553facb1d8fa Mon Sep 17 00:00:00 2001 From: Renziiiii Date: Tue, 23 Jun 2026 11:15:17 -0300 Subject: [PATCH] feat: add OpenRouter as LLM provider MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds OpenRouter support using the existing OpenAI-compatible API endpoint. Reuses createOpenAI() with baseURL set to https://openrouter.ai/api/v1. Includes 16 popular models from OpenAI, Anthropic, Google, Meta, DeepSeek, Qwen, and Mistral — all accessible through a single OpenRouter API key. --- browse-bot.uc.mjs | 54 +++++++++++++++++++++++++ preferences.json | 101 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) diff --git a/browse-bot.uc.mjs b/browse-bot.uc.mjs index 73e2775..6d7905c 100644 --- a/browse-bot.uc.mjs +++ b/browse-bot.uc.mjs @@ -140,6 +140,8 @@ class BrowseBotPREFS extends PREFS { static CEREBRAS_MODEL = "extension.browse-bot.cerebras-model"; static OLLAMA_MODEL = "extension.browse-bot.ollama-model"; static OLLAMA_BASE_URL = "extension.browse-bot.ollama-base-url"; + static OPENROUTER_API_KEY = "extension.browse-bot.openrouter-api-key"; + static OPENROUTER_MODEL = "extension.browse-bot.openrouter-model"; static LLM_TEMPERATURE = "extension.browse-bot.llm.temperature"; static LLM_TOP_P = "extension.browse-bot.llm.top-p"; static LLM_TOP_K = "extension.browse-bot.llm.top-k"; @@ -180,6 +182,8 @@ class BrowseBotPREFS extends PREFS { [BrowseBotPREFS.CEREBRAS_MODEL]: "llama3.1-8b", [BrowseBotPREFS.OLLAMA_MODEL]: "llama2", [BrowseBotPREFS.OLLAMA_BASE_URL]: "http://localhost:11434/api", + [BrowseBotPREFS.OPENROUTER_API_KEY]: "", + [BrowseBotPREFS.OPENROUTER_MODEL]: "google/gemini-2.5-flash", [BrowseBotPREFS.DND_ENABLED]: !0, [BrowseBotPREFS.POSITION]: "top-right", [BrowseBotPREFS.REMEMBER_DIMENSIONS]: !0, @@ -3450,6 +3454,55 @@ var providerPrototype = { baseURL: this.baseUrl })(this.model); } +}), openrouter = Object.assign(Object.create(providerPrototype), { + name: "openrouter", + label: "OpenRouter", + faviconUrl: googleFaviconAPI("openrouter.ai"), + apiKeyUrl: "https://openrouter.ai/keys", + AVAILABLE_MODELS: [ + "openai/gpt-4.1", + "openai/gpt-4.1-mini", + "openai/gpt-4o", + "openai/gpt-4o-mini", + "openai/o3-mini", + "openai/o4-mini", + "anthropic/claude-sonnet-4-20250514", + "anthropic/claude-opus-4-20250514", + "google/gemini-2.5-flash", + "google/gemini-2.5-pro", + "meta-llama/llama-4-maverick", + "meta-llama/llama-4-scout", + "deepseek/deepseek-chat-v3-0324", + "deepseek/deepseek-r1", + "qwen/qwen3-235b-a22b", + "mistralai/mistral-large-2411" + ], + AVAILABLE_MODELS_LABELS: { + "openai/gpt-4.1": "OpenAI GPT-4.1", + "openai/gpt-4.1-mini": "OpenAI GPT-4.1 Mini", + "openai/gpt-4o": "OpenAI GPT-4o", + "openai/gpt-4o-mini": "OpenAI GPT-4o Mini", + "openai/o3-mini": "OpenAI o3 Mini", + "openai/o4-mini": "OpenAI o4 Mini", + "anthropic/claude-sonnet-4-20250514": "Claude Sonnet 4", + "anthropic/claude-opus-4-20250514": "Claude Opus 4", + "google/gemini-2.5-flash": "Gemini 2.5 Flash", + "google/gemini-2.5-pro": "Gemini 2.5 Pro", + "meta-llama/llama-4-maverick": "Llama 4 Maverick", + "meta-llama/llama-4-scout": "Llama 4 Scout", + "deepseek/deepseek-chat-v3-0324": "DeepSeek V3", + "deepseek/deepseek-r1": "DeepSeek R1", + "qwen/qwen3-235b-a22b": "Qwen3 235B", + "mistralai/mistral-large-2411": "Mistral Large" + }, + modelPref: prefs_default.OPENROUTER_MODEL, + apiPref: prefs_default.OPENROUTER_API_KEY, + getModel() { + return createOpenAI({ + apiKey: this.apiKey, + baseURL: "https://openrouter.ai/api/v1" + })(this.model); + } }); // findbar-ai/llm/index.js @@ -3470,6 +3523,7 @@ class LLM { mistral, ollama, openai, + openrouter, perplexity, cerebras }; diff --git a/preferences.json b/preferences.json index ccf1069..1b59ebd 100644 --- a/preferences.json +++ b/preferences.json @@ -79,6 +79,10 @@ "value": "ollama", "label": "Ollama (local)" }, + { + "value": "openrouter", + "label": "OpenRouter" + }, { "value": "openai", "label": "OpenAI GPT" @@ -566,6 +570,103 @@ } ] }, + { + "property": "extension.browse-bot.openrouter-api-key", + "label": "OpenRouter API Key", + "type": "string", + "placeholder": "Enter your OpenRouter API key", + "defaultValue": "", + "description": "Your personal API key from OpenRouter. Gives access to 300+ models from multiple providers.", + "conditions": [ + { + "if": { + "property": "extension.browse-bot.llm-provider", + "value": "openrouter" + } + } + ] + }, + { + "property": "extension.browse-bot.openrouter-model", + "label": "OpenRouter Model", + "type": "dropdown", + "defaultValue": "google/gemini-2.5-flash", + "description": "Select the model to use via OpenRouter.", + "options": [ + { + "value": "openai/gpt-4.1", + "label": "OpenAI GPT-4.1" + }, + { + "value": "openai/gpt-4.1-mini", + "label": "OpenAI GPT-4.1 Mini" + }, + { + "value": "openai/gpt-4o", + "label": "OpenAI GPT-4o" + }, + { + "value": "openai/gpt-4o-mini", + "label": "OpenAI GPT-4o Mini" + }, + { + "value": "openai/o3-mini", + "label": "OpenAI o3 Mini" + }, + { + "value": "openai/o4-mini", + "label": "OpenAI o4 Mini" + }, + { + "value": "anthropic/claude-sonnet-4-20250514", + "label": "Claude Sonnet 4" + }, + { + "value": "anthropic/claude-opus-4-20250514", + "label": "Claude Opus 4" + }, + { + "value": "google/gemini-2.5-flash", + "label": "Gemini 2.5 Flash" + }, + { + "value": "google/gemini-2.5-pro", + "label": "Gemini 2.5 Pro" + }, + { + "value": "meta-llama/llama-4-maverick", + "label": "Llama 4 Maverick" + }, + { + "value": "meta-llama/llama-4-scout", + "label": "Llama 4 Scout" + }, + { + "value": "deepseek/deepseek-chat-v3-0324", + "label": "DeepSeek V3" + }, + { + "value": "deepseek/deepseek-r1", + "label": "DeepSeek R1" + }, + { + "value": "qwen/qwen3-235b-a22b", + "label": "Qwen3 235B" + }, + { + "value": "mistralai/mistral-large-2411", + "label": "Mistral Large" + } + ], + "conditions": [ + { + "if": { + "property": "extension.browse-bot.llm-provider", + "value": "openrouter" + } + } + ] + }, { "property": "extension.browse-bot.openai-api-key", "label": "OpenAI API Key",