agentx-python 0.6.24__tar.gz → 0.6.26__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. {agentx_python-0.6.24 → agentx_python-0.6.26}/PKG-INFO +1 -1
  2. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/datasets.py +11 -1
  3. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/models.py +5 -0
  4. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/results.py +3 -0
  5. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/langchain.py +1 -0
  6. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/tracing/tracer.py +14 -1
  7. agentx_python-0.6.26/agentx/version.py +1 -0
  8. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/PKG-INFO +1 -1
  9. agentx_python-0.6.24/agentx/version.py +0 -1
  10. {agentx_python-0.6.24 → agentx_python-0.6.26}/LICENSE +0 -0
  11. {agentx_python-0.6.24 → agentx_python-0.6.26}/README.md +0 -0
  12. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/__init__.py +0 -0
  13. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/agentx.py +0 -0
  14. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/cli.py +0 -0
  15. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/__init__.py +0 -0
  16. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/_term.py +0 -0
  17. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/adapters/__init__.py +0 -0
  18. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/adapters/http_endpoint.py +0 -0
  19. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/adapters/precomputed.py +0 -0
  20. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/adapters/raw.py +0 -0
  21. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/client.py +0 -0
  22. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/evaluation_settings.py +0 -0
  23. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/prompts.py +0 -0
  24. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/redaction.py +0 -0
  25. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/reporting.py +0 -0
  26. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/runner.py +0 -0
  27. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/tracing.py +0 -0
  28. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/exceptions.py +0 -0
  29. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/feedback.py +0 -0
  30. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/__init__.py +0 -0
  31. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/_traced_call.py +0 -0
  32. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/anthropic.py +0 -0
  33. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/autogen.py +0 -0
  34. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/crewai.py +0 -0
  35. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/databricks.py +0 -0
  36. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/google_adk.py +0 -0
  37. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/google_genai.py +0 -0
  38. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/litellm.py +0 -0
  39. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/llamaindex.py +0 -0
  40. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/moveworks.py +0 -0
  41. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/openai.py +0 -0
  42. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/openai_agents.py +0 -0
  43. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/__init__.py +0 -0
  44. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/client.py +0 -0
  45. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/models.py +0 -0
  46. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/online_evaluators.py +0 -0
  47. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/patterns.py +0 -0
  48. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/profile.py +0 -0
  49. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/signals.py +0 -0
  50. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/outcomes.py +0 -0
  51. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/py.typed +0 -0
  52. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/resources/__init__.py +0 -0
  53. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/resources/agent.py +0 -0
  54. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/resources/conversation.py +0 -0
  55. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/resources/workforce.py +0 -0
  56. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/tracing/__init__.py +0 -0
  57. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/tracing/ci_types.py +0 -0
  58. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/tracing/ingest_client.py +0 -0
  59. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/util.py +0 -0
  60. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/SOURCES.txt +0 -0
  61. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/dependency_links.txt +0 -0
  62. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/entry_points.txt +0 -0
  63. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/not-zip-safe +0 -0
  64. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/requires.txt +0 -0
  65. {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/top_level.txt +0 -0
  66. {agentx_python-0.6.24 → agentx_python-0.6.26}/setup.cfg +0 -0
  67. {agentx_python-0.6.24 → agentx_python-0.6.26}/setup.py +0 -0
  68. {agentx_python-0.6.24 → agentx_python-0.6.26}/tests/test_integration.py +0 -0
  69. {agentx_python-0.6.24 → agentx_python-0.6.26}/tests/test_integrations.py +0 -0
  70. {agentx_python-0.6.24 → agentx_python-0.6.26}/tests/test_span_tree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentx-python
3
- Version: 0.6.24
3
+ Version: 0.6.26
4
4
  Summary: Official Python SDK for AgentX (https://www.agentx.so/)
5
5
  Home-page: https://github.com/AgentX-ai/AgentX-python
6
6
  Author: Robin Wang and AgentX Team
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import csv
4
4
  import logging
5
5
  from pathlib import Path
6
- from typing import Any, Dict, List, Optional, TYPE_CHECKING
6
+ from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union
7
7
 
8
8
  from agentx.evaluations.models import Dataset
9
9
 
@@ -88,6 +88,7 @@ class DatasetBuilder:
88
88
  smoke_test_guidance: Optional[str] = None,
89
89
  expected_tools: Optional[List[str]] = None,
90
90
  trajectory_match_mode: str = "strict",
91
+ expected_retrieval_context: Optional[Union[str, List[str]]] = None,
91
92
  ) -> "DatasetBuilder":
92
93
  """Add a case. `judge_guideline` is optional grading guidance specific to this question.
93
94
 
@@ -99,6 +100,13 @@ class DatasetBuilder:
99
100
  any order), "superset" (all expected present, extras allowed), or "subset" (no unexpected
100
101
  calls, missing allowed).
101
102
 
103
+ `expected_retrieval_context` (string or list of chunk strings) declares what a correct
104
+ retriever should have fetched for this case. When the run's result carries actual
105
+ retrieved context (a `retrieval_context` return value, or a linked trace with retrieval
106
+ spans), the engine compares the two with token-level Jaccard similarity and reports a
107
+ deterministic "Context match (jaccard)" scorer row (0-1) - a cheap retriever regression
108
+ check with no LLM judge call.
109
+
102
110
  `smoke_test_count`, when set (1-10), asks this question that many extra ways each
103
111
  evaluation run, LLM-paraphrased server-side, to catch agents that are brittle to phrasing
104
112
  rather than genuinely wrong. `smoke_test_guidance` optionally steers what kind of variants
@@ -123,6 +131,8 @@ class DatasetBuilder:
123
131
  main["smokeTest"]["guidance"] = smoke_test_guidance
124
132
  if expected_tools:
125
133
  main["expectedTrajectory"] = {"tools": expected_tools, "mode": trajectory_match_mode}
134
+ if expected_retrieval_context:
135
+ main["expectedRetrievalContext"] = expected_retrieval_context
126
136
  self._payload["questions"].append(
127
137
  {
128
138
  "main_question": main,
@@ -346,6 +346,11 @@ class EvaluationResult(BaseModel):
346
346
  # the dashboard's "Message Trace Details -> Execution Timeline" render the full execution
347
347
  # trace for this case, not just the lightweight observable_trace events above.
348
348
  trace_id: Optional[str] = Field(default=None, alias="traceId")
349
+ # What the agent actually retrieved for THIS case (a string, or list of chunk strings) - the
350
+ # {context} the RAG metric pack's judges grade faithfulness/relevancy against. Overrides the
351
+ # question's static retrievalContext; when absent, the engine falls back to the linked
352
+ # trace's recorded retrieval spans (trace_id above), then the case's pinned context.
353
+ retrieval_context: Optional[Any] = Field(default=None, alias="retrievalContext")
349
354
  # Smoke test: set by execute() from the originating EvaluationCase, not something you need to
350
355
  # set yourself when returning a plain str/dict from your callable.
351
356
  is_smoke_test_variant: Optional[bool] = Field(default=None, alias="isSmokeTestVariant")
@@ -37,6 +37,7 @@ def normalize_result(
37
37
  output: Optional[dict] = None
38
38
  trace = None
39
39
  trace_id: Optional[str] = None
40
+ retrieval_context = None
40
41
  metadata: Optional[dict] = None
41
42
  error: Optional[ResultError] = None
42
43
  input_tokens: Optional[int] = None
@@ -55,6 +56,7 @@ def normalize_result(
55
56
  trace = build_trace(raw.get("trace") or raw.get("observable_trace"))
56
57
  trace_id_raw = raw.get("trace_id") or raw.get("traceId")
57
58
  trace_id = str(trace_id_raw) if trace_id_raw else None
59
+ retrieval_context = raw.get("retrieval_context") or raw.get("retrievalContext")
58
60
  meta_raw = raw.get("metadata")
59
61
  if isinstance(meta_raw, dict):
60
62
  metadata = redact_dict(meta_raw)
@@ -108,6 +110,7 @@ def normalize_result(
108
110
  ),
109
111
  metadata=metadata,
110
112
  traceId=trace_id,
113
+ retrievalContext=retrieval_context,
111
114
  isSmokeTestVariant=case.is_smoke_test_variant,
112
115
  smokeTestVariantText=case.smoke_test_variant_text,
113
116
  )
@@ -489,6 +489,7 @@ class AgentXCallbackHandler(BaseCallbackHandler):
489
489
  duration_ms=step.get("duration_ms"),
490
490
  input=step.get("query"),
491
491
  output=step.get("output"),
492
+ metadata={"kind": "retrieval"},
492
493
  )
493
494
 
494
495
  def on_chain_end(
@@ -252,6 +252,7 @@ class _TraceSpan:
252
252
  cache_write_tokens: Optional[int] = None,
253
253
  error: Optional[str] = None,
254
254
  tool_calls: Optional[List[Dict[str, Any]]] = None,
255
+ metadata: Optional[Dict[str, Any]] = None,
255
256
  ) -> "_TraceSpan":
256
257
  """
257
258
  Send one real child-span row parented to this span, with explicit timing (the caller's
@@ -306,6 +307,8 @@ class _TraceSpan:
306
307
  wire["model"] = model
307
308
  if child.tool_calls:
308
309
  wire["tool_calls"] = child.tool_calls
310
+ if metadata:
311
+ wire["metadata"] = _safe_serialize(metadata)
309
312
  if child._session_id:
310
313
  wire["session_id"] = child._session_id
311
314
  wire["span_id"] = child._span_id
@@ -740,8 +743,18 @@ class Tracer:
740
743
  active_span = self.current_span
741
744
  if active_span is None:
742
745
  return
746
+ # The kind marker is what tells the engine (retrieval-context extraction for RAG
747
+ # judges) and the dashboard timeline that this span is a retrieval regardless of its
748
+ # name - the name-based "Retrieval N" heuristic remains only as a fallback for older
749
+ # traces, so custom names like "kb_search" work everywhere.
743
750
  active_span.child_span(
744
- name, start_time=start_time, end_time=end_time, duration_ms=duration_ms, input=query, output=output
751
+ name,
752
+ start_time=start_time,
753
+ end_time=end_time,
754
+ duration_ms=duration_ms,
755
+ input=query,
756
+ output=output,
757
+ metadata={"kind": "retrieval"},
745
758
  )
746
759
 
747
760
  @contextmanager
@@ -0,0 +1 @@
1
+ VERSION = "0.6.26"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentx-python
3
- Version: 0.6.24
3
+ Version: 0.6.26
4
4
  Summary: Official Python SDK for AgentX (https://www.agentx.so/)
5
5
  Home-page: https://github.com/AgentX-ai/AgentX-python
6
6
  Author: Robin Wang and AgentX Team
@@ -1 +0,0 @@
1
- VERSION = "0.6.24"
File without changes
File without changes
File without changes
File without changes