( # pyright: ignore[reportUnusedFunction]
websocket: WebSocket,
)
| 16172 | |
| 16173 | @app.websocket("/v1/responses") |
| 16174 | async def responses_websocket( # pyright: ignore[reportUnusedFunction] |
| 16175 | websocket: WebSocket, |
| 16176 | ): |
| 16177 | await websocket.accept() |
| 16178 | service: CompletionService = app.state.service |
| 16179 | formatter = service.formatter |
| 16180 | # HTTP /v1/responses remains stateless. The websocket transport keeps |
| 16181 | # per-connection response history so Codex can use previous_response_id |
| 16182 | # within a single live session. |
| 16183 | websocket_response_history: Dict[str, ResponsesWebSocketState] = {} |
| 16184 | |
| 16185 | def websocket_request_with_ephemeral_history( |
| 16186 | ws_body: ResponseCreateWebSocketRequest, |
| 16187 | ) -> CreateResponseRequest: |
| 16188 | body = ws_body.to_create_response_request() |
| 16189 | previous_response_id = body.previous_response_id |
| 16190 | if previous_response_id is None: |
| 16191 | return body |
| 16192 | prior_state = websocket_response_history.get(previous_response_id) |
| 16193 | if prior_state is None: |
| 16194 | raise CompletionRequestValidationError( |
| 16195 | f"unknown previous_response_id: {previous_response_id}" |
| 16196 | ) |
| 16197 | current_items = formatter._clone_response_input_items(body.input) |
| 16198 | replay_items = formatter._clone_response_input_items( |
| 16199 | prior_state.input_items |
| 16200 | ) |
| 16201 | for item in prior_state.output_items: |
| 16202 | normalized = formatter._normalize_response_output_item_for_input(item) |
| 16203 | if normalized is not None: |
| 16204 | replay_items.append(normalized) |
| 16205 | replay_items.extend(current_items) |
| 16206 | return body.model_copy( |
| 16207 | update={ |
| 16208 | "input": replay_items, |
| 16209 | "previous_response_id": None, |
| 16210 | } |
| 16211 | ) |
| 16212 | |
| 16213 | async def send_error(message: str) -> None: |
| 16214 | await websocket.send_json( |
| 16215 | { |
| 16216 | "type": "error", |
| 16217 | "error": { |
| 16218 | "message": message, |
| 16219 | }, |
| 16220 | } |
| 16221 | ) |
| 16222 | |
| 16223 | try: |
| 16224 | while True: |
| 16225 | try: |
| 16226 | payload = await websocket.receive_json() |
| 16227 | except WebSocketDisconnect: |
| 16228 | break |
| 16229 | except Exception: |
| 16230 | await send_error("invalid websocket request payload") |
| 16231 | continue |
nothing calls this directly
no test coverage detected
searching dependent graphs…