agentx-python 0.6.38__tar.gz → 0.6.39__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.
Potentially problematic release.
This version of agentx-python might be problematic. Click here for more details.
- {agentx_python-0.6.38 → agentx_python-0.6.39}/PKG-INFO +1 -1
- agentx_python-0.6.39/agentx/version.py +1 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/PKG-INFO +1 -1
- {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_integrations.py +57 -27
- agentx_python-0.6.38/agentx/version.py +0 -1
- {agentx_python-0.6.38 → agentx_python-0.6.39}/LICENSE +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/README.md +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/__init__.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/agentx.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/cli.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/__init__.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/_term.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/adapters/__init__.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/adapters/http_endpoint.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/adapters/precomputed.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/adapters/raw.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/client.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/datasets.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/evaluation_settings.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/models.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/prompts.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/reporting.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/results.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/runner.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/tool_schemas.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/tracing.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/exceptions.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/export.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/feedback.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/__init__.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/_traced_call.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/anthropic.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/autogen.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/crewai.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/databricks.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/google_adk.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/google_genai.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/langchain.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/litellm.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/llamaindex.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/moveworks.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/openai.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/openai_agents.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/__init__.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/agents.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/client.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/judge_scorers.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/models.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/online_evaluators.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/patterns.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/profile.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/scorers.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/sessions.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/signals.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/outcomes.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/projects.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/py.typed +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/resources/__init__.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/resources/agent.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/resources/conversation.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/resources/workforce.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/traces.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/tracing/__init__.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/tracing/ci_types.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/tracing/ingest_client.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/tracing/tracer.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/util.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/SOURCES.txt +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/dependency_links.txt +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/entry_points.txt +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/not-zip-safe +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/requires.txt +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/top_level.txt +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/setup.cfg +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/setup.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_deep_dive_fixes.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_docs_match_sdk.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_integration.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_judge_scorers.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_selfhost_analysis_fallback.py +0 -0
- {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_span_tree.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
VERSION = "0.6.39"
|
|
@@ -640,22 +640,32 @@ def test_crewai_captures_real_per_task_timing_via_event_bus():
|
|
|
640
640
|
|
|
641
641
|
return FakeCrewOutput(raw="final output", tasks_output=[output1, output2])
|
|
642
642
|
|
|
643
|
-
|
|
643
|
+
# Boundary-mocked rather than make_tracer(): each task is a real child span now (9d45dd1
|
|
644
|
+
# replaced the synthetic performance_summary step list), and mocking tracer._send would
|
|
645
|
+
# bypass the very _send/_dispatch/child_span chain that builds them. Same idiom as
|
|
646
|
+
# tests/test_span_tree.py.
|
|
647
|
+
tracer = Tracer(ingest_client=MagicMock())
|
|
644
648
|
observer = AgentXCrewObserver(tracer, name="my-crew")
|
|
645
649
|
|
|
646
650
|
result = observer.kickoff(FakeCrew(), inputs={"topic": "AI"})
|
|
647
651
|
|
|
648
652
|
assert result.raw == "final output"
|
|
649
|
-
tracer.
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
assert
|
|
653
|
-
assert
|
|
654
|
-
|
|
655
|
-
#
|
|
656
|
-
assert
|
|
657
|
-
assert
|
|
658
|
-
assert
|
|
653
|
+
wires = [call.args[0] for call in tracer._client.enqueue.call_args_list]
|
|
654
|
+
assert len(wires) == 3
|
|
655
|
+
research, summary, root = wires
|
|
656
|
+
assert root["name"] == "my-crew"
|
|
657
|
+
assert root["output"] == "final output"
|
|
658
|
+
|
|
659
|
+
# Each task is its own child span under the crew's root, carrying its own real duration.
|
|
660
|
+
assert research["name"] == "Research topic"
|
|
661
|
+
assert summary["name"] == "Write summary"
|
|
662
|
+
assert research["parent_span_id"] == root["span_id"]
|
|
663
|
+
assert summary["parent_span_id"] == root["span_id"]
|
|
664
|
+
assert research["output"] == "research done"
|
|
665
|
+
assert summary["output"] == "summary done"
|
|
666
|
+
# The point of the test: real timing, not an even split — task 1 slept ~3x longer than
|
|
667
|
+
# task 2, and the old "divide latency evenly" approximation reported them identical.
|
|
668
|
+
assert research["latency_ms"] > summary["latency_ms"] * 1.5
|
|
659
669
|
|
|
660
670
|
|
|
661
671
|
def test_crewai_falls_back_to_even_split_without_event_bus():
|
|
@@ -930,6 +940,10 @@ def test_llamaindex_llm_error_is_captured():
|
|
|
930
940
|
def test_autogen_agent_run_traces_text_reply():
|
|
931
941
|
"""Drives a real AssistantAgent.run() via AutoGen's own ReplayChatCompletionClient (no network/API keys)."""
|
|
932
942
|
pytest.importorskip("autogen_agentchat")
|
|
943
|
+
# autogen-ext is a separate distribution and is NOT part of the "autogen" extra -
|
|
944
|
+
# ReplayChatCompletionClient below is a test double that lives there, so guard it too
|
|
945
|
+
# or this fails with ModuleNotFoundError instead of skipping.
|
|
946
|
+
pytest.importorskip("autogen_ext")
|
|
933
947
|
from autogen_agentchat.agents import AssistantAgent
|
|
934
948
|
from autogen_ext.models.replay import ReplayChatCompletionClient
|
|
935
949
|
|
|
@@ -938,25 +952,33 @@ def test_autogen_agent_run_traces_text_reply():
|
|
|
938
952
|
model_client = ReplayChatCompletionClient(["Hello from AutoGen!"])
|
|
939
953
|
agent = AssistantAgent("assistant", model_client=model_client)
|
|
940
954
|
|
|
941
|
-
|
|
955
|
+
# Boundary-mocked, not make_tracer(): the agent's turn is a real child span since
|
|
956
|
+
# 9d45dd1, and mocking tracer._send would bypass the chain that builds it.
|
|
957
|
+
tracer = Tracer(ingest_client=MagicMock())
|
|
942
958
|
observer = AgentXAutoGenObserver(tracer, name="my-agent")
|
|
943
959
|
|
|
944
960
|
result = asyncio.run(observer.run(agent, task="Say hello"))
|
|
945
961
|
|
|
946
962
|
assert result.messages[-1].content == "Hello from AutoGen!"
|
|
947
|
-
tracer.
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
assert
|
|
951
|
-
assert
|
|
952
|
-
assert
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
assert
|
|
963
|
+
wires = [call.args[0] for call in tracer._client.enqueue.call_args_list]
|
|
964
|
+
assert len(wires) == 2
|
|
965
|
+
step, root = wires
|
|
966
|
+
assert root["input"] == "Say hello"
|
|
967
|
+
assert root["output"] == "Hello from AutoGen!"
|
|
968
|
+
assert root["input_tokens"] == 22
|
|
969
|
+
assert root["output_tokens"] == 3
|
|
970
|
+
# The turn itself, as its own child span rather than a performance_summary step.
|
|
971
|
+
assert step["name"] == "assistant"
|
|
972
|
+
assert step["output"] == "Hello from AutoGen!"
|
|
973
|
+
assert step["parent_span_id"] == root["span_id"]
|
|
956
974
|
|
|
957
975
|
|
|
958
976
|
def test_autogen_agent_run_traces_tool_call():
|
|
959
977
|
pytest.importorskip("autogen_agentchat")
|
|
978
|
+
# autogen-ext is a separate distribution and is NOT part of the "autogen" extra -
|
|
979
|
+
# ReplayChatCompletionClient below is a test double that lives there, so guard it too
|
|
980
|
+
# or this fails with ModuleNotFoundError instead of skipping.
|
|
981
|
+
pytest.importorskip("autogen_ext")
|
|
960
982
|
import json
|
|
961
983
|
|
|
962
984
|
from autogen_agentchat.agents import AssistantAgent
|
|
@@ -986,16 +1008,24 @@ def test_autogen_agent_run_traces_tool_call():
|
|
|
986
1008
|
)
|
|
987
1009
|
agent = AssistantAgent("assistant", model_client=model_client, tools=[tool])
|
|
988
1010
|
|
|
989
|
-
tracer =
|
|
1011
|
+
tracer = Tracer(ingest_client=MagicMock())
|
|
990
1012
|
observer = AgentXAutoGenObserver(tracer, name="my-agent")
|
|
991
1013
|
|
|
992
1014
|
asyncio.run(observer.run(agent, task="What is the weather in NYC?"))
|
|
993
1015
|
|
|
994
|
-
tracer.
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
1016
|
+
wires = [call.args[0] for call in tracer._client.enqueue.call_args_list]
|
|
1017
|
+
assert len(wires) == 2
|
|
1018
|
+
child, root = wires
|
|
1019
|
+
# The tool call is a real child span...
|
|
1020
|
+
assert child["name"] == "get_weather"
|
|
1021
|
+
assert "NYC" in child["input"]
|
|
1022
|
+
assert child["output"] == "sunny in NYC"
|
|
1023
|
+
assert child["parent_span_id"] == root["span_id"]
|
|
1024
|
+
# ...and is mirrored onto the ROOT's flat tool_calls, which is what the engine's built-in
|
|
1025
|
+
# "Tool failure" check and the dashboard's Tool quality column read. Same deliberate
|
|
1026
|
+
# dual-write as trace_tool_call() - see test_span_tree.py.
|
|
1027
|
+
assert len(root["tool_calls"]) == 1
|
|
1028
|
+
tool_call = root["tool_calls"][0]
|
|
999
1029
|
assert tool_call["name"] == "get_weather"
|
|
1000
1030
|
assert "NYC" in tool_call["input"]
|
|
1001
1031
|
assert tool_call["output"] == "sunny in NYC"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
VERSION = "0.6.38"
|
|
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
|
|
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
|