
    PL
j#                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
m
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 ddlmZ dd	lmZ dd
lmZ ddlmZ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)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6  ej7        d          Z8d Z9	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 djdkdhZ:digZ;dS )luQ  Implementation of :meth:`AIAgent.__init__` — extracted as a module function.

``AIAgent.__init__`` is one of the longest methods in the codebase (60+
parameters, ~1,400 lines of attribute initialization, provider
auto-detection, credential resolution, context-engine bootstrap, etc.).
Keeping it in ``run_agent.py`` bloats that file with code that's mostly
"setup state, then forget".

After this extraction the body lives here as ``init_agent(agent, ...)``
and :meth:`AIAgent.__init__` is a thin wrapper that calls
``init_agent(self, ...)``.  All imports the body needs at module-load
time are listed below; the body also performs many lazy imports inside
its own scope that come along unchanged.

Symbols that tests patch on ``run_agent.*`` (``OpenAI``, ``cleanup_vm``,
etc.) are resolved through :func:`_ra` so the patch contract is
preserved.
    )annotationsN)datetime)Path)AnyDictListOptional)urlparseparse_qs
urlunparse)ContextCompressor)IterationBudget)StreamingContextScrubber)MINIMUM_CONTEXT_LENGTHfetch_model_metadataget_model_context_lengthis_local_endpointquery_ollama_num_ctx)_install_safe_stdio)SubdirectoryHintTracker)StreamingThinkScrubber)ToolCallGuardrailConfigToolCallGuardrailControllerToolGuardrailDecision)cfg_get)get_provider_request_timeout)get_hermes_home)check_toolset_requirementsget_tool_definitions)base_url_host_matches	run_agentc                     ddl } | S )zLazy reference to ``run_agent`` so callers can patch
    ``run_agent.OpenAI`` / ``run_agent.cleanup_vm`` / ... and have those
    patches reach this code path.
    r   Nr!   r#   s    4/home/kuhnn/.hermes/hermes-agent/agent/agent_init.py_rar%   A   s    
      Z         ?Fd        
   base_urlstrapi_keyproviderapi_modeacp_commandacp_argslist[str] | Nonecommandargsmodelmax_iterationsint
tool_delayfloatenabled_toolsets	List[str]disabled_toolsetssave_trajectoriesboolverbose_logging
quiet_modeephemeral_system_promptlog_prefix_chars
log_prefixproviders_allowedproviders_ignoredproviders_orderprovider_sortprovider_require_parametersprovider_data_collectionopenrouter_min_coding_scoreOptional[float]
session_idtool_progress_callbackcallabletool_start_callbacktool_complete_callbackthinking_callbackreasoning_callbackclarify_callbackstep_callbackstream_delta_callbackinterim_assistant_callbacktool_gen_callbackstatus_callback
max_tokensreasoning_configDict[str, Any]service_tierrequest_overridesprefill_messagesList[Dict[str, Any]]platformuser_id	user_namechat_id	chat_name	chat_type	thread_idgateway_session_keyskip_context_filesload_soul_identityskip_memoryparent_session_iditeration_budget'IterationBudget'fallback_modelcheckpoints_enabledcheckpoint_max_snapshotscheckpoint_max_total_size_mbcheckpoint_max_file_size_mbpass_session_idcA                S   t                       |	| _        |
| _        |9pt          |
          | _        || _        || _        || _        || _        || _	        |,| _
        |-| _        |.| _        |/| _        |0| _        |1| _        |2| _        |3| _        d| _        d| _        |4| _        |5| _        |@| _        |;| _        || _        |r| dnd| _        |pd| _        t7          |t8                    r:|                                r&|                                                                nd}A|Apd| _        |p|| _         tC          |p|pg           | _"        |dv r	|| _#        n
