athena-intelligence 0.1.117__tar.gz → 0.1.119__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 (60) hide show
  1. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/PKG-INFO +1 -1
  2. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/pyproject.toml +1 -1
  3. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/__init__.py +14 -1
  4. athena_intelligence-0.1.119/src/athena/agents/__init__.py +5 -0
  5. athena_intelligence-0.1.119/src/athena/agents/athena_assistant/__init__.py +2 -0
  6. athena_intelligence-0.1.119/src/athena/agents/athena_assistant/client.py +353 -0
  7. athena_intelligence-0.1.119/src/athena/agents/client.py +19 -0
  8. athena_intelligence-0.1.119/src/athena/agents/structured_data_extractor/__init__.py +2 -0
  9. athena_intelligence-0.1.119/src/athena/agents/structured_data_extractor/client.py +150 -0
  10. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/base_client.py +3 -0
  11. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/client_wrapper.py +1 -1
  12. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/tools/client.py +10 -10
  13. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/__init__.py +12 -0
  14. athena_intelligence-0.1.119/src/athena/types/athena_assistant_config.py +36 -0
  15. athena_intelligence-0.1.119/src/athena/types/athena_assistant_config_enabled_tools_item.py +7 -0
  16. athena_intelligence-0.1.119/src/athena/types/athena_assistant_reponse.py +33 -0
  17. athena_intelligence-0.1.119/src/athena/types/athena_assistant_request.py +38 -0
  18. athena_intelligence-0.1.119/src/athena/types/structured_data_extractor_reponse.py +36 -0
  19. athena_intelligence-0.1.119/src/athena/types/tool.py +17 -0
  20. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/README.md +0 -0
  21. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/client.py +0 -0
  22. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/__init__.py +0 -0
  23. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/api_error.py +0 -0
  24. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/datetime_utils.py +0 -0
  25. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/file.py +0 -0
  26. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/http_client.py +0 -0
  27. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/jsonable_encoder.py +0 -0
  28. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/pydantic_utilities.py +0 -0
  29. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/query_encoder.py +0 -0
  30. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/remove_none_from_dict.py +0 -0
  31. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/core/request_options.py +0 -0
  32. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/environment.py +0 -0
  33. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/errors/__init__.py +0 -0
  34. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/errors/bad_request_error.py +0 -0
  35. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/errors/content_too_large_error.py +0 -0
  36. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/errors/internal_server_error.py +0 -0
  37. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/errors/not_found_error.py +0 -0
  38. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/errors/unauthorized_error.py +0 -0
  39. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/errors/unprocessable_entity_error.py +0 -0
  40. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/errors/unsupported_media_type_error.py +0 -0
  41. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/py.typed +0 -0
  42. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/query/__init__.py +0 -0
  43. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/query/client.py +0 -0
  44. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/query/types/__init__.py +0 -0
  45. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/query/types/query_execute_request_database_asset_ids.py +0 -0
  46. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/tools/__init__.py +0 -0
  47. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/tools/types/__init__.py +0 -0
  48. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/tools/types/tools_data_frame_request_columns_item.py +0 -0
  49. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/asset_not_found_error.py +0 -0
  50. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/data_frame_request_out.py +0 -0
  51. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/data_frame_request_out_columns_item.py +0 -0
  52. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/data_frame_request_out_data_item_item.py +0 -0
  53. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/data_frame_request_out_index_item.py +0 -0
  54. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/data_frame_unknown_format_error.py +0 -0
  55. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/document_chunk.py +0 -0
  56. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/file_chunk_request_out.py +0 -0
  57. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/file_too_large_error.py +0 -0
  58. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/parent_folder_error.py +0 -0
  59. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/types/save_asset_request_out.py +0 -0
  60. {athena_intelligence-0.1.117 → athena_intelligence-0.1.119}/src/athena/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: athena-intelligence
3
- Version: 0.1.117
3
+ Version: 0.1.119
4
4
  Summary: Athena Intelligence Python Library
5
5
  Requires-Python: >=3.8,<4.0
6
6
  Classifier: Intended Audience :: Developers
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "athena-intelligence"
3
- version = "0.1.117"
3
+ version = "0.1.119"
4
4
  description = "Athena Intelligence Python Library"
5
5
  readme = "README.md"
6
6
  authors = []
@@ -2,6 +2,10 @@
2
2
 
