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.

Files changed (81) hide show
  1. {agentx_python-0.6.38 → agentx_python-0.6.39}/PKG-INFO +1 -1
  2. agentx_python-0.6.39/agentx/version.py +1 -0
  3. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/PKG-INFO +1 -1
  4. {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_integrations.py +57 -27
  5. agentx_python-0.6.38/agentx/version.py +0 -1
  6. {agentx_python-0.6.38 → agentx_python-0.6.39}/LICENSE +0 -0
  7. {agentx_python-0.6.38 → agentx_python-0.6.39}/README.md +0 -0
  8. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/__init__.py +0 -0
  9. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/agentx.py +0 -0
  10. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/cli.py +0 -0
  11. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/__init__.py +0 -0
  12. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/_term.py +0 -0
  13. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/adapters/__init__.py +0 -0
  14. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/adapters/http_endpoint.py +0 -0
  15. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/adapters/precomputed.py +0 -0
  16. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/adapters/raw.py +0 -0
  17. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/client.py +0 -0
  18. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/datasets.py +0 -0
  19. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/evaluation_settings.py +0 -0
  20. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/models.py +0 -0
  21. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/prompts.py +0 -0
  22. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/reporting.py +0 -0
  23. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/results.py +0 -0
  24. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/runner.py +0 -0
  25. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/tool_schemas.py +0 -0
  26. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/evaluations/tracing.py +0 -0
  27. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/exceptions.py +0 -0
  28. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/export.py +0 -0
  29. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/feedback.py +0 -0
  30. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/__init__.py +0 -0
  31. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/_traced_call.py +0 -0
  32. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/anthropic.py +0 -0
  33. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/autogen.py +0 -0
  34. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/crewai.py +0 -0
  35. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/databricks.py +0 -0
  36. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/google_adk.py +0 -0
  37. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/google_genai.py +0 -0
  38. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/langchain.py +0 -0
  39. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/litellm.py +0 -0
  40. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/llamaindex.py +0 -0
  41. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/moveworks.py +0 -0
  42. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/openai.py +0 -0
  43. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/integrations/openai_agents.py +0 -0
  44. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/__init__.py +0 -0
  45. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/agents.py +0 -0
  46. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/client.py +0 -0
  47. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/judge_scorers.py +0 -0
  48. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/models.py +0 -0
  49. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/online_evaluators.py +0 -0
  50. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/patterns.py +0 -0
  51. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/profile.py +0 -0
  52. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/scorers.py +0 -0
  53. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/sessions.py +0 -0
  54. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/monitor/signals.py +0 -0
  55. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/outcomes.py +0 -0
  56. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/projects.py +0 -0
  57. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/py.typed +0 -0
  58. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/resources/__init__.py +0 -0
  59. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/resources/agent.py +0 -0
  60. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/resources/conversation.py +0 -0
  61. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/resources/workforce.py +0 -0
  62. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/traces.py +0 -0
  63. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/tracing/__init__.py +0 -0
  64. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/tracing/ci_types.py +0 -0
  65. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/tracing/ingest_client.py +0 -0
  66. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/tracing/tracer.py +0 -0
  67. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx/util.py +0 -0
  68. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/SOURCES.txt +0 -0
  69. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/dependency_links.txt +0 -0
  70. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/entry_points.txt +0 -0
  71. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/not-zip-safe +0 -0
  72. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/requires.txt +0 -0
  73. {agentx_python-0.6.38 → agentx_python-0.6.39}/agentx_python.egg-info/top_level.txt +0 -0
  74. {agentx_python-0.6.38 → agentx_python-0.6.39}/setup.cfg +0 -0
  75. {agentx_python-0.6.38 → agentx_python-0.6.39}/setup.py +0 -0
  76. {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_deep_dive_fixes.py +0 -0
  77. {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_docs_match_sdk.py +0 -0
  78. {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_integration.py +0 -0
  79. {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_judge_scorers.py +0 -0
  80. {agentx_python-0.6.38 → agentx_python-0.6.39}/tests/test_selfhost_analysis_fallback.py +0 -0
  81. {agentx_python-0.6.38 → agentx_python-0.6.39}/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.38
3
+ Version: 0.6.39
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
@@ -0,0 +1 @@
1
+ VERSION = "0.6.39"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentx-python
3
- Version: 0.6.38
3
+ Version: 0.6.39
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
@@ -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
- tracer = make_tracer()
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._send.assert_called_once()
650
- _, kwargs = tracer._send.call_args
651
- steps = kwargs["performance_summary"]["execution_steps"]
652
- assert len(steps) == 2
653
- assert steps[0]["name"] == "Research topic"
654
- assert steps[1]["name"] == "Write summary"
655
- # Real timing, not an even split task 1 slept ~3x longer than task 2.
656
- assert steps[0]["duration_ms"] > steps[1]["duration_ms"] * 1.5
657
- assert steps[0]["output"] == "research done"
658
- assert steps[1]["output"] == "summary done"
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
- tracer = make_tracer()
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._send.assert_called_once()
948
- _, kwargs = tracer._send.call_args
949
- assert kwargs["input"] == "Say hello"
950
- assert kwargs["output"] == "Hello from AutoGen!"
951
- assert kwargs["input_tokens"] == 22
952
- assert kwargs["output_tokens"] == 3
953
- steps = kwargs["performance_summary"]["execution_steps"]
954
- assert len(steps) == 1
955
- assert steps[0]["output"] == "Hello from AutoGen!"
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 = make_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._send.assert_called_once()
995
- _, kwargs = tracer._send.call_args
996
- perf = kwargs["performance_summary"]
997
- assert len(perf["tool_calls"]) == 1
998
- tool_call = perf["tool_calls"][0]
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