| j        dk    rd| _#        n| j        dv rd| _#        n|A#| j$        dk    rd	| j%        v rd| _#        d| _        n|A| j$        d
k    rd| _#        d| _        n| j        dk    s|A| j$        dk    rd| _#        d| _        n~| j%        &                    d          '                    d          rd| _#        nI| j        dk    s/| j$        (                    d          rtS          | j%        d          rd| _#        nd| _#        	 | *                                 n# tV          $ r Y nw xY w	 ddl,m-}Bm.}C | j        |Bvr |C| j        | j                  | _        n# tV          $ r Y nw xY w|| j#        dk    r| j        dk    rt9          | j        pd                                          (                    d          st9          | j        pd                                          (                    d          sy| /                                se| 0                                s!| 1                    | j        | j                  r0d| _#        te          | d          r| j3        4                                 | j        dk    s| 5                                rxtm                      j7        8                                sStm                      j7        9                                 tu          j;        tx          dd           =                                 || _>        || _?        || _@        d!| _A        || _B        | | _C        |!| _D        |"| _E        |#| _F        |$| _G        |&| _H        |%| _I        d!| _J        t                      | _L        d| _M        d!| _N        d| _O        d| _P        d!| _Q        tu          jR                    | _S        d| _T        tu          jU                    | _V        ts                      | _W        tu          jU                    | _X        d| _Y        g | _Z        tu          jU                    | _[        || _\        || _]        || _^        || __        || _`        || _a        || _b        || _c        || _d        |'| _e        |(| _f        |)| _g        t          |*pi           | _i        |+pg | _j        d!| _k        | l                                \  | _m        | _n        d"| _o        	 dd#lpmq}D  |D            r                    d$i           pi }E|Er                    d%d"          }F|Fd&v r|F| _o        n# tV          $ r Y nw xY wd!| _s        d!| _t        t          ju                    | _v        d'| _w        d| _x        d| _y        d| _z        d| _{        dd(l|m}}Gm~}H  |Gtm                      j        )           | j        r1 |H             tm                      j                            d*           n| j        r	 d| _        d!| _        t	                      | _        t                      | _        d| _        d| _        d| _        i | _        d| _        d!| _        t          | j        | j                  }I| j#        dk    rdd+lm}Jm}K | j        dk    }L|Lrdd,lm}M t'          j        d-|pd          }N|Nr|N                    d.          nd/}O|O| _         |M|O          | _        d0| _        || _        d!| _        d0| _        d| _        i | _        | j        st9          d1| j         d2|O d3           	n)| j        dk    }P|Pr|p |K            pdn|pd}Q|Q| _        |Q| _        || _        dd4lm}R |Pr |R|Q          nd!| _         |J|Q||I5          | _        d| _        i | _        | j        sUt9          d1| j         d6           |Qr:t=          |Q          d7k    r&t9          d8|Qdd9          d:|Qd;d                     n\| j#        dk    rVt'          j        d-|pd          }N|Nr|N                    d.          nd/| _        d| _        	 dd#lpmq}S  |S            r                    di           r                    d<i           }T|Tr                    d=          ru|Tr                    d>          r`|Td=         |Td>         d?| _        |Tr                    d@          r|Td@         | j        dA<   |Tr                    dB          r|TdB         | j        dB<   n# tV          $ r Y nw xY wd| _        i | _        | j        s.| j        rdCnd}Ut9          d1| j         dD| j         |U d3           n|r|r	tA          |          }V|Vj        r\tE          |V                    dE                    }WdF tI          |Vj                                                  D             }X||W|XdG}Yn||dH}Y|I|I|YdI<   | j        dk    r| j         |YdJ<   | j"        |YdK<   |}ZtS          |ZdL          rddMlm}[  |[            |YdN<   nPtS          |ZdO          rddPlm}\  |\|Z          |YdN<   n*tS          |ZdQ          r%tm                                                      |YdN<   ntS          |ZdR          rddSlm}]  |]            |YdN<   ntS          |ZdT          r	dUdVi|YdN<   ntS          |ZdW          r%tm                                                      |YdN<   ntS          |Zd          rddXlm}^  |^|          |YdN<   n\dN|YvrJ	 ddYlm}_  |_| j                  }`|`r|`j        rt          |`j                  |YdN<   n# tV          $ r Y nw xY wnddZlm}a  |a| j        pd[| j        d\          \  }b}c|b_|bj        t9          |bj                  dH}Y|I|I|YdI<   te          |bd]d          }d|dste          |bd^d          }d|drt          |d          |YdN<   n| j        pd                                                                }e|er6|ed_vr1|e                                 d`}f	 ddalm}g |gr                    |e          }h|hr|hj        r|hj        d         }fn# tV          $ r Y nw xY wg }it7          |:tB                    rdb |:D             }inBt7          |:t                    r-|:r                    dc          r|:r                    dd          r|:g}id!}j|iD ]R}k|kr                    de          pd                                pd}l|lsj|kr                    df          p|kr                    dg          pd                                }m|mr*to          j        |md                                          pd}l |a|kdc         |kdd         d|kr                    dh          |li          \  }n}o|n|kdc         | _        |op|kdd         | _        d| _        |nj        t9          |nj                  dH}Y|I|I|YdI<   te          |nd]d          }p|pste          |nd^d          }p|prt          |p          |YdN<   d}j nT|jstu          dj|e dk|f dl          te          | dmd!          stu          dn          |Y| _        t9          |Yr                    dhd                                                    }qtS          |qdL          rgdo| j        pd                                v rJ|Yr                    dN          pi }r|rr                    dpd          }sdq}t|t|svr|sr|s dr|t |rdp<   n|t|rdp<   |r|YdN<   |Yr                    ded          | _        |Yr                    dh| j                  | _        	 |                     |Ydsdt          | _        | j        st9          d1| j                    |rt9          du|            |Yr                    dedv          }u|urA|udwk    r;t=          |u          d7k    r't9          dx|udd9          d:|ud;d                     n t9          dy|ur
|uddz         ndv d{           n%# tV          $ r}vtu          d||v           d}v~vww xY wt7          |:tB                    rd} |:D             | _        nOt7          |:t                    r3|:r                    dc          r|:r                    dd          r	|:g| _        ng | _        d| _        te          | dmd!          | _        | j        r| j        d         nd| _        | j        r| j        st=          | j                  d.k    r1| j        d         }wt9          d~|wdd          d|wdc          d3           nLt9          dt=          | j                   dd                    d | j        D                       z              tm                                          ||| j                  | _        ts                      | _        | j        rd | j        D             | _        t          | j                  }x| j        st9          dt=          | j                   dd                    |x                      |r&t9          dd                    |                      |r&t9          dd                    |                      n| j        st9          d           | j        rZ| j        sStm                                                      }yd |y                                D             }z|zrt9          d|z            | j        r| j        st9          d           | j	        rM| j        sFt=          | j	                  dk    r| j	        dd         d:z   n| j	        }{t9          d|{ d           | jm        rD| j        s=| jn        r| j        dk    rd}|n| jn        rd}|nd}|t9          d|| d| jo         d           t          j                    | _        |r|| _        nG| j                            d          }}t          j                    j        dd         }~|} d|~ | _        | j        tn          j        d<   	 ddlm} |9                    | j                   n# tV          $ r Y nw xY wt                      }|dz  | _        | j                            dd           | j        d| j         dz  | _        g | _        d| _        d| _        d| _        ddlm}  ||<|=|>|?          | _        |7| _        |8| _        d| _        d!| _        | j        |(|'d| _        ddlm}  |            | _        	 dd#lpmq}  |            }n# tV          $ r i }Y nw xY w	 t          t          j        |r                    di                               | _L        n># tV          $ r1}tm                      j                            d|           Y d}~nd}~ww xY wd| _        d| _        d!| _        d!| _        d| _        d| _        d| _        |6s	 |r                    di           }|r                    dd!          | _        |r                    dd!          | _        t          |r                    dd                    | _        | j        s| j        rYddlm}  ||r                    dd          |r                    dd                    | _        | j                                         n# tV          $ r Y nw xY wd| _        |6sO	 |r|r                    dcd          nd}|r|                                rddlm} ddlm}  |            | _         ||          }|r.|                                r| j                            |           | j        j        rE| j        |,pdt9          t                                dd}| j        r8	 | j                            | j                  }|r||d<   n# tV          $ r Y nw xY w| j        r
| j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   | j        r
| j        |d<   	 ddlm}  |            }||d<   d|d<   n# tV          $ r Y nw xY w | j        j        di | tm                      j                            d|           n.tm                      j                            d|           d| _        nE# tV          $ r8}tm                      j                            d|           d| _        Y d}~nd}~ww xY w| j        r| j        dǄ | j        D             }| j                                        D ]o}|r                    dd          }|r||v rd|dʜ}| j                            |           |r/| j                            |           |                    |           pd| _         	 |r                    di           }t          |r                    dd                    | _         n# tV          $ r Y nw xY w|r                    di           }t7          |t                    si }|r                    dd[          | _        	 |r                    ddЦ          }t          |          }t          |d.          }n# t          t          f$ r d}Y nw xY w|| _        |r                    di           }t7          |t                    si }t          |r                    ddӦ                    }	 ddlm}  || j                  }||}n# tV          $ r Y nw xY wt9          |r                    dd                                                    dv }t          |r                    ddئ                    }t          |r                    ddz                    }t          dt          |r                    ddЦ                              }	 t          |ddi ܦ          }n# tV          $ r i }Y nw xY wt7          |t                    r|r                    dݦ          }nd}|-	 t          |          }n# t          t          f$ r d}Y nw xY w|| _        |r                    ddi           }| je        t7          |t                    r|r                    dަ          }|	 t7          |t                    rt          t          |          }|dk    rt          || _e        nb# t          t          f$ rL tm                      j                            d|           t9          d|dt          j                   Y nw xY w| je        | j        d<   t7          |t                    r|r                    dݦ          }nd}|v	 t          |          }nd# t          t          f$ rN tm                      j                            d|           t9          d|dt          j                   d}Y nw xY w	 ddlpm}  ||          }n<# tV          $ r/ |r                    d          }t7          |tB                    sg }Y nw xY w|| _        ||r	 ddlpm}  || j        | j        |          }|rt          |          }n# tV          $ r d}Y nw xY w|x| j        r| j        &                    d          nd}|D ]Q}t7          |t                    s|r                    dh          pd&                    d          }|r||k    r|r                    di           }t7          |t                    r|r                    | j        i           }t7          |t                    r|r                    dݦ          }|	 t          |          }|dk    rt          np# t          t          f$ rZ tm                      j                            d| j        |           t9          d| j        d|dt          j                   Y nw xY w nS|| _        |                     |           d}d}	 t7          |t                    r|r                    di           ni }|r                    dd          pd}n# tV          $ r Y nw xY w|dk    r	 ddlm}  ||          }n># tV          $ r1}tm                      j                            d|           Y d}~nd}~ww xY w|4	 ddlm}  |            }|r|j        |k    r|}n# tV          $ r Y nw xY w|'tm                      j                            d|           ||| _        ddlm}  || j        | j        te          | ded          || j        |          }| j                            | j        || j        te          | ded          | j                   | j        s-tm                      j                            d|j                   nKt5          | j        ||||d| j        | j        te          | ded          || j        | j#                  | _        || _        ddlm} te          | j        dd          }|r/||k     r)t	          d| j         d|drd|drd|d z   d	          ts                      | _        te          | d          r| j        r| j        d | j        D             }| j                                        D ]}|r                    dd          }|r||v rd|dʜ}| j                            |           |rJ| j                            |           | j                            |           |                    |           te          | d          r| j        r	 | j                            | j        t9          t                                | j
        pd| j        te          | j        dd                     n?# tV          $ r2}tm                      j                            d|           Y d}~nd}~ww xY wtA          to          j        d          pd          | _!        d| _"        d| _#        d| _$        d| _%        d| _&        d| _'        d| _(        d| _)        d| _*        d| _+        d| _,        d	| _-        dv| _.        d| _/        d}t7          |t                    r|r                    d
          }|Y	 t          |          | _/        nA# t          t          f$ r+ tm                      j                            d|           Y nw xY w| j/        | j        rta          | j                  rv	 tc          | j        | j        | j        pd          }|r|dk    r|| _/        n?# tV          $ r2}tm                      j                            d|           Y d}~nd}~ww xY w| j/        rG|rE|C| j/        |k    r7tm                      j                            d| j/        |           || _/        | j/        r5| j        s.tm                      j                            d| j/                   | j        so|rJt9          d| j        j2        drdt          |dz             d| j        j3        drd3           n#t9          d| j        j2        drd           d| _4        | 5                                 | j        }| j        | j        | j        | j#        te          | ded          t          | j                  | jm        | jn        te          |dd| j                  te          |dh| j                  te          |ded          te          |dc| j                  |j2        |j3        d| _6        | j#        dk    r2| j6        7                    | j        | j        | j        d           dS dS (  a  
    Initialize the AI Agent.

    Args:
        base_url (str): Base URL for the model API (optional)
        api_key (str): API key for authentication (optional, uses env var if not provided)
        provider (str): Provider identifier (optional; used for telemetry/routing hints)
        api_mode (str): API mode override: "chat_completions" or "codex_responses"
        model (str): Model name to use (default: "anthropic/claude-opus-4.6")
        max_iterations (int): Maximum number of tool calling iterations (default: 90)
        tool_delay (float): Delay between tool calls in seconds (default: 1.0)
        enabled_toolsets (List[str]): Only enable tools from these toolsets (optional)
        disabled_toolsets (List[str]): Disable tools from these toolsets (optional)
        save_trajectories (bool): Whether to save conversation trajectories to JSONL files (default: False)
        verbose_logging (bool): Enable verbose logging for debugging (default: False)
        quiet_mode (bool): Suppress progress output for clean CLI experience (default: False)
        ephemeral_system_prompt (str): System prompt used during agent execution but NOT saved to trajectories (optional)
        log_prefix_chars (int): Number of characters to show in log previews for tool calls/responses (default: 100)
        log_prefix (str): Prefix to add to all log messages for identification in parallel processing (default: "")
        providers_allowed (List[str]): OpenRouter providers to allow (optional)
        providers_ignored (List[str]): OpenRouter providers to ignore (optional)
        providers_order (List[str]): OpenRouter providers to try in order (optional)
        provider_sort (str): Sort providers by price/throughput/latency (optional)
        openrouter_min_coding_score (float): Coding-score floor (0.0-1.0) for the
            openrouter/pareto-code router. Only applied when model == "openrouter/pareto-code".
            None or empty = let OpenRouter pick the strongest available coder.
        session_id (str): Pre-generated session ID for logging (optional, auto-generated if not provided)
        tool_progress_callback (callable): Callback function(tool_name, args_preview) for progress notifications
        clarify_callback (callable): Callback function(question, choices) -> str for interactive user questions.
            Provided by the platform layer (CLI or gateway). If None, the clarify tool returns an error.
        max_tokens (int): Maximum tokens for model responses (optional, uses model default if not set)
        reasoning_config (Dict): OpenRouter reasoning configuration override (e.g. {"effort": "none"} to disable thinking).
            If None, defaults to {"enabled": True, "effort": "medium"} for OpenRouter. Set to disable/customize reasoning.
        prefill_messages (List[Dict]): Messages to prepend to conversation history as prefilled context.
            Useful for injecting a few-shot example or priming the model's response style.
            Example: [{"role": "user", "content": "Hi!"}, {"role": "assistant", "content": "Hello!"}]
            NOTE: Anthropic Sonnet 4.6+ and Opus 4.6+ reject a conversation that ends on an
            assistant-role message (400 error).  For those models use structured outputs or
            output_config.format instead of a trailing-assistant prefill.
        platform (str): The interface platform the user is on (e.g. "cli", "telegram", "discord", "whatsapp").
            Used to inject platform-specific formatting hints into the system prompt.
        skip_context_files (bool): If True, skip auto-injection of SOUL.md, AGENTS.md, and .cursorrules
            into the system prompt. Use this for batch processing and data generation to avoid
            polluting trajectories with user-specific persona or project instructions.
        load_soul_identity (bool): If True, still use ~/.hermes/SOUL.md as the primary
            identity even when skip_context_files=True. Project context files from the cwd
            remain skipped.
    N r'   >   codex_responsesbedrock_conversechat_completionscodex_app_serveranthropic_messageszopenai-codexry   >   	xai-oauthxaizchatgpt.comz/backend-api/codexzapi.x.air   	anthropiczapi.anthropic.comr}   /z
