robosystems-client 0.2.12__py3-none-any.whl → 0.2.13__py3-none-any.whl
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.
Potentially problematic release.
This version of robosystems-client might be problematic. Click here for more details.
- robosystems_client/api/agent/auto_select_agent.py +81 -9
- robosystems_client/api/agent/execute_specific_agent.py +73 -5
- robosystems_client/api/agent/get_agent_metadata.py +1 -1
- robosystems_client/api/agent/list_agents.py +1 -1
- robosystems_client/api/credits_/list_credit_transactions.py +4 -4
- robosystems_client/extensions/__init__.py +25 -0
- robosystems_client/extensions/agent_client.py +526 -0
- robosystems_client/extensions/extensions.py +3 -0
- robosystems_client/models/checkout_status_response.py +2 -1
- robosystems_client/models/create_checkout_request.py +2 -1
- robosystems_client/models/create_checkout_request_resource_config.py +4 -1
- {robosystems_client-0.2.12.dist-info → robosystems_client-0.2.13.dist-info}/METADATA +1 -1
- {robosystems_client-0.2.12.dist-info → robosystems_client-0.2.13.dist-info}/RECORD +15 -14
- {robosystems_client-0.2.12.dist-info → robosystems_client-0.2.13.dist-info}/WHEEL +0 -0
- {robosystems_client-0.2.12.dist-info → robosystems_client-0.2.13.dist-info}/licenses/LICENSE +0 -0
|
@@ -9,19 +9,35 @@ from ...models.agent_request import AgentRequest
|
|
|
9
9
|
from ...models.agent_response import AgentResponse
|
|
10
10
|
from ...models.error_response import ErrorResponse
|
|
11
11
|
from ...models.http_validation_error import HTTPValidationError
|
|
12
|
-
from ...
|
|
12
|
+
from ...models.response_mode import ResponseMode
|
|
13
|
+
from ...types import UNSET, Response, Unset
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
def _get_kwargs(
|
|
16
17
|
graph_id: str,
|
|
17
18
|
*,
|
|
18
19
|
body: AgentRequest,
|
|
20
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
19
21
|
) -> dict[str, Any]:
|
|
20
22
|
headers: dict[str, Any] = {}
|
|
21
23
|
|
|
24
|
+
params: dict[str, Any] = {}
|
|
25
|
+
|
|
26
|
+
json_mode: Union[None, Unset, str]
|
|
27
|
+
if isinstance(mode, Unset):
|
|
28
|
+
json_mode = UNSET
|
|
29
|
+
elif isinstance(mode, ResponseMode):
|
|
30
|
+
json_mode = mode.value
|
|
31
|
+
else:
|
|
32
|
+
json_mode = mode
|
|
33
|
+
params["mode"] = json_mode
|
|
34
|
+
|
|
35
|
+
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
|
|
36
|
+
|
|
22
37
|
_kwargs: dict[str, Any] = {
|
|
23
38
|
"method": "post",
|
|
24
39
|
"url": f"/v1/graphs/{graph_id}/agent",
|
|
40
|
+
"params": params,
|
|
25
41
|
}
|
|
26
42
|
|
|
27
43
|
_kwargs["json"] = body.to_dict()
|
|
@@ -40,6 +56,10 @@ def _parse_response(
|
|
|
40
56
|
|
|
41
57
|
return response_200
|
|
42
58
|
|
|
59
|
+
if response.status_code == 202:
|
|
60
|
+
response_202 = cast(Any, None)
|
|
61
|
+
return response_202
|
|
62
|
+
|
|
43
63
|
if response.status_code == 400:
|
|
44
64
|
response_400 = cast(Any, None)
|
|
45
65
|
return response_400
|
|
@@ -84,10 +104,11 @@ def sync_detailed(
|
|
|
84
104
|
*,
|
|
85
105
|
client: AuthenticatedClient,
|
|
86
106
|
body: AgentRequest,
|
|
107
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
87
108
|
) -> Response[Union[AgentResponse, Any, ErrorResponse, HTTPValidationError]]:
|
|
88
109
|
r"""Auto-select agent for query
|
|
89
110
|
|
|
90
|
-
Automatically select the best agent for your query.
|
|
111
|
+
Automatically select the best agent for your query with intelligent execution strategy.
|
|
91
112
|
|
|
92
113
|
**Agent Selection Process:**
|
|
93
114
|
|
|
@@ -96,7 +117,8 @@ def sync_detailed(
|
|
|
96
117
|
2. Enriching context with RAG if enabled
|
|
97
118
|
3. Evaluating all available agents against selection criteria
|
|
98
119
|
4. Selecting the best match based on confidence scores
|
|
99
|
-
5.
|
|
120
|
+
5. Choosing execution strategy (sync/SSE/async) based on expected time
|
|
121
|
+
6. Executing the query with the selected agent
|
|
100
122
|
|
|
101
123
|
**Available Agent Types:**
|
|
102
124
|
- `financial`: Financial analysis, SEC filings, company metrics
|
|
@@ -109,6 +131,14 @@ def sync_detailed(
|
|
|
109
131
|
- `extended`: Comprehensive analysis (~15-60s), deep research
|
|
110
132
|
- `streaming`: Real-time response streaming
|
|
111
133
|
|
|
134
|
+
**Execution Strategies (automatic):**
|
|
135
|
+
- Fast operations (<5s): Immediate synchronous response
|
|
136
|
+
- Medium operations (5-30s): SSE streaming with progress updates
|
|
137
|
+
- Long operations (>30s): Async Celery worker with operation tracking
|
|
138
|
+
|
|
139
|
+
**Response Mode Override:**
|
|
140
|
+
Use query parameter `?mode=sync|async` to override automatic strategy selection.
|
|
141
|
+
|
|
112
142
|
**Confidence Score Interpretation:**
|
|
113
143
|
- `0.9-1.0`: High confidence, agent is ideal match
|
|
114
144
|
- `0.7-0.9`: Good confidence, agent is suitable
|
|
@@ -132,6 +162,8 @@ def sync_detailed(
|
|
|
132
162
|
|
|
133
163
|
Args:
|
|
134
164
|
graph_id (str):
|
|
165
|
+
mode (Union[None, ResponseMode, Unset]): Override execution mode: sync, async, stream, or
|
|
166
|
+
auto
|
|
135
167
|
body (AgentRequest): Request model for agent interactions.
|
|
136
168
|
|
|
137
169
|
Raises:
|
|
@@ -145,6 +177,7 @@ def sync_detailed(
|
|
|
145
177
|
kwargs = _get_kwargs(
|
|
146
178
|
graph_id=graph_id,
|
|
147
179
|
body=body,
|
|
180
|
+
mode=mode,
|
|
148
181
|
)
|
|
149
182
|
|
|
150
183
|
response = client.get_httpx_client().request(
|
|
@@ -159,10 +192,11 @@ def sync(
|
|
|
159
192
|
*,
|
|
160
193
|
client: AuthenticatedClient,
|
|
161
194
|
body: AgentRequest,
|
|
195
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
162
196
|
) -> Optional[Union[AgentResponse, Any, ErrorResponse, HTTPValidationError]]:
|
|
163
197
|
r"""Auto-select agent for query
|
|
164
198
|
|
|
165
|
-
Automatically select the best agent for your query.
|
|
199
|
+
Automatically select the best agent for your query with intelligent execution strategy.
|
|
166
200
|
|
|
167
201
|
**Agent Selection Process:**
|
|
168
202
|
|
|
@@ -171,7 +205,8 @@ def sync(
|
|
|
171
205
|
2. Enriching context with RAG if enabled
|
|
172
206
|
3. Evaluating all available agents against selection criteria
|
|
173
207
|
4. Selecting the best match based on confidence scores
|
|
174
|
-
5.
|
|
208
|
+
5. Choosing execution strategy (sync/SSE/async) based on expected time
|
|
209
|
+
6. Executing the query with the selected agent
|
|
175
210
|
|
|
176
211
|
**Available Agent Types:**
|
|
177
212
|
- `financial`: Financial analysis, SEC filings, company metrics
|
|
@@ -184,6 +219,14 @@ def sync(
|
|
|
184
219
|
- `extended`: Comprehensive analysis (~15-60s), deep research
|
|
185
220
|
- `streaming`: Real-time response streaming
|
|
186
221
|
|
|
222
|
+
**Execution Strategies (automatic):**
|
|
223
|
+
- Fast operations (<5s): Immediate synchronous response
|
|
224
|
+
- Medium operations (5-30s): SSE streaming with progress updates
|
|
225
|
+
- Long operations (>30s): Async Celery worker with operation tracking
|
|
226
|
+
|
|
227
|
+
**Response Mode Override:**
|
|
228
|
+
Use query parameter `?mode=sync|async` to override automatic strategy selection.
|
|
229
|
+
|
|
187
230
|
**Confidence Score Interpretation:**
|
|
188
231
|
- `0.9-1.0`: High confidence, agent is ideal match
|
|
189
232
|
- `0.7-0.9`: Good confidence, agent is suitable
|
|
@@ -207,6 +250,8 @@ def sync(
|
|
|
207
250
|
|
|
208
251
|
Args:
|
|
209
252
|
graph_id (str):
|
|
253
|
+
mode (Union[None, ResponseMode, Unset]): Override execution mode: sync, async, stream, or
|
|
254
|
+
auto
|
|
210
255
|
body (AgentRequest): Request model for agent interactions.
|
|
211
256
|
|
|
212
257
|
Raises:
|
|
@@ -221,6 +266,7 @@ def sync(
|
|
|
221
266
|
graph_id=graph_id,
|
|
222
267
|
client=client,
|
|
223
268
|
body=body,
|
|
269
|
+
mode=mode,
|
|
224
270
|
).parsed
|
|
225
271
|
|
|
226
272
|
|
|
@@ -229,10 +275,11 @@ async def asyncio_detailed(
|
|
|
229
275
|
*,
|
|
230
276
|
client: AuthenticatedClient,
|
|
231
277
|
body: AgentRequest,
|
|
278
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
232
279
|
) -> Response[Union[AgentResponse, Any, ErrorResponse, HTTPValidationError]]:
|
|
233
280
|
r"""Auto-select agent for query
|
|
234
281
|
|
|
235
|
-
Automatically select the best agent for your query.
|
|
282
|
+
Automatically select the best agent for your query with intelligent execution strategy.
|
|
236
283
|
|
|
237
284
|
**Agent Selection Process:**
|
|
238
285
|
|
|
@@ -241,7 +288,8 @@ async def asyncio_detailed(
|
|
|
241
288
|
2. Enriching context with RAG if enabled
|
|
242
289
|
3. Evaluating all available agents against selection criteria
|
|
243
290
|
4. Selecting the best match based on confidence scores
|
|
244
|
-
5.
|
|
291
|
+
5. Choosing execution strategy (sync/SSE/async) based on expected time
|
|
292
|
+
6. Executing the query with the selected agent
|
|
245
293
|
|
|
246
294
|
**Available Agent Types:**
|
|
247
295
|
- `financial`: Financial analysis, SEC filings, company metrics
|
|
@@ -254,6 +302,14 @@ async def asyncio_detailed(
|
|
|
254
302
|
- `extended`: Comprehensive analysis (~15-60s), deep research
|
|
255
303
|
- `streaming`: Real-time response streaming
|
|
256
304
|
|
|
305
|
+
**Execution Strategies (automatic):**
|
|
306
|
+
- Fast operations (<5s): Immediate synchronous response
|
|
307
|
+
- Medium operations (5-30s): SSE streaming with progress updates
|
|
308
|
+
- Long operations (>30s): Async Celery worker with operation tracking
|
|
309
|
+
|
|
310
|
+
**Response Mode Override:**
|
|
311
|
+
Use query parameter `?mode=sync|async` to override automatic strategy selection.
|
|
312
|
+
|
|
257
313
|
**Confidence Score Interpretation:**
|
|
258
314
|
- `0.9-1.0`: High confidence, agent is ideal match
|
|
259
315
|
- `0.7-0.9`: Good confidence, agent is suitable
|
|
@@ -277,6 +333,8 @@ async def asyncio_detailed(
|
|
|
277
333
|
|
|
278
334
|
Args:
|
|
279
335
|
graph_id (str):
|
|
336
|
+
mode (Union[None, ResponseMode, Unset]): Override execution mode: sync, async, stream, or
|
|
337
|
+
auto
|
|
280
338
|
body (AgentRequest): Request model for agent interactions.
|
|
281
339
|
|
|
282
340
|
Raises:
|
|
@@ -290,6 +348,7 @@ async def asyncio_detailed(
|
|
|
290
348
|
kwargs = _get_kwargs(
|
|
291
349
|
graph_id=graph_id,
|
|
292
350
|
body=body,
|
|
351
|
+
mode=mode,
|
|
293
352
|
)
|
|
294
353
|
|
|
295
354
|
response = await client.get_async_httpx_client().request(**kwargs)
|
|
@@ -302,10 +361,11 @@ async def asyncio(
|
|
|
302
361
|
*,
|
|
303
362
|
client: AuthenticatedClient,
|
|
304
363
|
body: AgentRequest,
|
|
364
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
305
365
|
) -> Optional[Union[AgentResponse, Any, ErrorResponse, HTTPValidationError]]:
|
|
306
366
|
r"""Auto-select agent for query
|
|
307
367
|
|
|
308
|
-
Automatically select the best agent for your query.
|
|
368
|
+
Automatically select the best agent for your query with intelligent execution strategy.
|
|
309
369
|
|
|
310
370
|
**Agent Selection Process:**
|
|
311
371
|
|
|
@@ -314,7 +374,8 @@ async def asyncio(
|
|
|
314
374
|
2. Enriching context with RAG if enabled
|
|
315
375
|
3. Evaluating all available agents against selection criteria
|
|
316
376
|
4. Selecting the best match based on confidence scores
|
|
317
|
-
5.
|
|
377
|
+
5. Choosing execution strategy (sync/SSE/async) based on expected time
|
|
378
|
+
6. Executing the query with the selected agent
|
|
318
379
|
|
|
319
380
|
**Available Agent Types:**
|
|
320
381
|
- `financial`: Financial analysis, SEC filings, company metrics
|
|
@@ -327,6 +388,14 @@ async def asyncio(
|
|
|
327
388
|
- `extended`: Comprehensive analysis (~15-60s), deep research
|
|
328
389
|
- `streaming`: Real-time response streaming
|
|
329
390
|
|
|
391
|
+
**Execution Strategies (automatic):**
|
|
392
|
+
- Fast operations (<5s): Immediate synchronous response
|
|
393
|
+
- Medium operations (5-30s): SSE streaming with progress updates
|
|
394
|
+
- Long operations (>30s): Async Celery worker with operation tracking
|
|
395
|
+
|
|
396
|
+
**Response Mode Override:**
|
|
397
|
+
Use query parameter `?mode=sync|async` to override automatic strategy selection.
|
|
398
|
+
|
|
330
399
|
**Confidence Score Interpretation:**
|
|
331
400
|
- `0.9-1.0`: High confidence, agent is ideal match
|
|
332
401
|
- `0.7-0.9`: Good confidence, agent is suitable
|
|
@@ -350,6 +419,8 @@ async def asyncio(
|
|
|
350
419
|
|
|
351
420
|
Args:
|
|
352
421
|
graph_id (str):
|
|
422
|
+
mode (Union[None, ResponseMode, Unset]): Override execution mode: sync, async, stream, or
|
|
423
|
+
auto
|
|
353
424
|
body (AgentRequest): Request model for agent interactions.
|
|
354
425
|
|
|
355
426
|
Raises:
|
|
@@ -365,5 +436,6 @@ async def asyncio(
|
|
|
365
436
|
graph_id=graph_id,
|
|
366
437
|
client=client,
|
|
367
438
|
body=body,
|
|
439
|
+
mode=mode,
|
|
368
440
|
)
|
|
369
441
|
).parsed
|
|
@@ -9,7 +9,8 @@ from ...models.agent_request import AgentRequest
|
|
|
9
9
|
from ...models.agent_response import AgentResponse
|
|
10
10
|
from ...models.error_response import ErrorResponse
|
|
11
11
|
from ...models.http_validation_error import HTTPValidationError
|
|
12
|
-
from ...
|
|
12
|
+
from ...models.response_mode import ResponseMode
|
|
13
|
+
from ...types import UNSET, Response, Unset
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
def _get_kwargs(
|
|
@@ -17,12 +18,27 @@ def _get_kwargs(
|
|
|
17
18
|
agent_type: str,
|
|
18
19
|
*,
|
|
19
20
|
body: AgentRequest,
|
|
21
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
20
22
|
) -> dict[str, Any]:
|
|
21
23
|
headers: dict[str, Any] = {}
|
|
22
24
|
|
|
25
|
+
params: dict[str, Any] = {}
|
|
26
|
+
|
|
27
|
+
json_mode: Union[None, Unset, str]
|
|
28
|
+
if isinstance(mode, Unset):
|
|
29
|
+
json_mode = UNSET
|
|
30
|
+
elif isinstance(mode, ResponseMode):
|
|
31
|
+
json_mode = mode.value
|
|
32
|
+
else:
|
|
33
|
+
json_mode = mode
|
|
34
|
+
params["mode"] = json_mode
|
|
35
|
+
|
|
36
|
+
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
|
|
37
|
+
|
|
23
38
|
_kwargs: dict[str, Any] = {
|
|
24
39
|
"method": "post",
|
|
25
40
|
"url": f"/v1/graphs/{graph_id}/agent/{agent_type}",
|
|
41
|
+
"params": params,
|
|
26
42
|
}
|
|
27
43
|
|
|
28
44
|
_kwargs["json"] = body.to_dict()
|
|
@@ -41,6 +57,10 @@ def _parse_response(
|
|
|
41
57
|
|
|
42
58
|
return response_200
|
|
43
59
|
|
|
60
|
+
if response.status_code == 202:
|
|
61
|
+
response_202 = cast(Any, None)
|
|
62
|
+
return response_202
|
|
63
|
+
|
|
44
64
|
if response.status_code == 400:
|
|
45
65
|
response_400 = cast(Any, None)
|
|
46
66
|
return response_400
|
|
@@ -90,21 +110,32 @@ def sync_detailed(
|
|
|
90
110
|
*,
|
|
91
111
|
client: AuthenticatedClient,
|
|
92
112
|
body: AgentRequest,
|
|
113
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
93
114
|
) -> Response[Union[AgentResponse, Any, ErrorResponse, HTTPValidationError]]:
|
|
94
115
|
"""Execute specific agent
|
|
95
116
|
|
|
96
|
-
Execute a specific agent type directly.
|
|
117
|
+
Execute a specific agent type directly with intelligent execution strategy.
|
|
97
118
|
|
|
98
119
|
Available agents:
|
|
99
120
|
- **financial**: Financial analysis, SEC filings, accounting data
|
|
100
121
|
- **research**: Deep research and comprehensive analysis
|
|
101
122
|
- **rag**: Fast retrieval without AI (no credits required)
|
|
102
123
|
|
|
124
|
+
**Execution Strategies (automatic):**
|
|
125
|
+
- Fast operations (<5s): Immediate synchronous response
|
|
126
|
+
- Medium operations (5-30s): SSE streaming with progress updates
|
|
127
|
+
- Long operations (>30s): Async Celery worker with operation tracking
|
|
128
|
+
|
|
129
|
+
**Response Mode Override:**
|
|
130
|
+
Use query parameter `?mode=sync|async` to override automatic strategy selection.
|
|
131
|
+
|
|
103
132
|
Use this endpoint when you know which agent you want to use.
|
|
104
133
|
|
|
105
134
|
Args:
|
|
106
135
|
graph_id (str):
|
|
107
136
|
agent_type (str):
|
|
137
|
+
mode (Union[None, ResponseMode, Unset]): Override execution mode: sync, async, stream, or
|
|
138
|
+
auto
|
|
108
139
|
body (AgentRequest): Request model for agent interactions.
|
|
109
140
|
|
|
110
141
|
Raises:
|
|
@@ -119,6 +150,7 @@ def sync_detailed(
|
|
|
119
150
|
graph_id=graph_id,
|
|
120
151
|
agent_type=agent_type,
|
|
121
152
|
body=body,
|
|
153
|
+
mode=mode,
|
|
122
154
|
)
|
|
123
155
|
|
|
124
156
|
response = client.get_httpx_client().request(
|
|
@@ -134,21 +166,32 @@ def sync(
|
|
|
134
166
|
*,
|
|
135
167
|
client: AuthenticatedClient,
|
|
136
168
|
body: AgentRequest,
|
|
169
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
137
170
|
) -> Optional[Union[AgentResponse, Any, ErrorResponse, HTTPValidationError]]:
|
|
138
171
|
"""Execute specific agent
|
|
139
172
|
|
|
140
|
-
Execute a specific agent type directly.
|
|
173
|
+
Execute a specific agent type directly with intelligent execution strategy.
|
|
141
174
|
|
|
142
175
|
Available agents:
|
|
143
176
|
- **financial**: Financial analysis, SEC filings, accounting data
|
|
144
177
|
- **research**: Deep research and comprehensive analysis
|
|
145
178
|
- **rag**: Fast retrieval without AI (no credits required)
|
|
146
179
|
|
|
180
|
+
**Execution Strategies (automatic):**
|
|
181
|
+
- Fast operations (<5s): Immediate synchronous response
|
|
182
|
+
- Medium operations (5-30s): SSE streaming with progress updates
|
|
183
|
+
- Long operations (>30s): Async Celery worker with operation tracking
|
|
184
|
+
|
|
185
|
+
**Response Mode Override:**
|
|
186
|
+
Use query parameter `?mode=sync|async` to override automatic strategy selection.
|
|
187
|
+
|
|
147
188
|
Use this endpoint when you know which agent you want to use.
|
|
148
189
|
|
|
149
190
|
Args:
|
|
150
191
|
graph_id (str):
|
|
151
192
|
agent_type (str):
|
|
193
|
+
mode (Union[None, ResponseMode, Unset]): Override execution mode: sync, async, stream, or
|
|
194
|
+
auto
|
|
152
195
|
body (AgentRequest): Request model for agent interactions.
|
|
153
196
|
|
|
154
197
|
Raises:
|
|
@@ -164,6 +207,7 @@ def sync(
|
|
|
164
207
|
agent_type=agent_type,
|
|
165
208
|
client=client,
|
|
166
209
|
body=body,
|
|
210
|
+
mode=mode,
|
|
167
211
|
).parsed
|
|
168
212
|
|
|
169
213
|
|
|
@@ -173,21 +217,32 @@ async def asyncio_detailed(
|
|
|
173
217
|
*,
|
|
174
218
|
client: AuthenticatedClient,
|
|
175
219
|
body: AgentRequest,
|
|
220
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
176
221
|
) -> Response[Union[AgentResponse, Any, ErrorResponse, HTTPValidationError]]:
|
|
177
222
|
"""Execute specific agent
|
|
178
223
|
|
|
179
|
-
Execute a specific agent type directly.
|
|
224
|
+
Execute a specific agent type directly with intelligent execution strategy.
|
|
180
225
|
|
|
181
226
|
Available agents:
|
|
182
227
|
- **financial**: Financial analysis, SEC filings, accounting data
|
|
183
228
|
- **research**: Deep research and comprehensive analysis
|
|
184
229
|
- **rag**: Fast retrieval without AI (no credits required)
|
|
185
230
|
|
|
231
|
+
**Execution Strategies (automatic):**
|
|
232
|
+
- Fast operations (<5s): Immediate synchronous response
|
|
233
|
+
- Medium operations (5-30s): SSE streaming with progress updates
|
|
234
|
+
- Long operations (>30s): Async Celery worker with operation tracking
|
|
235
|
+
|
|
236
|
+
**Response Mode Override:**
|
|
237
|
+
Use query parameter `?mode=sync|async` to override automatic strategy selection.
|
|
238
|
+
|
|
186
239
|
Use this endpoint when you know which agent you want to use.
|
|
187
240
|
|
|
188
241
|
Args:
|
|
189
242
|
graph_id (str):
|
|
190
243
|
agent_type (str):
|
|
244
|
+
mode (Union[None, ResponseMode, Unset]): Override execution mode: sync, async, stream, or
|
|
245
|
+
auto
|
|
191
246
|
body (AgentRequest): Request model for agent interactions.
|
|
192
247
|
|
|
193
248
|
Raises:
|
|
@@ -202,6 +257,7 @@ async def asyncio_detailed(
|
|
|
202
257
|
graph_id=graph_id,
|
|
203
258
|
agent_type=agent_type,
|
|
204
259
|
body=body,
|
|
260
|
+
mode=mode,
|
|
205
261
|
)
|
|
206
262
|
|
|
207
263
|
response = await client.get_async_httpx_client().request(**kwargs)
|
|
@@ -215,21 +271,32 @@ async def asyncio(
|
|
|
215
271
|
*,
|
|
216
272
|
client: AuthenticatedClient,
|
|
217
273
|
body: AgentRequest,
|
|
274
|
+
mode: Union[None, ResponseMode, Unset] = UNSET,
|
|
218
275
|
) -> Optional[Union[AgentResponse, Any, ErrorResponse, HTTPValidationError]]:
|
|
219
276
|
"""Execute specific agent
|
|
220
277
|
|
|
221
|
-
Execute a specific agent type directly.
|
|
278
|
+
Execute a specific agent type directly with intelligent execution strategy.
|
|
222
279
|
|
|
223
280
|
Available agents:
|
|
224
281
|
- **financial**: Financial analysis, SEC filings, accounting data
|
|
225
282
|
- **research**: Deep research and comprehensive analysis
|
|
226
283
|
- **rag**: Fast retrieval without AI (no credits required)
|
|
227
284
|
|
|
285
|
+
**Execution Strategies (automatic):**
|
|
286
|
+
- Fast operations (<5s): Immediate synchronous response
|
|
287
|
+
- Medium operations (5-30s): SSE streaming with progress updates
|
|
288
|
+
- Long operations (>30s): Async Celery worker with operation tracking
|
|
289
|
+
|
|
290
|
+
**Response Mode Override:**
|
|
291
|
+
Use query parameter `?mode=sync|async` to override automatic strategy selection.
|
|
292
|
+
|
|
228
293
|
Use this endpoint when you know which agent you want to use.
|
|
229
294
|
|
|
230
295
|
Args:
|
|
231
296
|
graph_id (str):
|
|
232
297
|
agent_type (str):
|
|
298
|
+
mode (Union[None, ResponseMode, Unset]): Override execution mode: sync, async, stream, or
|
|
299
|
+
auto
|
|
233
300
|
body (AgentRequest): Request model for agent interactions.
|
|
234
301
|
|
|
235
302
|
Raises:
|
|
@@ -246,5 +313,6 @@ async def asyncio(
|
|
|
246
313
|
agent_type=agent_type,
|
|
247
314
|
client=client,
|
|
248
315
|
body=body,
|
|
316
|
+
mode=mode,
|
|
249
317
|
)
|
|
250
318
|
).parsed
|
|
@@ -141,7 +141,7 @@ def sync_detailed(
|
|
|
141
141
|
No credits are consumed for viewing transaction history.
|
|
142
142
|
|
|
143
143
|
Args:
|
|
144
|
-
graph_id (str):
|
|
144
|
+
graph_id (str): Graph database identifier
|
|
145
145
|
transaction_type (Union[None, Unset, str]): Filter by transaction type (allocation,
|
|
146
146
|
consumption, bonus, refund)
|
|
147
147
|
operation_type (Union[None, Unset, str]): Filter by operation type (e.g., entity_lookup,
|
|
@@ -206,7 +206,7 @@ def sync(
|
|
|
206
206
|
No credits are consumed for viewing transaction history.
|
|
207
207
|
|
|
208
208
|
Args:
|
|
209
|
-
graph_id (str):
|
|
209
|
+
graph_id (str): Graph database identifier
|
|
210
210
|
transaction_type (Union[None, Unset, str]): Filter by transaction type (allocation,
|
|
211
211
|
consumption, bonus, refund)
|
|
212
212
|
operation_type (Union[None, Unset, str]): Filter by operation type (e.g., entity_lookup,
|
|
@@ -266,7 +266,7 @@ async def asyncio_detailed(
|
|
|
266
266
|
No credits are consumed for viewing transaction history.
|
|
267
267
|
|
|
268
268
|
Args:
|
|
269
|
-
graph_id (str):
|
|
269
|
+
graph_id (str): Graph database identifier
|
|
270
270
|
transaction_type (Union[None, Unset, str]): Filter by transaction type (allocation,
|
|
271
271
|
consumption, bonus, refund)
|
|
272
272
|
operation_type (Union[None, Unset, str]): Filter by operation type (e.g., entity_lookup,
|
|
@@ -329,7 +329,7 @@ async def asyncio(
|
|
|
329
329
|
No credits are consumed for viewing transaction history.
|
|
330
330
|
|
|
331
331
|
Args:
|
|
332
|
-
graph_id (str):
|
|
332
|
+
graph_id (str): Graph database identifier
|
|
333
333
|
transaction_type (Union[None, Unset, str]): Filter by transaction type (allocation,
|
|
334
334
|
consumption, bonus, refund)
|
|
335
335
|
operation_type (Union[None, Unset, str]): Filter by operation type (e.g., entity_lookup,
|
|
@@ -14,6 +14,14 @@ from .query_client import (
|
|
|
14
14
|
QueryOptions,
|
|
15
15
|
QueuedQueryError,
|
|
16
16
|
)
|
|
17
|
+
from .agent_client import (
|
|
18
|
+
AgentClient,
|
|
19
|
+
AgentResult,
|
|
20
|
+
QueuedAgentResponse,
|
|
21
|
+
AgentQueryRequest,
|
|
22
|
+
AgentOptions,
|
|
23
|
+
QueuedAgentError,
|
|
24
|
+
)
|
|
17
25
|
from .operation_client import (
|
|
18
26
|
OperationClient,
|
|
19
27
|
OperationStatus,
|
|
@@ -118,6 +126,13 @@ __all__ = [
|
|
|
118
126
|
"QueryRequest",
|
|
119
127
|
"QueryOptions",
|
|
120
128
|
"QueuedQueryError",
|
|
129
|
+
# Agent Client
|
|
130
|
+
"AgentClient",
|
|
131
|
+
"AgentResult",
|
|
132
|
+
"QueuedAgentResponse",
|
|
133
|
+
"AgentQueryRequest",
|
|
134
|
+
"AgentOptions",
|
|
135
|
+
"QueuedAgentError",
|
|
121
136
|
# Operation Client
|
|
122
137
|
"OperationClient",
|
|
123
138
|
"OperationStatus",
|
|
@@ -189,6 +204,16 @@ def stream_query(graph_id: str, query: str, parameters=None, chunk_size=None):
|
|
|
189
204
|
return extensions.query.stream_query(graph_id, query, parameters, chunk_size)
|
|
190
205
|
|
|
191
206
|
|
|
207
|
+
def agent_query(graph_id: str, message: str, context=None):
|
|
208
|
+
"""Execute an agent query using the default extensions instance"""
|
|
209
|
+
return extensions.agent.query(graph_id, message, context)
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def analyze_financials(graph_id: str, message: str, on_progress=None):
|
|
213
|
+
"""Execute financial agent using the default extensions instance"""
|
|
214
|
+
return extensions.agent.analyze_financials(graph_id, message, on_progress)
|
|
215
|
+
|
|
216
|
+
|
|
192
217
|
# DataFrame convenience functions (if pandas is available)
|
|
193
218
|
if (
|
|
194
219
|
HAS_PANDAS
|
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
"""Enhanced Agent Client with SSE support
|
|
2
|
+
|
|
3
|
+
Provides intelligent agent execution with automatic strategy selection.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from typing import Dict, Any, Optional, Callable
|
|
8
|
+
from datetime import datetime
|
|
9
|
+
|
|
10
|
+
from ..api.agent.auto_select_agent import sync_detailed as auto_select_agent
|
|
11
|
+
from ..api.agent.execute_specific_agent import sync_detailed as execute_specific_agent
|
|
12
|
+
from ..models.agent_request import AgentRequest
|
|
13
|
+
from ..models.agent_message import AgentMessage
|
|
14
|
+
from .sse_client import SSEClient, SSEConfig, EventType
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class AgentQueryRequest:
|
|
19
|
+
"""Request object for agent queries"""
|
|
20
|
+
|
|
21
|
+
message: str
|
|
22
|
+
history: Optional[list] = None
|
|
23
|
+
context: Optional[Dict[str, Any]] = None
|
|
24
|
+
mode: Optional[str] = None # 'quick', 'standard', 'extended', 'streaming'
|
|
25
|
+
enable_rag: Optional[bool] = None
|
|
26
|
+
force_extended_analysis: Optional[bool] = None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class AgentOptions:
|
|
31
|
+
"""Options for agent execution"""
|
|
32
|
+
|
|
33
|
+
mode: Optional[str] = "auto" # 'auto', 'sync', 'async'
|
|
34
|
+
max_wait: Optional[int] = None
|
|
35
|
+
on_progress: Optional[Callable[[str, Optional[int]], None]] = None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class AgentResult:
|
|
40
|
+
"""Result from agent execution"""
|
|
41
|
+
|
|
42
|
+
content: str
|
|
43
|
+
agent_used: str
|
|
44
|
+
mode_used: str
|
|
45
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
46
|
+
tokens_used: Optional[Dict[str, int]] = None
|
|
47
|
+
confidence_score: Optional[float] = None
|
|
48
|
+
execution_time: Optional[float] = None
|
|
49
|
+
timestamp: Optional[str] = None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass
|
|
53
|
+
class QueuedAgentResponse:
|
|
54
|
+
"""Response when agent execution is queued"""
|
|
55
|
+
|
|
56
|
+
status: str
|
|
57
|
+
operation_id: str
|
|
58
|
+
message: str
|
|
59
|
+
sse_endpoint: Optional[str] = None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class QueuedAgentError(Exception):
|
|
63
|
+
"""Exception thrown when agent execution is queued and maxWait is 0"""
|
|
64
|
+
|
|
65
|
+
def __init__(self, queue_info: QueuedAgentResponse):
|
|
66
|
+
super().__init__("Agent execution was queued")
|
|
67
|
+
self.queue_info = queue_info
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class AgentClient:
|
|
71
|
+
"""Enhanced agent client with SSE streaming support"""
|
|
72
|
+
|
|
73
|
+
def __init__(self, config: Dict[str, Any]):
|
|
74
|
+
self.config = config
|
|
75
|
+
self.base_url = config["base_url"]
|
|
76
|
+
self.headers = config.get("headers", {})
|
|
77
|
+
self.token = config.get("token")
|
|
78
|
+
self.sse_client: Optional[SSEClient] = None
|
|
79
|
+
|
|
80
|
+
def execute_query(
|
|
81
|
+
self,
|
|
82
|
+
graph_id: str,
|
|
83
|
+
request: AgentQueryRequest,
|
|
84
|
+
options: AgentOptions = None,
|
|
85
|
+
) -> AgentResult:
|
|
86
|
+
"""Execute agent query with automatic agent selection"""
|
|
87
|
+
if options is None:
|
|
88
|
+
options = AgentOptions()
|
|
89
|
+
|
|
90
|
+
# Build request data
|
|
91
|
+
agent_request = AgentRequest(
|
|
92
|
+
message=request.message,
|
|
93
|
+
history=[
|
|
94
|
+
AgentMessage(role=msg["role"], content=msg["content"])
|
|
95
|
+
for msg in (request.history or [])
|
|
96
|
+
],
|
|
97
|
+
context=request.context,
|
|
98
|
+
mode=request.mode,
|
|
99
|
+
enable_rag=request.enable_rag,
|
|
100
|
+
force_extended_analysis=request.force_extended_analysis,
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Execute through the generated client
|
|
104
|
+
from ..client import AuthenticatedClient
|
|
105
|
+
|
|
106
|
+
if not self.token:
|
|
107
|
+
raise Exception("No API key provided. Set X-API-Key in headers.")
|
|
108
|
+
|
|
109
|
+
client = AuthenticatedClient(
|
|
110
|
+
base_url=self.base_url,
|
|
111
|
+
token=self.token,
|
|
112
|
+
prefix="",
|
|
113
|
+
auth_header_name="X-API-Key",
|
|
114
|
+
headers=self.headers,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
response = auto_select_agent(
|
|
119
|
+
graph_id=graph_id,
|
|
120
|
+
client=client,
|
|
121
|
+
body=agent_request,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Check response type and handle accordingly
|
|
125
|
+
if hasattr(response, "parsed") and response.parsed:
|
|
126
|
+
response_data = response.parsed
|
|
127
|
+
|
|
128
|
+
# Handle both dict and attrs object responses
|
|
129
|
+
if isinstance(response_data, dict):
|
|
130
|
+
data = response_data
|
|
131
|
+
else:
|
|
132
|
+
# Response is an attrs object
|
|
133
|
+
data = response_data
|
|
134
|
+
|
|
135
|
+
# Check if this is an immediate response (sync or SSE execution)
|
|
136
|
+
has_content = False
|
|
137
|
+
if isinstance(data, dict):
|
|
138
|
+
has_content = "content" in data and "agent_used" in data
|
|
139
|
+
else:
|
|
140
|
+
has_content = hasattr(data, "content") and hasattr(data, "agent_used")
|
|
141
|
+
|
|
142
|
+
if has_content:
|
|
143
|
+
# Extract data from either dict or attrs object
|
|
144
|
+
if isinstance(data, dict):
|
|
145
|
+
return AgentResult(
|
|
146
|
+
content=data["content"],
|
|
147
|
+
agent_used=data["agent_used"],
|
|
148
|
+
mode_used=data["mode_used"],
|
|
149
|
+
metadata=data.get("metadata"),
|
|
150
|
+
tokens_used=data.get("tokens_used"),
|
|
151
|
+
confidence_score=data.get("confidence_score"),
|
|
152
|
+
execution_time=data.get("execution_time"),
|
|
153
|
+
timestamp=data.get("timestamp", datetime.now().isoformat()),
|
|
154
|
+
)
|
|
155
|
+
else:
|
|
156
|
+
# attrs object - access attributes directly
|
|
157
|
+
from ..types import UNSET
|
|
158
|
+
|
|
159
|
+
return AgentResult(
|
|
160
|
+
content=data.content if data.content is not UNSET else "",
|
|
161
|
+
agent_used=data.agent_used if data.agent_used is not UNSET else "unknown",
|
|
162
|
+
mode_used=data.mode_used.value
|
|
163
|
+
if hasattr(data.mode_used, "value")
|
|
164
|
+
else data.mode_used
|
|
165
|
+
if data.mode_used is not UNSET
|
|
166
|
+
else "standard",
|
|
167
|
+
metadata=data.metadata if data.metadata is not UNSET else None,
|
|
168
|
+
tokens_used=data.tokens_used if data.tokens_used is not UNSET else None,
|
|
169
|
+
confidence_score=data.confidence_score
|
|
170
|
+
if data.confidence_score is not UNSET
|
|
171
|
+
else None,
|
|
172
|
+
execution_time=data.execution_time
|
|
173
|
+
if data.execution_time is not UNSET
|
|
174
|
+
else None,
|
|
175
|
+
timestamp=data.timestamp
|
|
176
|
+
if hasattr(data, "timestamp") and data.timestamp is not UNSET
|
|
177
|
+
else datetime.now().isoformat(),
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
# Check if this is a queued response (async Celery execution)
|
|
181
|
+
is_queued = False
|
|
182
|
+
queued_response = None
|
|
183
|
+
|
|
184
|
+
if isinstance(data, dict):
|
|
185
|
+
is_queued = "operation_id" in data
|
|
186
|
+
if is_queued:
|
|
187
|
+
queued_response = QueuedAgentResponse(
|
|
188
|
+
status=data.get("status", "queued"),
|
|
189
|
+
operation_id=data["operation_id"],
|
|
190
|
+
message=data.get("message", "Agent execution queued"),
|
|
191
|
+
sse_endpoint=data.get("sse_endpoint"),
|
|
192
|
+
)
|
|
193
|
+
else:
|
|
194
|
+
is_queued = hasattr(data, "operation_id")
|
|
195
|
+
if is_queued:
|
|
196
|
+
from ..types import UNSET
|
|
197
|
+
|
|
198
|
+
queued_response = QueuedAgentResponse(
|
|
199
|
+
status=data.status if hasattr(data, "status") else "queued",
|
|
200
|
+
operation_id=data.operation_id,
|
|
201
|
+
message=data.message
|
|
202
|
+
if hasattr(data, "message") and data.message is not UNSET
|
|
203
|
+
else "Agent execution queued",
|
|
204
|
+
sse_endpoint=data.sse_endpoint
|
|
205
|
+
if hasattr(data, "sse_endpoint") and data.sse_endpoint is not UNSET
|
|
206
|
+
else None,
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
if is_queued and queued_response:
|
|
210
|
+
# If user doesn't want to wait, raise with queue info
|
|
211
|
+
if options.max_wait == 0:
|
|
212
|
+
raise QueuedAgentError(queued_response)
|
|
213
|
+
|
|
214
|
+
# Use SSE to monitor the operation
|
|
215
|
+
return self._wait_for_agent_completion(queued_response.operation_id, options)
|
|
216
|
+
|
|
217
|
+
except Exception as e:
|
|
218
|
+
if isinstance(e, QueuedAgentError):
|
|
219
|
+
raise
|
|
220
|
+
|
|
221
|
+
error_msg = str(e)
|
|
222
|
+
# Check for authentication errors
|
|
223
|
+
if (
|
|
224
|
+
"401" in error_msg or "403" in error_msg or "unauthorized" in error_msg.lower()
|
|
225
|
+
):
|
|
226
|
+
raise Exception(f"Authentication failed during agent execution: {error_msg}")
|
|
227
|
+
else:
|
|
228
|
+
raise Exception(f"Agent execution failed: {error_msg}")
|
|
229
|
+
|
|
230
|
+
# Unexpected response format
|
|
231
|
+
raise Exception("Unexpected response format from agent endpoint")
|
|
232
|
+
|
|
233
|
+
def execute_agent(
|
|
234
|
+
self,
|
|
235
|
+
graph_id: str,
|
|
236
|
+
agent_type: str,
|
|
237
|
+
request: AgentQueryRequest,
|
|
238
|
+
options: AgentOptions = None,
|
|
239
|
+
) -> AgentResult:
|
|
240
|
+
"""Execute specific agent type"""
|
|
241
|
+
if options is None:
|
|
242
|
+
options = AgentOptions()
|
|
243
|
+
|
|
244
|
+
# Build request data
|
|
245
|
+
agent_request = AgentRequest(
|
|
246
|
+
message=request.message,
|
|
247
|
+
history=[
|
|
248
|
+
AgentMessage(role=msg["role"], content=msg["content"])
|
|
249
|
+
for msg in (request.history or [])
|
|
250
|
+
],
|
|
251
|
+
context=request.context,
|
|
252
|
+
mode=request.mode,
|
|
253
|
+
enable_rag=request.enable_rag,
|
|
254
|
+
force_extended_analysis=request.force_extended_analysis,
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
# Execute through the generated client
|
|
258
|
+
from ..client import AuthenticatedClient
|
|
259
|
+
|
|
260
|
+
if not self.token:
|
|
261
|
+
raise Exception("No API key provided. Set X-API-Key in headers.")
|
|
262
|
+
|
|
263
|
+
client = AuthenticatedClient(
|
|
264
|
+
base_url=self.base_url,
|
|
265
|
+
token=self.token,
|
|
266
|
+
prefix="",
|
|
267
|
+
auth_header_name="X-API-Key",
|
|
268
|
+
headers=self.headers,
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
try:
|
|
272
|
+
response = execute_specific_agent(
|
|
273
|
+
graph_id=graph_id,
|
|
274
|
+
agent_type=agent_type,
|
|
275
|
+
client=client,
|
|
276
|
+
body=agent_request,
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
# Check response type and handle accordingly
|
|
280
|
+
if hasattr(response, "parsed") and response.parsed:
|
|
281
|
+
response_data = response.parsed
|
|
282
|
+
|
|
283
|
+
# Handle both dict and attrs object responses
|
|
284
|
+
if isinstance(response_data, dict):
|
|
285
|
+
data = response_data
|
|
286
|
+
else:
|
|
287
|
+
data = response_data
|
|
288
|
+
|
|
289
|
+
# Check if this is an immediate response
|
|
290
|
+
has_content = False
|
|
291
|
+
if isinstance(data, dict):
|
|
292
|
+
has_content = "content" in data and "agent_used" in data
|
|
293
|
+
else:
|
|
294
|
+
has_content = hasattr(data, "content") and hasattr(data, "agent_used")
|
|
295
|
+
|
|
296
|
+
if has_content:
|
|
297
|
+
# Extract data from either dict or attrs object
|
|
298
|
+
if isinstance(data, dict):
|
|
299
|
+
return AgentResult(
|
|
300
|
+
content=data["content"],
|
|
301
|
+
agent_used=data["agent_used"],
|
|
302
|
+
mode_used=data["mode_used"],
|
|
303
|
+
metadata=data.get("metadata"),
|
|
304
|
+
tokens_used=data.get("tokens_used"),
|
|
305
|
+
confidence_score=data.get("confidence_score"),
|
|
306
|
+
execution_time=data.get("execution_time"),
|
|
307
|
+
timestamp=data.get("timestamp", datetime.now().isoformat()),
|
|
308
|
+
)
|
|
309
|
+
else:
|
|
310
|
+
# attrs object
|
|
311
|
+
from ..types import UNSET
|
|
312
|
+
|
|
313
|
+
return AgentResult(
|
|
314
|
+
content=data.content if data.content is not UNSET else "",
|
|
315
|
+
agent_used=data.agent_used if data.agent_used is not UNSET else "unknown",
|
|
316
|
+
mode_used=data.mode_used.value
|
|
317
|
+
if hasattr(data.mode_used, "value")
|
|
318
|
+
else data.mode_used
|
|
319
|
+
if data.mode_used is not UNSET
|
|
320
|
+
else "standard",
|
|
321
|
+
metadata=data.metadata if data.metadata is not UNSET else None,
|
|
322
|
+
tokens_used=data.tokens_used if data.tokens_used is not UNSET else None,
|
|
323
|
+
confidence_score=data.confidence_score
|
|
324
|
+
if data.confidence_score is not UNSET
|
|
325
|
+
else None,
|
|
326
|
+
execution_time=data.execution_time
|
|
327
|
+
if data.execution_time is not UNSET
|
|
328
|
+
else None,
|
|
329
|
+
timestamp=data.timestamp
|
|
330
|
+
if hasattr(data, "timestamp") and data.timestamp is not UNSET
|
|
331
|
+
else datetime.now().isoformat(),
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
# Check if this is a queued response
|
|
335
|
+
is_queued = False
|
|
336
|
+
queued_response = None
|
|
337
|
+
|
|
338
|
+
if isinstance(data, dict):
|
|
339
|
+
is_queued = "operation_id" in data
|
|
340
|
+
if is_queued:
|
|
341
|
+
queued_response = QueuedAgentResponse(
|
|
342
|
+
status=data.get("status", "queued"),
|
|
343
|
+
operation_id=data["operation_id"],
|
|
344
|
+
message=data.get("message", "Agent execution queued"),
|
|
345
|
+
sse_endpoint=data.get("sse_endpoint"),
|
|
346
|
+
)
|
|
347
|
+
else:
|
|
348
|
+
is_queued = hasattr(data, "operation_id")
|
|
349
|
+
if is_queued:
|
|
350
|
+
from ..types import UNSET
|
|
351
|
+
|
|
352
|
+
queued_response = QueuedAgentResponse(
|
|
353
|
+
status=data.status if hasattr(data, "status") else "queued",
|
|
354
|
+
operation_id=data.operation_id,
|
|
355
|
+
message=data.message
|
|
356
|
+
if hasattr(data, "message") and data.message is not UNSET
|
|
357
|
+
else "Agent execution queued",
|
|
358
|
+
sse_endpoint=data.sse_endpoint
|
|
359
|
+
if hasattr(data, "sse_endpoint") and data.sse_endpoint is not UNSET
|
|
360
|
+
else None,
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
if is_queued and queued_response:
|
|
364
|
+
# If user doesn't want to wait, raise with queue info
|
|
365
|
+
if options.max_wait == 0:
|
|
366
|
+
raise QueuedAgentError(queued_response)
|
|
367
|
+
|
|
368
|
+
# Use SSE to monitor the operation
|
|
369
|
+
return self._wait_for_agent_completion(queued_response.operation_id, options)
|
|
370
|
+
|
|
371
|
+
except Exception as e:
|
|
372
|
+
if isinstance(e, QueuedAgentError):
|
|
373
|
+
raise
|
|
374
|
+
|
|
375
|
+
error_msg = str(e)
|
|
376
|
+
if (
|
|
377
|
+
"401" in error_msg or "403" in error_msg or "unauthorized" in error_msg.lower()
|
|
378
|
+
):
|
|
379
|
+
raise Exception(f"Authentication failed during agent execution: {error_msg}")
|
|
380
|
+
else:
|
|
381
|
+
raise Exception(f"Agent execution failed: {error_msg}")
|
|
382
|
+
|
|
383
|
+
# Unexpected response format
|
|
384
|
+
raise Exception("Unexpected response format from agent endpoint")
|
|
385
|
+
|
|
386
|
+
def _wait_for_agent_completion(
|
|
387
|
+
self, operation_id: str, options: AgentOptions
|
|
388
|
+
) -> AgentResult:
|
|
389
|
+
"""Wait for agent completion and return final result"""
|
|
390
|
+
result = None
|
|
391
|
+
error = None
|
|
392
|
+
completed = False
|
|
393
|
+
|
|
394
|
+
# Set up SSE connection
|
|
395
|
+
sse_config = SSEConfig(base_url=self.base_url, headers=self.headers)
|
|
396
|
+
sse_client = SSEClient(sse_config)
|
|
397
|
+
|
|
398
|
+
def on_progress(data):
|
|
399
|
+
if options.on_progress:
|
|
400
|
+
options.on_progress(
|
|
401
|
+
data.get("message", "Processing..."), data.get("percentage")
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
def on_agent_started(data):
|
|
405
|
+
if options.on_progress:
|
|
406
|
+
options.on_progress(f"Agent {data.get('agent_type')} started", 0)
|
|
407
|
+
|
|
408
|
+
def on_agent_initialized(data):
|
|
409
|
+
if options.on_progress:
|
|
410
|
+
options.on_progress(f"{data.get('agent_name')} initialized", 10)
|
|
411
|
+
|
|
412
|
+
def on_agent_completed(data):
|
|
413
|
+
nonlocal result, completed
|
|
414
|
+
result = AgentResult(
|
|
415
|
+
content=data.get("content", ""),
|
|
416
|
+
agent_used=data.get("agent_used", "unknown"),
|
|
417
|
+
mode_used=data.get("mode_used", "standard"),
|
|
418
|
+
metadata=data.get("metadata"),
|
|
419
|
+
tokens_used=data.get("tokens_used"),
|
|
420
|
+
confidence_score=data.get("confidence_score"),
|
|
421
|
+
execution_time=data.get("execution_time"),
|
|
422
|
+
timestamp=data.get("timestamp", datetime.now().isoformat()),
|
|
423
|
+
)
|
|
424
|
+
completed = True
|
|
425
|
+
|
|
426
|
+
def on_completed(data):
|
|
427
|
+
nonlocal result, completed
|
|
428
|
+
if not result:
|
|
429
|
+
# Fallback to generic completion event
|
|
430
|
+
agent_result = data.get("result", data)
|
|
431
|
+
result = AgentResult(
|
|
432
|
+
content=agent_result.get("content", ""),
|
|
433
|
+
agent_used=agent_result.get("agent_used", "unknown"),
|
|
434
|
+
mode_used=agent_result.get("mode_used", "standard"),
|
|
435
|
+
metadata=agent_result.get("metadata"),
|
|
436
|
+
tokens_used=agent_result.get("tokens_used"),
|
|
437
|
+
confidence_score=agent_result.get("confidence_score"),
|
|
438
|
+
execution_time=agent_result.get("execution_time"),
|
|
439
|
+
timestamp=agent_result.get("timestamp", datetime.now().isoformat()),
|
|
440
|
+
)
|
|
441
|
+
completed = True
|
|
442
|
+
|
|
443
|
+
def on_error(err):
|
|
444
|
+
nonlocal error, completed
|
|
445
|
+
error = Exception(err.get("message", err.get("error", "Unknown error")))
|
|
446
|
+
completed = True
|
|
447
|
+
|
|
448
|
+
def on_cancelled():
|
|
449
|
+
nonlocal error, completed
|
|
450
|
+
error = Exception("Agent execution cancelled")
|
|
451
|
+
completed = True
|
|
452
|
+
|
|
453
|
+
# Register event handlers
|
|
454
|
+
sse_client.on(EventType.OPERATION_PROGRESS.value, on_progress)
|
|
455
|
+
sse_client.on("agent_started", on_agent_started)
|
|
456
|
+
sse_client.on("agent_initialized", on_agent_initialized)
|
|
457
|
+
sse_client.on("progress", on_progress)
|
|
458
|
+
sse_client.on("agent_completed", on_agent_completed)
|
|
459
|
+
sse_client.on(EventType.OPERATION_COMPLETED.value, on_completed)
|
|
460
|
+
sse_client.on(EventType.OPERATION_ERROR.value, on_error)
|
|
461
|
+
sse_client.on("error", on_error)
|
|
462
|
+
sse_client.on(EventType.OPERATION_CANCELLED.value, on_cancelled)
|
|
463
|
+
|
|
464
|
+
# Connect and wait
|
|
465
|
+
sse_client.connect(operation_id)
|
|
466
|
+
|
|
467
|
+
# Wait for completion
|
|
468
|
+
import time
|
|
469
|
+
|
|
470
|
+
while not completed:
|
|
471
|
+
if error:
|
|
472
|
+
sse_client.close()
|
|
473
|
+
raise error
|
|
474
|
+
time.sleep(0.1)
|
|
475
|
+
|
|
476
|
+
sse_client.close()
|
|
477
|
+
return result
|
|
478
|
+
|
|
479
|
+
def query(
|
|
480
|
+
self, graph_id: str, message: str, context: Dict[str, Any] = None
|
|
481
|
+
) -> AgentResult:
|
|
482
|
+
"""Convenience method for simple agent queries with auto-selection"""
|
|
483
|
+
request = AgentQueryRequest(message=message, context=context)
|
|
484
|
+
return self.execute_query(graph_id, request, AgentOptions(mode="auto"))
|
|
485
|
+
|
|
486
|
+
def analyze_financials(
|
|
487
|
+
self,
|
|
488
|
+
graph_id: str,
|
|
489
|
+
message: str,
|
|
490
|
+
on_progress: Optional[Callable[[str, Optional[int]], None]] = None,
|
|
491
|
+
) -> AgentResult:
|
|
492
|
+
"""Execute financial agent for financial analysis"""
|
|
493
|
+
request = AgentQueryRequest(message=message)
|
|
494
|
+
return self.execute_agent(
|
|
495
|
+
graph_id, "financial", request, AgentOptions(on_progress=on_progress)
|
|
496
|
+
)
|
|
497
|
+
|
|
498
|
+
def research(
|
|
499
|
+
self,
|
|
500
|
+
graph_id: str,
|
|
501
|
+
message: str,
|
|
502
|
+
on_progress: Optional[Callable[[str, Optional[int]], None]] = None,
|
|
503
|
+
) -> AgentResult:
|
|
504
|
+
"""Execute research agent for deep research"""
|
|
505
|
+
request = AgentQueryRequest(message=message)
|
|
506
|
+
return self.execute_agent(
|
|
507
|
+
graph_id, "research", request, AgentOptions(on_progress=on_progress)
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
def rag(
|
|
511
|
+
self,
|
|
512
|
+
graph_id: str,
|
|
513
|
+
message: str,
|
|
514
|
+
on_progress: Optional[Callable[[str, Optional[int]], None]] = None,
|
|
515
|
+
) -> AgentResult:
|
|
516
|
+
"""Execute RAG agent for fast retrieval"""
|
|
517
|
+
request = AgentQueryRequest(message=message)
|
|
518
|
+
return self.execute_agent(
|
|
519
|
+
graph_id, "rag", request, AgentOptions(on_progress=on_progress)
|
|
520
|
+
)
|
|
521
|
+
|
|
522
|
+
def close(self):
|
|
523
|
+
"""Cancel any active SSE connections"""
|
|
524
|
+
if self.sse_client:
|
|
525
|
+
self.sse_client.close()
|
|
526
|
+
self.sse_client = None
|
|
@@ -7,6 +7,7 @@ from dataclasses import dataclass
|
|
|
7
7
|
from typing import Dict, Any, Optional, Callable
|
|
8
8
|
|
|
9
9
|
from .query_client import QueryClient
|
|
10
|
+
from .agent_client import AgentClient
|
|
10
11
|
from .operation_client import OperationClient
|
|
11
12
|
from .table_ingest_client import TableIngestClient
|
|
12
13
|
from .graph_client import GraphClient
|
|
@@ -58,6 +59,7 @@ class RoboSystemsExtensions:
|
|
|
58
59
|
|
|
59
60
|
# Initialize clients
|
|
60
61
|
self.query = QueryClient(self.config)
|
|
62
|
+
self.agent = AgentClient(self.config)
|
|
61
63
|
self.operations = OperationClient(self.config)
|
|
62
64
|
self.tables = TableIngestClient(self.config)
|
|
63
65
|
self.graphs = GraphClient(self.config)
|
|
@@ -88,6 +90,7 @@ class RoboSystemsExtensions:
|
|
|
88
90
|
def close(self):
|
|
89
91
|
"""Clean up all active connections"""
|
|
90
92
|
self.query.close()
|
|
93
|
+
self.agent.close()
|
|
91
94
|
self.operations.close_all()
|
|
92
95
|
self.tables.close()
|
|
93
96
|
self.graphs.close()
|
|
@@ -16,7 +16,8 @@ class CheckoutStatusResponse:
|
|
|
16
16
|
Attributes:
|
|
17
17
|
status (str): Checkout status: 'pending_payment', 'provisioning', 'completed', 'failed'
|
|
18
18
|
subscription_id (str): Internal subscription ID
|
|
19
|
-
resource_id (Union[None, Unset, str]): Resource ID (graph_id
|
|
19
|
+
resource_id (Union[None, Unset, str]): Resource ID (graph_id for both graphs and repositories) once provisioned.
|
|
20
|
+
For repositories, this is the repository slug (e.g., 'sec')
|
|
20
21
|
operation_id (Union[None, Unset, str]): SSE operation ID for monitoring provisioning progress
|
|
21
22
|
error (Union[None, Unset, str]): Error message if checkout failed
|
|
22
23
|
"""
|
|
@@ -20,7 +20,8 @@ class CreateCheckoutRequest:
|
|
|
20
20
|
Attributes:
|
|
21
21
|
plan_name (str): Billing plan name (e.g., 'kuzu-standard')
|
|
22
22
|
resource_type (str): Resource type ('graph' or 'repository')
|
|
23
|
-
resource_config (CreateCheckoutRequestResourceConfig): Configuration for the resource to be provisioned
|
|
23
|
+
resource_config (CreateCheckoutRequestResourceConfig): Configuration for the resource to be provisioned. For
|
|
24
|
+
repositories: {'repository_name': 'graph_id'} where graph_id is the repository slug (e.g., 'sec')
|
|
24
25
|
"""
|
|
25
26
|
|
|
26
27
|
plan_name: str
|
|
@@ -9,7 +9,10 @@ T = TypeVar("T", bound="CreateCheckoutRequestResourceConfig")
|
|
|
9
9
|
|
|
10
10
|
@_attrs_define
|
|
11
11
|
class CreateCheckoutRequestResourceConfig:
|
|
12
|
-
"""Configuration for the resource to be provisioned
|
|
12
|
+
"""Configuration for the resource to be provisioned. For repositories: {'repository_name': 'graph_id'} where graph_id
|
|
13
|
+
is the repository slug (e.g., 'sec')
|
|
14
|
+
|
|
15
|
+
"""
|
|
13
16
|
|
|
14
17
|
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
15
18
|
|
|
@@ -6,11 +6,11 @@ robosystems_client/sdk-config.yaml,sha256=Y_A8qSC2zHLYy6d443Rlgdkw2GleOSFjYvq_Qm
|
|
|
6
6
|
robosystems_client/types.py,sha256=l5mTsR9GphXnb6qHvveUHNZ_GpiRMqweGNjgKmn6qXE,1349
|
|
7
7
|
robosystems_client/api/__init__.py,sha256=zTSiG_ujSjAqWPyc435YXaX9XTlpMjiJWBbV-f-YtdA,45
|
|
8
8
|
robosystems_client/api/agent/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
|
|
9
|
-
robosystems_client/api/agent/auto_select_agent.py,sha256=
|
|
9
|
+
robosystems_client/api/agent/auto_select_agent.py,sha256=6jiddkXrfm-JCc3E6CW0qVsSur0dfKkVeVlYttzfCqo,15096
|
|
10
10
|
robosystems_client/api/agent/batch_process_queries.py,sha256=t_CSO2XTbKAFOWR-Ac8ALxu6ZmCL7ZnYOeDvTonwu2k,6785
|
|
11
|
-
robosystems_client/api/agent/execute_specific_agent.py,sha256=
|
|
12
|
-
robosystems_client/api/agent/get_agent_metadata.py,sha256=
|
|
13
|
-
robosystems_client/api/agent/list_agents.py,sha256=
|
|
11
|
+
robosystems_client/api/agent/execute_specific_agent.py,sha256=IqP08Vq-mpT_66i6XqRumVlGVfw4FzZzFJxdfyQkTSc,9608
|
|
12
|
+
robosystems_client/api/agent/get_agent_metadata.py,sha256=CsAMH3vzVXo7KJ95zlf1oT5juLmjIWahsEmFkpG_9Kk,5818
|
|
13
|
+
robosystems_client/api/agent/list_agents.py,sha256=ns_fWdfZxQlrD_IQHTIw5-tyqIxvmpnI1sXn6DgxoZo,6321
|
|
14
14
|
robosystems_client/api/agent/recommend_agent.py,sha256=WK1826OQeGbLGPQX-xTzSHHVBVKLf-QtQ9gVP0ZjK7c,6689
|
|
15
15
|
robosystems_client/api/auth/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
|
|
16
16
|
robosystems_client/api/auth/check_password_strength.py,sha256=4oVo056LpbSGHVH733tjRdZFt0uJ_fJR7IFz1nvxB0E,4673
|
|
@@ -61,7 +61,7 @@ robosystems_client/api/credits_/check_credit_balance.py,sha256=0iPXBgsEQs_nWsZKw
|
|
|
61
61
|
robosystems_client/api/credits_/check_storage_limits.py,sha256=mo0PRFLmwcVGjdlLBq2r02QcoVrmcH8EozV2RcFesA8,6187
|
|
62
62
|
robosystems_client/api/credits_/get_credit_summary.py,sha256=-uvETiHAuFBDtzeIAc8KnRnf6irV74MnsKAWWOltZwo,6041
|
|
63
63
|
robosystems_client/api/credits_/get_storage_usage.py,sha256=oFlj7Ziiopk9vXRWAtHHDCy_vtvufCNoOrtD9mkFMR0,6770
|
|
64
|
-
robosystems_client/api/credits_/list_credit_transactions.py,sha256=
|
|
64
|
+
robosystems_client/api/credits_/list_credit_transactions.py,sha256=9Ny3tqu2nFTEa7jB8XHABxJjLL8dLPZu4ILRHcjMv9M,12322
|
|
65
65
|
robosystems_client/api/graph_health/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
|
|
66
66
|
robosystems_client/api/graph_health/get_database_health.py,sha256=aEUYDiUMQ-paxRrABb9xY3dgs_mW7loyTuz5Y4oX790,7318
|
|
67
67
|
robosystems_client/api/graph_info/__init__.py,sha256=5vd9uJWAjRqa9xzxzYkLD1yoZ12Ld_bAaNB5WX4fbE8,56
|
|
@@ -137,10 +137,11 @@ robosystems_client/api/user/update_user.py,sha256=nSr6ZRKD_Wu1I_QwHWd9GGH1TLYluM
|
|
|
137
137
|
robosystems_client/api/user/update_user_api_key.py,sha256=kIccWO3m6t7S6MNCQNndASq533nou-zhF9qg9sNrrZM,4688
|
|
138
138
|
robosystems_client/api/user/update_user_password.py,sha256=djtS4Aqc0B2efYlqYhAwLyaQ8R1sTIkSP5XPMas5va0,5015
|
|
139
139
|
robosystems_client/extensions/README.md,sha256=qfHFjdgA_J-zNXziNZE6M1MKJiwVkocBi01w_HhvzEk,16136
|
|
140
|
-
robosystems_client/extensions/__init__.py,sha256=
|
|
140
|
+
robosystems_client/extensions/__init__.py,sha256=XYec7cxFRVLtTAG25MCHtg8Th9m5FsBb5J7q-aediK4,5900
|
|
141
|
+
robosystems_client/extensions/agent_client.py,sha256=Db2C4hrakVsf6ScnBcNk6rte3Kwn4cQBEHsR_joWMTs,17750
|
|
141
142
|
robosystems_client/extensions/auth_integration.py,sha256=ABOJ8aVjfHehNGNzim1iR9-Cdh7Mr22ce-WgWWeqJt0,6535
|
|
142
143
|
robosystems_client/extensions/dataframe_utils.py,sha256=gK1bgkVqBF0TvWVdGQvqWrt-ur_Rw11j8uNtMoulLWE,12312
|
|
143
|
-
robosystems_client/extensions/extensions.py,sha256=
|
|
144
|
+
robosystems_client/extensions/extensions.py,sha256=QkKIc6cU7uJ5unvH5bdrvq8RuAraqGHh7eY7wpwMVy8,6360
|
|
144
145
|
robosystems_client/extensions/graph_client.py,sha256=OBi0xj0SLIRKLeSu_DiGt2ZakCmhggvNrMP3jdRfEgQ,10326
|
|
145
146
|
robosystems_client/extensions/operation_client.py,sha256=B1qju-wWQrnrnVJixKGgsA_KEInviwJwdlJxzm_i7P0,13359
|
|
146
147
|
robosystems_client/extensions/query_client.py,sha256=cX3e8EBoTeg4Lwm6edJYRULM2UmGpfqNX3f48S8TQbE,19430
|
|
@@ -196,7 +197,7 @@ robosystems_client/models/cancel_operation_response_canceloperation.py,sha256=ba
|
|
|
196
197
|
robosystems_client/models/cancellation_response.py,sha256=2URj3ukcdjh5UvPpnSauP_CLz-9TLM4Il20MYBzzfTw,1955
|
|
197
198
|
robosystems_client/models/check_credit_balance_response_checkcreditbalance.py,sha256=izJJIZJaZkfJY7pqYg7nBPEv9IgRpJ5WSw6hu7VUZEk,1304
|
|
198
199
|
robosystems_client/models/checkout_response.py,sha256=NxmvkrjQrSGzhf3qCUILxw6KLezt_pS4TSGo8IyfRpM,4162
|
|
199
|
-
robosystems_client/models/checkout_status_response.py,sha256=
|
|
200
|
+
robosystems_client/models/checkout_status_response.py,sha256=_XDA5ahmEwYyQJ7YDs253fp5U6g_RKkfBkk6K3F5osA,3877
|
|
200
201
|
robosystems_client/models/connection_options_response.py,sha256=J-VjmGYJn_BOhuExZBlJIHXedyf_CXcoRf2XfklOnrk,2309
|
|
201
202
|
robosystems_client/models/connection_provider_info.py,sha256=Im0k56k1USElC9G5m2g7elOJ5CHZ08lDOLg5vOmx_AA,6600
|
|
202
203
|
robosystems_client/models/connection_provider_info_auth_type.py,sha256=cSRUkd90osfbj2MP5Hl8dinEoIXBPrCOIFGYYrk-4D0,201
|
|
@@ -207,8 +208,8 @@ robosystems_client/models/connection_response_provider.py,sha256=th7b2inab-PZWaQ
|
|
|
207
208
|
robosystems_client/models/copy_operation_limits.py,sha256=S0j8lPVghl-ih5xI-oCHK1hBRZf7SeE7FiZEMjuXzEA,3059
|
|
208
209
|
robosystems_client/models/create_api_key_request.py,sha256=aP-X8CtffeRUXDqG-WzM4gn8_DOwPt5CURmGYIbjgqY,2829
|
|
209
210
|
robosystems_client/models/create_api_key_response.py,sha256=9cqlZDogqxdSXxxHT6PnfClTP-Q35CvfQjNIvPEe1Pw,1797
|
|
210
|
-
robosystems_client/models/create_checkout_request.py,sha256=
|
|
211
|
-
robosystems_client/models/create_checkout_request_resource_config.py,sha256
|
|
211
|
+
robosystems_client/models/create_checkout_request.py,sha256=NoiSMuFMG24iMipMTwy34PnYyEt1x9fNauEVatIB1-s,2552
|
|
212
|
+
robosystems_client/models/create_checkout_request_resource_config.py,sha256=-gYfuQmp61mGggvvMZe4t1YGl9CDuIN0_O49ONbz-qs,1415
|
|
212
213
|
robosystems_client/models/create_connection_request.py,sha256=B9riNF1QK1P3RB680lFAJGsZtYbPHVc14u1TBnIv0QQ,5948
|
|
213
214
|
robosystems_client/models/create_connection_request_provider.py,sha256=TBZm3ApK31i1jit4WUxqtFtJq-LYKqXeVAHJIJh9Slw,190
|
|
214
215
|
robosystems_client/models/create_graph_request.py,sha256=THs5EEB8-cpfkyDUu0XzwuWMnScboE_ir3vrQ44mPJY,6174
|
|
@@ -392,7 +393,7 @@ robosystems_client/models/upgrade_subscription_request.py,sha256=Ph-Wu1pA6zOEi6j
|
|
|
392
393
|
robosystems_client/models/user_graphs_response.py,sha256=k4zDipn-9HqwiJHUq8Si1XSemCDJv_t9SfTtJxc6w_k,2648
|
|
393
394
|
robosystems_client/models/user_response.py,sha256=uMYsvPKLo5YUwsT-PV8Tu5qrFG81X8-ODBllFyX2C6E,3650
|
|
394
395
|
robosystems_client/models/validation_error.py,sha256=R77OuQG2nJ3WDFfY--xbEhg6x1D7gAAp_1UdnG8Ka2A,1949
|
|
395
|
-
robosystems_client-0.2.
|
|
396
|
-
robosystems_client-0.2.
|
|
397
|
-
robosystems_client-0.2.
|
|
398
|
-
robosystems_client-0.2.
|
|
396
|
+
robosystems_client-0.2.13.dist-info/METADATA,sha256=TYN9PHsu7MNUQJJ2lfmtnnR26gvDE914orgzefglUN4,3904
|
|
397
|
+
robosystems_client-0.2.13.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
398
|
+
robosystems_client-0.2.13.dist-info/licenses/LICENSE,sha256=LjFqQPU4eQh7jAQ04SmE9eC0j74HCdXvzbo0hjW4mWo,1063
|
|
399
|
+
robosystems_client-0.2.13.dist-info/RECORD,,
|
|
File without changes
|
{robosystems_client-0.2.12.dist-info → robosystems_client-0.2.13.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|