From 6d3a327b349b1d7041175165bf7fda9e95131165 Mon Sep 17 00:00:00 2001 From: "chengxiangrui.cxr" Date: Thu, 22 Jan 2026 14:15:00 +0800 Subject: [PATCH] fix(agent-server): resolve routes and listing details (cherry picked from commit 11c6354adec6be2bc873cec172948099148d17d0) --- .../apps/agent_server_app/agent_server_app.py | 30 +++++++++++++++---- agentkit/apps/agent_server_app/middleware.py | 11 ++++--- agentkit/version.py | 2 +- pyproject.toml | 2 +- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/agentkit/apps/agent_server_app/agent_server_app.py b/agentkit/apps/agent_server_app/agent_server_app.py index fc7d0dc..52c4970 100644 --- a/agentkit/apps/agent_server_app/agent_server_app.py +++ b/agentkit/apps/agent_server_app/agent_server_app.py @@ -15,6 +15,7 @@ import json import logging from contextlib import asynccontextmanager +from typing import Any from typing_extensions import override import uvicorn @@ -67,6 +68,19 @@ def load_agent(self, agent_name: str) -> BaseAgent: def list_agents(self) -> list[str]: return [self.agent.name] + @override + def list_agents_detailed(self) -> list[dict[str, Any]]: + name = self.agent.name + description = getattr(self.agent, "description", "") or "" + return [ + { + "name": name, + "root_agent_name": name, + "description": description, + "language": "python", + } + ] + class AgentkitAgentServerApp(BaseAgentkitApp): def __init__( @@ -110,8 +124,6 @@ async def lifespan(app: FastAPI): self.app = self.server.get_fast_api_app(lifespan=lifespan) - self.app.mount("/", _a2a_server_app) - # Attach ASGI middleware for unified telemetry across all routes self.app.add_middleware(AgentkitTelemetryHTTPMiddleware) @@ -121,9 +133,12 @@ async def _invoke_compat(request: Request): # Extract headers (fallback keys supported) headers = request.headers - user_id = ( - headers.get("user_id") or headers.get("x-user-id") or "agentkit_user" - ) + telemetry_headers = { + k: v + for k, v in dict(headers).items() + if k.lower() not in {"authorization", "token"} + } + user_id = headers.get("user_id") or "agentkit_user" session_id = headers.get("session_id") or "" # Determine app_name from loader @@ -157,7 +172,7 @@ async def _invoke_compat(request: Request): telemetry.trace_agent_server( func_name="_invoke_compat", span=span, - headers=dict(headers), + headers=telemetry_headers, text=text or "", ) @@ -210,6 +225,9 @@ async def event_generator(): # Compatibility route for AgentKit CLI invoke self.app.add_api_route("/invoke", _invoke_compat, methods=["POST"]) + # Mount A2A server app last to avoid shadowing API routes like `/invoke`. + self.app.mount("/", _a2a_server_app) + def run(self, host: str, port: int = 8000) -> None: """Run the app with Uvicorn server.""" uvicorn.run(self.app, host=host, port=port) diff --git a/agentkit/apps/agent_server_app/middleware.py b/agentkit/apps/agent_server_app/middleware.py index b936898..b006c2b 100644 --- a/agentkit/apps/agent_server_app/middleware.py +++ b/agentkit/apps/agent_server_app/middleware.py @@ -27,7 +27,6 @@ def __init__(self, app: Callable): self.app = app async def __call__(self, scope, receive, send): - print(f"test: {scope}") if scope["type"] != "http": return await self.app(scope, receive, send) @@ -37,7 +36,7 @@ async def __call__(self, scope, receive, send): headers = {k.decode("latin-1"): v.decode("latin-1") for k, v in headers_list} span = telemetry.tracer.start_span(name="agent_server_request") ctx = trace.set_span_in_context(span) - context_api.attach(ctx) + token = context_api.attach(ctx) headers = { k: v for k, v in headers.items() if k.lower() not in _EXCLUDED_HEADERS } @@ -45,8 +44,10 @@ async def __call__(self, scope, receive, send): # Currently unable to retrieve user_id and session_id from headers; keep logic for future use user_id = headers.get("user_id") session_id = headers.get("session_id") - headers["user_id"] = user_id - headers["session_id"] = session_id + if user_id: + headers["user_id"] = user_id + if session_id: + headers["session_id"] = session_id telemetry.trace_agent_server( func_name=f"{method} {path}", span=span, @@ -73,3 +74,5 @@ async def send_wrapper(message): except Exception as e: telemetry.trace_agent_server_finish(path=path, func_result="", exception=e) raise + finally: + context_api.detach(token) diff --git a/agentkit/version.py b/agentkit/version.py index 539ef06..9a7b3bd 100644 --- a/agentkit/version.py +++ b/agentkit/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -VERSION = "0.4.2" +VERSION = "0.4.3" diff --git a/pyproject.toml b/pyproject.toml index 21cdc96..ea64887 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "agentkit-sdk-python" -version = "0.4.2" +version = "0.4.3" description = "Python SDK for transforming any AI agent into a production-ready application. Framework-agnostic primitives for runtime, memory, authentication, and tools with volcengine-managed infrastructure." readme = "README.md" requires-python = ">=3.10"