chatlas 0.6.1__py3-none-any.whl → 0.7.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.

Potentially problematic release.


This version of chatlas might be problematic. Click here for more details.

chatlas/_openai.py CHANGED
@@ -1,9 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import base64
4
- import json
5
4
  from typing import TYPE_CHECKING, Any, Literal, Optional, cast, overload
6
5
 
6
+ import orjson
7
7
  from pydantic import BaseModel
8
8
 
9
9
  from ._chat import Chat
@@ -78,12 +78,6 @@ def ChatOpenAI(
78
78
  account that will give you an API key that you can use with this package.
79
79
  :::
80
80
 
81
- ::: {.callout-note}
82
- ## Python requirements
83
-
84
- `ChatOpenAI` requires the `openai` package: `pip install "chatlas[openai]"`.
85
- :::
86
-
87
81
  Examples
88
82
  --------
89
83
  ```python
@@ -194,13 +188,7 @@ class OpenAIProvider(Provider[ChatCompletion, ChatCompletionChunk, ChatCompletio
194
188
  seed: Optional[int] = None,
195
189
  kwargs: Optional["ChatClientArgs"] = None,
196
190
  ):
197
- try:
198
- from openai import AsyncOpenAI, OpenAI
199
- except ImportError:
200
- raise ImportError(
201
- "`ChatOpenAI()` requires the `openai` package. "
202
- "Install it with `pip install openai`."
203
- )
191
+ from openai import AsyncOpenAI, OpenAI
204
192
 
205
193
  self._model = model
206
194
  self._seed = seed
@@ -325,7 +313,8 @@ class OpenAIProvider(Provider[ChatCompletion, ChatCompletionChunk, ChatCompletio
325
313
  del kwargs_full["tools"]
326
314
 
327
315
  if stream and "stream_options" not in kwargs_full:
328
- kwargs_full["stream_options"] = {"include_usage": True}
316
+ if self.__class__.__name__ != "DatabricksProvider":
317
+ kwargs_full["stream_options"] = {"include_usage": True}
329
318
 
330
319
  return kwargs_full
331
320
 
@@ -432,7 +421,9 @@ class OpenAIProvider(Provider[ChatCompletion, ChatCompletionChunk, ChatCompletio
432
421
  "id": x.id,
433
422
  "function": {
434
423
  "name": x.name,
435
- "arguments": json.dumps(x.arguments),
424
+ "arguments": orjson.dumps(x.arguments).decode(
425
+ "utf-8"
426
+ ),
436
427
  },
437
428
  "type": "function",
438
429
  }
@@ -498,8 +489,8 @@ class OpenAIProvider(Provider[ChatCompletion, ChatCompletionChunk, ChatCompletio
498
489
  elif isinstance(x, ContentToolResult):
499
490
  tool_results.append(
500
491
  ChatCompletionToolMessageParam(
501
- # TODO: a tool could return an image!?!
502
- content=x.get_final_value(),
492
+ # Currently, OpenAI only allows for text content in tool results
493
+ content=cast(str, x.get_model_value()),
503
494
  tool_call_id=x.id,
504
495
  role="tool",
505
496
  )
@@ -528,7 +519,7 @@ class OpenAIProvider(Provider[ChatCompletion, ChatCompletionChunk, ChatCompletio
528
519
  contents: list[Content] = []
529
520
  if message.content is not None:
530
521
  if has_data_model:
531
- data = json.loads(message.content)
522
+ data = orjson.loads(message.content)
532
523
  contents = [ContentJson(value=data)]
533
524
  else:
534
525
  contents = [ContentText(text=message.content)]
@@ -543,8 +534,8 @@ class OpenAIProvider(Provider[ChatCompletion, ChatCompletionChunk, ChatCompletio
543
534
 
544
535
  args = {}
545
536
  try:
546
- args = json.loads(func.arguments) if func.arguments else {}
547
- except json.JSONDecodeError:
537
+ args = orjson.loads(func.arguments) if func.arguments else {}
538
+ except orjson.JSONDecodeError:
548
539
  raise ValueError(
549
540
  f"The model's completion included a tool request ({func.name}) "
550
541
  "with invalid JSON for input arguments: '{func.arguments}'"
@@ -601,16 +592,6 @@ def ChatAzureOpenAI(
601
592
  hosts a number of open source models as well as proprietary models
602
593
  from OpenAI.
603
594
 
604
- Prerequisites
605
- -------------
606
-
607
- ::: {.callout-note}
608
- ## Python requirements
609
-
610
- `ChatAzureOpenAI` requires the `openai` package:
611
- `pip install "chatlas[azure-openai]"`.
612
- :::
613
-
614
595
  Examples
615
596
  --------
616
597
  ```python
@@ -692,13 +673,7 @@ class OpenAIAzureProvider(OpenAIProvider):
692
673
  seed: int | None = None,
693
674
  kwargs: Optional["ChatAzureClientArgs"] = None,
694
675
  ):
