Skip to content

Commit b36ed5c

Browse files
authored
feat(prompts): add commit message to prompt creation (#1108)
1 parent 02bb496 commit b36ed5c

File tree

10 files changed

+70
-7
lines changed

10 files changed

+70
-7
lines changed

langfuse/api/reference.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2614,6 +2614,7 @@ client.prompts.create(
26142614
config={"key": "value"},
26152615
labels=["string"],
26162616
tags=["string"],
2617+
commit_message="string",
26172618
),
26182619
)
26192620

langfuse/api/resources/prompts/client.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ def create(
267267
config={"key": "value"},
268268
labels=["string"],
269269
tags=["string"],
270+
commit_message="string",
270271
),
271272
)
272273
"""
@@ -568,6 +569,7 @@ async def main() -> None:
568569
config={"key": "value"},
569570
labels=["string"],
570571
tags=["string"],
572+
commit_message="string",
571573
),
572574
)
573575

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ class BasePrompt(pydantic_v1.BaseModel):
2121
List of tags. Used to filter via UI and API. The same across versions of a prompt.
2222
"""
2323

24+
commit_message: typing.Optional[str] = pydantic_v1.Field(
25+
alias="commitMessage", default=None
26+
)
27+
"""
28+
Commit message for this prompt version.
29+
"""
30+
2431
def json(self, **kwargs: typing.Any) -> str:
2532
kwargs_with_defaults: typing.Any = {
2633
"by_alias": True,
@@ -49,5 +56,7 @@ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
4956
class Config:
5057
frozen = True
5158
smart_union = True
59+
allow_population_by_field_name = True
60+
populate_by_name = True
5261
extra = pydantic_v1.Extra.allow
5362
json_encoders = {dt.datetime: serialize_datetime}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ class CreateChatPromptRequest(pydantic_v1.BaseModel):
2222
List of tags to apply to all versions of this prompt.
2323
"""
2424

25+
commit_message: typing.Optional[str] = pydantic_v1.Field(
26+
alias="commitMessage", default=None
27+
)
28+
"""
29+
Commit message for this prompt version.
30+
"""
31+
2532
def json(self, **kwargs: typing.Any) -> str:
2633
kwargs_with_defaults: typing.Any = {
2734
"by_alias": True,
@@ -50,5 +57,7 @@ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
5057
class Config:
5158
frozen = True
5259
smart_union = True
60+
allow_population_by_field_name = True
61+
populate_by_name = True
5362
extra = pydantic_v1.Extra.allow
5463
json_encoders = {dt.datetime: serialize_datetime}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ class CreatePromptRequest_Chat(pydantic_v1.BaseModel):
1616
config: typing.Optional[typing.Any] = None
1717
labels: typing.Optional[typing.List[str]] = None
1818
tags: typing.Optional[typing.List[str]] = None
19+
commit_message: typing.Optional[str] = pydantic_v1.Field(
20+
alias="commitMessage", default=None
21+
)
1922
type: typing.Literal["chat"] = "chat"
2023

2124
def json(self, **kwargs: typing.Any) -> str:
@@ -46,6 +49,8 @@ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
4649
class Config:
4750
frozen = True
4851
smart_union = True
52+
allow_population_by_field_name = True
53+
populate_by_name = True
4954
extra = pydantic_v1.Extra.allow
5055
json_encoders = {dt.datetime: serialize_datetime}
5156

@@ -56,6 +61,9 @@ class CreatePromptRequest_Text(pydantic_v1.BaseModel):
5661
config: typing.Optional[typing.Any] = None
5762
labels: typing.Optional[typing.List[str]] = None
5863
tags: typing.Optional[typing.List[str]] = None
64+
commit_message: typing.Optional[str] = pydantic_v1.Field(
65+
alias="commitMessage", default=None
66+
)
5967
type: typing.Literal["text"] = "text"
6068

6169
def json(self, **kwargs: typing.Any) -> str:
@@ -86,6 +94,8 @@ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
8694
class Config:
8795
frozen = True
8896
smart_union = True
97+
allow_population_by_field_name = True
98+
populate_by_name = True
8999
extra = pydantic_v1.Extra.allow
90100
json_encoders = {dt.datetime: serialize_datetime}
91101

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ class CreateTextPromptRequest(pydantic_v1.BaseModel):
2121
List of tags to apply to all versions of this prompt.
2222
"""
2323

24+
commit_message: typing.Optional[str] = pydantic_v1.Field(
25+
alias="commitMessage", default=None
26+
)
27+
"""
28+
Commit message for this prompt version.
29+
"""
30+
2431
def json(self, **kwargs: typing.Any) -> str:
2532
kwargs_with_defaults: typing.Any = {
2633
"by_alias": True,
@@ -49,5 +56,7 @@ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
4956
class Config:
5057
frozen = True
5158
smart_union = True
59+
allow_population_by_field_name = True
60+
populate_by_name = True
5261
extra = pydantic_v1.Extra.allow
5362
json_encoders = {dt.datetime: serialize_datetime}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class Prompt_Chat(pydantic_v1.BaseModel):
1717
config: typing.Any
1818
labels: typing.List[str]
1919
tags: typing.List[str]
20+
commit_message: typing.Optional[str] = pydantic_v1.Field(
21+
alias="commitMessage", default=None
22+
)
2023
type: typing.Literal["chat"] = "chat"
2124

2225
def json(self, **kwargs: typing.Any) -> str:
@@ -47,6 +50,8 @@ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
4750
class Config:
4851
frozen = True
4952
smart_union = True
53+
allow_population_by_field_name = True
54+
populate_by_name = True
5055
extra = pydantic_v1.Extra.allow
5156
json_encoders = {dt.datetime: serialize_datetime}
5257

@@ -58,6 +63,9 @@ class Prompt_Text(pydantic_v1.BaseModel):
5863
config: typing.Any
5964
labels: typing.List[str]
6065
tags: typing.List[str]
66+
commit_message: typing.Optional[str] = pydantic_v1.Field(
67+
alias="commitMessage", default=None
68+
)
6169
type: typing.Literal["text"] = "text"
6270

6371
def json(self, **kwargs: typing.Any) -> str:
@@ -88,6 +96,8 @@ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
8896
class Config:
8997
frozen = True
9098
smart_union = True
99+
allow_population_by_field_name = True
100+
populate_by_name = True
91101
extra = pydantic_v1.Extra.allow
92102
json_encoders = {dt.datetime: serialize_datetime}
93103

langfuse/client.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,6 +1282,7 @@ def create_prompt(
12821282
tags: Optional[List[str]] = None,
12831283
type: Optional[Literal["chat"]],
12841284
config: Optional[Any] = None,
1285+
commit_message: Optional[str] = None,
12851286
) -> ChatPromptClient: ...
12861287

12871288
@overload
@@ -1295,6 +1296,7 @@ def create_prompt(
12951296
tags: Optional[List[str]] = None,
12961297
type: Optional[Literal["text"]] = "text",
12971298
config: Optional[Any] = None,
1299+
commit_message: Optional[str] = None,
12981300
) -> TextPromptClient: ...
12991301

13001302
def create_prompt(
@@ -1307,6 +1309,7 @@ def create_prompt(
13071309
tags: Optional[List[str]] = None,
13081310
type: Optional[Literal["chat", "text"]] = "text",
13091311
config: Optional[Any] = None,
1312+
commit_message: Optional[str] = None,
13101313
) -> PromptClient:
13111314
"""Create a new prompt in Langfuse.
13121315
@@ -1318,6 +1321,7 @@ def create_prompt(
13181321
tags: The tags of the prompt. Defaults to None. Will be applied to all versions of the prompt.
13191322
config: Additional structured data to be saved with the prompt. Defaults to None.
13201323
type: The type of the prompt to be created. "chat" vs. "text". Defaults to "text".
1324+
commit_message: Optional string describing the change.
13211325
13221326
Returns:
13231327
TextPromptClient: The prompt if type argument is 'text'.
@@ -1345,6 +1349,7 @@ def create_prompt(
13451349
labels=labels,
13461350
tags=tags,
13471351
config=config or {},
1352+
commitMessage=commit_message,
13481353
type="chat",
13491354
)
13501355
server_prompt = self.client.prompts.create(request=request)
@@ -1360,6 +1365,7 @@ def create_prompt(
13601365
labels=labels,
13611366
tags=tags,
13621367
config=config or {},
1368+
commitMessage=commit_message,
13631369
type="text",
13641370
)
13651371

langfuse/model.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""@private"""
22

3-
from abc import ABC, abstractmethod
4-
from typing import Optional, TypedDict, Any, Dict, Union, List, Tuple
53
import re
4+
from abc import ABC, abstractmethod
5+
from typing import Any, Dict, List, Optional, Tuple, TypedDict, Union
66

77
from langfuse.api.resources.commons.types.dataset import (
88
Dataset, # noqa: F401
@@ -36,7 +36,7 @@
3636
from langfuse.api.resources.datasets.types.create_dataset_request import ( # noqa: F401
3737
CreateDatasetRequest,
3838
)
39-
from langfuse.api.resources.prompts import Prompt, ChatMessage, Prompt_Chat, Prompt_Text
39+
from langfuse.api.resources.prompts import ChatMessage, Prompt, Prompt_Chat, Prompt_Text
4040

4141

4242
class ModelUsage(TypedDict):
@@ -126,13 +126,15 @@ class BasePromptClient(ABC):
126126
config: Dict[str, Any]
127127
labels: List[str]
128128
tags: List[str]
129+
commit_message: Optional[str]
129130

130131
def __init__(self, prompt: Prompt, is_fallback: bool = False):
131132
self.name = prompt.name
132133
self.version = prompt.version
133134
self.config = prompt.config
134135
self.labels = prompt.labels
135136
self.tags = prompt.tags
137+
self.commit_message = prompt.commit_message
136138
self.is_fallback = is_fallback
137139

138140
@abstractmethod

tests/test_prompt.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from time import sleep
2-
import pytest
32
from unittest.mock import Mock, patch
43

54
import openai
5+
import pytest
6+
7+
from langfuse.api.resources.prompts import Prompt_Chat, Prompt_Text
68
from langfuse.client import Langfuse
7-
from langfuse.prompt_cache import PromptCacheItem, DEFAULT_PROMPT_CACHE_TTL_SECONDS
9+
from langfuse.model import ChatPromptClient, TextPromptClient
10+
from langfuse.prompt_cache import DEFAULT_PROMPT_CACHE_TTL_SECONDS, PromptCacheItem
811
from tests.utils import create_uuid, get_api
9-
from langfuse.api.resources.prompts import Prompt_Text, Prompt_Chat
10-
from langfuse.model import TextPromptClient, ChatPromptClient
1112

1213

1314
def test_create_prompt():
@@ -17,6 +18,7 @@ def test_create_prompt():
1718
name=prompt_name,
1819
prompt="test prompt",
1920
labels=["production"],
21+
commit_message="initial commit",
2022
)
2123

2224
second_prompt_client = langfuse.get_prompt(prompt_name)
@@ -25,6 +27,7 @@ def test_create_prompt():
2527
assert prompt_client.version == second_prompt_client.version
2628
assert prompt_client.prompt == second_prompt_client.prompt
2729
assert prompt_client.config == second_prompt_client.config
30+
assert prompt_client.commit_message == second_prompt_client.commit_message
2831
assert prompt_client.config == {}
2932

3033

@@ -79,6 +82,7 @@ def test_create_chat_prompt():
7982
labels=["production"],
8083
tags=["test"],
8184
type="chat",
85+
commit_message="initial commit",
8286
)
8387

8488
second_prompt_client = langfuse.get_prompt(prompt_name, type="chat")
@@ -97,6 +101,7 @@ def test_create_chat_prompt():
97101
assert prompt_client.config == second_prompt_client.config
98102
assert prompt_client.labels == ["production", "latest"]
99103
assert prompt_client.tags == second_prompt_client.tags
104+
assert prompt_client.commit_message == second_prompt_client.commit_message
100105
assert prompt_client.config == {}
101106

102107

0 commit comments

Comments
 (0)