Ë
    tPêj�Ç  ã                   óÞ	  — U d dl Z d dlZd dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlmZ d dlZd dlmZmZmZmZmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ  d dl!­ d dl"m#Z#m$Z$m%Z% d dl&m'Z' d dl(m)Z)m*Z* d dl+m,Z,m-Z- d dl.m/Z/ e	rd dl0m1Z1  e«       Z2ee3d<    ee$«      Z4ee3d<   dgZ5ee3d<    edddœ«      Z6eee7e8e7df   f      e3d<    ei «      Z9eee7e
f      e3d<   de7de:de;de:fd „Z<d!e:de;de:fd"„Z=d#e>de;de>fd$„Z?d#ee7e
f   de;fd%„Z@d&ZAee3d'<   d(ZBee3d)<    eC ee,«      «      ZDeeCe7      e3d*<    G d+„ d,e«      ZEd-e7deEfd.„ZFd-e7d/d0de;fd1„ZGd#e>d/d0de>fd2„ZHd3eddfd4„ZIe2j•                  d5 ee$«      gdg¬6«      e2j•                  d7 ee$«      gdg¬6«      e2j•                  d8 ee$«      gdg¬6«       ee$«      fd3ed9ed:e#fd;„«       «       «       ZKe2j™                  d<e4fe5¬6«      e2j™                  d=e4fe5¬6«      e4fd:e#fd>„«       «       ZMe2j•                  d? eeI«       ee$«      gdg¬6«       ee$«      fd3ed9ed:e#fd@„«       ZNe2j™                  dA ee$«      gdg¬6«      e2j™                  dB ee$«      gdg¬6«      e2j™                  dC ee$«      gdg¬6«       ee$«      fdDe7d3ed9ed:e#fdE„«       «       «       ZOe2j¡                  dA ee$«      gdg¬6«      e2j¡                  dB ee$«      gdg¬6«      e2j¡                  dC ee$«      gdg¬6«       ee$«      fdDe7d3ed9ed:e#fdF„«       «       «       ZQe2j™                  dG ee$«      gdg¬6«      e2j™                  dH ee$«      gdg¬6«      e2j™                  dI ee$«      gdg¬6«       ee$«      fdDe7d3ed9ed:e#fdJ„«       «       «       ZRe2j•                  dK ee$«      gdg¬6«      e2j•                  dL ee$«      gdg¬6«      e2j•                  dM ee$«      gdg¬6«       ee$«      fd3ed9ed:e#fdN„«       «       «       ZSe2j•                  dO ee$«      gdg¬6«      e2j•                  dP ee$«      gdg¬6«      e2j•                  dQ ee$«      gdg¬6«       ee$«      fdDe7d3ed9ed:e#fdR„«       «       «       ZTdSede8dz  fdT„ZUdUe
de7dz  fdV„ZVd3ed-e7d:e#d/e
dz  ddf
dW„ZWe2j±                  d5«      e2j±                  d7«       ej²                  ddX¬Y«       ee%«      fdSed-e7dz  fdZ„«       «       ZZy)[é    N)ÚAsyncIteratorÚMapping)ÚMappingProxyType)ÚTYPE_CHECKINGÚAnyÚFinalÚ
NamedTupleÚcastÚget_args)Úuuid4)Ú	APIRouterÚDependsÚHTTPExceptionÚRequestÚResponse)Ú	WebSocketÚWebSocketDisconnect)Úverbose_proxy_logger)ÚModifyResponseException)Úblocked_responses_api_usage)Ú*)ÚUserAPIKeyAuthÚuser_api_key_authÚuser_api_key_auth_websocket)ÚProxyBaseLLMRequestProcessing)Ú_read_request_bodyÚ_safe_set_request_parsed_body)ÚREASONING_EFFORTÚResponsesAPIResponse)ÚDeleteResponseResult)ÚRouterÚrouterÚ_user_api_key_auth_depÚ	responsesÚ_RESPONSES_TAGS)ÚnameÚdescriptionÚformat)r&   r'   Ú
parametersÚstrict)ÚcustomÚfunction.Ú_TOOL_PAYLOAD_KEYSÚ_EMPTY_TOOL_PAYLOADÚkeyÚvalueÚto_chatÚreturnc                ó\   — | dk7  st        |t        «      s|S ddlm}m} |r|n|} ||«      S )Nr(   r   )Ú(convert_custom_tool_format_to_chat_shapeÚ-convert_custom_tool_format_to_responses_shape)Ú
isinstanceÚdictÚ8litellm.litellm_core_utils.prompt_templates.common_utilsr4   r5   )r/   r0   r1   r4   r5   Úconverts         ús/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/response_api_endpoints/endpoints.pyÚ_convert_tool_payload_valuer;   1   s4   € Ø
ˆh‚œj¨´Ô5Øˆ÷ñ
 ;BÑ6ÐGt€GÙ�5‹>Ðó    Úobjc          	      ó^  — t        | t        «      s| S | j                  d«      }t        j                  |«      }|€| S | j                  |«      }t        |t        «      r|nt        }|D �ci c]%  }||v s|| v r|t        |||v r||   n| |   |¬«      “Œ' }}d|vr| S |rd|||iS d|i|¥S c c}w )NÚtype©r1   r&   )r6   r7   Úgetr-   r.   r;   )r=   r1   Ú	tool_typeÚpayload_keysÚnestedÚnested_sourcer/   Úpayloads           r:   Ú_convert_tool_enveloperG   =   sß   € Ü�cœ4Ô Øˆ
Ø—w‘w˜v“€IÜ,×0Ñ0°Ó;€LØÐØˆ
Ø—G‘G˜IÓ&€FÜ%/°¼Ô%=™6ÔCV€Mð  öàØ�-Ñ 3¨#¡:ð 	Ô(¨ÀCÈ=ÑDX¨m¸CÒ.@Ð^aÐbeÑ^fÐpwÔxÑxð€Gð ð
 �WÑØˆ
Ù6=ˆF�I˜y¨'Ð2ÐaÀFÈIÐCaÐY`ÐCaÐaùòs   Á**B*Údatac                ó6  — | j                  d«      }| j                  d«      }t        |t        «      r|D �cg c]  }t        ||¬«      ‘Œ c}n|}t        ||¬«      }||k(  r||k(  r| S d|fd|ff}i | ¥|D ��	ci c]  \  }}	|| v sŒ||	“Œ c}	}¥S c c}w c c}	}w )NÚtoolsÚtool_choicer@   )rA   r6   ÚlistrG   )
rH   r1   rJ   rK   ÚtoolÚnormalized_toolsÚnormalized_choiceÚreplaceabler/   r0   s
             r:   Ú_normalize_tool_dialectrQ   P   sÃ   € ð —8‘8˜GÓ$€EØŸ™ -Ó0€Kô
 �eœTÔ"ð GLö	
