aidial-client 0.11.0.dev3__tar.gz → 0.11.0.dev6__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 (69) hide show
  1. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/PKG-INFO +49 -2
  2. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/README.md +48 -1
  3. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_client.py +29 -0
  4. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_client_pool.py +30 -0
  5. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/file.py +8 -0
  6. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/pyproject.toml +1 -1
  7. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/LICENSE +0 -0
  8. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/__init__.py +0 -0
  9. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_auth.py +0 -0
  10. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_compatibility/__init__.py +0 -0
  11. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_compatibility/openai.py +0 -0
  12. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_compatibility/pydantic.py +0 -0
  13. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_compatibility/pydantic_v1.py +0 -0
  14. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_constants.py +0 -0
  15. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_exception.py +0 -0
  16. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_http_client/__init__.py +0 -0
  17. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_http_client/_async.py +0 -0
  18. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_http_client/_base.py +0 -0
  19. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_http_client/_sse.py +0 -0
  20. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_http_client/_sync.py +0 -0
  21. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_internal_types/__init__.py +0 -0
  22. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_internal_types/_defaults.py +0 -0
  23. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_internal_types/_generic.py +0 -0
  24. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_internal_types/_http_request.py +0 -0
  25. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_internal_types/_json_rpc.py +0 -0
  26. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_internal_types/_model.py +0 -0
  27. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_log.py +0 -0
  28. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_utils/__init__.py +0 -0
  29. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_utils/_alias.py +0 -0
  30. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_utils/_dict.py +0 -0
  31. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_utils/_openai.py +0 -0
  32. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_utils/_response_processing.py +0 -0
  33. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/_utils/_type_guard.py +0 -0
  34. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/helpers/__init__.py +0 -0
  35. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/helpers/_url.py +0 -0
  36. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/helpers/storage_resource.py +0 -0
  37. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/py.typed +0 -0
  38. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/__init__.py +0 -0
  39. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/application.py +0 -0
  40. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/base.py +0 -0
  41. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/bucket.py +0 -0
  42. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/chat/__init__.py +0 -0
  43. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/chat/completions.py +0 -0
  44. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/client_channel.py +0 -0
  45. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/deployments.py +0 -0
  46. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/files.py +0 -0
  47. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/metadata.py +0 -0
  48. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/model.py +0 -0
  49. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/prompts.py +0 -0
  50. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/resource_permissions.py +0 -0
  51. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/resources/toolset.py +0 -0
  52. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/__init__.py +0 -0
  53. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/application.py +0 -0
  54. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/bucket.py +0 -0
  55. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/chat/__init__.py +0 -0
  56. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/chat/function.py +0 -0
  57. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/chat/legacy/__init__.py +0 -0
  58. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/chat/legacy/application_request.py +0 -0
  59. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/chat/legacy/chat_completion.py +0 -0
  60. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/chat/request.py +0 -0
  61. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/chat/request_param.py +0 -0
  62. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/chat/response.py +0 -0
  63. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/chat/tool.py +0 -0
  64. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/client_channel.py +0 -0
  65. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/deployment.py +0 -0
  66. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/metadata.py +0 -0
  67. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/model.py +0 -0
  68. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/prompt.py +0 -0
  69. {aidial_client-0.11.0.dev3 → aidial_client-0.11.0.dev6}/aidial_client/types/toolset.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aidial-client
