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/__init__.py +5 -0
- chatlas/_anthropic.py +12 -6
- chatlas/_auto.py +7 -3
- chatlas/_chat.py +339 -120
- chatlas/_content.py +230 -32
- chatlas/_databricks.py +139 -0
- chatlas/_display.py +13 -7
- chatlas/_github.py +0 -6
- chatlas/_google.py +11 -6
- chatlas/_groq.py +0 -6
- chatlas/_ollama.py +3 -8
- chatlas/_openai.py +13 -38
- chatlas/_perplexity.py +0 -6
- chatlas/_snowflake.py +46 -23
- chatlas/_utils.py +36 -1
- chatlas/_version.py +2 -2
- chatlas/types/anthropic/_submit.py +2 -0
- chatlas/types/openai/_submit.py +11 -1
- {chatlas-0.6.1.dist-info → chatlas-0.7.1.dist-info}/METADATA +14 -10
- {chatlas-0.6.1.dist-info → chatlas-0.7.1.dist-info}/RECORD +22 -20
- chatlas-0.7.1.dist-info/licenses/LICENSE +21 -0
- {chatlas-0.6.1.dist-info → chatlas-0.7.1.dist-info}/WHEEL +0 -0
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
|
-
|
|
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
|
-
|
|
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":
|
|
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
|
-
#
|
|
502
|
-
content=x.
|
|
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 =
|
|
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 =
|
|
547
|
-
except
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
241
|
-
|
|
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
|
|
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
|
-
|
|
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,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,
|
chatlas/types/openai/_submit.py
CHANGED
|
@@ -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.
|
|
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:
|
|
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=
|
|
2
|
-
chatlas/_anthropic.py,sha256=
|
|
3
|
-
chatlas/_auto.py,sha256=
|
|
4
|
-
chatlas/_chat.py,sha256=
|
|
5
|
-
chatlas/_content.py,sha256=
|
|
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/
|
|
9
|
-
chatlas/
|
|
10
|
-
chatlas/
|
|
11
|
-
chatlas/
|
|
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=
|
|
17
|
-
chatlas/_openai.py,sha256=
|
|
18
|
-
chatlas/_perplexity.py,sha256=
|
|
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=
|
|
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=
|
|
27
|
-
chatlas/_version.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
44
|
-
chatlas-0.
|
|
45
|
-
chatlas-0.
|
|
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.
|
|
File without changes
|