Ë
    uPêj'A  ã                   óP  — d Z ddlZddlmZ ddlmZmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZ defd„Zdee   fd„Zdefd„Z	 	 d dee   dede de fd„Z!de
dedededef
d„Z"de
dedededef
d„Z#de
dedededeeef   f
d„Z$deddfd„Z%y)!zÂ
Factory for generating container proxy endpoints from JSON config.

This module reads the endpoints.json config and dynamically creates
FastAPI route handlers for ALL container file endpoints.
é    N)ÚPath)ÚAnyÚFinal)Ú	APIRouterÚDependsÚRequestÚResponse)ÚORJSONResponse)ÚUserAPIKeyAuth)Úuser_api_key_auth)ÚProxyBaseLLMRequestProcessing)Ú,get_custom_llm_provider_from_request_headersÚ*get_custom_llm_provider_from_request_query)Ú assert_user_can_access_containerÚget_container_forwarding_paramsÚreturnc                  óÔ   — t        t        «      j                  j                  j                  dz  dz  } t        | «      5 }t	        j
                  |«      cddd«       S # 1 sw Y   yxY w)z0Load the endpoints configuration from JSON file.Ú
containerszendpoints.jsonN)r   Ú__file__ÚparentÚopenÚjsonÚload)Úconfig_pathÚfs     úv/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/container_endpoints/handler_factory.pyÚ_load_endpoints_configr      sR   € äœh›×.Ñ.×5Ñ5×<Ñ<¸|ÑKÐN^Ñ^€KÜ	ˆkÓ	ð ˜aÜ�y‰y˜‹|÷÷ ò ús   ¿AÁA'c                  óL   — t        «       } | d   D �cg c]  }|d   ‘Œ	 c}S c c}w )zBGet all async route types for registration in route_llm_request.pyÚ	endpointsÚ
async_name)r   )ÚconfigÚendpoints     r   Úget_all_route_typesr#   #   s(   € ä*Ó,€FØ39¸+Ñ3FÖG xˆH�\Ó"ÒGÐGùÒGs   ’!Úcustom_llm_providerc                 ód   — | dk(  rddl m}  |«       S | dv rddlm}  |«       S t	        d| › �«      ‚)z9Get the container provider config for the given provider.Úopenair   )ÚOpenAIContainerConfig)ÚazureÚ
azure_text)ÚAzureContainerConfigz*Container API not supported for provider: )Ú-litellm.llms.openai.containers.transformationr'   Ú,litellm.llms.azure.containers.transformationr*   Ú
ValueError)r$   r'   r*   s      r   Ú_get_container_provider_configr.   )   s@   € à˜hÒ&ÝWá$Ó&Ð&Ø	Ð 7Ñ	7ÝUá#Ó%Ð%Ü
ÐAÐBUÐAVÐWÓ
XÐXó    Úpath_paramsÚ
route_typeÚreturns_binaryÚis_multipartc                 ó  ‡— |r:| ddgk(  r3t        t        «      fdt        dt        dt        dt        dt
        f
d„}|S |r/t        t        «      fdt        dt        dt        dt
        fˆfd„}|S | dgk(  r/t        t        «      fdt        dt        dt        dt
        fˆfd„}|S | ddgk(  r5t        t        «      fdt        dt        dt        dt        dt
        f
ˆfd	„}|S t        t        «      fdt        dt        dt
        fˆfd
