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.
Files changed (58) hide show
  1. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/PKG-INFO +1 -1
  2. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/application.py +1 -1
  3. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/__init__.py +2 -0
  4. aidial_sdk-0.38.0.dev1/aidial_sdk/chat_completion/_cache.py +13 -0
  5. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/response.py +21 -0
  6. aidial_sdk-0.38.0.dev1/aidial_sdk/deployment/_headers.py +13 -0
  7. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/from_request_mixin.py +33 -10
  8. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/pyproject.toml +1 -1
  9. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/LICENSE +0 -0
  10. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/README.md +0 -0
  11. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/__init__.py +0 -0
  12. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/_errors.py +0 -0
  13. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/_pydantic/__init__.py +0 -0
  14. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/_pydantic/_compat.py +0 -0
  15. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/_pydantic/_model_config.py +0 -0
  16. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/_types.py +0 -0
  17. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/base.py +0 -0
  18. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/choice.py +0 -0
  19. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/choice_base.py +0 -0
  20. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/chunks.py +0 -0
  21. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/enums.py +0 -0
  22. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/form.py +0 -0
  23. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/function_call.py +0 -0
  24. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/function_tool_call.py +0 -0
  25. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/request.py +0 -0
  26. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/chat_completion/stage.py +0 -0
  27. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/__init__.py +0 -0
  28. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/configuration.py +0 -0
  29. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/rate.py +0 -0
  30. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/tokenize.py +0 -0
  31. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/deployment/truncate_prompt.py +0 -0
  32. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/embeddings/__init__.py +0 -0
  33. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/embeddings/base.py +0 -0
  34. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/embeddings/request.py +0 -0
  35. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/embeddings/response.py +0 -0
  36. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/exceptions.py +0 -0
  37. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/header_propagator.py +0 -0
  38. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/py.typed +0 -0
  39. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/pydantic/v2.py +0 -0
  40. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/pydantic_v1/__init__.py +0 -0
  41. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/telemetry/__init__.py +0 -0
  42. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/telemetry/init.py +0 -0
  43. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/telemetry/types.py +0 -0
  44. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/__init__.py +0 -0
  45. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_attachment.py +0 -0
  46. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_cancel_scope.py +0 -0
  47. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_content_stream.py +0 -0
  48. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_disconnect_middleware.py +0 -0
  49. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_indexed_list.py +0 -0
  50. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/_reflection.py +0 -0
  51. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/env.py +0 -0
  52. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/errors.py +0 -0
  53. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/json.py +0 -0
  54. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/log_config.py +0 -0
  55. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/logging.py +0 -0
  56. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/merge_chunks.py +0 -0
  57. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/pydantic.py +0 -0
  58. {aidial_sdk-0.37.0.dev7 → aidial_sdk-0.38.0.dev1}/aidial_sdk/utils/streaming.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aidial-sdk
3
- Version: 0.37.0.dev7
3
+ Version: 0.38.0.dev1
4
4
  Summary: Framework to create applications and model adapters for AI DIAL
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -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"
@@ -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 {_DIAL_APPLICATION_ID_HEADER} header isn't set"
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(_DIAL_APPLICATION_PROPERTIES_HEADER)
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 {_DIAL_APPLICATION_PROPERTIES_HEADER} header isn't valid JSON"
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=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.37.0.dev7"
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"