Ø>BÔ" 4°Ö9ó	
ð ð ô  6°kÈ7ÔSÐØ˜5Ò Ð%6¸+Ò%EØˆØ"Ð$4Ð5¸ÐGXÐ7YÐZ€KØPˆdÐP°K×O¡j c¨5À3È$Â;�s˜E‘zÓOÐPÐPùò	
ùó Ps   ·BÁ9BÂBc                 ó^   — | j                  d«      }t        |t        «      r|ryd| v xr d| vS )NÚmessagesTÚinput)rA   r6   rL   )rH   rS   s     r:   Ú_is_chat_completions_bodyrU   c   s4   € Ø—h‘h˜zÓ*€HÜ�(œDÔ!¡hØØ˜ÐÒ5 '°Ð"5Ð5r<   z
-thinking-Ú_CURSOR_THINKING_SEPARATORz-fastÚ_CURSOR_FAST_SUFFIXÚ_CURSOR_THINKING_LEVELSc                   ó(   — e Zd ZU eed<   edz  ed<   y)Ú_CursorModelVariantÚ
base_modelNÚreasoning_effort)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__© r<   r:   rZ   rZ   o   s   … ØƒOØ˜D‘jÔ r<   rZ   Úmodelc                 ó¦   — | j                  t        «      }|j                  t        «      \  }}}|r|r|t        v rt        ||«      S t        |d «      S ©N)ÚremovesuffixrW   Ú
rpartitionrV   rX   rZ   )rc   ÚstrippedÚbaseÚ	separatorÚlevels        r:   Ú_parse_cursor_model_variantrl   t   sR   € Ø×(Ñ(Ô)<Ó=€HØ%×0Ñ0Ô1KÓLÑ€Dˆ)�UÙ‘T˜eÔ'>Ñ>Ü" 4¨Ó/Ð/Ü˜x¨Ó.Ð.r<   Ú
llm_routerzRouter | Nonec                 ó’   — |€y|j                  | «      ry| |j                  v ryt        |j                  j	                  | «      «      S )NFT)Úis_recognized_modelÚteam_public_model_namesÚboolÚpattern_routerÚget_pattern)rc   rm   s     r:   Ú_router_can_servert   |   sI   € ØÐØØ×%Ñ% eÔ,ØØ�
×2Ñ2Ñ2ØÜ�
×)Ñ)×5Ñ5°eÓ<Ó=Ð=r<   c                 ó
  — | j                  d«      }t        |t        «      rt        ||«      r| S t	        |«      }|j
                  |k(  st        |j
                  |«      s| S i | ¥d|j
                  i¥}|j                  €|S t        | «      rd| v r|S i |¥d|j                  i¥S | j                  d«      }t        |t        «      r+|j                  d«      r|S i |¥di |¥d|j                  i¥i¥S i |¥dd|j                  ii¥S )Nrc   r\   Ú	reasoningÚeffort)	rA   r6   r`   rt   rl   r[   r\   rU   r7   )rH   rm   rc   ÚvariantÚresolvedrv   s         r:   Ú_resolve_cursor_model_variantrz   †   s  € ð —8‘8˜GÓ$€EÜ�eœSÔ!Ô%6°u¸jÔ%IØˆÜ0°Ó7€GØ×Ñ˜UÒ"Ô*;¸G×<NÑ<NÐPZÔ*[ØˆØ;˜Ð;˜w¨×(:Ñ(:Ñ;€HØ×ÑÐ'ØˆÜ  Ô&Ø Ñ%ØˆOØI�(ÐIÐ.°×0HÑ0HÑIÐIØ—x‘x Ó,€IÜ�)œTÔ"Ø�=‰=˜Ô"ØˆOØ[�(Ð[˜KÐ)Z¨IÐ)Z°xÀ×AYÑAYÑ)ZÑ[Ð[ØJˆhÐJ˜ h°×0HÑ0HÐ%IÑJÐJr<   Úrequestc              ƒ   óÀ   K  — ddl m} 	 t        | ¬«      ƒ d {  –—† }t        ||«      }||urt        | |¬«       y y 7 Œ## t        j                  t
        f$ r Y y w xY w­w)Nr   )rm   ©r{   ©r{   Úparsed_body)Úlitellm.proxy.proxy_serverrm   r   ÚjsonÚJSONDecodeErrorÚProxyExceptionrz   r   )r{   rm   Úraw_bodyry   s       r:   Ú)_resolve_cursor_model_variant_before_authr…   ž   sb   è ø€ Ý5ðÜ 2¸7Ô C×Cˆô 4°H¸jÓI€HØ�xÑÜ%¨gÀ8ÖLð  ð	 DùÜ× Ñ ¤.Ð1ò Ùðüs1   ‚AŠ? ™=š? žA½? ¿AÁAÁAÁAú/v1/responses)ÚdependenciesÚtagsz
/responsesz/openai/v1/responsesÚfastapi_responseÚuser_api_key_dictc              ƒ   ó  K  — ddl m}m}m}m}m}m}m}	m}
m	}m
}m}m}m}m}m}m}  || ¬«      ƒ d{  –—† }ddlm}  ||j'                  dd«      |||j'                  dd	«      ||¬
«      }|rùddlm} ddlm} t/        j0                  d|j'                  d«      «       t3        |¬«      }	 |j5                  | ||
|||	|||||dd|¬«      ƒ d{  –—† \  }} |||¬«      }|j;                  «       }|j=                  ||¬«      ƒ d{  –—† }t?        j@                   |d8i d|“d|jC                  «       “d|“d| “d|“d|“d|“d|“d|	“d|
“d|“d|“d |“d!|“d"|“d#|“d$|“Ž«       |S t3        |¬«      }	 |jE                  | ||d|
|||	|d||||||¬%«      ƒ d{  –—† }|j'                  d«      r÷tG        |tH        «      rç|jJ                  d&v rÙdd'l&m'} tQ        |dz  |
jS                  d(«      «      } | r³|r±	 tU        |d)i «      xs i }!|!j'                  d*d«      }"|"s+t/        jV                  d+|jX                  «       t7        d,«      ‚| j[                  |jX                  |d|jX                  d-|¬.«      ƒ d{  –—†  t/        j0                  d/|jX                  |jX                  «       |S |S 7 �Œt7 �ŒÜ# t6        $ r#}|j9                  |||
|¬«      ƒ d{  –—†7  ‚d}~ww xY w7 �ŒÖ7 �ŒG7 Œn# t6        $ r!}t/        j\                  d0|«       Y d}~|S d}~ww xY w# t^        $ r¾}|j`                  }#|
jc                  |||#¬1«      ƒ d{  –—†7   |jd                  }$tI        d2tg        «       › �d-ti        tk        jj                  «       «      |jl                  xs |j'                  d«      tQ        tn        d3d4|$d5œgig«      d6tq        |jr                  «      ¬7«      }%|%cY d}~S d}~wt6        $ r#}|j9                  |||
|¬«      ƒ d{  –—†7  ‚d}~ww xY w­w)9as  
    Follows the OpenAI Responses API spec: https://platform.openai.com/docs/api-reference/responses

    Supports background mode with polling_via_cache for partial response retrieval.
    When background=true and polling_via_cache is enabled, returns a polling_id immediately
    and streams the response in the background, updating Redis cache.

    ```bash
    # Normal request
    curl -X POST http://localhost:4000/v1/responses     -H "Content-Type: application/json"     -H "Authorization: Bearer sk-1234"     -d '{
        "model": "gpt-4o",
        "input": "Tell me about AI"
    }'

    # Background request with polling
    curl -X POST http://localhost:4000/v1/responses     -H "Content-Type: application/json"     -H "Authorization: Bearer sk-1234"     -d '{
        "model": "gpt-4o",
        "input": "Tell me about AI",
        "background": true
    }'
    ```
    r   )r   Úgeneral_settingsrm   Únative_background_modeÚpolling_cache_ttlÚpolling_via_cache_enabledÚproxy_configÚproxy_logging_objÚredis_usage_cacheÚselect_data_generatorÚuser_api_baseÚuser_max_tokensÚ