/anthropicbedrockzbedrock-runtime.zamazonaws.comrz   r{   r   )_AGGREGATOR_PROVIDERSnormalize_model_for_providerzcopilot-acpzacp://copilotz
acp+tcp://)r1   _transport_cache
openrouterTzopenrouter-prewarm)targetdaemonnameF5m)load_configprompt_caching	cache_ttl>   1hr   initializing)setup_loggingsetup_verbose_logging)hermes_homez=Verbose logging enabled (third-party library logs suppressed))build_anthropic_clientresolve_anthropic_token)build_anthropic_bedrock_clientzbedrock-runtime\.([a-z0-9-]+)\.   z	us-east-1zaws-sdku&   🤖 AI Agent initialized with model: z& (AWS Bedrock + AnthropicBedrock SDK, ))_is_oauth_token)timeoutz (Anthropic native)   u   🔑 Using token:    z...	guardrailguardrail_identifierguardrail_version)guardrailIdentifierguardrailVersionstream_processing_modestreamProcessingModetracez + Guardrailsz (AWS Bedrock, )queryc                &    i | ]\  }}||d          S )r    ).0kvs      r$   
<dictcomp>zinit_agent.<locals>.<dictcomp>Y  s/     ! ! ! $1Aqt! ! !r&   )r0   r.   default_query)r0   r.   r   r6   r7   zopenrouter.ai)build_or_headersdefault_headerszintegrate.api.nvidia.com)build_nvidia_nim_headerszapi.routermint.comzapi.githubcopilot.com)copilot_default_headerszapi.kimi.comz
User-Agentzclaude-code/0.1.0zportal.qwen.ai)_codex_cloudflare_headers)get_provider_profile)resolve_provider_clientauto)r8   	raw_codex_custom_headers_default_headers>   r   customr   _API_KEY)PROVIDER_REGISTRYc                    g | ]C}t          |t                    |                    d           ,|                    d          A|DS r1   r8   
isinstancedictgetr   fs     r$   
<listcomp>zinit_agent.<locals>.<listcomp>  s_     ' ' '"#)!T22'78uuZ7H7H'MNUUSZ^^'' ' 'r&   r1   r8   r0   key_envapi_key_envr.   )r8   r   explicit_base_urlexplicit_api_keyz
Provider 'z:' is set in config.yaml but no API key was found. Set the zM environment variable, or switch to a different provider with `hermes model`._fallback_activatedzxNo LLM provider configured. Run `hermes model` to select a provider, or run `hermes setup` for first-time configuration.claudezx-anthropic-betaz&fine-grained-tool-streaming-2025-05-14,
agent_init)reasonsharedu   🔗 Using custom base URL: nonez	dummy-keyu   🔑 Using API key: u;   ⚠️  Warning: API key appears invalid or missing (got: 'r+   z...')z$Failed to initialize OpenAI client: c                    g | ]C}t          |t                    |                    d           ,|                    d          A|DS r   r   r   s     r$   r   zinit_agent.<locals>.<listcomp>  s^     !
 !
 !