„}|S )zQ
    Dynamically create a handler with the correct path parameter signature.
    Úcontainer_idÚfile_idÚrequestÚfastapi_responseÚuser_api_key_dictc              “   ó>   K  — t        | ||||¬«      ƒ d {  –—† S 7 Œ­w)N)r7   r8   r5   r6   r9   )Ú_process_binary_request)r7   r5   r6   r8   r9   s        r   Úhandler_binary_contentz?_create_handler_for_path_params.<locals>.handler_binary_contentB   s.   è ø€ ô 1ØØ!1Ø)ØØ"3ô÷ ð ð ús   ‚–—c              “   ó@   •K  — t        | ||‰|¬«      ƒ d {  –—† S 7 Œ­w)N)r7   r8   r9   r1   r5   )Ú!_process_multipart_upload_request©r7   r5   r8   r9   r1   s       €r   Úhandler_multipart_uploadzA_create_handler_for_path_params.<locals>.handler_multipart_uploadV   s/   øè ø€ ô ;ØØ!1Ø"3Ø%Ø)ô÷ ð ð úó   ƒ—˜c              “   óD   •K  — t        | ||‰d|i¬«      ƒ d {  –—† S 7 Œ­w)Nr5   ©r7   r8   r9   r1   r0   ©Ú_process_requestr?   s       €r   Úhandler_container_idz=_create_handler_for_path_params.<locals>.handler_container_idi   s4   øè ø€ ô *ØØ!1Ø"3Ø%Ø+¨\Ð:ô÷ ð ð ús   ƒ ™š c           	   “   óF   •K  — t        | ||‰||dœ¬«      ƒ d {  –—† S 7 Œ­w)N)r5   r6   rC   rD   )r7   r5   r6   r8   r9   r1   s        €r   Úhandler_container_filez?_create_handler_for_path_params.<locals>.handler_container_file{   s4   øè ø€ ô *ØØ!1Ø"3Ø%Ø-9ÀgÑNô÷ ð ð ús   ƒ!š›!c              “   ó@   •K  — t        | ||‰i ¬«      ƒ d {  –—† S 7 Œ­w)NrC   rD   )r7   r8   r9   r1   s      €r   Úhandler_no_paramsz:_create_handler_for_path_params.<locals>.handler_no_paramsŽ   s/   øè ø€ ô
 *ØØ!1Ø"3Ø%Øô÷ ð ð úrA   )r   r   r   Ústrr	   r   )	r0   r1   r2   r3   r<   r@   rF   rH   rJ   s	    `       r   Ú_create_handler_for_path_paramsrL   6   si  ø€ ñ ˜+¨.¸)Ð)DÒDô 18Ô8IÓ0Jñ	Üð	äð	ô ð	ô 'ð		ô
  .ó	ð &Ð%ñ ô 18Ô8IÓ0Jñ		Üð	äð	ô 'ð	ô  .õ		ð (Ð'ð �~Ð&Ò&ô 18Ô8IÓ0Jñ		Üð	äð	ô 'ð	ô  .õ		ð $Ð#à	˜¨Ð3Ò	3ô 18Ô8IÓ0Jñ	Üð	äð	ô ð	ô 'ð		ô
  .õ	ð &Ð%ô 18Ô8IÓ0Jñ	Üð	ä&ð	ô  .õ	ð !Ð r/   r7   r8   r5   r6   r9   c              ƒ   ó
  K  — ddl m}m}m}m}m}	m}
m}m}m	}m
}m} t        | ¬«      xs t        | ¬«      xs d}t        |||¬«      ƒ d{  –—† \  }}d|it        |||¬«      ƒ d{  –—† ¥}t!        |¬	«      }	 |j#                  | ||d
|||||	d|||||
|¬«      ƒ d{  –—† }d}|j%                  «       }d|v s|j'                  d«      rd}n-d|v sd|v rd}n"d|v rd}nd|v rd}nd|v rd}nd|v rd}nd|v rd}t)        |t*        «      s!t-        dt/        |«      j0                  › �«      ‚t3        |t5        |j6                  «      |¬«      S 7 �Œ7 Œç7 Œ²# t8        $ r#}|j;                  ||||¬«      ƒ d{  –—†7  ‚d}~ww xY w­w) a  
    Process binary content requests through the standard proxy/router pipeline.

    Validate ownership before forwarding the provider-native container id through
    the standard proxy/router pipeline. This handler only adapts the byte
    response to FastAPI.
    r   ©Úgeneral_settingsÚ
