o
    xiZ"                     @   s8  d dl Z d dlZd dlmZmZ ddlmZ d dlZddlm	Z	 ddl
mZ ddlmZmZ ddlmZ d dlZd dlZd	ed
eeef fddZG dd dZedkrd dlZejddZejdddd ejdddd ejdeddd e ZejrdejZ ne!d" Z eej#ej$dZ%e%&e  dS dS )     N)DictAny   )chat_completion)system_prompt)build_tool_registry)
CLIAdapterUserInterfaceAdapter)ui_statetextreturnc                 C   s  |  dr%| d}t|dkr%|d  } |   dr%| dd  } zt| W S  tjy   | d}|dkr= d	}t	|t| D ]9}| | dkrS|d7 }qF| | d
kr|d8 }|d	kr| ||d  }z
t|W    Y S  tjy~   Y   w qF w )z<Extract raw JSON from optional markdown fences and parse it.z```   r   json   N{r   })

startswithsplitlenstriplowerr   loadsJSONDecodeErrorfindrange)r   partsstartdepthi	candidate r!   5/var/www/apps/myagent/mysuperagent/agent_src/agent.pyparse_json_response   s:   



r#   c                   @   sR   e Zd ZddededefddZdd	d
ZdeddfddZdedefddZ	dS )AgentNd   model	max_steps
ui_adapterc                 C   s@   |pd| _ || _|pt | _t| j| _tt| j | _	dS )u   
        Args:
            model: OpenAI model name (defaults to gpt-3.5-turbo).
            max_steps: safety cap – maximum number of tool‑call cycles.
        z qwen/qwen-2.5-coder-32b-instructN)
r&   r'   r   r(   r   toolsr   listvalues
system_msg)selfr&   r'   r(   r!   r!   r"   __init__5   s
   
zAgent.__init__r   c                 C   s  t t}|d| t|| jd D ]Z}t|| jd}|d|| td| d| d |	d|d	 zt
|}W nr tjtfy } zcd
d l}|d|}	|	r|	d}
d|
i}|d||j}|rqd|di|d< n4|d|}|r|d d }d|i|d< ni |d< n|d| td|  W Y d }~ nW Y d }~nd }~ww d|v r|d|d  td td t|d  |d   S |d}
|di }|
r|
| jvrtd|   n| j|
 }|d|
| td|
 d|  ||}t|trZ|drZ|d }|d}|	dd|
 d| d d	 t|||
|| j| j|tj  d! d"tj|< |d#||
|pMd$d d%  ||d&  S |	dd|
 d'| d	 |d(|
 q| d) td* d S )+Nz"Agent run loop starting at step %sr   )r&   u   Step %s – Model reply: %su   
🧠 Step u    – Model reply:

	assistantrolecontentr   z"tool"\s*:\s*"([^\"]+)"toolz"expression"\s*:\s*"([^\"]+)"
expressionargsz"expression"\s*:\s*([^,\n\}]+)"z#Failed to parse JSON from model: %su%   ❌ Failed to parse JSON from model: final_answerzFinal answer found: %su   
✅ Task solved!
u   🗣️ Final answer:
u   ❌ Invalid tool request: zCalling tool %s with args: %su   🔧 Calling tool **z** with args: awaitingpromptTool result for **z"**:
(Awaiting user response token )Z)messagesstep	tool_name	tool_argsr&   r'   r:   
created_atz,Saved pending token %s for tool %s prompt=%s    )r9   r:   z**:
zAppended tool result for %sz,Reached maximum steps without a final answeru5   
⚠️ Reached maximum steps without a final answer.)!logging	getLogger__name__infor   r'   r   r&   printappendr#   r   r   
ValueErrorresearchgroupDOTALLr   errorgetr)   run
isinstancedictcopydeepcopydatetimeutcnow	isoformatr
   PENDINGwarning)r-   r>   
start_steploggerr?   assistant_replypayloaderL   m_toolr@   m_exprm_expr2exprrA   r4   tool_resulttokenr:   r!   r!   r"   	_run_loop@   s~   








zAgent._run_loopuser_instructionr   c                 C   s$   d| j dd|dg}| j|ddS )Nsystemr1   userr   r\   )r,   rg   )r-   rh   r>   r!   r!   r"   rR      s   
z	Agent.runrf   user_answerc                 C   s   t t}tj|}|s|d| ddiS |d }|d }|dd| d| d	 |d
| tj|= |ddd }| j	||dS )Nz#Resume called with unknown token %srP   zunknown tokenr>   r@   r0   r;   u   **:
🗣️  User answered: r1   z'Resuming token %s; appended user answerr?   r   rk   )
rE   rF   rG   r
   rZ   rQ   rP   rJ   rH   rg   )r-   rf   rl   r]   pendingr>   r@   r\   r!   r!   r"   resume   s   
zAgent.resume)Nr%   N)r   )
rG   
__module____qualname__strintr	   r.   rg   rR   rn   r!   r!   r!   r"   r$   4   s
    
Sr$   __main__z4Demo AI agent that can call simple tools via OpenAI.)descriptioninstruction*zAUser instruction (if omitted you will be prompted interactively).)nargshelpz--modelz5Explicit OpenAI model name (default = gpt-3.5-turbo).)defaultrx   z--stepsr%   u+   Maximum tool‑call loops before giving up.)typery   rx    u   🗨️  Enter your request: )r&   r'   )'r   rE   typingr   r   llmr   base64promptsr   r)   r   
interfacesr   r	   rC   r
   rU   rW   rq   r#   r$   rG   argparseArgumentParserparseradd_argumentrr   
parse_argsr6   ru   join
user_instrinputr   r&   stepsagentrR   r!   r!   r!   r"   <module>   sR   "{