Les assistants OpenAI et Azure OpenAI peuvent invoquer des modèles et utiliser des outils pour accomplir des tâches. Cet article se concentre principalement sur la construction de pipelines permettant d'exploiter les capacités d'appel d'outils d'un assistant existant.
Étant donné la grande similitude entre les appels aux outils d'assistance des versions OpenAI et Azure, les exemples fournis dans cet article s'appliquent aux deux plateformes.
Dans la première partie, nous vous présenterons de manière simple comment créer un assistant dans OpenAI Dashboard et ajouter des outils définis par l'utilisateur pour une utilisation ultérieure dans le pipeline. Nous vous fournirons toutes les données et tous les fichiers nécessaires.
Dans la deuxième partie, nous présenterons deux questions et les réponses correspondantes de l'assistant afin d'illustrer les types d'outils que l'assistant peut utiliser, ou demande aux utilisateurs d'utiliser, pour répondre aux requêtes.
Dans la partie 3, nous présenterons deux nouveaux snaps : tool call router et submit tool outputs, ainsi que des mises à niveau des deux snaps existants : run thread et create and run thread.
Dans la partie 4, nous nous intéresserons au workflow du pipeline et aux configurations spécifiques requises pour la mise en place des snaps.
Partie 1 : Pré-requis – Configurer un assistant dans le tableau de bord OpenAI
Les assistants OpenAI et Azure OpenAI gèrent l'invite du système, le modèle utilisé pour générer la réponse, les outils (y compris la recherche de fichiers, l'interpréteur de code et d'autres outils définis par l'utilisateur) et la configuration du modèle, telle que la température et le format de réponse.
Nous ne présenterons ici que les paramètres les plus basiques, que vous pourrez ajuster selon vos besoins.
Pour plus d'informations, veuillez consulter les documentations OpenAI et Azure OpenAI.
Accédez au tableau de bord OpenAI.: Allez à la Tableau de bord OpenAI – assistants et cliquez sur «
Create» dans le coin supérieur droit pour lancer le processus de création d'un nouvel assistant.Nommez votre assistant: Donnez un nom à votre nouvel assistant. Vous pouvez choisir le nom que vous préférez, par exemple «
Test Assistant».Instruction système (facultative) : vous pouvez éventuellement fournir une instruction système pour guider le comportement de l'assistant. Pour l'instant, passons cette étape.
Sélectionnez un modèle: Choisissez le modèle que vous souhaitez utiliser pour votre assistant. Dans ce cas, nous sélectionnerons «
gpt-4o-mini».Activer les outils:
Activez le «
file search"La recherche de fichiers est un service RAG géré fourni par OpenAI. L'utilisation de cet outil permet au modèle de récupérer les informations pertinentes pour la requête à partir du magasin vectoriel et de les utiliser pour répondre.
Dans ce cas, veuillez créer un nouveau magasin vectoriel, téléchargez le fichier wildfire_stats.pdf vers le magasin vectoriel, puis ajoutez le magasin vectoriel à l'assistant.
Activer le »
code interpreter» outilsL'interpréteur de code est également un outil intégré à l'assistant OpenAI. Il peut exécuter directement le code produit par le modèle et fournir le résultat.
Créez trois fonctions personnalisées avec le schéma suivant :
En fournissant ces définitions, nous permettons au modèle d'identifier les fonctions définies par l'utilisateur qu'il peut appeler. Bien que le modèle puisse suggérer la fonction nécessaire, la responsabilité de l'exécution de la fonction incombe à l'utilisateur.
Définition de la fonction : get_weather
{
"name": "get_weather",
"description": "Determine weather in my location",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "The city and state e.g. San Francisco, CA"
}
},
"additionalProperties": false,
"required": [
"city"
]
}
}
Définition de la fonction : get_wiki_url
{
"name": "get_wiki_url",
"description": "Get the wiki url of a given location",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "The city and state e.g. San Francisco, CA"
}
},
"additionalProperties": false,
"required": [
"city"
]
}
}
Définition de la fonction : get_webpage
{
"name": "get_webpage",
"description": "A simple web scraper that is capable of extracting information out of a url.",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The url of the webpage to get"
}
},
"additionalProperties": false,
"required": [
"url"
]
}
}
Nous avons ainsi créé avec succès l'assistant que nous allons utiliser. Il devrait ressembler à l'image ci-dessous. Vous pouvez maintenant vous rendre directement dans l'espace de test et poser quelques questions pour voir comment l'assistant répond.

