o
    `qpj                     @  sl   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m	Z	 ddddZ
ddddZe
edZdddZdS )zCloud LLM backends (Gemini, Qwen) as optional online mode.

Zero external dependencies - uses only urllib from stdlib.
Falls back gracefully if network is unavailable.
    )annotationsN   )build_promptpromptstrapi_key
str | Nonereturnc                 C  s   |pt jdd}|stdd| }tdd| igigddd	d
 }tjj	||ddid}tjj
|dd}t| }W d   n1 sLw   Y  |d d d d d d  S )z=Generate via Google Gemini 3.5 Flash API (free tier: 15 RPM).GEMINI_API_KEY zEGEMINI_API_KEY not set. Get one at https://aistudio.google.com/apikeyz]https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=partstext皙?,  )temperaturemaxOutputTokens)contentsgenerationConfigContent-Typeapplication/jsondataheaders   timeoutN
candidatesr   contentosenvirongetRuntimeErrorjsondumpsencodeurllibrequestRequesturlopenloadsreadstripr   r   keyurlpayloadreqrespr    r3   8/root/openrights-assistant/openrights/cloud_generator.pygenerate_gemini   s,   
 r5   c                 C  s   |pt jdd}|stdd}tdd| dgdd	d
 }tjj	||dd| dd}tjj
|dd}t| }W d   n1 sJw   Y  |d d d d  S )z6Generate via Qwen API (DashScope compatible endpoint).QWEN_API_KEYr   zFQWEN_API_KEY not set. Get one at https://dashscope.console.aliyun.com/zBhttps://dashscope.aliyuncs.com/compatible-mode/v1/chat/completionsz
qwen-turbouser)roler   r   r   )modelmessagesr   
max_tokensr   zBearer )r   Authorizationr   r   r   Nchoicesr   messager   r   r-   r3   r3   r4   generate_qwen+   s.   
r?   )geminiqwenproviderquestionresults
list[dict]c              
   K  s   | t vrtd|  dtt  t||}zt |  |fi |W S  tjjtfy< } zd| dW  Y d}~S d}~w tyQ } z
t	|W  Y d}~S d}~ww )z9Unified cloud generation with automatic fallback message.zUnknown provider 'z'. Available: z[Cloud unavailable: z$. Use --model for offline LLM mode.]N)
	PROVIDERS
ValueErrorlistr   r&   errorURLErrorOSErrorr"   r   )rB   rC   rD   kwargsr   er3   r3   r4   generate_cloudM   s   
rN   )N)r   r   r   r   r	   r   )rB   r   rC   r   rD   rE   r	   r   )__doc__
__future__r   r#   r   urllib.requestr&   urllib.error	generatorr   r5   r?   rF   rN   r3   r3   r3   r4   <module>   s    