o
    i)                     @  s   d Z ddlm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 ddlmZ ddlmZmZ ed	Zee jd
 Zed d d Zd5ddZd6ddZd7ddZd8ddZd9d!d"Zd:d$d%Zd;d*d+Zd<d-d.Zd=d0d1Zd>d3d4Z dS )?z1Centralized OpenAI client for the platform layer.    )annotationsN)Path)Any)OpenAI)convert_from_bytes)get_platform_loggerlog_structuredai   platformsecretsopenai_keysgpt-4o-minic              
   C  s   |pi }t |}t|d}t|||d}|jjjdi |}d}	|jr2|jd jr2|jd jjp1d}	t	|	|d}
t
|}ttdt| pCi dtrU| pLi dpQi dnd	|||d
t| trh| pdi dnd	d |
|dS )zBExecute an OpenAI request and return normalized output plus usage.)api_key)promptmodeloptions r   contentr   ai_usagetenant	tenant_idNtotal_tokens
request_id)r   app_idr   tokensr   )outputusage )_resolve_api_keyr   _build_request_kwargschatcompletionscreatechoicesmessager   _normalize_output_extract_usager   logger
isinstancegetdict)contextr   r   r   r   r   clientrequest_kwargsresponser   r   r   r   r   7/var/www/html/flask_server/platform/ai/openai_client.pyrun_llm   s,   
.r2   r   strreturnc                 C  s   t ddt| pd d}tt|  d }ttd }|s&t }t	
d| }t	
dp7t	
d}|p?|p?|p?|}|sItd	| |S )
Nz
[^A-Z0-9]+_r   z.keydev.keyOPENAI_API_KEY_OPENAI_API_KEY_DEVOPENAI_API_KEYz"Missing OpenAI API key for app_id=)resubr3   upperstrip_read_key_file	_KEYS_DIRlower_seed_dev_key_from_envosgetenvRuntimeError)r   
normalizedapp_keydev_keyenv_app_keyenv_dev_keyr   r   r   r1   r    6   s    r    pathr   
str | Nonec                 C  sD   z
| j dd }W n ty   Y d S  ty   Y d S w |p!d S )Nutf-8encoding)	read_textr=   FileNotFoundErrorOSError)rJ   valuer   r   r1   r>   G   s   r>   c                  C  s   t dp	t d} | sd S z$tjddd td }| s.|j|  d dd W |  S W |  S  ty?   |   Y S w )	Nr8   r9   T)parentsexist_okr6   
rL   rM   )rB   rC   r?   mkdirexists
write_textr=   rQ   )r   dev_key_pathr   r   r1   rA   Q   s   rA   r   r   r   dict[str, Any]c                 C  s<   |dt | |ddgd}|d}|dkrddi|d< |S )Nuser)r   r   )roler   )r   messagesresponse_formatjson_objecttype)_build_contentr+   )r   r   r   r/   r^   r   r   r1   r!   b   s   


r!   list[dict[str, Any]]c                 C  sp   d| dg}| d}|r6t|| dpdd\}}dd l}||d}|d	d
d| d| id |S )Ntext)r`   rc   
file_bytesmimetypezapplication/octet-streamrd   re   r   rL   	image_urlurlzdata:z;base64,)r`   rg   )r+   _prepare_visual_inputbase64	b64encodedecodeappend)r   r   r   rd   re   rj   b64r   r   r1   ra   s   s   

ra   rd   bytesre   tuple[bytes, str]c                 C  s   |dkr
t | dfS | |fS )Nzapplication/pdfz	image/png)_pdf_first_page_to_pngrf   r   r   r1   ri      s   ri   	pdf_bytesc                 C  sJ   t | ddddd}|stdddlm} | }|d j|dd	 | S )
N   png   )dpifmt
first_page	last_pagez(PDF conversion failed: no pages renderedr   )BytesIOPNG)format)r   rD   iorz   savegetvalue)rr   pagesrz   bufr   r   r1   rq      s   rq   r   c                 C  s:   | ddkrzt| W S  ty   d| i Y S w | S )Nr^   r_   _raw)r+   jsonloads	Exceptionr   r   r   r1   r'      s   r'   dict[str, int]c                 C  s\   t | dd }|d u rddddS tt |ddpdtt |ddp!dtt |ddp*ddS )Nr   r   )input_tokensoutput_tokensr   prompt_tokenscompletion_tokensr   )getattrint)r0   r   r   r   r1   r(      s   r(   )r   N)r   r3   r4   r3   )rJ   r   r4   rK   )r4   rK   )r   r3   r   r3   r   rZ   r4   rZ   )r   r3   r   rZ   r4   rb   )rd   ro   re   r3   r4   rp   )rr   ro   r4   ro   )r   r3   r   rZ   )r4   r   )!__doc__
__future__r   r   rB   r:   pathlibr   typingr   openair   	pdf2imager    platform.logging.platform_loggerr   r   r)   __file__resolverS   _PROJECT_ROOTr?   r2   r    r>   rA   r!   ra   ri   rq   r'   r(   r   r   r   r1   <module>   s.    

 







	