agenta 0.51.5__py3-none-any.whl → 0.51.6__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 agenta might be problematic. Click here for more details.
- agenta/sdk/decorators/serving.py +44 -1
- agenta/sdk/decorators/tracing.py +34 -48
- agenta/sdk/types.py +39 -0
- agenta/sdk/utils/otel.py +21 -0
- {agenta-0.51.5.dist-info → agenta-0.51.6.dist-info}/METADATA +1 -1
- {agenta-0.51.5.dist-info → agenta-0.51.6.dist-info}/RECORD +7 -6
- {agenta-0.51.5.dist-info → agenta-0.51.6.dist-info}/WHEEL +0 -0
agenta/sdk/decorators/serving.py
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
from typing import Type, Any, Callable, Dict, Optional, Tuple, List
|
|
2
|
-
from inspect import
|
|
2
|
+
from inspect import (
|
|
3
|
+
iscoroutinefunction,
|
|
4
|
+
isgenerator,
|
|
5
|
+
isasyncgen,
|
|
6
|
+
signature,
|
|
7
|
+
Signature,
|
|
8
|
+
Parameter,
|
|
9
|
+
)
|
|
3
10
|
from functools import wraps
|
|
4
11
|
from traceback import format_exception
|
|
5
12
|
from asyncio import sleep
|
|
@@ -7,6 +14,10 @@ from uuid import UUID
|
|
|
7
14
|
from pydantic import BaseModel, HttpUrl, ValidationError
|
|
8
15
|
from os import environ
|
|
9
16
|
|
|
17
|
+
from starlette.responses import (
|
|
18
|
+
Response as StarletteResponse,
|
|
19
|
+
StreamingResponse,
|
|
20
|
+
)
|
|
10
21
|
from fastapi import Body, FastAPI, HTTPException, Request
|
|
11
22
|
|
|
12
23
|
from agenta.sdk.middleware.mock import MockMiddleware
|
|
@@ -33,6 +44,7 @@ from agenta.sdk.utils.helpers import get_current_version
|
|
|
33
44
|
from agenta.sdk.types import (
|
|
34
45
|
MultipleChoice,
|
|
35
46
|
BaseResponse,
|
|
47
|
+
StreamResponse,
|
|
36
48
|
MCField,
|
|
37
49
|
)
|
|
38
50
|
|
|
@@ -380,6 +392,37 @@ class entrypoint:
|
|
|
380
392
|
span_id,
|
|
381
393
|
) = await self.fetch_inline_trace(inline)
|
|
382
394
|
|
|
395
|
+
try:
|
|
396
|
+
if isinstance(result, StarletteResponse):
|
|
397
|
+
result.headers.setdefault("X-ag-version", "3.0")
|
|
398
|
+
if content_type:
|
|
399
|
+
result.headers.setdefault("X-ag-content-type", content_type)
|
|
400
|
+
if tree_id:
|
|
401
|
+
result.headers.setdefault("X-ag-tree-id", tree_id)
|
|
402
|
+
if trace_id:
|
|
403
|
+
result.headers.setdefault("X-ag-trace-id", trace_id)
|
|
404
|
+
if span_id:
|
|
405
|
+
result.headers.setdefault("X-ag-span-id", span_id)
|
|
406
|
+
|
|
407
|
+
return result
|
|
408
|
+
except:
|
|
409
|
+
return result
|
|
410
|
+
|
|
411
|
+
try:
|
|
412
|
+
if isasyncgen(result) or isgenerator(result):
|
|
413
|
+
return StreamResponse(
|
|
414
|
+
content=result,
|
|
415
|
+
content_type=content_type,
|
|
416
|
+
tree_id=tree_id,
|
|
417
|
+
trace_id=trace_id,
|
|
418
|
+
span_id=span_id,
|
|
419
|
+
)
|
|
420
|
+
except:
|
|
421
|
+
return StreamingResponse(
|
|
422
|
+
result,
|
|
423
|
+
media_type="text/event-stream",
|
|
424
|
+
)
|
|
425
|
+
|
|
383
426
|
try:
|
|
384
427
|
return BaseResponse(
|
|
385
428
|
data=data,
|
agenta/sdk/decorators/tracing.py
CHANGED
|
@@ -18,12 +18,12 @@ from opentelemetry import baggage
|
|
|
18
18
|
from opentelemetry.context import attach, detach, get_current
|
|
19
19
|
from opentelemetry.baggage import set_baggage, get_all
|
|
20
20
|
|
|
21
|
+
from agenta.sdk.utils.logging import get_module_logger
|
|
21
22
|
from agenta.sdk.utils.exceptions import suppress
|
|
23
|
+
from agenta.sdk.utils.otel import debug_otel_context
|
|
22
24
|
from agenta.sdk.context.tracing import tracing_context
|
|
23
25
|
from agenta.sdk.tracing.conventions import parse_span_kind
|
|
24
26
|
|
|
25
|
-
from agenta.sdk.utils.logging import get_module_logger
|
|
26
|
-
|
|
27
27
|
import agenta as ag
|
|
28
28
|
|
|
29
29
|
log = get_module_logger(__name__)
|
|
@@ -66,40 +66,43 @@ class instrument: # pylint: disable=invalid-name
|
|
|
66
66
|
|
|
67
67
|
@wraps(func)
|
|
68
68
|
def astream_wrapper(*args, **kwargs):
|
|
69
|
-
|
|
69
|
+
# debug_otel_context("[BEFORE STREAM] [BEFORE SETUP]")
|
|
70
70
|
|
|
71
71
|
captured_ctx = otel_context.get_current()
|
|
72
|
-
parent_ctx = trace.set_span_in_context(trace.get_current_span())
|
|
73
72
|
|
|
74
|
-
|
|
73
|
+
self._parse_type_and_kind()
|
|
74
|
+
|
|
75
|
+
self._attach_baggage()
|
|
76
|
+
|
|
75
77
|
ctx = self._get_traceparent()
|
|
76
78
|
|
|
77
|
-
|
|
79
|
+
# debug_otel_context("[BEFORE STREAM] [AFTER SETUP]")
|
|
78
80
|
|
|
79
81
|
async def wrapped_generator():
|
|
80
|
-
|
|
82
|
+
# debug_otel_context("[WITHIN STREAM] [BEFORE ATTACH]")
|
|
83
|
+
|
|
84
|
+
otel_token = otel_context.attach(captured_ctx)
|
|
85
|
+
|
|
86
|
+
# debug_otel_context("[WITHIN STREAM] [AFTER ATTACH]")
|
|
81
87
|
|
|
82
88
|
try:
|
|
83
89
|
with ag.tracer.start_as_current_span(
|
|
84
90
|
name=func.__name__,
|
|
85
91
|
kind=self.kind,
|
|
86
|
-
context=
|
|
92
|
+
context=ctx,
|
|
87
93
|
):
|
|
88
94
|
self._set_link()
|
|
89
95
|
self._pre_instrument(func, *args, **kwargs)
|
|
90
96
|
|
|
91
97
|
_result = []
|
|
92
98
|
|
|
93
|
-
|
|
94
|
-
while True:
|
|
95
|
-
chunk = await agen.__anext__()
|
|
99
|
+
agen = func(*args, **kwargs)
|
|
96
100
|
|
|
101
|
+
try:
|
|
102
|
+
async for chunk in agen:
|
|
97
103
|
_result.append(chunk)
|
|
98
104
|
yield chunk
|
|
99
105
|
|
|
100
|
-
except StopAsyncIteration:
|
|
101
|
-
pass
|
|
102
|
-
|
|
103
106
|
finally:
|
|
104
107
|
if self.aggregate:
|
|
105
108
|
result = self.aggregate(_result)
|
|
@@ -113,9 +116,11 @@ class instrument: # pylint: disable=invalid-name
|
|
|
113
116
|
self._post_instrument(result)
|
|
114
117
|
|
|
115
118
|
finally:
|
|
116
|
-
|
|
119
|
+
# debug_otel_context("[WITHIN STREAM] [BEFORE DETACH]")
|
|
117
120
|
|
|
118
|
-
|
|
121
|
+
otel_context.detach(otel_token)
|
|
122
|
+
|
|
123
|
+
# debug_otel_context("[WITHIN STREAM] [AFTER DETACH]")
|
|
119
124
|
|
|
120
125
|
return wrapped_generator()
|
|
121
126
|
|
|
@@ -128,43 +133,36 @@ class instrument: # pylint: disable=invalid-name
|
|
|
128
133
|
def stream_wrapper(*args, **kwargs):
|
|
129
134
|
self._parse_type_and_kind()
|
|
130
135
|
|
|
131
|
-
captured_ctx = otel_context.get_current()
|
|
132
|
-
parent_ctx = trace.set_span_in_context(trace.get_current_span())
|
|
133
|
-
|
|
134
136
|
token = self._attach_baggage()
|
|
135
|
-
ctx = self._get_traceparent()
|
|
136
137
|
|
|
137
|
-
|
|
138
|
+
ctx = self._get_traceparent()
|
|
138
139
|
|
|
139
140
|
def wrapped_generator():
|
|
140
|
-
token_ctx = otel_context.attach(captured_ctx)
|
|
141
|
-
|
|
142
141
|
try:
|
|
143
142
|
with ag.tracer.start_as_current_span(
|
|
144
143
|
name=func.__name__,
|
|
145
144
|
kind=self.kind,
|
|
146
|
-
context=
|
|
145
|
+
context=ctx,
|
|
147
146
|
):
|
|
148
147
|
self._set_link()
|
|
148
|
+
|
|
149
149
|
self._pre_instrument(func, *args, **kwargs)
|
|
150
150
|
|
|
151
151
|
_result = []
|
|
152
152
|
|
|
153
|
+
gen = func(*args, **kwargs)
|
|
154
|
+
|
|
153
155
|
gen_return = None
|
|
154
|
-
stop_iteration_raised = False
|
|
155
156
|
|
|
156
157
|
try:
|
|
157
158
|
while True:
|
|
158
159
|
try:
|
|
159
|
-
chunk = next(
|
|
160
|
-
|
|
160
|
+
chunk = next(gen)
|
|
161
161
|
except StopIteration as e:
|
|
162
162
|
gen_return = e.value
|
|
163
|
-
stop_iteration_raised = True
|
|
164
163
|
break
|
|
165
164
|
|
|
166
165
|
_result.append(chunk)
|
|
167
|
-
|
|
168
166
|
yield chunk
|
|
169
167
|
|
|
170
168
|
finally:
|
|
@@ -179,11 +177,9 @@ class instrument: # pylint: disable=invalid-name
|
|
|
179
177
|
|
|
180
178
|
self._post_instrument(result)
|
|
181
179
|
|
|
182
|
-
return gen_return
|
|
180
|
+
return gen_return
|
|
183
181
|
|
|
184
182
|
finally:
|
|
185
|
-
otel_context.detach(token_ctx)
|
|
186
|
-
|
|
187
183
|
self._detach_baggage(token)
|
|
188
184
|
|
|
189
185
|
return wrapped_generator()
|
|
@@ -197,21 +193,18 @@ class instrument: # pylint: disable=invalid-name
|
|
|
197
193
|
async def awrapper(*args, **kwargs):
|
|
198
194
|
self._parse_type_and_kind()
|
|
199
195
|
|
|
200
|
-
captured_ctx = otel_context.get_current()
|
|
201
|
-
parent_ctx = trace.set_span_in_context(trace.get_current_span())
|
|
202
|
-
|
|
203
196
|
token = self._attach_baggage()
|
|
204
|
-
ctx = self._get_traceparent()
|
|
205
197
|
|
|
206
|
-
|
|
198
|
+
ctx = self._get_traceparent()
|
|
207
199
|
|
|
208
200
|
try:
|
|
209
201
|
with ag.tracer.start_as_current_span(
|
|
210
202
|
name=func.__name__,
|
|
211
203
|
kind=self.kind,
|
|
212
|
-
context=
|
|
204
|
+
context=ctx,
|
|
213
205
|
):
|
|
214
206
|
self._set_link()
|
|
207
|
+
|
|
215
208
|
self._pre_instrument(func, *args, **kwargs)
|
|
216
209
|
|
|
217
210
|
result = await func(*args, **kwargs)
|
|
@@ -219,8 +212,6 @@ class instrument: # pylint: disable=invalid-name
|
|
|
219
212
|
self._post_instrument(result)
|
|
220
213
|
|
|
221
214
|
finally:
|
|
222
|
-
otel_context.detach(token_ctx)
|
|
223
|
-
|
|
224
215
|
self._detach_baggage(token)
|
|
225
216
|
|
|
226
217
|
return result
|
|
@@ -232,21 +223,18 @@ class instrument: # pylint: disable=invalid-name
|
|
|
232
223
|
def wrapper(*args, **kwargs):
|
|
233
224
|
self._parse_type_and_kind()
|
|
234
225
|
|
|
235
|
-
captured_ctx = otel_context.get_current()
|
|
236
|
-
parent_ctx = trace.set_span_in_context(trace.get_current_span())
|
|
237
|
-
|
|
238
226
|
token = self._attach_baggage()
|
|
239
|
-
ctx = self._get_traceparent()
|
|
240
227
|
|
|
241
|
-
|
|
228
|
+
ctx = self._get_traceparent()
|
|
242
229
|
|
|
243
230
|
try:
|
|
244
231
|
with ag.tracer.start_as_current_span(
|
|
245
232
|
name=func.__name__,
|
|
246
233
|
kind=self.kind,
|
|
247
|
-
context=
|
|
234
|
+
context=ctx,
|
|
248
235
|
):
|
|
249
236
|
self._set_link()
|
|
237
|
+
|
|
250
238
|
self._pre_instrument(func, *args, **kwargs)
|
|
251
239
|
|
|
252
240
|
result = func(*args, **kwargs)
|
|
@@ -254,8 +242,6 @@ class instrument: # pylint: disable=invalid-name
|
|
|
254
242
|
self._post_instrument(result)
|
|
255
243
|
|
|
256
244
|
finally:
|
|
257
|
-
otel_context.detach(token_ctx)
|
|
258
|
-
|
|
259
245
|
self._detach_baggage(token)
|
|
260
246
|
|
|
261
247
|
return result
|
agenta/sdk/types.py
CHANGED
|
@@ -5,6 +5,9 @@ from typing import List, Union, Optional, Dict, Literal, Any
|
|
|
5
5
|
from pydantic import ConfigDict, BaseModel, HttpUrl
|
|
6
6
|
from pydantic import BaseModel, Field, model_validator
|
|
7
7
|
|
|
8
|
+
from starlette.responses import StreamingResponse
|
|
9
|
+
|
|
10
|
+
|
|
8
11
|
from agenta.sdk.assets import supported_llm_models
|
|
9
12
|
from agenta.client.backend.types import AgentaNodesResponse, AgentaNodeDto
|
|
10
13
|
|
|
@@ -45,6 +48,42 @@ class BaseResponse(BaseModel):
|
|
|
45
48
|
model_config = ConfigDict(use_enum_values=True, exclude_none=True)
|
|
46
49
|
|
|
47
50
|
|
|
51
|
+
class StreamResponse(StreamingResponse):
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
content,
|
|
55
|
+
media_type: str = "text/event-stream",
|
|
56
|
+
*,
|
|
57
|
+
version: Optional[str] = "3.0",
|
|
58
|
+
tree_id: Optional[str] = None,
|
|
59
|
+
trace_id: Optional[str] = None,
|
|
60
|
+
span_id: Optional[str] = None,
|
|
61
|
+
content_type: Optional[str] = None,
|
|
62
|
+
extra_headers: Optional[Dict[str, str]] = None,
|
|
63
|
+
status_code: int = 200,
|
|
64
|
+
background=None,
|
|
65
|
+
):
|
|
66
|
+
headers = dict(extra_headers or {})
|
|
67
|
+
if version is not None:
|
|
68
|
+
headers["X-ag-version"] = version
|
|
69
|
+
if content_type:
|
|
70
|
+
headers["X-ag-content-type"] = content_type
|
|
71
|
+
if tree_id:
|
|
72
|
+
headers["X-ag-tree-id"] = tree_id
|
|
73
|
+
if trace_id:
|
|
74
|
+
headers["X-ag-trace-id"] = trace_id
|
|
75
|
+
if span_id:
|
|
76
|
+
headers["X-ag-span-id"] = span_id
|
|
77
|
+
|
|
78
|
+
super().__init__(
|
|
79
|
+
content=content,
|
|
80
|
+
media_type=media_type,
|
|
81
|
+
status_code=status_code,
|
|
82
|
+
headers=headers,
|
|
83
|
+
background=background,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
48
87
|
class DictInput(dict):
|
|
49
88
|
def __new__(cls, default_keys: Optional[List[str]] = None):
|
|
50
89
|
instance = super().__new__(cls, default_keys)
|
agenta/sdk/utils/otel.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from opentelemetry import context as otel_context
|
|
2
|
+
from opentelemetry.trace import get_current_span
|
|
3
|
+
from opentelemetry.baggage import get_all as get_all_baggage
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def debug_otel_context(label: str = "OTEL CONTEXT"):
|
|
7
|
+
ctx = otel_context.get_current()
|
|
8
|
+
span = get_current_span()
|
|
9
|
+
baggage = get_all_baggage(ctx)
|
|
10
|
+
|
|
11
|
+
print("\n===== {} =====".format(label))
|
|
12
|
+
print("Context object:", ctx)
|
|
13
|
+
print("Baggage:", baggage or "{}")
|
|
14
|
+
if span and span.get_span_context().is_valid:
|
|
15
|
+
print("Current Span:")
|
|
16
|
+
print(" Trace ID:", format(span.get_span_context().trace_id, "032x"))
|
|
17
|
+
print(" Span ID:", format(span.get_span_context().span_id, "016x"))
|
|
18
|
+
# print(" Is Recording:", span.is_recording())
|
|
19
|
+
else:
|
|
20
|
+
print("Current Span: None or Invalid")
|
|
21
|
+
print("=" * 40)
|
|
@@ -314,8 +314,8 @@ agenta/sdk/context/serving.py,sha256=f0Iq8Sv_CBJF7838tDecy_89K6HI7k6joWBkWHTM7yE
|
|
|
314
314
|
agenta/sdk/context/tracing.py,sha256=tM1T-HBt9D1qD8VsVKWlLe6MBRQrtHUA33E3KNM4GXQ,1237
|
|
315
315
|
agenta/sdk/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
316
316
|
agenta/sdk/decorators/running.py,sha256=j077-4u4XytNV57g0UY8ddG_M2k99Q829yPejiuGeg8,4034
|
|
317
|
-
agenta/sdk/decorators/serving.py,sha256=
|
|
318
|
-
agenta/sdk/decorators/tracing.py,sha256=
|
|
317
|
+
agenta/sdk/decorators/serving.py,sha256=N-oIKo39AD9bOw4dQibqc4YLW9rqa778e-2OlxLOkUw,27439
|
|
318
|
+
agenta/sdk/decorators/tracing.py,sha256=Nz1Y2na1Uw4S56qWZI9EXAI6LAxlru9SG5PdXJM6W_k,15105
|
|
319
319
|
agenta/sdk/litellm/__init__.py,sha256=Bpz1gfHQc0MN1yolWcjifLWznv6GjHggvRGQSpxpihM,37
|
|
320
320
|
agenta/sdk/litellm/litellm.py,sha256=dCjw0H_jD3L3UQ3l9SbLm5dfeIGnel6dPtQYJ78beYM,10202
|
|
321
321
|
agenta/sdk/litellm/mockllm.py,sha256=F10Sbj2V1Cihkg6bgHkIOuw8irYEYpIp47UsO8LGOeE,2322
|
|
@@ -349,7 +349,7 @@ agenta/sdk/tracing/processors.py,sha256=ZE6baO2U3ER73rckvXhdbNmLgs3jn6le7iAUQc6o
|
|
|
349
349
|
agenta/sdk/tracing/propagation.py,sha256=EeOqDMqnh_MoEhGd1do_vy_tQBYUcoC8kpLqVoZeqg0,2561
|
|
350
350
|
agenta/sdk/tracing/spans.py,sha256=nqUOjjirBxB8Eacv8Qj4Ra_6rknGi3lbJdNyKmk5ODQ,3707
|
|
351
351
|
agenta/sdk/tracing/tracing.py,sha256=eqQLcvgmR6Tz0WSwLCERkGKiLzsKfDyR_ah-Tyz1qGE,9256
|
|
352
|
-
agenta/sdk/types.py,sha256=
|
|
352
|
+
agenta/sdk/types.py,sha256=0-_eR7BZjLZRHmo6HSTsfOhNFmbX_a6GfigqaM7dFX4,21883
|
|
353
353
|
agenta/sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
354
354
|
agenta/sdk/utils/cache.py,sha256=q6SYVzHW9RCwtZ7z4Ue3uMwXroroLlko5AvQ1MouvFM,1429
|
|
355
355
|
agenta/sdk/utils/constants.py,sha256=zW3R4rjXOo2L5lz6q84l_zYuOM9u4mpPRHw_B1Dr_hI,67
|
|
@@ -358,6 +358,7 @@ agenta/sdk/utils/exceptions.py,sha256=Dq3lh5Ug7IhF4nvYRXXlwhgxEuByOnT1w0uVMZx1ea
|
|
|
358
358
|
agenta/sdk/utils/globals.py,sha256=9ixKS8aI6ZWgsjT8WngvTg4dsnP2cKErNJngHxzdK9U,256
|
|
359
359
|
agenta/sdk/utils/helpers.py,sha256=nqUrTfRQfzQhP9ZuJ72MXVRtIFgAoIhzymFN2wGZYhQ,1198
|
|
360
360
|
agenta/sdk/utils/logging.py,sha256=j4NzpFk2ilOM10sRBOxCjmansDHSx6HwMV8IAEreRb8,8386
|
|
361
|
+
agenta/sdk/utils/otel.py,sha256=X5oNv3PqTghDPa0OjKeFJdFNcfDtI40N4jv5WMNrZ38,806
|
|
361
362
|
agenta/sdk/utils/preinit.py,sha256=1TAAHhYyYnLLwvzwnf33Qwkou7tI3iITlVt-1kcyGaM,1186
|
|
362
363
|
agenta/sdk/utils/singleton.py,sha256=17Ph7LGnnV8HkPjImruKita2ni03Ari5jr0jqm__4sc,312
|
|
363
364
|
agenta/sdk/utils/timing.py,sha256=nZR-kudVUtKFlHuBhztgSGxj7FVnCB4Uv6sfg-1dkrQ,1556
|
|
@@ -365,6 +366,6 @@ agenta/sdk/workflows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
|
|
|
365
366
|
agenta/sdk/workflows/registry.py,sha256=OucCfmhyEENAF5OwjRBLjbDIy3Qar-prFXLhKMU0BZA,944
|
|
366
367
|
agenta/sdk/workflows/types.py,sha256=nklaaIrK0o5Nloy1l6hnPXjtN7H4-OUv0ivAUf278Og,11682
|
|
367
368
|
agenta/sdk/workflows/utils.py,sha256=ILfY8DSBWLrdWIuKg6mq7rANwKiiY6sxEeFiBFhjLYM,413
|
|
368
|
-
agenta-0.51.
|
|
369
|
-
agenta-0.51.
|
|
370
|
-
agenta-0.51.
|
|
369
|
+
agenta-0.51.6.dist-info/METADATA,sha256=UpiHrNBK2TAXDbxHOKqmqmWAKE3ktZXraOnzge3tX_4,31641
|
|
370
|
+
agenta-0.51.6.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
371
|
+
agenta-0.51.6.dist-info/RECORD,,
|
|
File without changes
|