WeeShip

WeeAgent

AI models (OpenRouter)

OpenRouter (le moteur du chat)

Le chat en streaming de WeeAgent passe par OpenRouter : un routeur unique qui donne acces a Claude, GPT, Gemini, Kimi, Mistral... avec UNE seule cle. Sans cle, le kit tourne en mode mock (demo).

1 — Creer le compte & la cle

  1. Va sur openrouter.ai → « Sign in » (Google, GitHub ou email).
  2. Menu compte → « Keys » (openrouter.ai/keys) → « Create key » → nomme-la « WeeAgent ».
  3. Copie la cle « sk-or-... » (montree une seule fois).
  4. Ajoute des credits : « Credits » → « Add credits » (paiement a l'usage, prepaye).
OpenRouter facture a l'usage (prix par modele sur openrouter.ai/models). Des modeles gratuits existent (suffixe :free) pour tester sans frais.

2 — Poser le secret (Supabase)

terminal

1supabase secrets set OPENROUTER_API_KEY=sk-or-xxxxxxxx

Des que la cle est posee, l'edge function weeagent passe automatiquement du mock aux vrais modeles.

3 — Choisir les modeles

Le catalogue affiche dans le dock est dans src/weeagent/lib/models.ts. Edite la liste :

src/weeagent/lib/models.ts

1export const MODELS = [
2  { id: "anthropic/claude-haiku-4.5", label: "Claude Haiku 4.5", provider: "Anthropic", note: "Rapide — défaut" },
3  { id: "openai/gpt-4o",              label: "GPT-4o",           provider: "OpenAI",    note: "Polyvalent" },
4  { id: "google/gemini-2.5-pro",      label: "Gemini 2.5 Pro",   provider: "Google",    note: "Analyse" },
5  // ajoute/retire selon ton budget — l'id doit exister sur openrouter.ai/models
6];

Le morceau de code (proxy)

Le proxy vit dans supabase/functions/weeagent/index.ts. Le coeur tient en quelques lignes — a recuperer tel quel si tu veux le brancher ailleurs :

supabase/functions/weeagent/index.ts

1// cœur du proxy : relaie le flux OpenRouter tel quel (SSE)
2const upstream = await fetch("https://openrouter.ai/api/v1/chat/completions", {
3  method: "POST",
4  headers: {
5    Authorization: `Bearer ${Deno.env.get("OPENROUTER_API_KEY")}`,
6    "Content-Type": "application/json",
7  },
8  body: JSON.stringify({ model, messages, stream: true }),
9});
10return new Response(upstream.body, {
11  headers: { ...cors, "Content-Type": "text/event-stream" },
12});

Controle d'acces (budget)

Pour eviter qu'un utilisateur fasse exploser ta facture OpenRouter, WeeAgent compte le COUT REEL par utilisateur et par mois, et coupe au plafond (fail-closed).

Le plafond se regle sur une seule ligne dans config.ts (source unique front + edge) :

config.ts

1ai: {
2  monthlyCapCents: 200, // 2,00 EUR par utilisateur/mois — 0 = illimite
3}
  • Comptage : OpenRouter renvoie le cout exact (usage.include) ; le proxy weeagent le lit en teeant le flux (le navigateur recoit le flux inchange).
  • Coupure : au-dessus du plafond, aucun appel n'est fait (pas d'appel = pas de cout) ; l'agent repond « Plafond de conso IA atteint pour ce mois ».
  • Badge : le dock affiche « X EUR / Y EUR ce mois » quand un plafond est configure.
  • Stockage : table ai_usage (migration 0008), RLS sans policy + RPC SECURITY DEFINER.
  • Anti-flood : config.ai.maxPerMinute limite les requetes par minute et par utilisateur (complement du plafond en euros, protege aussi le mode mock).
Sans OPENROUTER_API_KEY (mode mock), aucun cout n'est compte. Applique la migration : supabase db push, puis deploie weeagent et ai-usage.

Couts & repli

  • Sans OPENROUTER_API_KEY → flux mock (aucun cout), le kit reste utilisable.
  • Avec la cle → vrais modeles ; le modele + l'effort se choisissent dans le menu du dock.
  • Prix par modele : openrouter.ai/models. Commence par un modele « rapide » (Haiku/Flash) pour limiter les couts.