unique_toolkit 0.5.19__tar.gz → 0.5.21__tar.gz

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.
Files changed (34) hide show
  1. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/CHANGELOG.md +7 -1
  2. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/PKG-INFO +8 -2
  3. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/pyproject.toml +1 -1
  4. unique_toolkit-0.5.21/unique_toolkit/chat/schemas.py +62 -0
  5. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/language_model/service.py +61 -13
  6. unique_toolkit-0.5.19/unique_toolkit/chat/schemas.py +0 -30
  7. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/LICENSE +0 -0
  8. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/README.md +0 -0
  9. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/__init__.py +0 -0
  10. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/_common/_base_service.py +0 -0
  11. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/_common/_time_utils.py +0 -0
  12. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/app/__init__.py +0 -0
  13. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/app/init_logging.py +0 -0
  14. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/app/init_sdk.py +0 -0
  15. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/app/performance/async_tasks.py +0 -0
  16. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  17. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/app/schemas.py +0 -0
  18. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/app/verification.py +0 -0
  19. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/chat/__init__.py +0 -0
  20. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/chat/service.py +0 -0
  21. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/chat/state.py +0 -0
  22. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/chat/utils.py +0 -0
  23. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/content/__init__.py +0 -0
  24. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/content/schemas.py +0 -0
  25. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/content/service.py +0 -0
  26. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/content/utils.py +0 -0
  27. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/embedding/__init__.py +0 -0
  28. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/embedding/schemas.py +0 -0
  29. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/embedding/service.py +0 -0
  30. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/embedding/utils.py +0 -0
  31. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/language_model/__init__.py +0 -0
  32. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/language_model/infos.py +0 -0
  33. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/language_model/schemas.py +0 -0
  34. {unique_toolkit-0.5.19 → unique_toolkit-0.5.21}/unique_toolkit/language_model/utils.py +0 -0
@@ -5,8 +5,14 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.5.21] - 2024-09-16
9
+ - Add `tool` as new role `ChatMessage`, as well as `tool_calls` and `tool_call_id` as additional parameters
10
+
11
+ ## [0.5.20] - 2024-09-16
12
+ - `LanguageModelService` now supports complete_util_async that can be called without instantiating the class, currently being used in the Hallucination service and evaluation API
13
+
8
14
  ## [0.5.19] - 2024-09-11
9
- - `LanguageModelMessage` now supports content as a list of dictionnary. Useful when adding image_url content along user message.
15
+ - `LanguageModelMessage` now supports content as a list of dictionary. Useful when adding image_url content along user message.
10
16
 
11
17
  ## [0.5.18] - 2024-09-03
12
18
  - Adds option to use `metadata_filter` with search.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 0.5.19
3
+ Version: 0.5.21
4
4
  Summary:
5
5
  License: MIT
6
6
  Author: Martin Fadler
@@ -100,8 +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.21] - 2024-09-16
104
+ - Add `tool` as new role `ChatMessage`, as well as `tool_calls` and `tool_call_id` as additional parameters
105
+
106
+ ## [0.5.20] - 2024-09-16
107
+ - `LanguageModelService` now supports complete_util_async that can be called without instantiating the class, currently being used in the Hallucination service and evaluation API
108
+
103
109
  ## [0.5.19] - 2024-09-11
104
- - `LanguageModelMessage` now supports content as a list of dictionnary. Useful when adding image_url content along user message.
110
+ - `LanguageModelMessage` now supports content as a list of dictionary. Useful when adding image_url content along user message.
105
111
 
106
112
  ## [0.5.18] - 2024-09-03
107
113
  - Adds option to use `metadata_filter` with search.
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "0.5.19"
3
+ version = "0.5.21"
4
4
  description = ""
