Trouvez rapidement des informations détaillées sur chaque composant du framework Agent dans cette référence complète.
Structure des dossiers
Pour créer un agent, vous devez créer un dossier portant son nom et contenant au moins les fichiers suivants:
agent.py
: fichier principal de l'agent. Vous devez définir votre agent racine sous la variable globaleroot_agent
.__init__.py
: fichier du module Python. Il doit contenir au moins une lignefrom agents import Agent
pour importer la classeAgent
.
Vous pouvez également ajouter les fichiers suivants:
requirements.txt
: fichier de dépendances Python de l'agent.README.md
: fichier README de l'agent. Il doit contenir les instructions de configuration et d'exécution de l'agent.
Agent.py minimal
La création d'un agent commence par la création d'une instance de la classe Agent
. L'agent minimal doit présenter les attributs suivants:
name
: nom de l'agent.model
: nom du modèle LLM à utiliser.instruction
: instructions en langage naturel pour l'agent.
Exemple :
from agents import Agent
root_agent = Agent(
model='gemini-1.5-flash',
name='root_agent',
instruction="Be polite and answer all users' questions.",
)
Pour créer un agent minimal, vous pouvez copier le dossier _empty_agent
et modifier le fichier agent.py
.
Attributs
nom
name: str
Nom de l'agent.
Identifiant
- Le nom doit respecter la convention d'attribution de noms des identifiants.
- Une chaîne est considérée comme un identifiant valide si elle ne contient que des lettres alphanumériques (a-z) et (0-9), ou des traits de soulignement (_). Un identifiant valide ne peut pas commencer par un chiffre ni contenir d'espace.
Unique
- Le nom doit être unique dans l'ensemble de l'arborescence des agents.
Agent racine
- Bien que la variable de l'agent racine doive être nommée
root_agent
, vous pouvez définir un attribut de nom plus explicite pour l'agent racine.
- Bien que la variable de l'agent racine doive être nommée
modèle
model: str
Nom du modèle LLM à utiliser.
Obligatoire pour l'agent LLM
- L'attribut "model" n'est obligatoire que pour l'agent LLM.
- Vous n'avez pas besoin de définir l'attribut de modèle pour les agents séquentiels, en boucle ou autres agents non LLM.
Agent parent
- Vous pouvez omettre l'attribut de modèle. Dans ce cas, l'agent utilisera l'attribut de modèle de l'agent parent / ancêtre.
Format
- Le format du nom du modèle varie selon le fournisseur du LLM.
- Pour Gemini, il ressemble à
gemini-1.5-flash
ougemini-2.0-flash-exp
. - Pour Anthropic sur Vertex, il ressemble à
claude-3-5-sonnet-v2@20241022
. - Bien que la conception du framework autorise n'importe quel fournisseur de modèles, nous n'acceptons actuellement que Gemini et Anthropic sur Vertex.
instruction
instruction: str | InstructionProvider
Instructions en langage naturel pour l'agent.
Obligatoire pour l'agent LLM
- Cette instruction n'est obligatoire que pour l'agent LLM.
- Vous n'avez pas besoin de définir l'attribut d'instruction pour les agents séquentiels, en boucle ou autres agents non LLM.
Type de données
- L'instruction peut être une chaîne.
- L'instruction peut également être un InstructionProvider appelable.
InstructionProvider
- Un InstructionProvider est défini comme
Callable[[InvocationContext], str]
. - Il vous permet de fournir une fonction pour générer dynamiquement l'instruction en fonction du contexte d'appel.
- Un InstructionProvider est défini comme
État
- L'instruction est un modèle de chaîne. Vous pouvez utiliser la syntaxe {var} pour insérer des valeurs dynamiques dans l'instruction.
var
permet d'insérer la valeur de la variable d'état nommée var.artifact.var
permet d'insérer le contenu textuel de l'artefact nommé "var".- Si la variable d'état ou l'artefact n'existe pas, l'agent génère une erreur. Si vous souhaitez ignorer l'erreur, vous pouvez ajouter un
?
au nom de la variable, par exemple{var?}
.
Consignes
- Commencez par indiquer qui est l'agent, ce qu'il peut faire et ce qu'il ne peut pas faire.
- Vous pouvez utiliser le format Markdown pour rendre les consignes plus lisibles, à la fois pour les humains et pour le modèle.
- Si l'agent peut effectuer plusieurs tâches, fournissez-lui une liste de tâches et créez des sections distinctes pour chacune d'elles.
- Si une tâche comporte plusieurs étapes, fournissez une liste des étapes et des instructions détaillées pour chacune d'elles.
- Si l'agent peut utiliser des outils, listez-les sous l'attribut
tools
. La définition de l'outil contient des instructions sur la façon de l'utiliser, mais des instructions détaillées sur le moment où l'utiliser peuvent être ajoutées à l'instruction de l'agent pour améliorer les performances. - Pour un système multi-agent, décrivez quand il doit passer la main à l'autre agent.
- Vous pouvez inclure des exemples d'entrée et de sortie attendue dans l'instruction. Vous pouvez également utiliser l'attribut
examples
pour fournir des exemples. - Soyez précis et détaillé dans vos instructions. Traitez l'agent comme un nouvel employé en cours de formation.
- Ne vous fiez pas à des instructions sur des règles qui doivent être suivies à 100 %. Le modèle possède intrinsèquement un certain degré de liberté et peut commettre des erreurs. Aidez-vous d'outils et de rappels pour appliquer des règles strictes.
description
description: str
Décrit ce que cet agent peut faire. Cette description est envoyée au modèle dans le cadre des instructions du système afin que:
L'agent lui-même comprend ses propres capacités en fonction de la description.
Un agent comprend ce que les autres agents peuvent faire et décide de transférer la demande en fonction de leurs descriptions.
global_instruction
global_instruction: str | InstructionProvider
Instruction globale pour l'ensemble de l'arborescence des agents.
Alors que l'instruction indique à un agent particulier ce qu'il doit faire et comment le faire, l'instruction globale s'applique à tous les agents de l'ensemble de l'arborescence des agents.
L'utilisation de l'instruction globale est semblable à celle de l'attribut d'instruction, y compris le type de données, la prise en charge d'InstructionProvider et la possibilité d'accéder aux variables d'état et aux artefacts.
- Identification et comportement
- Vous utilisez une instruction globale pour définir l'identité et le comportement/la norme pour l'ensemble de l'arborescence des agents, plutôt que pour savoir comment effectuer une tâche spécifique pour un agent particulier.
generate_content_config
generate_content_config: google.genai.types.GenerateContentConfig
Configuration supplémentaire du modèle pour l'agent. Ils seront fusionnés dans la requête envoyée au modèle.
Vous ne devez pas définir certains attributs dans ce champ, car ils sont gérés par le framework: - tools
- system_instruction
- response_schema
examples
examples: list[Example] | BaseExampleProvider
Exemples few-shot pour l'agent. Des études montrent que fournir des exemples à quelques reprises peut améliorer les performances de l'agent.
- Exemples statiques
- Vous pouvez fournir une liste d'exemples statiques. Un exemple est défini comme suit, où
input
est le contenu d'entrée etoutput
est le contenu de sortie attendu.
- Vous pouvez fournir une liste d'exemples statiques. Un exemple est défini comme suit, où
class Example(BaseModel):
input: types.Content
output: list[types.Content]
Liste de sortie
- La sortie peut être une liste de
Content
. - Vous pouvez donc définir une séquence de contenus comme sortie attendue. Par exemple, le modèle doit d'abord effectuer un appel de fonction, puis générer du texte.
- La sortie peut être une liste de
BaseExampleProvider
- Vous pouvez également fournir une instance de la classe
BaseExampleProvider
. - La classe
BaseExampleProvider
comporte une méthodeget_examples(query: str)
et renvoie une liste deExample
. - Avec
BaseExampleProvider
, vous pouvez générer dynamiquement des exemples en fonction de la requête.
- Vous pouvez également fournir une instance de la classe
greeting_prompt
greeting_prompt: str
Vous pouvez définir une invite qui sera envoyée au modèle pour générer un message d'accueil. L'invite d'accueil est utilisée lorsque vous appelez l'agent avec une session vide et une entrée utilisateur vide.
planification
planning: bool
Si vous définissez planning
sur "True", le mode de planification est activé pour l'agent. En mode planification, l'agent génère d'abord un plan pour répondre à la requête de l'utilisateur, puis exécute le plan étape par étape.
code_executor
code_executor: BaseCodeExecutor
L'agent que vous avez créé peut résoudre des problèmes en écrivant du code et en l'exécutant.
Il existe deux façons d'activer l'exécution du code:
Certains modèles peuvent exécuter du code directement. Par exemple, le modèle Gemini 2.0 en mode en direct génère et exécute automatiquement du code, sans avoir besoin d'un outil d'exécution de code distinct.
Vous pouvez définir l'attribut
code_executor
sur une instance de la classeBaseCodeExecutor
pour activer l'exécution du code. Actuellement, nous proposons une classeVertexCodeExecutor
etUnsafeLocalCodeExecutor
(étant donné que les codes générés par le LLM peuvent être dévastateurs, n'utilisezUnsafeLocalCodeExecutor
que pour le prototypage) que vous pouvez utiliser pour exécuter du code sur Vertex AI. D'autres exécuteurs de code seront ajoutés à l'avenir.
input_schema
input_schema: type[BaseModel]
L'agent appliquera le schéma d'entrée lorsque vous spécifierez un modèle Pydantic en tant que input_schema
. Le contenu de l'entrée doit être une chaîne JSON conforme au schéma.
output_schema
output_schema: type[BaseModel]
L'agent appliquera le schéma de sortie lorsque vous spécifierez un modèle Pydantic en tant que output_schema
. Le contenu de la sortie sera toujours une chaîne JSON conforme au schéma.
output_key
output_key: str
L'agent stockera sa sortie dans la variable d'état sous le nom spécifié par l'attribut output_key
.
include_contents
include_contents: Literal['default', 'none']
Par défaut, l'agent inclut le contenu de l'historique de la session (historique des discussions). Vous pouvez définir l'attribut include_contents
sur none
pour désactiver ce comportement. Dans ce cas, l'agent spécifique ne verra pas l'historique des discussions. Cette option est utile lorsque l'agent n'a pas besoin de connaître l'historique de chat.
Outils
La possibilité d'utiliser des outils distingue les agents du modèle. Tout comme la capacité à utiliser des outils de manière complexe et polyvalente est considérée comme une caractéristique déterminante de l'être humain.
Dans le framework de l'agent, vous fournissez des outils à votre agent via l'attribut tools
.
L'attribut tools
est une liste d'outils, chacun pouvant être:
- Une fonction Python.
- Classe qui implémente la classe
BaseTool
.
Outil de fonction Python
Vous pouvez définir une fonction Python comme un outil.
Paramètres
- Votre fonction peut avoir un nombre illimité de paramètres.
- Chaque paramètre peut être de n'importe quel type, à condition que le type soit sérialisable en JSON.
- Ne définissez pas de valeur par défaut pour vos paramètres, car ils ne sont pas acceptés par le modèle.
Type renvoyé
- Le type de retour doit être un dictionnaire.
- Si vous renvoyez un élément autre qu'un dictionnaire, le framework l'encapsule dans un dictionnaire avec une seule clé
result
. - Essayez d'être descriptif dans votre valeur renvoyée. Par exemple, au lieu de renvoyer un code d'erreur numérique, renvoyez un
error_message: str
avec un message d'erreur lisible. N'oubliez pas que cette valeur de retour est destinée à être lue et comprise par le modèle, et non à être exécutée par un code. - Il est recommandé d'utiliser une clé
status
pour indiquersuccess
,error
,pending
, etc. afin que le modèle comprenne l'état général de l'opération.
Chaîne de documentation
- La docstring de la fonction sera utilisée comme description de l'outil et envoyée au modèle. Plus la docstring est complète, plus le modèle peut utiliser l'outil.
Simplicité
- Bien que vous disposiez d'une grande liberté pour définir votre fonction, vous devez la garder simple et facile à utiliser pour que le modèle puisse l'utiliser plus précisément.
- Il est préférable d'avoir moins de paramètres que d'en avoir beaucoup.
- Utilisez autant que possible des types de données simples, par exemple
str
,int
, plutôt que des classes personnalisées. - Le nom de la fonction et les paramètres sont très importants. Si vous avez une fonction appelée
do_stuff()
, même si vous indiquez au modèle qu'elle sert à annuler un vol, il peut toujours refuser de l'utiliser. - Séparez les fonctions complexes en fonctions plus petites. Par exemple, séparez
update_profile(profile: Profile)
enupdate_name(name: str)
,update_age(age: int)
, etc.
Référence dans l'instruction
- Vous pouvez faire référence à l'outil dans l'instruction en utilisant son nom.
- Si le nom et la docstring de la fonction sont suffisamment détaillés, vous pouvez vous concentrer uniquement sur le moment où utiliser l'outil dans l'instruction.
- Indiquez à l'agent comment gérer les différentes valeurs renvoyées. Par exemple, si l'outil renvoie un message d'erreur, l'agent doit-il abandonner, réessayer ou demander plus d'informations ?
- Les outils peuvent être utilisés de manière séquentielle, et l'un peut dépendre de la sortie de l'autre. Décrivez la séquence dans l'instruction.
Contexte de l'outil
Dans votre fonction d'outil, vous pouvez ajouter un paramètre spécial tool_context:
ToolContext
pour obtenir des informations supplémentaires sur le contexte dans lequel l'outil est appelé.
La classe ToolContext
se trouve dans le module agents.types
et présente les attributs suivants:
function_call_event_id: str
- ID de l'événement au cours duquel l'appel d'outil est déclenché.
function_call_id: str
- ID de l'appel de fonction.
state: State
- Objet semblable à un dictionnaire pour lire et mettre à jour les variables d'état.
actions: EventActions
- Actions supplémentaires que l'outil peut effectuer.
La classe EventActions
se trouve dans le module agents.events
et comporte les attributs suivants pour permettre à l'outil d'effectuer des actions supplémentaires:
skip_summarization: bool
- Si elle est définie sur "True", le framework ignore l'étape de résumé pour l'événement où l'outil est appelé.
transfer_to_agent: str
- Si défini, le framework transfère l'agent avec le nom spécifié par l'attribut
transfer_to_agent
.
- Si défini, le framework transfère l'agent avec le nom spécifié par l'attribut
escalate: bool
- Si cette valeur est définie sur "True", l'agent transfère la requête à son agent parent. L'escalade d'un agent enfant dans un LoopFlow signifie la fin de la boucle.
AsyncFunctionTool
AsyncFunctionTool est une sous-classe de FunctionTool. Il est conçu pour les outils qui prennent beaucoup de temps.
Pour créer un AsyncFunctionTool, vous devez définir une fonction Python standard et l'encapsuler dans la classe AsyncFunctionTool
. Par exemple :
AsyncFunctionTool(func=your_function)
AsyncFunctionTool appellera toujours votre fonction Python, où vous pourrez lancer la tâche qui peut prendre beaucoup de temps. Vous pouvez renvoyer un résultat intermédiaire au modèle pour lui indiquer que la tâche n'est pas encore terminée. Ajouter des informations telles que status: 'pending'
, progress: 20
, estimated_completion_time: '...'
, etc. aidera le modèle à fournir une réponse pertinente à l'utilisateur.
Plus tard, lorsque l'opération sera terminée, vous pourrez appeler l'agent avec une nouvelle fonction Response pour lui fournir le résultat final. À ce moment-là, l'agent générera une réponse finale à l'utilisateur.
AgentTool
AgentTool vous permet d'appeler un autre agent pour qu'il effectue une tâche. Cela équivaut à créer une fonction Python, à appeler un autre agent avec les arguments de la fonction et à utiliser la réponse de cet agent comme valeur renvoyée de la fonction.
Un AgentTool est différent d'un agent enfant:
- Lorsque l'agent A appelle l'agent B en tant qu'AgentTool, la réponse de l'agent B est transmise à l'agent A, qui résume la réponse et génère une réponse à l'utilisateur. Les futures entrées utilisateur seront toujours traitées par l'agent A.
- Lorsque l'agent A appelle l'agent B en tant qu'agent enfant, la responsabilité de répondre à l'utilisateur est entièrement transférée à l'agent B. L'agent A ne sera pas dans l'image. Dans ce cas, l'agent B répondra aux futures entrées de l'utilisateur.
Pour utiliser un agent comme outil, vous pouvez utiliser la classe AgentTool
pour l'encapsuler.
Par exemple : tools=[AgentTool(agent=agent_b)]
AgentTool dispose des attributs suivants pour personnaliser son comportement:
skip_summarization
- Si cette valeur est définie sur "True", le framework ignore l'appel du LLM pour résumer la réponse de l'agent de l'outil.
Rappels
Types de rappel
Vous pouvez personnaliser davantage le comportement de l'agent en définissant des rappels. Nous acceptons deux types de rappels:
- Les BeforeCallbacks sont appelés avant que l'agent n'effectue une action. Vous pouvez modifier l'action, l'ignorer ou effectuer d'autres actions.
- Les AfterCallbacks sont appelés une fois que l'agent a effectué une action. Vous pouvez utiliser ce rappel pour modifier le résultat de l'action ou effectuer d'autres actions.
Actions compatibles
Nous avons des BeforeCallbacks et des AfterCallbacks pour les actions suivantes:
- Appeler un agent
- Appel d'un LLM.
- Appel d'un outil.
Liste des rappels
Par conséquent, nous avons les six rappels suivants, qui sont tous des attributs de la classe Agent
:
before_agent_callback
def before_agent_callback(invocation_context: InvocationContext) -> Content | None
- Une invocation peut inclure plusieurs appels d'agent. Ce rappel peut donc être appelé plusieurs fois.
- Si vous renvoyez un
Content
à partir de ce rappel, l'agent ignorera l'appel actuel et utilisera leContent
renvoyé comme réponse.
after_agent_callback
def after_agent_callback(invocation_context: InvocationContext) -> Content | None
- Une invocation peut inclure plusieurs appels d'agent. Ce rappel peut donc être appelé plusieurs fois.
- Si vous renvoyez un
Content
à partir de ce rappel, l'agent ajoutera leContent
renvoyé après sa propre réponse.
before_model_callback
def before_model_callback(
invocation_context: InvocationContext,
llm_request: LlmRequest) -> LlmResponse | None
- Un appel d'agent peut inclure plusieurs appels LLM. Ce rappel peut donc être appelé plusieurs fois.
- Si vous renvoyez un
LlmResponse
à partir de ce rappel, l'agent utilisera leLlmResponse
renvoyé comme réponse et ignorera l'appel du modèle.
before_model_callback
def after_model_callback(
invocation_context: InvocationContext,
llm_response: LlmResponse) -> LlmResponse | None
- Un appel d'agent peut inclure plusieurs appels LLM. Ce rappel peut donc être appelé plusieurs fois.
- Si vous renvoyez un
LlmResponse
à partir de ce rappel, l'agent utilisera leLlmResponse
renvoyé comme réponse, au lieu de la réponse générée par le modèle.
before_tool_callback
def before_tool_callback(
invocation_context: InvocationContext,
tool: BaseTool,
args: dict[str, Any],
tool_context: ToolContext) -> dict | None
- Un appel de modèle peut inclure plusieurs appels d'outils. Ce rappel peut donc être appelé plusieurs fois.
- Si vous renvoyez un
dict
à partir de ce rappel, l'agent utilisera ledict
renvoyé comme réponse et ignorera l'appel de l'outil.
after_tool_callback
def after_tool_callback(
invocation_context: InvocationContext,
tool: BaseTool,
args: dict[str, Any],
tool_context: ToolContext,
response: dict) -> dict | None
- Un appel de modèle peut inclure plusieurs appels d'outils. Ce rappel peut donc être appelé plusieurs fois.
- Si vous renvoyez un
dict
à partir de ce rappel, l'agent utilisera ledict
renvoyé comme réponse, au lieu de la réponse générée par l'outil.
Sessions
Vous n'avez pas besoin de manipuler directement l'objet de session lorsque vous créez un agent. Le framework gère l'objet de session à votre place. Il est toutefois utile de comprendre en quoi consiste la session et comment elle fonctionne.
Une session dans le framework Agent comporte deux composants principaux:
- Événements: liste d'événements.
- État: objet semblable à un dictionnaire de variables d'état.
Événements
Les événements ne sont qu'une simple liste d'objets d'événement. Vous pouvez considérer cela comme un historique de chat, que ce soit entre un utilisateur et un agent ou entre différents agents. Il n'enregistre pas seulement les mots de l'utilisateur ou du modèle, mais aussi toutes les actions effectuées par l'agent, y compris l'appel d'un outil, la réponse de l'outil, l'appel d'un autre agent, etc.
La liste des événements est une liste en mode "append-only". Vous ne pouvez ajouter que des événements à la liste, mais vous ne pouvez pas en supprimer ni en modifier. Lorsqu'un événement s'est produit, il s'est produit. Il n'y a aucun moyen de le modifier. Nous avons conçu le système de cette manière pour qu'il soit simple et que nous puissions toujours revenir à un moment spécifique pour voir l'instantané exact du système.
État
L'état est un objet semblable à un dictionnaire qui contient toutes les variables d'état. Vous pouvez y accéder depuis les emplacements suivants:
- À partir de l'instruction, vous pouvez utiliser la syntaxe
{var}
pour insérer la valeur de la variable d'état nommée var. - À partir des rappels, vous pouvez accéder à la variable d'état via
invocation_context.state['key']
. Vous pouvez également mettre à jour la variable d'état avecinvocation_context.state['key'] = value
. - Dans les outils, vous pouvez accéder à la variable d'état via
tool_context.state['key']
. Vous pouvez également mettre à jour la variable d'état avectool_context.state['key'] = value
.
L'état est associé à une session spécifique. Il s'agit donc de l'endroit idéal pour stocker les informations utiles dans le contexte de cette session.
Tous les agents de l'arborescence des agents peuvent accéder à l'état, ce qui en fait un emplacement idéal pour communiquer entre eux. Un agent peut effectuer une action et stocker son résultat dans l'état. Un autre agent peut ensuite lire le résultat de l'état et poursuivre le travail.
Artefacts
Lorsque le modèle ou votre outil crée un fichier, qu'il s'agisse d'une image, d'une vidéo, d'un document ou de tout autre format, vous pouvez les stocker en tant qu'artefact. Un artefact est un fichier associé à une session particulière, auquel les agents ou votre propre code peuvent accéder.
Cas d'utilisation
- Lorsque votre agent travaille avec l'utilisateur pour créer / modifier un fichier. Par exemple, un agent qui aide l'utilisateur à générer et à modifier une image.
- Lorsque vous souhaitez que l'agent réponde à des questions sur un fichier ou le modifie en fonction des instructions de l'utilisateur.
Avantages en termes de performances
Une autre façon de gérer les fichiers volumineux consiste à les stocker en octets dans l'historique des discussions. Toutefois, cette approche présente quelques inconvénients:
- Cela ralentit l'historique des sessions.
- Il est difficile de récupérer le fichier dans l'historique des discussions.
- Les octets seront envoyés au modèle pour toutes les requêtes, même si la conversation n'a rien à voir avec ces fichiers.
Accéder aux artefacts
Vous pouvez accéder aux artefacts de plusieurs manières:
- Dans l'instruction, vous pouvez utiliser la syntaxe
{artifact.var}
pour insérer le contenu textuel de l'artefact nommé var. Les artefacts binaires ne sont pas encore acceptés. - Dans les rappels, vous pouvez accéder à l'artefact via
invocation_context.get_artifact('key')
. Vous pouvez mettre à jour l'artefact en utilisantinvocation_context.set_artifact('key', value)
. - Dans les outils, vous pouvez accéder à l'artefact par
tool_context.get_artifact('key')
. Vous pouvez mettre à jour l'artefact en utilisanttool_context.set_artifact('key', value)
.
Systèmes multi-agents
Un seul agent et des outils de liste peuvent contribuer grandement à la création d'un système complexe. Toutefois, parfois, séparer la logique en plusieurs agents peut améliorer les performances et la facilité de maintenance du système global.
Voici les cas où vous pouvez envisager d'utiliser plusieurs agents:
- Lorsque l'instruction de l'agent devient trop longue, avec plusieurs tâches et étapes pour chaque tâche.
- Lorsque vous devez exécuter un workflow plus déterministe. Par exemple, pour un agent de recherche, il génère toujours un plan, puis l'exécute, puis résume les résultats.
Arbre des agents hiérarchique
children: list[BaseAgent]
Vous créez un système multi-agent en créant un arbre d'agents hiérarchique. L'agent racine est le point d'entrée du système et peut appeler d'autres agents en fonction de sa configuration.
Un agent peut avoir plusieurs agents enfants. Les agents enfants peuvent également avoir leurs propres agents enfants. L'arborescence des agents peut être arbitrairement profonde, mais pour des raisons de performances, nous vous recommandons d'utiliser une arborescence moins profonde.
Pour former l'arborescence des agents, vous devez définir d'autres agents comme enfants d'un agent parent.
Flux
flow: str | BaseFlow | FlowCallable
Lorsqu'un agent reçoit une requête d'utilisateur, il peut choisir de la traiter lui-même ou de la transmettre à un autre agent. Cela est défini par son attribut flow
.
Il existe quelques flux prédéfinis, mais vous pouvez également définir vos propres flux.
sequential
: l'agent appelle ses agents enfants un par un dans l'ordre.loop
: l'agent appelle ses agents enfants dans une boucle. Jusqu'à ce que l'un des agents enfants définissetool_context.actions.escalate
sur "True".single
: il s'agit d'un flux basé sur un LLM. L'agent appelle le LLM pour répondre à la requête de l'utilisateur et appelle ses outils si nécessaire.auto
: il s'agit d'un flux basé sur un LLM. L'agent appelle le LLM pour répondre à la requête de l'utilisateur et appelle ses outils si nécessaire. Il peut également transférer la requête à ses enfants, à ses frères et sœurs ou à son parent.- Flux personnalisés: vous pouvez définir vos propres flux en implémentant la classe
BaseFlow
ou simplement en définissant une fonction Python conformément à l'interface.