Skip to content

Commit 31b319c

Browse files
committed
feat(core): added retrievals on the SDK
1 parent 65547bf commit 31b319c

File tree

5 files changed

+177
-41
lines changed

5 files changed

+177
-41
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/).
77

8+
## [2.13.2] - 2024-09-17
9+
10+
### Added
11+
12+
- Now is possible to request the retrieval to be returned in the response of the deployment creation
13+
814
## [2.13.1] - 2024-09-17
915

1016
### Fixed

orq_ai_sdk/api_resources/async_deployments.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,56 @@
1313
from typing import Optional, TypedDict
1414

1515

16+
class DeploymentInvokeOptions(TypedDict):
17+
"""Options for the deployment invocation."""
18+
19+
include_retrievals: Optional[bool]
20+
"""Whether to include the retrieved knowledge chunks in the response"""
21+
22+
23+
class DeploymentRetrievalMetadata:
24+
def __init__(self, data: Dict[str, Any]):
25+
self.file_name = data["file_name"]
26+
"""Name of the retrieved document chunk"""
27+
28+
self.file_type = data["file_type"]
29+
"""Type of the retrieved document chunk"""
30+
31+
self.page_number = data.get("page_number", None)
32+
"""Page number of the retrieved document chunk. Only available for PDF files"""
33+
34+
self.search_score = data["search_score"]
35+
"""Search score of the retrieved document chunk"""
36+
37+
self.rerank_score = data.get("rerank_score", None)
38+
"""Rerank score of the retrieved document chunk"""
39+
40+
def to_dict(self):
41+
return {
42+
"file_name": self.file_name,
43+
"file_type": self.file_type,
44+
"page_number": self.page_number,
45+
"search_score": self.search_score,
46+
"rerank_score": self.rerank_score,
47+
}
48+
49+
50+
class DeploymentRetrieval:
51+
def __init__(self, data: Dict[str, Any]):
52+
53+
self.document = data["document"]
54+
"""Retrieved document chunk from the knowledge base"""
55+
56+
self.metadata = DeploymentRetrievalMetadata(data["metadata"])
57+
"""Metadata of the retrieved document chunk"""
58+
59+
def to_dict(self):
60+
return {
61+
"document": self.document,
62+
"metadata": self.metadata.to_dict(),
63+
}
64+
65+
1666
class DeploymentFeedbackMetrics(TypedDict):
1767
score: int
1868

@@ -185,6 +235,10 @@ def __init__(
185235
DeploymentGenerationChoice(choice) for choice in params.get("choices", [])
186236
]
187237

