Skip to content

Latest commit

 

History

History
285 lines (222 loc) · 18 KB

File metadata and controls

285 lines (222 loc) · 18 KB

Fournisseurs et Modèles


Interface Fournisseur (providers/base.js)

Chaque fournisseur LLM implémente l'interface BaseLLMProvider :

class BaseLLMProvider {
  async chat(messages, options)         // → { content, toolCalls, usage }
  async *chatStream(messages, options)  // → générateur async produisant { type, content }
  get supportsTools()                   // → booléen
  get supportsAskStreaming()            // → booléen
  get supportsVision()                  // → booléen
  get promptTier()                      // → 'compact' | 'mid' | 'full'
  async testConnection()                // → { ok, error?, model? }
}

Options

{
  tools: [...],            // schémas d'outils
  temperature: 0.3,
  maxTokens: 4096,
  stream: false,           // utiliser chatStream au lieu de chat
  extraBody: {},           // champs supplémentaires transmis à l'API
}

Fournisseurs Intégrés

ID Fournisseur Type Catégorie Modèle par défaut Vision
webbrain_cloud openai cloud webbrain-cloud 1.0 Oui
llamacpp llamacpp local (modèle chargé) Oui (activé par défaut)
ollama openai local (modèle chargé) Oui (activé par défaut)
lmstudio openai local (modèle chargé) Oui (activé par défaut)
jan openai local (modèle chargé) Oui (activé par défaut)
vllm openai local (modèle chargé) Oui (activé par défaut)
sglang openai local (modèle chargé) Oui (activé par défaut)
localai openai local (modèle chargé) Oui (activé par défaut)
gpt4all openai local (modèle chargé) Oui (activé par défaut)
azure_openai azure_openai cloud (déploiement) Bascule manuelle
aws_bedrock aws_bedrock cloud (ID de modèle) Non
openai openai cloud gpt-5.6-terra Regex nom de modèle
anthropic anthropic cloud claude-sonnet-4-6 Regex nom de modèle
gemini openai cloud gemini-3.1-flash Regex nom de modèle
cloudflare openai routeur @cf/zai-org/glm-5.2 Regex nom de modèle
mistral openai cloud mistral-large-latest Regex nom de modèle
deepseek openai cloud deepseek-v4-flash Regex nom de modèle
xai (Grok) openai cloud grok-4.3 Regex nom de modèle
nvidia (NIM) openai routeur meta/llama-3.1-8b-instruct Regex nom de modèle
groq openai routeur llama-3.3-70b-versatile Regex nom de modèle
minimax openai cloud minimax-m2.7 Regex nom de modèle
kimi openai cloud kimi-k2.5 Regex nom de modèle
alibaba (Qwen) openai cloud qwen-max Regex nom de modèle
together openai routeur meta-llama/Llama-3.3-70B-Instruct-Turbo Regex nom de modèle
openrouter openai routeur openrouter/free Regex nom de modèle
huggingface openai routeur zai-org/GLM-5.2 Regex nom de modèle
fireworks openai routeur accounts/fireworks/models/llama-v3p3-70b-instruct Regex nom de modèle
z_ai openai cloud glm-5.2 Regex nom de modèle

Catalogue étendu de fournisseurs

WebBrain ajoute 76 cartes désactivées par défaut depuis l’instantané du catalogue OpenCode au commit 62e4641235d7847dadc60da37cca8a023dd54fc1. Avec les 28 cartes existantes, les Paramètres proposent 104 fournisseurs intégrés. La liste exacte des identifiants est :

302ai, abacus, aihubmix, alibaba-coding-plan, alibaba-coding-plan-cn, azure-cognitive-services, bailing, baseten, berget, cerebras, chutes, clarifai, cloudferro-sherlock, cohere, cortecs, deepinfra, digitalocean, dinference, drun, evroc, fastrouter, friendli, google-vertex, google-vertex-anthropic, helicone, iflowcn, inception, inference, io-net, jiekou, kilo, kimi-for-coding, kuae-cloud-coding-plan, llama, lucidquery, meganova, minimax-cn-coding-plan, minimax-coding-plan, moark, modelscope, morph, nano-gpt, nebius, nova, novita-ai, ollama-cloud, opencode, opencode-go, ovhcloud, perplexity, perplexity-agent, poe, privatemode-ai, qihang-ai, qiniu-ai, requesty, scaleway, siliconflow, siliconflow-cn, stackit, stepfun, submodel, synthetic, tencent-coding-plan, upstage, v0, venice, vercel, vivgrid, vultr, wandb, xiaomi, zai-coding-plan, zenmux, zhipuai, zhipuai-coding-plan.