À ce stade, vous devriez avoir créé un assistant avec trois fonctions définies par l'utilisateur. L'outil de recherche de fichiers devrait avoir accès à un magasin vectoriel contenant un fichier.
Partie 2 : Deux exemples d'appel d'outils d'assistance
Pour vous aider à comprendre le fonctionnement de l'assistant, nous utiliserons le pipeline suivant pour poser deux questions aux assistants nouvellement créés dans cette section et examiner leurs réponses.
Vous trouverez les détails de construction de ce pipeline dans la partie 4. Pour l'instant, concentrons-nous sur les résultats d'exécution du pipeline.
Aperçu du pipeline
Le pipeline des pilotes

Le pipeline des travailleurs

Invite n° 1
Notre première question à l'assistant est :
« Quel temps fait-il à San Francisco et quelle est l'URL du wiki ? Et quel est le contenu de la page wiki ? »
Grâce à cette requête, nous évaluons la capacité de l'assistant à :
1) identifier les outils nécessaires à une tâche – dans ce cas, les trois outils suivants doivent être appelés : get_weather, get_wiki_url et get_webpage ;
2) comprendre les dépendances séquentielles entre les outils. Par exemple, l'assistant doit reconnaître que get_wiki_url doit être appelé avant get_webpage pour obtenir l'URL nécessaire.
Comme indiqué ci-dessous, la réponse du modèle est à la fois raisonnable et correcte.

Deuxième invite
Notre deuxième question à l'assistant est :
Quel est le nombre d'incendies fédéraux entre 2018 et 2022, et pouvez-vous écrire un code Python pour trier les années par ordre croissant en fonction du nombre d'incendies et me donner les conditions météorologiques à San Francisco ?
La question peut sembler un peu étrange en soi, mais notre objectif est d'évaluer la manière dont l'assistant gère les outils intégrés tels que la recherche de fichiers et l'interpréteur de code. Plus précisément, nous voulons déterminer s'il est capable de combiner efficacement ces outils intégrés avec des fonctions définies par l'utilisateur pour fournir une réponse.
Pour répondre à cette question, le modèle doit d'abord invoquer l'outil de recherche de fichiers afin de récupérer la première ligne de données du premier tableau de la première page du PDF Wildfire. Ensuite, il génère un extrait de code Python pour le tri et appelle le deuxième outil, l'interpréteur de code, pour exécuter ce code. Enfin, il appelle le troisième outil défini par l'utilisateur, get_weather, pour obtenir les conditions météorologiques à San Francisco.
Données attendues dans le PDF Wildfire :

Comme indiqué ci-dessous, le modèle réagit comme prévu.

À ce stade, vous devez comprendre que l'assistant peut utiliser trois catégories différentes d'outils pour répondre aux questions des utilisateurs.
Partie 3 : Présentation des nouveaux Snaps
Nous commencerons par nous concentrer sur les nouveaux éléments du pipeline : deux nouveaux snaps et les attributs ajoutés à ceux existants, avant d'approfondir les détails généraux du pipeline.
1. Routeur d'appel d'outils (nouveau)

- L'outil « call router snap » simplifie la réponse de l'assistant (l'objet d'exécution) afin de faciliter le traitement en aval.
- Il combine les fonctionnalités de
copy,mapperetJSON splitter. - La première vue de sortie contient :
- réponse de l'assistant initial
- une liste vide nommée
tool_outputspour collecter les résultats de toutes les exécutions de fonctions dans le snap de l'appendice de message suivant.
- La deuxième vue de sortie fournit une liste d'outils à appeler, extraite du fichier
required actionssection de la réponse de l'assistant
2. Soumettre les résultats des outils (nouveau)

