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
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
// 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
export const modelOptions: AIModelOption[] = [
...OPENAI_MODELS,
...ANTHROPIC_MODELS,
...MISTRAL_MODELS,
...XAI_MODELS,
];
Ajouter un nouveau provider
1. Installer le SDK
pnpm add @ai-sdk/newprovider
2. Ajouter l'enum Prisma
// prisma/schema.prisma
enum ApiProvider {
OPENAI
ANTHROPIC
GOOGLE
MISTRAL
XAI
NEWPROVIDER // Ajouter ici
}
3. Exécuter la migration
pnpm prisma migrate dev --name add_newprovider
4. Créer l'icône du provider
// components/icons/newprovider-icon.tsx
export const NewProviderIcon = ({ className }: { className?: string }) => (
<svg className={className} viewBox="0 0 24 24">
{/* SVG path */}
</svg>
);
5. Ajouter au registry
// utils/ai-model.tsx
import { createNewProvider } from "@ai-sdk/newprovider";
import { NewProviderIcon } from "@/components/icons";
// Dans providersLabelAndIcon
{
label: "New Provider",
value: ApiProvider.NEWPROVIDER,
image: <NewProviderIcon className="size-6" />,
},
// 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
NEWPROVIDER_API_KEY=sk-...
Règles métier
Modèles gratuits
- Un modèle
free: trueutilise 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:
- Vérifier l'authentification
- Valider le modèle demandé
- Récupérer la clé API (user ou env)
- Si free: décrémenter
freeLetters - Streamer la génération via
streamObject - Retourner
{ title, content }
Checklist nouveau modèle
- [ ] ID du modèle correct (vérifier docs du provider)
- [ ] Label clair et cohérent
- [ ]
freebien défini (true/false) - [ ]
costrelatif défini - [ ] Ajouté à l'array
modelOptions - [ ] Testé avec une clé API valide
Scan to join WeChat group