agenta 0.44.4__py3-none-any.whl → 0.45.1__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.

@@ -363,20 +363,44 @@ class entrypoint:
363
363
  tree = None
364
364
  content_type = "text/plain"
365
365
  tree_id = None
366
+ trace_id = None
367
+ span_id = None
366
368
 
367
369
  with suppress():
368
370
  if isinstance(result, (dict, list)):
369
371
  content_type = "application/json"
370
372
  data = self.patch_result(result)
371
373
 
372
- tree, tree_id = await self.fetch_inline_trace(inline)
374
+ (
375
+ tree,
376
+ tree_id,
377
+ trace_id,
378
+ span_id,
379
+ ) = await self.fetch_inline_trace(inline)
373
380
 
374
381
  try:
375
382
  return BaseResponse(
376
- data=data, tree=tree, content_type=content_type, tree_id=tree_id
383
+ data=data,
384
+ tree=tree,
385
+ content_type=content_type,
386
+ tree_id=tree_id,
387
+ trace_id=trace_id,
388
+ span_id=span_id,
377
389
  )
378
390
  except: # pylint: disable=bare-except
379
- return BaseResponse(data=data, content_type=content_type)
391
+ try:
392
+ return BaseResponse(
393
+ data=data,
394
+ content_type=content_type,
395
+ tree_id=tree_id,
396
+ trace_id=trace_id,
397
+ span_id=span_id,
398
+ )
399
+ except: # pylint: disable=bare-except
400
+ return BaseResponse(
401
+ data=data,
402
+ content_type=content_type,
403
+ )
380
404
 
