mirascope 1.23.4__py3-none-any.whl → 1.24.1__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.
mirascope/__init__.py CHANGED
@@ -15,6 +15,7 @@ from .core import (
15
15
  BaseToolKit,
16
16
  CacheControlPart,
17
17
  DocumentPart,
18
+ DocumentURLPart,
18
19
  ImagePart,
19
20
  ImageURLPart,
20
21
  LocalProvider,
@@ -43,6 +44,7 @@ __all__ = [
43
44
  "BaseToolKit",
44
45
  "CacheControlPart",
45
46
  "DocumentPart",
47
+ "DocumentURLPart",
46
48
  "ImagePart",
47
49
  "ImageURLPart",
48
50
  "LocalProvider",
@@ -16,6 +16,7 @@ from .base import (
16
16
  CacheControlPart,
17
17
  CostMetadata,
18
18
  DocumentPart,
19
+ DocumentURLPart,
19
20
  FromCallArgs,
20
21
  ImagePart,
21
22
  ImageURLPart,
@@ -77,6 +78,7 @@ __all__ = [
77
78
  "CacheControlPart",
78
79
  "CostMetadata",
79
80
  "DocumentPart",
81
+ "DocumentURLPart",
80
82
  "FromCallArgs",
81
83
  "ImagePart",
82
84
  "ImageURLPart",
@@ -75,14 +75,14 @@ class AzureCallResponseChunk(
75
75
  return self.chunk.id
76
76
 
77
77
  @property
78
- def usage(self) -> CompletionsUsage:
78
+ def usage(self) -> CompletionsUsage | None:
79
79
  """Returns the usage of the chat completion."""
80
80
  return self.chunk.usage
81
81
 
82
82
  @property
83
- def input_tokens(self) -> int:
83
+ def input_tokens(self) -> int | None:
84
84
  """Returns the number of input tokens."""
85
- return self.usage.prompt_tokens
85
+ return self.usage.prompt_tokens if self.usage else None
86
86
 
87
87
  @property
88
88
  def cached_tokens(self) -> int:
@@ -90,9 +90,9 @@ class AzureCallResponseChunk(
90
90
  return 0
91
91
 
92
92
  @property
93
- def output_tokens(self) -> int:
93
+ def output_tokens(self) -> int | None:
94
94
  """Returns the number of output tokens."""
95
- return self.usage.completion_tokens
95
+ return self.usage.completion_tokens if self.usage else None
96
96
 
97
97
  @property
98
98
  def cost_metadata(self) -> CostMetadata:
@@ -16,6 +16,7 @@ from .message_param import (
16
16
  BaseMessageParam,
17
17
  CacheControlPart,
18
18
  DocumentPart,
19
+ DocumentURLPart,
19
20
  ImagePart,
20
21
  ImageURLPart,
21
22
  TextPart,
@@ -59,6 +60,7 @@ __all__ = [
59
60
  "CommonCallParams",
60
61
  "CostMetadata",
61
62
  "DocumentPart",
63
+ "DocumentURLPart",
62
64
  "FromCallArgs",
63
65
  "GenerateJsonSchemaNoTitles",
64
66
  "ImagePart",
@@ -14,6 +14,7 @@ from ..message_param import (
14
14
  BaseMessageParam,
15
15
  CacheControlPart,
16
16
  DocumentPart,
17
+ DocumentURLPart,
17
18
  ImagePart,
18
19
  ImageURLPart,
19
20
  TextPart,
@@ -37,7 +38,8 @@ def _convert_message_sequence_part_to_content_part(
37
38
  | AudioURLPart
38
39
  | AudioSegment
39
40
  | Wave_read
40
- | DocumentPart,
41
+ | DocumentPart
42
+ | DocumentURLPart,
41
43
  ) -> (
42
44
  TextPart
43
45
  | ImagePart
@@ -45,6 +47,7 @@ def _convert_message_sequence_part_to_content_part(
45
47
  | AudioPart
46
48
  | AudioURLPart
47
49
  | CacheControlPart
50
+ | DocumentURLPart
48
51
  | DocumentPart
49
52
  ):
50
53
  if isinstance(message_sequence_part, str):
@@ -57,7 +60,8 @@ def _convert_message_sequence_part_to_content_part(
57
60
  | AudioPart
58
61
  | AudioURLPart
59
62
  | CacheControlPart
60
- | DocumentPart,
63
+ | DocumentPart
64
+ | DocumentURLPart,
61
65
  ):
62
66
  return message_sequence_part
63
67
  elif has_pil_module and isinstance(message_sequence_part, Image.Image):
@@ -107,6 +111,7 @@ def convert_message_content_to_message_param_content(
107
111
  | AudioSegment
108
112
  | Wave_read
109
113
  | DocumentPart
114
+ | DocumentURLPart,
110
115
  ],
111
116
  ) -> (
112
117
  list[
@@ -117,6 +122,7 @@ def convert_message_content_to_message_param_content(
117
122
  | AudioURLPart
118
123
  | CacheControlPart
119
124
  | DocumentPart
125
+ | DocumentURLPart,
120
126
  ]
121
127
  | str
122
128
  ):
@@ -151,6 +157,7 @@ def convert_messages_to_message_params(
151
157
  | AudioSegment
152
158
  | Wave_read
153
159
  | DocumentPart
160
+ | DocumentURLPart,
154
161
  ]
155
162
  | list[BaseMessageParam]
156
163
  | BaseMessageParam,
@@ -60,10 +60,8 @@ def transform_tool_outputs(
60
60
  tools_and_outputs: Sequence[tuple[_BaseToolT, JsonableType]],
61
61
  ) -> list[_ToolMessageParamT]:
62
62
  def recursive_serializer(value: JsonableType) -> BaseType:
63
- if isinstance(value, str):
63
+ if isinstance(value, str | int | float | bool | None):
64
64
  return value
65
- if isinstance(value, int | float | bool):
66
- return value # Don't serialize primitives yet
67
65
  if isinstance(value, bytes):
68
66
  return base64.b64encode(value).decode("utf-8")
69
67
  if isinstance(value, BaseModel):
@@ -103,6 +103,18 @@ class DocumentPart(BaseModel):
103
103
  document: bytes
104
104
 
105
105
 
106
+ class DocumentURLPart(BaseModel):
107
+ """A content part for documents with a URL.
108
+
109
+ Attributes:
110
+ type: Always "document_url"
111
+ url: The URL to the document
112
+ """
113
+
114
+ type: Literal["document_url"]
115
+ url: str
116
+
117
+
106
118
  class ToolCallPart(BaseModel):
107
119
  """A content part for tool.
108
120
 
@@ -156,6 +168,7 @@ class BaseMessageParam(BaseModel):
156
168
  | AudioURLPart
157
169
  | CacheControlPart
158
170
  | DocumentPart
171
+ | DocumentURLPart
159
172
  | ToolCallPart
160
173
  | ToolResultPart
161
174
  ]
@@ -14,6 +14,7 @@ from .message_param import (
14
14
  BaseMessageParam,
15
15
  CacheControlPart,
16
16
  DocumentPart,
17
+ DocumentURLPart,
17
18
  ImagePart,
18
19
  ImageURLPart,
19
20
  TextPart,
@@ -36,6 +37,7 @@ class Messages:
36
37
  | AudioSegment
37
38
  | Wave_read
38
39
  | DocumentPart
40
+ | DocumentURLPart
39
41
  ]
40
42
  | list[BaseMessageParam | Any]
41
43
  | BaseMessageParam
@@ -57,6 +59,7 @@ class Messages:
57
59
  | AudioSegment
58
60
  | Wave_read
59
61
  | DocumentPart
62
+ | DocumentURLPart
60
63
  ],
61
64
  ) -> BaseMessageParam:
62
65
  return BaseMessageParam(
@@ -80,6 +83,7 @@ class Messages:
80
83
  | AudioSegment
81
84
  | Wave_read
82
85
  | DocumentPart
86
+ | DocumentURLPart
83
87
  ],
84
88
  ) -> BaseMessageParam:
85
89
  return BaseMessageParam(
@@ -103,6 +107,7 @@ class Messages:
103
107
  | AudioSegment
104
108
  | Wave_read
105
109
  | DocumentPart
110
+ | DocumentURLPart
106
111
  ],
107
112
  ) -> BaseMessageParam:
108
113
  return BaseMessageParam(
@@ -122,6 +122,15 @@ class BaseTool(BaseModel, ABC):
122
122
  if field not in {"tool_call", "delta"}
123
123
  }
124
124
 
125
+ @property
126
+ def id(self) -> str | None:
127
+ """The id of the tool."""
128
+ if tool_call := getattr(self, "tool_call", None):
129
+ # Expect tool_call has an id attribute.
130
+ # If not, we should override this method on the provider tool
131
+ return getattr(tool_call, "id", None)
132
+ return None
133
+
125
134
  @abstractmethod
126
135
  def call(self, *args: Any, **kwargs: Any) -> Any: # noqa: ANN401
127
136
  """The method to call the tool."""
@@ -100,25 +100,27 @@ class BedrockMessageParamConverter(BaseMessageParamConverter):
100
100
  )
101
101
  elif "toolUse" in block:
102
102
  tool_use = block["toolUse"]
103
+
104
+ tool_use_part = ToolCallPart(
105
+ type="tool_call",
106
+ name=tool_use["name"],
107
+ id=tool_use["toolUseId"],
108
+ args=tool_use["input"],
109
+ )
103
110
  if converted_content:
111
+ converted_content.append(tool_use_part)
104
112
  converted.append(
105
113
  BaseMessageParam(
106
114
  role=message_param["role"], content=converted_content
107
115
  )
108
116
  )
109
117
  converted_content = []
118
+ continue
110
119
 
111
120
  converted.append(
112
121
  BaseMessageParam(
113
122
  role="assistant",
114
- content=[
115
- ToolCallPart(
116
- type="tool_call",
117
- name=tool_use["name"],
118
- id=tool_use["toolUseId"],
119
- args=tool_use["input"],
120
- )
121
- ],
123
+ content=[tool_use_part],
122
124
  )
123
125
  )
124
126
  elif "toolResult" in block:
@@ -137,7 +139,6 @@ class BedrockMessageParamConverter(BaseMessageParamConverter):
137
139
  ToolResultPart(
138
140
  type="tool_result",
139
141
  id=tool_result["toolUseId"],
140
- name=tool_result["name"], # pyright: ignore [reportGeneralTypeIssues]
141
142
  content=tool_result["content"]
142
143
  if isinstance(tool_result["content"], str)
143
144
  else tool_result["content"][0]["text"], # pyright: ignore [reportTypedDictNotRequiredAccess]
@@ -219,7 +219,6 @@ class BedrockCallResponse(
219
219
  "toolResult": {
220
220
  "content": [{"text": output}],
221
221
  "toolUseId": tool.tool_call["toolUse"]["toolUseId"], # pyright: ignore [reportOptionalSubscript]
222
- "name": tool._name(),
223
222
  }
224
223
  },
225
224
  )
@@ -56,6 +56,10 @@ class BedrockTool(BaseTool):
56
56
 
57
57
  tool_call: SkipJsonSchema[ToolUseBlockContentTypeDef]
58
58
 
59
+ @property
60
+ def id(self) -> str | None:
61
+ return self.tool_call["toolUse"]["toolUseId"]
62
+
59
63
  @classmethod
60
64
  def tool_schema(cls) -> ToolTypeDef:
61
65
  """Constructs a JSON Schema tool schema from the `BaseModel` schema defined.
@@ -16,9 +16,13 @@ from google.genai.types import (
16
16
  )
17
17
 
18
18
  from ...base import BaseMessageParam
19
- from ...base._utils import get_audio_type, get_image_type
19
+ from ...base._utils import get_audio_type, get_document_type, get_image_type
20
20
  from ...base._utils._parse_content_template import _load_media
21
- from ._validate_media_type import _check_audio_media_type, _check_image_media_type
21
+ from ._validate_media_type import (
22
+ _check_audio_media_type,
23
+ _check_document_media_type,
24
+ _check_image_media_type,
25
+ )
22
26
 
23
27
 
24
28
  def _over_file_size_limit(size: int) -> bool:
@@ -154,9 +158,78 @@ async def _convert_message_params_async(
154
158
  if _over_file_size_limit(total_payload_size):
155
159
  must_upload[index] = blob_dict
156
160
  total_payload_size -= audio_size
161
+ elif part.type == "document":
162
+ _check_document_media_type(part.media_type)
163
+ blob_dict = BlobDict(data=part.document, mime_type=part.media_type)
164
+ converted_content.append(PartDict(inline_data=blob_dict))
165
+ document_size = len(part.document)
166
+ total_payload_size += document_size
167
+ if _over_file_size_limit(total_payload_size):
168
+ must_upload[index] = blob_dict
169
+ total_payload_size -= document_size
170
+ elif part.type == "document_url":
171
+ if (
172
+ client.vertexai
173
+ or not part.url.startswith(("https://", "http://"))
174
+ or "generativelanguage.googleapis.com" in part.url
175
+ ):
176
+ converted_content.append(
177
+ PartDict(
178
+ file_data=FileDataDict(
179
+ file_uri=part.url, mime_type=None
180
+ )
181
+ )
182
+ )
183
+ else:
184
+ media_type = None
185
+ try:
186
+ downloaded_document = _load_media(part.url)
187
+ document_types = {
188
+ "pdf": "application/pdf",
189
+ "html": "text/html",
190
+ "xml": "text/xml",
191
+ "rtf": "text/rtf",
192
+ }
193
+
194
+ try:
195
+ document_type_ext = get_document_type(
196
+ downloaded_document
197
+ )
198
+ media_type = document_types.get(document_type_ext)
199
+ except ValueError:
200
+ try:
201
+ downloaded_document.decode("utf-8")
202
+ media_type = "text/plain"
203
+ except UnicodeDecodeError:
204
+ pass
205
+
206
+ if media_type is None:
207
+ raise ValueError(
208
+ f"Unsupported document format detected for URL: {part.url}. "
209
+ "Google API only supports the following document formats: "
210
+ "PDF, JavaScript, Python, TXT, HTML, CSS, Markdown, CSV, XML and RTF. "
211
+ "Please provide a document in one of these supported formats."
212
+ )
213
+
214
+ _check_document_media_type(media_type)
215
+ blob_dict = BlobDict(
216
+ data=downloaded_document, mime_type=media_type
217
+ )
218
+ converted_content.append(PartDict(inline_data=blob_dict))
219
+ document_size = len(downloaded_document)
220
+ total_payload_size += document_size
221
+ if _over_file_size_limit(total_payload_size):
222
+ must_upload[index] = blob_dict
223
+ total_payload_size -= document_size
224
+ except ValueError as e:
225
+ raise ValueError(
226
+ f"Failed to process document from URL: {part.url}. "
227
+ f"Error details: {str(e)}. "
228
+ "Please ensure the URL is accessible and points to a supported document format."
229
+ )
157
230
  else:
158
231
  raise ValueError(
159
- "Google currently only supports text, tool_call, tool_result, image, and audio parts. "
232
+ "Google currently only supports text, tool_call, tool_result, image, audio, and document parts. "
160
233
  f"Part provided: {part.type}"
161
234
  )
162
235
 
@@ -8,7 +8,7 @@ from google.genai.types import (
8
8
  )
9
9
 
10
10
  from mirascope.core import BaseMessageParam
11
- from mirascope.core.base import DocumentPart, ImagePart, TextPart
11
+ from mirascope.core.base import DocumentPart, DocumentURLPart, ImagePart, TextPart
12
12
  from mirascope.core.base._utils._base_message_param_converter import (
13
13
  BaseMessageParamConverter,
14
14
  )
@@ -21,7 +21,11 @@ from mirascope.core.base.message_param import (
21
21
  )
22
22
  from mirascope.core.google._utils import convert_message_params
23
23
 
24
- from ._validate_media_type import _check_audio_media_type, _check_image_media_type
24
+ from ._validate_media_type import (
25
+ _check_audio_media_type,
26
+ _check_document_media_type,
27
+ _check_image_media_type,
28
+ )
25
29
 
26
30
 
27
31
  class GoogleMessageParamConverter(BaseMessageParamConverter):
@@ -78,7 +82,21 @@ class GoogleMessageParamConverter(BaseMessageParamConverter):
78
82
  audio=data,
79
83
  )
80
84
  )
81
- elif mime_type == "application/pdf":
85
+ elif mime_type in [
86
+ "application/pdf",
87
+ "application/x-javascript",
88
+ "text/javascript",
89
+ "application/x-python",
90
+ "text/x-python",
91
+ "text/plain",
92
+ "text/html",
93
+ "text/css",
94
+ "text/csv",
95
+ "text/xml",
96
+ "text/rtf",
97
+ "text/md",
98
+ ]:
99
+ _check_document_media_type(mime_type)
82
100
  content_list.append(
83
101
  DocumentPart(
84
102
  type="document", media_type=mime_type, document=data
@@ -106,6 +124,26 @@ class GoogleMessageParamConverter(BaseMessageParamConverter):
106
124
  url=cast(str, part.file_data.file_uri),
107
125
  )
108
126
  )
127
+ elif mime_type in [
128
+ "application/pdf",
129
+ "application/x-javascript",
130
+ "text/javascript",
131
+ "application/x-python",
132
+ "text/x-python",
133
+ "text/plain",
134
+ "text/html",
135
+ "text/css",
136
+ "text/csv",
137
+ "text/xml",
138
+ "text/rtf",
139
+ "text/md",
140
+ ]:
141
+ content_list.append(
142
+ DocumentURLPart(
143
+ type="document_url",
144
+ url=cast(str, part.file_data.file_uri),
145
+ )
146
+ )
109
147
  else:
110
148
  # Since `FileDataDict` handles any file data, we use
111
149
  # `ImageURLPart` for unknown mime types
@@ -148,7 +186,7 @@ class GoogleMessageParamConverter(BaseMessageParamConverter):
148
186
  )
149
187
  else:
150
188
  raise ValueError(
151
- "Part does not contain any supported content (text, image, or document)."
189
+ "Part does not contain any supported content (text, image, audio, or document)."
152
190
  )
153
191
 
154
192
  if len(content_list) == 1 and isinstance(content_list[0], TextPart):
@@ -32,3 +32,27 @@ def _check_audio_media_type(media_type: str) -> None:
32
32
  "Google currently only supports WAV, MP3, AIFF, AAC, OGG, "
33
33
  "and FLAC audio file types."
34
34
  )
35
+
36
+
37
+ def _check_document_media_type(media_type: str) -> None:
38
+ """Raises a `ValueError` if the document media type is not supported."""
39
+
40
+ if media_type not in [
41
+ "application/pdf",
42
+ "application/x-javascript",
43
+ "text/javascript",
44
+ "application/x-python",
45
+ "text/x-python",
46
+ "text/plain",
47
+ "text/html",
48
+ "text/css",
49
+ "text/csv",
50
+ "text/xml",
51
+ "text/rtf",
52
+ "text/md",
53
+ ]:
54
+ raise ValueError(
55
+ f"Unsupported document media type: {media_type}. "
56
+ "Google currently only supports PDF, JavaScript, Python, TXT, HTML, CSS, "
57
+ "CSV, XML, RTF, and Markdown document types."
58
+ )
@@ -142,15 +142,6 @@ class CallResponse(
142
142
  tools_and_outputs: The sequence of tools and their outputs from which the tool
143
143
  message parameters should be constructed.
144
144
  """
145
-
146
- def _get_tool_call_id(_tool: BaseTool) -> str | None:
147
- """Get the tool call ID."""
148
- if tool_call := getattr(_tool, "tool_call", None):
149
- # Expect tool_call has an id attribute.
150
- # If not, we should implement a method to get the id on the provider tool
151
- return getattr(tool_call, "id", None)
152
- return None
153
-
154
145
  return [
155
146
  BaseMessageParam(
156
147
  role="tool",
@@ -159,7 +150,7 @@ class CallResponse(
159
150
  type="tool_result",
160
151
  name=tool._name(),
161
152
  content=output,
162
- id=_get_tool_call_id(tool),
153
+ id=tool.id,
163
154
  )
164
155
  ],
165
156
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mirascope
3
- Version: 1.23.4
3
+ Version: 1.24.1
4
4
  Summary: LLM abstractions that aren't obstructions
5
5
  Project-URL: Homepage, https://mirascope.com
6
6
  Project-URL: Documentation, https://mirascope.com/WELCOME
@@ -154,7 +154,7 @@ print(book)
154
154
 
155
155
  ## Tutorials
156
156
 
157
- Check out our [quickstart tutorial](https://mirascope.com/tutorials/getting_started/quickstart) and many other tutorials for an interactive way to getting started with Mirascope.
157
+ Check out our [quickstart tutorial](https://mirascope.com/docs/mirascope/getting-started/quickstart) and many other tutorials for an interactive way to getting started with Mirascope.
158
158
 
159
159
  ## Usage
160
160
 
@@ -166,4 +166,4 @@ Mirascope uses [Semantic Versioning](https://semver.org/).
166
166
 
167
167
  ## Licence
168
168
 
169
- This project is licensed under the terms of the [MIT License](https://github.com/Mirascope/mirascope/blob/dev/LICENSE).
169
+ This project is licensed under the terms of the [MIT License](https://github.com/Mirascope/mirascope/tree/main/LICENSE).
@@ -1,4 +1,4 @@
1
- mirascope/__init__.py,sha256=9tlaOwtuiqux3XRp13S50-miVOXdNUFQPpgJ52DAigk,1083
1
+ mirascope/__init__.py,sha256=Rmt0CqSEEEqc7KhW10KzQHgGij11PIKRrNQ_y4IU4eY,1127
2
2
  mirascope/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  mirascope/beta/__init__.py,sha256=YsIIE5w3nKj0Ywcs_Y5tSE6WlHKR-nQwwbhNF1R8UW8,43
4
4
  mirascope/beta/openai/__init__.py,sha256=a7xllQBfcpO6kYwZ5Zv1CWzN9qpS1SJoBgb1J20F-Hk,257
@@ -41,7 +41,7 @@ mirascope/beta/rag/pinecone/vectorstores.py,sha256=ZcLwVmrxNMq5a2mLI-3F9XJ_UYDry
41
41
  mirascope/beta/rag/weaviate/__init__.py,sha256=eod9OprMo1zdDb-waYWtBJKWuYQRx7v-QEen-wzm_5w,231
42
42
  mirascope/beta/rag/weaviate/types.py,sha256=-2r2Vy71kpLlRJgVqWoE3atub5a2eymHPSjTHuSqCfQ,2984
43
43
  mirascope/beta/rag/weaviate/vectorstores.py,sha256=8Nwy-QRHwSUdvMkqEhqmUkN7y_CzQN7bop7do1K8v4w,3606
44
- mirascope/core/__init__.py,sha256=SqxvVLwoIfxE8LJZfoXLFgMYujDUcYiAkZ_riTD6CO8,2030
44
+ mirascope/core/__init__.py,sha256=10mn-PHVEOUu0aZ-CIOZDl89exoRcJVDBB1xWK938YA,2074
45
45
  mirascope/core/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  mirascope/core/anthropic/__init__.py,sha256=GB-CULa3jYEPv1ZDyZjNCKQJbrc6ojqu8WNRSFElQ-4,918
47
47
  mirascope/core/anthropic/_call.py,sha256=LXUR__AyexD-hsPMPKpA7IFuh8Cfc0uAg1GrJSxiWnU,2358
@@ -66,7 +66,7 @@ mirascope/core/azure/_call.py,sha256=SHqSJe6_4zgn4Y9PkpDl4vXvLuT4QmVnWUcws9e_RR8
66
66
  mirascope/core/azure/_call_kwargs.py,sha256=q38xKSgCBWi8DLScepG-KnUfgi67AU6xr2uOHwCZ2mI,435
67
67
  mirascope/core/azure/call_params.py,sha256=NK_ggVJbactDip85DbfCaqSWRpO0CgwN1svY-KW4_Yg,1836
68
68
  mirascope/core/azure/call_response.py,sha256=FzSqAunmZCeVhQIei2_YcUqZBnJUgmEFFT4jHiJFm28,7068
69
- mirascope/core/azure/call_response_chunk.py,sha256=2NorPZ6szna3G-xDx63kuPuMQ7PCh5WNeGhiBRvwCYM,3155
69
+ mirascope/core/azure/call_response_chunk.py,sha256=bWgpT-XldmetNwcQmpVVHRCLn6B6UKM6NK_RAxb2Zio,3224
70
70
  mirascope/core/azure/dynamic_config.py,sha256=6SBMGFce7tuXdwHrlKNISpZxVxUnnumbIQB9lGR6nbs,1066
71
71
  mirascope/core/azure/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
72
  mirascope/core/azure/stream.py,sha256=XfEO6sOgnXiOhhuagrFdtFI-oQECxBP0Zt0wbfUH1TU,4637
@@ -80,7 +80,7 @@ mirascope/core/azure/_utils/_get_json_output.py,sha256=Qec7WJY5is1Q63Vp9uUNNfkRw
80
80
  mirascope/core/azure/_utils/_handle_stream.py,sha256=M_BGnjBGWTPefNyIMuJSHiDxIvqmENmqfVlDx_qzL1c,4638
81
81
  mirascope/core/azure/_utils/_message_param_converter.py,sha256=JAUeHObtd_V225YyZqEruuih3HRozq43pqjYJCbJj8A,4443
82
82
  mirascope/core/azure/_utils/_setup_call.py,sha256=cdUof-RCxsPbKuJvevsEUYXU-ckoql3wTevNEQiEpz4,6496
83
- mirascope/core/base/__init__.py,sha256=mENqcLNM5-FCh4lyDGihOAegQSAzSoIK744pBMkJinM,2067
83
+ mirascope/core/base/__init__.py,sha256=tBy5Q2jrioxxYji_tArS-fcxBYmIBbhmGGZDpkhDjE8,2111
84
84
  mirascope/core/base/_call_factory.py,sha256=YdFHAa9WtGfYeqVcM2xaDNh5gMg584rOe26_E51-1to,9663
85
85
  mirascope/core/base/_create.py,sha256=M6dpcWwtyb6O7pa9pT0rdwhYEUcuB2iu2uv97kAU1qk,10090
86
86
  mirascope/core/base/_extract.py,sha256=QTqkArgmgR17OB5jTP86Wo-TW-BcouOcK9gdMy-EcNw,6799
@@ -88,20 +88,20 @@ mirascope/core/base/_extract_with_tools.py,sha256=MW4v8D1xty7LqLb5RwMFkX-peQqA73
88
88
  mirascope/core/base/_partial.py,sha256=w_ACCgsDKNLtMyAP-lNmfRdrFEPmzh2BT4aninajxyY,3240
89
89
  mirascope/core/base/call_kwargs.py,sha256=0mznCsrj1dYxvdwYNF0RKbc9CiU5G6WvvcjPqOMsOE4,351
90
90
  mirascope/core/base/call_params.py,sha256=wtuuOY-SwIZYCDBKfn_xRC0Kf1cUuI4eSQaXu6VrtaE,1331
91
- mirascope/core/base/call_response.py,sha256=YBQvOrNcDKZG9H_aOlB88WJ4D9oIQiSybZhUTPMOxBY,10721
91
+ mirascope/core/base/call_response.py,sha256=2f7ETVpr3ZPcTfGJ7aQp4xlN-7fU7IWDvdfT-fMzDr0,10632
92
92
  mirascope/core/base/call_response_chunk.py,sha256=ZfulgERwgva55TLrQI9XimX8bpgOqBNLs_I-_kELl-4,3606
93
93
  mirascope/core/base/dynamic_config.py,sha256=V5IG2X5gPFpfQ47uO8JU1zoC2eNdRftsRZEmwhRPaYI,2859
94
94
  mirascope/core/base/from_call_args.py,sha256=8ijMX7PN6a4o6uLdmXJlSRnE-rEVJU5NLxUmNrS8dvU,909
95
95
  mirascope/core/base/merge_decorators.py,sha256=9pQYXuTxLh4mGKVIsnR5pYBkYCaQjg85TTelC6XDldE,1988
96
- mirascope/core/base/message_param.py,sha256=DjyZTFbWpuBsrSJO2G2joT3klBLN6hoJNd5nA3GWjmU,3562
97
- mirascope/core/base/messages.py,sha256=jD8SGjP3VQJsRfDo71ifHfwTMH4bHtYyjXQKyWRy_OY,2530
96
+ mirascope/core/base/message_param.py,sha256=5AtuTmpscZKsXengBPkPV4F33Et0BQRpfeRwMMvqqdY,3822
97
+ mirascope/core/base/messages.py,sha256=tn38kanabpq6fabxvb0p8zo5fZBBz6Yotl1szCgh3xg,2671
98
98
  mirascope/core/base/metadata.py,sha256=V9hgMkj6m3QGsu4H5LhCxBZBYQLoygJv0CeLIf1DF0M,382
99
99
  mirascope/core/base/prompt.py,sha256=M5PK9JoEsWTQ-kzNCpZKdDGzWAkb8MS267xEFCPfpAU,15414
100
100
  mirascope/core/base/response_model_config_dict.py,sha256=OUdx_YkV2vBzUSSB2OYLAAHf22T7jvF5tRuc6c-vhNQ,254
101
101
  mirascope/core/base/stream.py,sha256=ZHjC9MQ3HT9KMbqCKTB0um2fvMLJmRYU_eSGdfRj79I,17274
102
102
  mirascope/core/base/stream_config.py,sha256=vwWqNh9NJhTYjiJmfDbC9D5O84je_lBRhNOt4wI3FHM,238
103
103
  mirascope/core/base/structured_stream.py,sha256=FIvLXXKninrpQ5P7MsLEqGrU4cfvEDiPbueZqgJ4Dlw,10395
104
- mirascope/core/base/tool.py,sha256=ISk4MKfNljfsMe0rEwW0J8Dqty7WXJej7gV2oSiVxa8,6885
104
+ mirascope/core/base/tool.py,sha256=or8Zv0reSLSGjBAxlcfX4MzEQyhyPv-HOivJLJ9rQGs,7220
105
105
  mirascope/core/base/toolkit.py,sha256=GmZquYPqvQL2J9Hd6StEwx6jfeFsqtcUyxKvp4iW_7Q,6271
106
106
  mirascope/core/base/types.py,sha256=4GVyVzHThWJU2Og-wpVbYNPZD8QMdHltIAV83FUlisM,9247
107
107
  mirascope/core/base/_utils/__init__.py,sha256=Tm-9-6k7cZL3IaqebOEaKpTg9nFUMfAGHHeKmC3YzLQ,3192
@@ -110,7 +110,7 @@ mirascope/core/base/_utils/_base_type.py,sha256=x8ZabSxZZNAy6ER-VQEkB6mNyjWcGSCB
110
110
  mirascope/core/base/_utils/_convert_base_model_to_base_tool.py,sha256=JoHf1CbRwK91dABm5xLhdIPmeMSFS_nj-qW9OQu_YJ0,1750
111
111
  mirascope/core/base/_utils/_convert_base_type_to_base_tool.py,sha256=fAOfqqoT0_vk1i-h-lCdWQYYeTjZ3fTiCgwGmgtHk9o,734
112
112
  mirascope/core/base/_utils/_convert_function_to_base_tool.py,sha256=squjro0oxwXOiavcf4bSHjHS94uSeCBGpykacoFpKx8,5729
113
- mirascope/core/base/_utils/_convert_messages_to_message_params.py,sha256=symOUsXkecoBKV8kB6bkubFW6pi34grUlTkJfnfpaYo,4360
113
+ mirascope/core/base/_utils/_convert_messages_to_message_params.py,sha256=9gys7ZPBAiuQH5hdi4_bL0KH32Q96fESyKDW5S0-9Js,4532
114
114
  mirascope/core/base/_utils/_convert_provider_finish_reason_to_finish_reason.py,sha256=Mki5mYbYX8vUW-oosC4PaRNUHW_T5xAQWti3_1ndtTk,611
115
115
  mirascope/core/base/_utils/_default_tool_docstring.py,sha256=JLyryjGDaHMU-P7gUpnjkPyELCQsQgi8AP4Dp_yXPOM,277
116
116
  mirascope/core/base/_utils/_extract_tool_return.py,sha256=ZDBZJ4cacFd8nijSWZEhib7B58ZnSFD_rK1FiGNTYU0,1553
@@ -145,19 +145,19 @@ mirascope/core/bedrock/_call.py,sha256=8Z8sdzpTdJsMHBev35B1KH3O16_eMLbtTkOmPB7bz
145
145
  mirascope/core/bedrock/_call_kwargs.py,sha256=N1d_iglnwZW3JrcaT8WTOeuLT5MYcVLU5vS8u8uyEL4,408
146
146
  mirascope/core/bedrock/_types.py,sha256=ntmzYsgT6wuigv1GavkdqCvJnAYRsFvVuIwxafE4DFY,3229
147
147
  mirascope/core/bedrock/call_params.py,sha256=3eKNYTteCTaPLqvAcy1vHU5aY9nMVNhmApL45ugPbrQ,1716
148
- mirascope/core/bedrock/call_response.py,sha256=86_AJOAsNORjADX7DV2pUiRuG8DWABOL07r804lOK4U,8413
148
+ mirascope/core/bedrock/call_response.py,sha256=V9YFYdPxW415t-yBq4Y5Jexn5hkewiePnWv9gghW9JA,8359
149
149
  mirascope/core/bedrock/call_response_chunk.py,sha256=EAs0mJseL-C4dlnEhggtUT8_s6L2d5lSAqrIjLxQepI,3524
150
150
  mirascope/core/bedrock/dynamic_config.py,sha256=X6v93X9g14mfvkGLL08yX-xTFGgX8y8bVngNmExdUhQ,1166
151
151
  mirascope/core/bedrock/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
152
152
  mirascope/core/bedrock/stream.py,sha256=UyA6b7l3-MjEULzo-DXF-le7N3oQw6W5FFk48_K93a0,5219
153
- mirascope/core/bedrock/tool.py,sha256=rE5rx-CyJTy5kFOtYwZh9kkr4eR_4uUxGqDQRS9OWSE,2657
153
+ mirascope/core/bedrock/tool.py,sha256=tgt__paZyzpN1_NdTVKh-2hIWHah2Ect8lAfM1GEl-s,2758
154
154
  mirascope/core/bedrock/_utils/__init__.py,sha256=OYpHXxPRbgasCLz_emLatmNa5WCb_S6pvVFHcNoGy9E,389
155
155
  mirascope/core/bedrock/_utils/_convert_common_call_params.py,sha256=i17yrW-_7qdIsf-zS3OD5HIO0uykCdfanPsjV3WxTEY,1091
156
156
  mirascope/core/bedrock/_utils/_convert_finish_reason_to_common_finish_reasons.py,sha256=A67-Q3zgpXh9q0iub5IfJw9VRgHvK-pczt1Btot_jks,792
157
157
  mirascope/core/bedrock/_utils/_convert_message_params.py,sha256=ZPFj34ed0-4bmMldj4tR6EGb9RsuHkXzSwjmwEeN-KU,4680
158
158
  mirascope/core/bedrock/_utils/_get_json_output.py,sha256=hW-IBBQ5YW85VljjFJHDDtu66zsaF2ydTbFxgCX_j6A,1159
159
159
  mirascope/core/bedrock/_utils/_handle_stream.py,sha256=s8KNMNDKzvSIkFROtaZgbEJry78X_qCzTvGmHcL7UW0,3776
160
- mirascope/core/bedrock/_utils/_message_param_converter.py,sha256=T45kksn78idbqD9NZ3Omx1nS_IoYmTfA5y-bAHlX2fM,6846
160
+ mirascope/core/bedrock/_utils/_message_param_converter.py,sha256=BCoFozjclkqAZq1InB1ar_IAVGMW9xclU1bK-oi2zI0,6765
161
161
  mirascope/core/bedrock/_utils/_setup_call.py,sha256=XQs-JlviE0uhbBxEpjXP8812NbiObLYx5VkAwJJAF84,9168
162
162
  mirascope/core/cohere/__init__.py,sha256=vk73WFGBOEmMFEiqWMRnPfxsCBDlDcq8SaLB2A6RKeo,830
163
163
  mirascope/core/cohere/_call.py,sha256=y0nB_7h7FWCNxHRPywtAVCYXyeYX3uzTyYBPWnuLwUE,2261
@@ -221,12 +221,12 @@ mirascope/core/google/tool.py,sha256=61a9Ejdxz41pwaab9VE2yvP_J1Aebua3BeRPJ_GJSnE
221
221
  mirascope/core/google/_utils/__init__.py,sha256=vL0hx6WKW5lqpUcFTFCFGvmwtR-pts0JzWgCXhaUVrI,388
222
222
  mirascope/core/google/_utils/_convert_common_call_params.py,sha256=TF7GWBHcpfzb7XmrxKp3gnaONITYF93lqr4XkSVz_uU,1195
223
223
  mirascope/core/google/_utils/_convert_finish_reason_to_common_finish_reasons.py,sha256=ig4tb7Zanz-tyZpvc9Ncd47a2FNTOS7-wl1PYBq-4cY,879
224
- mirascope/core/google/_utils/_convert_message_params.py,sha256=9I7Q79Z8tBCLZtfjWJNQkuKgz0n2L43SzHB3cV3hNmY,8926
224
+ mirascope/core/google/_utils/_convert_message_params.py,sha256=OZXdwhAP-33yIr1QfEBDirjh1QOUeLzL2IajfVXgcUM,12787
225
225
  mirascope/core/google/_utils/_get_json_output.py,sha256=sxDgT0Ra6YJynL5_hhakf0dNJEhZm0DfAgfcvC_DAFU,1596
226
226
  mirascope/core/google/_utils/_handle_stream.py,sha256=xTaQvAWnJ195YI_h68USvit4-G8T_fogmtBZFhu1qoE,2238
227
- mirascope/core/google/_utils/_message_param_converter.py,sha256=qOj8bAdQusFhLg-mzQ1TJwbMQHvjY7DYrTGOIylu5hs,6661
227
+ mirascope/core/google/_utils/_message_param_converter.py,sha256=8N3etkSjoyU0wxcGVw13A5EtI7iphBD4pHG87iUCkZg,8094
228
228
  mirascope/core/google/_utils/_setup_call.py,sha256=UoV4McGgSS79PKErjArCmrq1HmpFvq2qegJYoyY4P5U,6469
229
- mirascope/core/google/_utils/_validate_media_type.py,sha256=sUOjKpC498L-NCiECejAAfSzMUAvZT84rf-2Yo-JE58,1042
229
+ mirascope/core/google/_utils/_validate_media_type.py,sha256=qLSoUlv5l5AZJ_PAsGFZmHNNdJHiB3jbFuAR2Ckga6s,1746
230
230
  mirascope/core/groq/__init__.py,sha256=8jWCQScdei_TImGMWUwiKnlOwffQqaXdAL-bluFmEL0,798
231
231
  mirascope/core/groq/_call.py,sha256=gR8VN5IaYWIFXc0csn995q59FM0nBs-xVFjkVycPjMM,2223
232
232
  mirascope/core/groq/_call_kwargs.py,sha256=trT8AdQ-jdQPYKlGngIMRwwQuvKuvAbvI1yyozftOuI,425
@@ -339,7 +339,7 @@ mirascope/llm/_context.py,sha256=vtHJkLlFfUwyR_hYEHXAw3xunpHhLn67k4kuFw50GR8,124
339
339
  mirascope/llm/_override.py,sha256=m4MdOhM-aJRIGP7NBJhscq3ISNct6FBPn3jjmryFo_Q,112292
340
340
  mirascope/llm/_protocols.py,sha256=HXspRAC0PduGqbh2BM0CGe5iVj7CC3ZKMPAYvFvbDNQ,16406
341
341
  mirascope/llm/_response_metaclass.py,sha256=6DLQb5IrqMldyEXHT_pAsr2DlUVc9CmZuZiBXG37WK8,851
342
- mirascope/llm/call_response.py,sha256=cOOyONfkcBluk1m2FNliVcdGtiNnSZpz71nMyxsZko8,5232
342
+ mirascope/llm/call_response.py,sha256=tJ6jHZ4PFaYf_4Hn9OihlVqOxNEM9d6gAi4Bo15XXnQ,4825
343
343
  mirascope/llm/call_response_chunk.py,sha256=bZwO43ipc6PO1VLgGSaAPRqCIUyZD_Ty5oxdJX62yno,1966
344
344
  mirascope/llm/stream.py,sha256=GtUKyLBlKqqZTOKjdL9FLInCXJ0ZOEAe6nymbjKwyTQ,5293
345
345
  mirascope/llm/tool.py,sha256=MQRJBPhP1d-OyOz3PE_VsKmSXca0chySyYO1U9OW8ck,1824
@@ -371,7 +371,7 @@ mirascope/v0/base/ops_utils.py,sha256=1Qq-VIwgHBaYutiZsS2MUQ4OgPC3APyywI5bTiTAmA
371
371
  mirascope/v0/base/prompts.py,sha256=FM2Yz98cSnDceYogiwPrp4BALf3_F3d4fIOCGAkd-SE,1298
372
372
  mirascope/v0/base/types.py,sha256=ZfatJoX0Yl0e3jhv0D_MhiSVHLYUeJsdN3um3iE10zY,352
373
373
  mirascope/v0/base/utils.py,sha256=XREPENRQTu8gpMhHU8RC8qH_am3FfGUvY-dJ6x8i-mw,681
374
- mirascope-1.23.4.dist-info/METADATA,sha256=ULBZnd8FOiYYaxJ4YXoD-eHaWMNhnm_1df5hHFwXha0,8536
375
- mirascope-1.23.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
376
- mirascope-1.23.4.dist-info/licenses/LICENSE,sha256=LAs5Q8mdawTsVdONpDGukwsoc4KEUBmmonDEL39b23Y,1072
377
- mirascope-1.23.4.dist-info/RECORD,,
374
+ mirascope-1.24.1.dist-info/METADATA,sha256=CF6YrOzpQRtxq7M0Pz_cl5d3m2dyjy2rO08z64sEzN8,8542
375
+ mirascope-1.24.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
376
+ mirascope-1.24.1.dist-info/licenses/LICENSE,sha256=LAs5Q8mdawTsVdONpDGukwsoc4KEUBmmonDEL39b23Y,1072
377
+ mirascope-1.24.1.dist-info/RECORD,,