o
    $i%                     @   sJ  U d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	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mZ ddlmZmZ dd	lmZ eeZed
ee e_ ej!"ej!#e$dZ%de	eef fddZ&de	eef ddfddZ'eG dd dZ(i Z)e	ee(f e*d< d?dee defddZ+e,ddd Z-ej,ddgddd Z.ej,d dgdd!d" Z/d#ed$ed%ed&e(de	eef f
d'd(Z0ej,d)d*gdd+d, Z1ej,d-dgdd.d/ Z2ej,d0d*gdd1d2 Z3ej,d0dgdd3d4 Z4ej,d5d6gdd7d8 Z5ed9kr#e6ed:d;Z7ej8d<e7d=d> dS dS )@z1
Flask web application for the OpenRouter Agent.
    N)	dataclassfield)AnyDictListOptional)Flaskjsonifyrequestrender_template)OpenRouterAgent)MessageRole)get_builtin_toolsset_working_directory)get_custom_tools
SECRET_KEYzprompts.jsonreturnc               	   C   sj   t jtr3zttd} t| W  d   W S 1 sw   Y  W i S  tjtfy2   i  Y S w i S )zLoad saved prompts from filerN)	ospathexistsPROMPTS_FILEopenjsonloadJSONDecodeErrorIOError)f r   -/var/www/apps/myagent/mysuperagent/web/app.pyload_prompts   s   $r!   promptsc                 C   s@   t td}tj| |dd W d   dS 1 sw   Y  dS )zSave prompts to filew   )indentN)r   r   r   dump)r"   r   r   r   r    save_prompts$   s   "r'   c                   @   s@   e Zd ZU dZeed< eedZe	e
 ed< dZee ed< dS )AgentSessionz Stores agent state for a sessionagent)default_factoryconversation_historyNpending_question)__name__
__module____qualname____doc__r   __annotations__r   listr+   r   r   r,   r   strr   r   r   r    r(   *   s
   
 r(   sessionsworking_directoryc                 C   sN   t d}|std| rt|  t }|t  t|t dddd|dS )z)Create an agent with all tools registeredOPENROUTER_API_KEYzOPENROUTER_API_KEY not setOPENROUTER_MODELzqwen/qwen3-coder-nextgffffff?   )api_keymodeltemperaturemax_iterationstools)r   getenv
ValueErrorr   r   updater   r   )r5   r9   r=   r   r   r    create_agent5   s   

rA   /c                   C   s   t dS )zServe the main pagez
index.html)r   r   r   r   r    indexJ   s   rC   z	/api/chatPOST)methodsc                  C   s   t  } | dd}| d}| d}|r|tvr,tt }t|}t|dt|< nt| j	}t| j
|_
t| jrCtdddS t| }d	}t||||}|j
|_
td|i|S )
zHandle chat messagesmessage 
session_idr5   )r)   errorz(Please answer the pending question firsttyperF   You are a helpful AI assistant with access to various tools.
    When asked a question, use the available tools to gather information or perform actions.
    Always be concise and helpful in your responses.)r
   get_jsongetr4   r3   uuiduuid4rA   r(   r)   r+   r,   r	   run_agent_with_handling)datauser_messagerH   r5   r)   sessionsystem_promptresultr   r   r    chatP   s0   



rW   z/api/chat/respondc                  C   s   t  } | d}| dd}|r|tvrtdddS t| }|js*tdddS |j}d|_d	| d
| }d}t|j|||}|jj|_td|i|S )zRespond to a pending questionrH   responserG   rI   zInvalid sessionrJ   zNo pending questionNzUser's answer to 'z': rL   )	r
   rM   rN   r4   r	   r,   rQ   r)   r+   )rR   rH   rX   rT   questionrS   rU   rV   r   r   r    chat_respondw   s2   

rZ   r)   
user_inputrU   rT   c                 C   s  |rt dd | jD s| ttj|d | ttj|d d}d}|| jk r|d7 }dd | jD }d}| jrEd	d | j	 D }| 
||}|d
 d }	|	d }
d|
v r|
d rttj|
d|
d d}| | |
d D ]w}|d d }|d d }t|trddl}||}n|}|dkr|dd}||_d|d  S || jv r| j| j}z	|di |}W n ty } zdt| }W Y d}~n
d}~ww d| }ttjt||d d}| | qsq$ttj|
ddd}| | |
dd}	 |du r
d}d|dS )z/Run the agent, handling ask_user tool speciallyc                 s   s    | ]	}|j tjkV  qd S N)roler   SYSTEM).0mr   r   r    	<genexpr>   s    z*run_agent_with_handling.<locals>.<genexpr>r]   contentr   N   c                 S      g | ]}|  qS r   to_dict)r_   msgr   r   r    
<listcomp>       z+run_agent_with_handling.<locals>.<listcomp>c                 S   re   r   rf   )r_   toolr   r   r    ri      rj   choicesrF   
tool_callsrc   )r]   rc   rm   functionname	argumentsask_userrY   rG   
need_input)rK   rY   zError: zError: Unknown tool id)r]   rc   tool_call_idz2Maximum iterations reached without final response.rX   rJ   r   )anyr+   add_messager   r   r^   USERr<   r=   values_make_api_call	ASSISTANTrN   
isinstancer3   r   loadsr,   rn   	ExceptionTOOL)r)   r[   rU   rT   	iterationfinal_responsemessages
tools_listrX   choicerF   assistant_message	tool_call	func_namefunc_args_rawr   	func_argsrY   funcrV   etool_messager   r   r    rQ      s|   







rQ   z/api/chat/historyGETc                  C   sn   t jd} | r| tvrtdg iS g }t|  jjD ]}|t|j	dr(|j	j
n|j	|jd qtd|iS )zGet conversation historyrH   historyvaluerb   )r
   argsrN   r4   r	   r)   r+   appendhasattrr]   r   rc   )rH   r   rh   r   r   r    chat_history   s   
r   z/api/chat/clearc                  C   s0   t  } | d}|r|tv rt|= tddiS )zClear a sessionrH   statusok)r
   rM   rN   r4   r	   )rR   rH   r   r   r    
chat_clear  s
   
r   z/api/promptsc                  C   s   t  } td| iS )zGet all saved promptsr"   )r!   r	   )r"   r   r   r    get_prompts  s   r   c                  C   st   t  } | dd }| dd }|stddidfS |s(tddidfS t }|||< t| td|d	S )
zSave a new promptro   rG   promptrI   zPrompt name is requiredi  zPrompt content is requiredr   )r   ro   )r
   rM   rN   stripr	   r!   r'   )rR   ro   r   r"   r   r   r    save_prompt!  s   r   z/api/prompts/<prompt_name>DELETEc                 C   s8   t  }| |v r|| = t| tddiS tddidfS )zDelete a saved promptr   r   rI   zPrompt not foundi  )r!   r'   r	   )prompt_namer"   r   r   r    delete_prompt4  s   r   __main__PORTi  z0.0.0.0T)hostportdebugr\   )9r0   r   rO   r   dataclassesr   r   typingr   r   r   r   flaskr   r	   r
   r   
core.agentr   core.modelsr   r   core.tools.builtinr   r   core.tools.customr   r-   appr>   r3   rP   
secret_keyr   joindirname__file__r   r!   r'   r(   r4   r1   rA   routerC   rW   rZ   rQ   r   r   r   r   r   intr   runr   r   r   r    <module>   sf    

&
'

]