llm_routerÚproxy_configÚproxy_logging_objÚselect_data_generatorÚuser_api_baseÚuser_max_tokensÚ
user_modelÚuser_request_timeoutÚuser_temperatureÚversion©r7   r&   ©r5   r9   r$   Nr6   ©r5   Úoriginal_container_idr$   ©ÚdataÚ aretrieve_container_file_content©r7   r8   r9   r1   rR   rP   rO   rQ   rS   ÚmodelrV   rX   rW   rU   rT   rY   zapplication/octet-streamz.pngÚpngz	image/pngz.jpgz.jpegz
image/jpegz.gifz	image/gifz.csvztext/csvz.jsonzapplication/jsonz.txtz
text/plainz.pdfzapplication/pdfz5aretrieve_container_file_content expected bytes, got )ÚcontentÚheadersÚ
media_type©Úer9   rR   rY   )Úlitellm.proxy.proxy_serverrO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r   r   r   r   r   Úbase_process_llm_requestÚlowerÚendswithÚ
isinstanceÚbytesÚ	TypeErrorÚtypeÚ__name__r	   Údictre   Ú	ExceptionÚ_handle_llm_api_exception)r7   r8   r5   r6   r9   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r$   r]   Úresolved_providerr_   Ú	processorrd   Úcontent_typeÚfile_id_lowerrh   s                            r   r;   r;   ž   s  è ø€ ÷÷ ÷ ñ ô 	5¸WÔEò 	Ü5¸gÔFò	àð ô 6VØ!Ø+Ø/ô6÷ 0Ñ,ÐÐ,ð 	�7ð	#ô 2Ø)Ø&;Ø$5ô÷ ð	#€Dô 5¸$Ô?€Ið5
Ø(×AÑAØØ-Ø/Ø9Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð!  Bó  
÷ 
ˆð( 2ˆØ&Ÿ}™}›ˆØ�]Ñ" m×&<Ñ&<¸UÔ&CØ&‰LØ�}Ñ$¨°=Ñ(@Ø'‰LØ�}Ñ$Ø&‰LØ�}Ñ$Ø%‰LØ˜Ñ%Ø-‰LØ�}Ñ$Ø'‰LØ�}Ñ$Ø,ˆLä˜'¤5Ô)ÜÐSÔTXÐY`ÓTa×TjÑTjÐSkÐlÓmÐmäØÜÐ)×1Ñ1Ó2Ø#ô
ð 	
ðu0ùðøð
ùô\ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üsg   ‚A
FÁEÁFÁ(EÁ)FÁ;$E ÂEÂ B,E ÅFÅFÅE Å	F ÅE;Å5E8Å6E;Å;F Æ Fc              ƒ   ó¢  K  — ddl m}m} ddlm}m}m}	m}
m}m	}m
}m}m}m}m}  || «      ƒ d{  –—† } ||«      ƒ d{  –—† }d|vrddlm}  |dd¬	«      ‚|d   }t#        |t$        «      rt'        |«      dkD  r|d   |d<   t)        | ¬
«      xs t+        | ¬
«      xs d}t-        |||¬«      ƒ d{  –—† \  }}|j/                  t1        |||¬«      ƒ d{  –—† «       t3        |¬«      }	 |j5                  | ||||
|||	|d||||||¬«      ƒ d{  –—† S 7 Œå7 Œ×7 Œf7 ŒD7 Œ# t6        $ r#}|j9                  |||
|¬«      ƒ d{  –—†7  ‚d}~ww xY w­w)z'Process multipart file upload requests.r   )Ú!convert_upload_files_to_file_dataÚget_form_datarN   NÚfile)ÚHTTPExceptioni�  zMissing required 'file' field)Ústatus_codeÚdetailrZ   r&   r[   r\   r^   ra   rg   )Ú-litellm.proxy.common_utils.http_parsing_utilsrz   r{   ri   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   Úfastapir}   rm   ÚlistÚlenr   r   r   Úupdater   r   rj   rs   rt   )r7   r8   r9   r1   r5   rz   r{   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   Ú	form_datar_   r}   Ú	file_listr$   r]   ru   rv   rh   s                              r   r>   r>   	  s¤  è ø€ ÷÷÷ ÷ ñ ñ +¨7Ó3×3€IÙ9¸)ÓD×D€Dà�TÑÝ)á¨Ð4SÔTÐTð ˜F‘|€IÜ�)œTÔ"¤s¨9£~¸Ò'9Ø  ‘|ˆˆV‰ô 	5¸WÔEò 	Ü5¸gÔFò	àð ô 6VØ!Ø+Ø/ô6÷ 0Ñ,ÐÐ,ð 	‡K�KÜ-Ø%Ø"7Ø 1ô
÷ 	
ôô 5¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø!Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! 8ó 
÷ 
ð 	
ðG 4øØDøð$0øð	
øð
ùô$ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üsˆ   ‚.E°D±EÁ DÁA2EÂ3DÂ4#EÃDÃEÃ-$D  ÄDÄD  ÄEÄEÄEÄEÄD  Ä 	EÄ)EÅEÅEÅEÅEc              ƒ   ó"  K  — ddl m}m}m}m}m}	m}
m}m}m	}m
}m} t        | j                  «      }d|i|¥}t        | ¬«      xs t        | ¬«      xs d}d|v rEt!        |d   ||¬«      ƒ d{  –—† \  }}|j#                  t%        |d   ||¬	«      ƒ d{  –—† «       n||d
<   t'        |¬«      }	 |j)                  | ||||||||	d|||||
|¬«      ƒ d{  –—† S 7 Œk7 ŒF7 Œ# t*        $ r#}|j-                  ||||¬«      ƒ d{  –—†7  ‚d}~ww xY w­w)z Common request processing logic.r   rN   Úquery_paramsrZ   r&   r5   r[   Nr\   r$   r^   ra   rg   )ri   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rr   rˆ   r   r   r   r„   r   r   rj   rs   rt   )r7   r8   r9   r1   r0   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rˆ   r_   r$   r]   ru   rv   rh   s                          r   rE   rE   b  sx  è ø€ ÷÷ ÷ ñ ô ˜w×3Ñ3Ó4€Là˜ð#à
ð#€Dô 	5¸WÔEò 	Ü5¸gÔFò	àð ð ˜Ñ$ô 3Ø$ ^Ñ4Ø/Ø 3ô
÷ 
ñ	
Ø!Øð 	�‰Ü1Ø(¨Ñ8Ø&;Ø$5ô÷ õ	
ð ':ˆÐ"Ñ#ä4¸$Ô?€Ið
Ø×7Ñ7ØØ-Ø/Ø!Ø/Ø!Ø-Ø%Ø"7ØØ!Ø-Ø!5Ø+Ø'Øð! 8ó 
÷ 
ð 	
ð#
øðøð
ùô$ ò 
Ø×7Ñ7ØØ/Ø/Øð	 8ó 
÷ 
ð 
ð 	
ûð
üsf   ‚A,DÁ.CÁ/&DÂCÂDÂ1$C  ÃCÃC  ÃDÃDÃC  Ã 	DÃ)DÄDÄDÄDÄDÚrouterc                 ó0  — t        «       }|d   D �]  }|d   }|d   j                  «       }|j                  dg «      }|d   }|j                  dd«      }|j                  dd«      }t        ||||«      }	t	        | |«      }
|rD  |
d	|› �t        t        «      gd
g¬«      |	«         |
|t        t        «      gd
g¬«      |	«       Œ·  |
d	|› �t        t        «      gt        d
g¬«      |	«         |
|t        t        «      gt        d
g¬«      |	«       �Œ y)zÖ
    Register ALL container file endpoints from JSON config to the router.

    This single function registers all endpoints defined in endpoints.json,
    eliminating the need for manual endpoint definitions.
    r   ÚpathÚmethodr0   r    r2   Fr3   z/v1r   )ÚdependenciesÚtags)r�   Úresponse_classrŽ   N)r   rk   ÚgetrL   Úgetattrr   r   r
   )r‰   r!   Úendpoint_configr‹   rŒ   r0   r1   r2   r3   ÚhandlerÚroute_methods              r   Ú!register_container_file_endpointsr•   µ  s_  € ô +Ó,€Fà! +Ñ.ó *ˆØ˜vÑ&ˆØ  Ñ*×0Ñ0Ó2ˆØ%×)Ñ)¨-¸Ó<ˆØ$ \Ñ2ˆ
