unique_toolkit 0.5.36__py3-none-any.whl → 0.5.38__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -140,7 +140,8 @@ class ChatService(BaseService):
140
140
 
141
141
  def modify_assistant_message(
142
142
  self,
143
- content: str,
143
+ content: str | None = None,
144
+ original_content: str | None = None,
144
145
  references: list[ContentReference] = [],
145
146
  debug_info: dict = {},
146
147
  message_id: Optional[str] = None,
@@ -150,7 +151,8 @@ class ChatService(BaseService):
150
151
  Modifies a message in the chat session synchronously.
151
152
 
152
153
  Args:
153
- content (str): The new content for the message.
154
+ content (str, optional): The new content for the message.
155
+ original_content (str, optional): The original content for the message.
154
156
  references (list[ContentReference]): list of ContentReference objects. Defaults to [].
155
157
  debug_info (dict[str, Any]]]): Debug information. Defaults to {}.
156
158
  message_id (Optional[str]): The message ID. Defaults to None.
@@ -166,6 +168,7 @@ class ChatService(BaseService):
166
168
  params = self._construct_message_modify_params(
167
169
  assistant=True,
168
170
  content=content,
171
+ original_content=original_content,
169
172
  references=references,
170
173
  debug_info=debug_info,
171
174
  message_id=message_id,
@@ -179,7 +182,8 @@ class ChatService(BaseService):
179
182
 
180
183
  async def modify_assistant_message_async(
181
184
  self,
182
- content: str,
185
+ content: str | None = None,
186
+ original_content: str | None = None,
183
187
  references: list[ContentReference] = [],
184
188
  debug_info: dict = {},
185
189
  message_id: Optional[str] = None,
@@ -189,7 +193,8 @@ class ChatService(BaseService):
189
193
  Modifies a message in the chat session asynchronously.
190
194
 
191
195
  Args:
192
- content (str): The new content for the message.
196
+ content (str, optional): The new content for the message.
197
+ original_content (str, optional): The original content for the message.
193
198
  message_id (str, optional): The message ID. Defaults to None, then the ChatState assistant message id is used.
194
199
  references (list[ContentReference]): list of ContentReference objects. Defaults to None.
195
200
  debug_info (Optional[dict[str, Any]]], optional): Debug information. Defaults to None.
@@ -205,6 +210,7 @@ class ChatService(BaseService):
205
210
  params = self._construct_message_modify_params(
206
211
  assistant=True,
207
212
  content=content,
213
+ original_content=original_content,
208
214
  references=references,
209
215
  debug_info=debug_info,
210
216
  message_id=message_id,
@@ -301,6 +307,7 @@ class ChatService(BaseService):
301
307
  def create_assistant_message(
302
308
  self,
303
309
  content: str,
310
+ original_content: str | None = None,
304
311
  references: list[ContentReference] = [],
305
312
  debug_info: dict = {},
306
313
  set_completed_at: Optional[bool] = False,
@@ -310,6 +317,7 @@ class ChatService(BaseService):
310
317
 
311
318
  Args:
312
319
  content (str): The content for the message.
320
+ original_content (str, optional): The original content for the message.
313
321
  references (list[ContentReference]): list of ContentReference objects. Defaults to None.
314
322
  debug_info (dict[str, Any]]): Debug information. Defaults to None.
315
323
  set_completed_at (Optional[bool]): Whether to set the completedAt field with the current date time. Defaults to False.
@@ -320,10 +328,13 @@ class ChatService(BaseService):
320
328
  Raises:
321
329
  Exception: If the creation fails.
322
330
  """
331
+ if original_content is None:
332
+ original_content = content
323
333
 
324
334
  try:
325
335
  params = self._construct_message_create_params(
326
336
  content=content,
337
+ original_content=original_content,
327
338
  references=references,
328
339
  debug_info=debug_info,
329
340
  set_completed_at=set_completed_at,
@@ -338,6 +349,7 @@ class ChatService(BaseService):
338
349
  async def create_assistant_message_async(
339
350
  self,
340
351
  content: str,
352
+ original_content: str | None = None,
341
353
  references: list[ContentReference] = [],
342
354
  debug_info: dict = {},
343
355
  set_completed_at: Optional[bool] = False,
@@ -347,6 +359,7 @@ class ChatService(BaseService):
347
359
 
348
360
  Args:
349
361
  content (str): The content for the message.
362
+ original_content (str, optional): The original content for the message.
350
363
  references (list[ContentReference]): list of references. Defaults to None.
351
364
  debug_info (dict[str, Any]]): Debug information. Defaults to None.
352
365
  set_completed_at (Optional[bool]): Whether to set the completedAt field with the current date time. Defaults to False.
@@ -357,9 +370,13 @@ class ChatService(BaseService):
357
370
  Raises:
358
371
  Exception: If the creation fails.
359
372
  """
373
+ if original_content is None:
374
+ original_content = content
375
+
360
376
  try:
361
377
  params = self._construct_message_create_params(
362
378
  content=content,
379
+ original_content=original_content,
363
380
  references=references,
364
381
  debug_info=debug_info,
365
382
  set_completed_at=set_completed_at,
@@ -497,6 +514,7 @@ class ChatService(BaseService):
497
514
  self,
498
515
  assistant: bool = True,
499
516
  content: Optional[str] = None,
517
+ original_content: Optional[str] = None,
500
518
  references: Optional[list[ContentReference]] = None,
501
519
  debug_info: Optional[dict] = None,
502
520
  message_id: Optional[str] = None,
@@ -525,7 +543,7 @@ class ChatService(BaseService):
525
543
  "id": message_id,
526
544
  "chatId": self.event.payload.chat_id,
527
545
  "text": content,
528
- "originalText": content,
546
+ "originalText": original_content,
529
547
  "references": self._map_references(references) if references else [],
530
548
  "debugInfo": debug_info,
531
549
  "completedAt": completed_at_datetime,
@@ -536,6 +554,7 @@ class ChatService(BaseService):
536
554
  self,
537
555
  role: ChatMessageRole = ChatMessageRole.ASSISTANT,
538
556
  content: Optional[str] = None,
557
+ original_content: Optional[str] = None,
539
558
  references: Optional[list[ContentReference]] = None,
540
559
  debug_info: Optional[dict] = None,
541
560
  assistantId: Optional[str] = None,
@@ -552,6 +571,9 @@ class ChatService(BaseService):
552
571
  else:
553
572
  completed_at_datetime = None
554
573
 
574
+ if original_content is None:
575
+ original_content = content
576
+
555
577
  params = {
556
578
  "user_id": self.event.user_id,
557
579
  "company_id": self.event.company_id,
@@ -559,7 +581,7 @@ class ChatService(BaseService):
559
581
  "role": role.value.upper(),
560
582
  "chatId": self.event.payload.chat_id,
561
583
  "text": content,
562
- "originalText": content,
584
+ "originalText": original_content,
563
585
  "references": self._map_references(references) if references else [],
564
586
  "debugInfo": debug_info,
565
587
  "completedAt": completed_at_datetime,
@@ -14,6 +14,8 @@ from pydantic import (
14
14
  model_validator,
15
15
  )
16
16
 
17
+ from unique_toolkit.language_model.utils import format_message
18
+
17
19
  # set config to convert camelCase to snake_case
18
20
  model_config = ConfigDict(
19
21
  alias_generator=camelize,
@@ -88,6 +90,9 @@ class LanguageModelMessage(BaseModel):
88
90
  content: Optional[str | list[dict]] = None
89
91
  tool_calls: Optional[list[LanguageModelFunctionCall]] = None
90
92
 
93
+ def __str__(self):
94
+ return format_message(self.role.capitalize(), message=self.content, num_tabs=1)
95
+
91
96
 
92
97
  class LanguageModelSystemMessage(LanguageModelMessage):
93
98
  role: LanguageModelMessageRole = LanguageModelMessageRole.SYSTEM
@@ -118,6 +123,13 @@ class LanguageModelToolMessage(LanguageModelMessage):
118
123
  name: str
119
124
  tool_call_id: str
120
125
 
126
+ def __str__(self):
127
+ return format_message(
128
+ user=self.role.capitalize(),
129
+ message=f"{self.name}, {self.tool_call_id}, {self.content}",
130
+ num_tabs=1,
131
+ )
132
+
121
133
  @field_validator("role", mode="before")
122
134
  def set_role(cls, value):
123
135
  return LanguageModelMessageRole.TOOL
@@ -132,6 +144,9 @@ class LanguageModelMessages(RootModel):
132
144
  | LanguageModelUserMessage
133
145
  ]
134
146
 
147
+ def __str__(self):
148
+ return "\n\n".join([str(message) for message in self.root])
149
+
135
150
  def __iter__(self):
136
151
  return iter(self.root)
137
152
 
@@ -42,3 +42,27 @@ def find_last_json_object(text: str) -> str | None:
42
42
  return matches[-1]
43
43
  else:
44
44
  return None
45
+
46
+
47
+ def format_message(user: str, message: str, num_tabs: int = 1) -> str:
48
+ """
49
+ Formats a message from a user by indenting each line with a specified number of tabs.
50
+
51
+ Args:
52
+ user (str): The name of the user sending the message.
53
+ message (str): The message content that may include multiple lines.
54
+ num_tabs (int): The number of tabs to use for indenting each line. Default is 1 tab.
55
+
56
+ Returns:
57
+ str: A formatted string with user and indented message lines.
58
+
59
+ Example:
60
+ >>> format_message("Alice", "Hello\nWorld", 2)
61
+ Alice:
62
+ \t\tHello
63
+ \t\tWorld
64
+ """
65
+ indentation = "\t" * num_tabs
66
+ indented_message = message.replace("\n", "\n" + indentation)
67
+ formatted_message = f"{user}:\n{indentation}{indented_message}"
68
+ return formatted_message
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 0.5.36
3
+ Version: 0.5.38
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Martin Fadler
@@ -100,6 +100,14 @@ All notable changes to this project will be documented in this file.
100
100
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
101
101
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
102
102
 
103
+ ## [0.5.38] - 2024-11-26
104
+ - Added string representation to `LanguageModelMessage` and `LanguageModelMessages` class
105
+
106
+ ## [0.5.37] - 2024-11-26
107
+ - `content` parameter in `ChatService.modify_assistant_message` and `ChatService.modify_assistant_message_async` is now optional
108
+ - Added optional parameter `original_content` to `ChatService.modify_assistant_message` and `ChatService.modify_assistant_message_async`
109
+ - Added optional parameter `original_content` to `ChatService.create_assistant_message` and `ChatService.create_assistant_message_async`
110
+
103
111
  ## [0.5.36] - 2024-11-19
104
112
  - Add possibility to return the response from the download file from chat request
105
113
  - Add possibility to not specify a filename and use filename from response headers
@@ -12,7 +12,7 @@ unique_toolkit/app/schemas.py,sha256=6RY7Ex-B3pOnFILlitHEi9sqJvupbpdxlN9xt33qRsM
12
12
  unique_toolkit/app/verification.py,sha256=UZqTHg3PX_QxMjeLH_BVBYoMVqMnMpeMoqvyTBKDqj8,1996
13
13
  unique_toolkit/chat/__init__.py,sha256=1prdTVfLOf6NgU-Aa1VIO-XiR6OYuRm51LaVRfKDCqc,267
14
14
  unique_toolkit/chat/schemas.py,sha256=IHOnb3pWlRlSPoEUWBTl6LK8YeMdlg2iXi9ghyBeiLw,1495
15
- unique_toolkit/chat/service.py,sha256=aS_cm42WBcrQnqVc3DR27RerRu2dGQGPlbXM-SYcKOc,20326
15
+ unique_toolkit/chat/service.py,sha256=lFcwCKHRHVLkMIO1cBHwH_Py0uZ4mmvgkUwQuZkpsxI,21438
16
16
  unique_toolkit/chat/state.py,sha256=Cjgwv_2vhDFbV69xxsn7SefhaoIAEqLx3ferdVFCnOg,1445
17
17
  unique_toolkit/chat/utils.py,sha256=ihm-wQykBWhB4liR3LnwPVPt_qGW6ETq21Mw4HY0THE,854
18
18
  unique_toolkit/content/__init__.py,sha256=MSH2sxjQyKD2Sef92fzE5Dt9SihdzivB6yliSwJfTmQ,890
@@ -37,10 +37,10 @@ unique_toolkit/evaluators/output_parser.py,sha256=eI72qkzK1dZyUvnfP2SOAQCGBj_-Pw
37
37
  unique_toolkit/evaluators/schemas.py,sha256=Jaue6Uhx75X1CyHKWj8sT3RE1JZXTqoLtfLt2xQNCX8,2507
38
38
  unique_toolkit/language_model/__init__.py,sha256=YuhyczGPj6w9xX-sOVUhmozvzIFxcckHFEkeMBecr5s,1784
39
39
  unique_toolkit/language_model/infos.py,sha256=kQK6F3r8xTN7oT6b39J7rxW-Y4iPXjx_Fr9bCOVQdm0,12509
40
- unique_toolkit/language_model/schemas.py,sha256=0pMLM1cCplw1OlM-eLqldZtYMObGr7tjHKXSHQP7hwE,6216
40
+ unique_toolkit/language_model/schemas.py,sha256=wg_ly66UvLOVNdrq8xr-0uN0HPY41UIk5mVPxdG-VGs,6687
41
41
  unique_toolkit/language_model/service.py,sha256=s5X6EStyYumiYqlD9gkW4GANif18d9QZOMysmUSfv8M,13433
42
- unique_toolkit/language_model/utils.py,sha256=WBPj1XKkDgxy_-T8HCZvsfkkSzj_1w4UZzNmyvdbBLY,1081
43
- unique_toolkit-0.5.36.dist-info/LICENSE,sha256=GlN8wHNdh53xwOPg44URnwag6TEolCjoq3YD_KrWgss,193
44
- unique_toolkit-0.5.36.dist-info/METADATA,sha256=4YTkAbPH4uPA3IxsLyxr4-eI3wvn8LLJTAxhO-UDNTw,13635
45
- unique_toolkit-0.5.36.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
46
- unique_toolkit-0.5.36.dist-info/RECORD,,
42
+ unique_toolkit/language_model/utils.py,sha256=bPQ4l6_YO71w-zaIPanUUmtbXC1_hCvLK0tAFc3VCRc,1902
43
+ unique_toolkit-0.5.38.dist-info/LICENSE,sha256=GlN8wHNdh53xwOPg44URnwag6TEolCjoq3YD_KrWgss,193
44
+ unique_toolkit-0.5.38.dist-info/METADATA,sha256=gjQLXWLmCmcvUCIEAF6k2_LKj8muzzR6r2m9BvOQxqQ,14180
45
+ unique_toolkit-0.5.38.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
46
+ unique_toolkit-0.5.38.dist-info/RECORD,,