From 8988956300c4f3373235747e562ca99ca54c48e2 Mon Sep 17 00:00:00 2001 From: Huang Huang Date: Mon, 20 Oct 2025 16:49:51 +0800 Subject: [PATCH 1/4] chore(kagent-adk/session_sevice): add logging for Kagent API errors Signed-off-by: Huang Huang --- .../src/kagent/adk/_session_service.py | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/python/packages/kagent-adk/src/kagent/adk/_session_service.py b/python/packages/kagent-adk/src/kagent/adk/_session_service.py index d618687fd..52b11d635 100644 --- a/python/packages/kagent-adk/src/kagent/adk/_session_service.py +++ b/python/packages/kagent-adk/src/kagent/adk/_session_service.py @@ -49,7 +49,11 @@ async def create_session( json=request_data, headers={"X-User-ID": user_id}, ) - response.raise_for_status() + try: + response.raise_for_status() + except httpx.HTTPStatusError: + logger.error(f"Failed to create session: {response.text}") + raise data = response.json() if not data.get("data"): @@ -123,13 +127,18 @@ async def get_session( except httpx.HTTPStatusError as e: if e.response.status_code == 404: return None + logger.error(f"Failed to get session: {response.text}") raise @override async def list_sessions(self, *, app_name: str, user_id: str) -> ListSessionsResponse: # Make API call to list sessions response = await self.client.get(f"/api/sessions?user_id={user_id}", headers={"X-User-ID": user_id}) - response.raise_for_status() + try: + response.raise_for_status() + except httpx.HTTPStatusError: + logger.error(f"Failed to list sessions: {response.text}") + raise data = response.json() sessions_data = data.get("data", []) @@ -152,7 +161,11 @@ async def delete_session(self, *, app_name: str, user_id: str, session_id: str) f"/api/sessions/{session_id}?user_id={user_id}", headers={"X-User-ID": user_id}, ) - response.raise_for_status() + try: + response.raise_for_status() + except httpx.HTTPStatusError: + logger.error(f"Failed to delete session: {response.text}") + raise @override async def append_event(self, session: Session, event: Event) -> Event: @@ -168,7 +181,11 @@ async def append_event(self, session: Session, event: Event) -> Event: json=event_data, headers={"X-User-ID": session.user_id}, ) - response.raise_for_status() + try: + response.raise_for_status() + except httpx.HTTPStatusError: + logger.error(f"Failed to append event: {response.text}") + raise # TODO: potentially pull and update the session from the server # Update the in-memory session. From 8ace86761d307fed58c8d8cdbc8fa075b816e4bd Mon Sep 17 00:00:00 2001 From: mozillazg Date: Fri, 14 Nov 2025 21:54:26 +0800 Subject: [PATCH 2/4] use decorator to logging Signed-off-by: mozillazg --- .../src/kagent/adk/_session_service.py | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/python/packages/kagent-adk/src/kagent/adk/_session_service.py b/python/packages/kagent-adk/src/kagent/adk/_session_service.py index 52b11d635..d69d0707c 100644 --- a/python/packages/kagent-adk/src/kagent/adk/_session_service.py +++ b/python/packages/kagent-adk/src/kagent/adk/_session_service.py @@ -1,3 +1,4 @@ +import functools import logging from typing import Any, Optional @@ -14,6 +15,17 @@ logger = logging.getLogger("kagent." + __name__) +def logging_http_exception(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except httpx.HTTPError as exc: + logger.error(f"got http exception when {exc.request.method} {exc.request.url}: {exc}") + raise + return wrapper + + class KAgentSessionService(BaseSessionService): """A session service implementation that uses the Kagent API. This service integrates with the Kagent server to manage session state @@ -25,6 +37,7 @@ def __init__(self, client: httpx.AsyncClient): self.client = client @override + @logging_http_exception async def create_session( self, *, @@ -49,11 +62,7 @@ async def create_session( json=request_data, headers={"X-User-ID": user_id}, ) - try: - response.raise_for_status() - except httpx.HTTPStatusError: - logger.error(f"Failed to create session: {response.text}") - raise + response.raise_for_status() data = response.json() if not data.get("data"): @@ -65,6 +74,7 @@ async def create_session( return Session(id=session_data["id"], user_id=session_data["user_id"], state=state or {}, app_name=app_name) @override + @logging_http_exception async def get_session( self, *, @@ -127,18 +137,14 @@ async def get_session( except httpx.HTTPStatusError as e: if e.response.status_code == 404: return None - logger.error(f"Failed to get session: {response.text}") raise @override + @logging_http_exception async def list_sessions(self, *, app_name: str, user_id: str) -> ListSessionsResponse: # Make API call to list sessions response = await self.client.get(f"/api/sessions?user_id={user_id}", headers={"X-User-ID": user_id}) - try: - response.raise_for_status() - except httpx.HTTPStatusError: - logger.error(f"Failed to list sessions: {response.text}") - raise + response.raise_for_status() data = response.json() sessions_data = data.get("data", []) @@ -155,19 +161,17 @@ def list_sessions_sync(self, *, app_name: str, user_id: str) -> ListSessionsResp raise NotImplementedError("not supported. use async") @override + @logging_http_exception async def delete_session(self, *, app_name: str, user_id: str, session_id: str) -> None: # Make API call to delete session response = await self.client.delete( f"/api/sessions/{session_id}?user_id={user_id}", headers={"X-User-ID": user_id}, ) - try: - response.raise_for_status() - except httpx.HTTPStatusError: - logger.error(f"Failed to delete session: {response.text}") - raise + response.raise_for_status() @override + @logging_http_exception async def append_event(self, session: Session, event: Event) -> Event: # Convert ADK Event to JSON format event_data = { @@ -181,11 +185,7 @@ async def append_event(self, session: Session, event: Event) -> Event: json=event_data, headers={"X-User-ID": session.user_id}, ) - try: - response.raise_for_status() - except httpx.HTTPStatusError: - logger.error(f"Failed to append event: {response.text}") - raise + response.raise_for_status() # TODO: potentially pull and update the session from the server # Update the in-memory session. From 28f61541b1ef833f5abdc2b9d56eccc3a8c63023 Mon Sep 17 00:00:00 2001 From: mozillazg Date: Fri, 14 Nov 2025 21:56:17 +0800 Subject: [PATCH 3/4] fix lint Signed-off-by: mozillazg --- python/packages/kagent-adk/src/kagent/adk/_session_service.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/packages/kagent-adk/src/kagent/adk/_session_service.py b/python/packages/kagent-adk/src/kagent/adk/_session_service.py index d69d0707c..d6383ebe1 100644 --- a/python/packages/kagent-adk/src/kagent/adk/_session_service.py +++ b/python/packages/kagent-adk/src/kagent/adk/_session_service.py @@ -23,6 +23,7 @@ def wrapper(*args, **kwargs): except httpx.HTTPError as exc: logger.error(f"got http exception when {exc.request.method} {exc.request.url}: {exc}") raise + return wrapper From 8a936fded9370297347f54c825bc6d86aefe9d35 Mon Sep 17 00:00:00 2001 From: mozillazg Date: Fri, 14 Nov 2025 22:09:29 +0800 Subject: [PATCH 4/4] fix async and await Signed-off-by: mozillazg --- .../packages/kagent-adk/src/kagent/adk/_session_service.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/packages/kagent-adk/src/kagent/adk/_session_service.py b/python/packages/kagent-adk/src/kagent/adk/_session_service.py index d6383ebe1..3be95a919 100644 --- a/python/packages/kagent-adk/src/kagent/adk/_session_service.py +++ b/python/packages/kagent-adk/src/kagent/adk/_session_service.py @@ -17,11 +17,11 @@ def logging_http_exception(func): @functools.wraps(func) - def wrapper(*args, **kwargs): + async def wrapper(*args, **kwargs): try: - return func(*args, **kwargs) + return await func(*args, **kwargs) except httpx.HTTPError as exc: - logger.error(f"got http exception when {exc.request.method} {exc.request.url}: {exc}") + logger.error(f"Got HTTP exception when {exc.request.method} {exc.request.url}: {exc}") raise return wrapper