Ø(×,Ñ,Ð-=¸uÓEˆØ&×*Ñ*¨>¸5ÓAˆô 2°+¸zÈ>Ð[gÓhˆô ˜v vÓ.ˆñ ð‰LØ�d�V�Ü%Ô&7Ó8Ð9Ø"�^ôð ô	ð‰LØÜ%Ô&7Ó8Ð9Ø"�^ôð õ	ð‰LØ�d�V�Ü%Ô&7Ó8Ð9Ü-Ø"�^ô	ð
 ôð‰LØÜ%Ô&7Ó8Ð9Ü-Ø"�^ô	ð
 öñK*r/   )FF)&Ú__doc__r   Úpathlibr   Útypingr   r   r�   r   r   r   r	   Úfastapi.responsesr
   Úlitellm.proxy._typesr   Ú$litellm.proxy.auth.user_api_key_authr   Ú'litellm.proxy.common_request_processingr   Ú0litellm.proxy.common_utils.openai_endpoint_utilsr   r   Ú+litellm.proxy.container_endpoints.ownershipr   r   rr   r   r‚   rK   r#   r.   ÚboolrL   r;   r>   rE   r•   © r/   r   ú<module>r¡      sa  ðñó Ý ß ç 9Ó 9Ý ,å /Ý BÝ Q÷÷ð ó ðH˜T #™Yó Hð
Y¸ó 
Yð  !Øñ	e!Ø�c‘ðe!àðe!ð ðe!ð ó	e!ðPh
Øðh
àðh
ð ðh
ð ð	h
ð
 &óh
ðVV
ØðV
àðV
ð &ðV
ð ð	V
ð
 óV
ðrP
ØðP
àðP
ð &ðP
ð ð	P
ð
 �c˜3�h‘óP
ðf3¨ið 3¸Dô 3r/   