!T""!
'(uuZ'8'8!
=>UU7^^!
!
 !
 !
r&   u   🔄 Fallback model:  (u   🔄 Fallback chain (z providers): u    → c              3  >   K   | ]}|d           d|d          dV  dS )r8   r   r1   r   Nr   r   s     r$   	<genexpr>zinit_agent.<locals>.<genexpr>  s;      ``Q!G*@@*@@@``````r&   )r=   r?   rC   c                *    h | ]}|d          d         S functionr   r   )r   tools     r$   	<setcomp>zinit_agent.<locals>.<setcomp>+  s"    !S!S!St$z"26":!S!S!Sr&   u   🛠️  Loaded z tools: z, u      ✅ Enabled toolsets: u      ❌ Disabled toolsets: u@   🛠️  No tools loaded (all tools filtered out or unavailable)c                    g | ]	\  }}||
S r   r   )r   r   	availables      r$   r   zinit_agent.<locals>.<listcomp>;  s"    ZZZyPYZZZZr&   u=   ⚠️  Some tools may not work due to missing requirements: u   📝 Trajectory saving enabled<   u   🔒 Ephemeral system prompt: 'z' (not saved to trajectories)znative AnthropiczAnthropic-compatible endpointzClaude via OpenRouteru   💾 Prompt caching: ENABLED (z TTL)z%Y%m%d_%H%M%S   _HERMES_SESSION_ID)_SESSION_IDsessions)parentsexist_oksession_z.jsonassistant_tool
foreground)CheckpointManager)enabledmax_snapshotsmax_total_size_mbmax_file_size_mb)r9   r]   r\   )	TodoStoretool_loop_guardrailsz&Tool loop guardrail config ignored: %sr-   memorymemory_enableduser_profile_enablednudge_interval)MemoryStorememory_char_limiti  user_char_limiti_  )r   r   )MemoryManager)load_memory_providercliprimary)rO   rc   r   agent_contextsession_titlerd   re   rf   rg   rh   ri   rj   )get_active_profile_nameagent_identityhermesagent_workspacezMemory provider '%s' activatedz/Memory provider '%s' not found or not availablez&Memory provider plugin init failed: %sc                    h | ]@}t          |t                    |                    d i                               d          AS r   r   r   ts     r$   r   zinit_agent.<locals>.<setcomp>  T      
  
  
!T"" 
EE*b!!%%f-- 
  
  
r&   r   r   )typer   skillscreation_nudge_intervalagenttool_use_enforcementapi_max_retries   compression	thresholdg      ?) _compression_threshold_for_modelr   >   1yestruetarget_ratiog?protect_last_nprotect_first_n	auxiliary)defaultcontext_lengthr\   uy   Invalid model.max_tokens in config.yaml: %r — must be a positive integer (e.g. 4096). Falling back to provider default.u.   
⚠ Invalid model.max_tokens in config.yaml: zO
  Must be a positive integer (e.g. 4096).
  Falling back to provider default.
)fileu   Invalid model.context_length in config.yaml: %r — must be a plain integer (e.g. 256000, not '256K'). Falling back to auto-detection.u2   
⚠ Invalid model.context_length in config.yaml: zf
  Must be a plain integer (e.g. 256000, not '256K').
  Falling back to auto-detected context window.
)get_compatible_custom_providerscustom_providers)"get_custom_provider_context_length)r8   r.   r  modelsu   Invalid context_length for model %r in custom_providers: %r — must be a positive integer (e.g. 256000, not '256K'). Falling back to auto-detection.u&   
⚠ Invalid context_length for model z in custom_providers: zi
  Must be a positive integer (e.g. 256000, not '256K').
  Falling back to auto-detected context window.

