Exercices Prompt Engineering Parser une réponse function calling
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Parser une réponse function calling

Quand le modele decide d'appeler une de tes fonctions, la reponse de l'API est differente du cas habituel. Au lieu d'un texte, tu recois un champ tool_calls avec le nom de la fonction a appeler et ses arguments sous forme de chaine JSON. Savoir parser cette reponse est essentiel pour construire des agents.

Voici a quoi ca ressemble dans le SDK OpenAI :

from openai.types.chat import ChatCompletionMessage
from openai.types.chat.chat_completion_message_tool_call import ChatCompletionMessageToolCall, Function

message = ChatCompletionMessage(
role='assistant',
content=None,
tool_calls=[
ChatCompletionMessageToolCall(
id='call_abc123',
type='function',
function=Function(
name='get_meteo',
arguments='{"ville": "Paris", "unite": "celsius"}'
)
)
]
)

Attention : les arguments sont une chaine JSON, pas un dictionnaire Python. Il faut les parser avec json.loads().

Écris une fonction parser_tool_calls(message) qui prend un ChatCompletionMessage et retourne une liste de dictionnaires. Chaque dictionnaire a trois clés : 'id', 'nom' et 'arguments' (le dictionnaire Python parse depuis le JSON).

Exemple :
résultat = parser_tool_calls(message)
résultat[0]['nom'] vaut 'get_meteo'
résultat[0]['arguments'] vaut {'ville': 'Paris', 'unite': 'celsius'}

Tests (1/1)

Tests
import json
from openai.types.chat import ChatCompletionMessage
from openai.types.chat.chat_completion_message_tool_call import ChatCompletionMessageToolCall, Function

msg = ChatCompletionMessage(
    role='assistant',
    content=None,
    tool_calls=[
        ChatCompletionMessageToolCall(
            id='call_001',
            type='function',
            function=Function(name='get_meteo', arguments='{"ville": "Paris"}')
        )
    ]
)
result = parser_tool_calls(msg)
assert len(result) == 1, 'Doit retourner une liste avec 1 élément'
assert result[0]['nom'] == 'get_meteo', 'Le nom de la fonction doit etre get_meteo'
assert result[0]['arguments'] == {'ville': 'Paris'}, 'Les arguments doivent etre un dictionnaire Python'
assert result[0]['id'] == 'call_001', 'L id doit etre call_001'

msg2 = ChatCompletionMessage(
    role='assistant',
    content=None,
    tool_calls=[
        ChatCompletionMessageToolCall(id='call_A', type='function', function=Function(name='fn1', arguments='{"x": 1}')),
        ChatCompletionMessageToolCall(id='call_B', type='function', function=Function(name='fn2', arguments='{"y": "hello"}')),
    ]
)
result2 = parser_tool_calls(msg2)
assert len(result2) == 2, 'Doit gerer plusieurs tool calls'
assert result2[0]['nom'] == 'fn1', 'Premier appel doit etre fn1'
assert result2[1]['arguments'] == {'y': 'hello'}, 'Les arguments du deuxieme appel doivent etre corrects'

Indices (3 disponibles)

solution.py
Non stockée