user_modelÚuser_request_timeoutÚuser_temperatureÚversionr}   N)Úshould_use_polling_for_requestÚ
backgroundFrc   Ú )Úbackground_moder�   Úredis_cacherc   rm   r�   )Úbackground_streaming_task©ÚResponsePollingHandlerz6Starting background response with polling for model=%s©rH   Ú
aresponses)r{   rŒ   r‘   rŠ   r™   r�   r–   r˜   r—   r•   r”   rc   Ú
route_typerm   ©ÚerŠ   r‘   r™   )rž   Úttl)Ú
polling_idÚrequest_datar¨   rH   Úpolling_handlerr{   r‰   rŠ   rŒ   rm   r�   r‘   r“   r–   r˜   r—   r•   r”   r™   ©r{   r‰   rŠ   r¤   r‘   rm   rŒ   r�   r“   rc   r–   r˜   r—   r•   r”   r™   )ÚqueuedÚin_progress)Ú_PROXY_LiteLLMManagedFilesÚmanaged_filesÚ_hidden_paramsÚmodel_idz\No model_id found in response hidden params for response %s, skipping managed object storagez+No model_id found in response hidden paramsÚresponse)Úunified_object_idÚfile_objectÚlitellm_parent_otel_spanÚmodel_object_idÚfile_purposerŠ   zIStored background response %s in managed objects table with unified_id=%sz@Failed to store background response in managed objects table: %s)rŠ   Úoriginal_exceptionr©   Úresp_ÚcontentÚtext)r?   r»   Ú	completed)ÚidÚobjectÚ
created_atrc   ÚoutputÚstatusÚusagerb   ):r€   r   rŒ   rm   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   Ú.litellm.proxy.response_polling.polling_handlerrš   rA   Ú3litellm.proxy.response_polling.background_streamingrŸ   r¡   r   Úinfor   Ú common_processing_pre_call_logicÚ	ExceptionÚ_handle_llm_api_exceptionÚgenerate_polling_idÚcreate_initial_stateÚasyncioÚcreate_taskÚcopyÚbase_process_llm_requestr6   r   rÁ   Ú,litellm_enterprise.proxy.hooks.managed_filesr®   r
   Úget_proxy_hookÚgetattrÚwarningr½   Ústore_unified_object_idÚerrorr   r©   Úpost_call_failure_hookÚmessager   ÚintÚtimerc   r   Ú_blocked_responses_api_usageÚoriginal_response)&r{   r‰   rŠ   r   rŒ   rm   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rH   rš   Úshould_use_pollingrŸ   r¡   Ú	processorÚ_logging_objr¦   rª   r¨   Úinitial_stater²   r®   Úmanaged_files_objÚhidden_paramsr±   Ú_dataÚviolation_textÚresponse_objs&                                         r:   Úresponses_apirä   ª   sñ  è ø€ ÷`÷ ÷ ÷ ó ñ& $¨GÔ4×4€Dõñ !?ØŸ™ ¨uÓ5Ø";Ø%Ø�h‰h�w Ó#ØØ5ô!Ðñ õ	
õ	
ô 	×!Ñ!Ð"ZÐ\`×\dÑ\dÐelÓ\mÔnô
 2°tÔ<ˆ	ð	Ø'0×'QÑ'QØØ!1Ø"3Ø"3ØØ)Ø%Ø!1Ø%9Ø /Ø+ØØ'Ø%ð (Ró (÷ "ÑˆD�,ñ2 "8Ø)Ø!ô"
ˆð 3×FÑFÓHˆ
ð &5×%IÑ%IØ!Øð &Jó &
÷  
ˆô 	×ÑÙ%ò Ù%ðà—Y‘Y”[ðñ !0ðñ  ð	ñ
 "2ðñ #4ðñ "2ðñ &ðñ *ðñ #4ðñ '<ðñ &ðñ "2ðñ &:ðñ !0ðñ  ,ð!ñ"  ð#ô	
ð0 Ðô .°4Ô8€Ið[
Ø )× BÑ BØØ-Ø/Ø#Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! !Có !
÷ 
ˆð( �8‰8�LÔ!¤j°Ô;OÔ&PØ�‰Ð";Ñ;õô ,0Ø.°Ñ5Ø%×4Ñ4°_ÓEó,Ð!ñ
 %©ðä/6°xÐAQÐSUÓ/VÒ/\ÐZ\˜Ø*7×*;Ñ*;¸JÈÓ*M˜á'Ü0×8Ñ8Ø ~Ø (§¡ôô #,Ð,YÓ"ZÐZà/×GÑGØ.6¯k©kØ(0Ø59Ø,4¯K©KØ)3Ø.?ð Hó ÷ ð ô -×1Ñ1ØgØ$ŸK™KØ$ŸK™Kôð ˆˆxˆðM 5ùð@"úô  ò 	Ø!×;Ñ;ØØ"3Ø"3Øð	 <ó ÷ ð ð ûð	úð$ 
ùðJ
ùðXùô %ò Ü,×2Ñ2Ø^Ð`a÷ð ð ˆûðûô #ò à—~‘~ˆØ×6Ñ6Ø/Ø Øð 7ó 
÷ 	
ñ 	
ð !"§	¡	ˆÜ2Ø”u“w�iÐ ØÜœ4Ÿ9™9›;Ó'Ø—'‘'Ò.˜TŸX™X gÓ.Üœ˜y°FÀNÑ+SÐ*TÐUÐVÓWØÜ.¨q×/BÑ/BÓCô
ˆð ÕûÜò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üs  ‚1P³J'´A7PÂ,"J- ÃJ*ÃJ- Ã0PÄKÄA,PÅ4$L ÆKÆAL Ç5A>K$ É3K"É4/K$ Ê#L Ê$PÊ%L Ê&PÊ*J- Ê-	KÊ6KËKËKËKËPËL Ë"K$ Ë$	LË-L	ÌL ÌPÌ	LÌL Ì	PÌ#OÌ=M Ì>BOÏPÏPÏPÏO=Ï7O:Ï8O=Ï=PÐPz/cursor/modelsz/cursor/v1/modelsc              ƒ   ó<   K  — ddl m}  || ¬«      ƒ d{  –—† S 7 Œ­w)aç  
    OpenAI-compatible model listing for the Cursor BYOK base URL.

    Clients pointed at `<proxy>/cursor` as an OpenAI-compatible base URL resolve and
    verify models via `GET {base}/models` (the OpenAI SDK contract). Without this
    route those requests fall through to the Cursor Cloud Agents passthrough, which
    demands a Cursor API key and 401s, so key verification silently fails before any
    chat request is ever sent. Delegates to the standard `/v1/models` handler.
    r   )Ú
