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.
- {agentx_python-0.6.24 → agentx_python-0.6.26}/PKG-INFO +1 -1
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/datasets.py +11 -1
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/models.py +5 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/results.py +3 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/langchain.py +1 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/tracing/tracer.py +14 -1
- agentx_python-0.6.26/agentx/version.py +1 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/PKG-INFO +1 -1
- agentx_python-0.6.24/agentx/version.py +0 -1
- {agentx_python-0.6.24 → agentx_python-0.6.26}/LICENSE +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/README.md +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/__init__.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/agentx.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/cli.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/__init__.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/_term.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/adapters/__init__.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/adapters/http_endpoint.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/adapters/precomputed.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/adapters/raw.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/client.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/evaluation_settings.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/prompts.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/redaction.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/reporting.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/runner.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/evaluations/tracing.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/exceptions.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/feedback.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/__init__.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/_traced_call.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/anthropic.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/autogen.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/crewai.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/databricks.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/google_adk.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/google_genai.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/litellm.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/llamaindex.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/moveworks.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/openai.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/integrations/openai_agents.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/__init__.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/client.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/models.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/online_evaluators.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/patterns.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/profile.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/monitor/signals.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/outcomes.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/py.typed +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/resources/__init__.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/resources/agent.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/resources/conversation.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/resources/workforce.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/tracing/__init__.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/tracing/ci_types.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/tracing/ingest_client.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx/util.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/SOURCES.txt +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/dependency_links.txt +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/entry_points.txt +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/not-zip-safe +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/requires.txt +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/agentx_python.egg-info/top_level.txt +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/setup.cfg +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/setup.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/tests/test_integration.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/tests/test_integrations.py +0 -0
- {agentx_python-0.6.24 → agentx_python-0.6.26}/tests/test_span_tree.py +0 -0
|
@@ -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
|
)
|
|
@@ -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,
|
|
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 +0,0 @@
|
|
|
1
|
-
VERSION = "0.6.24"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|