695
- try:
696
- from openai import AsyncAzureOpenAI, AzureOpenAI
697
- except ImportError:
698
- raise ImportError(
699
- "`ChatAzureOpenAI()` requires the `openai` package. "
700
- "Install it with `pip install openai`."
701
- )
676
+ from openai import AsyncAzureOpenAI, AzureOpenAI
702
677
 
703
678
  self._model = deployment_id
704
679
  self._seed = seed
chatlas/_perplexity.py CHANGED
@@ -40,12 +40,6 @@ def ChatPerplexity(
40
40
  Sign up at <https://www.perplexity.ai> to get an API key.
41
41
  :::
42
42
 
43
- ::: {.callout-note}
44
- ## Python requirements
45
-
46
- `ChatPerplexity` requires the `openai` package: `pip install "chatlas[perplexity]"`.
47
- :::
48
-
49
43
 
50
44
  Examples
51
45
  --------
chatlas/_snowflake.py CHANGED
@@ -1,14 +1,16 @@
1
- from typing import TYPE_CHECKING, Literal, Optional, TypedDict, overload
1
+ import asyncio
2
+ import json
3
+ from typing import TYPE_CHECKING, Iterable, Literal, Optional, TypedDict, cast, overload
2
4
 
3
5
  from pydantic import BaseModel
4
6
 
5
7
  from ._chat import Chat
6
- from ._content import Content
8
+ from ._content import Content, ContentJson, ContentText
7
9
  from ._logging import log_model_default
8
10
  from ._provider import Provider
9
- from ._tools import Tool
11
+ from ._tools import Tool, basemodel_to_param_schema
10
12
  from ._turn import Turn, normalize_turns
11
- from ._utils import drop_none
13
+ from ._utils import drop_none, wrap_async_iterable
12
14
 
13
15
  if TYPE_CHECKING:
14
16
  from snowflake.snowpark import Column
@@ -237,9 +239,18 @@ class SnowflakeProvider(Provider["Completion", "CompletionChunk", "CompletionChu
237
239
  data_model: Optional[type[BaseModel]] = None,
238
240
  kwargs: Optional["SubmitInputArgs"] = None,
239
241
  ):
240
- raise NotImplementedError(
241
- "Snowflake does not currently support async completions."
242
- )
242
+ from snowflake.cortex import complete
243
+
244
+ kwargs = self._chat_perform_args(stream, turns, tools, data_model, kwargs)
245
+
246
+ # Prevent the main thread from being blocked (Snowflake doesn't have native async support)
247
+ res = await asyncio.to_thread(complete, **kwargs)
248
+
249
+ # When streaming, res is an iterable of strings, but Chat() wants an async iterable
250
+ if stream:
251
+ res = wrap_async_iterable(cast(Iterable[str], res))
252
+
253
+ return res
243
254
 
244
255
  def _chat_perform_args(
245
256
  self,
@@ -249,27 +260,31 @@ class SnowflakeProvider(Provider["Completion", "CompletionChunk", "CompletionChu
249
260
  data_model: Optional[type[BaseModel]] = None,
250
261
  kwargs: Optional["SubmitInputArgs"] = None,
251
262
  ):
252
- # Cortex doesn't seem to support tools
253
- if tools:
254
- raise ValueError("Snowflake does not currently support tools.")
255
-
256
- # TODO: implement data_model when this PR makes it into snowflake-ml-python
257
- # https://github.com/snowflakedb/snowflake-ml-python/pull/141
258
- # https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-llm-rest-api#structured-output-example
259
- if data_model:
260
- raise NotImplementedError(
261
- "The snowflake-ml-python package currently doesn't support structured output. "
262
- "Upvote this PR to help prioritize it: "
263
- "https://github.com/snowflakedb/snowflake-ml-python/pull/141"
264
- )
265
-
266
263
  kwargs_full: "SubmitInputArgs" = {
267
264
  "stream": stream,
268
265
  "prompt": self._as_prompt_input(turns),
269
266
  "model": self._model,
267
+ "session": self._session,
270
268
  **(kwargs or {}),
271
269
  }
272
270
 
271
+ # TODO: get tools working
272
+ if tools:
273
+ raise ValueError("Snowflake does not currently support tools.")
274
+
275
+ if data_model is not None:
276
+ params = basemodel_to_param_schema(data_model)
277
+ opts = kwargs_full.get("options") or {}
278
+ opts["response_format"] = {
279
+ "type": "json",
280
+ "schema": {
281
+ "type": "object",
282
+ "properties": params["properties"],
283
+ "required": params["required"],
284
+ },
285
+ }
286
+ kwargs_full["options"] = opts
287
+
273
288
  return kwargs_full
274
289
 
275
290
  def stream_text(self, chunk):
@@ -312,10 +327,18 @@ class SnowflakeProvider(Provider["Completion", "CompletionChunk", "CompletionChu
312
327
  res.append(
313
328
  {
314
329
  "role": turn.role,
315
- "content": turn.text,
330
+ "content": str(turn),
316
331
  }
317
332
  )
318
333
  return res
319
334
 
320
335
  def _as_turn(self, completion, has_data_model) -> Turn:
321
- return Turn("assistant", completion)
336
+ completion = cast(str, completion)
337
+
338
+ if has_data_model:
339
+ data = json.loads(completion)
340
+ contents = [ContentJson(value=data)]
341
+ else:
342
+ contents = [ContentText(text=completion)]
343
+
344
+ return Turn("assistant", contents)
chatlas/_utils.py CHANGED
@@ -1,10 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import asyncio
3
4
  import functools
4
5
  import inspect
5
6
  import os
6
7
  import re
7
- from typing import Awaitable, Callable, TypeVar, cast
8
+ from typing import Any, AsyncIterable, Awaitable, Callable, Iterable, TypeVar, cast
8
9
 
9
10
  from ._typing_extensions import ParamSpec, TypeGuard
10
11
 
@@ -61,6 +62,40 @@ def is_async_callable(
61
62
  return False
62
63
 
63
64
 
65
+ def wrap_async_iterable(x: Iterable[Any] | AsyncIterable[Any]) -> AsyncIterable[Any]:
66
+ """
67
+ Given any iterable, return an async iterable. The async iterable will yield the
68
+ values of the original iterable, but will also yield control to the event loop
69
+ after each value. This is useful when you want to interleave processing with other
70
+ tasks, or when you want to simulate an async iterable from a regular iterable.
71
+ """
72
+
73
+ if isinstance(x, AsyncIterable):
74
+ return x
75
+
76
+ if not isinstance(x, Iterable):
77
+ raise TypeError("wrap_async_iterable requires an Iterable object.")
78
+
79
+ return MakeIterableAsync(x)
80
+
81
+
82
+ class MakeIterableAsync:
83
+ def __init__(self, iterable: Iterable[Any]):
84
+ self.iterable = iterable
85
+
86
+ def __aiter__(self):
87
+ self.iterator = iter(self.iterable)
88
+ return self
89
+
90
+ async def __anext__(self):
91
+ try:
92
+ value = next(self.iterator)
93
+ await asyncio.sleep(0) # Yield control to the event loop
94
+ return value
95
+ except StopIteration:
96
+ raise StopAsyncIteration
97
+
98
+
64
99
  T = TypeVar("T")
65
100
 
66
101
 
chatlas/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.6.1'
21
- __version_tuple__ = version_tuple = (0, 6, 1)
20
+ __version__ = version = '0.7.1'
21
+ __version_tuple__ = version_tuple = (0, 7, 1)
@@ -17,6 +17,7 @@ import anthropic.types.tool_choice_none_param
17
17
  import anthropic.types.tool_choice_tool_param
18
18
  import anthropic.types.tool_param
19
19
  import anthropic.types.tool_text_editor_20250124_param
20
+ import anthropic.types.web_search_tool_20250305_param
20
21
 
21
22
 
22
23
  class SubmitInputArgs(TypedDict, total=False):
@@ -66,6 +67,7 @@ class SubmitInputArgs(TypedDict, total=False):
66
67
  anthropic.types.tool_param.ToolParam,
67
68
  anthropic.types.tool_bash_20250124_param.ToolBash20250124Param,
68
69
  anthropic.types.tool_text_editor_20250124_param.ToolTextEditor20250124Param,
70
+ anthropic.types.web_search_tool_20250305_param.WebSearchTool20250305Param,
69
71
  ]
70
72
  ],
71
73
  anthropic.NotGiven,
@@ -38,6 +38,16 @@ class SubmitInputArgs(TypedDict, total=False):
38
38
  model: Union[
39
39
  str,
40
40
  Literal[
41
+ "gpt-4.1",
42
+ "gpt-4.1-mini",
43
+ "gpt-4.1-nano",
44
+ "gpt-4.1-2025-04-14",
45
+ "gpt-4.1-mini-2025-04-14",
46
+ "gpt-4.1-nano-2025-04-14",
47
+ "o4-mini",
48
+ "o4-mini-2025-04-16",
49
+ "o3",
50
+ "o3-2025-04-16",
41
51
  "o3-mini",
42
52
  "o3-mini-2025-01-31",
43
53
  "o1",
@@ -119,7 +129,7 @@ class SubmitInputArgs(TypedDict, total=False):
119
129
  openai.NotGiven,
120
130
  ]
121
131
  seed: Union[int, None, openai.NotGiven]
122
- service_tier: Union[Literal["auto", "default"], None, openai.NotGiven]
132
+ service_tier: Union[Literal["auto", "default", "flex"], None, openai.NotGiven]
123
133
  stop: Union[str, None, list[str], openai.NotGiven]
124
134
  store: Union[bool, None, openai.NotGiven]
125
135
  stream: Union[Literal[False], None, Literal[True], openai.NotGiven]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chatlas
3
- Version: 0.6.1
3
+ Version: 0.7.1
4
4
  Summary: A simple and consistent interface for chatting with LLMs
5
5
  Project-URL: Homepage, https://posit-dev.github.io/chatlas
6
6
  Project-URL: Documentation, https://posit-dev.github.io/chatlas
@@ -8,6 +8,8 @@ Project-URL: Repository, https://github.com/posit-dev/chatlas
8
8
  Project-URL: Issues, https://github.com/posit-dev/chatlas/issues/
9
9
  Project-URL: Changelog, https://github.com/posit-dev/chatlas/blob/main/CHANGELOG.md
10
10
  Author-email: Carson Sievert <carson@posit.co>
11
+ License-Expression: MIT
12
+ License-File: LICENSE
11
13
  Classifier: Development Status :: 4 - Beta
12
14
  Classifier: Intended Audience :: Developers
13
15
  Classifier: License :: OSI Approved :: MIT License
@@ -18,18 +20,23 @@ Classifier: Programming Language :: Python :: 3.12
18
20
  Classifier: Programming Language :: Python :: 3.13
19
21
  Requires-Python: >=3.9
20
22
  Requires-Dist: jinja2
23
+ Requires-Dist: openai
24
+ Requires-Dist: orjson
21
25
  Requires-Dist: pydantic>=2.0
22
26
  Requires-Dist: requests
23
27
  Requires-Dist: rich
24
28
  Provides-Extra: anthropic
25
29
  Requires-Dist: anthropic; extra == 'anthropic'
26
30
  Provides-Extra: azure-openai
27
- Requires-Dist: openai; extra == 'azure-openai'
28
31
  Provides-Extra: bedrock-anthropic
29
32
  Requires-Dist: anthropic[bedrock]; extra == 'bedrock-anthropic'
33
+ Provides-Extra: databricks
34
+ Requires-Dist: databricks-sdk; extra == 'databricks'
30
35
  Provides-Extra: dev
31
36
  Requires-Dist: anthropic[bedrock]; extra == 'dev'
32
- Requires-Dist: google-genai>=1.2.0; extra == 'dev'
37
+ Requires-Dist: databricks-sdk; extra == 'dev'
38
+ Requires-Dist: google-genai>=1.14.0; extra == 'dev'
39
+ Requires-Dist: htmltools; extra == 'dev'
33
40
  Requires-Dist: matplotlib; extra == 'dev'
34
41
  Requires-Dist: numpy>1.24.4; extra == 'dev'
35
42
  Requires-Dist: openai; extra == 'dev'
@@ -38,6 +45,7 @@ Requires-Dist: python-dotenv; extra == 'dev'
38
45
  Requires-Dist: ruff>=0.6.5; extra == 'dev'
39
46
  Requires-Dist: shiny; extra == 'dev'
40
47
  Requires-Dist: snowflake-ml-python; extra == 'dev'
48
+ Requires-Dist: tenacity; extra == 'dev'
41
49
  Requires-Dist: tiktoken; extra == 'dev'
42
50
  Requires-Dist: torch; (python_version <= '3.11') and extra == 'dev'
43
51
  Provides-Extra: docs
@@ -52,17 +60,12 @@ Requires-Dist: pyyaml; extra == 'docs'
52
60
  Requires-Dist: quartodoc>=0.7; extra == 'docs'
53
61
  Requires-Dist: sentence-transformers; extra == 'docs'
54
62
  Provides-Extra: github
55
- Requires-Dist: openai; extra == 'github'
56
63
  Provides-Extra: google
57
- Requires-Dist: google-genai; extra == 'google'
64
+ Requires-Dist: google-genai>=1.14.0; extra == 'google'
58
65
  Provides-Extra: groq
59
- Requires-Dist: openai; extra == 'groq'
60
66
  Provides-Extra: ollama
61
- Requires-Dist: openai; extra == 'ollama'
62
67
  Provides-Extra: openai
63
- Requires-Dist: openai; extra == 'openai'
64
68
  Provides-Extra: perplexity
65
- Requires-Dist: openai; extra == 'perplexity'
66
69
  Provides-Extra: snowflake
67
70
  Requires-Dist: snowflake-ml-python; extra == 'snowflake'
68
71
  Provides-Extra: test
@@ -71,7 +74,7 @@ Requires-Dist: pytest-asyncio; extra == 'test'
71
74
  Requires-Dist: pytest>=8.3.2; extra == 'test'
72
75
  Requires-Dist: syrupy>=4; extra == 'test'
73
76
  Provides-Extra: vertex
74
- Requires-Dist: google-genai; extra == 'vertex'
77
+ Requires-Dist: google-genai>=1.14.0; extra == 'vertex'
75
78
  Description-Content-Type: text/markdown
76
79
 
77
80
  <h1 class="unnumbered unlisted"> chatlas <a href="https://posit-dev.github.io/chatlas"><img src="docs/images/logo.png" align="right" height="138" alt="chatlas website" /></a> </h1>
@@ -123,6 +126,7 @@ It also supports the following enterprise cloud providers:
123
126
 
124
127
  * AWS Bedrock: [`ChatBedrockAnthropic()`](https://posit-dev.github.io/chatlas/reference/ChatBedrockAnthropic.html).
125
128
  * Azure OpenAI: [`ChatAzureOpenAI()`](https://posit-dev.github.io/chatlas/reference/ChatAzureOpenAI.html).
129
+ * Databricks: [`ChatDatabricks()`](https://posit-dev.github.io/chatlas/reference/ChatDatabricks.html).
126
130
  * Snowflake Cortex: [`ChatSnowflake()`](https://posit-dev.github.io/chatlas/reference/ChatSnowflake.html).
127
131
  * Vertex AI: [`ChatVertex()`](https://posit-dev.github.io/chatlas/reference/ChatVertex.html).
128
132
 
@@ -1,45 +1,47 @@
1
- chatlas/__init__.py,sha256=IVHVEEN6pspb-5WqWfBLc9wOQH-1R8vmi1Eeh-OSVFY,1358
2
- chatlas/_anthropic.py,sha256=IvTC1xJYeKi7Liz_Czt1wmkG_Tx12e2ME663xZTNpdI,24745
3
- chatlas/_auto.py,sha256=4tpwla09la4VA2PAh3phAMWs2Amgtp_4Qsjx6K02ib0,6032
4
- chatlas/_chat.py,sha256=czfSjsEbRX5bHLclF1IbYtfHlyZrAOH0xcP-1hzcNNk,46032
5
- chatlas/_content.py,sha256=yXB1IukyMfK9-Zc8ISm4h1p09O4i79YEJandzyT4UtM,8726
1
+ chatlas/__init__.py,sha256=5bHHZOdSM84VUD1WlUYH7vYxGiHygYEoRsQzGHHDXXk,1531
2
+ chatlas/_anthropic.py,sha256=VAtzRcrWPVe38wBBtDapxURISF2qn2yd6wg_8VY94Lk,24994
3
+ chatlas/_auto.py,sha256=HsAvVwpSOkI9fdC35YX8beaE2IBnWLWTzOzu0ny951o,6129
4
+ chatlas/_chat.py,sha256=wTkXu_AmL2frIHy-JZveuY44BigkrG21_06beyD3pIw,52691
5
+ chatlas/_content.py,sha256=VW1iKOWlzeoOjTg_TNQTj1zlmdWbDXqTjBy3fxddhdc,15767
6
6
  chatlas/_content_image.py,sha256=EUK6wAint-JatLsiwvaPDu4D3W-NcIsDCkzABkXgfDg,8304
7
7
  chatlas/_content_pdf.py,sha256=cffeuJxzhUDukQ-Srkmpy62M8X12skYpU_FVq-Wvya4,2420
8
- chatlas/_display.py,sha256=eqdRIwQenyJxswmTEjnJ1n9YxxSxsa8vHVmA79449_o,4439
9
- chatlas/_github.py,sha256=8_vvUIBCprgrQ5UItky5yETfEQPG2fCMM57ga77p28E,4377
10
- chatlas/_google.py,sha256=lXqqLwXlqFoKh0GWx-OSgJ1pge0Dv7FH8Sg-MkcXpJs,19138
11
- chatlas/_groq.py,sha256=iuFvxeXkq81sDHxVV9zbVHjf2ZuNT94P-XkuXvqtGms,4160
8
+ chatlas/_databricks.py,sha256=h_RXsOzCp4k1h0byOkCVFOaNCnlapVP92tHs2yMbd6s,4692
9
+ chatlas/_display.py,sha256=wyQzSc6z1VqrJfkTLkw1wQcti9s1Pr4qT8UxFJESn4U,4664
10
+ chatlas/_github.py,sha256=xdGsvWvlbGMc1lgEM_oRL5p-wuxaZG-lu6a_4zxV-4Y,4235
11
+ chatlas/_google.py,sha256=pwnomFcDEzPXQQfFifoH2FrbDvOgRIIyjcNoJ8Hvv-I,19397
12
+ chatlas/_groq.py,sha256=0ou8iiAeI8EqjNKsLZhljQffSVOj8eCQEtW7-stZToY,4022
12
13
  chatlas/_interpolate.py,sha256=ykwLP3x-ya9Q33U4knSU75dtk6pzJAeythEEIW-43Pc,3631
13
14
  chatlas/_live_render.py,sha256=UMZltE35LxziDKPMEeDwQ9meZ95SeqwhJi7j-y9pcro,4004
14
15
  chatlas/_logging.py,sha256=7a20sAl1PkW1qBNrfd_ieUbQXV8Gf4Vuf0Wn62LNBmk,2290
15
16
  chatlas/_merge.py,sha256=SGj_BetgA7gaOqSBKOhYmW3CYeQKTEehFrXvx3y4OYE,3924
16
- chatlas/_ollama.py,sha256=EgTwmphVwBV7xCIqmPC_cNlr4Uo9N5Xy4eDCb1sJoPI,3764
17
- chatlas/_openai.py,sha256=xnJPzZzVuRoH7al7Tq01J7SIgF7bZm3UwcO2noDENk4,24523
18
- chatlas/_perplexity.py,sha256=j-jfOIYefZC5XzGjmya9GCCGQN003cRmiAv6vmo0rTQ,4454
17
+ chatlas/_ollama.py,sha256=_5Na11A7Hrs83CK8x542UHDvpLjQPyTJ9WM03eFDqKA,3627
18
+ chatlas/_openai.py,sha256=qkU2DWOTsEVfjiAk4LDRszErVGLswiLwwim1zZnHn8o,23968
19
+ chatlas/_perplexity.py,sha256=POp_Lc8RlSEsHIHhFlHOE8IVsOb2nf7mHQZvyQp49_U,4304
19
20
  chatlas/_provider.py,sha256=YmdBbz_u5aP_kBxl6s26OPiSnWG_vZ_fvf9L2qvBmyI,3809
20
- chatlas/_snowflake.py,sha256=WUNdT3irxgLVqoc1TAeDmxnYsjBWiBw-CoH-dY4mFps,10944
21
+ chatlas/_snowflake.py,sha256=xlDdaM-YCmz3Y8KU6jxdCICuS-H4XLpQBHjqnaiEqKk,11576
21
22
  chatlas/_tokens.py,sha256=3W3EPUp9eWXUiwuzJwEPBv43AUznbK46pm59Htti7z4,2392
22
23
  chatlas/_tokens_old.py,sha256=L9d9oafrXvEx2u4nIn_Jjn7adnQyLBnYBuPwJUE8Pl8,5005
23
24
  chatlas/_tools.py,sha256=-qt4U1AFkebQoX9kpsBy5QXK8a2PpHX6Amgm44gcQ68,4113
24
25
  chatlas/_turn.py,sha256=7pve6YmD-L4c7Oxd6_ZAPkDudJ8AMpa6pP-pSroA1dM,5067
25
26
  chatlas/_typing_extensions.py,sha256=YdzmlyPSBpIEcsOkoz12e6jETT1XEMV2Q72haE4cfwY,1036
26
- chatlas/_utils.py,sha256=2TPy5_8dr9QDF1YShZN-CjxRVHeArSujRiaF0SKnI4o,2895
27
- chatlas/_version.py,sha256=a3_WODLDfpmAw3pMw7qGqmRuXHTCC3STyQd2R1iEOgA,511
27
+ chatlas/_utils.py,sha256=lli8ChbPUwEPebW8AoOoNoqiA95SVtoW2gb6ymj9gw4,4028
28
+ chatlas/_version.py,sha256=UENolcbPfd6sim2GUd3djX88atGsPXEKCbPHv1Wucs4,511
28
29
  chatlas/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
30
  chatlas/types/__init__.py,sha256=P_EDL4eqsigKwB-u2qRmKlYQS5Y65m7oWjGC3cYmxO4,719
30
31
  chatlas/types/anthropic/__init__.py,sha256=OwubA-DPHYpYo0XyRyAFwftOI0mOxtHzAyhUSLcDx54,417
31
32
  chatlas/types/anthropic/_client.py,sha256=G0LRhoFBcsSOMr5qhP-0rAScsVXaVlHCpggfVp54bnQ,690
32
33
  chatlas/types/anthropic/_client_bedrock.py,sha256=mNazQlu0pQt8JdzrYn3LKNgE4n732GjhQUJdQQK9QkY,785
33
- chatlas/types/anthropic/_submit.py,sha256=xoQyZ3SUUttWDPAjZTPfFch7D1bIU0AJNsenViYhAKs,2974
34
+ chatlas/types/anthropic/_submit.py,sha256=v_WJp8tK6HN86JiAEI_wCozCuLEduJpGEqVxXzvaYWw,3119
34
35
  chatlas/types/google/__init__.py,sha256=ZJhi8Kwvio2zp8T1TQqmvdHqkS-Khb6BGESPjREADgo,337
35
36
  chatlas/types/google/_client.py,sha256=t7aKbxYq_xOA1Z3RnWcjewifdQFSHi7vKEj6MyKMCJk,729
36
37
  chatlas/types/google/_submit.py,sha256=b-ZqMvI551Ia7pFlWdqUQJjov3neHmVwLFw-P2bgU8w,1883
37
38
  chatlas/types/openai/__init__.py,sha256=Q2RAr1bSH1nHsxICK05nAmKmxdhKmhbBkWD_XHiVSrI,411
38
39
  chatlas/types/openai/_client.py,sha256=YGm_EHtRSSHeeOZe-CV7oNvMJpEblEta3UTuU7lSRO8,754
39
40
  chatlas/types/openai/_client_azure.py,sha256=jx8D_p46CLDGzTP-k-TtGzj-f3junj6or-86m8DD_0w,858
40
- chatlas/types/openai/_submit.py,sha256=mflYHZ5Q3dWBR2PdVEq6lhC9qNrQGNvyMiORglYLByE,6271
41
+ chatlas/types/openai/_submit.py,sha256=R0PUgXmhywLzRT_C3DYCsfbHCB1mD7cMY3zd8q7E-PU,6574
41
42
  chatlas/types/snowflake/__init__.py,sha256=NVKw_gLVnSlMNdE6BpikrQw8GV8LvIn5SR8eI8Afgbs,273
42
43
  chatlas/types/snowflake/_submit.py,sha256=Fgcb2Z4mXYwAR2b7Kn3SdEYFlO4gJiUvkDJ3lDoN0IY,799
43
- chatlas-0.6.1.dist-info/METADATA,sha256=9mB4Dz3d0zCabRMuZX6E-MG8RnT4M14dhncult9gMAQ,15085
44
- chatlas-0.6.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
45
- chatlas-0.6.1.dist-info/RECORD,,
44
+ chatlas-0.7.1.dist-info/METADATA,sha256=BwSHMmxOYk0Pw9ykiBkwkeLAkKL3dg85QaalPd3byFU,15248
45
+ chatlas-0.7.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
46
+ chatlas-0.7.1.dist-info/licenses/LICENSE,sha256=zyuGzPOC7CcbOaBHsQ3UEyKYRO56KDUkor0OA4LqqDg,1081
47
+ chatlas-0.7.1.dist-info/RECORD,,
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022-2025 Posit Software, PBC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.