model_list)rŠ   N)r€   ræ   )rŠ   ræ   s     r:   Úcursor_model_listrç   ±  s   è ø€ õ, 6áÐ.?Ô@×@Ð@Ð@ús   ‚•–z/cursor/chat/completionsc              ƒ   óÀ  ‡‡‡K  — ddl mŠ ddlmŠ ddlmŠm}m}m}m	}m
}m}m}	m}
m}m}m} ddlm} ddlm} t+        | ¬«      ƒ d{  –—† }t-        |«      r2t/        |d	¬
«      }||urt1        | |¬«        || |d|¬«      ƒ d{  –—† S |j3                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}t/        |d¬
«      }t5        |¬«      }dˆˆˆfd„	}	 |j7                  | ||d|||||d|
|||	||¬«      ƒ d{  –—† }t9        ||«      r”|j:                  j=                  d«      }‰j>                  jA                  |j:                  j=                  dd«      | |«       tC        tD        |«      |j:                  |j:                  j=                  dg «      i i ddd¬«      }|S |S 7 �ŒX7 �Œc c}}w 7 Œ²# tF        $ r#}|jI                  ||||¬«      ƒ d{  –—†7  ‚d}~ww xY w­w)aZ  
    Cursor BYOK endpoint. Accepts both request shapes Cursor sends to its OpenAI-compatible
    base URL and always answers in chat completions format.

    Cursor agent mode sends Responses API format bodies (`input`, flat tool defs, `reasoning`,
    custom tools) to the chat/completions path while expecting chat completions responses;
    those are routed through the Responses API pipeline and converted back. Genuine chat
    completions bodies (`messages` present) are routed through the standard chat completions
    pipeline, after normalizing each level of the `tools` array and `tool_choice` to the chat
    completions shapes OpenAI requires. Cursor mixes Responses API shapes into chat bodies
    per level, independently: a flat tool def (`{"type": "custom", "name": "ApplyPatch", ...}`)
    gets nested under `custom`, and a flat grammar format
    (`{"type": "grammar", "definition", "syntax"}`) gets wrapped as
    `{"type": "grammar", "grammar": {...}}` wherever it appears, including inside tool defs
    Cursor already sent pre-nested.

    ```bash
    curl -X POST http://localhost:4000/cursor/chat/completions     -H "Content-Type: application/json"     -H "Authorization: Bearer sk-1234"     -d '{
        "model": "gpt-4o",
        "input": [{"role": "user", "content": "Hello"}]
    }'
    Responds back in chat completions format.
    ```
    r   )Úresponses_api_bridge)ÚCustomStreamWrapper)Úasync_data_generatorÚchat_completionrŒ   rm   r�   r‘   r”   r•   r–   r—   r˜   r™   )r   )ÚModelResponser}   NTr@   r~   )r{   r‰   rc   rŠ   Ústream_optionsFr¢   c                 ó  •— t        | d«      rl‰	j                  j                  t        t        t
           | «      dd¬«      }|j                  d«      } ‰||j                  dd«      d|¬«      } ‰||||¬	«      S  ‰| |||¬	«      S )
