Wrap Google and Anthropic provider responses in JSONResponse

GoogleProviderHandler:
- Wrap validated response dict in JSONResponse before returning
- Add logging to confirm JSONResponse is being returned
- Ensures proper JSON serialization for Google GenAI responses

AnthropicProviderHandler:
- Wrap validated response dict in JSONResponse before returning
- Add logging to confirm JSONResponse is being returned
- Ensures proper JSON serialization for Anthropic responses

RequestHandler:
- Remove JSONResponse wrapping (now handled by providers)
- Update logging to detect JSONResponse vs dict responses
- OpenAI and Ollama providers return raw dicts (already compatible)

This fixes client-side 'Cannot read properties of undefined' errors by ensuring
Google and Anthropic responses are properly serialized as JSONResponse,
while leaving OpenAI and Ollama responses as-is since they're already
OpenAI-compatible.
parent d4a92e37
...@@ -106,15 +106,11 @@ class RequestHandler: ...@@ -106,15 +106,11 @@ class RequestHandler:
else: else:
logger.error(f"Response does NOT have 'choices' key!") logger.error(f"Response does NOT have 'choices' key!")
else: else:
logger.error(f"Response is NOT a dict, it's {type(response)}") logger.info(f"Response is a JSONResponse (from Google/Anthropic provider)")
handler.record_success() handler.record_success()
logger.info(f"=== RequestHandler.handle_chat_completion END ===") logger.info(f"=== RequestHandler.handle_chat_completion END ===")
return response
# Import JSONResponse to explicitly wrap the response
from fastapi.responses import JSONResponse
logger.info(f"Returning JSONResponse with response")
return JSONResponse(content=response)
except Exception as e: except Exception as e:
handler.record_failure() handler.record_failure()
raise HTTPException(status_code=500, detail=str(e)) raise HTTPException(status_code=500, detail=str(e))
......
...@@ -368,11 +368,16 @@ class GoogleProviderHandler(BaseProviderHandler): ...@@ -368,11 +368,16 @@ class GoogleProviderHandler(BaseProviderHandler):
logging.info(f"Response validated successfully against ChatCompletionResponse model") logging.info(f"Response validated successfully against ChatCompletionResponse model")
logging.info(f"Validated response type: {type(validated_response)}") logging.info(f"Validated response type: {type(validated_response)}")
# Return as dict for JSON serialization # Return as dict for JSON serialization
return validated_response.model_dump() response_dict = validated_response.model_dump()
except Exception as e: except Exception as e:
logging.error(f"Response validation failed: {e}", exc_info=True) logging.error(f"Response validation failed: {e}", exc_info=True)
logging.error(f"Returning unvalidated response") logging.error(f"Returning unvalidated response")
return openai_response response_dict = openai_response
# Wrap in JSONResponse for proper serialization
from fastapi.responses import JSONResponse
logging.info(f"GoogleProviderHandler: Returning JSONResponse")
return JSONResponse(content=response_dict)
except Exception as e: except Exception as e:
import logging import logging
logging.error(f"GoogleProviderHandler: Error: {str(e)}", exc_info=True) logging.error(f"GoogleProviderHandler: Error: {str(e)}", exc_info=True)
...@@ -662,11 +667,16 @@ class AnthropicProviderHandler(BaseProviderHandler): ...@@ -662,11 +667,16 @@ class AnthropicProviderHandler(BaseProviderHandler):
logging.info(f"Response validated successfully against ChatCompletionResponse model") logging.info(f"Response validated successfully against ChatCompletionResponse model")
logging.info(f"Validated response type: {type(validated_response)}") logging.info(f"Validated response type: {type(validated_response)}")
# Return as dict for JSON serialization # Return as dict for JSON serialization
return validated_response.model_dump() response_dict = validated_response.model_dump()
except Exception as e: except Exception as e:
logging.error(f"Response validation failed: {e}", exc_info=True) logging.error(f"Response validation failed: {e}", exc_info=True)
logging.error(f"Returning unvalidated response") logging.error(f"Returning unvalidated response")
return openai_response response_dict = openai_response
# Wrap in JSONResponse for proper serialization
from fastapi.responses import JSONResponse
logging.info(f"AnthropicProviderHandler: Returning JSONResponse")
return JSONResponse(content=response_dict)
except Exception as e: except Exception as e:
import logging import logging
logging.error(f"AnthropicProviderHandler: Error: {str(e)}", exc_info=True) logging.error(f"AnthropicProviderHandler: Error: {str(e)}", exc_info=True)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment