Skip to content

Commit 3447a01

Browse files
authored
feat(prompts): chat message placeholders (#1222)
1 parent 4069f32 commit 3447a01

16 files changed

+772
-53
lines changed

langfuse/_client/client.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
from langfuse.media import LangfuseMedia
5656
from langfuse.model import (
5757
ChatMessageDict,
58+
ChatMessageWithPlaceholdersDict,
5859
ChatPromptClient,
5960
CreateDatasetItemRequest,
6061
CreateDatasetRequest,
@@ -2133,7 +2134,7 @@ def create_prompt(
21332134
self,
21342135
*,
21352136
name: str,
2136-
prompt: List[ChatMessageDict],
2137+
prompt: List[Union[ChatMessageDict, ChatMessageWithPlaceholdersDict]],
21372138
labels: List[str] = [],
21382139
tags: Optional[List[str]] = None,
21392140
type: Optional[Literal["chat"]],
@@ -2158,7 +2159,9 @@ def create_prompt(
21582159
self,
21592160
*,
21602161
name: str,
2161-
prompt: Union[str, List[ChatMessageDict]],
2162+
prompt: Union[
2163+
str, List[Union[ChatMessageDict, ChatMessageWithPlaceholdersDict]]
2164+
],
21622165
labels: List[str] = [],
21632166
tags: Optional[List[str]] = None,
21642167
type: Optional[Literal["chat", "text"]] = "text",

langfuse/api/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
CategoricalScore,
2222
CategoricalScoreV1,
2323
ChatMessage,
24+
ChatMessageWithPlaceholders,
25+
ChatMessageWithPlaceholders_Chatmessage,
26+
ChatMessageWithPlaceholders_Placeholder,
2427
ChatPrompt,
2528
Comment,
2629
CommentObjectType,
@@ -126,6 +129,7 @@
126129
PaginatedModels,
127130
PaginatedSessions,
128131
PatchMediaBody,
132+
PlaceholderMessage,
129133
Project,
130134
ProjectDeletionResponse,
131135
Projects,
@@ -230,6 +234,9 @@
230234
"CategoricalScore",
231235
"CategoricalScoreV1",
232236
"ChatMessage",
237+
"ChatMessageWithPlaceholders",
238+
"ChatMessageWithPlaceholders_Chatmessage",
239+
"ChatMessageWithPlaceholders_Placeholder",
233240
"ChatPrompt",
234241
"Comment",
235242
"CommentObjectType",
@@ -335,6 +342,7 @@
335342
"PaginatedModels",
336343
"PaginatedSessions",
337344
"PatchMediaBody",
345+
"PlaceholderMessage",
338346
"Project",
339347
"ProjectDeletionResponse",
340348
"Projects",

langfuse/api/reference.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4290,7 +4290,10 @@ Create a new version for the prompt with the given `name`
42904290
<dd>
42914291

42924292
```python
4293-
from langfuse import ChatMessage, CreatePromptRequest_Chat
4293+
from langfuse import (
4294+
ChatMessageWithPlaceholders_Chatmessage,
4295+
CreatePromptRequest_Chat,
4296+
)
42944297
from langfuse.client import FernLangfuse
42954298

42964299
client = FernLangfuse(
@@ -4305,11 +4308,11 @@ client.prompts.create(
43054308
request=CreatePromptRequest_Chat(
43064309
name="name",
43074310
prompt=[
4308-
ChatMessage(
4311+
ChatMessageWithPlaceholders_Chatmessage(
43094312
role="role",
43104313
content="content",
43114314
),
4312-
ChatMessage(
4315+
ChatMessageWithPlaceholders_Chatmessage(
43134316
role="role",
43144317
content="content",
43154318
),

langfuse/api/resources/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,16 @@
173173
from .prompts import (
174174
BasePrompt,
175175
ChatMessage,
176+
ChatMessageWithPlaceholders,
177+
ChatMessageWithPlaceholders_Chatmessage,
178+
ChatMessageWithPlaceholders_Placeholder,
176179
ChatPrompt,
177180
CreateChatPromptRequest,
178181
CreatePromptRequest,
179182
CreatePromptRequest_Chat,
180183
CreatePromptRequest_Text,
181184
CreateTextPromptRequest,
185+
PlaceholderMessage,
182186
Prompt,
183187
PromptMeta,
184188
PromptMetaListResponse,
@@ -242,6 +246,9 @@
242246
"CategoricalScore",
243247
"CategoricalScoreV1",
244248
"ChatMessage",
249+
"ChatMessageWithPlaceholders",
250+
"ChatMessageWithPlaceholders_Chatmessage",
251+
"ChatMessageWithPlaceholders_Placeholder",
245252
"ChatPrompt",
246253
"Comment",
247254
"CommentObjectType",
@@ -347,6 +354,7 @@
347354
"PaginatedModels",
348355
"PaginatedSessions",
349356
"PatchMediaBody",
357+
"PlaceholderMessage",
350358
"Project",
351359
"ProjectDeletionResponse",
352360
"Projects",

langfuse/api/resources/prompts/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
from .types import (
44
BasePrompt,
55
ChatMessage,
6+
ChatMessageWithPlaceholders,
7+
ChatMessageWithPlaceholders_Chatmessage,
8+
ChatMessageWithPlaceholders_Placeholder,
69
ChatPrompt,
710
CreateChatPromptRequest,
811
CreatePromptRequest,
912
CreatePromptRequest_Chat,
1013
CreatePromptRequest_Text,
1114
CreateTextPromptRequest,
15+
PlaceholderMessage,
1216
Prompt,
1317
PromptMeta,
1418
PromptMetaListResponse,
@@ -20,12 +24,16 @@
2024
__all__ = [
2125
"BasePrompt",
2226
"ChatMessage",
27+
"ChatMessageWithPlaceholders",
28+
"ChatMessageWithPlaceholders_Chatmessage",
29+
"ChatMessageWithPlaceholders_Placeholder",
2330
"ChatPrompt",
2431
"CreateChatPromptRequest",
2532
"CreatePromptRequest",
2633
"CreatePromptRequest_Chat",
2734
"CreatePromptRequest_Text",
2835
"CreateTextPromptRequest",
36+
"PlaceholderMessage",
2937
"Prompt",
3038
"PromptMeta",
3139
"PromptMetaListResponse",

langfuse/api/resources/prompts/client.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,10 @@ def create(
228228
229229
Examples
230230
--------
231-
from langfuse import ChatMessage, CreatePromptRequest_Chat
231+
from langfuse import (
232+
ChatMessageWithPlaceholders_Chatmessage,
233+
CreatePromptRequest_Chat,
234+
)
232235
from langfuse.client import FernLangfuse
233236
234237
client = FernLangfuse(
@@ -243,11 +246,11 @@ def create(
243246
request=CreatePromptRequest_Chat(
244247
name="name",
245248
prompt=[
246-
ChatMessage(
249+
ChatMessageWithPlaceholders_Chatmessage(
247250
role="role",
248251
content="content",
249252
),
250-
ChatMessage(
253+
ChatMessageWithPlaceholders_Chatmessage(
251254
role="role",
252255
content="content",
253256
),
@@ -512,7 +515,10 @@ async def create(
512515
--------
513516
import asyncio
514517
515-
from langfuse import ChatMessage, CreatePromptRequest_Chat
518+
from langfuse import (
519+
ChatMessageWithPlaceholders_Chatmessage,
520+
CreatePromptRequest_Chat,
521+
)
516522
from langfuse.client import AsyncFernLangfuse
517523
518524
client = AsyncFernLangfuse(
@@ -530,11 +536,11 @@ async def main() -> None:
530536
request=CreatePromptRequest_Chat(
531537
name="name",
532538
prompt=[
533-
ChatMessage(
539+
ChatMessageWithPlaceholders_Chatmessage(
534540
role="role",
535541
content="content",
536542
),
537-
ChatMessage(
543+
ChatMessageWithPlaceholders_Chatmessage(
538544
role="role",
539545
content="content",
540546
),

langfuse/api/resources/prompts/types/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
from .base_prompt import BasePrompt
44
from .chat_message import ChatMessage
5+
from .chat_message_with_placeholders import (
6+
ChatMessageWithPlaceholders,
7+
ChatMessageWithPlaceholders_Chatmessage,
8+
ChatMessageWithPlaceholders_Placeholder,
9+
)
510
from .chat_prompt import ChatPrompt
611
from .create_chat_prompt_request import CreateChatPromptRequest
712
from .create_prompt_request import (
@@ -10,6 +15,7 @@
1015
CreatePromptRequest_Text,
1116
)
1217
from .create_text_prompt_request import CreateTextPromptRequest
18+
from .placeholder_message import PlaceholderMessage
1319
from .prompt import Prompt, Prompt_Chat, Prompt_Text
1420
from .prompt_meta import PromptMeta
1521
from .prompt_meta_list_response import PromptMetaListResponse
@@ -18,12 +24,16 @@
1824
__all__ = [
1925
"BasePrompt",
2026
"ChatMessage",
27+
"ChatMessageWithPlaceholders",
28+
"ChatMessageWithPlaceholders_Chatmessage",
29+
"ChatMessageWithPlaceholders_Placeholder",
2130
"ChatPrompt",
2231
"CreateChatPromptRequest",
2332
"CreatePromptRequest",
2433
"CreatePromptRequest_Chat",
2534
"CreatePromptRequest_Text",
2635
"CreateTextPromptRequest",
36+
"PlaceholderMessage",
2737
"Prompt",
2838
"PromptMeta",
2939
"PromptMetaListResponse",
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# This file was auto-generated by Fern from our API Definition.
2+
3+
from __future__ import annotations
4+
5+
import datetime as dt
6+
import typing
7+
8+
from ....core.datetime_utils import serialize_datetime
9+
from ....core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
10+
11+
12+
class ChatMessageWithPlaceholders_Chatmessage(pydantic_v1.BaseModel):
13+
role: str
14+
content: str
15+
type: typing.Literal["chatmessage"] = "chatmessage"
16+
17+
def json(self, **kwargs: typing.Any) -> str:
18+
kwargs_with_defaults: typing.Any = {
19+
"by_alias": True,
20+
"exclude_unset": True,
21+
**kwargs,
22+
}
23+
return super().json(**kwargs_with_defaults)
24+
25+
def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
26+
kwargs_with_defaults_exclude_unset: typing.Any = {
27+
"by_alias": True,
28+
"exclude_unset": True,
29+
**kwargs,
30+
}
31+
kwargs_with_defaults_exclude_none: typing.Any = {
32+
"by_alias": True,
33+
"exclude_none": True,
34+
**kwargs,
35+
}
36+
37+
return deep_union_pydantic_dicts(
38+
super().dict(**kwargs_with_defaults_exclude_unset),
39+
super().dict(**kwargs_with_defaults_exclude_none),
40+
)
41+
42+
class Config:
43+
frozen = True
44+
smart_union = True
45+
extra = pydantic_v1.Extra.allow
46+
json_encoders = {dt.datetime: serialize_datetime}
47+
48+
49+
class ChatMessageWithPlaceholders_Placeholder(pydantic_v1.BaseModel):
50+
name: str
51+
type: typing.Literal["placeholder"] = "placeholder"
52+
53+
def json(self, **kwargs: typing.Any) -> str:
54+
kwargs_with_defaults: typing.Any = {
55+
"by_alias": True,
56+
"exclude_unset": True,
57+
**kwargs,
58+
}
59+
return super().json(**kwargs_with_defaults)
60+
61+
def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
62+
kwargs_with_defaults_exclude_unset: typing.Any = {
63+
"by_alias": True,
64+
"exclude_unset": True,
65+
**kwargs,
66+
}
67+
kwargs_with_defaults_exclude_none: typing.Any = {
68+
"by_alias": True,
69+
"exclude_none": True,
70+
**kwargs,
71+
}
72+
73+
return deep_union_pydantic_dicts(
74+
super().dict(**kwargs_with_defaults_exclude_unset),
75+
super().dict(**kwargs_with_defaults_exclude_none),
76+
)
77+
78+
class Config:
79+
frozen = True
80+
smart_union = True
81+
extra = pydantic_v1.Extra.allow
82+
json_encoders = {dt.datetime: serialize_datetime}
83+
84+
85+
ChatMessageWithPlaceholders = typing.Union[
86+
ChatMessageWithPlaceholders_Chatmessage, ChatMessageWithPlaceholders_Placeholder
87+
]

langfuse/api/resources/prompts/types/chat_prompt.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
from ....core.datetime_utils import serialize_datetime
77
from ....core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
88
from .base_prompt import BasePrompt
9-
from .chat_message import ChatMessage
9+
from .chat_message_with_placeholders import ChatMessageWithPlaceholders
1010

1111

1212
class ChatPrompt(BasePrompt):
13-
prompt: typing.List[ChatMessage]
13+
prompt: typing.List[ChatMessageWithPlaceholders]
1414

1515
def json(self, **kwargs: typing.Any) -> str:
1616
kwargs_with_defaults: typing.Any = {

langfuse/api/resources/prompts/types/create_chat_prompt_request.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66
from ....core.datetime_utils import serialize_datetime
77
from ....core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
8-
from .chat_message import ChatMessage
8+
from .chat_message_with_placeholders import ChatMessageWithPlaceholders
99

1010

1111
class CreateChatPromptRequest(pydantic_v1.BaseModel):
1212
name: str
13-
prompt: typing.List[ChatMessage]
13+
prompt: typing.List[ChatMessageWithPlaceholders]
1414
config: typing.Optional[typing.Any] = None
1515
labels: typing.Optional[typing.List[str]] = pydantic_v1.Field(default=None)
1616
"""

0 commit comments

Comments
 (0)