@@ -850,3 +850,85 @@ def test_get_langchain_prompt_with_unresolved_placeholders(self):
850850
851851 # Third message should be the user message
852852 assert langchain_messages [2 ] == ("user" , "Help me with coding" )
853+
854+
855+ def test_tool_calls_preservation_in_message_placeholder ():
856+ """Test that tool calls are preserved when compiling message placeholders."""
857+ from langfuse .api .resources .prompts import Prompt_Chat
858+
859+ chat_messages = [
860+ {"role" : "system" , "content" : "You are a helpful assistant." },
861+ {"type" : "placeholder" , "name" : "message_history" },
862+ {"role" : "user" , "content" : "Help me with {{task}}" },
863+ ]
864+
865+ prompt_client = ChatPromptClient (
866+ Prompt_Chat (
867+ type = "chat" ,
868+ name = "tool_calls_test" ,
869+ version = 1 ,
870+ config = {},
871+ tags = [],
872+ labels = [],
873+ prompt = chat_messages ,
874+ )
875+ )
876+
877+ # Message history with tool calls - exactly like the bug report describes
878+ message_history_with_tool_calls = [
879+ {"role" : "user" , "content" : "What's the weather like?" },
880+ {
881+ "role" : "assistant" ,
882+ "content" : "" ,
883+ "tool_calls" : [
884+ {
885+ "id" : "call_123" ,
886+ "type" : "function" ,
887+ "function" : {
888+ "name" : "get_weather" ,
889+ "arguments" : '{"location": "San Francisco"}' ,
890+ },
891+ }
892+ ],
893+ },
894+ {
895+ "role" : "tool" ,
896+ "content" : "It's sunny, 72°F" ,
897+ "tool_call_id" : "call_123" ,
898+ "name" : "get_weather" ,
899+ },
900+ ]
901+
902+ # Compile with message history and variables
903+ compiled_messages = prompt_client .compile (
904+ task = "weather inquiry" , message_history = message_history_with_tool_calls
905+ )
906+
907+ # Should have 5 messages: system + 3 from history + user
908+ assert len (compiled_messages ) == 5
909+
910+ # System message
911+ assert compiled_messages [0 ]["role" ] == "system"
912+ assert compiled_messages [0 ]["content" ] == "You are a helpful assistant."
913+
914+ # User message from history
915+ assert compiled_messages [1 ]["role" ] == "user"
916+ assert compiled_messages [1 ]["content" ] == "What's the weather like?"
917+
918+ # Assistant message with TOOL CALLS
919+ assert compiled_messages [2 ]["role" ] == "assistant"
920+ assert compiled_messages [2 ]["content" ] == ""
921+ assert "tool_calls" in compiled_messages [2 ]
922+ assert len (compiled_messages [2 ]["tool_calls" ]) == 1
923+ assert compiled_messages [2 ]["tool_calls" ][0 ]["id" ] == "call_123"
924+ assert compiled_messages [2 ]["tool_calls" ][0 ]["function" ]["name" ] == "get_weather"
925+
926+ # TOOL CALL results message
927+ assert compiled_messages [3 ]["role" ] == "tool"
928+ assert compiled_messages [3 ]["content" ] == "It's sunny, 72°F"
929+ assert compiled_messages [3 ]["tool_call_id" ] == "call_123"
930+ assert compiled_messages [3 ]["name" ] == "get_weather"
931+
932+ # Final user message with compiled variable
933+ assert compiled_messages [4 ]["role" ] == "user"
934+ assert compiled_messages [4 ]["content" ] == "Help me with weather inquiry"
0 commit comments