o
    xi                     @   s   d dl 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mZ e
ddfdeeeef  ded	ed
edef
ddZdS )    N)ListDict   )OPENAI_API_KEYOPENROUTER_API_KEYDEFAULT_MODELMAX_RETRIES_LLMREQUEST_TIMEOUTg?i  messagesmodeltemperature
max_tokensreturnc                 C   s  d}t pt}|stdd| dd}|| ||d}ttD ]}zmt|}	d|	d< g }
d	}td
}tj	||	|t
dd}}|  |jddD ]i}|sQqK| }|rz t|ddd}||d  W d	   n1 sqw   Y  W n	 ty   Y nw |dr|tdd	 }n|}|dkr nzt|}W n	 ty   Y qKw t|tr|dr|rz+t|ddd}|d |t|dd  W d	   n1 sw   Y  W n	 ty   Y nw z|d}W n ty   ddi}Y nw  nz|dg d }|ddkrb|rbz)t|ddd}|d |t|d  W d	   n	1 s;w   Y  W n
 tyK   Y nw z|}W n ty^   ddi}Y nw W  nT|di }t|tr}|d}|r}|
| W qK|dp|d}|rt|tr|d}|r|
| nt|tr|
| W qK ty   Y qKw W d	   n	1 sw   Y  |
r*d|
 }|rzt|}W n ty   t|}Y nw |d | d! }|r%z&t|ddd}|d" ||d  W d	   n	1 sw   Y  W n
 ty$   Y nw |W   S tj	|||t
d#}z|  W nD ty}   td
}|r|z(t|ddd}|d$ ||jd  W d	   W  1 skw   Y  W   ty{   Y  w  w | }|d d d d  W   S  ty } zb|td% k rd&| }dd	l}|| nGtd
}|rz+t|ddd}|d' |t  |d W d	   n	1 sw   Y  W n
 ty   Y nw td(t d)|W Y d	}~qd	}~ww d	S )*zd
    Send a list of messages to the LLM (via OpenRouter) and return the assistant's text reply.
    z-https://openrouter.ai/api/v1/chat/completionszFNo OpenRouter API key found. Set OPENROUTER_API_KEY or OPENAI_API_KEY.zBearer zapplication/json)AuthorizationzContent-Type)r   r
   r   r   TstreamNOPENROUTER_STREAM_LOG)jsonheaderstimeoutr   )decode_unicodeazutf-8)encoding
zdata: z[DONE]errorz==STREAM_ERROR==
messagezunknown stream errorchoicesr   finish_reasonz==CHOICE_FINISH_ERROR==
zchoice signalled errordeltacontenttext z

<<STREAM_ERROR:z>>z==ASSEMBLED==
)r   r   r   z==NONSTREAM_RESPONSE==
r      z==EXCEPTION==
z OpenRouter request failed after z
 attempts.) r   r   RuntimeErrorranger   dictosgetenvrequestspostr	   raise_for_status
iter_linesstripopenwrite	Exception
startswithlenr   loads
isinstancegetdumpsappendstrjoinr   timesleep	traceback
format_exc)r
   r   r   r   urlkeyr   payloadattemptstream_payloadpiecesstream_errorlog_pathsrespraw_linelinelf
event_dataevchr   content_piecemsgcont	assemblederr_textrespdataexcbackoffr8    rT   3/var/www/apps/myagent/mysuperagent/agent_src/llm.pychat_completion   sJ  









M





rV   )r   r%   r:   r'   typingr   r   	constantsr   r   r   r   r	   r6   floatintrV   rT   rT   rT   rU   <module>   s(    