@@ -112,49 +112,48 @@ async def get_weather(city: str) -> str:
112112 span .set_attribute ("mcp.method.name" , "tools/call" )
113113 span .set_attribute ("gen_ai.operation.name" , "execute_tool" )
114114 span .set_attribute ("gen_ai.tool.name" , "get_weather" )
115- # Opt-in: include tool arguments per semconv
116115 span .set_attribute ("gen_ai.tool.call.arguments" , json .dumps ({"city" : city }))
117116
118117 logger .debug (f"Getting weather info for city '{ city } '." )
119118
120- base_url = "https://geocoding-api.open-meteo.com/v1/search"
121- async with httpx .AsyncClient () as client :
122- response = await client .get (base_url , params = {"name" : city , "count" : 1 }, timeout = 10 )
123- response .raise_for_status ()
124- data = response .json ()
125-
126- if not data or "results" not in data :
127- result = f"City { city } not found"
128- span .set_attribute ("error.type" , "tool_error" )
129- span .set_status (Status (StatusCode .ERROR , result ))
119+ try :
120+ base_url = "https://geocoding-api.open-meteo.com/v1/search"
121+ async with httpx .AsyncClient () as client :
122+ response = await client .get (base_url , params = {"name" : city , "count" : 1 }, timeout = 10 )
123+ response .raise_for_status ()
124+ data = response .json ()
125+
126+ if not data or "results" not in data :
127+ result = f"City { city } not found"
128+ span .set_attribute ("error.type" , "tool_error" )
129+ span .set_status (Status (StatusCode .ERROR , result ))
130+ return result
131+
132+ latitude = data ["results" ][0 ]["latitude" ]
133+ longitude = data ["results" ][0 ]["longitude" ]
134+
135+ weather_url = "https://api.open-meteo.com/v1/forecast"
136+ weather_params = {
137+ "latitude" : latitude ,
138+ "longitude" : longitude ,
139+ "temperature_unit" : "fahrenheit" ,
140+ "current_weather" : True ,
141+ }
142+ async with httpx .AsyncClient () as client :
143+ weather_response = await client .get (weather_url , params = weather_params , timeout = 10 )
144+ weather_response .raise_for_status ()
145+ weather_data = weather_response .json ()
146+
147+ result = json .dumps (weather_data ["current_weather" ])
148+ span .set_attribute ("gen_ai.tool.call.result" , result )
149+ span .set_status (Status (StatusCode .OK ))
130150 return result
131151
132- latitude = data ["results" ][0 ]["latitude" ]
133- longitude = data ["results" ][0 ]["longitude" ]
134-
135- weather_url = "https://api.open-meteo.com/v1/forecast"
136- weather_params = {
137- "latitude" : latitude ,
138- "longitude" : longitude ,
139- "temperature_unit" : "fahrenheit" ,
140- "current_weather" : True ,
141- }
142- async with httpx .AsyncClient () as client :
143- weather_response = await client .get (weather_url , params = weather_params , timeout = 10 )
144- weather_response .raise_for_status ()
145- weather_data = weather_response .json ()
146-
147- result = json .dumps (weather_data ["current_weather" ])
148- # Opt-in: include tool result per semconv
149- span .set_attribute ("gen_ai.tool.call.result" , result )
150- span .set_status (Status (StatusCode .OK ))
151- return result
152-
153- except Exception as e :
154- span .set_attribute ("error.type" , type (e ).__name__ )
155- span .set_status (Status (StatusCode .ERROR , str (e )))
156- span .record_exception (e )
157- raise
152+ except Exception as e :
153+ span .set_attribute ("error.type" , type (e ).__name__ )
154+ span .set_status (Status (StatusCode .ERROR , str (e )))
155+ span .record_exception (e )
156+ raise
158157 finally :
159158 otel_context .detach (token )
160159
0 commit comments