compressorcontextengine)load_context_enginez4Context engine load from plugins/context_engine/: %s)get_plugin_context_engineuE   Context engine '%s' not found — falling back to built-in compressor)r   )r.   r0   config_context_lengthr1   r  )r8   r  r.   r0   r1   zUsing context engine: %s)r8   threshold_percentr  r  summary_target_ratiosummary_model_overriderC   r.   r0   r  r1   r2   )r   zModel z has a context window of z$ tokens, which is below the minimum z9 required by Hermes Agent.  Choose a model with at least i  zBK context, or set model.context_length in config.yaml to override.context_compressorc                    h | ]@}t          |t                    |                    d i                               d          AS r   r   r   s     r$   r   zinit_agent.<locals>.<setcomp>4  r   r&   )r   rc   r8   r  z#Context engine on_session_start: %sTERMINAL_CWD)working_dirg        unknownollama_num_ctxz'Invalid ollama_num_ctx config value: %r)r0   z#Ollama num_ctx detection failed: %sz?Ollama num_ctx capped: %d -> %d (model.context_length override)zAOllama num_ctx: will request %d tokens (model max from /api/show)u   📊 Context limit: z tokens (compress at r*   z% = z# tokens (auto-compression disabled))r8   r1   r.   r2   r0   client_kwargsuse_prompt_cachinguse_native_cache_layoutcompressor_modelcompressor_base_urlcompressor_api_keycompressor_providercompressor_context_lengthcompressor_threshold_tokens)anthropic_api_keyanthropic_base_urlis_anthropic_oauthr   (8  r   r8   r9   r   ro   r;   r@   rB   rC   rD   rc   _user_id
_user_name_chat_id
_chat_name
_chat_type
_thread_id_gateway_session_key	_print_fnbackground_review_callbackrk   rl   rv   _credential_poolrE   rF   r.   r   r/   striplowerr1   r3   listr4   r2   _base_url_hostname_base_url_lowerrstripendswith
startswithr    _get_transport	Exceptionhermes_cli.model_normalizer   r   _is_azure_openai_url_is_direct_openai_url&_provider_model_requires_responses_apihasattrr   clear_is_openrouter_urlr%   _openrouter_prewarm_doneis_setset	threadingThreadr   startrP   rR   rS   suppress_status_outputrT   rU   rV   rW   rX   rY   r[   rZ   _executing_toolsr   _tool_guardrails_tool_guardrail_halt_decision_interrupt_requested_interrupt_message_execution_thread_id _interrupt_thread_signal_pendingRLock_client_lock_pending_steerLock_pending_steer_lock_tool_worker_threads_tool_worker_threads_lock_delegate_depth_active_children_active_children_lockrG   rH   rI   rJ   rK   rL   rM   r=   r?   r\   r]   r_   r   r`   ra   _force_ascii_payload_anthropic_prompt_cache_policy_use_prompt_caching_use_native_cache_layout
_cache_ttlhermes_cli.configr   r   _budget_exhausted_injected_budget_grace_calltime_last_activity_ts_last_activity_desc_current_tool_api_call_count_rate_limit_state_or_cache_hitshermes_loggingr   r   _hermes_homeloggerinfo_stream_callback_stream_needs_breakr   _stream_context_scrubberr   _stream_think_scrubber _current_streamed_assistant_text_persist_user_message_idx_persist_user_message_override_anthropic_image_fallback_cache_anthropic_client_is_anthropic_oauthr   agent.anthropic_adapterr   r   r   researchgroup_bedrock_region_anthropic_api_key_anthropic_base_urlr0   client_client_kwargsprintr   len_bedrock_guardrail_configr
   r   r   _replacer   itemsagent.auxiliary_clientr   r   _routermint_headershermes_cli.modelsr   _qwen_portal_headersr   	providersr   r   r   getattrupperhermes_cli.authr   api_key_env_varsosgetenvr   RuntimeError_create_openai_client_fallback_chain_fallback_index_fallback_modeljoinr   toolsvalid_tool_namessortedr   r   nowsession_startrO   strftimeuuiduuid4hexenvirongateway.session_contextr   r   logs_dirmkdirsession_log_file_session_messages_memory_write_origin_memory_write_context_cached_system_prompttools.checkpoint_managerr   _checkpoint_mgr_session_db_parent_session_id_last_flushed_db_idx_session_db_created_session_init_model_configtools.todo_toolr   _todo_storer   from_mappingwarning&_aux_compression_context_length_config_memory_store_memory_enabled_user_profile_enabled_memory_nudge_interval_turns_since_memory_iters_since_skillr:   tools.memory_toolr   load_from_disk_memory_manageragent.memory_managerr   plugins.memoryr   is_availableadd_providerget_session_titlehermes_cli.profilesr   initialize_alldebugget_all_tool_schemasappendadd_skill_nudge_interval_tool_use_enforcementmax	TypeError
ValueError_api_max_retriesr<   r
  r   rA   sysstderrr  _custom_providersr  _config_context_length_ensure_lmstudio_runtime_loadedplugins.context_enginer  hermes_cli.pluginsr  r   r"  agent.model_metadatar   update_modelr   compression_enabledr   _context_engine_tool_namesget_tool_schemason_session_startr   _subdirectory_hints_user_turn_countsession_prompt_tokenssession_completion_tokenssession_total_tokenssession_api_callssession_input_tokenssession_output_tokenssession_cache_read_tokenssession_cache_write_tokenssession_reasoning_tokenssession_estimated_cost_usdsession_cost_statussession_cost_source_ollama_num_ctxr   r   r  threshold_tokens_compression_warning$_check_compression_model_feasibility_primary_runtimeupdate)r  r.   r0   r1   r2   r3   r4   r6   r7   r8   r9   r;   r=   r?   r@   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rO   rP   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r_   r`   ra   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   
