@boostecom/provider 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -0
- package/dist/index.cjs +2522 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +848 -0
- package/dist/index.d.ts +848 -0
- package/dist/index.js +2484 -0
- package/dist/index.js.map +1 -0
- package/docs/content/README.md +337 -0
- package/docs/content/agent-teams.mdx +324 -0
- package/docs/content/api.mdx +757 -0
- package/docs/content/best-practices.mdx +624 -0
- package/docs/content/examples.mdx +675 -0
- package/docs/content/guide.mdx +516 -0
- package/docs/content/index.mdx +99 -0
- package/docs/content/installation.mdx +246 -0
- package/docs/content/skills.mdx +548 -0
- package/docs/content/troubleshooting.mdx +588 -0
- package/docs/examples/README.md +499 -0
- package/docs/examples/abort-signal.ts +125 -0
- package/docs/examples/agent-teams.ts +122 -0
- package/docs/examples/basic-usage.ts +73 -0
- package/docs/examples/check-cli.ts +51 -0
- package/docs/examples/conversation-history.ts +69 -0
- package/docs/examples/custom-config.ts +90 -0
- package/docs/examples/generate-object-constraints.ts +209 -0
- package/docs/examples/generate-object.ts +211 -0
- package/docs/examples/hooks-callbacks.ts +63 -0
- package/docs/examples/images.ts +76 -0
- package/docs/examples/integration-test.ts +241 -0
- package/docs/examples/limitations.ts +150 -0
- package/docs/examples/logging-custom-logger.ts +99 -0
- package/docs/examples/logging-default.ts +55 -0
- package/docs/examples/logging-disabled.ts +74 -0
- package/docs/examples/logging-verbose.ts +64 -0
- package/docs/examples/long-running-tasks.ts +179 -0
- package/docs/examples/message-injection.ts +210 -0
- package/docs/examples/mid-stream-injection.ts +126 -0
- package/docs/examples/run-all-examples.sh +48 -0
- package/docs/examples/sdk-tools-callbacks.ts +49 -0
- package/docs/examples/skills-discovery.ts +144 -0
- package/docs/examples/skills-management.ts +140 -0
- package/docs/examples/stream-object.ts +80 -0
- package/docs/examples/streaming.ts +52 -0
- package/docs/examples/structured-output-repro.ts +227 -0
- package/docs/examples/tool-management.ts +215 -0
- package/docs/examples/tool-streaming.ts +132 -0
- package/docs/examples/zod4-compatibility-test.ts +290 -0
- package/docs/src/claude-code-language-model.test.ts +3883 -0
- package/docs/src/claude-code-language-model.ts +2586 -0
- package/docs/src/claude-code-provider.test.ts +97 -0
- package/docs/src/claude-code-provider.ts +179 -0
- package/docs/src/convert-to-claude-code-messages.images.test.ts +104 -0
- package/docs/src/convert-to-claude-code-messages.test.ts +193 -0
- package/docs/src/convert-to-claude-code-messages.ts +419 -0
- package/docs/src/errors.test.ts +213 -0
- package/docs/src/errors.ts +216 -0
- package/docs/src/index.test.ts +49 -0
- package/docs/src/index.ts +98 -0
- package/docs/src/logger.integration.test.ts +164 -0
- package/docs/src/logger.test.ts +184 -0
- package/docs/src/logger.ts +65 -0
- package/docs/src/map-claude-code-finish-reason.test.ts +120 -0
- package/docs/src/map-claude-code-finish-reason.ts +60 -0
- package/docs/src/mcp-helpers.test.ts +71 -0
- package/docs/src/mcp-helpers.ts +123 -0
- package/docs/src/message-injection.test.ts +460 -0
- package/docs/src/types.ts +447 -0
- package/docs/src/validation.test.ts +558 -0
- package/docs/src/validation.ts +360 -0
- package/package.json +124 -0
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Guide d'utilisation
|
|
3
|
+
description: Guide complet pour utiliser le provider Claude Code dans vos applications
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Guide d'utilisation
|
|
7
|
+
|
|
8
|
+
Ce guide vous accompagne à travers les fonctionnalités essentielles du provider Claude Code, de l'utilisation basique aux patterns avancés.
|
|
9
|
+
|
|
10
|
+
## Utilisation basique
|
|
11
|
+
|
|
12
|
+
### Génération de texte simple
|
|
13
|
+
|
|
14
|
+
La méthode la plus simple pour obtenir une réponse de Claude :
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
import { generateText } from 'ai';
|
|
18
|
+
import { claudeCode } from '@boostecom/provider';
|
|
19
|
+
|
|
20
|
+
const { text } = await generateText({
|
|
21
|
+
model: claudeCode('haiku'),
|
|
22
|
+
prompt: 'Explique la programmation asynchrone en JavaScript',
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
console.log(text);
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Streaming en temps réel
|
|
29
|
+
|
|
30
|
+
Pour des interfaces utilisateur réactives avec affichage progressif :
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { streamText } from 'ai';
|
|
34
|
+
import { claudeCode } from '@boostecom/provider';
|
|
35
|
+
|
|
36
|
+
const result = streamText({
|
|
37
|
+
model: claudeCode('sonnet'),
|
|
38
|
+
prompt: 'Écris une courte histoire sur un robot',
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Afficher chaque fragment au fur et à mesure
|
|
42
|
+
for await (const chunk of result.textStream) {
|
|
43
|
+
process.stdout.write(chunk);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
console.log('\n✅ Terminé');
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
<Note type="info">
|
|
50
|
+
Utilisez le streaming pour améliorer l'expérience utilisateur - les utilisateurs voient la réponse se construire en temps réel plutôt que d'attendre la réponse complète.
|
|
51
|
+
</Note>
|
|
52
|
+
|
|
53
|
+
## Conversations multi-tours
|
|
54
|
+
|
|
55
|
+
Maintenez le contexte à travers plusieurs échanges :
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import { generateText } from 'ai';
|
|
59
|
+
import { claudeCode } from '@boostecom/provider';
|
|
60
|
+
import type { CoreMessage } from 'ai';
|
|
61
|
+
|
|
62
|
+
// Historique de la conversation
|
|
63
|
+
const messages: CoreMessage[] = [
|
|
64
|
+
{ role: 'user', content: 'Bonjour, je m\'appelle Alice' },
|
|
65
|
+
{ role: 'assistant', content: 'Ravi de vous rencontrer, Alice !' },
|
|
66
|
+
{ role: 'user', content: 'Quel est mon prénom ?' },
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
const { text } = await generateText({
|
|
70
|
+
model: claudeCode('haiku'),
|
|
71
|
+
messages, // Passer l'historique complet
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
console.log(text); // "Votre prénom est Alice."
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Pattern chatbot complet
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import { streamText } from 'ai';
|
|
81
|
+
import { claudeCode } from '@boostecom/provider';
|
|
82
|
+
import * as readline from 'readline';
|
|
83
|
+
import type { CoreMessage } from 'ai';
|
|
84
|
+
|
|
85
|
+
const messages: CoreMessage[] = [];
|
|
86
|
+
const rl = readline.createInterface({
|
|
87
|
+
input: process.stdin,
|
|
88
|
+
output: process.stdout,
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
async function chat() {
|
|
92
|
+
rl.question('Vous: ', async (userInput) => {
|
|
93
|
+
if (userInput.toLowerCase() === 'exit') {
|
|
94
|
+
rl.close();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Ajouter le message utilisateur
|
|
99
|
+
messages.push({ role: 'user', content: userInput });
|
|
100
|
+
|
|
101
|
+
// Générer la réponse
|
|
102
|
+
const result = streamText({
|
|
103
|
+
model: claudeCode('sonnet'),
|
|
104
|
+
messages,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
process.stdout.write('Assistant: ');
|
|
108
|
+
let assistantResponse = '';
|
|
109
|
+
|
|
110
|
+
for await (const chunk of result.textStream) {
|
|
111
|
+
process.stdout.write(chunk);
|
|
112
|
+
assistantResponse += chunk;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
console.log('\n');
|
|
116
|
+
|
|
117
|
+
// Ajouter la réponse à l'historique
|
|
118
|
+
messages.push({ role: 'assistant', content: assistantResponse });
|
|
119
|
+
|
|
120
|
+
// Continuer la conversation
|
|
121
|
+
chat();
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
console.log('Chatbot démarré (tapez "exit" pour quitter)\n');
|
|
126
|
+
chat();
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Structured Outputs (Génération d'objets)
|
|
130
|
+
|
|
131
|
+
Générez des données structurées avec validation de schéma automatique :
|
|
132
|
+
|
|
133
|
+
### Objet simple
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import { generateObject } from 'ai';
|
|
137
|
+
import { claudeCode } from '@boostecom/provider';
|
|
138
|
+
import { z } from 'zod';
|
|
139
|
+
|
|
140
|
+
const result = await generateObject({
|
|
141
|
+
model: claudeCode('haiku'),
|
|
142
|
+
schema: z.object({
|
|
143
|
+
nom: z.string(),
|
|
144
|
+
age: z.number(),
|
|
145
|
+
email: z.string().describe('Adresse email (ex: user@example.com)'),
|
|
146
|
+
}),
|
|
147
|
+
prompt: 'Génère un profil utilisateur pour un développeur',
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
console.log(result.object);
|
|
151
|
+
// { nom: "Alex Chen", age: 28, email: "alex@example.com" }
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
<Note type="warning">
|
|
155
|
+
**Limitation importante** : Évitez `.email()`, `.url()`, `.uuid()`, `.datetime()` et les regex complexes avec lookaheads. Ces contraintes peuvent faire échouer silencieusement la génération structurée. Utilisez `.describe()` avec des indices de format et validez côté client.
|
|
156
|
+
</Note>
|
|
157
|
+
|
|
158
|
+
### Objet avec contraintes
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
import { generateObject } from 'ai';
|
|
162
|
+
import { claudeCode } from '@boostecom/provider';
|
|
163
|
+
import { z } from 'zod';
|
|
164
|
+
|
|
165
|
+
const result = await generateObject({
|
|
166
|
+
model: claudeCode('sonnet'),
|
|
167
|
+
schema: z.object({
|
|
168
|
+
nom: z.string().min(2).max(50),
|
|
169
|
+
age: z.number().int().min(18).max(120),
|
|
170
|
+
role: z.enum(['admin', 'user', 'guest']),
|
|
171
|
+
tags: z.array(z.string()).min(1).max(5),
|
|
172
|
+
score: z.number().min(0).max(100).multipleOf(5),
|
|
173
|
+
}),
|
|
174
|
+
prompt: 'Génère un utilisateur avec un score multiple de 5',
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
console.log(result.object);
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Streaming d'objets
|
|
181
|
+
|
|
182
|
+
Pour afficher progressivement un objet structuré :
|
|
183
|
+
|
|
184
|
+
```typescript
|
|
185
|
+
import { streamObject } from 'ai';
|
|
186
|
+
import { claudeCode } from '@boostecom/provider';
|
|
187
|
+
import { z } from 'zod';
|
|
188
|
+
|
|
189
|
+
const result = streamObject({
|
|
190
|
+
model: claudeCode('sonnet'),
|
|
191
|
+
schema: z.object({
|
|
192
|
+
recette: z.object({
|
|
193
|
+
titre: z.string(),
|
|
194
|
+
ingredients: z.array(z.string()),
|
|
195
|
+
etapes: z.array(z.string()),
|
|
196
|
+
}),
|
|
197
|
+
}),
|
|
198
|
+
prompt: 'Génère une recette de cookies',
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// Afficher les parties au fur et à mesure
|
|
202
|
+
for await (const partialObject of result.partialObjectStream) {
|
|
203
|
+
console.clear();
|
|
204
|
+
console.log('📊 Objet partiel:', JSON.stringify(partialObject, null, 2));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Objet final complet
|
|
208
|
+
const finalObject = await result.object;
|
|
209
|
+
console.log('✅ Objet final:', finalObject);
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Entrées multimodales (Images)
|
|
213
|
+
|
|
214
|
+
Analysez des images avec Claude :
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
import { streamText } from 'ai';
|
|
218
|
+
import { claudeCode } from '@boostecom/provider';
|
|
219
|
+
import { readFileSync } from 'fs';
|
|
220
|
+
|
|
221
|
+
// Charger l'image en base64
|
|
222
|
+
const imageBuffer = readFileSync('/chemin/vers/image.png');
|
|
223
|
+
const base64Image = imageBuffer.toString('base64');
|
|
224
|
+
const dataUrl = `data:image/png;base64,${base64Image}`;
|
|
225
|
+
|
|
226
|
+
const result = streamText({
|
|
227
|
+
model: claudeCode('sonnet', {
|
|
228
|
+
streamingInput: 'always', // REQUIS pour les images
|
|
229
|
+
}),
|
|
230
|
+
messages: [
|
|
231
|
+
{
|
|
232
|
+
role: 'user',
|
|
233
|
+
content: [
|
|
234
|
+
{ type: 'text', text: 'Que vois-tu dans cette image ?' },
|
|
235
|
+
{ type: 'image', image: dataUrl },
|
|
236
|
+
],
|
|
237
|
+
},
|
|
238
|
+
],
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
for await (const chunk of result.textStream) {
|
|
242
|
+
process.stdout.write(chunk);
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
<Note type="info">
|
|
247
|
+
**Prérequis** : `streamingInput: 'always'` est obligatoire pour envoyer des images. Les URLs d'images distantes ne sont pas supportées - utilisez des data URLs en base64.
|
|
248
|
+
</Note>
|
|
249
|
+
|
|
250
|
+
## Configuration et personnalisation
|
|
251
|
+
|
|
252
|
+
### Choisir le bon modèle
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
// Haiku - Rapide et économique (idéal pour prototypage, tâches simples)
|
|
256
|
+
const fast = claudeCode('haiku');
|
|
257
|
+
|
|
258
|
+
// Sonnet - Équilibré (recommandé pour la plupart des cas)
|
|
259
|
+
const balanced = claudeCode('sonnet');
|
|
260
|
+
|
|
261
|
+
// Opus - Le plus capable (tâches complexes, raisonnement avancé)
|
|
262
|
+
const powerful = claudeCode('opus');
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### System prompt personnalisé
|
|
266
|
+
|
|
267
|
+
```typescript
|
|
268
|
+
import { streamText } from 'ai';
|
|
269
|
+
import { claudeCode } from '@boostecom/provider';
|
|
270
|
+
|
|
271
|
+
const model = claudeCode('sonnet', {
|
|
272
|
+
systemPrompt: 'Tu es un assistant spécialisé en développement web. ' +
|
|
273
|
+
'Réponds toujours avec des exemples de code pratiques.',
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
const result = await streamText({
|
|
277
|
+
model,
|
|
278
|
+
prompt: 'Comment créer un serveur Express ?',
|
|
279
|
+
});
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
### Répertoire de travail
|
|
283
|
+
|
|
284
|
+
```typescript
|
|
285
|
+
const model = claudeCode('sonnet', {
|
|
286
|
+
cwd: '/chemin/vers/projet', // Claude travaillera dans ce répertoire
|
|
287
|
+
});
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Limite de tours de conversation
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
const model = claudeCode('sonnet', {
|
|
294
|
+
maxTurns: 5, // Limiter à 5 tours de conversation
|
|
295
|
+
});
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## Gestion des outils
|
|
299
|
+
|
|
300
|
+
Claude Code a accès à des outils intégrés (Read, Write, Bash, etc.). Vous pouvez contrôler leur accès :
|
|
301
|
+
|
|
302
|
+
### Autoriser des outils spécifiques
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
const model = claudeCode('sonnet', {
|
|
306
|
+
allowedTools: ['Read', 'LS'], // Seulement lecture et listage
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
const result = await streamText({
|
|
310
|
+
model,
|
|
311
|
+
prompt: 'Liste les fichiers de ce répertoire',
|
|
312
|
+
});
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Interdire des outils dangereux
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
const model = claudeCode('sonnet', {
|
|
319
|
+
disallowedTools: [
|
|
320
|
+
'Write',
|
|
321
|
+
'Edit',
|
|
322
|
+
'Bash(rm:*)', // Interdire les commandes rm
|
|
323
|
+
],
|
|
324
|
+
});
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### Observer l'utilisation des outils
|
|
328
|
+
|
|
329
|
+
```typescript
|
|
330
|
+
import { streamText } from 'ai';
|
|
331
|
+
import { claudeCode } from '@boostecom/provider';
|
|
332
|
+
|
|
333
|
+
const result = streamText({
|
|
334
|
+
model: claudeCode('sonnet', {
|
|
335
|
+
allowedTools: ['Read', 'Bash'],
|
|
336
|
+
}),
|
|
337
|
+
prompt: 'Lis le package.json et dis-moi la version',
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
for await (const part of result.fullStream) {
|
|
341
|
+
if (part.type === 'tool-call') {
|
|
342
|
+
console.log('🔧 Outil appelé:', part.toolName);
|
|
343
|
+
console.log('📥 Arguments:', part.args);
|
|
344
|
+
} else if (part.type === 'tool-result') {
|
|
345
|
+
console.log('📤 Résultat:', part.result);
|
|
346
|
+
} else if (part.type === 'text-delta') {
|
|
347
|
+
process.stdout.write(part.textDelta);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
## Gestion des erreurs
|
|
353
|
+
|
|
354
|
+
### Pattern de gestion d'erreur robuste
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
import { generateText } from 'ai';
|
|
358
|
+
import { claudeCode } from '@boostecom/provider';
|
|
359
|
+
|
|
360
|
+
async function generateSafely(prompt: string) {
|
|
361
|
+
try {
|
|
362
|
+
const { text } = await generateText({
|
|
363
|
+
model: claudeCode('haiku'),
|
|
364
|
+
prompt,
|
|
365
|
+
});
|
|
366
|
+
return { success: true, text };
|
|
367
|
+
} catch (error: any) {
|
|
368
|
+
// Erreur d'authentification
|
|
369
|
+
if (error.message?.includes('authentication')) {
|
|
370
|
+
return {
|
|
371
|
+
success: false,
|
|
372
|
+
error: 'Non authentifié. Exécutez: claude login'
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// CLI non trouvé
|
|
377
|
+
if (error.code === 'ENOENT') {
|
|
378
|
+
return {
|
|
379
|
+
success: false,
|
|
380
|
+
error: 'CLI Claude Code non trouvé. Installez-le avec: npm install -g @anthropic-ai/claude-code'
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// Erreur générique
|
|
385
|
+
return {
|
|
386
|
+
success: false,
|
|
387
|
+
error: error.message || 'Erreur inconnue'
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Utilisation
|
|
393
|
+
const result = await generateSafely('Bonjour');
|
|
394
|
+
if (result.success) {
|
|
395
|
+
console.log(result.text);
|
|
396
|
+
} else {
|
|
397
|
+
console.error('❌', result.error);
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## Timeouts et annulation
|
|
402
|
+
|
|
403
|
+
### Timeout personnalisé
|
|
404
|
+
|
|
405
|
+
```typescript
|
|
406
|
+
const controller = new AbortController();
|
|
407
|
+
const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 secondes
|
|
408
|
+
|
|
409
|
+
try {
|
|
410
|
+
const { text } = await generateText({
|
|
411
|
+
model: claudeCode('opus'),
|
|
412
|
+
prompt: 'Analyse complexe...',
|
|
413
|
+
abortSignal: controller.signal,
|
|
414
|
+
});
|
|
415
|
+
clearTimeout(timeoutId);
|
|
416
|
+
console.log(text);
|
|
417
|
+
} catch (error: any) {
|
|
418
|
+
if (error.name === 'AbortError') {
|
|
419
|
+
console.error('⏱️ Timeout dépassé');
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### Annulation utilisateur
|
|
425
|
+
|
|
426
|
+
```typescript
|
|
427
|
+
import * as readline from 'readline';
|
|
428
|
+
|
|
429
|
+
const controller = new AbortController();
|
|
430
|
+
|
|
431
|
+
// Permettre l'annulation par Ctrl+C
|
|
432
|
+
readline.emitKeypressEvents(process.stdin);
|
|
433
|
+
if (process.stdin.isTTY) {
|
|
434
|
+
process.stdin.setRawMode(true);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
process.stdin.on('keypress', (str, key) => {
|
|
438
|
+
if (key.ctrl && key.name === 'c') {
|
|
439
|
+
console.log('\n\n🛑 Annulation...');
|
|
440
|
+
controller.abort();
|
|
441
|
+
process.exit();
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
const result = streamText({
|
|
446
|
+
model: claudeCode('opus'),
|
|
447
|
+
prompt: 'Tâche longue...',
|
|
448
|
+
abortSignal: controller.signal,
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
console.log('⏳ Génération en cours (Ctrl+C pour annuler)...\n');
|
|
452
|
+
|
|
453
|
+
for await (const chunk of result.textStream) {
|
|
454
|
+
process.stdout.write(chunk);
|
|
455
|
+
}
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
## Logging et debugging
|
|
459
|
+
|
|
460
|
+
### Mode verbose
|
|
461
|
+
|
|
462
|
+
```typescript
|
|
463
|
+
const model = claudeCode('sonnet', {
|
|
464
|
+
verbose: true, // Activer les logs détaillés
|
|
465
|
+
});
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Logger personnalisé
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
import type { Logger } from '@boostecom/provider';
|
|
472
|
+
|
|
473
|
+
const customLogger: Logger = {
|
|
474
|
+
debug: (msg) => console.log(`[DEBUG] ${msg}`),
|
|
475
|
+
info: (msg) => console.log(`[INFO] ${msg}`),
|
|
476
|
+
warn: (msg) => console.warn(`[WARN] ${msg}`),
|
|
477
|
+
error: (msg) => console.error(`[ERROR] ${msg}`),
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
const model = claudeCode('sonnet', {
|
|
481
|
+
verbose: true,
|
|
482
|
+
logger: customLogger,
|
|
483
|
+
});
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### Désactiver complètement les logs
|
|
487
|
+
|
|
488
|
+
```typescript
|
|
489
|
+
const model = claudeCode('sonnet', {
|
|
490
|
+
logger: false, // Aucun log
|
|
491
|
+
});
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
## Métadonnées et usage
|
|
495
|
+
|
|
496
|
+
Accédez aux informations de coût et d'utilisation :
|
|
497
|
+
|
|
498
|
+
```typescript
|
|
499
|
+
const { text, usage, providerMetadata } = await generateText({
|
|
500
|
+
model: claudeCode('sonnet'),
|
|
501
|
+
prompt: 'Bonjour',
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
console.log('Tokens utilisés:', usage);
|
|
505
|
+
// { promptTokens: 10, completionTokens: 20, totalTokens: 30 }
|
|
506
|
+
|
|
507
|
+
console.log('Métadonnées provider:', providerMetadata);
|
|
508
|
+
// { 'claude-code': { cost: 0.0015, duration: 2300, ... } }
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
## Prochaines étapes
|
|
512
|
+
|
|
513
|
+
- [API Reference](/docs/api) - Documentation complète de toutes les options
|
|
514
|
+
- [Exemples avancés](/docs/examples) - Patterns d'utilisation avancés
|
|
515
|
+
- [Skills](/docs/skills) - Créer et utiliser des compétences personnalisées
|
|
516
|
+
- [Agent Teams](/docs/agent-teams) - Créer des équipes d'agents spécialisés
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Introduction
|
|
3
|
+
description: Provider non officiel pour utiliser Claude via le Vercel AI SDK avec le Claude Agent SDK
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AI SDK Provider for Claude Code
|
|
7
|
+
|
|
8
|
+
<Note type="info">
|
|
9
|
+
**Version actuelle** : 3.x.x supporte AI SDK v6 stable avec le Claude Agent SDK
|
|
10
|
+
</Note>
|
|
11
|
+
|
|
12
|
+
**@boostecom/provider** est un provider **non officiel** qui vous permet d'utiliser Claude Code dans le [Vercel AI SDK](https://sdk.vercel.ai/docs) via le CLI `@anthropic-ai/claude-agent-sdk`. Contrairement à l'API Anthropic, ce provider fonctionne avec votre **abonnement Claude Pro ou Max** — aucune clé API n'est nécessaire.
|
|
13
|
+
|
|
14
|
+
## Aperçu rapide
|
|
15
|
+
|
|
16
|
+
Ce provider fait le pont entre le Vercel AI SDK et le CLI Claude Code, vous permettant d'intégrer les capacités avancées de Claude Code dans vos applications avec :
|
|
17
|
+
|
|
18
|
+
- 🚀 Compatibilité complète avec le Vercel AI SDK
|
|
19
|
+
- 🔄 Support du streaming en temps réel
|
|
20
|
+
- 💬 Conversations multi-tours avec gestion de sessions
|
|
21
|
+
- 🎯 Structured outputs natifs avec validation de schéma
|
|
22
|
+
- 🛑 Support des signaux d'annulation (AbortSignal)
|
|
23
|
+
- 🔧 Gestion avancée des outils (MCP servers, permissions)
|
|
24
|
+
- 🧩 Callbacks et hooks de lifecycle personnalisables
|
|
25
|
+
|
|
26
|
+
## Compatibilité des versions
|
|
27
|
+
|
|
28
|
+
| Version Provider | AI SDK | SDK Sous-jacent | Tag NPM | Statut | Branch |
|
|
29
|
+
|-----------------|--------|-----------------|---------|--------|--------|
|
|
30
|
+
| 3.x.x | v6 | `@anthropic-ai/claude-agent-sdk` | `latest` | Stable | `main` |
|
|
31
|
+
| 2.x.x | v5 | `@anthropic-ai/claude-agent-sdk` | `ai-sdk-v5` | Stable | `ai-sdk-v5` |
|
|
32
|
+
| 1.x.x | v5 | `@anthropic-ai/claude-code` (legacy) | `v1-claude-code-sdk` | Legacy | `v1` |
|
|
33
|
+
| 0.x.x | v4 | `@anthropic-ai/claude-code` (legacy) | `ai-sdk-v4` | Legacy | `ai-sdk-v4` |
|
|
34
|
+
|
|
35
|
+
## Installation rapide
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# 1. Installer et authentifier le CLI
|
|
39
|
+
npm install -g @anthropic-ai/claude-code
|
|
40
|
+
claude login
|
|
41
|
+
|
|
42
|
+
# 2. Installer le provider (AI SDK v6)
|
|
43
|
+
npm install @boostecom/provider ai@^6.0.0 zod@^4.0.0
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
<Note type="warning">
|
|
47
|
+
**Zod 4 requis** : À partir de v3.2.0, ce package nécessite Zod 4 en raison du SDK sous-jacent.
|
|
48
|
+
</Note>
|
|
49
|
+
|
|
50
|
+
## Exemple basique
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
import { streamText } from 'ai';
|
|
54
|
+
import { claudeCode } from '@boostecom/provider';
|
|
55
|
+
|
|
56
|
+
const result = await streamText({
|
|
57
|
+
model: claudeCode('haiku'),
|
|
58
|
+
prompt: 'Bonjour, Claude!',
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const text = await result.text;
|
|
62
|
+
console.log(text);
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Modèles disponibles
|
|
66
|
+
|
|
67
|
+
- **`opus`** - Claude Opus (le plus capable)
|
|
68
|
+
- **`sonnet`** - Claude Sonnet (performance équilibrée)
|
|
69
|
+
- **`haiku`** - Claude Haiku (le plus rapide et économique)
|
|
70
|
+
|
|
71
|
+
Vous pouvez également utiliser les identifiants complets des modèles directement (ex: `claude-opus-4-5`, `claude-sonnet-4-5-20250514`).
|
|
72
|
+
|
|
73
|
+
## Disclaimer
|
|
74
|
+
|
|
75
|
+
<Note type="danger">
|
|
76
|
+
**Ce provider est non officiel** et n'est ni affilié ni approuvé par Anthropic ou Vercel. En utilisant ce provider :
|
|
77
|
+
|
|
78
|
+
- Vous utilisez Claude Code via votre abonnement Pro/Max — ce provider ne passe pas par l'API Anthropic
|
|
79
|
+
- Vous comprenez que vos données transitent par le CLI Claude Code vers les serveurs d'Anthropic
|
|
80
|
+
- Vous acceptez de respecter les [Conditions d'utilisation d'Anthropic](https://www.anthropic.com/legal/consumer-terms)
|
|
81
|
+
- Vous reconnaissez que ce logiciel est fourni "tel quel" sans garanties d'aucune sorte
|
|
82
|
+
</Note>
|
|
83
|
+
|
|
84
|
+
## Prochaines étapes
|
|
85
|
+
|
|
86
|
+
<CardGroup cols={2}>
|
|
87
|
+
<Card title="Installation" href="/docs/installation" icon="download">
|
|
88
|
+
Guide d'installation détaillé et configuration
|
|
89
|
+
</Card>
|
|
90
|
+
<Card title="Guide d'utilisation" href="/docs/guide" icon="book">
|
|
91
|
+
Exemples complets et patterns d'utilisation
|
|
92
|
+
</Card>
|
|
93
|
+
<Card title="API Reference" href="/docs/api" icon="code">
|
|
94
|
+
Documentation complète de l'API
|
|
95
|
+
</Card>
|
|
96
|
+
<Card title="Exemples" href="/docs/examples" icon="lightbulb">
|
|
97
|
+
Exemples pratiques pour tous les cas d'usage
|
|
98
|
+
</Card>
|
|
99
|
+
</CardGroup>
|