a³  
        Custom generator that transforms Responses API streaming chunks to chat completion chunks.

        This generator is used for the cursor endpoint to convert Responses API format responses
        to chat completion format that Cursor IDE expects.

        Args:
            response: The streaming Responses API event iterator (router-wrapped or not)
            user_api_key_dict: User API key authentication dict
            request_data: Request data containing model, logging_obj, etc.
            request: The originating FastAPI request, forwarded for disconnect handling

        Returns:
            Async generator that yields SSE-formatted chat completion chunks
        Ú	__anext__F)Ústreaming_responseÚsync_streamÚ	json_modeÚlitellm_logging_objrc   rœ   N)Úcompletion_streamrc   Úcustom_llm_providerÚlogging_obj)r²   rŠ   r©   r{   )ÚhasattrÚtransformation_handlerÚget_model_response_iteratorr
   r   r`   rA   )
r²   rŠ   r©   r{   rõ   r÷   Ústreamwrapperrê   rë   ré   s
          €€€r:   Úcursor_data_generatorz6cursor_chat_completions.<locals>.cursor_data_generator'  s¯   ø€ ô( �8˜[Ô)ð (<×'RÑ'R×'nÑ'nÜ#'¬´cÑ(:¸HÓ#EØ!Øð (oó (Ðð ".×!1Ñ!1Ð2GÓ!HˆKÙ#6Ø"3Ø"×&Ñ& w°Ó3Ø$(Ø'ô	$ˆMñ (Ø&Ø"3Ø)Øô	ð ñ $ØØ/Ø%Øô	
ð 	
r<   r£   r«   rô   rc   rœ   rT   )rc   Úraw_responseÚmodel_responser÷   r©   rS   Úoptional_paramsÚlitellm_paramsÚencodingÚapi_keyró   r¥   re   )%ÚBlitellm.completion_extras.litellm_responses_transformation.handlerré   Ú,litellm.litellm_core_utils.streaming_handlerrê   r€   rë   rì   rŒ   rm   r�   r‘   r”   r•   r–   r—   r˜   r™   Úlitellm.types.llms.openair   Úlitellm.types.utilsrí   r   rU   rQ   r   Úitemsr   rÎ   r6   rH   rA   rù   Útransform_responser
   r   rÇ   rÈ   )r{   r‰   rŠ   rì   rŒ   rm   r�   r‘   r”   r•   r–   r—   r˜   r™   r   rí   r„   Ú
normalizedr/   r0   Úbody_without_stream_optionsrH   rÜ   rü   r²   r÷   Útransformed_responser¦   rê   rë   ré   s                               @@@r:   Úcursor_chat_completionsr  Ì  s  úè ø€ õPõ Q÷÷ ÷ ó õ ?Ý1ä.°wÔ?×?€Hä  Ô*ô
 4°HÀdÔKˆ
Ø˜XÑ%Ü)°'ÀzÕRÙ$ØØ-ØØ/ô	
÷ 
ð 	
ð &.§^¡^Ó%5÷*Ù!�s˜E¸Ð@PÓ9PˆˆU‰
ð*Ðñ *ô *Ð*EÈuÔU€Dä4¸$Ô?€I÷1
ðf.
Ø )× BÑ BØØ-Ø/Ø#Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! !Có !
÷ 
ˆô( �hÐ 4Ô5Ø!*§¡×!3Ñ!3Ð4IÓ!JˆKØ*>×*UÑ*U×*hÑ*hØ—n‘n×(Ñ(¨°"Ó5Ø%Ù,›Ü ¤ kÓ2Ø&Ÿ^™^Ø"Ÿ™×+Ñ+¨G°RÓ8Ø "Ø!ØØØð +ió +Ð ð (Ð'ð ˆðq @ùð
ûó*ðx
ùôN ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üs‹   …AGÁ	F!Á
<GÂF$ÂGÂF'Â,F'Â1$GÃ$F/ Ã:F-Ã;B#F/ ÆGÆF/ Æ GÆ$GÆ'GÆ-F/ Æ/	GÆ8GÇGÇGÇGÇGz/v1/responses/{response_id}z/responses/{response_id}z"/openai/v1/responses/{response_id}Úresponse_idc              ƒ   ó  K  — ddl m}m}m}m}m}m}	m}
m}m	}m
}m}m}m} ddlm} |j!                  | «      rF|	st#        dd¬«      ‚ ||	¬«      }|j%                  | «      ƒ d{  –—† }|st#        d	d
| › d�¬«      ‚|S  ||¬«      ƒ d{  –—† }| |d<   t'        |¬«      }	 |j)                  |||d|||||
d||||||¬«      ƒ d{  –—† S 7 Œe7 ŒA7 Œ# t*        $ r#}|j-                  ||||¬«      ƒ d{  –—†7  ‚d}~ww xY w­w)ai  
    Get a response by ID.
    
    Supports both:
    - Polling IDs (litellm_poll_*): Returns cumulative cached content from background responses
    - Provider response IDs: Passes through to provider API
    
    Follows the OpenAI Responses API spec: https://platform.openai.com/docs/api-reference/responses/get
    
    ```bash
    # Get polling response
    curl -X GET http://localhost:4000/v1/responses/litellm_poll_abc123     -H "Authorization: Bearer sk-1234"
    
    # Get provider response
    curl -X GET http://localhost:4000/v1/responses/resp_abc123     -H "Authorization: Bearer sk-1234"
    ```
    r   ©r   rŒ   rm   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   r    éô  z3Redis cache not configured. Polling requires Redis.©Ústatus_codeÚdetail©rž   Né”  úPolling response z not found or expiredr}   r  r¢   Úaget_responsesr«   r¥   )r€   r   rŒ   rm   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rÃ   r¡   Úis_polling_idr   Ú	get_stater   rÎ   rÇ   rÈ   )r  r{   r‰   rŠ   r   rŒ   rm   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   r¡   rª   ÚstaterH   rÜ   r¦   s                          r:   Úget_responser  ‹  sV  è ø€ ÷P÷ ÷ õ õ Vð ×+Ñ+¨KÔ8á ÜØØLôð ñ
 "8ÐDUÔ!Vˆð -×6Ñ6°{ÓC×CˆáÜØØ*¨;¨-Ð7LÐMôð ð ˆñ +°7Ô;×;€DØ%€DˆÑÜ4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø'Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! 8ó 
÷ 
ð 	
ð# Døð <øð
ùô$ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üsf   ‚A"C?Á$C
Á%%C?Â
CÂC?Â!$C ÃCÃC Ã	C?ÃC?ÃC Ã	C<ÃC7Ã1C4Ã2C7Ã7C<Ã<C?c              ƒ   ón  K  — ddl m}m}m}m}m}m}	m}
m}m	}m
}m}m}m} ddlm} |j!                  | «      rz|	st#        dd¬«      ‚ ||	¬«      }|j%                  | «      ƒ d{  –—† }|st#        d	d
| › d�¬«      ‚|j'                  | «      ƒ d{  –—† }|rt)        | dd¬«      S t#        dd¬«      ‚ ||¬«      ƒ d{  –—† }| |d<   t+        |¬«      }	 |j-                  |||d|||||
d||||||¬«      ƒ d{  –—† S 7 Œ™7 Œo7 ŒC7 Œ
# t.        $ r#}|j1                  ||||¬«      ƒ d{  –—†7  ‚d}~ww xY w­w)a¥  
    Delete a response by ID.
    
    Supports both:
    - Polling IDs (litellm_poll_*): Deletes from Redis cache
    - Provider response IDs: Passes through to provider API
    
    Follows the OpenAI Responses API spec: https://platform.openai.com/docs/api-reference/responses/delete
    
    ```bash
    curl -X DELETE http://localhost:4000/v1/responses/resp_abc123     -H "Authorization: Bearer sk-1234"
    ```
    r   r  r    r  úRedis cache not configured.r  r  Nr  r  ú
 not foundr²   T)r½   r¾   Údeletedz!Failed to delete polling responser}   r  r¢   Úadelete_responsesr«   r¥   )r€   r   rŒ   rm   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rÃ   r¡   r  r   r  Údelete_pollingr    r   rÎ   rÇ   rÈ   )r  r{   r‰   rŠ   r   rŒ   rm   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   r¡   rª   r  ÚsuccessrH   rÜ   r¦   s                           r:   Údelete_responser#  ü  s€  è ø€ ÷F÷ ÷ õ õ Vð ×+Ñ+¨KÔ8á Ü¨CÐ8UÔVÐVá!7ÐDUÔ!Vˆð -×6Ñ6°{ÓC×CˆáÜ¨CÐ:KÈKÈ=ÐXbÐ8cÔdÐdð  /×=Ñ=¸kÓJ×JˆáÜ'¨;¸zÐSWÔXÐXä¨CÐ8[Ô\Ð\ñ +°7Ô;×;€DØ%€DˆÑÜ4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø*Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! 8ó 
÷ 
ð 	
ð% Døð Køð <øð
ùô$ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üsx   ‚A"D5Á$C>Á%+D5ÂD Â-D5Â>DÂ?D5Ã$D Ã9DÃ:D Ã=D5Ä D5ÄD5ÄD Ä	D2ÄD-Ä'D*Ä(D-Ä-D2Ä2D5z'/v1/responses/{response_id}/input_itemsz$/responses/{response_id}/input_itemsz./openai/v1/responses/{response_id}/input_itemsc              ƒ   ó@  K  — ddl m}m}m}m}m}m}	m}
m}m	}m
}m}m}  ||¬«      ƒ d{  –—† }| |d<   t        |¬«      }	 |j                  |||d|||||	d|||||
|¬«      ƒ d{  –—† S 7 Œ?7 Œ# t        $ r#}|j!                  ||||¬	«      ƒ d{  –—†7  ‚d}~ww xY w­w)
z List input items for a response.r   ©r   rŒ   rm   r�   r‘   r“   r”   r•   r–   r—   r˜   r™   r}   Nr  r¢   Úalist_input_itemsr«   r¥   ©r€   r   rŒ   rm   r�   r‘   r“   r”   r•   r–   r—   r˜   r™   r   rÎ   rÇ   rÈ   )r  r{   r‰   rŠ   r   rŒ   rm   r�   r‘   r“   r”   r•   r–   r—   r˜   r™   rH   rÜ   r¦   s                      r:   Úget_response_input_itemsr(  f  sÙ   è ø€ ÷,÷ ÷ ó ñ +°7Ô;×;€DØ%€DˆÑÜ4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø*Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! 8ó 
÷ 
ð 	
ð	 <øð
ùô$ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üsQ   ‚)B«A+¬BÁ$A/ Á&A-Á'A/ Á*BÁ-A/ Á/	BÁ8BÂBÂBÂBÂBz/v1/responses/compactz/responses/compactz/openai/v1/responses/compactc              ƒ   ó6  K  — ddl m}m}m}m}m}m}m}	m}
m	}m
}m}m}  || ¬«      ƒ d{  –—† }t        |¬«      }	 |j                  | ||d|||||d||||
|	|¬«      ƒ d{  –—† S 7 Œ:7 Œ# t        $ r#}|j!                  ||||¬«      ƒ d{  –—†7  ‚d}~ww xY w­w)	a  
    Compact a response by running a compaction pass over a conversation.
    
    Returns encrypted, opaque items that can be used to reduce context size.
    
    Follows the OpenAI Responses API spec: https://platform.openai.com/docs/api-reference/responses/compact
    
    ```bash
    curl -X POST http://localhost:4000/v1/responses/compact     -H "Content-Type: application/json"     -H "Authorization: Bearer sk-1234"     -d '{
        "model": "gpt-4o",
        "input": [{"role": "user", "content": "Hello"}]
    }'
    ```
    r   r%  r}   Nr¢   Úacompact_responsesr«   r¥   r'  )r{   r‰   rŠ   r   rŒ   rm   r�   r‘   r“   r”   r•   r–   r—   r˜   r™   rH   rÜ   r¦   s                     r:   Úcompact_responser+  ª  sÐ   è ø€ ÷J÷ ÷ ó ñ +°7Ô;×;€DÜ4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø+Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! 8ó 
÷ 
ð 	
ð <øð
ùô$ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üsP   ‚)B«A&¬B½$A* Á!A(Á"A* Á%BÁ(A* Á*	BÁ3BÂBÂBÂBÂBz"/v1/responses/{response_id}/cancelz/responses/{response_id}/cancelz)/openai/v1/responses/{response_id}/cancelc              ƒ   óŒ  K  — ddl m}m}m}m}m}m}	m}
m}m	}m
}m}m}m} ddlm} |j!                  | «      r‡|	st#        dd¬«      ‚ ||	¬«      }|j%                  | «      ƒ d{  –—† }|st#        d	d
| › d�¬«      ‚|j'                  | «      ƒ d{  –—† }|r|j%                  | «      ƒ d{  –—† }|S t#        dd¬«      ‚ ||¬«      ƒ d{  –—† }| |d<   t)        |¬«      }	 |j+                  |||d|||||
d||||||¬«      ƒ d{  –—† S 7 Œ¦7 Œ|7 Œc7 ŒE7 Œ# t,        $ r#}|j/                  ||||¬«      ƒ d{  –—†7  ‚d}~ww xY w­w)a�  
    Cancel a response by ID.
    
    Supports both:
    - Polling IDs (litellm_poll_*): Cancels background response and updates status in Redis
    - Provider response IDs: Passes through to provider API
    
    Follows the OpenAI Responses API spec: https://platform.openai.com/docs/api-reference/responses/cancel
    
    ```bash
    # Cancel polling response
    curl -X POST http://localhost:4000/v1/responses/litellm_poll_abc123/cancel     -H "Authorization: Bearer sk-1234"
    
    # Cancel provider response
    curl -X POST http://localhost:4000/v1/responses/resp_abc123/cancel     -H "Authorization: Bearer sk-1234"
    ```
    r   r  r    r  r  r  r  Nr  r  r  z!Failed to cancel polling responser}   r  r¢   Úacancel_responsesr«   r¥   )r€   r   rŒ   rm   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rÃ   r¡   r  r   r  Úcancel_pollingr   rÎ   rÇ   rÈ   )r  r{   r‰   rŠ   r   rŒ   rm   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   r¡   rª   r  r"  Úupdated_staterH   rÜ   r¦   s                            r:   Úcancel_responser0  ü  s’  è ø€ ÷P÷ ÷ õ õ Vð ×+Ñ+¨KÔ8á Ü¨CÐ8UÔVÐVá!7ÐDUÔ!Vˆð -×6Ñ6°{ÓC×CˆáÜ¨CÐ:KÈKÈ=ÐXbÐ8cÔdÐdð  /×=Ñ=¸kÓJ×Jˆáà)8×)BÑ)BÀ;Ó)O×#OˆMð !Ð ä¨CÐ8[Ô\Ð\ñ +°7Ô;×;€DØ%€DˆÑÜ4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø*Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! 8ó 
÷ 
ð 	
ð- Døð Køð $Pøð <øð
ùô$ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üsŠ   ‚A"EÁ$DÁ%+EÂDÂEÂ+DÂ,EÃDÃEÃ"$D ÄDÄD Ä
EÄEÄEÄEÄD Ä	EÄD<Ä6D9Ä7D<Ä<EÅEÚ	websocketc           	   ƒ   ó  K  — 	 t        j                  | j                  «       d¬«      ƒ d{  –—† }	 t        j                  |«      }t        |t        «      r|j!                  d«      dk7  rN| j                  t        j                  d
dddœdœ«      «      ƒ d{  –—†  | j	                  dd¬«      ƒ d{  –—†  yt#        |«      }|sN| j                  t        j                  d
dddœdœ«      «      ƒ d{  –—†  | j	                  dd¬«      ƒ d{  –—†  y||fS 7 Œë# t         j                  $ r | j	                  dd¬«      ƒ d{  –—†7   Y yt
        $ r Y yt        $ r4 t        j                  d«       | j	                  dd	¬«      ƒ d{  –—†7   Y yw xY w# t        j                  $ rR | j                  t        j                  d
dddœdœ«      «      ƒ d{  –—†7   | j	                  dd¬«      ƒ d{  –—†7   Y yw xY w7 �Œd7 �ŒL7 �Œ7 Œö­w)z¢Read the first WS frame and return (model, raw_message), or None on error.

    Sends an appropriate error frame and closes the socket before returning None.
    é   )ÚtimeoutNéð  z#Timed out waiting for first message©ÚcodeÚreasonz/Responses WebSocket error reading first messageéó  úInternal server errorrÔ   Úinvalid_request_errorz First message is not valid JSON.©r?   rÖ   ©r?   rÔ   zInvalid JSON in first messager?   zresponse.createz4First message must be a response.create JSON object.zInvalid first messagezjNo model provided. Supply ?model=<model> in the URL or include 'model' in the first response.create event.zNo model provided)rË   Úwait_forÚreceive_textÚTimeoutErrorÚcloser   rÇ   r   Ú	exceptionr�   Úloadsr‚   Ú	send_textÚdumpsr6   r7   rA   Ú"_extract_model_from_first_ws_event)r1  Úfirst_messageÚfirst_eventrc   s       r:   Ú_read_ws_model_from_first_framerI  o  s  è ø€ ð
Ü%,×%5Ñ%5°i×6LÑ6LÓ6NÐXZÔ%[×[ˆðÜ!ŸZ™Z¨Ó6ˆô  �k¤4Ô(¨K¯O©O¸FÓ,CÐGXÒ,XØ×!Ñ!Ü�J‰Jà#à 7Ø#Yññóó

÷ 
	
ð 
	
ð �o‰o 4Ð0GˆoÓH×HÐHØä5°kÓB€EÙØ×!Ñ!Ü�J‰Jà#à 7ð $Pññóó

÷ 
	
ð 
	
ð �o‰o 4Ð0CˆoÓD×DÐDØà�-ÐÐðw  \ùÜ×Ñò Ø�o‰o 4Ð0UˆoÓV×VÑVÙÜò ÙÜò Ü×&Ñ&Ð'XÔYØ�o‰o 4Ð0GˆoÓH×HÑHÙðûô ×Ñò Ø×!Ñ!Ü�J‰Jà#à 7Ø#Eññóó

÷ 
	
ñ 
	
ð �o‰o 4Ð0OˆoÓP×PÑPÙðúð 
	
ùð 	Iùð

	
ùð 	Eúsá   ‚H„(D ¬D­D ²F ÁAHÂG<ÂHÂ3G?Â4?HÃ3HÃ4HÄHÄ	HÄD Ä)FÅEÅFÅ	HÅFÅHÅ3FÆFÆ	FÆHÆFÆHÆA G9ÇGÇG9Ç0G3Ç1G9Ç6HÇ8G9Ç9HÇ?HÈHÈHrH  c                 ó²   — t        | t        «      sy| j                  d«      }t        |t        «      r|j                  d«      ndxs | j                  d«      S )zäExtract model from a response.create WS event, handling flat and nested formats.

    Flat:   {"type": "response.create", "model": "gpt-4o", ...}
    Nested: {"type": "response.create", "response": {"model": "gpt-4o", ...}}
    Nr²   rc   )r6   r7   rA   )rH  rD   s     r:   rF  rF  µ  sH   € ô �k¤4Ô(ØØ—O‘O JÓ/€FÜ#-¨f´dÔ#;ˆF�J‰J�wÔÀÒbÈ+Ï/É/ÐZaÓJbÐbr<   c              ƒ   ór  K  — ddl m}m} ddlm}m}m}m}	 d|i}
| j                  j                  d«      xs d}|€7|j                  dd«      s%|j                  d	d«      s|j                  d
d«      sy |	�|j                  dd«      sy  |||
|| ||¬«      ƒ d {  –—†   ||| |
|¬«      ƒ d {  –—†  y 7 Œ7 Œ­w)Nr   )Ú&_enforce_key_and_fallback_model_accessÚ_run_centralized_common_checks)rŒ   Úllm_model_listÚ
master_keyÚuser_custom_authrc   Úpathr†   Úenable_jwt_authFÚenable_oauth2_authÚenable_oauth2_proxy_authÚcustom_auth_run_common_checks)Úvalid_tokenr©   Úrouter{   rN  rm   )Úuser_api_key_auth_objr{   r©   rW  )
Ú$litellm.proxy.auth.user_api_key_authrL  rM  r€   rŒ   rN  rO  rP  ÚscoperA   )r{   rc   rŠ   rm   rL  rM  rŒ   rN  rO  rP  r©   rW  s               r:   Ú,_enforce_responses_ws_first_frame_model_authr[  Á  sà   è ø€ ÷÷ó ð # EÐ*€LØ—=‘=×$Ñ$ VÓ,Ò?°€EØÐØ×ÑÐ.°Ô6Ø×ÑÐ 4°eÔ<Ø×ÑÐ :¸EÔBàØÐ#Ð,<×,@Ñ,@ÐA`ÐbgÔ,hØÙ
0Ø%Ø!ØØØ%Øô÷ ð ñ )Ø/ØØ!Øô	÷ ñ ðøðús$   ‚BB7ÂB3ÂB7Â-B5Â.B7Â5B7z5The model to use for the responses WebSocket session.)r'   c              ƒ   óN  ‡K  — ddl m}m}m}m}m}m}m}	m}
m	}m
} ddlm} | j                  j                  d«      xs dj                  d«      D �cg c]#  }|j!                  «       sŒ|j!                  «       ‘Œ% }}i }|r|d   |d<    | j"                  d$i |¤Žƒ d{  –—†  d}|st%        | «      ƒ d{  –—† }|€y|\  }}|| d	œ}|�||d
<   t'        | j(                  j                  d«      xs g «      }ddd|dœ}t+        |¬«      }| j,                  |_        t1        j2                  d|i«      j5                  «       Šˆfd„}||_        t9        |¬«      }	 |�t;        ||||¬«      ƒ d{  –—†  |j=                  |||||||	||
|||d¬«      ƒ d{  –—† \  }}	 ||d<    ||d||	¬ «      ƒ d{  –—† }|ƒ d{  –—†  yc c}w 7 �Œ&7 �Œ7 Œ]7 Œ9# t>        $ rˆ}tA        jB                  d«       	 | jE                  t1        j2                  ddtG        |«      dœdœ«      «      ƒ d{  –—†7   n# t>        $ r Y nw xY w| jI                  dd¬«      ƒ d{  –—†7   Y d}~yd}~ww xY w7 Œ²7 Œª# t>        $ r4 tA        jB                  d!«       | jI                  d"d#¬«      ƒ d{  –—†7   Y yw xY w­w)%añ  
    Responses API WebSocket mode endpoint.

    Keeps a persistent WebSocket connection for response.create events,
    enabling lower-latency agentic workflows with many tool-call round trips.

    Follows the OpenAI split: the bearer token is validated at connection time
    (before accept); the model is resolved either from the ?model= query param
    or from the first response.create frame, whichever is present.

    See: https://developers.openai.com/api/docs/guides/websocket-mode/
    r   )
