
    yjG                        d 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mZ d&dZdddddddd'd#Zdddddddd(d%ZdS ))zLow-level request assembly: flatten a ModelConfig into backend calls.

Does NOT own: retry, fallback, tool loop, provider selection. Those live in
src/llm/api.py, src/llm/tool_loop.py, src/llm/runtime.py.
    )annotations)AsyncIterator)Any)	BaseModel)ModelConfigPromptCachePolicy   )CompletionResultProviderBackendStreamChunkconfigr   returndict[str, Any]c                    i }| j         
| j         |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        
| j        |d<   | j        r|                    | j                   |S )a4  Flatten ModelConfig's optional knobs and provider_params into extra_params.

    Backends read per-call tuning parameters (top_p, top_k, frequency_penalty,
    presence_penalty, seed) and the free-form provider_params passthrough out
    of ``extra_params``. Single source of truth for that translation.
    Ntop_ptop_kfrequency_penaltypresence_penaltyseed)r   r   r   r   r   provider_paramsupdate)r   extra_paramss     ?/DATA/AppData/hermes/projects/honcho/src/llm/request_builder.pybuild_config_extra_paramsr      s     $&L| &W| &W+,2,D()*+1+B'({%{V 4F2333    N)toolstool_choiceresponse_formatstopcache_policyr   backendr   messageslist[dict[str, Any]]
max_tokensintr   list[dict[str, Any]] | Noner   str | dict[str, Any] | Noner   'type[BaseModel] | dict[str, Any] | Noner   list[str] | Noner    PromptCachePolicy | Noner   dict[str, Any] | Noner
   c                  K   |j         p|}
i t          |          |	pi }|||d<   |                     |j        ||
|j        ||n|j        ||||j        |j        |
|           d {V S Nr    )modelr"   r$   temperaturer   r   r   r   thinking_budget_tokensthinking_effortmax_output_tokensr   )r2   r   completer.   r/   stop_sequencesr0   r1   r!   r   r"   r$   r   r   r   r   r    r   effective_max_tokensmerged_extra_paramss               r   execute_completionr8   ,   s       "3Az
#F
+
+2 .:N+!!l'&%TT6+@'%<..( "         r   AsyncIterator[StreamChunk]c                  K   |j         p|}
i t          |          |	pi }|||d<   |                     |j        ||
|j        ||n|j        ||||j        |j        |
|          S r-   )r2   r   streamr.   r/   r4   r0   r1   r5   s               r   execute_streamr<   T   s       "3Az
#F
+
+2 .:N+>>l'&%TT6+@'%<..(    r   )r   r   r   r   )r!   r   r   r   r"   r#   r$   r%   r   r&   r   r'   r   r(   r   r)   r    r*   r   r+   r   r
   )r!   r   r   r   r"   r#   r$   r%   r   r&   r   r'   r   r(   r   r)   r    r*   r   r+   r   r9   )__doc__
__future__r   collections.abcr   typingr   pydanticr   
src.configr   r   r!   r
   r   r   r   r8   r<    r   r   <module>rD      s    # " " " " " ) ) ) ) ) )             5 5 5 5 5 5 5 5 C C C C C C C C C C   > *./3?C!-1*.% % % % % %\ *./3?C!-1*.# # # # # # # #r   