381
405
  def handle_failure(
382
406
  self,
@@ -444,8 +468,10 @@ class entrypoint:
444
468
 
445
469
  link = context.link
446
470
 
447
- _tree_id = link.get("tree_id") if link else None # in int format
448
- tree_id = str(UUID(int=_tree_id)) if _tree_id else None # in uuid_as_str format
471
+ _trace_id = link.get("trace_id") if link else None # in int format
472
+ tree_id = (
473
+ str(UUID(int=_trace_id)) if _trace_id else None
474
+ ) # in uuid_as_str format
449
475
 
450
476
  return tree_id
451
477
 
@@ -461,24 +487,28 @@ class entrypoint:
461
487
 
462
488
  link = context.link
463
489
 
490
+ _trace_id = link.get("trace_id") if link else None # in int format
491
+ _span_id = link.get("span_id") if link else None # in int format
492
+
464
493
  tree = None
465
- _tree_id = link.get("tree_id") if link else None # in int format
466
- tree_id = str(UUID(int=_tree_id)) if _tree_id else None # in uuid_as_str format
494
+ tree_id = str(UUID(int=_trace_id)) if _trace_id else None
495
+ trace_id = UUID(int=_trace_id).hex if _trace_id else None
496
+ span_id = UUID(int=_span_id).hex[16:] if _span_id else None
467
497
 
468
- if _tree_id is not None:
498
+ if _trace_id is not None:
469
499
  if inline:
470
500
  remaining_steps = NOFSTEPS
471
501
  while (
472
- not ag.tracing.is_inline_trace_ready(_tree_id)
502
+ not ag.tracing.is_inline_trace_ready(_trace_id)
473
503
  and remaining_steps > 0
474
504
  ):
475
505
  await sleep(TIMESTEP)
476
506
 
477
507
  remaining_steps -= 1
478
508
 
479
- tree = ag.tracing.get_inline_trace(_tree_id)
509
+ tree = ag.tracing.get_inline_trace(_trace_id)
480
510
 
481
- return tree, tree_id
511
+ return tree, tree_id, trace_id, span_id
482
512
 
483
513
  # --- OpenAPI --- #
484
514
 
@@ -131,8 +131,8 @@ class instrument: # pylint: disable=invalid-name
131
131
 
132
132
  if not context.link:
133
133
  context.link = {
134
- "tree_id": span.get_span_context().trace_id,
135
- "node_id": span.get_span_context().span_id,
134
+ "trace_id": span.get_span_context().trace_id,
135
+ "span_id": span.get_span_context().span_id,
136
136
  }
137
137
 
138
138
  tracing_context.set(context)
@@ -1,23 +1,31 @@
1
1
  from typing import Optional, Protocol, Any
2
+ from os import environ
3
+
4
+ from agenta.sdk.utils.logging import get_module_logger
2
5
 
3
6
  from agenta.sdk.litellm.mocks import MOCKS
4
7
  from agenta.sdk.context.routing import routing_context
5
8
 
9
+ AGENTA_LITELLM_MOCK = environ.get("AGENTA_LITELLM_MOCK") or None
10
+
11
+ log = get_module_logger(__name__)
12
+
6
13
 
7
14
  class LitellmProtocol(Protocol):
8
- async def acompletion(self, *args: Any, **kwargs: Any) -> Any:
9
- ...
15
+ async def acompletion(self, *args: Any, **kwargs: Any) -> Any: ...
10
16
 
11
17
 
12
18
  litellm: Optional[LitellmProtocol] = None # pylint: disable=invalid-name
13
19
 
14
20
 
15
21
  async def acompletion(*args, **kwargs):
16
- mock = routing_context.get().mock
22
+ mock = AGENTA_LITELLM_MOCK or routing_context.get().mock
17
23
 
18
24
  if mock:
25
+ log.debug("Mocking litellm: %s.", mock)
26
+
19
27
  if mock not in MOCKS:
20
- raise ValueError(f"Mock {mock} not found")
28
+ mock = "hello"
21
29
 
22
30
  return MOCKS[mock](*args, **kwargs)
23
31
 
@@ -1,4 +1,5 @@
1
1
  from typing import Callable
2
+ from asyncio import sleep
2
3
 
3
4
  from pydantic import BaseModel
4
5
 
@@ -30,7 +31,26 @@ def hello_mock_response(*args, **kwargs) -> MockResponseModel:
30
31
  def chat_mock_response(*args, **kwargs) -> MockResponseModel:
31
32
  return MockResponseModel(
32
33
  choices=[
33
- MockChoiceModel(message=MockMessageModel(content="world", role="assistant"))
34
+ MockChoiceModel(
35
+ message=MockMessageModel(
36
+ content="world",
37
+ role="assistant",
38
+ )
39
+ )
40
+ ],
41
+ )
42
+
43
+
44
+ def delay_mock_response(*args, **kwargs) -> MockResponseModel:
45
+ sleep(2)
46
+
47
+ return MockResponseModel(
48
+ choices=[
49
+ MockChoiceModel(
50
+ message=MockMessageModel(
51
+ content="delay",
52
+ )
53
+ )
34
54
  ],
35
55
  )
36
56
 
@@ -38,4 +58,5 @@ def chat_mock_response(*args, **kwargs) -> MockResponseModel:
38
58
  MOCKS: dict[str, Callable[..., MockResponseModel]] = {
39
59
  "hello": hello_mock_response,
40
60
  "chat": chat_mock_response,
61
+ "delay": delay_mock_response,
41
62
  }
@@ -12,11 +12,6 @@ AppType = Literal["SERVICE:completion", "SERVICE:chat", "CUSTOM"]
12
12
  DEFAULT_APP_TYPE = "SERVICE:completion"
13
13
 
14
14
 
15
- AppType = Literal["SERVICE:completion", "SERVICE:chat", "CUSTOM"]
16
-
17
- DEFAULT_APP_TYPE = "SERVICE:completion"
18
-
19
-
20
15
  class AppManager:
21
16
  @classmethod
22
17
  @handle_exceptions()
@@ -92,15 +92,21 @@ class ConfigMiddleware(BaseHTTPMiddleware):
92
92
  return parameters, references
93
93
 
94
94
  config = {}
95
- async with httpx.AsyncClient() as client:
96
- response = await client.post(
97
- f"{self.host}/api/variants/configs/fetch",
98
- headers=headers,
99
- json=refs,
100
- )
101
-
102
- if response.status_code == 200:
103
- config = response.json()
95
+
96
+ is_test_path = request.url.path.endswith("/test")
97
+ are_refs_missing = not variant_ref and not environment_ref
98
+ should_fetch = not is_test_path or not are_refs_missing
99
+
100
+ if should_fetch:
101
+ async with httpx.AsyncClient() as client:
102
+ response = await client.post(
103
+ f"{self.host}/api/variants/configs/fetch",
104
+ headers=headers,
105
+ json=refs,
106
+ )
107
+
108
+ if response.status_code == 200:
109
+ config = response.json()
104
110
 
105
111
  if not config:
106
112
  config["application_ref"] = refs[
@@ -160,6 +160,9 @@ class OTelExtraDTO(BaseModel):
160
160
 
161
161
 
162
162
  class SpanDTO(BaseModel):
163
+ trace_id: str
164
+ span_id: str
165
+
163
166
  scope: Optional[ProjectScopeDTO] = None
164
167
 
165
168
  lifecycle: Optional[LifecycleDTO] = None
@@ -792,6 +795,9 @@ def _parse_from_attributes(
792
795
  def parse_from_otel_span_dto(
793
796
  otel_span_dto: OTelSpanDTO,
794
797
  ) -> SpanDTO:
798
+ trace_id = str(otel_span_dto.context.trace_id[2:])
799
+ span_id = str(otel_span_dto.context.span_id[2:])
800
+
795
801
  lifecyle = LifecycleDTO(
796
802
  created_at=datetime.now(),
797
803
  )
@@ -800,7 +806,7 @@ def parse_from_otel_span_dto(
800
806
 
801
807
  types = _parse_from_types(otel_span_dto)
802
808
 
803
- tree_id = UUID(otel_span_dto.context.trace_id[2:])
809
+ tree_id = UUID(trace_id)
804
810
 
805
811
  tree_type: str = types.get("tree")
806
812
 
@@ -809,7 +815,7 @@ def parse_from_otel_span_dto(
809
815
  type=tree_type.lower() if tree_type else None,
810
816
  )
811
817
 
812
- node_id = UUID(tree_id.hex[16:] + otel_span_dto.context.span_id[2:])
818
+ node_id = UUID(trace_id[16:] + span_id)
813
819
 
814
820
  node_type = NodeType.TASK
815
821
  try:
@@ -871,6 +877,8 @@ def parse_from_otel_span_dto(
871
877
  )
872
878
 
873
879
  span_dto = SpanDTO(
880
+ trace_id=trace_id,
881
+ span_id=span_id,
874
882
  lifecycle=lifecyle,
875
883
  root=root,
876
884
  tree=tree,
@@ -1,8 +1,9 @@
1
1
  from typing import Optional, Dict, List
2
+ from threading import Lock
2
3
 
3
4
  from opentelemetry.baggage import get_all as get_baggage
4
5
  from opentelemetry.context import Context
5
- from opentelemetry.sdk.trace import Span
6
+ from opentelemetry.sdk.trace import Span, SpanProcessor
6
7
  from opentelemetry.sdk.trace.export import (
7
8
  SpanExporter,
8
9
  ReadableSpan,
@@ -154,3 +155,32 @@ class TraceProcessor(BatchSpanProcessor):
154
155
  # --- INLINE
155
156
 
156
157
  return trace
158
+
159
+
160
+ # Internal storage for the last ended span context
161
+ _last_ended_span_context = None
162
+ _lock = Lock()
163
+
164
+
165
+ def _set_last_ended(span_ctx) -> None:
166
+ """Set the last ended span context"""
167
+ with _lock:
168
+ global _last_ended_span_context
169
+ _last_ended_span_context = span_ctx
170
+
171
+
172
+ def _get_last_ended():
173
+ """Get the last ended span context"""
174
+ with _lock:
175
+ return _last_ended_span_context
176
+
177
+
178
+ class EndedSpanRecorder(SpanProcessor):
179
+ """Records the last ended span context for later reference.
180
+
181
+ This allows accessing span information even after the span has been ended,
182
+ which is useful for linking annotations to auto-instrumented spans.
183
+ """
184
+
185
+ def on_end(self, span):
186
+ _set_last_ended(span.get_span_context())
@@ -1,8 +1,11 @@
1
1
  from typing import Optional, Any, Dict, Callable
2
2
  from enum import Enum
3
+ from uuid import UUID
3
4
 
5
+ from pydantic import BaseModel
4
6
  from httpx import get as check
5
7
 
8
+
6
9
  from opentelemetry.trace import (
7
10
  get_current_span,
8
11
  set_tracer_provider,
@@ -10,13 +13,19 @@ from opentelemetry.trace import (
10
13
  Status,
11
14
  StatusCode,
12
15
  )
16
+ from opentelemetry.sdk import trace
13
17
  from opentelemetry.sdk.trace import Span, Tracer, TracerProvider
14
18
  from opentelemetry.sdk.resources import Resource
15
19
 
20
+
16
21
  from agenta.sdk.utils.singleton import Singleton
17
22
  from agenta.sdk.utils.exceptions import suppress
18
23
  from agenta.sdk.utils.logging import get_module_logger
19
- from agenta.sdk.tracing.processors import TraceProcessor
24
+ from agenta.sdk.tracing.processors import (
25
+ TraceProcessor,
26
+ EndedSpanRecorder,
27
+ _get_last_ended,
28
+ )
20
29
  from agenta.sdk.tracing.exporters import InlineExporter, OTLPExporter
21
30
  from agenta.sdk.tracing.spans import CustomSpan
22
31
  from agenta.sdk.tracing.inline import parse_inline_trace
@@ -24,9 +33,27 @@ from agenta.sdk.tracing.conventions import Reference, is_valid_attribute_key
24
33
  from agenta.sdk.tracing.propagation import extract, inject
25
34
  from agenta.sdk.utils.cache import TTLLRUCache
26
35
 
36
+ from agenta.sdk.context.tracing import tracing_context
37
+
27
38
  log = get_module_logger(__name__)
28
39
 
29
40
 
41
+ _original_init = trace.TracerProvider.__init__
42
+
43
+
44
+ def patched_init(self, *args, **kwargs):
45
+ _original_init(self, *args, **kwargs)
46
+ self.add_span_processor(EndedSpanRecorder())
47
+
48
+
49
+ trace.TracerProvider.__init__ = patched_init
50
+
51
+
52
+ class Link(BaseModel):
53
+ trace_id: str
54
+ span_id: str
55
+
56
+
30
57
  class Tracing(metaclass=Singleton):
31
58
  VERSION = "0.1.0"
32
59
 
@@ -242,6 +269,61 @@ class Tracing(metaclass=Singleton):
242
269
  ):
243
270
  return inject(*args, **kwargs)
244
271
 
272
+ def get_current_span_context(self):
273
+ """Get the current active span context if available.
274
+
275
+ Returns:
276
+ SpanContext or None if no active span
277
+ """
278
+ span = get_current_span()
279
+ ctx = span.get_span_context()
280
+ return ctx if ctx and ctx.is_valid else None
281
+
282
+ def get_last_span_context(self):
283
+ """Get the last closed span context if available.
284
+
285
+ This is useful for accessing span information after a span has closed,
286
+ particularly with auto-instrumentation libraries.
287
+
288
+ Returns:
289
+ SpanContext or None if no spans have been closed
290
+ """
291
+ return _get_last_ended()
292
+
293
+ def get_span_context(self):
294
+ """Get the most relevant span context.
295
+
296
+ First tries to get the current active span context.
297
+ If no active span exists, falls back to the last closed span.
298
+
299
+ Returns:
300
+ SpanContext or None if no relevant span context is available
301
+ """
302
+ return self.get_current_span_context() or self.get_last_span_context()
303
+
304
+ def build_invocation_link(self, span_ctx=None) -> Optional[Link]:
305
+ """
306
+ Builds a Link object containing the hex-formatted trace_id and span_id
307
+ from the current (or fallback last ended) span context.
308
+ Useful to link annotations to spans.
309
+
310
+ Args:
311
+ span_ctx: Optional SpanContext to convert to a Link
312
+
313
+ Returns:
314
+ Link object with trace_id and span_id or None if no valid context
315
+ """
316
+ if span_ctx is None:
317
+ span_ctx = self.get_span_context()
318
+
319
+ if span_ctx and span_ctx.is_valid:
320
+ return Link(
321
+ trace_id=f"{span_ctx.trace_id:032x}",
322
+ span_id=f"{span_ctx.span_id:016x}",
323
+ )
324
+
325
+ return None
326
+
245
327
 
246
328
  def get_tracer(
247
329
  tracing: Tracing,
agenta/sdk/types.py CHANGED
@@ -39,6 +39,8 @@ class BaseResponse(BaseModel):
39
39
  content_type: Optional[str] = "string"
40
40
  tree: Optional[AgentaNodesResponse] = None
41
41
  tree_id: Optional[str] = None
42
+ trace_id: Optional[str] = None
43
+ span_id: Optional[str] = None
42
44
 
43
45
  model_config = ConfigDict(use_enum_values=True, exclude_none=True)
44
46
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: agenta
3
- Version: 0.44.4
3
+ Version: 0.45.1
4
4
  Summary: The SDK for agenta is an open-source LLMOps platform.
5
5
  Keywords: LLMOps,LLM,evaluation,prompt engineering
6
6
  Author: Mahmoud Mabrouk
@@ -206,14 +206,14 @@ agenta/sdk/context/exporting.py,sha256=16X8fgMhl58gehSlqANX97FiKxx4TkGiG4d2B0-7Z
206
206
  agenta/sdk/context/routing.py,sha256=FEsjw8EttI1SMyUo96ptcUsvHJnhoKwdr1szlkxxJNU,598
207
207
  agenta/sdk/context/tracing.py,sha256=xjErrXP1Nq1AfL-Cif1l-lNEfs12eQ3v_VCRgoKe7nY,743
208
208
  agenta/sdk/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
209
- agenta/sdk/decorators/routing.py,sha256=B3nplfdFk774KLf_cs72ovx_06nfdpYM8tp6RHd38Z0,24799
210
- agenta/sdk/decorators/tracing.py,sha256=n3AZWw8HHKUoIHD79_ktPQcoZRIw3RthSxU5xkO-skg,10109
209
+ agenta/sdk/decorators/routing.py,sha256=L3o0Q9flBfb2UIfCIx0OWzkP0W-45_GQ3-Ri8phwNlU,25678
210
+ agenta/sdk/decorators/tracing.py,sha256=pABMVFtqD99W3ErqWDFUmymmXiXdzhdAJG01l-CTLVQ,10110
211
211
  agenta/sdk/litellm/__init__.py,sha256=Bpz1gfHQc0MN1yolWcjifLWznv6GjHggvRGQSpxpihM,37
212
212
  agenta/sdk/litellm/litellm.py,sha256=dCjw0H_jD3L3UQ3l9SbLm5dfeIGnel6dPtQYJ78beYM,10202
213
- agenta/sdk/litellm/mockllm.py,sha256=8V6dqdv8eA4P-VoXIwHNYlIjHG189P14POSfSfluVw0,678
214
- agenta/sdk/litellm/mocks/__init__.py,sha256=0bGjOOWXz8BxE0rvRWciPP7SAegO2mgi_UtWw8jTlDk,866
213
+ agenta/sdk/litellm/mockllm.py,sha256=mu14jL-hk4OmzW5HdqX6T5_D5nYYhkQf4SVIZhdGdCc,894
214
+ agenta/sdk/litellm/mocks/__init__.py,sha256=BH92MtQNPLfbN6ERk13XuDjVnNHy9joi7E_I3heUDC4,1299
215
215
  agenta/sdk/managers/__init__.py,sha256=SN-LRwG0pRRDV3u2Q4JiiSTigN3-mYpzGNM35RzT4mc,238
216
- agenta/sdk/managers/apps.py,sha256=hfkXat6cgZUDdW02LlMaMgO1e05m1Me3BKgSyFF9kVc,2359
216
+ agenta/sdk/managers/apps.py,sha256=BeAlTJlOOM0Wh_XWgjve65Mt-LwFgib_swu-1wvGQi4,2250
217
217
  agenta/sdk/managers/config.py,sha256=Dl1L4KGvj3h_temzJzn7FVHacABRuB2Q7_x98EpZJQo,7494
218
218
  agenta/sdk/managers/deployment.py,sha256=SEokjZeh6n7HRKZ92Y0WncdG49hIFx-Z3B3HAl2kmUg,1174
219
219
  agenta/sdk/managers/secrets.py,sha256=QFWLQY3Enev187sNOvV3yBBYFwcPoDnInwgwlRD0SEw,7458
@@ -222,7 +222,7 @@ agenta/sdk/managers/variant.py,sha256=A5ga3mq3b0weUTXa9HO72MGaspthGcu1uK9K5OnP73
222
222
  agenta/sdk/managers/vault.py,sha256=054ce9X_xKa2M4NtQWz-GugO6q_pYVWCP3IxbAJJcRw,337
223
223
  agenta/sdk/middleware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
224
224
  agenta/sdk/middleware/auth.py,sha256=xS8lVlPmapvxz_bbZ2XPxcllA0kK7iFR8TMoMVymp4M,10156
225
- agenta/sdk/middleware/config.py,sha256=9yFFlrkcoGNczj0ZfkbliWIt1S84cnEvB4RMCzdbBWc,7715
225
+ agenta/sdk/middleware/config.py,sha256=g3f81uywYCcgT_TSQxZ5O1Db9wGmPuRMlf-8WKqWqdA,7963
226
226
  agenta/sdk/middleware/cors.py,sha256=q3r7lGkrIdMcT_vuhsburMcjG7pyl7w0ycxrIrGJ2e8,921
227
227
  agenta/sdk/middleware/inline.py,sha256=ee8E4XBGcRSrHTvblqX1yRXuTN_sxLm7lY1jnywrBG8,901
228
228
  agenta/sdk/middleware/mock.py,sha256=bCUN9iJBxePyN9MBwBpJs-_iCNkUQeUjIIu3WElS1oQ,759
@@ -233,12 +233,12 @@ agenta/sdk/tracing/__init__.py,sha256=rQNe5-zT5Kt7_CDhq-lnUIi1EYTBVzVf_MbfcIxVD9
233
233
  agenta/sdk/tracing/attributes.py,sha256=DwjjOk3mGOvz0jYu8EYr3hhItvawK5GX80_MfciqPrc,5559
234
234
  agenta/sdk/tracing/conventions.py,sha256=JBtznBXZ3aRkGKkLl7cPwdMNh3w1G-H2Ta2YrAxbr38,950
235
235
  agenta/sdk/tracing/exporters.py,sha256=Vs1aQLRrWvYgWxjPmlfBWTN4wmUzBREqjTdIV1XcV9o,3251
236
- agenta/sdk/tracing/inline.py,sha256=tY9mH1zMlJMqf2WWKJdakLtMHJKNeYRaynqvsPeqpTY,31312
237
- agenta/sdk/tracing/processors.py,sha256=MZZvvjL2HeFIS2TKX0nrxTenoY0_oKHdNEU7QgxeNpk,4310
236
+ agenta/sdk/tracing/inline.py,sha256=ShPAAjk_26I4hgrmC6y0n-I9gxB3Q4VeEYhhsLHInPU,31454
237
+ agenta/sdk/tracing/processors.py,sha256=vDzQItQnDG_bL5rWRZjh-8DOLcfhXJcMVCAbStiTVDA,5102
238
238
  agenta/sdk/tracing/propagation.py,sha256=EeOqDMqnh_MoEhGd1do_vy_tQBYUcoC8kpLqVoZeqg0,2561
239
239
  agenta/sdk/tracing/spans.py,sha256=nqUOjjirBxB8Eacv8Qj4Ra_6rknGi3lbJdNyKmk5ODQ,3707
240
- agenta/sdk/tracing/tracing.py,sha256=62y9ZAs8ZfjOZmlTYVHniewqZRZeNwz76XGd8cczmY4,7211
241
- agenta/sdk/types.py,sha256=247cPB451E91icR198wTXvJG0Hgm2HNtC0H2MmqUwTE,19042
240
+ agenta/sdk/tracing/tracing.py,sha256=Yv42drWc2tVu4YugHKWYsgTSf1y7Y9boYL8akxKT4eA,9503
241
+ agenta/sdk/types.py,sha256=Xpmm0D2pJKfoEWWXojvSIUEhU-kNrjF_eFmrPD4JYA4,19111
242
242
  agenta/sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
243
243
  agenta/sdk/utils/cache.py,sha256=69pQCtmh10DiYoOdKv4t2fCYDQCuWZtH4uy36kXewpw,1372
244
244
  agenta/sdk/utils/constants.py,sha256=zW3R4rjXOo2L5lz6q84l_zYuOM9u4mpPRHw_B1Dr_hI,67
@@ -250,6 +250,6 @@ agenta/sdk/utils/logging.py,sha256=gBk2ecRvltN7f8qtnUHXBiZPWOdArN_b5civ_3w_Oek,8
250
250
  agenta/sdk/utils/preinit.py,sha256=YlJL7RLfel0R7DFp-jK7OV-z4ZIQJM0oupYlk7g8b5o,1278
251
251
  agenta/sdk/utils/singleton.py,sha256=17Ph7LGnnV8HkPjImruKita2ni03Ari5jr0jqm__4sc,312
252
252
  agenta/sdk/utils/timing.py,sha256=nZR-kudVUtKFlHuBhztgSGxj7FVnCB4Uv6sfg-1dkrQ,1556
253
- agenta-0.44.4.dist-info/METADATA,sha256=7-ZCP9mKjOEiYLVoT8D2-5QMBotT-WMxXMjI-_DiMhQ,31418
254
- agenta-0.44.4.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
255
- agenta-0.44.4.dist-info/RECORD,,
253
+ agenta-0.45.1.dist-info/METADATA,sha256=mWM-73TJT8NOj9Lsf-vNfnXS8vWmnMGhKR9BnWEqq1Y,31418
254
+ agenta-0.45.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
255
+ agenta-0.45.1.dist-info/RECORD,,