238+
self.retrievals = [
239+
DeploymentRetrieval(retrieval) for retrieval in params.get("retrievals", [])
240+
]
241+
188242
def to_dict(self):
189243
"""
190244
Converts the deployment object to a dictionary representation.
@@ -203,6 +257,7 @@ def to_dict(self):
203257
"finalized": self.finalized,
204258
"system_fingerprint": self.system_fingerprint,
205259
"choices": [choice.to_dict() for choice in self.choices],
260+
"retrievals": [retrieval.to_dict() for retrieval in self.retrievals],
206261
}
207262

208263

@@ -275,6 +330,7 @@ def __validate_params(
275330
prefix_messages: Optional[List[Dict[str, Any]]] = None,
276331
messages: Optional[List[Dict[str, Any]]] = None,
277332
extra_params: Optional[Dict[str, Any]] = None,
333+
invoke_options: Optional[DeploymentInvokeOptions] = None,
278334
):
279335

280336
self.body_params = {}
@@ -304,6 +360,9 @@ def __validate_params(
304360
if extra_params is not None:
305361
self.body_params["extra_params"] = extra_params
306362

363+
if invoke_options is not None:
364+
self.body_params["invoke_options"] = invoke_options
365+
307366
async def get_config(self, key: str, context=None, inputs=None, metadata=None):
308367
self.__validate_params(
309368
key=key, context=context, inputs=inputs, metadata=metadata
@@ -343,6 +402,7 @@ async def invoke(
343402
:param prefix_messages (list, optional): A list of messages to include after the `System` message, but before the `User` and `Assistant` pairs configured in your deployment. Defaults to None.
344403
:param messages (list, optional): The messages to send to the LLM with the messages template. Defaults to None.
345404
:param extra_params (dict, optional): Additional parameters to include with the invocation. Defaults to None.
405+
:param invoke_options (dict, optional): Options for the deployment invocation. Defaults to None.
346406
347407
Returns:
348408
`Deployment`: The invoked deployment.
@@ -358,6 +418,7 @@ async def invoke(
358418
prefix_messages=prefix_messages,
359419
messages=messages,
360420
extra_params=extra_params,
421+
invoke_options=invoke_options,
361422
)
362423

363424
response = await post_async(
@@ -382,6 +443,7 @@ async def invoke_with_stream(
382443
prefix_messages=None,
383444
messages=None,
384445
extra_params=None,
446+
invoke_options: Optional[DeploymentInvokeOptions] = None,
385447
):
386448
"""
387449
Invokes a deployment with the specified key using the async HTTP client and stream the response.
@@ -394,6 +456,7 @@ async def invoke_with_stream(
394456
:param prefix_messages (list, optional): A list of messages to include after the `System` message, but before the `User` and `Assistant` pairs configured in your deployment. Defaults to None.
395457
:param messages (Optional): The messages parameter. Defaults to None.
396458
:param extra_params (dict, optional): Additional parameters to include with the invocation. Defaults to None.
459+
:param invoke_options (dict, optional): Options for the deployment invocation. Defaults to None.
397460
398461
Yields:
399462
Deployment: A deployment object.
@@ -410,6 +473,7 @@ async def invoke_with_stream(
410473
prefix_messages=prefix_messages,
411474
messages=messages,
412475
extra_params=extra_params,
476+
invoke_options=invoke_options,
413477
)
414478

415479
async for response in stream_async(

orq_ai_sdk/api_resources/deployments.py

Lines changed: 105 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,56 @@
1111
INVOKE_URL = "{}/invoke".format(DEPLOYMENTS_API)
1212

1313

14+
class DeploymentInvokeOptions(TypedDict):
15+
"""Options for the deployment invocation."""
16+
17+
include_retrievals: Optional[bool]
18+
"""Whether to include the retrieved knowledge chunks in the response"""
19+
20+
21+
class DeploymentRetrievalMetadata:
22+
def __init__(self, data: Dict[str, Any]):
23+
self.file_name = data["file_name"]
24+
"""Name of the retrieved document chunk"""
25+
26+
self.file_type = data["file_type"]
27+
"""Type of the retrieved document chunk"""
28+
29+
self.page_number = data.get("page_number", None)
30+
"""Page number of the retrieved document chunk. Only available for PDF files"""
31+
32+
self.search_score = data["search_score"]
33+
"""Search score of the retrieved document chunk"""
34+
35+
self.rerank_score = data.get("rerank_score", None)
36+
"""Rerank score of the retrieved document chunk"""
37+
38+
def to_dict(self):
39+
return {
40+
"file_name": self.file_name,
41+
"file_type": self.file_type,
42+
"page_number": self.page_number,
43+
"search_score": self.search_score,
44+
"rerank_score": self.rerank_score,
45+
}
46+
47+
48+
class DeploymentRetrieval:
49+
def __init__(self, data: Dict[str, Any]):
50+
51+
self.document = data["document"]
52+
"""Retrieved document chunk from the knowledge base"""
53+
54+
self.metadata = DeploymentRetrievalMetadata(data["metadata"])
55+
"""Metadata of the retrieved document chunk"""
56+
57+
def to_dict(self):
58+
return {
59+
"document": self.document,
60+
"metadata": self.metadata.to_dict(),
61+
}
62+
63+
1464
class DeploymentFeedbackMetrics(TypedDict):
1565
score: int
1666

@@ -35,16 +85,16 @@ def __init__(self, event_id: str):
3585
self.id = event_id
3686

3787
def add_metrics(
38-
self,
39-
feedback: Optional[DeploymentFeedbackMetrics] = None,
40-
usage: Optional[DeploymentUsageMetrics] = None,
41-
performance: Optional[DeploymentPerformanceMetrics] = None,
42-
metadata: Optional[Dict] = None,
43-
chain_id: Optional[str] = None,
44-
conversation_id: Optional[str] = None,
45-
user_id: Optional[str] = None,
46-
messages: Optional[List[Dict[str, Any]]] = None,
47-
choices: Optional[List[Dict[str, Any]]] = None,
88+
self,
89+
feedback: Optional[DeploymentFeedbackMetrics] = None,
90+
usage: Optional[DeploymentUsageMetrics] = None,
91+
performance: Optional[DeploymentPerformanceMetrics] = None,
92+
metadata: Optional[Dict] = None,
93+
chain_id: Optional[str] = None,
94+
conversation_id: Optional[str] = None,
95+
user_id: Optional[str] = None,
96+
messages: Optional[List[Dict[str, Any]]] = None,
97+
choices: Optional[List[Dict[str, Any]]] = None,
4898
):
4999
body = {}
50100

@@ -166,8 +216,8 @@ def to_dict(self):
166216

167217
class DeploymentGeneration(BaseDeployment):
168218
def __init__(
169-
self,
170-
**params,
219+
self,
220+
**params,
171221
):
172222
super().__init__(event_id=params.get("id"))
173223

@@ -179,10 +229,15 @@ def __init__(
179229
self.is_final = params.get("is_final", None)
180230
self.finalized = params.get("finalized", None)
181231
self.system_fingerprint = params.get("system_fingerprint", None)
232+
182233
self.choices = [
183234
DeploymentGenerationChoice(choice) for choice in params.get("choices", [])
184235
]
185236

237+
self.retrievals = [
238+
DeploymentRetrieval(retrieval) for retrieval in params.get("retrievals", [])
239+
]
240+
186241
def to_dict(self):
187242
"""
188243
Converts the deployment object to a dictionary representation.
@@ -201,6 +256,7 @@ def to_dict(self):
201256
"finalized": self.finalized,
202257
"system_fingerprint": self.system_fingerprint,
203258
"choices": [choice.to_dict() for choice in self.choices],
259+
"retrievals": [retrieval.to_dict() for retrieval in self.retrievals],
204260
}
205261

206262

@@ -265,14 +321,15 @@ def to_dict(self) -> Dict[str, Any]:
265321
class Deployment:
266322

267323
def __validate_params(
268-
self,
269-
key: str,
270-
context: Optional[Dict[str, Any]] = None,
271-
inputs: Optional[Dict[str, str]] = None,
272-
metadata: Optional[Dict[str, Any]] = None,
273-
prefix_messages: Optional[List[Dict[str, Any]]] = None,
274-
messages: Optional[List[Dict[str, Any]]] = None,
275-
extra_params: Optional[Dict[str, Any]] = None,
324+
self,
325+
key: str,
326+
context: Optional[Dict[str, Any]] = None,
327+
inputs: Optional[Dict[str, str]] = None,
328+
metadata: Optional[Dict[str, Any]] = None,
329+
prefix_messages: Optional[List[Dict[str, Any]]] = None,
330+
messages: Optional[List[Dict[str, Any]]] = None,
331+
extra_params: Optional[Dict[str, Any]] = None,
332+
invoke_options: Optional[DeploymentInvokeOptions] = None,
276333
):
277334

278335
self.body_params = {}
@@ -302,6 +359,9 @@ def __validate_params(
302359
if extra_params is not None:
303360
self.body_params["extra_params"] = extra_params
304361

362+
if invoke_options is not None:
363+
self.body_params["invoke_options"] = invoke_options
364+
305365
def get_config(self, key: str, context=None, inputs=None, metadata=None):
306366
self.__validate_params(
307367
key=key, context=context, inputs=inputs, metadata=metadata
@@ -321,14 +381,15 @@ def get_config(self, key: str, context=None, inputs=None, metadata=None):
321381
return DeploymentPromptConfig(**params)
322382

323383
def invoke(
324-
self,
325-
key: str,
326-
context=None,
327-
inputs=None,
328-
metadata=None,
329-
prefix_messages=None,
330-
messages=None,
331-
extra_params=None,
384+
self,
385+
key: str,
386+
context=None,
387+
inputs=None,
388+
metadata=None,
389+
prefix_messages=None,
390+
messages=None,
391+
extra_params=None,
392+
invoke_options: Optional[DeploymentInvokeOptions] = None,
332393
):
333394
"""
334395
Invokes a deployment with the specified key.
@@ -341,6 +402,7 @@ def invoke(
341402
:param prefix_messages (list, optional): A list of messages to include after the `System` message, but before the `User` and `Assistant` pairs configured in your deployment. Defaults to None.
342403
:param messages (list, optional): The messages to send to the LLM with the messages template. Defaults to None.
343404
:param extra_params (dict, optional): Additional parameters to include with the invocation. Defaults to None.
405+
:param invoke_options (dict, optional): Options for the deployment invocation. Defaults to None.
344406
345407
Returns:
346408
`Deployment`: The invoked deployment.
@@ -356,6 +418,7 @@ def invoke(
356418
prefix_messages=prefix_messages,
357419
messages=messages,
358420
extra_params=extra_params,
421+
invoke_options=invoke_options,
359422
)
360423

361424
response = post(
@@ -372,14 +435,15 @@ def invoke(
372435
return DeploymentGeneration(**params)
373436

374437
def invoke_with_stream(
375-
self,
376-
key: str,
377-
context=None,
378-
inputs=None,
379-
metadata=None,
380-
prefix_messages=None,
381-
messages=None,
382-
extra_params=None,
438+
self,
439+
key: str,
440+
context=None,
441+
inputs=None,
442+
metadata=None,
443+
prefix_messages=None,
444+
messages=None,
445+
extra_params=None,
446+
invoke_options: Optional[DeploymentInvokeOptions] = None,
383447
):
384448
"""
385449
Invokes a deployment with the specified key and stream the response.
@@ -394,6 +458,7 @@ def invoke_with_stream(
394458
:param prefix_messages (list, optional): A list of messages to include after the `System` message, but before the `User` and `Assistant` pairs configured in your deployment. Defaults to None.
395459
:param messages (list, optional): The messages to send to the LLM with the template. Defaults to None.
396460
:param extra_params (dict, optional): Additional parameters to include with the invocation. Defaults to None.
461+
:param invoke_options (dict, optional): Options for the deployment invocation. Defaults to None.
397462
398463
Returns:
399464
`Deployment`: The invoked deployment.
@@ -409,12 +474,13 @@ def invoke_with_stream(
409474
prefix_messages=prefix_messages,
410475
messages=messages,
411476
extra_params=extra_params,
477+
invoke_options=invoke_options,
412478
)
413479

414480
for response in stream(
415-
url=INVOKE_URL,
416-
body=self.body_params,
417-
environment=Store["environment"],
481+
url=INVOKE_URL,
482+
body=self.body_params,
483+
environment=Store["environment"],
418484
):
419485

420486
data = extract_json(response)

orq_ai_sdk/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = "2.13.1"
1+
VERSION = "2.13.2"

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "orq_ai_sdk"
3-
version = '2.13.1'
3+
version = '2.13.2'
44
description = "Integrate and operate your products with the power of Large Language Models from a single collaboration platform. Conduct prompt engineering, experimentation, operations and monitoring across models, with full transparency on quality and costs."
55
authors = ["orq.ai <support@orq.ai>"]
66
classifiers = [

0 commit comments

Comments
 (0)