diff --git a/backend/app/api/routes/responses.py b/backend/app/api/routes/responses.py index ded6ab0ef..2e4c1a64b 100644 --- a/backend/app/api/routes/responses.py +++ b/backend/app/api/routes/responses.py @@ -102,12 +102,27 @@ def get_file_search_results(response): def get_additional_data(request: dict) -> dict: """Extract additional data from request, excluding specific keys.""" - return { - k: v - for k, v in request.items() - if k not in {"assistant_id", "callback_url", "response_id", "question"} + # Keys to exclude for async request (ResponsesAPIRequest) + async_exclude_keys = {"assistant_id", "callback_url", "response_id", "question"} + # Keys to exclude for sync request (ResponsesSyncAPIRequest) + sync_exclude_keys = { + "model", + "instructions", + "vector_store_ids", + "max_num_results", + "temperature", + "response_id", + "question", } + # Determine which keys to exclude based on the request structure + if "assistant_id" in request: + exclude_keys = async_exclude_keys + else: + exclude_keys = sync_exclude_keys + + return {k: v for k, v in request.items() if k not in exclude_keys} + def process_response( request: ResponsesAPIRequest, @@ -249,7 +264,11 @@ def process_response( exc_info=True, ) tracer.log_error(error_message, response_id=request.response_id) - callback_response = ResponsesAPIResponse.failure_response(error=error_message) + + request_dict = request.model_dump() + callback_response = ResponsesAPIResponse.failure_response( + error=error_message, metadata=get_additional_data(request_dict) + ) tracer.flush() @@ -360,11 +379,13 @@ async def responses_sync( project_id=project_id, ) if not credentials or "api_key" not in credentials: + request_dict = request.model_dump() logger.error( f"[response_sync] OpenAI API key not configured for org_id={organization_id}, project_id={project_id}" ) return APIResponse.failure_response( - error="OpenAI API key not configured for this organization." + error="OpenAI API key not configured for this organization.", + metadata=get_additional_data(request_dict), ) client = OpenAI(api_key=credentials["api_key"]) @@ -457,4 +478,8 @@ async def responses_sync( ) tracer.log_error(error_message, response_id=request.response_id) tracer.flush() - return ResponsesAPIResponse.failure_response(error=error_message) + + request_dict = request.model_dump() + return ResponsesAPIResponse.failure_response( + error=error_message, metadata=get_additional_data(request_dict) + ) diff --git a/backend/app/utils.py b/backend/app/utils.py index 38f8c650d..80ef1a2c6 100644 --- a/backend/app/utils.py +++ b/backend/app/utils.py @@ -37,13 +37,15 @@ def success_response( return cls(success=True, data=data, error=None, metadata=metadata) @classmethod - def failure_response(cls, error: str | list) -> "APIResponse[None]": + def failure_response( + cls, error: str | list, metadata: Optional[Dict[str, Any]] = None + ) -> "APIResponse[None]": if isinstance(error, list): # to handle cases when error is a list of errors error_message = "\n".join([f"{err['loc']}: {err['msg']}" for err in error]) else: error_message = error - return cls(success=False, data=None, error=error_message) + return cls(success=False, data=None, error=error_message, metadata=metadata) @dataclass