La plupart utilisent Chat Completions compatible OpenAI avec une clé Bearer. Azure AI Foundry utilise un nom de ressource et api-key. Google Vertex AI utilise projet, région et clé d’autorisation Google via x-goog-api-key; la région global utilise aiplatform.googleapis.com, et Vertex Anthropic utilise rawPredict / streamRawPredict avec les hôtes multirégion us et eu. Perplexity Agent utilise l’API Responses. La carte Cloudflare existante prend désormais en charge un identifiant AI Gateway facultatif ; pour les modèles @cf/, un champ vide utilise automatiquement la passerelle default.

Les réponses sont diffusées pendant les tours Ask interactifs lorsque supportsAskStreaming est actif. Un flux interrompu efface le texte partiel, réessaie une seule fois sans diffusion et désactive la diffusion pour le reste de l’exécution. Act, Dev, les tâches planifiées, cloud et Continue restent sans diffusion. L’utilisation de jetons fournie par le service est enregistrée directement ; si elle est absente, WebBrain enregistre une estimation prudente fondée sur le nombre de caractères afin que la diffusion ne contourne pas la limite de coût configurée.

Entrées volontairement exclues : github-models (retrait de GitHub Models le 30 juillet 2026), github-copilot (abonnement/OAuth), gitlab et sap-ai-core (authentification, découverte et protocoles spécifiques).

Fournisseurs Locaux

Sept fournisseurs locaux sont activés par défaut sans clé API requise sauf si le serveur local a été démarré avec authentification :

  • llama.cpp : http://localhost:8080 — exécutez llama-server -m model.gguf
  • Ollama : http://localhost:11434/v1ollama serve, ou ollama launch webbrain --model <model>
  • LM Studio : http://localhost:1234/v1 — le serveur d'inférence local de LM Studio
  • Jan : http://localhost:1337/v1 — le serveur API local compatible OpenAI de Jan
  • vLLM : http://localhost:8000/v1 — le serveur compatible OpenAI de vLLM
  • SGLang : http://localhost:30000/v1 — le serveur compatible OpenAI de SGLang
  • LocalAI : http://localhost:8080/v1 — le serveur compatible OpenAI de LocalAI

Les sept ont supportsVision: true par défaut car la plupart des modèles chargés localement en 2026 sont multimodaux.

Relais de lancement Ollama (préversion)

WebBrain adore le relais de lancement Ollama

WebBrain prend aujourd'hui en charge Ollama via le fournisseur local compatible OpenAI. Un nouveau relais ollama launch webbrain --model <model> peut aussi configurer WebBrain automatiquement, mais il n'est pas encore intégré à Ollama en amont. Pour l'instant, essayez-le depuis la branche codex/ollama-webbrain-launch-handoff de esokullu/ollama ; nous espérons qu'Ollama l'intégrera en amont.

git clone https://github.com/esokullu/ollama.git
cd ollama
git switch codex/ollama-webbrain-launch-handoff
cmake -S . -B build -G Ninja -DOLLAMA_MLX_BACKENDS=
cmake --build build --parallel 8

OLLAMA_ORIGINS="chrome-extension://*,moz-extension://*" ./ollama serve
./ollama launch webbrain --model <model>

Fenêtre de contexte. Chargez les modèles locaux avec au moins une fenêtre de contexte de 16k tokens pour des exécutions d'agent fiables — c'est le minimum utilisable. 8k peut fonctionner avec le niveau Compact sélectionné ; 4k est trop petit pour contenir le prompt système + les schémas d'outils. L'agent lit la fenêtre depuis provider.contextWindow (providers/base.js) pour piloter l'auto-compaction ; quand une configuration de fournisseur ne définit pas contextWindow, les fournisseurs locaux utilisent par défaut une valeur prudente de 16k (cloud/routeur par défaut à 128k). Tester la connexion / Charger les modèles détectent pour llama.cpp, Ollama et LM Studio quand c'est rapporté (llama.cpp GET /props n_ctx, Ollama GET /api/ps puis /api/show num_ctx, LM Studio /api/v0/models loaded_context_length). La détection rafraîchit le 16k par défaut ; elle réduit une surcharge manuelle plus grande seulement depuis le contexte live/runtime (pas depuis Ollama /api/show seul). Jan / vLLM / SGLang / LocalAI ne détectent pas encore. Vous pouvez toujours définir config.contextWindow explicitement, et le serveur de modèle doit effectivement être démarré avec cette taille de contexte (par exemple llama-server -c 16384).

Niveaux de prompt/outils et modes

Le niveau du fournisseur et le mode de conversation sont des paramètres indépendants :

  • Niveau (compact | mid | full) est un paramètre du fournisseur. Il contrôle quel prompt système Act et quel sous-ensemble d'outils d'agent navigateur normaux le modèle reçoit.
  • Mode (ask | act | dev) est sélectionné par l'utilisateur par conversation/message. Il contrôle si la requête est en lecture seule, action navigateur normale, ou travail de développement/inspection de page.

provider.promptTier résout le niveau actif. Les fournisseurs cloud sont forcés au niveau Full. Les fournisseurs locaux utilisent Mid par défaut. Les fournisseurs OpenRouter/routeur utilisent Full par défaut sauf modification explicite. Les configurations existantes qui définissent encore l'ancien booléen useCompactPrompt sont mappées vers Compact.

Niveau Classe de modèle visée Surface d'outils normale
compact très petits modèles / locaux Prompt le plus court et un petit ensemble d'outils Act normaux. Pas d'outils de planification, d'iframe, de téléchargement de ressource, ou d'interface DOM/UI avancée.
mid modèles locaux capables Prompt équilibré et outils de tâches courantes : téléchargements, planification, outils iframe, vérification de formulaire, et download_resource_from_page, tout en excluant les solutions de repli UI/DOM avancées réservées à Full.
full modèles frontière/cloud ou grands modèles locaux Prompt Act normal complet et solutions de repli avancées telles que survol, glisser-déposer, trames, et shadow DOM.

Le mode Ask ignore le niveau du fournisseur et reste en lecture seule. Le mode Act utilise les outils normaux du niveau sélectionné. Le mode Dev nécessite Mid ou Full, utilise le prompt Act sélectionné, ajoute SYSTEM_PROMPT_DEV_APPENDIX, et ajoute des outils source/style propres à Dev plus l'inspection étendue shadow/trame pour le débogage niveau Mid. Dev en Compact est bloqué avant l'envoi d'une requête LLM.

Détection de la Vision

Fournisseur Mécanisme
Compatible OpenAI Regex sur le nom du modèle (gpt-4o, gpt-5, claude-3, claude-sonnet-4, gemini-2.0-flash, etc.)
Anthropic Patterns claude-(3|sonnet-4|opus-4)
llama.cpp Interrupteur explicite supportsVision dans la configuration
Ollama / LM Studio / Jan / vLLM / SGLang / LocalAI Interrupteur explicite supportsVision dans la configuration (via le fournisseur OpenAI)

Conversion Anthropic

Lorsque le fournisseur actif est Anthropic, l'agent convertit les messages au format OpenAI :

Format OpenAI Format Anthropic
Message system Champ system (niveau supérieur)
assistant + tool_calls Blocs de contenu assistant + tool_use
Rôle tool Blocs de contenu user + tool_result
image_url (URL de données) Bloc source image

ProviderManager (providers/manager.js)

Gère le cycle de vie des fournisseurs :

const pm = new ProviderManager();

await pm.load();                    // Chargement depuis chrome.storage.local
await pm.save();                    // Persistance vers chrome.storage.local
pm.getActive();                     // Obtient l'instance du fournisseur actif
await pm.setActive('openai');       // Change de fournisseur actif
await pm.updateProvider('openai', { model: 'gpt-5' }); // Met à jour la configuration
pm.getAll();                        // Toutes les configurations de fournisseurs (pour l'interface Paramètres)
await pm.testProvider('openai');    // Teste la connexion

Recherche dans les Paramètres

L'index de recherche des Paramètres comprend les identifiants et libellés des fournisseurs, le type/la catégorie, le modèle, l'URL de base, les libellés et espaces réservés des champs, les suggestions et les options de compatibilité. Les cartes correspondantes sont classées par nom/identifiant exact, puis préfixe, puis sous-chaîne, puis correspondance dans les champs uniquement. L'ordre original départage les égalités et le fournisseur sélectionné reste visible à travers les filtres de catégorie.

Persistance de la Configuration

Les configurations sont stockées dans chrome.storage.local sous la clé providers, fusionnées avec les valeurs par défaut. Les valeurs par défaut fournissent la STRUCTURE (quelles clés de fournisseur existent) ; les configurations stockées remplacent les valeurs par clé. Cela permet aux mises à jour qui introduisent de nouvelles entrées de fournisseur de fonctionner sans que les utilisateurs aient à vider le stockage.

