File size: 1,765 Bytes
020020a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
import json

def format_conversation_for_download(conversation: list) -> str:
    """Formats the conversation history for download."""
    formatted_messages = []
    tool_id_to_name_map = {}
    for message in conversation:
        if isinstance(message, AIMessage) and message.tool_calls:
            for tool_call in message.tool_calls:
                tool_id_to_name_map[tool_call["id"]] = tool_call["name"]

    for message in conversation:
        if isinstance(message, HumanMessage):
            formatted_messages.append({"role": "user", "content": message.content})
        elif isinstance(message, AIMessage):
            if not message.content and not message.tool_calls:
                continue
            
            ai_dict = {"role": "assistant"}
            if message.content:
                ai_dict["content"] = message.content

            if message.tool_calls:
                ai_dict["tool_calls"] = [
                    {
                        "type": "function",
                        "function": {
                            "name": tc["name"],
                            "arguments": tc["args"],
                        },
                    }
                    for tc in message.tool_calls
                ]
            formatted_messages.append(ai_dict)
        elif isinstance(message, ToolMessage):
            tool_name = tool_id_to_name_map.get(message.tool_call_id)
            formatted_messages.append(
                {
                    "role": "tool",
                    "name": tool_name,
                    "content": message.content,
                }
            )
            
    return json.dumps(formatted_messages, indent=4)