aidial-sdk 0.37.0.dev7__tar.gz → 0.38.0.dev1__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.
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/PKG-INFO +1 -1
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/application.py +1 -1
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/__init__.py +2 -0
- aidial_sdk-0.38.0.dev1/aidial_sdk/chat_completion/_cache.py +13 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/response.py +21 -0
- aidial_sdk-0.38.0.dev1/aidial_sdk/deployment/_headers.py +13 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/from_request_mixin.py +33 -10
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/pyproject.toml +1 -1
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/LICENSE +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/README.md +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/__init__.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/_errors.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/_pydantic/__init__.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/_pydantic/_compat.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/_pydantic/_model_config.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/_types.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/base.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/choice.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/choice_base.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/chunks.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/enums.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/form.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/function_call.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/function_tool_call.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/request.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/stage.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/__init__.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/configuration.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/rate.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/tokenize.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/truncate_prompt.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/embeddings/__init__.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/embeddings/base.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/embeddings/request.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/embeddings/response.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/exceptions.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/header_propagator.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/py.typed +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/pydantic/v2.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/pydantic_v1/__init__.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/telemetry/__init__.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/telemetry/init.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/telemetry/types.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/__init__.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_attachment.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_cancel_scope.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_content_stream.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_disconnect_middleware.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_indexed_list.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_reflection.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/env.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/errors.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/json.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/log_config.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/logging.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/merge_chunks.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/pydantic.py +0 -0
- {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/streaming.py +0 -0
|
@@ -283,7 +283,7 @@ class DIALApp(FastAPI):
|
|
|
283
283
|
"DIAL_SDK_SSE_HEARTBEAT_INTERVAL"
|
|
284
284
|
)
|
|
285
285
|
|
|
286
|
-
async def _handler(original_request: Request):
|
|
286
|
+
async def _handler(original_request: Request) -> Response:
|
|
287
287
|
request = await self._parse_request(
|
|
288
288
|
ChatCompletionRequest, original_request, deployment_id
|
|
289
289
|
)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from aidial_sdk.chat_completion._cache import CacheBreakpointPath
|
|
1
2
|
from aidial_sdk.chat_completion.base import ChatCompletion
|
|
2
3
|
from aidial_sdk.chat_completion.choice import Choice
|
|
3
4
|
from aidial_sdk.chat_completion.enums import FinishReason, Status
|
|
@@ -55,6 +56,7 @@ __all__ = [
|
|
|
55
56
|
"Attachment",
|
|
56
57
|
"Button",
|
|
57
58
|
"CacheBreakpoint",
|
|
59
|
+
"CacheBreakpointPath",
|
|
58
60
|
"ChatCompletion",
|
|
59
61
|
"Choice",
|
|
60
62
|
"ConfigurationRequest",
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class CacheBreakpointPath:
|
|
2
|
+
path: str
|
|
3
|
+
|
|
4
|
+
def __init__(self, path: str) -> None:
|
|
5
|
+
self.path = path
|
|
6
|
+
|
|
7
|
+
@classmethod
|
|
8
|
+
def messages(cls, idx: int):
|
|
9
|
+
return cls(f"prefix.body.messages[{idx}]")
|
|
10
|
+
|
|
11
|
+
@classmethod
|
|
12
|
+
def tools(cls, idx: int):
|
|
13
|
+
return cls(f"prefix.body.tools[{idx}]")
|
|
@@ -6,6 +6,7 @@ from uuid import uuid4
|
|
|
6
6
|
|
|
7
7
|
from typing_extensions import assert_never
|
|
8
8
|
|
|
9
|
+
from aidial_sdk.chat_completion._cache import CacheBreakpointPath
|
|
9
10
|
from aidial_sdk.chat_completion._types import ChunkQueue
|
|
10
11
|
from aidial_sdk.chat_completion.choice import Choice
|
|
11
12
|
from aidial_sdk.chat_completion.chunks import (
|
|
@@ -22,6 +23,11 @@ from aidial_sdk.chat_completion.chunks import (
|
|
|
22
23
|
UsagePerModelChunk,
|
|
23
24
|
)
|
|
24
25
|
from aidial_sdk.chat_completion.request import Request
|
|
26
|
+
from aidial_sdk.deployment._headers import (
|
|
27
|
+
DIAL_CACHE_BREAKPOINT_PATH,
|
|
28
|
+
DIAL_CACHE_EXPIRE_AT,
|
|
29
|
+
DIAL_CACHE_EXTRA_METADATA,
|
|
30
|
+
)
|
|
25
31
|
from aidial_sdk.exceptions import HTTPException as DIALException
|
|
26
32
|
from aidial_sdk.exceptions import RequestValidationError, RuntimeServerError
|
|
27
33
|
from aidial_sdk.utils._cancel_scope import CancelScope
|
|
@@ -259,3 +265,18 @@ class Response:
|
|
|
259
265
|
"Trying to set a header after start of generation",
|
|
260
266
|
)
|
|
261
267
|
self._headers.append((key, value))
|
|
268
|
+
|
|
269
|
+
def set_cache_breakpoint(
|
|
270
|
+
self,
|
|
271
|
+
*,
|
|
272
|
+
cache_breakpoint_path: CacheBreakpointPath,
|
|
273
|
+
cache_expire_at: str | None = None,
|
|
274
|
+
cache_metadata: str | None = None,
|
|
275
|
+
):
|
|
276
|
+
self.append_header(
|
|
277
|
+
DIAL_CACHE_BREAKPOINT_PATH, cache_breakpoint_path.path
|
|
278
|
+
)
|
|
279
|
+
if cache_expire_at is not None:
|
|
280
|
+
self.append_header(DIAL_CACHE_EXPIRE_AT, cache_expire_at)
|
|
281
|
+
if cache_metadata is not None:
|
|
282
|
+
self.append_header(DIAL_CACHE_EXTRA_METADATA, cache_metadata)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
DIAL_CONVERSATION_ID = "X-CONVERSATION-ID"
|
|
2
|
+
DIAL_JOB_TITLE = "X-JOB-TITLE"
|
|
3
|
+
|
|
4
|
+
DIAL_UPSTREAM_ENDPOINT = "X-UPSTREAM-ENDPOINT"
|
|
5
|
+
DIAL_UPSTREAM_KEY = "X-UPSTREAM-KEY"
|
|
6
|
+
DIAL_UPSTREAM_EXTRA_DATA = "X-UPSTREAM-EXTRA-DATA"
|
|
7
|
+
|
|
8
|
+
DIAL_APPLICATION_PROPERTIES = "X-DIAL-APPLICATION-PROPERTIES"
|
|
9
|
+
DIAL_APPLICATION_ID = "X-DIAL-APPLICATION-ID"
|
|
10
|
+
|
|
11
|
+
DIAL_CACHE_BREAKPOINT_PATH = "X-DIAL-CACHE-BREAKPOINT-PATH"
|
|
12
|
+
DIAL_CACHE_EXPIRE_AT = "X-DIAL-CACHE-EXPIRE-AT"
|
|
13
|
+
DIAL_CACHE_EXTRA_METADATA = "X-DIAL-CACHE-EXTRA-METADATA"
|
{aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/from_request_mixin.py
RENAMED
|
@@ -15,6 +15,17 @@ from aidial_sdk._pydantic import (
|
|
|
15
15
|
StrictStr,
|
|
16
16
|
)
|
|
17
17
|
from aidial_sdk._pydantic._compat import model_validator
|
|
18
|
+
from aidial_sdk.deployment._headers import (
|
|
19
|
+
DIAL_APPLICATION_ID,
|
|
20
|
+
DIAL_APPLICATION_PROPERTIES,
|
|
21
|
+
DIAL_CACHE_BREAKPOINT_PATH,
|
|
22
|
+
DIAL_CACHE_EXTRA_METADATA,
|
|
23
|
+
DIAL_CONVERSATION_ID,
|
|
24
|
+
DIAL_JOB_TITLE,
|
|
25
|
+
DIAL_UPSTREAM_ENDPOINT,
|
|
26
|
+
DIAL_UPSTREAM_EXTRA_DATA,
|
|
27
|
+
DIAL_UPSTREAM_KEY,
|
|
28
|
+
)
|
|
18
29
|
from aidial_sdk.exceptions import InternalServerError, InvalidRequestError
|
|
19
30
|
from aidial_sdk.utils.logging import log_debug
|
|
20
31
|
from aidial_sdk.utils.pydantic import ExtraAllowModel
|
|
@@ -39,10 +50,6 @@ class FromRequestMixin(ABC, ExtraAllowModel):
|
|
|
39
50
|
pass
|
|
40
51
|
|
|
41
52
|
|
|
42
|
-
_DIAL_APPLICATION_PROPERTIES_HEADER = "X-DIAL-APPLICATION-PROPERTIES"
|
|
43
|
-
_DIAL_APPLICATION_ID_HEADER = "X-DIAL-APPLICATION-ID"
|
|
44
|
-
|
|
45
|
-
|
|
46
53
|
class FromRequestDeploymentMixin(FromRequestMixin):
|
|
47
54
|
headers: HeadersType
|
|
48
55
|
base_url: str | None = None
|
|
@@ -53,6 +60,17 @@ class FromRequestDeploymentMixin(FromRequestMixin):
|
|
|
53
60
|
api_version: StrictStr | None = None
|
|
54
61
|
unreliable_dial_application_properties: dict[str, Any] | None = None
|
|
55
62
|
dial_application_id: str | None = None
|
|
63
|
+
|
|
64
|
+
conversation_id: str | None = None
|
|
65
|
+
job_title: str | None = None
|
|
66
|
+
|
|
67
|
+
upstream_endpoint: str | None = None
|
|
68
|
+
upstream_key: str | None = None
|
|
69
|
+
upstream_extra_data: str | None = None
|
|
70
|
+
|
|
71
|
+
cache_breakpoint_path: str | None = None
|
|
72
|
+
cache_extra_metadata: str | None = None
|
|
73
|
+
|
|
56
74
|
original_request: fastapi.Request = Field(..., exclude=True)
|
|
57
75
|
|
|
58
76
|
if PYDANTIC_V2:
|
|
@@ -70,7 +88,7 @@ class FromRequestDeploymentMixin(FromRequestMixin):
|
|
|
70
88
|
|
|
71
89
|
if not self.dial_application_id:
|
|
72
90
|
raise InvalidRequestError(
|
|
73
|
-
f"The {
|
|
91
|
+
f"The {DIAL_APPLICATION_ID} header isn't set"
|
|
74
92
|
)
|
|
75
93
|
|
|
76
94
|
if not self.base_url:
|
|
@@ -176,17 +194,15 @@ class FromRequestDeploymentMixin(FromRequestMixin):
|
|
|
176
194
|
del headers["Authorization"]
|
|
177
195
|
|
|
178
196
|
application_properties = None
|
|
179
|
-
props_header = headers.get(
|
|
197
|
+
props_header = headers.get(DIAL_APPLICATION_PROPERTIES)
|
|
180
198
|
if props_header:
|
|
181
199
|
try:
|
|
182
200
|
application_properties = json.loads(props_header)
|
|
183
201
|
except json.JSONDecodeError:
|
|
184
202
|
raise InvalidRequestError(
|
|
185
|
-
f"The value of {
|
|
203
|
+
f"The value of {DIAL_APPLICATION_PROPERTIES} header isn't valid JSON"
|
|
186
204
|
)
|
|
187
205
|
|
|
188
|
-
application_id = headers.get(_DIAL_APPLICATION_ID_HEADER)
|
|
189
|
-
|
|
190
206
|
return cls(
|
|
191
207
|
**(await cls.get_request_body(request)),
|
|
192
208
|
api_key_secret=SecretStr(api_key),
|
|
@@ -202,7 +218,14 @@ class FromRequestDeploymentMixin(FromRequestMixin):
|
|
|
202
218
|
original_request=request,
|
|
203
219
|
base_url=base_url,
|
|
204
220
|
unreliable_dial_application_properties=application_properties,
|
|
205
|
-
dial_application_id=
|
|
221
|
+
dial_application_id=headers.get(DIAL_APPLICATION_ID),
|
|
222
|
+
conversation_id=headers.get(DIAL_CONVERSATION_ID),
|
|
223
|
+
job_title=headers.get(DIAL_JOB_TITLE),
|
|
224
|
+
cache_breakpoint_path=headers.get(DIAL_CACHE_BREAKPOINT_PATH),
|
|
225
|
+
cache_extra_metadata=headers.get(DIAL_CACHE_EXTRA_METADATA),
|
|
226
|
+
upstream_endpoint=headers.get(DIAL_UPSTREAM_ENDPOINT),
|
|
227
|
+
upstream_key=headers.get(DIAL_UPSTREAM_KEY),
|
|
228
|
+
upstream_extra_data=headers.get(DIAL_UPSTREAM_EXTRA_DATA),
|
|
206
229
|
)
|
|
207
230
|
|
|
208
231
|
@staticmethod
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "aidial-sdk"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.38.0.dev1"
|
|
4
4
|
description = "Framework to create applications and model adapters for AI DIAL"
|
|
5
5
|
authors = [{ name = "EPAM RAIL", email = "SpecialEPM-DIALDevTeam@epam.com" }]
|
|
6
6
|
license = "Apache-2.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/function_call.py
RENAMED
|
File without changes
|
{aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/function_tool_call.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_disconnect_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|