Ce snap soumet une liste des résultats d'exécution des fonctions à l'assistant. L'assistant génère alors la réponse finale ou demande d'autres appels d'outils.
3. Créer et exécuter un thread (mis à niveau)

- Nous avons ajouté une nouvelle section à la
Create And Run Threadconfiguration permettant de spécifier des paramètres détaillés pour les appels d'outils. - Les
Tool choiceCette option vous permet de demander à l'assistant :- sélectionner automatiquement les outils (
AUTO) - n'utilisez aucun outil (
NONE) - nécessite au moins un outil (
REQUIRED) - utiliser un outil spécifique défini par l'utilisateur (
SPECIFY A FUNCTION, fournissant lefunction name).
- sélectionner automatiquement les outils (
- Les
Parallel tool callCette option détermine si l'assistant peut appeler plusieurs outils simultanément.
4. Exécuter le thread (mis à niveau)

La même configuration est ajoutée au fichier Run Thread casser également.
Partie 4 : Construction pratique d'un pipeline
Aperçu du flux de travail du pipeline
Il y a au total 5 pipelines.
Pipeline de pilotes :
Envoie l'invite initiale à l'assistant.
Reçoit une réponse contenant des demandes d'appel d'outils.
Transmet la réponse au snap « pipeloop » pour déclencher l'exécution des outils par les pipelines de travail.
Pipeline des travailleurs :
Exécute les appels de fonction spécifiés dans les requêtes d'appel d'outil.
Rassemble les résultats des appels de fonction.
Renvoie les résultats à l'assistant.
Ce pipeline est exécuté de manière répétée jusqu'à ce qu'il n'y ait plus d'outils à appeler.
Pipeline get_weather :
Prend un nom de ville en entrée.
Interroge une API météo pour obtenir les conditions météorologiques actuelles de la ville spécifiée.
Affiche les informations météorologiques récupérées.
Pipeline get_wiki_url :
Prend un nom de ville en entrée.
Recherche l'URL de la page Wikipédia correspondant à la ville spécifiée.
Affiche l'URL trouvée.
Pipeline get_webpage :
Prend une URL en entrée
Récupérez la page Web en visitant l'URL.
Utilisez un modèle pour résumer le contenu de la page Web.
Affiche lerésumé
Le pipeline des pilotes
Le pipeline de pilotes peut être construit de deux manières : soit en utilisant une opération combinée «créer et exécuter », soit en effectuant les étapes de création et d'exécution de manière séquentielle. Les deux méthodes aboutissent au même résultat dans ce scénario.

Le pipeline des travailleurs

Le pipeline get_weather

Vous pouvez obtenir une clé API gratuite en vous inscrivant sur API météo gratuite – WeatherAPI.com.
Le pipeline get_wiki_url

Le pipeline get_webpage

Get Client : accède à la page Web indiquée par l'URL et récupère le contenu HTML.
Analyseur HTML : analyse le contenu HTML au format texte.
Résumé : Générer une invite utilisateur et la concaténer avec le texte de la page Web.
OpenAI Summarize : utilisez le modèle pour générer un résumé du contenu de la page Web.
Entrée et sortie des touches
Nous illustrerons les entrées et sorties essentielles du processus intermédiaire à travers une seule interaction d'appel d'outil.

1. Créer et exécuter un thread
Cet instantanée transmet la requête initiale de l'utilisateur à l'assistant et renvoie un objet d'exécution. Le point fort de cet objet d'exécution est le required action, qui décrit les appels d'outils nécessaires.
Résultat de Create and Run Thread – un objet d'exécution
[
{
"run": {
"id": "run_0JYmmzkQlIGRe4E0cNK8daKm",
"object": "thread.run",
"created_at": 1730842197,
"assistant_id": "asst_nwIrRaBwD6E6xa7EmnDOy2fx",
"thread_id": "thread_L1mEVGH40bHfwTf2gsDXliMi",
"status": "requires_action",
"started_at": 1730842197,
"expires_at": 1730842797,
"cancelled_at": null,
"failed_at": null,
"completed_at": null,
"required_action": {
"type": "submit_tool_outputs",
"submit_tool_outputs": {
"tool_calls": [
{
"id": "call_uOIx8piJAUty3WpFpVCcxFMc",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{"city": "San Francisco, CA"}"
}
},
{
"id": "call_d14hJfMMOvcyxsvWpXbgi9uF",
"type": "function",
"function": {
"name": "get_wiki_url",
"arguments": "{"city": "San Francisco, CA"}"
}
}
]
}
},
"last_error": null,
"model": "gpt-4o",
"instructions": "",
"tools": [
{
"type": "code_interpreter"
},
{
"type": "file_search",
"file_search": {
"ranking_options": {
"ranker": "default_2024_08_21",
"score_threshold": 0
}
}
},
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Determine weather in my location",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "The city and state e.g. San Francisco, CA"
}
},
"additionalProperties": false,
"required": [
"city"
]
},
"strict": true
}
},
{
"type": "function",
"function": {
"name": "get_wiki_url",
"description": "Get the wiki url of a given location",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "The city and state e.g. San Francisco, CA"
}
},
"additionalProperties": false,
"required": [
"city"
]
},
"strict": true
}
},
{
"type": "function",
"function": {
"name": "get_webpage",
"description": "A simple web scraper that is capable of extracting information out of a url.",
"parameters": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The url of the webpage to get"
}
},
"additionalProperties": false,
"required": [
"url"
]
},
"strict": true
}
}
],
"tool_resources": {},
"metadata": {},
"temperature": 1,
"top_p": 1,
"max_completion_tokens": null,
"max_prompt_tokens": null,
"truncation_strategy": {
"type": "auto",
"last_messages": null
},
"incomplete_details": null,
"usage": null,
"response_format": {
"type": "text"
},
"tool_choice": "auto",
"parallel_tool_calls": true
}
}
]
2. Routeur d'appel d'outils
Il est important de noter que la première vue de sortie contient non seulement la réponse de l'assistant, mais également une liste «tool_outputs »vide. Cette liste sert de conteneur pour stocker les résultats des fonctions à mesure qu'ils sont rassemblés dans les appenders de messages suivants.
Routeur d'appel d'outils – 1ère vue de sortie
[
{
"run":{...},
"tool_outputs":[]
}
]
La deuxième vue de sortie extrait les appels d'outils des actions requises et convertit les valeurs des arguments au format JSON, puis les stocke dans json_arguments. Cela élimine le besoin d'une conversion ultérieure des arguments par chaque outil.
Routeur d'appel d'outils – 2e vue de sortie
[
{
"id": "call_uOIx8piJAUty3WpFpVCcxFMc",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{"city": "San Francisco, CA"}",
"json_arguments": {
"city": "San Francisco, CA"
}
}
},
{
"id": "call_d14hJfMMOvcyxsvWpXbgi9uF",
"type": "function",
"function": {
"name": "get_wiki_url",
"arguments": "{"city": "San Francisco, CA"}",
"json_arguments": {
"city": "San Francisco, CA"
}
}
}
]
3. Pipeline Execute Snap – Obtenir la fonction météo
[
{
"id": "call_uOIx8piJAUty3WpFpVCcxFMc",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{"city": "San Francisco, CA"}",
"json_arguments": {
"city": "San Francisco, CA"
}
}
}
]
Fonction URL Wiki – Sortie
[
{
"statusLine": {
"httpVersion": "HTTP/1.1",
"statusCode": 200,
"statusText": "OK"
},
"headers": {...},
"entity": {
"location": {
"name": "San Francisco",
"region": "California",
"country": "United States of America",
"lat": 37.775,
"lon": -122.4183,
"tz_id": "America/Los_Angeles",
"localtime_epoch": 1730842188,
"localtime": "2024-11-05 13:29"
},
"current": {
"last_updated_epoch": 1730841300,
"last_updated": "2024-11-05 13:15",
"temp_c": 16.2,
"temp_f": 61.2,
"is_day": 1,
"condition": {
"text": "Mist",
"icon": "//cdn.weatherapi.com/weather/64x64/day/143.png",
"code": 1030
},
"wind_mph": 4.9,
"wind_kph": 7.9,
"wind_degree": 330,
"wind_dir": "NNW",
"pressure_mb": 1018,
"pressure_in": 30.07,
"precip_mm": 0,
"precip_in": 0,
"humidity": 77,
"cloud": 0,
"feelslike_c": 16.2,
"feelslike_f": 61.2,
"windchill_c": 16.2,
"windchill_f": 61.1,
"heatindex_c": 16,
"heatindex_f": 60.9,
"dewpoint_c": 11.9,
"dewpoint_f": 53.4,
"vis_km": 8,
"vis_miles": 4,
"uv": 2.7,
"gust_mph": 7.2,
"gust_kph": 11.6
}
},
"_debug": {...},
"original": {
"id": "call_uOIx8piJAUty3WpFpVCcxFMc",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{"city": "San Francisco, CA"}",
"json_arguments": {
"city": "San Francisco, CA"
}
}
}
}
]
La sortie de l'outil fournit une réponse HTTP complète, mais nous nous intéressons uniquement au contenu « entité » qui servira de sortie à l'outil. Cette extraction aura lieu dans l'étape suivante, « Générateur de résultats de fonction ».
4. Pipeline Execute Snap – Fonction d'obtention de l'URL Wiki
Fonction URL Wiki – Entrée
[
{
"id": "call_d14hJfMMOvcyxsvWpXbgi9uF",
"type": "function",
"function": {
"name": "get_wiki_url",
"arguments": "{"city": "San Francisco, CA"}",
"json_arguments": {
"city": "San Francisco, CA"
}
}
}
]
Fonction URL Wiki – Sortie
[
{
"statusLine": {
"httpVersion": "HTTP/1.1",
"statusCode": 200,
"statusText": "OK"
},
"headers": {...},
"entity": [
"San Francisco, CA",
[
"San Francisco, CA"
],
[
""
],
[
"https://en.wikipedia.org/wiki/San_Francisco,_CA"
]
],
"_debug": {...},
"original": {
"id": "call_d14hJfMMOvcyxsvWpXbgi9uF",
"type": "function",
"function": {
"name": "get_wiki_url",
"arguments": "{"city": "San Francisco, CA"}",
"json_arguments": {
"city": "San Francisco, CA"
}
}
}
}
]
La sortie de l'outil fournit une réponse HTTP complète, mais nous nous intéressons uniquement au contenu « entité » qui servira de sortie à l'outil. Cette extraction aura lieu dans l'étape suivante, « Générateur de résultats de fonction ».
5. Appender de message
La sortie du Message Appender contient un objet d'exécution provenant en amont, mais nous nous intéressons uniquement au tool_outputs champ qui est une liste de résultats de fonctions. Ainsi, dans l'instantané suivant, « Soumettre les résultats de l'outil », nous n'utiliserons que le tool_outputs champ.
Appender de message – Sortie
[
{
"run": {...},
"tool_outputs": [
{
"sl_role": "TOOL",
"function_id": "call_d14hJfMMOvcyxsvWpXbgi9uF",
"content": [
"San Francisco, CA",
[
"San Francisco, CA"
],
[
""
],
[
"https://en.wikipedia.org/wiki/San_Francisco,_CA"
]
]
},
{
"sl_role": "TOOL",
"function_id": "call_uOIx8piJAUty3WpFpVCcxFMc",
"content": {
"last_updated_epoch": 1730841300,
"last_updated": "2024-11-05 13:15",
"temp_c": 16.2,
"temp_f": 61.2,
"is_day": 1,
"condition": {
"text": "Mist",
"icon": "//cdn.weatherapi.com/weather/64x64/day/143.png",
"code": 1030
},
"wind_mph": 4.9,
"wind_kph": 7.9,
"wind_degree": 330,
"wind_dir": "NNW",
"pressure_mb": 1018,
"pressure_in": 30.07,
"precip_mm": 0,
"precip_in": 0,
"humidity": 77,
"cloud": 0,
"feelslike_c": 16.2,
"feelslike_f": 61.2,
"windchill_c": 16.2,
"windchill_f": 61.1,
"heatindex_c": 16,
"heatindex_f": 60.9,
"dewpoint_c": 11.9,
"dewpoint_f": 53.4,
"vis_km": 8,
"vis_miles": 4,
"uv": 2.7,
"gust_mph": 7.2,
"gust_kph": 11.6
}
}
]
}
]
6. Soumettre les résultats de l'outil
Cette fonction « snap forwards » est transmise à l'assistant et reçoit un objet d'exécution en réponse. Cet objet peut soit fournir la réponse finale, soit dicter les appels d'outils suivants.
Dans cet exemple, la sortie de l'assistant spécifie le prochain outil à appeler, comme indiqué par l'« action requise ».
Soumettre les résultats de l'outil – Résultats – Exemple d'appels d'outils ultérieurs
[
{
"run": {
"id": "run_0JYmmzkQlIGRe4E0cNK8daKm",
"object": "thread.run",
"created_at": 1730842197,
"assistant_id": "asst_nwIrRaBwD6E6xa7EmnDOy2fx",
"thread_id": "thread_L1mEVGH40bHfwTf2gsDXliMi",
"status": "requires_action",
"started_at": 1730842201,
"expires_at": 1730842797,
"cancelled_at": null,
"failed_at": null,
"completed_at": null,
"required_action": {
"type": "submit_tool_outputs",
"submit_tool_outputs": {
"tool_calls": [
{
"id": "call_lsZpmQ4SPZ6QJ6Dsuk8tvzvy",
"type": "function",
"function": {
"name": "get_webpage",
"arguments": "{"url":"https://en.wikipedia.org/wiki/San_Francisco,_CA"}"
}
}
]
}
},
"last_error": null,
"model": "gpt-4o",
"instructions": "",
"tools": [...],
"tool_resources": {},
"metadata": {},
"temperature": 1,
"top_p": 1,
"max_completion_tokens": null,
"max_prompt_tokens": null,
"truncation_strategy": {
"type": "auto",
"last_messages": null
},
"incomplete_details": null,
"usage": null,
"response_format": {
"type": "text"
},
"tool_choice": "auto",
"parallel_tool_calls": true
},
"original": {
"run": {...},
"tool_outputs": [...]
}
}
]
Dans l'exemple suivant, l'assistant affiche le résultat final. La sortie contient une liste de messages supplémentaire qui comprend le résultat lui-même ainsi que l'invite utilisateur d'origine.
Soumettre les résultats de l'outil – Résultat – exemple de réponse finale
[
{
"messages": [
{
"id": "msg_ETlH4jGXltDdopImtZFBhI7a",
"object": "thread.message",
"created_at": 1730845440,
"assistant_id": "asst_nwIrRaBwD6E6xa7EmnDOy2fx",
"thread_id": "thread_4CrAatFTqHktHhareDTkHPNc",
"run_id": "run_lunPUVK7tmVV7NTiL72NKRju",
"role": "assistant",
"content": [
{
"type": "text",
"text": {
"value": "The current weather in San Francisco, CA is sunny with a temperature of 17.3°C (63.1°F). There's a light breeze coming from the northwest at about 10.8 kph (6.7 mph), and the humidity level is at 63%. There is no precipitation at the moment, and the visibility is 11 kilometers (6 miles) .nnYou can find more detailed information about San Francisco on its [Wikipedia page](https://en.wikipedia.org/wiki/San_Francisco,_CA) . Here's a summary of the content from the page:nn- **Location**: San Francisco is at the north end of the San Francisco Peninsula, embracing parts of the Pacific Ocean and San Francisco Bay.n- **Population**: As of 2023, it has an estimated population of 808,988, making it the fourth-most populous city in California.n- **Area**: It covers 46.9 square miles (121 square kilometers).n- **Diversity**: The city is majority-minority with diverse demographics.n- **History**: The indigenous Yelamu of the Ramaytush Ohlone inhabited the area before European settlement in 1776.n- **Economic Importance**: Known globally for technology, finance, and tourism.n- **Cultural Landmarks**: Home to iconic sites like the Golden Gate Bridge and Alcatraz Island.n- **Climate**: It has a warm-summer Mediterranean climate with frequent fog in summer.n- **Education**: Hosts the University of California, San Francisco, and San Francisco State University.n- **Neighborhoods & Demographics**: Known for diverse neighborhoods with unique character.n- **Economy & Culture**: A robust economy with significant tech and finance sectors, along with a vibrant arts scene.n- **Government**: Operates under a Mayor-Council system.nnThis encapsulates San Francisco's historical, cultural, and economic significance .",
"annotations": []
}
}
],
"attachments": [],
"metadata": {}
},
{
"id": "msg_1VUwhJdB9k2zOl9g0NH2rGQU",
"object": "thread.message",
"created_at": 1730845275,
"assistant_id": null,
"thread_id": "thread_4CrAatFTqHktHhareDTkHPNc",
"run_id": null,
"role": "user",
"content": [
{
"type": "text",
"text": {
"value": "What is the weather and the wiki url of San Francisco? And what is the content of the wiki page?",
"annotations": []
}
}
],
"attachments": [],
"metadata": {}
}
],
"run": {
"id": "run_lunPUVK7tmVV7NTiL72NKRju",
"object": "thread.run",
"created_at": 1730845275,
"assistant_id": "asst_nwIrRaBwD6E6xa7EmnDOy2fx",
"thread_id": "thread_4CrAatFTqHktHhareDTkHPNc",
"status": "completed",
"started_at": 1730845440,
"expires_at": null,
"cancelled_at": null,
"failed_at": null,
"completed_at": 1730845445,
"required_action": null,
...
},
"original": {}
}
]
Paramètres instantanés
Cet article met particulièrement l'accent sur les paramètres de condition de boucle dans le pipeloop.

Nous avons configuré la boucle pour qu'elle se termine lorsque la réponse de l'assistant indique qu'aucun autre appel d'outil n'est nécessaire (c'est-à-dire «required_action» est nul). En effet, s'il n'est pas nécessaire d'appeler d'autres outils, il n'y a aucune raison de continuer à exécuter le worker à l'aide de Pipeloop.
Cas limite – Lorsqu'aucun appel d'outil n'est nécessaire
Le pipeline de pilotes précédent présentait une limitation : il ne pouvait pas gérer les cas où le modèle pouvait répondre directement à la requête de l'utilisateur sans appeler aucune fonction définie par l'utilisateur.
Cela s'explique par le fait que la production de Create and Run Thread ne contiendrait pas le required_action champ. Étant donné que le pipeloop snap suit une logique do-while, il s'exécuterait toujours au moins une fois avant de vérifier la condition d'arrêt. Par conséquent, lorsque l'assistant n'avait pas besoin d'un appel d'outil, la soumission de la sortie de l'appel d'outil à l'assistant dans le pipeline de travail entraînait une erreur.
Le pipeline de pilotes suivant offre une solution simple à ce problème en utilisant un routeur pour contourner la boucle de pipeline pour les requêtes auxquelles il est possible de répondre directement.




