1+ import functools
12import logging
23from typing import Any , Optional
34
1415logger = logging .getLogger ("kagent." + __name__ )
1516
1617
18+ def logging_http_exception (func ):
19+ @functools .wraps (func )
20+ def wrapper (* args , ** kwargs ):
21+ try :
22+ return func (* args , ** kwargs )
23+ except httpx .HTTPError as exc :
24+ logger .error (f"got http exception when { exc .request .method } { exc .request .url } : { exc } " )
25+ raise
26+ return wrapper
27+
28+
1729class KAgentSessionService (BaseSessionService ):
1830 """A session service implementation that uses the Kagent API.
1931 This service integrates with the Kagent server to manage session state
@@ -25,6 +37,7 @@ def __init__(self, client: httpx.AsyncClient):
2537 self .client = client
2638
2739 @override
40+ @logging_http_exception
2841 async def create_session (
2942 self ,
3043 * ,
@@ -49,11 +62,7 @@ async def create_session(
4962 json = request_data ,
5063 headers = {"X-User-ID" : user_id },
5164 )
52- try :
53- response .raise_for_status ()
54- except httpx .HTTPStatusError :
55- logger .error (f"Failed to create session: { response .text } " )
56- raise
65+ response .raise_for_status ()
5766
5867 data = response .json ()
5968 if not data .get ("data" ):
@@ -65,6 +74,7 @@ async def create_session(
6574 return Session (id = session_data ["id" ], user_id = session_data ["user_id" ], state = state or {}, app_name = app_name )
6675
6776 @override
77+ @logging_http_exception
6878 async def get_session (
6979 self ,
7080 * ,
@@ -127,18 +137,14 @@ async def get_session(
127137 except httpx .HTTPStatusError as e :
128138 if e .response .status_code == 404 :
129139 return None
130- logger .error (f"Failed to get session: { response .text } " )
131140 raise
132141
133142 @override
143+ @logging_http_exception
134144 async def list_sessions (self , * , app_name : str , user_id : str ) -> ListSessionsResponse :
135145 # Make API call to list sessions
136146 response = await self .client .get (f"/api/sessions?user_id={ user_id } " , headers = {"X-User-ID" : user_id })
137- try :
138- response .raise_for_status ()
139- except httpx .HTTPStatusError :
140- logger .error (f"Failed to list sessions: { response .text } " )
141- raise
147+ response .raise_for_status ()
142148
143149 data = response .json ()
144150 sessions_data = data .get ("data" , [])
@@ -155,19 +161,17 @@ def list_sessions_sync(self, *, app_name: str, user_id: str) -> ListSessionsResp
155161 raise NotImplementedError ("not supported. use async" )
156162
157163 @override
164+ @logging_http_exception
158165 async def delete_session (self , * , app_name : str , user_id : str , session_id : str ) -> None :
159166 # Make API call to delete session
160167 response = await self .client .delete (
161168 f"/api/sessions/{ session_id } ?user_id={ user_id } " ,
162169 headers = {"X-User-ID" : user_id },
163170 )
164- try :
165- response .raise_for_status ()
166- except httpx .HTTPStatusError :
167- logger .error (f"Failed to delete session: { response .text } " )
168- raise
171+ response .raise_for_status ()
169172
170173 @override
174+ @logging_http_exception
171175 async def append_event (self , session : Session , event : Event ) -> Event :
172176 # Convert ADK Event to JSON format
173177 event_data = {
@@ -181,11 +185,7 @@ async def append_event(self, session: Session, event: Event) -> Event:
181185 json = event_data ,
182186 headers = {"X-User-ID" : session .user_id },
183187 )
184- try :
185- response .raise_for_status ()
186- except httpx .HTTPStatusError :
187- logger .error (f"Failed to append event: { response .text } " )
188- raise
188+ response .raise_for_status ()
189189
190190 # TODO: potentially pull and update the session from the server
191191 # Update the in-memory session.
0 commit comments