Ë
    uPêj¤A  ã            
       óð  — U d Z ddlZddlZddlmZmZ ddlZddlmZ ddl	m
Z
mZmZmZ ddlmZmZmZmZmZmZmZmZmZ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
dddœZ#ee$e%ef      e&d<   de%de%e'z  defd„Z(de%de'defd„Z)de%de%de%defd„Z*de'e   de'e   fd„Z+de'e$   dede'e   fd„Z,de%dz  de%dz  fd„Z-de.de%d e%de%fd!„Z/de'e   de'e   fd"„Z0d#e$d$e%d%ed&ejb                  def
d'„Z2d(e$de fd)„Z3y)*u  
OCI Generative AI â€” Generic-format chat transformation helpers.

Handles message building, tool definition adaptation, non-streaming response
parsing, and streaming chunk parsing for models served with
``apiFormat="GENERIC"`` (e.g. Meta Llama, xAI Grok, Google Gemini).
é    N)ÚAnyÚFinal)ÚValidationError)ÚOCIErrorÚresolve_oci_schema_anyofÚresolve_oci_schema_refsÚsanitize_oci_schema)ÚOCICompletionResponseÚOCIContentPartUnionÚOCIImageContentPartÚOCIImageUrlÚ
OCIMessageÚOCIRolesÚOCIStreamChunkÚOCITextContentPartÚOCIToolCallÚOCIToolDefinitionÚ
OCIVendors)ÚAllMessageValues)ÚChatCompletionMessageToolCallÚDeltaÚModelResponseÚModelResponseStreamÚStreamingChoicesÚUsageÚSYSTEMÚUSERÚ	ASSISTANTÚTOOL)ÚsystemÚuserÚ	assistantÚtoolÚopen_ai_to_generic_oci_role_mapÚroleÚcontentÚreturnc                 óø  — g }t        |t        «      r!t        t        |    t	        |¬«      gdd¬«      S |D �],  }t        |t
        «      st        dd¬«      ‚|j                  d«      }t        |t        «      st        dd¬«      ‚|d	vrt        dd
|› d�¬«      ‚|dk(  rJ|j                  d«      }t        |t        «      st        dd¬«      ‚|j                  t	        |¬«      «       Œ³|dk(  sŒ¹|j                  d«      }t        |t
        «      r|j                  d«      }t        |t        «      st        dd¬«      ‚|j                  t        t        |¬«      ¬«      «       �Œ/ t        t        |    |dd¬«      S )z@Convert a plain-text or multipart content message to OCI format.©ÚtextN©r%   r&   Ú	toolCallsÚ
toolCallIdé�  z&Each content item must be a dictionary©Ústatus_codeÚmessageÚtypez1Each content item must have a string `type` field)r*   Ú	image_urlzContent type `z` is not supported by OCIr*   z;Content item of type `text` must have a string `text` fieldr3   ÚurlzDProp `image_url` must be a string or an object with a `url` property)r4   )ÚimageUrl)Ú
isinstanceÚstrr   r$   r   Údictr   ÚgetÚappendr   r   )r%   r&   Únew_contentÚcontent_itemÚ	item_typer*   r3   s          úb/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/oci/chat/generic.pyÚ6adapt_messages_to_generic_oci_standard_content_messager?   ;   sŽ  € à46€KÜ�'œ3ÔÜÜ0°Ñ6Ü'¨WÔ5Ð6ØØô	
ð 	
ð  ó "YˆÜ˜,¬Ô-Ü sÐ4\Ô]Ð]à ×$Ñ$ VÓ,ˆ	Ü˜)¤SÔ)ÜØØKôð ð Ð1Ñ1ÜØØ(¨¨Ð3LÐMôð ð
 ˜ÒØ×#Ñ# FÓ+ˆDÜ˜d¤CÔ(ÜØ #ØYôð ð ×ÑÔ1°tÔ<Õ=à˜+Ó%Ø$×(Ñ(¨Ó5ˆIÜ˜)¤TÔ*Ø%ŸM™M¨%Ó0�	Ü˜i¬Ô-ÜØ #Øbôð ð ×ÑÔ2¼KÈIÔ<VÔWÖXðE"YôH Ü,¨TÑ2ØØØô	ð ó    Ú