3
- Version: 0.11.0.dev3
3
+ Version: 0.11.0.dev6
4
4
  Summary: A Python client library for the AI DIAL API
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -39,6 +39,7 @@ Description-Content-Type: text/markdown
39
39
  - [Authentication](#authentication)
40
40
  - [API Keys](#api-keys)
41
41
  - [Bearer Token](#bearer-token)
42
+ - [Lifecycle Management](#lifecycle-management)
42
43
  - [Deployments](#deployments)
43
44
  - [List Deployments](#list-deployments)
44
45
  - [Get Deployment by Id](#get-deployment-by-id)
@@ -143,6 +144,45 @@ async_client = AsyncDial(
143
144
  )
144
145
  ```
145
146
 
147
+ ### Lifecycle Management
148
+
149
+ For deterministic shutdown of underlying HTTP clients, both client types and
150
+ client pools expose lifecycle APIs.
151
+
152
+ ```python
153
+ from aidial_client import AsyncDial, AsyncDialClientPool, Dial, DialClientPool
154
+
155
+ # Sync client
156
+ with Dial(api_key="your_api_key", base_url="https://your-dial-instance.com") as client:
157
+ ...
158
+
159
+ client = Dial(api_key="your_api_key", base_url="https://your-dial-instance.com")
160
+ client.close()
161
+
162
+ # Async client
163
+ async with AsyncDial(
164
+ api_key="your_api_key", base_url="https://your-dial-instance.com"
165
+ ) as async_client:
166
+ ...
167
+
168
+ async_client = AsyncDial(
169
+ api_key="your_api_key", base_url="https://your-dial-instance.com"
170
+ )
171
+ await async_client.aclose()
172
+
173
+ # Sync pool
174
+ with DialClientPool() as pool:
175
+ pooled_client = pool.create_client(
176
+ base_url="https://your-dial-instance.com", api_key="your-api-key"
177
+ )
178
+
179
+ # Async pool
180
+ async with AsyncDialClientPool() as async_pool:
181
+ pooled_async_client = async_pool.create_client(
182
+ base_url="https://your-dial-instance.com", api_key="your-api-key"
183
+ )
184
+ ```
185
+
146
186
  You can also pass `bearer_token` as a function without parameters, that returns a `string`:
147
187
 
148
188
  ```python
@@ -530,6 +570,13 @@ all_content = result.get_content()
530
570
  all_content = await result.aget_content()
531
571
  ```
532
572
 
573
+ or access response metadata:
574
+
575
+ ```python
576
+ headers = result.headers
577
+ content_type = result.content_type
578
+ ```
579
+
533
580
  or write it to the file:
534
581
 
535
582
  ```python
@@ -950,7 +997,7 @@ second_client = client_pool.create_client(
950
997
  #### Asynchronous Client Pool
951
998
 
952
999
  ```python
953
- from dial_client import (
1000
+ from aidial_client import (
954
1001
  AsyncDialClientPool,
955
1002
  )
956
1003
 
@@ -17,6 +17,7 @@
17
17
  - [Authentication](#authentication)
18
18
  - [API Keys](#api-keys)
19
19
  - [Bearer Token](#bearer-token)
20
+ - [Lifecycle Management](#lifecycle-management)
20
21
  - [Deployments](#deployments)
21
22
  - [List Deployments](#list-deployments)
22
23
  - [Get Deployment by Id](#get-deployment-by-id)
@@ -121,6 +122,45 @@ async_client = AsyncDial(
121
122
  )
122
123
  ```
123
124
 
125
+ ### Lifecycle Management
126
+
127
+ For deterministic shutdown of underlying HTTP clients, both client types and
128
+ client pools expose lifecycle APIs.
129
+
130
+ ```python
131
+ from aidial_client import AsyncDial, AsyncDialClientPool, Dial, DialClientPool
132
+
133
+ # Sync client
134
+ with Dial(api_key="your_api_key", base_url="https://your-dial-instance.com") as client:
135
+ ...
136
+
137
+ client = Dial(api_key="your_api_key", base_url="https://your-dial-instance.com")
138
+ client.close()
139
+
140
+ # Async client
141
+ async with AsyncDial(
142
+ api_key="your_api_key", base_url="https://your-dial-instance.com"
143
+ ) as async_client:
144
+ ...
145
+
146
+ async_client = AsyncDial(
147
+ api_key="your_api_key", base_url="https://your-dial-instance.com"
148
+ )
149
+ await async_client.aclose()
150
+
151
+ # Sync pool
152
+ with DialClientPool() as pool:
153
+ pooled_client = pool.create_client(
154
+ base_url="https://your-dial-instance.com", api_key="your-api-key"
155
+ )
156
+
157
+ # Async pool
158
+ async with AsyncDialClientPool() as async_pool:
159
+ pooled_async_client = async_pool.create_client(
160
+ base_url="https://your-dial-instance.com", api_key="your-api-key"
161
+ )
162
+ ```
163
+
124
164
  You can also pass `bearer_token` as a function without parameters, that returns a `string`:
125
165
 
126
166
  ```python
@@ -508,6 +548,13 @@ all_content = result.get_content()
508
548
  all_content = await result.aget_content()
509
549
  ```
510
550
 
551
+ or access response metadata:
552
+
553
+ ```python
554
+ headers = result.headers
555
+ content_type = result.content_type
556
+ ```
557
+
511
558
  or write it to the file:
512
559
 
513
560
  ```python
@@ -928,7 +975,7 @@ second_client = client_pool.create_client(
928
975
  #### Asynchronous Client Pool
929
976
 
930
977
  ```python
931
- from dial_client import (
978
+ from aidial_client import (
932
979
  AsyncDialClientPool,
933
980
  )
934
981
 
@@ -1,5 +1,6 @@
1
1
  from abc import ABC, abstractmethod
2
2
  from pathlib import PurePosixPath
3
+ from types import TracebackType
3
4
  from typing import Generic, TypeVar
4
5
  from urllib.parse import urljoin
5
6
 
@@ -164,6 +165,20 @@ class Dial(BaseDialClient[SyncHTTPClient, SyncAuthValue]):
164
165
  def auth_headers(self) -> dict[str, str]:
165
166
  return self._http_client.auth_headers()
166
167
 
168
+ def close(self) -> None:
169
+ self._http_client.internal_http_client.close()
170
+
171
+ def __enter__(self) -> "Dial":
172
+ return self
173
+
174
+ def __exit__(
175
+ self,
176
+ exc_type: type[BaseException] | None,
177
+ exc_value: BaseException | None,
178
+ traceback: TracebackType | None,
179
+ ) -> None:
180
+ self.close()
181
+
167
182
 
168
183
  class AsyncDial(BaseDialClient[AsyncHTTPClient, AsyncAuthValue]):
169
184
  def _init_resources(self) -> None:
@@ -253,3 +268,17 @@ class AsyncDial(BaseDialClient[AsyncHTTPClient, AsyncAuthValue]):
253
268
 
254
269
  async def auth_headers(self) -> dict[str, str]:
255
270
  return await self._http_client.auth_headers()
271
+
272
+ async def aclose(self) -> None:
273
+ await self._http_client.internal_http_client.aclose()
274
+
275
+ async def __aenter__(self) -> "AsyncDial":
276
+ return self
277
+
278
+ async def __aexit__(
279
+ self,
280
+ exc_type: type[BaseException] | None,
281
+ exc_value: BaseException | None,
282
+ traceback: TracebackType | None,
283
+ ) -> None:
284
+ await self.aclose()
@@ -1,3 +1,5 @@
1
+ from types import TracebackType
2
+
1
3
  import httpx
2
4
 
3
5
  from aidial_client._auth import AsyncAuthValue, SyncAuthValue
@@ -44,6 +46,20 @@ class DialClientPool:
44
46
  ),
45
47
  )
46
48
 
49
+ def close(self) -> None:
50
+ self._internal_http_client.close()
51
+
52
+ def __enter__(self) -> "DialClientPool":
53
+ return self
54
+
55
+ def __exit__(
56
+ self,
57
+ exc_type: type[BaseException] | None,
58
+ exc_value: BaseException | None,
59
+ traceback: TracebackType | None,
60
+ ) -> None:
61
+ self.close()
62
+
47
63
 
48
64
  class AsyncDialClientPool:
49
65
  def __init__(
@@ -78,3 +94,17 @@ class AsyncDialClientPool:
78
94
  internal_http_client=self._internal_http_client,
79
95
  ),
80
96
  )
97
+
98
+ async def aclose(self) -> None:
99
+ await self._internal_http_client.aclose()
100
+
101
+ async def __aenter__(self) -> "AsyncDialClientPool":
102
+ return self
103
+
104
+ async def __aexit__(
105
+ self,
106
+ exc_type: type[BaseException] | None,
107
+ exc_value: BaseException | None,
108
+ traceback: TracebackType | None,
109
+ ) -> None:
110
+ await self.aclose()
@@ -40,3 +40,11 @@ class FileDownloadResponse:
40
40
  @property
41
41
  def filename(self) -> str:
42
42
  return self._filename
43
+
44
+ @property
45
+ def headers(self) -> httpx.Headers:
46
+ return self._response.headers
47
+
48
+ @property
49
+ def content_type(self) -> str | None:
50
+ return self.headers.get("content-type")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aidial-client"
3
- version = "0.11.0.dev3"
3
+ version = "0.11.0.dev6"
4
4
  description = "A Python client library for the AI DIAL API"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"