Les entrées de fournisseur obsolètes (webbrain, openai_subscription, claude_subscription) sont filtrées.

Plafonds de Coût

Les paramètres exposent des plafonds de coût cloud pour la session et le total. L'agent préfère une valeur usage.cost/usage.cost_usd rapportée par le fournisseur lorsqu'elle est présente (OpenRouter la rapporte directement). Pour les fournisseurs cloud directs qui ne retournent que des compteurs de tokens, WebBrain estime les dépenses à partir des champs de configuration du fournisseur :

  • inputCostPerMillionUsd
  • cacheReadCostPerMillionUsd
  • cacheWriteCostPerMillionUsd (écritures de cache de 5 minutes ou sans durée précisée)
  • cacheWrite1hCostPerMillionUsd
  • outputCostPerMillionUsd

OpenAI inclut les lectures et écritures de cache dans le total des tokens d'entrée (prompt_tokens_details.cached_tokens / cache_write_tokens, ou les équivalents input_tokens_details de l'API Responses) ; WebBrain soustrait donc les deux avant d'appliquer le tarif d'entrée normal, et facture les écritures avec cacheWriteCostPerMillionUsd. Anthropic et Bedrock rapportent séparément l'entrée normale, les lectures du cache et les écritures dans le cache ; ces compteurs sont donc additionnés comme catégories de facturation distinctes. Ils peuvent également distinguer les écritures de cache de 5 minutes et d'une heure.

Ces tarifs sont modifiables dans la carte du fournisseur afin que le prix des modèles personnalisés puisse être ajusté sans modification de code. Si un tarif propre au cache est absent, le tarif d'entrée normal est utilisé ; si le tarif d'écriture d'une heure est absent, le tarif général d'écriture dans le cache est utilisé. Si un fournisseur distant facturé retourne des compteurs sans tarifs d'entrée/sortie configurés, l'agent utilise des valeurs prudentes (3$ en entrée / 15$ en sortie par million de tokens). Pour chaque requête en streaming, seul le dernier instantané cumulatif d'utilisation est comptabilisé. Les fournisseurs locaux ne sont pas comptabilisés.

Fournisseur de Vision Dédié

L'utilisateur peut configurer un fournisseur de vision séparé pour la description de capture d'écran. L'agent appelle ce fournisseur en sous-requête pour obtenir une description textuelle du viewport, puis transmet uniquement la description (pas l'image brute) au fournisseur de planification principal. Cela réduit les coûts de tokens lorsque le fournisseur principal est textuel uniquement :

const vision = await providerManager.getVisionProvider();
// Retourne une instance OpenAICompatibleProvider ou null

Fournisseur de Transcription

Utilisé par Tab Recorder pour la transcription Whisper. Passe par les fournisseurs configurés dans l'ordre de priorité : OpenAI → Groq → LM Studio → llama.cpp. La liste d'exclusion ignore les fournisseurs connus pour ne pas héberger Whisper (Anthropic, Gemini, Mistral, DeepSeek, xAI, Nvidia).


Ajouter un Fournisseur

  1. Créez la classe du fournisseur dans src/chrome/src/providers/<nom>.js implémentant BaseLLMProvider
  2. Ajoutez la configuration par défaut à _defaultConfigs() dans manager.js
  3. Ajoutez le cas dans la fabrique dans _createProvider()
  4. Enregistrez l'import dans manager.js
  5. Ajoutez la gestion spécifique au fournisseur dans l'agent si nécessaire (par exemple, la conversion de format de message d'Anthropic)
  6. Miroir vers Firefox (src/firefox/src/providers/)

Pour les fournisseurs compatibles OpenAI

Si le fournisseur utilise le format d'API OpenAI /v1/chat/completions, vous avez seulement besoin d'ajouter une entrée de configuration par défaut — OpenAICompatibleProvider gère le reste :

myprovider: {
  type: 'openai',
  category: 'cloud',
  label: 'Mon Fournisseur',
  providerName: 'myprovider',
  baseUrl: 'https://api.myprovider.com/v1',
  model: 'my-model',
  supportsStreamUsageOptions: false,
  apiKey: '',
  enabled: false,
},

La vision est auto-détectée via une regex sur le nom du modèle. Si le fournisseur a un ensemble connu de modèles de vision, ajoutez-les à la regex dans openai.js. Définissez supportsStreamUsageOptions: true uniquement pour les fournisseurs qui acceptent stream_options.include_usage de style OpenAI ; laissez-le à false lorsqu'un fournisseur retourne l'utilisation sans accepter ce champ de requête.