Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{
".": "0.24.0",
"adk": "0.24.0"
".": "0.25.0",
"adk": "0.25.0"
}
4 changes: 2 additions & 2 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 75
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp/agentex-sdk-f639b00012e6e4329ead09cceb032a38f83db74efb88a0890505b01011942606.yml
openapi_spec_hash: 1fef57cdbefab1119cdb5b81a261f06d
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/sgp/agentex-sdk-7acaeb315af90255109ae17afc71e32a8e5851bb8a956a2a284cb4d344dfab51.yml
openapi_spec_hash: 3044e94b48d60311b6048e8df88e7552
config_hash: 593e89b291976a5e84e4c3c3f8324354
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@

* **tracing:** emit OTel metrics for async span queue depth, batch drain, and SGP export success/failure (HTTP status labels). Disable SDK-side recording with ``AGENTEX_TRACING_METRICS=0``.

## 0.25.0 (2026-08-24)

Full Changelog: [agentex-client-v0.24.0...agentex-client-v0.25.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-client-v0.24.0...agentex-client-v0.25.0)

### Features

* **lineage:** capture tool data-source refs and agent build version in span data ([#469](https://github.com/scaleapi/scale-agentex-python/issues/469)) ([941bbc4](https://github.com/scaleapi/scale-agentex-python/commit/941bbc47f3a8fefb1b577ab34f1358be9b3569c4))

## 0.24.0 (2026-08-11)

Full Changelog: [agentex-client-v0.23.0...agentex-client-v0.24.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-client-v0.23.0...agentex-client-v0.24.0)
Expand Down
8 changes: 8 additions & 0 deletions adk/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 0.25.0 (2026-08-24)

Full Changelog: [agentex-sdk-v0.24.0...agentex-sdk-v0.25.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-sdk-v0.24.0...agentex-sdk-v0.25.0)

### Chores

* **agentex-sdk:** Synchronize agentex versions

## 0.24.0 (2026-08-11)

Full Changelog: [agentex-sdk-v0.23.0...agentex-sdk-v0.24.0](https://github.com/scaleapi/scale-agentex-python/compare/agentex-sdk-v0.23.0...agentex-sdk-v0.24.0)
Expand Down
2 changes: 1 addition & 1 deletion adk/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# (agentex/{__init__.py, _*.py, types/, resources/}) ships from the slim
# sibling package `agentex-client` which is pinned as a runtime dep.
name = "agentex-sdk"
version = "0.24.0"
version = "0.25.0"
description = "Agent Development Kit (ADK) overlay for the Agentex API — FastACP server, Temporal workflows, LLM provider integrations, observability"
license = "Apache-2.0"
authors = [
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# overlay (formerly `src/agentex/lib/*`) now lives in `adk/` and ships
# as the sibling `agentex-sdk` package — see `adk/pyproject.toml`.
name = "agentex-client"
version = "0.24.0"
version = "0.25.0"
description = "The official Python REST client for the Agentex API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion src/agentex/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "agentex"
__version__ = "0.24.0" # x-release-please-version
__version__ = "0.25.0" # x-release-please-version
8 changes: 8 additions & 0 deletions src/agentex/lib/adk/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@
from agentex.lib.adk._modules.tasks import TasksModule
from agentex.lib.adk._modules.tracing import TracingModule, TurnSpan

# Data-source refs for lineage (SGP-6513); implementation lives in core.tracing
from agentex.lib.core.tracing import lineage
from agentex.lib.core.tracing.lineage import DataSourceRef, data_sources

# Unified harness surface (AGX1-375)
from agentex.lib.core.harness import (
UnifiedEmitter,
Expand Down Expand Up @@ -67,6 +71,10 @@
"events",
"agent_task_tracker",
"TurnSpan",
# Lineage data-source refs (SGP-6513)
"lineage",
"DataSourceRef",
"data_sources",
# Checkpointing / LangGraph
"create_checkpointer",
"stream_langgraph_events",
Expand Down
7 changes: 7 additions & 0 deletions src/agentex/lib/adk/providers/_modules/sync_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from agentex import AsyncAgentex
from agentex.lib.utils.logging import make_logger
from agentex.lib.core.tracing.tracer import AsyncTracer
from agentex.lib.core.tracing.lineage import merge_refs_into_data, resolve_refs_from_items

logger = make_logger(__name__)

Expand Down Expand Up @@ -185,6 +186,9 @@ async def get_response(
"new_items": new_items,
"final_output": final_output,
}
lineage_refs = resolve_refs_from_items(new_items)
if lineage_refs:
span.data = merge_refs_into_data(span.data, lineage_refs)

return response
else:
Expand Down Expand Up @@ -303,6 +307,9 @@ async def stream_response(
"new_items": new_items,
"final_output": final_response_text if final_response_text else None,
}
lineage_refs = resolve_refs_from_items(new_items)
if lineage_refs:
span.data = merge_refs_into_data(span.data, lineage_refs)
finally:
# End the span after all events have been yielded
await trace.end_span(span)
Expand Down
16 changes: 16 additions & 0 deletions src/agentex/lib/core/harness/tracer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,17 @@

from agentex.lib.core.harness.types import OpenSpan, CloseSpan, SpanSignal

try:
from agentex.lib.core.tracing.lineage import resolve_refs, merge_refs_into_data
except Exception: # keep the harness importable without optional tracing deps

def resolve_refs(tool_name: str, arguments: dict[str, Any] | None) -> list[dict[str, Any]]: # noqa: ARG001
return []

def merge_refs_into_data(data: dict[str, Any] | None, refs: list[dict[str, Any]]) -> dict[str, Any]: # noqa: ARG001
return dict(data or {})


try:
from agentex.lib.utils.logging import make_logger

Expand Down Expand Up @@ -80,6 +91,11 @@ async def handle(self, signal: SpanSignal) -> None:
task_id=self.task_id,
)
if span is not None:
if signal.kind == "tool":
refs = resolve_refs(signal.name, signal.input if isinstance(signal.input, dict) else {})
if refs:
data = span.data if isinstance(span.data, dict) else {}
span.data = merge_refs_into_data(data, refs)
self._open[signal.key] = span
elif isinstance(signal, CloseSpan):
span = self._open.pop(signal.key, None)
Expand Down
49 changes: 33 additions & 16 deletions src/agentex/lib/core/services/adk/providers/openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from agentex.lib.utils.temporal import heartbeat_if_in_workflow
from agentex.lib.core.tracing.tracer import AsyncTracer
from agentex.lib.core.harness.emitter import UnifiedEmitter
from agentex.lib.core.tracing.lineage import merge_refs_into_data, resolve_refs_from_items
from agentex.types.task_message_update import StreamTaskMessageFull
from agentex.types.task_message_content import (
TextContent,
Expand Down Expand Up @@ -286,13 +287,17 @@ async def run_agent(
result = await Runner.run(starting_agent=agent, input=input_list)

if span:
serialized_items = [
item.raw_item.model_dump() if isinstance(item.raw_item, BaseModel) else item.raw_item
for item in result.new_items
]
span.output = {
"new_items": [
item.raw_item.model_dump() if isinstance(item.raw_item, BaseModel) else item.raw_item
for item in result.new_items
],
"new_items": serialized_items,
"final_output": result.final_output,
}
lineage_refs = resolve_refs_from_items(serialized_items)
if lineage_refs:
span.data = merge_refs_into_data(span.data, lineage_refs)

return result

Expand Down Expand Up @@ -431,13 +436,17 @@ async def run_agent_auto_send(
result = await Runner.run(starting_agent=agent, input=input_list)

if span:
serialized_items = [
item.raw_item.model_dump() if isinstance(item.raw_item, BaseModel) else item.raw_item
for item in result.new_items
]
span.output = {
"new_items": [
item.raw_item.model_dump() if isinstance(item.raw_item, BaseModel) else item.raw_item
for item in result.new_items
],
"new_items": serialized_items,
"final_output": result.final_output,
}
lineage_refs = resolve_refs_from_items(serialized_items)
if lineage_refs:
span.data = merge_refs_into_data(span.data, lineage_refs)

tool_call_map: dict[str, Any] = {}

Expand Down Expand Up @@ -646,13 +655,17 @@ async def run_agent_streamed(
result = Runner.run_streamed(starting_agent=agent, input=input_list)

if span:
serialized_items = [
item.raw_item.model_dump() if isinstance(item.raw_item, BaseModel) else item.raw_item
for item in result.new_items
]
span.output = {
"new_items": [
item.raw_item.model_dump() if isinstance(item.raw_item, BaseModel) else item.raw_item
for item in result.new_items
],
"new_items": serialized_items,
"final_output": result.final_output,
}
lineage_refs = resolve_refs_from_items(serialized_items)
if lineage_refs:
span.data = merge_refs_into_data(span.data, lineage_refs)

return result

Expand Down Expand Up @@ -906,12 +919,16 @@ async def run_agent_streamed_auto_send(
raise

if span:
serialized_items = [
item.raw_item.model_dump() if isinstance(item.raw_item, BaseModel) else item.raw_item
for item in result.new_items
]
span.output = {
"new_items": [
item.raw_item.model_dump() if isinstance(item.raw_item, BaseModel) else item.raw_item
for item in result.new_items
],
"new_items": serialized_items,
"final_output": result.final_output,
}
lineage_refs = resolve_refs_from_items(serialized_items)
if lineage_refs:
span.data = merge_refs_into_data(span.data, lineage_refs)

return result
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
from agentex.lib import adk
from agentex.lib.utils.logging import make_logger
from agentex.lib.core.tracing.tracer import AsyncTracer
from agentex.lib.core.tracing.lineage import merge_refs_into_data, resolve_refs_from_items
from agentex.types.task_message_delta import TextDelta, ToolRequestDelta, ReasoningContentDelta, ReasoningSummaryDelta
from agentex.types.task_message_update import StreamTaskMessageFull, StreamTaskMessageDelta
from agentex.types.task_message_content import TextContent, ReasoningContent, ToolRequestContent, ToolResponseContent
Expand Down Expand Up @@ -1257,6 +1258,9 @@ async def get_response(
output_data["tool_outputs"] = tool_outputs

span.output = output_data
lineage_refs = resolve_refs_from_items(new_items)
if lineage_refs:
span.data = merge_refs_into_data(span.data, lineage_refs)

# Streaming-only metrics. Token counters and the success request
# counter are emitted by LLMMetricsHooks.on_llm_end so they fire
Expand Down
Loading
Loading