Skip to content

Commit 9199be5

Browse files
committed
fix for LC
1 parent fc7a363 commit 9199be5

2 files changed

Lines changed: 86 additions & 2 deletions

File tree

langfuse/model.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import re
44
from abc import ABC, abstractmethod
5-
from collections.abc import Iterable
65
from typing import Any, Dict, List, Literal, Optional, Tuple, TypedDict, Union
76

87
from langfuse.api.resources.commons.types.dataset import (
@@ -372,12 +371,14 @@ def compile_with_placeholders(
372371
self,
373372
placeholders: Dict[str, List[ChatMessageDict]],
374373
variables: Optional[Dict[str, str]] = None,
374+
persist_compilation: bool = False,
375375
) -> List[ChatMessageDict]:
376376
"""Compile chat prompt by first replacing placeholders, then expanding variables.
377377
378378
Args:
379379
variables: Dictionary of variable names to values for template substitution
380380
placeholders: Dictionary of placeholder names to lists of ChatMessage objects
381+
persist_compilation: If True, saves the compiled output to the internal state. Useful if using the output for langchain prompts.
381382
382383
Returns:
383384
List[ChatMessageDict]: Compiled chat messages
@@ -411,7 +412,7 @@ def compile_with_placeholders(
411412
)
412413

413414
# Then, replace the variables in the ChatMessage content.
414-
return [
415+
compiled_messages = [
415416
ChatMessageDict(
416417
content=TemplateParser.compile_template(
417418
chat_message["content"],
@@ -422,6 +423,19 @@ def compile_with_placeholders(
422423
for chat_message in messages_with_placeholders_replaced
423424
]
424425

426+
# Mutate the internal prompt object if requested
427+
if persist_compilation:
428+
self.prompt = [
429+
ChatMessageWithPlaceholdersDict_Message(
430+
type="message",
431+
role=msg["role"],
432+
content=msg["content"],
433+
)
434+
for msg in compiled_messages
435+
]
436+
437+
return compiled_messages
438+
425439
def get_langchain_prompt(self, **kwargs):
426440
"""Convert Langfuse prompt into string compatible with Langchain ChatPromptTemplate.
427441

tests/test_prompt_compilation.py

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,3 +732,73 @@ def test_chat_prompt_with_json_variables(self):
732732
assert len(formatted_messages) == 2
733733
assert formatted_messages[0].content == expected_system
734734
assert formatted_messages[1].content == expected_user
735+
736+
def test_chat_prompt_with_placeholders_langchain(self):
737+
"""Test that chat prompts with placeholders work correctly with Langchain."""
738+
from langfuse.api.resources.prompts import Prompt_Chat
739+
740+
chat_messages = [
741+
ChatMessage(
742+
role="system",
743+
content="You are a {{role}} assistant with {{capability}} capabilities.",
744+
),
745+
{"type": "placeholder", "name": "examples"},
746+
ChatMessage(
747+
role="user",
748+
content="Help me with {{task}}.",
749+
),
750+
]
751+
752+
prompt_client = ChatPromptClient(
753+
Prompt_Chat(
754+
type="chat",
755+
name="chat_placeholder_langchain_test",
756+
version=1,
757+
config={},
758+
tags=[],
759+
labels=[],
760+
prompt=chat_messages,
761+
),
762+
)
763+
764+
placeholders = {
765+
"examples": [
766+
{"role": "user", "content": "Example: What is 2+2?"},
767+
{"role": "assistant", "content": "2+2 equals 4."},
768+
],
769+
}
770+
771+
# Test compile_with_placeholders with only placeholders (no variables)
772+
compiled_messages = prompt_client.compile_with_placeholders(
773+
placeholders=placeholders,
774+
)
775+
776+
assert len(compiled_messages) == 4
777+
assert (
778+
compiled_messages[0]["content"]
779+
== "You are a {{role}} assistant with {{capability}} capabilities."
780+
)
781+
assert compiled_messages[1]["content"] == "Example: What is 2+2?"
782+
assert compiled_messages[2]["content"] == "2+2 equals 4."
783+
assert compiled_messages[3]["content"] == "Help me with {{task}}."
784+
785+
compiled_messages = prompt_client.compile_with_placeholders(
786+
placeholders=placeholders, persist_compilation=True,
787+
)
788+
789+
langchain_messages = prompt_client.get_langchain_prompt(
790+
role="helpful",
791+
capability="math",
792+
task="addition",
793+
)
794+
langchain_prompt = ChatPromptTemplate.from_messages(langchain_messages)
795+
formatted_messages = langchain_prompt.format_messages()
796+
797+
assert len(formatted_messages) == 4
798+
assert (
799+
formatted_messages[0].content
800+
== "You are a helpful assistant with math capabilities."
801+
)
802+
assert formatted_messages[1].content == "Example: What is 2+2?"
803+
assert formatted_messages[2].content == "2+2 equals 4."
804+
assert formatted_messages[3].content == "Help me with addition."

0 commit comments

Comments
 (0)