Skip to content

Commit 061826a

Browse files
Add response.done message handling for Realtime API error reporting
- Add responseDone case to OpenAIRealtimeMessage enum to capture response completion events - Implement handler for response.done messages in OpenAIRealtimeSession - Parse and expose error details from status_details.error for API errors (insufficient_quota, invalid_api_key, etc.) - Improve logging: upgrade unhandled message warnings from debug to warning level - Add detailed JSON logging for debugging unhandled message types This change ensures that critical API errors like quota exhaustion and authentication failures are properly surfaced to consuming applications instead of being silently discarded. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent 50bedb1 commit 061826a

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

Sources/OpenAI/Private/Realtime/OpenAIRealtimeSession.swift

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,9 +249,31 @@ open class OpenAIRealtimeSession {
249249

250250
continuation?.yield(.mcpListToolsFailed(fullError))
251251

252+
case "response.done":
253+
// Handle response completion (may contain errors like insufficient_quota)
254+
if let response = json["response"] as? [String: Any],
255+
let status = response["status"] as? String {
256+
257+
logger.debug("Response done with status: \(status)")
258+
259+
// Pass the full response object for detailed error handling
260+
continuation?.yield(.responseDone(status: status, statusDetails: response))
261+
262+
// Log errors for debugging
263+
if let statusDetails = response["status_details"] as? [String: Any],
264+
let error = statusDetails["error"] as? [String: Any] {
265+
let code = error["code"] as? String ?? "unknown"
266+
let message = error["message"] as? String ?? "Unknown error"
267+
logger.error("Response error: [\(code)] \(message)")
268+
}
269+
} else {
270+
logger.warning("Received response.done with unexpected format")
271+
}
272+
252273
default:
253-
// Log unhandled message types for debugging
254-
logger.debug("Unhandled message type: \(messageType)")
274+
// Log unhandled message types with more detail for debugging
275+
logger.warning("⚠️ Unhandled message type: \(messageType)")
276+
logger.debug("Full JSON: \(String(describing: json))")
255277
break
256278
}
257279

Sources/OpenAI/Public/ResponseModels/Realtime/OpenAIRealtimeMessage.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,7 @@ public enum OpenAIRealtimeMessage: Sendable {
2626
case mcpListToolsInProgress // "mcp_list_tools.in_progress"
2727
case mcpListToolsCompleted([String: Any]) // "mcp_list_tools.completed" with tools data
2828
case mcpListToolsFailed(String?) // "mcp_list_tools.failed" with error details
29+
30+
// Response completion with potential errors
31+
case responseDone(status: String, statusDetails: [String: Any]?) // "response.done"
2932
}

0 commit comments

Comments
 (0)