session_dbrn   ro   rq   credential_poolrr   rs   rt   ru   rv   provider_namer   r   _load_pc_cfg_pc_cfg_ttlr   r   _provider_timeoutr   r   _is_bedrock_anthropicr   _region_match
_br_region_is_native_anthropiceffective_key_is_oat_load_br_cfg_gr	_gr_label_parsed_url
_clean_url_query_paramsr(  effective_baser   r   r   r   _gpf_phr   _routed_clientr   _routed_headers	_explicit	_env_hintr   _pcfg_fb_entries_fb_resolved_fb_fb_explicit_key_fb_key_env
_fb_client	_fb_model_fb_headers_effective_baseheadersexisting_beta_FINE_GRAINEDkey_usedefb
tool_namesrequirementsmissing_reqsprompt_previewsourcetimestamp_str
short_uuidr   r   r   r   _load_agent_config
_agent_cfg_tlg_err
mem_configr   _mem_provider_name_MemoryManager	_load_mem_mp_init_kwargs_str   _profile_mpe_existing_tool_names_schema_tname_wrappedskills_config_agent_section_raw_api_retries_api_retries_compression_cfgcompression_threshold_cthresh_fn_model_cthreshr  compression_target_ratiocompression_protect_lastcompression_protect_first_aux_cfg_aux_context_config
_model_cfg_config_max_tokens_parsed_max_tokensr  r  r  r  _cp_ctx_resolved_target	_cp_entry_cp_url
_cp_models_cp_model_cfg_cp_ctx_parsed_selected_engine_engine_name_ctx_cfgr  _ce_load_errr  
_candidater   _plugin_ctx_lenr   _ctx_ce_err_ollama_num_ctx_override	_detectedexc_ccs                                                                                                                                                                                                     r$   
init_agentra  J   s~3   f EK)E .P1P1PE!E/E+E!E$;E!ENEN EEN E E E!4E
 EO'+E$1E1E+E,E-E+5=*''''2E^EN0:8S0I0IhhnnN^N^hHNN$$**,,,dhM"(bEN#.wE(0d0b11ENxxx!	>	)	)*	/	/	/*

 M11 E$999*'

U%=%K%K*	;	&	&=+@UE]atEtEt-$			%	%c	*	*	3	3L	A	A , .	9	$	$ ++,>?? 
%!%"7II 
% ,+   		
 	
 	
 	
 	
 	
 	
 	

 >!66666u{ENSSEK     	N000Nm++EN(b))//11<<_MM ,EN(b))//11<<\JJ , **,, ,
 '')) , ;; <   , + 5,-- 	+"((*** 	,&&%*B*B*D*D&.5577 	'&**,,,'%	
 	
 	
 %'''#9E  3E#9E #(E /E1E-E'E"7E'AE$+E/E
 #E8::EHLE' "'E#E-1E-2E*"**E +/E ) 0 0E ,/55E&/n&6&6E# EE"+."2"2E 0E/E+E'E(CE%%=E"(CE% .E/E "E-E%E"#4#:;;E-3E!&E 	,,.. >Eu= EAAAAAA,..$$%5r::@b{{;--<#E    (-E$$E &*Y[[E%3E&*E!"E ;?E !"E
 DCCCCCCCMcee01111 YZZZZ		  	 "E !&E &>%?%?E" $:#;#;E 
 .0E*
 '+E#+/E(
 =?E) #E %E 5U^U[QQ~---[[[[[[[[ !&) ;  '	[NNNNNNI&H(.VXYYM3@Q,,Q///kJ$.E!&D&DZ&P&PE#'0E$(0E%(-E%%EMEL#%E # Au{r|  A  A  A
 $)>[#@ L`uWG(?(?(A(AGRgngtrtM)EM'4E$(0E% KJJJJJBV(a(>(>(>\aE%&<&<]H^o&p&p&pE#EL#%E # [_u{___```  [S%7%7"%<%<Y}RaR/@YY]SUSVSVEWYYZZZ	-	-	- 	"DhnRTUU:G X 3 3A 6 6 6[*.'	EEEEEE,..$$Y3377RHHCww-.. L377;N3O3O L+./E+F(+,?(@3 3/ 77344 lNQRjNkE34JK777## L?B7|E3G< 	 	 	D	! 	|+0+JRPRIz5;zzW\Wlznwzzz{{{ Q	x Q	 #8,,K  K'(<(<2(<(F(FGG
! !(01B(C(C(I(I(K(K! ! !  ' *%2! ! -4 J J ,+<i(~..+0+<i((-f%%N$^_EE CCCCCC3C3C3E3E/00&~7QRR KKKKKK3K3KN3[3[/00&~7KLL 36553L3L3N3N/00&~7NOO EEEEEE3J3J3L3L/00&~~FF  "54/00 '~7GHH 36553M3M3O3O/00&~}EE LLLLLL3L3LW3U3U/00"-77FFFFFF$u~..C Us2 U;?@S;T;T&78    D 8 GFFFFF 7 7(&t!M !M !MNA)-5 #N$; < <! ! %0/@M),
 #*.:KT"R"R& X&-n>PRV&W&WO" M7;O7L7LM"34
 #^1r88::@@BB	 72R!R!R $-??#4#4 > > >IEEEEEE 1 5 5i @ @  BU%; B(-(>q(AI$    #%K!.$77 7' ''5' ' ' $ND99 7n>P>PQ[>\>\ 7aoasast{a|a| 7'5&6#(L* " ",/GGI,>,>,D"+K+K+M+M+UQU(/ ^+.779+=+=+]AWAW+][]*d*d*f*fK* ^359["3M3M3S3S3U3U3]Y] 00G0G
O3w<4.1ggj.A.A-=1 1 1-
I
 &1-0_EN*3*Cs7|EK8<E5+5+=,/
0C,D,D- -M  1<;Li 8*1*>OQU*V*VK#. \.5jBTVZ.[.[* UCGCTCT.? @+/L!E! 2" ( *` ` `2;` ` `  
 u&;UCC &)    - m//
B??@@FFHH /BB 		;xTYT_TeceSlSlSnSnGnGn#''(9::@bG#KK(:B??MDMM11  @5B2T2T]2T2TG.//2?G./3:/0%)))R88&**:u~FF	K 66}\bf6ggEL# 	FLu{LLMMM ECCCDDD(,,Y?? FK 7 7CMMB<N<NQ"1"QQ(233-QQRRRR  EiqX}X`adbdadXeXew}  E  E  E  F  F  F 	K 	K 	KIaIIJJJ	K .$'' #!
 !
%!
 !
 !
 
ND	)	) #n.@.@.L.L #Q_QcQcdkQlQl #!/ 0 "E '/De L LE8=8MWE1!44SWE bU%5 bu$%%**&q)BJ"W+JJJJJJKKKKS#e.C*D*DSSS,,``%J_`````a b b b %%,,)+# -  EK !UUE{ R!S!Su{!S!S!SE233
 	SVS%5%5VVtyy?T?TVVWWW   QO$))<L2M2MOOPPP  SQ499=N3O3OQQRRR RPQQQ { b5+ buu7799ZZL4F4F4H4HZZZ 	b`R^``aaa  0u'7 0./// $ _U-= _GJ5KhGiGilnGnGn6ss;eCCty  uR]]]]^^^   R)9 R) 	-en.K.K'FF+ 	-4FF,FPvPP9IPPPQQQ #,..E ;% +44_EEZ\\%bqb)
+::j:: ',&6BJ"#777777())))    "##K :-EN	N555"^.P9I.P.P.PPE 57E!1E".E 26E ;:::::--#.64	  E #E0E!"E %E., ( (E$ *)))))!	EGGGGGG''))

   


Q!<#05r:: "
 "

  Q Q QExPPPPPPPPQ
 48E0 E!E"'E#%E  !E E 	#"55J$.NN3CU$K$KE!*4..9OQV*W*WE'+.z~~>NPR/S/S+T+TE($ 5(C 5999999&1k&0nn5H$&O&O$.NN3Dd$K$K' ' '# #22444 	 	 	D	 !E :)9	)CM!U
B!?!?!?SU! 31&8&>&>&@&@ 31PPPPPPLLLLLL(6(8(8%i 233 <3++-- <)66s;;;(2 ,1&+&6$,$5'*?+<+<'='=)2	$ $L ( !!"'"3"E"EeFV"W"WC" D@C_ =( ! ! ! D! ~ A27.Y/' E494D[1~ A27.Y/' E494D[1' E494D[1' E494D[11 Y>C>X%:;OOOOOO#:#:#<#<9A%56:B%677$   8E)8HH<HHHEEL%%&FHZ[[[[EEL&&'XZlmmm,0E) 	) 	) 	)EEL  !I4PPP$(E!!!!!!	)  1!8 
  
[ 
  
  

 ,AACC 	1 	1G[[,,F &$888 *@@HKx((( 1&**6222$((000 #%E"x44&)-*;*;<UWY*Z*Z&[&[##   
  ^^GR00Nnd++ "0"4"45KV"T"TE)--.?CC+,,<++z"   )E
 "~~mR88&-- !"2"6"6{D"I"IJJZZZZZZ$U[11%$2!   .229dCCDDJJLLPdd$%5%9%9.$%O%OPP"#3#7#78H"#M#MNN !$	3##$5q99::! !:{M2NNN   (D!! #&ll+;<<"&	'"%&9":"::& 	' 	' 	'"&	'3FE0 ,,JJz4$@$@'^^L99)0$77 %$$%();%<%<"%**$$#5  z*   $$8 '	   =FX = = = 	      6;5EE$\2 *d## &!+0@!A!A!%)	*%()?%@%@"":& 	* 	* 	*EEL  2 '	   EF\ E E E Z	    &*"""	*"#EEEEEE;;JGG # # #&NN+=>>+T22 	# "# 0E %*;%
	$LLLLLLAAk!2     
   ?),-=)>)>& 	$ 	$ 	$#	$
 ")49NJen++C000G.  	!)T22 $==44:BB3GG w'11!*x!<!<J!*d33 &(2u{B(G(G%mT:: &&3&7&78H&I&IG&2!&.1'llG'.!||.8(8 (4(1:'> !& !& !&$'EEL$8$8)J ).W%& %& %& %*)]RWR] )] )]w~ )] )] )] .1Z	%& %& %& %& %& %&!& E $:E 	))*@AAA L4>z44P4PX:>>)R000VX||Hl;;K|    |##	eBBBBBB22<@@ 	e 	e 	eEELUWcdddddddd	e #HHHHHH6688
 2*/\"A"A'1$    #EEL  W   ##3 AAAAAA22K^E9b11"8^.
 
 
 	 --+*^E9b11^ 	. 	
 	
 	
  	QEEL8:J:OPPP#4+353!9#''^E9b11"8^^$
 $
 $
  !4E <;;;;;5+-=qAAD 
---@U[ @ @4L @ @*@N@ @ &-@ @ @
 
 	
  -0EEE$u*++ 10H 1U[Md 
  
[ 
  
  

 /@@BB 		1 		1G[[,,F &$888 *@@HKx((( 1&**6222044V<<<$((000 u*++ 
O0H 
O		O$55  1 12205k&u'?AQSTUU 6      	O 	O 	OEELDgNNNNNNNN	O !8In--5! ! !E E #$E&'E#!"EE!"E"#E&'E#'(E$%&E"'*E$ )E &E )-E#*d## D#->>2B#C#C +	d$'(@$A$AE!!:& 	d 	d 	dEELHJbccccc	d$$<Men<]<]$	K,U[%.RWR_RecefffI 2Y]](1% 	K 	K 	KEELDcJJJJJJJJ	K 	
7"
7 %,!$:::M!#9	
 	
 	
 !7 
U%5 
O!	
 	
 	

  y 	y  |)A)P  |  |  |il  nC  DG  nG  jH  jH  |  |  NS  Nf  Nw  |  |  |  |  }  }  }  }w)A)Pwwwwxxx
 "&E	..000 
"CNNN5)R00e233#7#(#A $C%+>>&sJGG%c9b99&sJGG%(%7'*';# E& ~---%%!&!9"'";"'";'
 '
 	 	 	 	 	 .-s  )I> >
J
J,J< <
K	K	'AY/ /
Y<;Y<=Ci   
ii6r 
rr51v' '
v43v4BC
AE* E*
AFE4AFFAFV AV? V?
AWWAWZAZ% Z%AZ4Z3AZ4Z8;A[4 [4
A\/[>'A\*\*A\/]&CAa a
AaaAaaCAi' d#&Ae
 e	Ai' e

AeeAi' eAeeA:Ai' gAg- g,Ai' g-
Ag:g7Ai' g9Ag:g:A,Ai' i'
Aj)i1.Aj$j$Aj)mA An n
An+n*An+o87Ap0 p0AqqAqr%As s
AssAsvAv vAv(v'Av(wAw, w,AxxAxyAAz zAA{;{:A{;|=A} }AA~/~.A~/~3A 6A?>A?@1BA ABAABAD=BEEA*BG	GBG	G3ABH9 H9
BIIBIIBI$ I$
BJI.'BJJBJJ%"BK K
BKKBKU"A#BW W
BXW(BW=W=BX[B[, [,;B\*\)B\*]5B^ ^
B_^(B^?^?B_ra  )@NNNNNNNNr'   r(   r)   NNFFFNr*   r'   NNNNFNNNNNNNNNNNNNNNNNNNNNNNNNNNFFFNNNNNFr+   r,   r-   F)|r.   r/   r0   r/   r1   r/   r2   r/   r3   r/   r4   r5   r6   r/   r7   r5   r8   r/   r9   r:   r;   r<   r=   r>   r?   r>   r@   rA   rB   rA   rC   rA   rD   r/   rE   r:   rF   r/   rG   r>   rH   r>   rI   r>   rJ   r/   rK   rA   rL   r/   rM   rN   rO   r/   rP   rQ   rR   rQ   rS   rQ   rT   rQ   rU   rQ   rV   rQ   rW   rQ   rX   rQ   rY   rQ   rZ   rQ   r[   rQ   r\   r:   r]   r^   r_   r/   r`   r^   ra   rb   rc   r/   rd   r/   re   r/   rf   r/   rg   r/   rh   r/   ri   r/   rj   r/   rk   rA   rl   rA   rm   rA   rn   r/   ro   rp   rq   r^   rr   rA   rs   r:   rt   r:   ru   r:   rv   rA   )<__doc__
__future__r   loggingr  r  r  rR  ro  r  r   pathlibr   typingr   r   r   r	   urllib.parser
   r   r   agent.context_compressorr   agent.iteration_budgetr   r  r   r  r   r   r   r   r   agent.process_bootstrapr   agent.subdirectory_hintsr   agent.think_scrubberr   agent.tool_guardrailsr   r   r   rl  r   hermes_cli.timeoutsr   hermes_constantsr   model_toolsr   r   utilsr    	getLoggerrx  r%   ra  __all__r   r&   r$   <module>rt     s%   & # " " " " "  				 				 



                   , , , , , , , , , , , , 7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 2 2 2 2 2 2 9 9 9 9 9 9              8 7 7 7 7 7 < < < < < < 7 7 7 7 7 7         
 & % % % % % < < < < < < , , , , , , H H H H H H H H ' ' ' ' ' ' 
	;	'	'   !%!"&#'#!#'#'#'!%(-$(37'+$('+"&#'!%"&*+/"& $'+(,-1#$$!*.%) %$&(+')!Co o o o of+ .r&   