5
5
  authors = [
6
6
  "Martin Fadler <martin.fadler@unique.ch>",
@@ -0,0 +1,62 @@
1
+ from enum import StrEnum
2
+ from typing import Optional
3
+
4
+ from humps import camelize
5
+ from pydantic import (
6
+ BaseModel,
7
+ ConfigDict,
8
+ Field,
9
+ field_validator,
10
+ model_validator,
11
+ )
12
+
13
+ # set config to convert camelCase to snake_case
14
+ model_config = ConfigDict(
15
+ alias_generator=camelize, populate_by_name=True, arbitrary_types_allowed=True
16
+ )
17
+
18
+
19
+ class ChatMessageRole(StrEnum):
20
+ USER = "user"
21
+ ASSISTANT = "assistant"
22
+ TOOL = "tool"
23
+
24
+
25
+ class Function(BaseModel):
26
+ model_config = model_config
27
+
28
+ name: str
29
+ arguments: str
30
+
31
+
32
+ class ToolCall(BaseModel):
33
+ model_config = model_config
34
+
35
+ id: str
36
+ type: str
37
+ function: Function
38
+
39
+
40
+ class ChatMessage(BaseModel):
41
+ model_config = model_config
42
+
43
+ id: str | None = None
44
+ object: str | None = None
45
+ content: str = Field(alias="text")
46
+ role: ChatMessageRole
47
+ tool_calls: Optional[list[ToolCall]] = None
48
+ tool_call_id: Optional[str] = None
49
+ debug_info: dict | None = {}
50
+
51
+ # TODO make sdk return role consistently in lowercase
52
+ # Currently needed as sdk returns role in uppercase
53
+ @field_validator("role", mode="before")
54
+ def set_role(cls, value: str):
55
+ return value.lower()
56
+
57
+ # Ensure tool_call_ids is required if role is 'tool'
58
+ @model_validator(mode="after")
59
+ def check_tool_call_ids_for_tool_role(self):
60
+ if self.role == ChatMessageRole.TOOL and not self.tool_call_id:
61
+ raise ValueError("tool_call_ids is required when role is 'tool'")
62
+ return self
@@ -75,37 +75,47 @@ class LanguageModelService(BaseService):
75
75
  self.logger.error(f"Error completing: {e}")
76
76
  raise e
77
77
 
78
- async def complete_async(
79
- self,
78
+ @classmethod
79
+ async def complete_async_util(
80
+ cls,
81
+ company_id: str,
80
82
  messages: LanguageModelMessages,
81
83
  model_name: LanguageModelName | str,
82
84
  temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
83
85
  timeout: int = DEFAULT_COMPLETE_TIMEOUT,
84
86
  tools: Optional[list[LanguageModelTool]] = None,
85
- ):
87
+ logger: Optional[logging.Logger] = logging.getLogger(__name__),
88
+ ) -> LanguageModelResponse:
86
89
  """
87
90
  Calls the completion endpoint asynchronously without streaming the response.
88
91
 
92
+ This method sends a request to the completion endpoint using the provided messages, model name,
93
+ temperature, timeout, and optional tools. It returns a `LanguageModelResponse` object containing
94
+ the completed result.
95
+
89
96
  Args:
97
+ company_id (str): The company ID associated with the request.
90
98
  messages (LanguageModelMessages): The messages to complete.
91
- model_name (LanguageModelName | str): The model name.
92
- temperature (float): The temperature value. Defaults to 0.
93
- timeout (int): The timeout value in milliseconds. Defaults to 240_000.
94
- tools (Optional[list[LanguageModelTool]]): The tools to use. Defaults to None.
99
+ model_name (LanguageModelName | str): The model name to use for the completion.
100
+ temperature (float): The temperature setting for the completion. Defaults to 0.
101
+ timeout (int): The timeout value in milliseconds for the request. Defaults to 240_000.
102
+ tools (Optional[list[LanguageModelTool]]): Optional list of tools to include in the request.
103
+ logger (Optional[logging.Logger], optional): The logger used to log errors. Defaults to the logger for the current module.
95
104
 
96
105
  Returns:
97
- str: The completed message content.
106
+ LanguageModelResponse: The response object containing the completed result.
107
+
108
+ Raises:
109
+ Exception: If an error occurs during the request, an exception is raised and logged.
98
110
  """
99
- options = self._add_tools_to_options({}, tools)
111
+ options = cls._add_tools_to_options({}, tools)
100
112
  messages = messages.model_dump(exclude_none=True, exclude={"tool_calls"})
101
113
  model = (
102
114
  model_name.name if isinstance(model_name, LanguageModelName) else model_name
103
115
  )
104
-
105
116
  try:
106
117
  response = await unique_sdk.ChatCompletion.create_async(
107
- company_id=self.event.company_id,
108
- # TODO change or extend types in unique_sdk
118
+ company_id=company_id,
109
119
  model=model,
110
120
  messages=cast(
111
121
  list[unique_sdk.Integrated.ChatCompletionRequestMessage],
@@ -117,9 +127,47 @@ class LanguageModelService(BaseService):
117
127
  )
118
128
  return LanguageModelResponse(**response)
119
129
  except Exception as e:
120
- self.logger.error(f"Error completing: {e}")
130
+ logger.error(f"Error completing: {e}")
121
131
  raise e
122
132
 
133
+ async def complete_async(
134
+ self,
135
+ messages: LanguageModelMessages,
136
+ model_name: LanguageModelName | str,
137
+ temperature: float = DEFAULT_COMPLETE_TEMPERATURE,
138
+ timeout: int = DEFAULT_COMPLETE_TIMEOUT,
139
+ tools: Optional[list[LanguageModelTool]] = None,
140
+ ) -> LanguageModelResponse:
141
+ """
142
+ Calls the completion endpoint asynchronously without streaming the response.
143
+
144
+ This method utilizes the class method `complete_async_util` to perform the asynchronous completion
145
+ request using the provided messages, model name, temperature, timeout, and optional tools. It
146
+ returns a `LanguageModelResponse` object containing the result of the completion.
147
+
148
+ Args:
149
+ messages (LanguageModelMessages): The messages to complete.
150
+ model_name (LanguageModelName | str): The model name to use for the completion.
151
+ temperature (float): The temperature setting for the completion. Defaults to 0.0.
152
+ timeout (int): The timeout value in milliseconds for the request. Defaults to 240,000.
153
+ tools (Optional[list[LanguageModelTool]]): Optional list of tools to include in the request.
154
+
155
+ Returns:
156
+ LanguageModelResponse: The response object containing the completed result.
157
+
158
+ Raises:
159
+ Exception: If an error occurs during the completion request.
160
+ """
161
+ return await self.complete_async_util(
162
+ company_id=self.event.company_id,
163
+ messages=messages,
164
+ model_name=model_name,
165
+ temperature=temperature,
166
+ timeout=timeout,
167
+ tools=tools,
168
+ logger=self.logger,
169
+ )
170
+
123
171
  def stream_complete(
124
172
  self,
125
173
  messages: LanguageModelMessages,
@@ -1,30 +0,0 @@
1
- from enum import StrEnum
2
-
3
- from humps import camelize
4
- from pydantic import BaseModel, ConfigDict, Field, field_validator
5
-
6
- # set config to convert camelCase to snake_case
7
- model_config = ConfigDict(
8
- alias_generator=camelize, populate_by_name=True, arbitrary_types_allowed=True
9
- )
10
-
11
-
12
- class ChatMessageRole(StrEnum):
13
- USER = "user"
14
- ASSISTANT = "assistant"
15
-
16
-
17
- class ChatMessage(BaseModel):
18
- model_config = model_config
19
-
20
- id: str | None = None
21
- object: str | None = None
22
- content: str = Field(alias="text")
23
- role: ChatMessageRole
24
- debug_info: dict | None = {}
25
-
26
- # TODO make sdk return role consistently in lowercase
27
- # Currently needed as sdk returns role in uppercase
28
- @field_validator("role", mode="before")
29
- def set_role(cls, value: str):
30
- return value.lower()
File without changes