rŒ   rm   r�   r‘   r”   r•   r–   r—   r˜   r™   )Úroute_requestzsec-websocket-protocolrœ   ú,ÚsubprotocolN)rc   r1  rG  ÚheadersÚhttpÚPOSTr†   )r?   ÚmethodrQ  r`  )rZ  rc   c               “   ó   •K  — ‰ S ­wre   rb   )Ú_body_bytess   €r:   Úreturn_bodyz1responses_websocket_endpoint.<locals>.return_body2  s   øè ø€ ØÐùs   ƒr¢   )r{   rc   rŠ   rm   Ú_aresponses_websocket)r{   rŒ   rŠ   r™   r‘   r�   r–   r˜   r—   r•   r”   rc   r¤   z"Responses WebSocket pre-call errorrÔ   r;  r<  r=  r5  zPre-call errorr6  rŠ   )rH   r¤   rm   r–   zResponses WebSocket errorr9  r:  rb   )%r€   rŒ   rm   r�   r‘   r”   r•   r–   r—   r˜   r™   Úlitellm.proxy.route_llm_requestr]  r`  rA   ÚsplitÚstripÚacceptrI  rL   rZ  r   ÚurlÚ_urlr�   rE  ÚencodeÚbodyr   r[  rÆ   rÇ   r   rB  rD  r`   rA  )r1  rc   rŠ   rŒ   rm   r�   r‘   r”   r•   r–   r—   r˜   r™   r]  ÚpÚrequested_protocolsÚaccept_kwargsrG  ÚresultrH   Úheaders_listrZ  r{   rf  Úbase_llm_response_processorrô   r¦   Úllm_callre  s                               @r:   Úresponses_websocket_endpointrw  ì  s  øè ø€ ÷&÷ ÷ õ >ð
 &×-Ñ-×1Ñ1Ð2JÓKÒQÈr×XÑXÐY\Ó]ö"ØÐab×ahÑahÕajˆ�‰�	ð"Ðð "ð "$€MÙØ':¸1Ñ'=ˆ�mÑ$Ø
ˆ)×
Ñ
Ñ
+˜]Ñ
+×+Ð+à $€MÙÜ=¸iÓH×HˆØˆ>ØØ%Ñˆˆ}ð Øñ€Dð Ð Ø -ˆˆ_Ñô ˜yŸ™×2Ñ2°9Ó=ÒCÀÓD€LàØØØñ	$€Eô  5Ô)€GØ—=‘=€G„LäŸ™ W¨eÐ$4Ó5×<Ñ<Ó>€Kôð €G„Lô *GÈDÔ)QÐð+ØÐ$Ü>ØØØ"3Ø%ô	÷ ð ð .×NÑNØØ-Ø/ØØ/Ø%Ø!Ø-Ø!5Ø+Ø'ØØ.ð Oó 
÷ 
ñ	
ØØðHIØ$5ˆÐ Ñ!Ù -ØØ.Ø!Ø!ô	!
÷ 
ˆð �‰ùòA"ð ,ùð IùðDøð
ùô ò Ü×&Ñ&Ð'KÔLð	Ø×%Ñ%Ü—
‘
à 'à$;Ü'*¨1£vñ"ñóó
÷ 
ò 
øô ò 	Ùð	úà�o‰o 4Ð0@ˆoÓA×AÑAÜûð#úð,
øð 	ùÜò IÜ×&Ñ&Ð'BÔCØ�o‰o 4Ð0GˆoÓH×HÓHðIüs  ƒAJ%ÁF>Á(F>Á:#J%ÂGÂJ%Â4GÂ5B!J%ÅG Å+G	Å,%G ÆGÆG ÆI% Æ.I!Æ/	I% Æ8I#Æ9I% Æ=J%ÇJ%Ç	G ÇG Ç	IÇIÇ,6H)È"H%È#H)È(IÈ)	H5È2IÈ4H5È5IÉIÉIÉJ%ÉIÉJ%É!I% É#I% É%4J"ÊJÊJ"ÊJ%Ê!J"Ê"J%)[rË   r�   rØ   Úcollections.abcr   r   Útypesr   Útypingr   r   r   r	   r
   r   Úuuidr   Úfastapir   r   r   r   r   Ústarlette.websocketsr   r   Úlitellm._loggingr   Ú%litellm.integrations.custom_guardrailr   Ú1litellm.llms.base_llm.guardrail_translation.utilsr   rÙ   Úlitellm.proxy._typesrY  r   r   r   Ú'litellm.proxy.common_request_processingr   Ú-litellm.proxy.common_utils.http_parsing_utilsr   r   r  r   r   Úlitellm.types.responses.mainr    Úlitellm.routerr!   r"   ra   r#   r%   r-   r`   Útupler.   r¾   rq   r;   rG   r7   rQ   rU   rV   rW   Ú	frozensetrX   rZ   rl   rt   rz   r…   Úposträ   rA   rç   r  r  Údeleter#  r(  r+  r0  rI  rF  r[  r1  ÚQueryrw  rb   r<   r:   ú<module>r‹     s$  ðÜ Û Û ß 2Ý "ß H× HÝ ã ß HÕ Hß ?å 1Ý Iõô #÷ñ õ
 R÷÷ MÝ =áÝ%á“€ˆÓ á 'Ð(9Ó :Ð ˜Ó :Ø%˜€�Ó &á;Kà3ØCñó<Ð �E˜' # u¨S°#¨X¡Ð"6Ñ7Ñ8ó ñ 1AÀÓ0DÐ �U˜7 3¨ 8Ñ,Ñ-Ó Dð	 Sð 	°ð 	ÀTð 	Èfó 	ðb ð b°Dð b¸Vó bð&QØ
ðQØ ðQà	óQð&6 G¨C°¨HÑ$5ð 6¸$ó 6ð %1Ð ˜EÓ 0Ø$Ð �UÓ $Ù1:¹8ÐDTÓ;UÓ1VÐ ˜˜y¨™~Ñ.Ó Vô!˜*ô !ð
/ sð /Ð/Bó /ð>˜Sð >¨oð >À$ó >ðKØ
ðKØ+ðKà	óKð0	M¸Wð 	MÈó 	Mð ‡�ØÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�ØÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�ØÙÐ+Ó,Ð-Ø
ˆð ó ñ )0Ð0AÓ(Bñu
Øðu
àðu
ð &òu
óóóðu
ðp ‡�ØØ(Ð*Ø	ð ó ð
 ‡�ØØ(Ð*Ø	ð ó ð )?ñAØ%òAóóðAð" ‡�ØáÐ9Ó:ÙÐ!Ó"ðð ˆð ó ñ )0Ð0AÓ(Bñt
Øðt
àðt
ð &òt
óðt
ðn ‡�Ø!ÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�ØÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�Ø(ÙÐ+Ó,Ð-Ø
ˆð ó ñ )0Ð0AÓ(Bñ	_
Øð_
àð_
ð ð_
ð &ò	_
óóóð_
ðD ‡�Ø!ÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�ØÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�Ø(ÙÐ+Ó,Ð-Ø
ˆð ó ñ )0Ð0AÓ(Bñ	X
ØðX
àðX
ð ðX
ð &ò	X
óóóðX
ðv ‡�Ø-ÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�Ø*ÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�Ø4ÙÐ+Ó,Ð-Ø
ˆð ó ñ )0Ð0AÓ(Bñ	2
Øð2
àð2
ð ð2
ð &ò	2
óóóð2
ðj ‡�ØÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�ØÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�Ø"ÙÐ+Ó,Ð-Ø
ˆð ó ñ )0Ð0AÓ(Bñ@
Øð@
àð@
ð &ò@
óóóð@
ðF ‡�Ø(ÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�Ø%ÙÐ+Ó,Ð-Ø
ˆð ó ð
 ‡�Ø/ÙÐ+Ó,Ð-Ø
ˆð ó ñ )0Ð0AÓ(Bñ	a
Øða
àða
ð ða
ð &ò	a
óóóða
ðHC ØðC à
ˆT�\óC ðL	c°Cð 	c¸CÀ$¹Jó 	cð(Øð(àð(ð &ð(ð �d‘
ð	(ð
 
ó(ðV ×Ñ�/Ó"Ø×Ñ�,Óð &˜Ÿ™ dÐ8oÔpÙÐ9Ó:ñDIØðDIà�‰:òDIó  ó #ñDIr<   