3
3
  from .types import (
4
4
  AssetNotFoundError,
5
+ AthenaAssistantConfig,
6
+ AthenaAssistantConfigEnabledToolsItem,
7
+ AthenaAssistantReponse,
8
+ AthenaAssistantRequest,
5
9
  DataFrameRequestOut,
6
10
  DataFrameRequestOutColumnsItem,
7
11
  DataFrameRequestOutDataItemItem,
@@ -12,6 +16,8 @@ from .types import (
12
16
  FileTooLargeError,
13
17
  ParentFolderError,
14
18
  SaveAssetRequestOut,
19
+ StructuredDataExtractorReponse,
20
+ Tool,
15
21
  )
16
22
  from .errors import (
17
23
  BadRequestError,
@@ -22,7 +28,7 @@ from .errors import (
22
28
  UnprocessableEntityError,
23
29
  UnsupportedMediaTypeError,
24
30
  )
25
- from . import query, tools
31
+ from . import agents, query, tools
26
32
  from .environment import AthenaEnvironment
27
33
  from .query import QueryExecuteRequestDatabaseAssetIds
28
34
  from .tools import ToolsDataFrameRequestColumnsItem
@@ -30,6 +36,10 @@ from .version import __version__
30
36
 
31
37
  __all__ = [
32
38
  "AssetNotFoundError",
39
+ "AthenaAssistantConfig",
40
+ "AthenaAssistantConfigEnabledToolsItem",
41
+ "AthenaAssistantReponse",
42
+ "AthenaAssistantRequest",
33
43
  "AthenaEnvironment",
34
44
  "BadRequestError",
35
45
  "ContentTooLargeError",
@@ -46,11 +56,14 @@ __all__ = [
46
56
  "ParentFolderError",
47
57
  "QueryExecuteRequestDatabaseAssetIds",
48
58
  "SaveAssetRequestOut",
59
+ "StructuredDataExtractorReponse",
60
+ "Tool",
49
61
  "ToolsDataFrameRequestColumnsItem",
50
62
  "UnauthorizedError",
51
63
  "UnprocessableEntityError",
52
64
  "UnsupportedMediaTypeError",
53
65
  "__version__",
66
+ "agents",
54
67
  "query",
55
68
  "tools",
56
69
  ]
@@ -0,0 +1,5 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from . import athena_assistant, structured_data_extractor
4
+
5
+ __all__ = ["athena_assistant", "structured_data_extractor"]
@@ -0,0 +1,2 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
@@ -0,0 +1,353 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ...core.api_error import ApiError
7
+ from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ...core.pydantic_utilities import pydantic_v1
9
+ from ...core.request_options import RequestOptions
10
+ from ...errors.unprocessable_entity_error import UnprocessableEntityError
11
+ from ...types.athena_assistant_reponse import AthenaAssistantReponse
12
+ from ...types.athena_assistant_request import AthenaAssistantRequest
13
+
14
+ # this is used as the default value for optional parameters
15
+ OMIT = typing.cast(typing.Any, ...)
16
+
17
+
18
+ class AthenaAssistantClient:
19
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
20
+ self._client_wrapper = client_wrapper
21
+
22
+ def batch(
23
+ self,
24
+ *,
25
+ request: typing.Sequence[AthenaAssistantRequest],
26
+ request_options: typing.Optional[RequestOptions] = None
27
+ ) -> typing.List[AthenaAssistantReponse]:
28
+ """
29
+ Call the Athena assistant with batched requests and return the results.
30
+
31
+ Parameters
32
+ ----------
33
+ request : typing.Sequence[AthenaAssistantRequest]
34
+
35
+ request_options : typing.Optional[RequestOptions]
36
+ Request-specific configuration.
37
+
38
+ Returns
39
+ -------
40
+ typing.List[AthenaAssistantReponse]
41
+ Successful Response
42
+
43
+ Examples
44
+ --------
45
+ from athena import AthenaAssistantConfig, AthenaAssistantRequest, Tool
46
+ from athena.client import Athena
47
+
48
+ client = Athena(
49
+ api_key="YOUR_API_KEY",
50
+ )
51
+ client.agents.athena_assistant.batch(
52
+ request=[
53
+ AthenaAssistantRequest(
54
+ config=AthenaAssistantConfig(
55
+ enabled_tools=[Tool.SEARCH],
56
+ ),
57
+ messages=[],
58
+ )
59
+ ],
60
+ )
61
+ """
62
+ _response = self._client_wrapper.httpx_client.request(
63
+ "api/v0/agents/athena-assistant/batch",
64
+ method="POST",
65
+ json=request,
66
+ request_options=request_options,
67
+ omit=OMIT,
68
+ )
69
+ if 200 <= _response.status_code < 300:
70
+ return pydantic_v1.parse_obj_as(typing.List[AthenaAssistantReponse], _response.json()) # type: ignore
71
+ if _response.status_code == 422:
72
+ raise UnprocessableEntityError(pydantic_v1.parse_obj_as(typing.Any, _response.json())) # type: ignore
73
+ try:
74
+ _response_json = _response.json()
75
+ except JSONDecodeError:
76
+ raise ApiError(status_code=_response.status_code, body=_response.text)
77
+ raise ApiError(status_code=_response.status_code, body=_response_json)
78
+
79
+ def invoke(
80
+ self, *, request: AthenaAssistantRequest, request_options: typing.Optional[RequestOptions] = None
81
+ ) -> AthenaAssistantReponse:
82
+ """
83
+ Call the Athena Assistant agent synchronously.
84
+
85
+ Call the agent with the messages list, wait for the agent to complete,
86
+ and return the result.
87
+
88
+ Parameters
89
+ ----------
90
+ request : AthenaAssistantRequest
91
+
92
+ request_options : typing.Optional[RequestOptions]
93
+ Request-specific configuration.
94
+
95
+ Returns
96
+ -------
97
+ AthenaAssistantReponse
98
+ Successful Response
99
+
100
+ Examples
101
+ --------
102
+ from athena import AthenaAssistantConfig, AthenaAssistantRequest, Tool
103
+ from athena.client import Athena
104
+
105
+ client = Athena(
106
+ api_key="YOUR_API_KEY",
107
+ )
108
+ client.agents.athena_assistant.invoke(
109
+ request=AthenaAssistantRequest(
110
+ config=AthenaAssistantConfig(
111
+ enabled_tools=[Tool.SEARCH],
112
+ ),
113
+ messages=[],
114
+ ),
115
+ )
116
+ """
117
+ _response = self._client_wrapper.httpx_client.request(
118
+ "api/v0/agents/athena-assistant/invoke",
119
+ method="POST",
120
+ json=request,
121
+ request_options=request_options,
122
+ omit=OMIT,
123
+ )
124
+ if 200 <= _response.status_code < 300:
125
+ return pydantic_v1.parse_obj_as(AthenaAssistantReponse, _response.json()) # type: ignore
126
+ if _response.status_code == 422:
127
+ raise UnprocessableEntityError(pydantic_v1.parse_obj_as(typing.Any, _response.json())) # type: ignore
128
+ try:
129
+ _response_json = _response.json()
130
+ except JSONDecodeError:
131
+ raise ApiError(status_code=_response.status_code, body=_response.text)
132
+ raise ApiError(status_code=_response.status_code, body=_response_json)
133
+
134
+ def stream_events(
135
+ self, *, request: AthenaAssistantRequest, request_options: typing.Optional[RequestOptions] = None
136
+ ) -> AthenaAssistantReponse:
137
+ """
138
+ Call the Athena assistant and stream events.
139
+
140
+ Parameters
141
+ ----------
142
+ request : AthenaAssistantRequest
143
+
144
+ request_options : typing.Optional[RequestOptions]
145
+ Request-specific configuration.
146
+
147
+ Returns
148
+ -------
149
+ AthenaAssistantReponse
150
+ Successful Response
151
+
152
+ Examples
153
+ --------
154
+ from athena import AthenaAssistantConfig, AthenaAssistantRequest, Tool
155
+ from athena.client import Athena
156
+
157
+ client = Athena(
158
+ api_key="YOUR_API_KEY",
159
+ )
160
+ client.agents.athena_assistant.stream_events(
161
+ request=AthenaAssistantRequest(
162
+ config=AthenaAssistantConfig(
163
+ enabled_tools=[Tool.SEARCH],
164
+ ),
165
+ messages=[],
166
+ ),
167
+ )
168
+ """
169
+ _response = self._client_wrapper.httpx_client.request(
170
+ "api/v0/agents/athena-assistant/stream_events",
171
+ method="POST",
172
+ json=request,
173
+ request_options=request_options,
174
+ omit=OMIT,
175
+ )
176
+ if 200 <= _response.status_code < 300:
177
+ return pydantic_v1.parse_obj_as(AthenaAssistantReponse, _response.json()) # type: ignore
178
+ if _response.status_code == 422:
179
+ raise UnprocessableEntityError(pydantic_v1.parse_obj_as(typing.Any, _response.json())) # type: ignore
180
+ try:
181
+ _response_json = _response.json()
182
+ except JSONDecodeError:
183
+ raise ApiError(status_code=_response.status_code, body=_response.text)
184
+ raise ApiError(status_code=_response.status_code, body=_response_json)
185
+
186
+
187
+ class AsyncAthenaAssistantClient:
188
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
189
+ self._client_wrapper = client_wrapper
190
+
191
+ async def batch(
192
+ self,
193
+ *,
194
+ request: typing.Sequence[AthenaAssistantRequest],
195
+ request_options: typing.Optional[RequestOptions] = None
196
+ ) -> typing.List[AthenaAssistantReponse]:
197
+ """
198
+ Call the Athena assistant with batched requests and return the results.
199
+
200
+ Parameters
201
+ ----------
202
+ request : typing.Sequence[AthenaAssistantRequest]
203
+
204
+ request_options : typing.Optional[RequestOptions]
205
+ Request-specific configuration.
206
+
207
+ Returns
208
+ -------
209
+ typing.List[AthenaAssistantReponse]
210
+ Successful Response
211
+
212
+ Examples
213
+ --------
214
+ from athena import AthenaAssistantConfig, AthenaAssistantRequest, Tool
215
+ from athena.client import AsyncAthena
216
+
217
+ client = AsyncAthena(
218
+ api_key="YOUR_API_KEY",
219
+ )
220
+ await client.agents.athena_assistant.batch(
221
+ request=[
222
+ AthenaAssistantRequest(
223
+ config=AthenaAssistantConfig(
224
+ enabled_tools=[Tool.SEARCH],
225
+ ),
226
+ messages=[],
227
+ )
228
+ ],
229
+ )
230
+ """
231
+ _response = await self._client_wrapper.httpx_client.request(
232
+ "api/v0/agents/athena-assistant/batch",
233
+ method="POST",
234
+ json=request,
235
+ request_options=request_options,
236
+ omit=OMIT,
237
+ )
238
+ if 200 <= _response.status_code < 300:
239
+ return pydantic_v1.parse_obj_as(typing.List[AthenaAssistantReponse], _response.json()) # type: ignore
240
+ if _response.status_code == 422:
241
+ raise UnprocessableEntityError(pydantic_v1.parse_obj_as(typing.Any, _response.json())) # type: ignore
242
+ try:
243
+ _response_json = _response.json()
244
+ except JSONDecodeError:
245
+ raise ApiError(status_code=_response.status_code, body=_response.text)
246
+ raise ApiError(status_code=_response.status_code, body=_response_json)
247
+
248
+ async def invoke(
249
+ self, *, request: AthenaAssistantRequest, request_options: typing.Optional[RequestOptions] = None
250
+ ) -> AthenaAssistantReponse:
251
+ """
252
+ Call the Athena Assistant agent synchronously.
253
+
254
+ Call the agent with the messages list, wait for the agent to complete,
255
+ and return the result.
256
+
257
+ Parameters
258
+ ----------
259
+ request : AthenaAssistantRequest
260
+
261
+ request_options : typing.Optional[RequestOptions]
262
+ Request-specific configuration.
263
+
264
+ Returns
265
+ -------
266
+ AthenaAssistantReponse
267
+ Successful Response
268
+
269
+ Examples
270
+ --------
271
+ from athena import AthenaAssistantConfig, AthenaAssistantRequest, Tool
272
+ from athena.client import AsyncAthena
273
+
274
+ client = AsyncAthena(
275
+ api_key="YOUR_API_KEY",
276
+ )
277
+ await client.agents.athena_assistant.invoke(
278
+ request=AthenaAssistantRequest(
279
+ config=AthenaAssistantConfig(
280
+ enabled_tools=[Tool.SEARCH],
281
+ ),
282
+ messages=[],
283
+ ),
284
+ )
285
+ """
286
+ _response = await self._client_wrapper.httpx_client.request(
287
+ "api/v0/agents/athena-assistant/invoke",
288
+ method="POST",
289
+ json=request,
290
+ request_options=request_options,
291
+ omit=OMIT,
292
+ )
293
+ if 200 <= _response.status_code < 300:
294
+ return pydantic_v1.parse_obj_as(AthenaAssistantReponse, _response.json()) # type: ignore
295
+ if _response.status_code == 422:
296
+ raise UnprocessableEntityError(pydantic_v1.parse_obj_as(typing.Any, _response.json())) # type: ignore
297
+ try:
298
+ _response_json = _response.json()
299
+ except JSONDecodeError:
300
+ raise ApiError(status_code=_response.status_code, body=_response.text)
301
+ raise ApiError(status_code=_response.status_code, body=_response_json)
302
+
303
+ async def stream_events(
304
+ self, *, request: AthenaAssistantRequest, request_options: typing.Optional[RequestOptions] = None
305
+ ) -> AthenaAssistantReponse:
306
+ """
307
+ Call the Athena assistant and stream events.
308
+
309
+ Parameters
310
+ ----------
311
+ request : AthenaAssistantRequest
312
+
313
+ request_options : typing.Optional[RequestOptions]
314
+ Request-specific configuration.
315
+
316
+ Returns
317
+ -------
318
+ AthenaAssistantReponse
319
+ Successful Response
320
+
321
+ Examples
322
+ --------
323
+ from athena import AthenaAssistantConfig, AthenaAssistantRequest, Tool
324
+ from athena.client import AsyncAthena
325
+
326
+ client = AsyncAthena(
327
+ api_key="YOUR_API_KEY",
328
+ )
329
+ await client.agents.athena_assistant.stream_events(
330
+ request=AthenaAssistantRequest(
331
+ config=AthenaAssistantConfig(
332
+ enabled_tools=[Tool.SEARCH],
333
+ ),
334
+ messages=[],
335
+ ),
336
+ )
337
+ """
338
+ _response = await self._client_wrapper.httpx_client.request(
339
+ "api/v0/agents/athena-assistant/stream_events",
340
+ method="POST",
341
+ json=request,
342
+ request_options=request_options,
343
+ omit=OMIT,
344
+ )
345
+ if 200 <= _response.status_code < 300:
346
+ return pydantic_v1.parse_obj_as(AthenaAssistantReponse, _response.json()) # type: ignore
347
+ if _response.status_code == 422:
348
+ raise UnprocessableEntityError(pydantic_v1.parse_obj_as(typing.Any, _response.json())) # type: ignore
349
+ try:
350
+ _response_json = _response.json()
351
+ except JSONDecodeError:
352
+ raise ApiError(status_code=_response.status_code, body=_response.text)
353
+ raise ApiError(status_code=_response.status_code, body=_response_json)
@@ -0,0 +1,19 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ from ..core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
4
+ from .athena_assistant.client import AsyncAthenaAssistantClient, AthenaAssistantClient
5
+ from .structured_data_extractor.client import AsyncStructuredDataExtractorClient, StructuredDataExtractorClient
6
+
7
+
8
+ class AgentsClient:
9
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
10
+ self._client_wrapper = client_wrapper
11
+ self.athena_assistant = AthenaAssistantClient(client_wrapper=self._client_wrapper)
12
+ self.structured_data_extractor = StructuredDataExtractorClient(client_wrapper=self._client_wrapper)
13
+
14
+
15
+ class AsyncAgentsClient:
16
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
17
+ self._client_wrapper = client_wrapper
18
+ self.athena_assistant = AsyncAthenaAssistantClient(client_wrapper=self._client_wrapper)
19
+ self.structured_data_extractor = AsyncStructuredDataExtractorClient(client_wrapper=self._client_wrapper)
@@ -0,0 +1,2 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
@@ -0,0 +1,150 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+ from json.decoder import JSONDecodeError
5
+
6
+ from ...core.api_error import ApiError
7
+ from ...core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
+ from ...core.pydantic_utilities import pydantic_v1
9
+ from ...core.request_options import RequestOptions
10
+ from ...errors.unprocessable_entity_error import UnprocessableEntityError
11
+ from ...types.structured_data_extractor_reponse import StructuredDataExtractorReponse
12
+
13
+ # this is used as the default value for optional parameters
14
+ OMIT = typing.cast(typing.Any, ...)
15
+
16
+
17
+ class StructuredDataExtractorClient:
18
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
19
+ self._client_wrapper = client_wrapper
20
+
21
+ def invoke(
22
+ self,
23
+ *,
24
+ asset_ids: typing.Sequence[str],
25
+ json_schema: typing.Dict[str, typing.Any],
26
+ map_: typing.Optional[bool] = OMIT,
27
+ reduce: typing.Optional[bool] = OMIT,
28
+ request_options: typing.Optional[RequestOptions] = None
29
+ ) -> StructuredDataExtractorReponse:
30
+ """
31
+ Coming soon! Extract structured data from assets of arbitrary length.
32
+
33
+ Parameters
34
+ ----------
35
+ asset_ids : typing.Sequence[str]
36
+ The IDs of the assets from which to extract structured data matching `json_schema`.
37
+
38
+ json_schema : typing.Dict[str, typing.Any]
39
+ The JSON schema to use for validation.
40
+
41
+ map_ : typing.Optional[bool]
42
+ Whether to split the asset into chunks and attempt to extract the schema from each chunk. Set to false if you know the asset is small.
43
+
44
+ reduce : typing.Optional[bool]
45
+ If `map`, whether to reduce the chunks to a single structured object (true) or return the full list (false). Use True unless you want to preserve duplicates from each page or expect the object to overflow the output context.
46
+
47
+ request_options : typing.Optional[RequestOptions]
48
+ Request-specific configuration.
49
+
50
+ Returns
51
+ -------
52
+ StructuredDataExtractorReponse
53
+ Successful Response
54
+
55
+ Examples
56
+ --------
57
+ from athena.client import Athena
58
+
59
+ client = Athena(
60
+ api_key="YOUR_API_KEY",
61
+ )
62
+ client.agents.structured_data_extractor.invoke(
63
+ asset_ids=["asset_ids"],
64
+ json_schema={"key": "value"},
65
+ )
66
+ """
67
+ _response = self._client_wrapper.httpx_client.request(
68
+ "api/v0/agents/structured-data-extractor/invoke",
69
+ method="POST",
70
+ json={"asset_ids": asset_ids, "json_schema": json_schema, "map": map_, "reduce": reduce},
71
+ request_options=request_options,
72
+ omit=OMIT,
73
+ )
74
+ if 200 <= _response.status_code < 300:
75
+ return pydantic_v1.parse_obj_as(StructuredDataExtractorReponse, _response.json()) # type: ignore
76
+ if _response.status_code == 422:
77
+ raise UnprocessableEntityError(pydantic_v1.parse_obj_as(typing.Any, _response.json())) # type: ignore
78
+ try:
79
+ _response_json = _response.json()
80
+ except JSONDecodeError:
81
+ raise ApiError(status_code=_response.status_code, body=_response.text)
82
+ raise ApiError(status_code=_response.status_code, body=_response_json)
83
+
84
+
85
+ class AsyncStructuredDataExtractorClient:
86
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
87
+ self._client_wrapper = client_wrapper
88
+
89
+ async def invoke(
90
+ self,
91
+ *,
92
+ asset_ids: typing.Sequence[str],
93
+ json_schema: typing.Dict[str, typing.Any],
94
+ map_: typing.Optional[bool] = OMIT,
95
+ reduce: typing.Optional[bool] = OMIT,
96
+ request_options: typing.Optional[RequestOptions] = None
97
+ ) -> StructuredDataExtractorReponse:
98
+ """
99
+ Coming soon! Extract structured data from assets of arbitrary length.
100
+
101
+ Parameters
102
+ ----------
103
+ asset_ids : typing.Sequence[str]
104
+ The IDs of the assets from which to extract structured data matching `json_schema`.
105
+
106
+ json_schema : typing.Dict[str, typing.Any]
107
+ The JSON schema to use for validation.
108
+
109
+ map_ : typing.Optional[bool]
110
+ Whether to split the asset into chunks and attempt to extract the schema from each chunk. Set to false if you know the asset is small.
111
+
112
+ reduce : typing.Optional[bool]
113
+ If `map`, whether to reduce the chunks to a single structured object (true) or return the full list (false). Use True unless you want to preserve duplicates from each page or expect the object to overflow the output context.
114
+
115
+ request_options : typing.Optional[RequestOptions]
116
+ Request-specific configuration.
117
+
118
+ Returns
119
+ -------
120
+ StructuredDataExtractorReponse
121
+ Successful Response
122
+
123
+ Examples
124
+ --------
125
+ from athena.client import AsyncAthena
126
+
127
+ client = AsyncAthena(
128
+ api_key="YOUR_API_KEY",
129
+ )
130
+ await client.agents.structured_data_extractor.invoke(
131
+ asset_ids=["asset_ids"],
132
+ json_schema={"key": "value"},
133
+ )
134
+ """
135
+ _response = await self._client_wrapper.httpx_client.request(
136
+ "api/v0/agents/structured-data-extractor/invoke",
137
+ method="POST",
138
+ json={"asset_ids": asset_ids, "json_schema": json_schema, "map": map_, "reduce": reduce},
139
+ request_options=request_options,
140
+ omit=OMIT,
141
+ )
142
+ if 200 <= _response.status_code < 300:
143
+ return pydantic_v1.parse_obj_as(StructuredDataExtractorReponse, _response.json()) # type: ignore
144
+ if _response.status_code == 422:
145
+ raise UnprocessableEntityError(pydantic_v1.parse_obj_as(typing.Any, _response.json())) # type: ignore
146
+ try:
147
+ _response_json = _response.json()
148
+ except JSONDecodeError:
149
+ raise ApiError(status_code=_response.status_code, body=_response.text)
150
+ raise ApiError(status_code=_response.status_code, body=_response_json)
@@ -4,6 +4,7 @@ import typing
4
4
 
5
5
  import httpx
6
6
 
7
+ from .agents.client import AgentsClient, AsyncAgentsClient
7
8
  from .core.client_wrapper import AsyncClientWrapper, SyncClientWrapper
8
9
  from .environment import AthenaEnvironment
9
10
  from .query.client import AsyncQueryClient, QueryClient
@@ -68,6 +69,7 @@ class BaseAthena:
68
69
  else httpx.Client(timeout=_defaulted_timeout),
69
70
  timeout=_defaulted_timeout,
70
71
  )
72
+ self.agents = AgentsClient(client_wrapper=self._client_wrapper)
71
73
  self.query = QueryClient(client_wrapper=self._client_wrapper)
72
74
  self.tools = ToolsClient(client_wrapper=self._client_wrapper)
73
75
 
@@ -130,6 +132,7 @@ class AsyncBaseAthena:
130
132
  else httpx.AsyncClient(timeout=_defaulted_timeout),
131
133
  timeout=_defaulted_timeout,
132
134
  )
135
+ self.agents = AsyncAgentsClient(client_wrapper=self._client_wrapper)
133
136
  self.query = AsyncQueryClient(client_wrapper=self._client_wrapper)
134
137
  self.tools = AsyncToolsClient(client_wrapper=self._client_wrapper)
135
138
 
@@ -17,7 +17,7 @@ class BaseClientWrapper:
17
17
  headers: typing.Dict[str, str] = {
18
18
  "X-Fern-Language": "Python",
19
19
  "X-Fern-SDK-Name": "athena-intelligence",
20
- "X-Fern-SDK-Version": "0.1.117",
20
+ "X-Fern-SDK-Version": "0.1.119",
21
21
  }
22
22
  headers["X-API-KEY"] = self.api_key
23
23
  return headers
@@ -32,7 +32,7 @@ class ToolsClient:
32
32
  def __init__(self, *, client_wrapper: SyncClientWrapper):
33
33
  self._client_wrapper = client_wrapper
34
34
 
35
- def get_file_chunks(
35
+ def get_asset_chunks(
36
36
  self, *, asset_ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
37
37
  ) -> FileChunkRequestOut:
38
38
  """
@@ -58,7 +58,7 @@ class ToolsClient:
58
58
  client = Athena(
59
59
  api_key="YOUR_API_KEY",
60
60
  )
61
- client.tools.get_file_chunks(
61
+ client.tools.get_asset_chunks(
62
62
  asset_ids=[
63
63
  "asset_9249292-d118-42d3-96b4-00eccfe0754f",
64
64
  "asset_9249292-d118-42d3-95b4-01eccfe0754f",
@@ -66,7 +66,7 @@ class ToolsClient:
66
66
  )
67
67
  """
68
68
  _response = self._client_wrapper.httpx_client.request(
69
- "api/v0/tools/file/chunks",
69
+ "api/v0/tools/asset/chunks",
70
70
  method="POST",
71
71
  json={"asset_ids": asset_ids},
72
72
  request_options=request_options,
@@ -95,7 +95,7 @@ class ToolsClient:
95
95
  columns: typing.Optional[
96
96
  typing.Union[ToolsDataFrameRequestColumnsItem, typing.Sequence[ToolsDataFrameRequestColumnsItem]]
97
97
  ] = None,
98
- sheet_name: typing.Optional[str] = None,
98
+ sheet_name: typing.Optional[int] = None,
99
99
  separator: typing.Optional[str] = None,
100
100
  request_options: typing.Optional[RequestOptions] = None
101
101
  ) -> DataFrameRequestOut:
@@ -111,7 +111,7 @@ class ToolsClient:
111
111
  columns : typing.Optional[typing.Union[ToolsDataFrameRequestColumnsItem, typing.Sequence[ToolsDataFrameRequestColumnsItem]]]
112
112
  should be a list of strings or a list of integers
113
113
 
114
- sheet_name : typing.Optional[str]
114
+ sheet_name : typing.Optional[int]
115
115
  only for excel files
116
116
 
117
117
  separator : typing.Optional[str]
@@ -281,7 +281,7 @@ class AsyncToolsClient:
281
281
  def __init__(self, *, client_wrapper: AsyncClientWrapper):
282
282
  self._client_wrapper = client_wrapper
283
283
 
284
- async def get_file_chunks(
284
+ async def get_asset_chunks(
285
285
  self, *, asset_ids: typing.Sequence[str], request_options: typing.Optional[RequestOptions] = None
286
286
  ) -> FileChunkRequestOut:
287
287
  """
@@ -307,7 +307,7 @@ class AsyncToolsClient:
307
307
  client = AsyncAthena(
308
308
  api_key="YOUR_API_KEY",
309
309
  )
310
- await client.tools.get_file_chunks(
310
+ await client.tools.get_asset_chunks(
311
311
  asset_ids=[
312
312
  "asset_9249292-d118-42d3-96b4-00eccfe0754f",
313
313
  "asset_9249292-d118-42d3-95b4-01eccfe0754f",
@@ -315,7 +315,7 @@ class AsyncToolsClient:
315
315
  )
316
316
  """
317
317
  _response = await self._client_wrapper.httpx_client.request(
318
- "api/v0/tools/file/chunks",
318
+ "api/v0/tools/asset/chunks",
319
319
  method="POST",
320
320
  json={"asset_ids": asset_ids},
321
321
  request_options=request_options,
@@ -344,7 +344,7 @@ class AsyncToolsClient:
344
344
  columns: typing.Optional[
345
345
  typing.Union[ToolsDataFrameRequestColumnsItem, typing.Sequence[ToolsDataFrameRequestColumnsItem]]
346
346
  ] = None,
347
- sheet_name: typing.Optional[str] = None,
347
+ sheet_name: typing.Optional[int] = None,
348
348
  separator: typing.Optional[str] = None,
349
349
  request_options: typing.Optional[RequestOptions] = None
350
350
  ) -> DataFrameRequestOut:
@@ -360,7 +360,7 @@ class AsyncToolsClient:
360
360
  columns : typing.Optional[typing.Union[ToolsDataFrameRequestColumnsItem, typing.Sequence[ToolsDataFrameRequestColumnsItem]]]
361
361
  should be a list of strings or a list of integers
362
362
 
363
- sheet_name : typing.Optional[str]
363
+ sheet_name : typing.Optional[int]
364
364
  only for excel files
365
365
 
366
366
  separator : typing.Optional[str]
@@ -1,6 +1,10 @@
1
1
  # This file was auto-generated by Fern from our API Definition.
2
2
 
3
3
  from .asset_not_found_error import AssetNotFoundError
4
+ from .athena_assistant_config import AthenaAssistantConfig
5
+ from .athena_assistant_config_enabled_tools_item import AthenaAssistantConfigEnabledToolsItem
6
+ from .athena_assistant_reponse import AthenaAssistantReponse
7
+ from .athena_assistant_request import AthenaAssistantRequest
4
8
  from .data_frame_request_out import DataFrameRequestOut
5
9
  from .data_frame_request_out_columns_item import DataFrameRequestOutColumnsItem
6
10
  from .data_frame_request_out_data_item_item import DataFrameRequestOutDataItemItem
@@ -11,9 +15,15 @@ from .file_chunk_request_out import FileChunkRequestOut
11
15
  from .file_too_large_error import FileTooLargeError
12
16
  from .parent_folder_error import ParentFolderError
13
17
  from .save_asset_request_out import SaveAssetRequestOut
18
+ from .structured_data_extractor_reponse import StructuredDataExtractorReponse
19
+ from .tool import Tool
14
20
 
15
21
  __all__ = [
16
22
  "AssetNotFoundError",
23
+ "AthenaAssistantConfig",
24
+ "AthenaAssistantConfigEnabledToolsItem",
25
+ "AthenaAssistantReponse",
26
+ "AthenaAssistantRequest",
17
27
  "DataFrameRequestOut",
18
28
  "DataFrameRequestOutColumnsItem",
19
29
  "DataFrameRequestOutDataItemItem",
@@ -24,4 +34,6 @@ __all__ = [
24
34
  "FileTooLargeError",
25
35
  "ParentFolderError",
26
36
  "SaveAssetRequestOut",
37
+ "StructuredDataExtractorReponse",
38
+ "Tool",
27
39
  ]
@@ -0,0 +1,36 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import datetime as dt
4
+ import typing
5
+
6
+ from ..core.datetime_utils import serialize_datetime
7
+ from ..core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
8
+ from .athena_assistant_config_enabled_tools_item import AthenaAssistantConfigEnabledToolsItem
9
+
10
+
11
+ class AthenaAssistantConfig(pydantic_v1.BaseModel):
12
+ """
13
+ Configurable fields for the general agent.
14
+ """
15
+
16
+ enabled_tools: typing.Optional[typing.List[AthenaAssistantConfigEnabledToolsItem]] = None
17
+ knowledge_base_asset_ids: typing.Optional[typing.List[str]] = None
18
+ system_prompt: typing.Optional[str] = None
19
+
20
+ def json(self, **kwargs: typing.Any) -> str:
21
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
22
+ return super().json(**kwargs_with_defaults)
23
+
24
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
25
+ kwargs_with_defaults_exclude_unset: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
26
+ kwargs_with_defaults_exclude_none: typing.Any = {"by_alias": True, "exclude_none": True, **kwargs}
27
+
28
+ return deep_union_pydantic_dicts(
29
+ super().dict(**kwargs_with_defaults_exclude_unset), super().dict(**kwargs_with_defaults_exclude_none)
30
+ )
31
+
32
+ class Config:
33
+ frozen = True
34
+ smart_union = True
35
+ extra = pydantic_v1.Extra.allow
36
+ json_encoders = {dt.datetime: serialize_datetime}
@@ -0,0 +1,7 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import typing
4
+
5
+ from .tool import Tool
6
+
7
+ AthenaAssistantConfigEnabledToolsItem = typing.Union[Tool, str]
@@ -0,0 +1,33 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import datetime as dt
4
+ import typing
5
+
6
+ from ..core.datetime_utils import serialize_datetime
7
+ from ..core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
8
+
9
+
10
+ class AthenaAssistantReponse(pydantic_v1.BaseModel):
11
+ """
12
+ The response from the assistant.
13
+ """
14
+
15
+ messages: typing.List[typing.Dict[str, typing.Any]]
16
+
17
+ def json(self, **kwargs: typing.Any) -> str:
18
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
19
+ return super().json(**kwargs_with_defaults)
20
+
21
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
22
+ kwargs_with_defaults_exclude_unset: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
23
+ kwargs_with_defaults_exclude_none: typing.Any = {"by_alias": True, "exclude_none": True, **kwargs}
24
+
25
+ return deep_union_pydantic_dicts(
26
+ super().dict(**kwargs_with_defaults_exclude_unset), super().dict(**kwargs_with_defaults_exclude_none)
27
+ )
28
+
29
+ class Config:
30
+ frozen = True
31
+ smart_union = True
32
+ extra = pydantic_v1.Extra.allow
33
+ json_encoders = {dt.datetime: serialize_datetime}
@@ -0,0 +1,38 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import datetime as dt
4
+ import typing
5
+
6
+ from ..core.datetime_utils import serialize_datetime
7
+ from ..core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
8
+ from .athena_assistant_config import AthenaAssistantConfig
9
+
10
+
11
+ class AthenaAssistantRequest(pydantic_v1.BaseModel):
12
+ """
13
+ A chat request for the Athena SDK.
14
+ """
15
+
16
+ config: AthenaAssistantConfig
17
+ messages: typing.List[typing.Any] = pydantic_v1.Field()
18
+ """
19
+ The messages to send to the assistant. Each message should be a string (for text inputs) or a list of multimodal content parts.
20
+ """
21
+
22
+ def json(self, **kwargs: typing.Any) -> str:
23
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
24
+ return super().json(**kwargs_with_defaults)
25
+
26
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
27
+ kwargs_with_defaults_exclude_unset: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
28
+ kwargs_with_defaults_exclude_none: typing.Any = {"by_alias": True, "exclude_none": True, **kwargs}
29
+
30
+ return deep_union_pydantic_dicts(
31
+ super().dict(**kwargs_with_defaults_exclude_unset), super().dict(**kwargs_with_defaults_exclude_none)
32
+ )
33
+
34
+ class Config:
35
+ frozen = True
36
+ smart_union = True
37
+ extra = pydantic_v1.Extra.allow
38
+ json_encoders = {dt.datetime: serialize_datetime}
@@ -0,0 +1,36 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import datetime as dt
4
+ import typing
5
+
6
+ from ..core.datetime_utils import serialize_datetime
7
+ from ..core.pydantic_utilities import deep_union_pydantic_dicts, pydantic_v1
8
+
9
+
10
+ class StructuredDataExtractorReponse(pydantic_v1.BaseModel):
11
+ """
12
+ The agent's response.
13
+ """
14
+
15
+ data: typing.Dict[str, typing.Any] = pydantic_v1.Field()
16
+ """
17
+ The extracted structured data. Guaranteed to match `json_schema`.
18
+ """
19
+
20
+ def json(self, **kwargs: typing.Any) -> str:
21
+ kwargs_with_defaults: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
22
+ return super().json(**kwargs_with_defaults)
23
+
24
+ def dict(self, **kwargs: typing.Any) -> typing.Dict[str, typing.Any]:
25
+ kwargs_with_defaults_exclude_unset: typing.Any = {"by_alias": True, "exclude_unset": True, **kwargs}
26
+ kwargs_with_defaults_exclude_none: typing.Any = {"by_alias": True, "exclude_none": True, **kwargs}
27
+
28
+ return deep_union_pydantic_dicts(
29
+ super().dict(**kwargs_with_defaults_exclude_unset), super().dict(**kwargs_with_defaults_exclude_none)
30
+ )
31
+
32
+ class Config:
33
+ frozen = True
34
+ smart_union = True
35
+ extra = pydantic_v1.Extra.allow
36
+ json_encoders = {dt.datetime: serialize_datetime}
@@ -0,0 +1,17 @@
1
+ # This file was auto-generated by Fern from our API Definition.
2
+
3
+ import enum
4
+ import typing
5
+
6
+ T_Result = typing.TypeVar("T_Result")
7
+
8
+
9
+ class Tool(str, enum.Enum):
10
+ SEARCH = "search"
11
+ BROWSE = "browse"
12
+
13
+ def visit(self, search: typing.Callable[[], T_Result], browse: typing.Callable[[], T_Result]) -> T_Result:
14
+ if self is Tool.SEARCH:
15
+ return search()
16
+ if self is Tool.BROWSE:
17
+ return browse()