Démarrage rapide
Build a working AI agent in 10 minutes. Start with a stub, add streaming, validation, then connect a real LLM.
Goa-AI étend la philosophie “design-first” de Goa aux systèmes agentiques. Définissez des agents, des ensembles d’outils et des politiques dans un DSL ; générez du code prêt à la production avec des contrats typés, des flux de travail durables et des événements en continu.
**Arrêtez d’écrire un code d’agent fragile. Commencez par des contrats
La plupart des cadres d’agents vous obligent à relier impérativement les invites, les outils et les appels d’API. Lorsque les choses se cassent - et elles se cassent - vous devez déboguer un code éparpillé sans source de vérité claire.
Goa-AI renverse cette situation : définissez les capacités de votre agent dans un DSL typé, puis générez l’implémentation. Votre conception est votre documentation. Vos contrats sont votre validation. Les changements se propagent automatiquement.
Agent("assistant", "A helpful coding assistant", func() {
Use("code_tools", func() {
Tool("analyze", "Analyze code for issues", func() {
Args(func() {
Attribute("code", String, "Source code to analyze", func() {
MinLength(1) // Can't be empty
MaxLength(100000) // Reasonable size limit
})
Attribute("language", String, "Programming language", func() {
Enum("go", "python", "javascript", "typescript", "rust", "java")
})
Required("code", "language")
})
Return(AnalysisResult)
})
})
})
Lorsque le LLM appelle cet outil avec des arguments invalides - par exemple, une chaîne code vide ou language: "cobol" - Goa-AI réessaie automatiquement avec un message d’erreur de validation. Le LLM voit exactement ce qui n’a pas fonctionné et se corrige. Aucun code manuel de gestion des erreurs n’est nécessaire.
Avantages:
→ Pour en savoir plus, consultez les pages DSL Reference et Quickstart
Construire des systèmes complexes à partir de pièces simples et observables.
Les applications d’IA du monde réel ne sont pas des agents uniques, mais des flux de travail orchestrés où les agents délèguent à d’autres agents, où les outils génèrent des sous-tâches et où vous devez tout tracer.
Le modèle d’arbre d’exécution de Goa-AI vous donne une exécution hiérarchique avec une observabilité totale. Chaque exécution d’agent a un identifiant unique. Les exécutions enfant sont liées aux parents. Les événements s’enchaînent en temps réel. Déboguez toute défaillance en parcourant l’arbre.
Avantages:
→ Approfondissement de la Composition de l’agent et de l’Exécution
Visibilité en temps réel de chaque décision prise par vos agents.
Les agents “boîte noire” sont un handicap. Lorsque votre agent appelle un outil, commence à réfléchir ou rencontre une erreur, vous devez le savoir immédiatement, pas après que la requête ait expiré.
Goa-AI émet des événements typés tout au long de l’exécution : assistant_reply pour le texte en continu, tool_start/tool_end pour le cycle de vie de l’outil, planner_thought pour la visibilité du raisonnement, usage pour le suivi des jetons. Les événements transitent par une simple interface Sink vers n’importe quel transport.
// Wire a sink at startup — all events from all runs flow through it
rt := runtime.New(runtime.WithStream(mySink))
// Or subscribe to a specific run
stop, _ := rt.SubscribeRun(ctx, runID, connectionSink)
defer stop()
les profils de flux filtrent les événements pour différents consommateurs : UserChatProfile() pour les interfaces utilisateur, AgentDebugProfile() pour les vues des développeurs, MetricsProfile() pour les pipelines d’observabilité. Les puits intégrés pour Pulse (Redis Streams) permettent une diffusion en continu distribuée entre les services.
Avantages:
RunID et SessionID pour le routage et le filtrage→ Détails de la mise en œuvre dans [Production Streaming] (production/#streaming-ui)
Les agents qui survivent aux pannes, aux redémarrages et aux défaillances du réseau.
Sans durabilité, un processus bloqué perd toute progression. Un appel d’API à taux limité fait échouer l’ensemble de l’exécution. Une défaillance du réseau au cours de l’exécution d’un outil implique de réexécuter une inférence coûteuse.
Goa-AI utilise Temporal pour une exécution durable. Les exécutions d’agents deviennent des flux de travail ; les appels d’outils deviennent des activités avec des tentatives configurables. Chaque transition d’état est conservée. Un outil qui tombe en panne réessaie automatiquement -sans ré-exécuter l’appel LLM qui l’a produit.
// Development: in-memory (no dependencies)
rt := runtime.New()
// Production: Temporal for durability
eng, _ := temporal.New(temporal.Options{
ClientOptions: &client.Options{HostPort: "localhost:7233"},
WorkerOptions: temporal.WorkerOptions{TaskQueue: "my-agents"},
})
rt := runtime.New(runtime.WithEngine(eng))
Avantages:
→ Guide d’installation et configuration de la reprise dans [Production] (production/#temporal-setup)
Découvrez et consommez des outils à partir de n’importe où - votre cluster ou le nuage public.
Avec le développement des écosystèmes d’IA, les outils sont omniprésents : services internes, API tierces, registres MCP publics. Le codage en dur des définitions d’outils n’est pas évolutif. Vous avez besoin d’une découverte dynamique.
Goa-AI fournit un registre interne groupé pour vos propres ensembles d’outils et fédération avec des registres externes comme le catalogue MCP d’Anthropic. Définissez une fois, découvrez partout.
// Connect to public registries
var AnthropicRegistry = Registry("anthropic", func() {
Description("Anthropic MCP Registry")
URL("https://registry.anthropic.com/v1")
Security(AnthropicOAuth)
Federation(func() {
Include("web-search", "code-execution", "filesystem")
Exclude("experimental/*")
})
SyncInterval("1h")
CacheTTL("24h")
})
// Or run your own clustered registry
var CorpRegistry = Registry("corp", func() {
Description("Internal tool registry")
URL("https://registry.corp.internal")
Security(CorpAPIKey)
SyncInterval("5m")
})
Registre interne en grappe:
Plusieurs nœuds de registre portant le même nom forment automatiquement un cluster via Redis. État partagé, contrôles de santé coordonnés, mise à l’échelle horizontale, tout est automatique.
Avantages:
→ En savoir plus dans Intégration MCP et Production
| Caractéristiques de l’offre de l’entreprise | |
|---|---|
| Design-First Agents | Définition d’agents en DSL, génération de code à sécurité de type |
| Intégration MCP](mcp-integration/) | Support natif du protocole Model Context |
| Registres d’outils](#tool-registries) | |
| Run Trees | Agents appelant des agents avec une traçabilité complète |
| Événements typés en temps réel pour les interfaces utilisateur et l’observabilité | |
| Durabilité temporelle](#temporal-durability) | Exécution tolérante aux fautes qui survit aux défaillances |
| Contrats typés | Sécurité de type de bout en bout pour toutes les opérations de l’outil |
| Guide de l’utilisateur - Description - ~Tokens - ~Tokens - ~Tokens - ~Tokens - ~Tokens | ||
|---|---|---|
| Quickstart | Installation et premier agent | ~2,700 |
| DSL Reference](dsl-reference/) | DSL complet : agents, toolsets, policies, MCP | ~3,600 |
| Runtime | Architecture du runtime, boucle plan/execute, moteurs | ~2,400 |
| Outils | Types d’outils, modèles d’exécution, transformations | ~2 300 |
| Composition de l’agent](agent-composition/) | Agent en tant qu’outil, arbres d’exécution, topologie de streaming | ~1.400 |
| Intégration MCP | Serveurs MCP, transports, wrappers générés | ~1,200 |
| Mémoire et sessions | Transcriptions, mémoires, sessions, exécutions | ~1.600 |
| Production](production/) | Configuration temporelle, interface utilisateur en continu, intégration de modèles | ~2 200 |
| Test et dépannage | Agents de test, planificateurs, outils, erreurs courantes | ~2 000 |
Total de la section: ~21 400 jetons
Goa-AI suit un pipeline define → generate → execute qui transforme les conceptions déclaratives en systèmes d’agents prêts à la production.
Layer Overview:
| Couche - Objectif - Objectif - Objectif - Objectif | |
|---|---|
| La couche de base est composée de deux couches : DSL | Déclarer les agents, les outils, les politiques et les intégrations externes dans un code Go à version contrôlée |
La couche d’exécution a pour but de générer des spécifications, des codecs, des définitions de flux de travail et des clients de registre sécurisés par type, sans jamais modifier gen/ | La couche d’exécution a pour but d’exécuter les tâches de la couche d’exécution |
| Le moteur d’exécution exécute la boucle plan/exécution avec l’application de la politique, la persistance de la mémoire et le flux d’événements | |
| Le moteur d’exécution de la boucle plan/exécution avec persistance de la mémoire et flux d’événements | |
| Les caractéristiques de l’application sont les suivantes : - Branchez des fournisseurs de modèles (OpenAI, Anthropic, AWS Bedrock), de la persistance (Mongo), du streaming (Pulse) et des registres (AWS) |
Points d’intégration clés:
Goa-AI fournit des adaptateurs de première classe pour trois fournisseurs LLM :
features/model/openai)features/model/anthropic)features/model/bedrock)Ces trois modèles mettent en œuvre la même interface model.Client utilisée par les planificateurs. Les applications enregistrent les clients modèles avec le runtime en utilisant rt.RegisterModel("provider-id", client) et s’y réfèrent par ID à partir des planificateurs et des configurations d’agents générées, de sorte que l’échange de fournisseurs est un changement de configuration plutôt qu’une refonte.
L’ajout d’un nouveau fournisseur suit le même schéma :
model.Client pour votre fournisseur en mappant ses types SDK sur model.Request, model.Response et model.Chunk en continu.features/model/middleware.NewAdaptiveRateLimiter) pour la limitation adaptative du débit et les mesures.rt.RegisterModel("my-provider", client) avant d’enregistrer les agents, puis faites référence à "my-provider" à partir de vos planificateurs ou de la configuration des agents.Comme les planificateurs et le moteur d’exécution ne dépendent que de model.Client, les nouveaux fournisseurs s’intègrent sans modifier vos conceptions Goa ou le code de l’agent généré.
package design
import (
. "goa.design/goa/v3/dsl"
. "goa.design/goa-ai/dsl"
)
var _ = Service("calculator", func() {
Description("Calculator service with an AI assistant")
// Define a service method that the tool will bind to
Method("add", func() {
Description("Add two numbers")
Payload(func() {
Attribute("a", Int, "First number")
Attribute("b", Int, "Second number")
Required("a", "b")
})
Result(Int)
})
// Define the agent within the service
Agent("assistant", "A helpful assistant agent", func() {
// Use a toolset with tools bound to service methods
Use("calculator", func() {
Tool("add", "Add two numbers", func() {
Args(func() {
Attribute("a", Int, "First number")
Attribute("b", Int, "Second number")
Required("a", "b")
})
Return(Int)
BindTo("add") // Bind to the service method
})
})
// Configure the agent's run policy
RunPolicy(func() {
DefaultCaps(MaxToolCalls(10))
TimeBudget("5m")
})
})
})
Commencez par le guide Quickstart pour installer Goa-AI et créer votre premier agent.
Pour une couverture complète du DSL, voir la Référence DSL.
Pour comprendre l’architecture du runtime, voir le guide Runtime.