> Discover all available pages from the documentation index: https://mastra.zisheng.pro/fr/llms.txt # Utiliser OpenUI [OpenUI](https://openui.com) est une norme ouverte pour les interfaces utilisateur génératives. Elle associe un langage compact conçu pour le streaming, OpenUI Lang, à un runtime React et à des bibliothèques de composants intégrées, afin que la sortie du modèle soit rendue sous la forme d’une interface structurée pendant le streaming. OpenUI se connecte à Mastra via le [protocole AG-UI](https://docs.ag-ui.com). L’adaptateur `@ag-ui/mastra` encapsule un `Agent` Mastra et émet des événements AG-UI, que `agUIAdapter()` d’OpenUI analyse côté client. > **Astuce:** Pour un exemple complet et fonctionnel, consultez l’exemple [`mastra-chat`](https://github.com/thesysdev/openui/tree/main/examples/mastra-chat) dans le dépôt OpenUI. ## Guide d’intégration Intégrez Mastra dans votre route d’API Next.js et connectez-lui une surface de chat OpenUI `` via le protocole AG-UI. 1. Générez une nouvelle application OpenUI : **npm**: ```bash npx @openuidev/cli@latest create --name openui-mastra-chat ``` **pnpm**: ```bash pnpm dlx @openuidev/cli@latest create --name openui-mastra-chat ``` **Yarn**: ```bash yarn dlx @openuidev/cli@latest create --name openui-mastra-chat ``` **Bun**: ```bash bun x @openuidev/cli@latest create --name openui-mastra-chat ``` Accédez au répertoire de votre nouveau projet : ```bash cd openui-mastra-chat ``` L’application générée est un projet Next.js ayant la structure suivante : ```bash openui-mastra-chat └── src ├── app │ ├── api │ │ └── chat │ │ └── route.ts │ ├── globals.css │ ├── layout.tsx │ └── page.tsx ├── generated │ └── system-prompt.txt └── library.ts ``` La route de chat se trouve dans `src/app/api/chat/route.ts`, la surface de chat dans `src/app/page.tsx` et la bibliothèque de composants dans `src/library.ts`. La CLI OpenUI écrit `src/generated/system-prompt.txt` à partir de votre bibliothèque ; régénérez-le à chaque modification de la bibliothèque. Ajoutez votre clé OpenAI à `.env.local` : ```bash OPENAI_API_KEY=sk-... ``` > **Remarque:** OpenUI requiert une clé de fournisseur de modèles. Utilisez n’importe quel fournisseur pris en charge par Mastra et ajustez la configuration de l’Agent à l’étape suivante. 2. Installez les packages Mastra et l’adaptateur AG-UI pour Mastra : **npm**: ```bash npm install @mastra/core @ag-ui/mastra @ag-ui/core zod ``` **pnpm**: ```bash pnpm add @mastra/core @ag-ui/mastra @ag-ui/core zod ``` **Yarn**: ```bash yarn add @mastra/core @ag-ui/mastra @ag-ui/core zod ``` **Bun**: ```bash bun add @mastra/core @ag-ui/mastra @ag-ui/core zod ``` `@ag-ui/mastra` encapsule un `Agent` Mastra dans un `MastraAgent` qui émet des événements du [protocole AG-UI](https://docs.ag-ui.com). `agUIAdapter()` d’OpenUI consomme ces événements côté client. 3. Ouvrez `src/app/api/chat/route.ts`. Définissez tous les Tools dont votre Agent a besoin avec `createTool` depuis `@mastra/core/tools` : ```typescript import { createTool } from '@mastra/core/tools' import { z } from 'zod' const getWeather = createTool({ id: 'get_weather', description: 'Get current weather for a city.', inputSchema: z.object({ location: z.string().describe('City name') }), execute: async ({ location }) => { return { location, temperature_celsius: 22, condition: 'Clear' } }, }) ``` Encapsulez un `Agent` Mastra dans `MastraAgent`. Injectez le prompt système généré afin que l’Agent sache utiliser la bibliothèque de composants OpenUI : ```typescript import { MastraAgent } from '@ag-ui/mastra' import { Agent } from '@mastra/core/agent' import { readFileSync } from 'fs' import { join } from 'path' const systemPrompt = readFileSync(join(process.cwd(), 'src/generated/system-prompt.txt'), 'utf-8') const agent = new MastraAgent({ agent: new Agent({ id: 'openui-agent', name: 'OpenUI Agent', instructions: `You are a helpful assistant. Use tools when relevant.\n\n${systemPrompt}`, model: { id: 'openai/gpt-5.6-sol', apiKey: process.env.OPENAI_API_KEY, }, tools: { getWeather }, }), resourceId: 'chat-user', }) ``` Exportez un gestionnaire `POST` qui diffuse les événements AG-UI de l’Agent sous forme d’événements envoyés par le serveur, ou SSE : ```typescript import type { Message } from '@ag-ui/core' import { NextRequest } from 'next/server' export async function POST(req: NextRequest) { const { messages, threadId }: { messages: Message[]; threadId: string } = await req.json() const encoder = new TextEncoder() const stream = new ReadableStream({ start(controller) { const subscription = agent .run({ messages, threadId, runId: crypto.randomUUID(), tools: [], context: [] }) .subscribe({ next: event => { controller.enqueue(encoder.encode(`data: ${JSON.stringify(event)}\n\n`)) }, complete: () => { controller.enqueue(encoder.encode('data: [DONE]\n\n')) controller.close() }, error: error => { controller.enqueue( encoder.encode(`data: ${JSON.stringify({ error: error.message })}\n\n`), ) controller.close() }, }) req.signal.addEventListener('abort', () => subscription.unsubscribe()) }, }) return new Response(stream, { headers: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache, no-transform', Connection: 'keep-alive', }, }) } ``` 4. Connectez la surface de chat OpenUI `` à la route. Créez un adaptateur `llm` avec `fetchLLM()` et définissez `streamAdapter` sur `agUIAdapter()` afin qu’OpenUI sache analyser les événements AG-UI. ```tsx 'use client' import '@openuidev/react-ui/components.css' import { AgentInterface, agUIAdapter, fetchLLM } from '@openuidev/react-ui' import { openuiChatLibrary } from '@openuidev/react-ui/genui-lib' const llm = fetchLLM({ url: '/api/chat', streamAdapter: agUIAdapter(), }) export default function Page() { return (
) } ``` La prop `componentLibrary` contrôle les composants que le modèle peut générer. Remplacez `openuiChatLibrary` par votre propre bibliothèque pour restreindre ou étendre la sortie. 5. Démarrez le serveur de développement : **npm**: ```bash npm run dev ``` **pnpm**: ```bash pnpm run dev ``` **Yarn**: ```bash yarn dev ``` **Bun**: ```bash bun run dev ``` Ouvrez . Vous pouvez maintenant converser avec votre Agent Mastra via la surface de chat OpenUI, l’interface structurée étant rendue progressivement pendant le streaming du modèle. ## Streaming avec AG-UI OpenUI consomme le [protocole AG-UI](https://docs.ag-ui.com), un flux d’événements typés destiné aux Agents IA et indépendant du transport. `@ag-ui/mastra` traduit un `Agent` Mastra dans ce protocole : - Le serveur appelle `agent.run({ messages, threadId, runId, ... })` et sérialise chaque événement émis sous la forme d’un message SSE. - Le client transmet `fetchLLM({ streamAdapter: agUIAdapter() })` à ``, qui analyse le flux SSE pour produire les événements internes pilotant le rendu d’OpenUI Lang. `threadId` relie une conversation entre les requêtes et `runId` identifie une exécution unique. Générez un nouveau `runId` pour chaque requête et conservez `threadId` côté client. ## Bibliothèques de composants OpenUI génère une interface à partir d’une bibliothèque de composants. Cette bibliothèque définit les composants disponibles, leurs props et la manière dont le modèle doit les utiliser. ### Bibliothèques intégrées `@openuidev/react-ui` fournit deux bibliothèques prêtes à l’emploi : - `openuiChatLibrary` : composants pour les interfaces de chat, notamment cartes, formulaires, tableaux et graphiques. - `openuiDashboardLibrary` : composants pour les tableaux de bord et les surfaces riches en données. Transmettez la bibliothèque à `` pour mettre ses composants à la disposition du modèle. ### Personnaliser la bibliothèque Pour restreindre ou étendre la sortie, définissez votre propre bibliothèque dans `src/library.ts` et exportez un sous-ensemble de composants. Transmettez cette bibliothèque à `` et régénérez le prompt système à chaque modification de la bibliothèque : **npm**: ```bash npx @openuidev/cli generate src/library.ts --out src/generated/system-prompt.txt ``` **pnpm**: ```bash pnpm dlx @openuidev/cli generate src/library.ts --out src/generated/system-prompt.txt ``` **Yarn**: ```bash yarn dlx @openuidev/cli generate src/library.ts --out src/generated/system-prompt.txt ``` **Bun**: ```bash bun x @openuidev/cli generate src/library.ts --out src/generated/system-prompt.txt ``` Le prompt généré est lu par la route d’API et fusionné dans les `instructions` de l’Agent, afin que celui-ci sache exactement quels composants il peut émettre.