tool_callsc           	      ót  — g }|D �]  }t        |t        «      st        dd¬«      ‚|j                  d«      dk7  rt        dd¬«      ‚|j                  d«      }t        |t        «      st        dd¬«      ‚|j                  d«      }t        |t        «      st        dd	¬«      ‚|j                  d
«      }t        |t        «      st        dd¬«      ‚|d   j                  dd«      }t        |t        «      st        dd¬«      ‚|j                  t        |d||¬«      «       �Œ t        t        |    d|d¬«      S )z5Convert an assistant tool-call message to OCI format.r.   z#Each tool call must be a dictionaryr/   r2   Úfunctionz%OCI only supports function tool callsÚidzTool call `id` must be a stringz)Tool call `function` must be a dictionaryÚnamez*Tool call `function.name` must be a stringÚ	argumentsz{}z4Tool call `function.arguments` must be a JSON stringÚFUNCTION)rD   r2   rE   rF   Nr+   )	r6   r8   r   r9   r7   r:   r   r   r$   )r%   rA   Útool_calls_formattedÚ	tool_callÚtool_call_idÚtool_functionÚfunction_namerF   s           r>   Ú0adapt_messages_to_generic_oci_standard_tool_callrM   r   s;  € à"$ÐØó  
ˆ	Ü˜)¤TÔ*Ü sÐ4YÔZÐZØ�=‰=˜Ó  JÒ.Ü sÐ4[Ô\Ð\à —}‘} TÓ*ˆÜ˜,¬Ô,Ü sÐ4UÔVÐVà!Ÿ™ jÓ1ˆÜ˜-¬Ô.Ü sÐ4_Ô`Ð`à%×)Ñ)¨&Ó1ˆÜ˜-¬Ô-Ü sÐ4`ÔaÐaà˜jÑ)×-Ñ-¨k¸4Ó@ˆ	Ü˜)¤SÔ)ÜØØNôð ð
 	×#Ñ#ÜØØØ"Ø#ô	ö	
ð3 
ôD Ü,¨TÑ2ØØ&Øô	ð r@   rJ   c                 óD   — t        t        |    t        |¬«      gd|¬«      S )z,Convert a tool-result message to OCI format.r)   Nr+   )r   r$   r   )r%   rJ   r&   s      r>   Ú4adapt_messages_to_generic_oci_standard_tool_responserO   Ÿ   s(   € äÜ,¨TÑ2Ü#¨Ô1Ð2ØØô	ð r@   Úmessagesc                 óN  — g }| D �]  }|d   }|j                  d«      }|j                  d«      }|j                  d«      }|dk(  r;|�9t        |t        «      st        dd¬«      ‚|j	                  t        ||«      «       Œ||d	v rA|�?t        |t        t        f«      st        dd
¬«      ‚|j	                  t        ||«      «       ŒÁ|dk(  sŒÇt        |t        «      st        dd¬«      ‚t        |t        «      st        dd¬«      ‚|j	                  t        |||«      «       �Œ |S )z=Convert an OpenAI-format message array to OCI GENERIC format.r%   r&   rA   rJ   r"   r.   z#Message `tool_calls` must be a listr/   )r    r!   r"   z;Message `content` must be a string or list of content partsr#   z5Tool result message must have a string `tool_call_id`z.Tool result message `content` must be a string)	r9   r6   Úlistr   r:   rM   r7   r?   rO   )rP   Únew_messagesr1   r%   r&   rA   rJ   s          r>   Ú&adapt_messages_to_generic_oci_standardrT   ©   s<  € ð €LØó sˆØ�v‰ˆØ—+‘+˜iÓ(ˆØ—[‘[ Ó.ˆ
Ø—{‘{ >Ó2ˆà�;Ò :Ð#9Ü˜j¬$Ô/Ü¨3Ð8]Ô^Ð^Ø×ÑÔ PÐQUÐWaÓ bÕcàÐ4Ñ4¸Ð9LÜ˜g¬¬T {Ô3ÜØ #ØYôð ð ×ÑÔ VÐW[Ð]dÓ eÕfà�V‹^Ü˜l¬CÔ0ÜØ #ØSôð ô ˜g¤sÔ+ÜØ #ØLôð ð ×ÑÔ TÐUYÐ[gÐipÓ qÖrð=sð@ Ðr@   ÚtoolsÚvendorc                 óv  — g }| D ]±  }|d   dk7  rt        dd¬«      ‚|j                  d«      }t        |t        «      st        dd¬«      ‚|j                  di «      }t	        t        t        |«      «      «      }|j                  t        d|j                  d	«      |j                  d
d«      |¬«      «       Œ³ |S )z�Convert OpenAI-format tool definitions to OCI GENERIC format.

    Resolves ``$ref``/``$defs`` and ``anyOf`` that the OCI endpoint rejects.
    r2   rC   r.   z OCI only supports function toolsr/   z$Tool `function` must be a dictionaryÚ
parametersrG   rE   ÚdescriptionÚ )r2   rE   rY   rX   )	r   r9   r6   r8   r	   r   r   r:   r   )rU   rV   Ú	new_toolsr#   rK   Ú
raw_paramsÚresolved_paramss          r>   Ú%adapt_tool_definition_to_oci_standardr^   Ö   sÃ   € ð
 €IØò 
ˆØ�‰<˜:Ò%Ü sÐ4VÔWÐWàŸ™ Ó,ˆÜ˜-¬Ô.Ü sÐ4ZÔ[Ð[à"×&Ñ& |°RÓ8ˆ
Ü-Ô.FÔG^Ð_iÓGjÓ.kÓlˆà×ÑÜØØ"×&Ñ& vÓ.Ø)×-Ñ-¨m¸RÓ@Ø*ô	õ	
ð
ð( Ðr@   Úrawc                 ó,   — | €y| dk(  ry| dk(  ry| dv ryy)u  Map an OCI-specific finish reason to its OpenAI-standard equivalent.

    OCI emits ``COMPLETE`` / ``MAX_TOKENS`` / ``TOOL_CALL(S)`` plus a long tail
    of error/cancel reasons (``ERROR``, ``ERROR_TOXIC``, ``ERROR_LIMIT``,
    ``USER_CANCEL``, ``CONTENT_FILTERED``, ``CANCELLED``, ...). The OpenAI
    spec only defines ``stop`` / ``length`` / ``tool_calls`` / ... â€” anything
    else is collapsed to ``"stop"`` so downstream consumers switching on
    ``finish_reason`` keep working. A ``None`` input passes through unchanged.
    NÚCOMPLETEÚstopÚ
MAX_TOKENSÚlength)Ú	TOOL_CALLÚ
TOOL_CALLSrA   © )r_   s    r>   Ú_normalize_oci_finish_reasonrh   ó   s1   € ð €{ØØ
ˆjÒØØ
ˆlÒØØ
Ð)Ñ)ØØr@   ÚpositionrE   rF   c                 óˆ   — t        j                  | › d|› d|› �j                  «       d¬«      j                  «       dd }d|› �S )uK  Deterministic synthetic tool-call id derived from chunk content.

    Used as a fallback when OCI omits ``id`` (always the case for the OCI
    Cohere protocol, occasionally the case for OCI GENERIC streaming chunks).
    A random ``uuid4`` per chunk would cause downstream stream-merging
    consumers â€” which key off the tool-call ``id`` â€” to treat re-emissions of
    the same logical call (e.g. terminal consolidation chunks, retries) as
    distinct calls. A content-derived digest stays stable across identical
    re-emissions while differing across truly distinct calls.
    ú|F)ÚusedforsecurityNé   Úcall_)ÚhashlibÚsha256ÚencodeÚ	hexdigest)ri   rE   rF   Údigests       r>   Ú_synthesize_oci_tool_call_idrt     sS   € ô —N‘NØˆ*�A�d�V˜1˜Y˜KÐ(×/Ñ/Ó1Øô÷ �iƒk�#�2ð€Fð �6�(ÐÐr@   c                 óê   — t        | «      D ��cg c]W  \  }}t        |j                  xs! t        ||j                  |j
                  «      d|j                  |j
                  dœ¬«      ‘ŒY c}}S c c}}w )zAConvert OCI tool-call objects in a response to the OpenAI format.rC   ©rE   rF   ©rD   r2   rC   )Ú	enumerater   rD   rt   rE   rF   )rU   Úir#   s      r>   Úadapt_tools_to_openai_standardrz     se   € ô ! Ó'÷ñ ˆAˆtô 	&Ø�w‰wÒTÔ6°q¸$¿)¹)ÀTÇ^Á^ÓTØØ"Ÿi™i°d·n±nÑEö	
óð ùó s   �AA/Ú	json_dataÚmodelÚmodel_responseÚraw_responsec                 ó€  — 	 t        d
i | ¤Ž}|j
                  j                  }t        j                  j                  |j                  dd«      «      }t        |j                  «       «      |_        |j                  |_        |j
                  j                  st        d|j                  ¬«      ‚|j
                  j                  d   }|j                  d   j                   }	|j                   }
|
�r|
j"                  r@d}|
j"                  D ]&  }t%        |t&        «      sŒ|xs d|j(                  z   }Œ( |�||	_        |
j*                  rt-        |
j*                  «      |	_        t1        |j2                  «      |j                  d   _        |j
                  j6                  }d}|j8                  r,|j8                  j:                  �|j8                  j:                  }t=        |j>                  |j@                  xs d|jB                  |¬	«      |_        |S # t        t        f$ r}t        d|› �|j                  ¬«      ‚d}~ww xY w)zHParse a non-streaming GENERIC OCI response into a LiteLLM ModelResponse.z4Response cannot be casted to OCICompletionResponse: )r1   r0   NÚZz+00:00z!OCI response contained no choicesr   rZ   )Úprompt_tokensÚcompletion_tokensÚtotal_tokensÚreasoning_tokensrg   )"r
   Ú	TypeErrorr   r   r0   ÚchatResponseÚtimeCreatedÚdatetimeÚfromisoformatÚreplaceÚintÚ	timestampÚcreatedÚmodelIdr|   Úchoicesr1   r&   r6   r   r*   r,   rz   rA   rh   ÚfinishReasonÚfinish_reasonÚusageÚcompletionTokensDetailsÚreasoningTokensr   ÚpromptTokensÚcompletionTokensÚtotalTokens)r{   r|   r}   r~   Úcompletion_responseÚeÚiso_strÚdtÚresponse_choicer1   Úresponse_messager*   ÚitemÚ	oci_usager„   s                  r>   Úhandle_generic_responser    -  s  € ð
Ü%:Ñ%G¸YÑ%GÐð )×5Ñ5×AÑA€GÜ×!Ñ!×/Ñ/°·±ÀÀXÓ0NÓO€BÜ  §¡£Ó0€NÔØ.×6Ñ6€NÔà×+Ñ+×3Ò3ÜØ7Ø$×0Ñ0ô
ð 	
ð
 1×=Ñ=×EÑEÀaÑH€OØ#×+Ñ+¨AÑ.×6Ñ6€GØ-×5Ñ5ÐØÐ#Ø×#Ò#ð  $ˆDØ(×0Ñ0ò 4�Ü˜dÔ$6Õ7Ø šJ B¨$¯)©)Ñ3‘Dð4ð ÐØ"&�”Ø×%Ò%Ü!?Ð@P×@ZÑ@ZÓ![ˆGÔä.JÈ?×KgÑKgÓ.h€N×Ñ˜1ÑÔ+à*×7Ñ7×=Ñ=€IØ#'ÐØ×(Ò(¨Y×-NÑ-N×-^Ñ-^Ð-jØ$×<Ñ<×LÑLÐÜ Ø×,Ñ,Ø#×4Ñ4Ò9¸Ø×*Ñ*Ø)ô	€NÔð Ðøô_ ”Ð'ò 
ÜØJÈ1È#ÐNØ$×0Ñ0ô
ð 	
ûð
ús   ‚H ÈH=ÈH8È8H=Ú
dict_chunkc                 ób  — | j                  d«      rW| d   j                  d«      rC| d   d   D ]8  }|j                  dd«       |j                  dd«       |j                  dd«       Œ: 	 t        di | ¤Ž}|j                  €d|_        d
}|j                  r‹|j                  j                  ru|j                  j                  D ]\  }t        |t        «      r|xs d|j                  z   }Œ't        |t        «      rt        dd¬	«      ‚t        dd|j                  › �¬	«      ‚ d
}|j                  r�|j                  j                  ryt        |j                  j                  «      D ��cg c]O  \  }}|j                   xs! t#        ||j$                  |j&                  «      d|j$                  |j&                  dœdœ‘ŒQ }}}t)        |j*                  «      }	t-        t/        |j                  t1        ||d
d
d
¬«      |	¬«      g¬«      S # t        t        f$ r}t        dd|› �¬	«      ‚d
}~ww xY wc c}}w )zDParse a single GENERIC SSE chunk into a LiteLLM ModelResponseStream.r1   r,   rF   rZ   rD   rE   iô  z*Chunk cannot be parsed as OCIStreamChunk: r/   Nr   uD   OCI returned image content in a streaming response â€” not supportedz4Unsupported content type in OCI streaming response: rC   rv   rw   )r&   rA   Úprovider_specific_fieldsÚthinking_blocksÚreasoning_content)ÚindexÚdeltar‘   )r�   rg   )r9   Ú
setdefaultr   r…   r   r   r¦   r1   r&   r6   r   r*   r   r2   r,   rx   rD   rt   rE   rF   rh   r�   r   r   r   )
r¡   rI   Útyped_chunkr™   r*   rž   rA   ry   Útcr‘   s
             r>   Úhandle_generic_stream_chunkr«   h  s>  € ð ‡~�~�iÔ  Z°	Ñ%:×%>Ñ%>¸{Ô%KØ# IÑ.¨{Ñ;ò 	-ˆIØ× Ñ  ¨bÔ1Ø× Ñ   rÔ*Ø× Ñ  ¨Õ,ð	-ð

Ü+Ñ9¨jÑ9ˆð ×ÑÐ ØˆÔð €DØ×Ò˜{×2Ñ2×:Ò:Ø×'Ñ'×/Ñ/ò 	ˆDÜ˜$Ô 2Ô3Øš
  d§i¡iÑ/‘Ü˜DÔ"5Ô6ÜØ #Øbôð ô
 Ø #ØRÐSW×S\ÑS\ÐR]Ð^ôð ð	ð* /3€JØ×Ò˜{×2Ñ2×<Ò<ô # ;×#6Ñ#6×#@Ñ#@ÓA÷

ñ ��2ð —e‘eÒUÔ;¸A¸r¿w¹wÈÏÉÓUØ"àŸG™GØ!#§¡ñóð

ˆ
ñ 

ô (DÀK×D\ÑD\Ó']€MääØ!×'Ñ'ÜØ Ø)Ø-1Ø$(Ø&*ôð ,ô
ð
ôð øôi ”Ð'ò 
ÜØØ@ÀÀÐDô
ð 	
ûð
üóL

s   Á*H Å'AH+ÈH(ÈH#È#H()4Ú__doc__rˆ   ro   Útypingr   r   ÚhttpxÚpydanticr   Úlitellm.llms.oci.common_utilsr   r   r   r	   Úlitellm.types.llms.ocir
   r   r   r   r   r   r   r   r   r   r   Úlitellm.types.llms.openair   Úlitellm.types.utilsr   r   r   r   r   r   r$   r8   r7   Ú__annotations__rR   r?   rM   rO   rT   r^   rh   r‹   rt   rz   ÚResponser    r«   rg   r@   r>   ú<module>r¶      sÅ  ðòó Û ß ã Ý $÷ó ÷÷ ÷ ñ õ 7÷÷ ð ØØØñ	?Ð   t¨C°¨MÑ':Ñ!;ó ð4Àð 4ÈsÐUYÉzð 4Ð^hó 4ðn*¸3ð *ÈDð *ÐU_ó *ðZ¸sð ÐRUð Ð`cð Ðhró ð%ØÐ#Ñ$ð%à	ˆ*Ñó%ðZ°°d±ð ÀZð ÐTXÐYjÑTkó ð: c¨D¡jð °S¸4±Zó ð*¨3ð °cð Àcð Ècó ð$Ø�Ñðà	Ð
'Ñ(óð&8Øð8àð8ð "ð8ð —.‘.ð	8ð
 ó8ðvM¨Dð MÐ5Hô Mr@   