---
name: ai-model
description: Gère les modèles IA de Motivia. Utilise ce skill quand l'utilisateur demande d'ajouter un nouveau modèle IA, modifier un provider, ou configurer les options de génération. Supporte OpenAI, Anthropic, Google, Mistral et xAI.
allowed-tools: Read, Write, Edit, Glob, Grep
---
# Gestion des Modèles IA Motivia
## Fichiers concernés
```
utils/ai-model.tsx # Registry des modèles et providers
prisma/schema.prisma # Enum ApiProvider
components/icons/ # Icônes des providers
app/api/create/route.ts # Endpoint de génération
```
## Structure d'un modèle
```typescript
export type AIModelOption = {
provider: ApiProvider; // Enum Prisma: OPENAI, ANTHROPIC, GOOGLE, MISTRAL, XAI
model: string; // ID du modèle (ex: "gpt-5-nano-2025-08-07")
label: string; // Nom affiché (ex: "GPT 5 nano")
free: boolean; // true = utilise les lettres gratuites
cost: number; // Coût relatif (pour affichage)
};
```
## Providers actuels
| Provider | Enum | SDK |
|----------|------|-----|
| OpenAI | `ApiProvider.OPENAI` | `@ai-sdk/openai` |
| Anthropic | `ApiProvider.ANTHROPIC` | `@ai-sdk/anthropic` |
| Google | `ApiProvider.GOOGLE` | `@ai-sdk/google` |
| Mistral | `ApiProvider.MISTRAL` | `@ai-sdk/mistral` |
| xAI | `ApiProvider.XAI` | `@ai-sdk/xai` |
## Ajouter un nouveau modèle (provider existant)
### 1. Ajouter à la liste des modèles
```typescript
// utils/ai-model.tsx
export const OPENAI_MODELS = [
// ... existing models
{
provider: ApiProvider.OPENAI,
model: "gpt-5-ultra-2025-xx-xx", // ID exact du modèle
label: "GPT 5 Ultra", // Nom affiché
free: false, // false = nécessite clé API
cost: 50, // Coût relatif
},
];
```
### 2. Vérifier l'export dans modelOptions
```typescript
export const modelOptions: AIModelOption[] = [
...OPENAI_MODELS,
...ANTHROPIC_MODELS,
...MISTRAL_MODELS,
...XAI_MODELS,
];
```
## Ajouter un nouveau provider
### 1. Installer le SDK
```bash
pnpm add @ai-sdk/newprovider
```
### 2. Ajouter l'enum Prisma
```prisma
// prisma/schema.prisma
enum ApiProvider {
OPENAI
ANTHROPIC
GOOGLE
MISTRAL
XAI
NEWPROVIDER // Ajouter ici
}
```
### 3. Exécuter la migration
```bash
pnpm prisma migrate dev --name add_newprovider
```
### 4. Créer l'icône du provider
```typescript
// components/icons/newprovider-icon.tsx
export const NewProviderIcon = ({ className }: { className?: string }) => (
);
```
### 5. Ajouter au registry
```typescript
// utils/ai-model.tsx
import { createNewProvider } from "@ai-sdk/newprovider";
import { NewProviderIcon } from "@/components/icons";
// Dans providersLabelAndIcon
{
label: "New Provider",
value: ApiProvider.NEWPROVIDER,
image: ,
},
// Dans les modèles
export const NEWPROVIDER_MODELS = [
{
provider: ApiProvider.NEWPROVIDER,
model: "model-id",
label: "Model Name",
free: false,
cost: 10,
},
];
// Dans modelOptions
export const modelOptions: AIModelOption[] = [
...OPENAI_MODELS,
...ANTHROPIC_MODELS,
...MISTRAL_MODELS,
...XAI_MODELS,
...NEWPROVIDER_MODELS, // Ajouter ici
];
// Dans registry
export const registry = (apiKey?: string, provider?: ApiProvider) =>
createProviderRegistry({
// ... existing
NEWPROVIDER: createNewProvider({
apiKey:
provider === ApiProvider.NEWPROVIDER && apiKey
? apiKey
: process.env.NEWPROVIDER_API_KEY,
}),
});
```
### 6. Ajouter la variable d'environnement
```env
NEWPROVIDER_API_KEY=sk-...
```
## Règles métier
### Modèles gratuits
- Un modèle `free: true` utilise les 5 lettres gratuites de l'utilisateur
- Si `freeLetters === 0`, l'utilisateur doit avoir sa propre clé API
### Coût
Le champ `cost` est indicatif et sert à l'affichage. Valeurs suggérées:
| Gamme | Cost | Exemple |
|-------|------|---------|
| Économique | 0-1 | nano, small |
| Standard | 2-5 | mini, medium |
| Premium | 10-15 | sonnet, medium |
| Ultra | 20+ | opus |
## Génération de lettre
Le flow dans `app/api/create/route.ts`:
1. Vérifier l'authentification
2. Valider le modèle demandé
3. Récupérer la clé API (user ou env)
4. Si free: décrémenter `freeLetters`
5. Streamer la génération via `streamObject`
6. Retourner `{ title, content }`
## Checklist nouveau modèle
1. [ ] ID du modèle correct (vérifier docs du provider)
2. [ ] Label clair et cohérent
3. [ ] `free` bien défini (true/false)
4. [ ] `cost` relatif défini
5. [ ] Ajouté à l'array `modelOptions`
6. [ ] Testé avec une clé API valide