Ë
    Åq´j~v  ã                  ó0  — U 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
mZ d dlmZmZmZ ddd	g d
¢dddœdddddgdddœddddgdddœdœZded<   dZddgZdRd„ZdSd „ZdTd!„ZdUd"„ZdVdWd#„ZdXd$„ZdVdYd%„ZdZd&„Zd[d'„Zd\d(„Zd]d)„Zd^d*„Z d_d+„Z!d`d,„Z"dad-„Z#dbd.„Z$dVdcd/„Z%ddd0„Z&dedfd1„Z'dddd2œ	 	 	 	 	 dgd3„Z(dhd4„Z)dddd5œdid6„Z*ddd7œ	 	 	 	 	 djd8„Z+d9d:d;g d<¢d=œd>d;id>d;id?d>d;id@œd?d>d;id@œd>dAidBœg dB¢dCœZ,d9d:d9d:d>d;id>d;id>d;id>d;idDœg dD¢dCœd?e,d@œdEœdFdGgdCœZ-d9d:d;g dH¢d=œd>dAid?d>d;id@œd>d;idIœg dI¢dCœZ.d9d:d9d:d>d;id>d;id>d;id>dAidJœg dJ¢dCœd?d9d:d>d;id>d;id>d;idKœg dK¢dCœd@œd?d9d:d>d;id>d;id>dAidLœg dL¢dCœd@œd?d>d;id@œdMœg dM¢dCœZ/dkdN„Z0dldO„Z1ddPœdmdQ„Z2y)né    )ÚannotationsN)ÚAny)Úconnect)Úinit_core_schemaÚutc_now)Ú
configuredÚload_secretÚsave_secretz	Groq Freezhttps://api.groq.com/openai/v1úopenai/gpt-oss-120b)r   zopenai/gpt-oss-20bzqwen/qwen3.8-27bu6   Free tier; Ð¾Ñ�Ð½Ð¾Ð²Ð½Ð¾Ð¹ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€ ORIGUS.u¦   Ð”Ð»Ñ� Ñ€Ð°Ð±Ð¾Ñ‡Ð¸Ñ… Ð´Ð°Ð½Ð½Ñ‹Ñ… Ð¸Ñ�Ð¿Ð¾Ð»ÑŒÐ·ÑƒÐ¹ Ð½Ð°Ñ�Ñ‚Ñ€Ð¾Ð¹ÐºÐ¸ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð° Groq Ð¸ Ð¿Ñ€Ð¾Ð²ÐµÑ€Ñ�Ð¹ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½ÑƒÑŽ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÑƒ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ�.)ÚnameÚbase_urlÚdefault_modelÚmodelsÚ	free_noteÚprivacy_notezGemini Freez8https://generativelanguage.googleapis.com/v1beta/openai/zgemini-3.6-flashzgemini-3.5-flash-liteuA   Ð‘ÐµÑ�Ð¿Ð»Ð°Ñ‚Ð½Ñ‹Ð¹ tier; Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ñ‹Ð¹ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€.uœ   Free tier Ð¼Ð¾Ð¶ÐµÑ‚ Ð¸Ð¼ÐµÑ‚ÑŒ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÑŽÑ‰Ð¸ÐµÑ�Ñ� ÑƒÑ�Ð»Ð¾Ð²Ð¸Ñ� Ð¸Ñ�Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ� Ð´Ð°Ð½Ð½Ñ‹Ñ…; Ð²ÐºÐ»ÑŽÑ‡Ð°Ð¹ fallback Ð¾Ñ�Ð¾Ð·Ð½Ð°Ð½Ð½Ð¾.zOpenRouter Freezhttps://openrouter.ai/api/v1zopenrouter/freeu>   Ð‘ÐµÑ�Ð¿Ð»Ð°Ñ‚Ð½Ñ‹Ð¹ Ñ€ÐµÐ·ÐµÑ€Ð²; Ð»Ð¸Ð¼Ð¸Ñ‚Ñ‹ Ð½Ð¸Ð¶Ðµ Groq.u¢   ÐœÐ°Ñ€ÑˆÑ€ÑƒÑ‚Ð¸Ð·Ð°Ñ†Ð¸Ñ� Ð¸Ð´Ñ‘Ñ‚ Ðº Ñ�Ñ‚Ð¾Ñ€Ð¾Ð½Ð½Ð¸Ð¼ model providers; Ð¸Ñ�Ð¿Ð¾Ð»ÑŒÐ·ÑƒÐ¹ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ÐµÑ�Ð»Ð¸ Ñ�Ñ‚Ð¾ Ð´Ð¾Ð¿ÑƒÑ�Ñ‚Ð¸Ð¼Ð¾ Ð´Ð»Ñ� Ð´Ð°Ð½Ð½Ñ‹Ñ….)ÚgroqÚgeminiÚ
openrouterzdict[str, dict[str, Any]]Ú	PROVIDERSr   r   r   c                ó�   — t         j                  | xs dj                  «       j                  «       «      }|st	        d| › �«      ‚|S )NÚ u.   Ð�ÐµÐ¸Ð·Ð²ÐµÑ�Ñ‚Ð½Ñ‹Ð¹ AI-Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€: )r   ÚgetÚstripÚlowerÚRuntimeError)ÚkeyÚitems     úJ/var/www/origus_pro_usr/data/www/origus.pro/core/connectors/ai_provider.pyÚ	_providerr   /   sA   € Ü�=‰=˜#š) ×*Ñ*Ó,×2Ñ2Ó4Ó5€DÙÜÐKÈCÈ5ÐQÓRÐRØ€Kó    c                 óÂ  — t        «        t        «       5 } | j                  d«      j                  «       D �ci c]  }t	        |d   «      t        |«      “Œ }}d d d «       g }t        j                  «       D ]Ä  \  }}j                  |«      xs i }	 t        j                  |j                  d«      xs d«      }|j                  ||d   |d   |d   |d   |d	   |d
   t        |«      |j                  d«      xs d|j                  d«      |j                  d«      |j                  d«      xs |d   |dœ«       ŒÆ |S c c}w # 1 sw Y   ŒíxY w# t        $ r i }Y Œ£w xY w)Nz2SELECT * FROM connectors WHERE connector_type='ai'Úconnector_keyÚ	meta_jsonz{}r   r   r   r   r   r   ÚstatusÚnot_configuredÚlast_test_atÚ
last_errorÚmodel)r   r   r   r   r   r   r   r   r$   r&   r'   r(   Úmeta)r   r   ÚexecuteÚfetchallÚstrÚdictr   Úitemsr   ÚjsonÚloadsÚ	ExceptionÚappendÚsecret_configured)ÚconÚxÚrowsÚresultr   ÚcfgÚrowr)   s           r   Úprovider_catalogr:   6   sl  € ÜÔÜ	‹ð 
�cð —[‘[ØDóç‰h‹jö	
àô ��/Ñ"Ó#¤T¨!£WÑ,ð
ˆð 
÷
ð €FÜ—O‘OÓ%ò ‰ˆˆSØ�H‰H�S‹MÒ˜Rˆð	Ü—‘˜CŸG™G KÓ0Ò8°DÓ9ˆDð 	�‰ØØ�v‘;Ø˜:‘Ø Ñ0Ø˜‘]Ø˜KÑ(Ø˜~Ñ.Ü*¨3Ó/Ø—W‘W˜XÓ&Ò:Ð*:ØŸ7™7 >Ó2ØŸ™ Ó.Ø—H‘H˜WÓ%Ò=¨¨_Ñ)=Øñ
õ 	ðð* €Mùò;
÷
ð 
ûô ò 	ØŠDð	ús.   •"E·D?ÁEÂ(EÄ?EÅEÅEÅEc                 ó¶  — t        «        t        «       5 } | j                  d«      j                  «       }d d d «       st        dt
        dœS 	 t        j                  |d   xs d«      }|D �cg c]  }|t        v sŒ||d   k7  sŒ|‘Œ }}|d   t        v r|d   nt        t        |d   «      ||d   d	œS # 1 sw Y   Œ�xY w# t        $ r	 t
        }Y Œhw xY wc c}w )
Nz+SELECT * FROM ai_settings WHERE singleton=1F)Úprimary_providerÚfallback_enabledÚfallback_orderÚfallback_order_jsonz[]r<   r=   Ú
updated_at)r<   r=   r>   r@   )r   r   r*   ÚfetchoneÚDEFAULT_PRIMARYÚDEFAULT_FALLBACKr/   r0   r1   r   Úbool)r4   r9   Úorderr5   s       r   Úrouting_settingsrF   Y   sñ   € ÜÔÜ	‹ð �cØ�K‰KØ9ó
ç
‰(‹*ð 	÷ñ ä.Ø$Ü-ñ
ð 	
ð
Ü�j‰j˜Ð2Ñ3Ò;°tÓ<ˆð Ö
O�˜q¤Iš~°!°sÐ;MÑ7NÓ2NŠ1Ð
O€EÐ
Oà69Ð:LÑ6MÔQZÑ6Z˜3Ð1Ò2Ô`oÜ Ð$6Ñ 7Ó8ØØ˜Ñ&ñ	ð ÷ð ûô ò ÜŠðüâ
Os/   • B5ÁC Á.CÁ<CÂCÂ5B>ÃCÃCc           
     ó  — t        «        | xs dj                  «       j                  «       }t        |«       g }|D ]I  }|xs dj                  «       j                  «       }|t        v sŒ.||k7  sŒ4||vsŒ9|j                  |«       ŒK t        «       5 }|j                  d||rdndt        j                  |d¬«      t        «       f«       |j                  «        d d d «       t        «       S # 1 sw Y   t        «       S xY w)Nr   a©  
            INSERT INTO ai_settings(singleton,primary_provider,fallback_enabled,fallback_order_json,updated_at)
            VALUES(1,?,?,?,?)
            ON CONFLICT(singleton) DO UPDATE SET
              primary_provider=excluded.primary_provider,
              fallback_enabled=excluded.fallback_enabled,
              fallback_order_json=excluded.fallback_order_json,
              updated_at=excluded.updated_at
        é   r   F©Úensure_ascii)r   r   r   r   r   r2   r   r*   r/   Údumpsr   ÚcommitrF   )r<   r=   r>   ÚprimaryÚcleanr   r4   s          r   Úsave_routing_settingsrO   r   së   € ÜÔØÒ# ×*Ñ*Ó,×2Ñ2Ó4€GÜˆgÔØ
€EØò ˆØŠY�B×ÑÓ×%Ñ%Ó'ˆØ”)Ò  w£°3¸eÒ3CØ�L‰L˜Õðô 
‹ð 
�cØ�‰ð ð Ñ*‘Q°´$·*±*¸UÐPUÔ2VÔW^ÓW`Ðaô	cð 	�
‰
Œ÷
ô ÓÐ÷
ô ÓÐús   ÂAC,Ã,C>c                ó¾  — t        «        | xs dj                  «       j                  «       }t        |«      }|xs dj                  «       }|st	        d«      ‚|xs |d   j                  «       }t        |||dœ«       t        «       5 }|j                  dt        j                  d|id¬«      |f«       |j                  «        d d d «       d	||d
œS # 1 sw Y   ŒxY w)Nr   u   API key Ð¾Ð±Ñ�Ð·Ð°Ñ‚ÐµÐ»ÐµÐ½.r   )Úapi_keyr(   z‰
            UPDATE connectors
            SET status='configured',last_error=NULL,meta_json=?
            WHERE connector_key=?
        r(   FrI   T)ÚokÚproviderr(   )r   r   r   r   r   r
   r   r*   r/   rK   rL   )rS   rQ   r(   r   r8   Úchosenr4   s          r   Úconfigure_providerrU   ‰   sÖ   € ÜÔØ	Š�R×ÑÓ ×&Ñ&Ó(€CÜ�#‹€CØŠ]˜×!Ñ!Ó#€GÙÜÐ:Ó;Ð;ØÒ)�S˜Ñ)×0Ñ0Ó2€FÜ�˜w¨vÑ6Ô7Ü	‹ð �cØ�‰ð ô �Z‰Z˜ Ð(°eÔ<¸SÐAô		Cð
 	�
‰
Œ÷ð  ¨VÑ4Ð4÷ð ús   Â	<CÃCc                óè  — t        | dd«      }t        | dd«      }t        | dd«      }|€|�	 |j                  «       }i }t	        |t
        «      rP|j                  d«      }t	        |t
        «      r|}n¼|�dt        |«      i}n¬|rªdt        j                  |d¬«      i}n�|rŽt        |«      j                  «       }	 t        j                  |«      }t	        |t
        «      r|j                  d«      nd}t	        |t
        «      r|}n)t	        |t
        «      rdt        j                  |d¬«      i}|j                  d«      st        | «      |d<   |t        |j                  d«      xs t        | «      «      t        |j                  d	«      xs d
«      t        |j                  d«      xs d
«      dœS # t        $ r# 	 |j                  }n# t        $ r d}Y nw xY wY �Œ w xY w# t        $ r d|i}Y ŒÁw xY w)zKExtract an OpenAI-compatible HTTP error without depending on SDK internals.Ústatus_codeNÚbodyÚresponseÚerrorÚmessageFrI   Útyper   Úcode)rW   r[   r\   r]   )Úgetattrr/   r1   ÚtextÚ
isinstancer-   r   r,   rK   r   r0   )Úexcr$   rX   rY   rZ   Ú	candidateÚrawÚparseds           r   Ú_error_payloadre   œ   sÈ  € ä�S˜-¨Ó.€FÜ�3˜ Ó%€DÜ�s˜J¨Ó-€Hà€|˜Ð,ð	Ø—=‘=“?ˆDð €EÜ�$œÔØ—H‘H˜WÓ%ˆ	Ü�i¤Ô&Ø‰EØÐ"Ø¤ I£Ð/‰EÙØ¤§
¡
¨4¸eÔ DÐE‰EÙ	Ü�$‹i�o‰oÓˆð	%Ü—Z‘Z “_ˆFÜ/9¸&Ä$Ô/G˜Ÿ
™
 7Ô+ÈTˆIÜ˜)¤TÔ*Ø!‘Ü˜F¤DÔ)Ø"¤D§J¡J¨vÀEÔ$JÐK�ð �9‰9�YÔÜ˜s›8ˆˆiÑàÜ�u—y‘y Ó+Ò7¬s°3«xÓ8Ü�E—I‘I˜fÓ%Ò+¨Ó,Ü�E—I‘I˜fÓ%Ò+¨Ó,ñ	ð øô; ò 	ðØ—}‘}‘øÜò Ø’ðýð	ûô0 ò 	%Ø Ð$ŠEð	%úsH   ­F2 Â;A4G! Æ2	GÆ<G	ÇGÇ	GÇGÇGÇGÇGÇ!G1Ç0G1c                ó„  — t        | «      }t        |«      }|j                  d«      }|j                  d«      xs d}|j                  d«      xs t        |«      }|d   › d|› �}	|r	|	d|› d�z  }	|d	k(  rd
}
nP|dk(  r2| dk(  r|dk(  rd}
n>| dk(  r|dk(  rd}
n1|dk(  r
d|d   › d�}
n"|d   › d�}
n|dk(  rd}
n|dk(  rd}
n	|dv rd}
nd}
|	g}|r|j	                  d|› �«       |j                  d«      r|j	                  d|d   › �«       |r|j	                  d|› �«       t        d j                  |«      d!|
› d"|› �z   «      S )#NrW   r]   r   r[   r   ú: z (model=ú)i‘  u‹   API key Ð½Ðµ Ð¿Ñ€Ð¸Ð½Ñ�Ñ‚: Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑŒ, Ñ‡Ñ‚Ð¾ ÐºÐ»ÑŽÑ‡ Ð´ÐµÐ¹Ñ�Ñ‚Ð²ÑƒÑŽÑ‰Ð¸Ð¹ Ð¸ Ñ�Ð¾Ñ…Ñ€Ð°Ð½Ñ‘Ð½ Ð±ÐµÐ· Ð»Ð¸ÑˆÐ½Ð¸Ñ… Ñ�Ð¸Ð¼Ð²Ð¾Ð»Ð¾Ð².é“  r   Úmodel_permission_blocked_orgu¬   ÐœÐ¾Ð´ÐµÐ»ÑŒ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð° Ð½Ð° ÑƒÑ€Ð¾Ð²Ð½Ðµ Groq Organization. Ð Ð°Ð·Ñ€ÐµÑˆÐ¸ ÐµÑ‘ Ð² Organization â†’ Limits Ð¸Ð»Ð¸ Ð²Ñ‹Ð±ÐµÑ€Ð¸ Ñ€Ð°Ð·Ñ€ÐµÑˆÑ‘Ð½Ð½ÑƒÑŽ Ð¼Ð¾Ð´ÐµÐ»ÑŒ.Ú model_permission_blocked_projectu¢   ÐœÐ¾Ð´ÐµÐ»ÑŒ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð° Ð½Ð° ÑƒÑ€Ð¾Ð²Ð½Ðµ Groq Project. Ð Ð°Ð·Ñ€ÐµÑˆÐ¸ ÐµÑ‘ Ð² Project â†’ Limits Ð¸Ð»Ð¸ Ð²Ñ‹Ð±ÐµÑ€Ð¸ Ñ€Ð°Ð·Ñ€ÐµÑˆÑ‘Ð½Ð½ÑƒÑŽ Ð¼Ð¾Ð´ÐµÐ»ÑŒ.úGET /modelsu   ÐšÐ»ÑŽÑ‡ Ð¿ÐµÑ€ÐµÐ´Ð°Ð½ u«   , Ð½Ð¾ Ð´Ð¾Ñ�Ñ‚ÑƒÐ¿ Ðº API Ð·Ð°Ð¿Ñ€ÐµÑ‰Ñ‘Ð½ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ¾Ð¹/Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð° Ð¸Ð»Ð¸ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°. ÐŸÑ€Ð¾Ð²ÐµÑ€ÑŒ Ð¿Ñ€Ð°Ð²Ð° Ð¸ Ñ�Ñ‚Ð°Ñ‚ÑƒÑ� ÐºÐ»ÑŽÑ‡Ð°.up    Ð·Ð°Ð¿Ñ€ÐµÑ‚Ð¸Ð» Ð·Ð°Ð¿Ñ€Ð¾Ñ�. Core Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ Ð¸Ñ�Ñ…Ð¾Ð´Ð½Ñ‹Ð¹ ÐºÐ¾Ð´ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð° Ð½Ð¸Ð¶Ðµ.i”  uª   Ð ÐµÑ�ÑƒÑ€Ñ� Ð¸Ð»Ð¸ Ð¼Ð¾Ð´ÐµÐ»ÑŒ Ð½ÐµÐ´Ð¾Ñ�Ñ‚ÑƒÐ¿Ð½Ñ‹ Ð´Ð»Ñ� Ñ�Ñ‚Ð¾Ð³Ð¾ API. Core Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ Ñ�Ð²ÐµÑ€Ð¸Ñ‚ Ñ�Ð¿Ð¸Ñ�Ð¾Ðº /models Ð¿Ñ€Ð¸ Ñ�Ð»ÐµÐ´ÑƒÑŽÑ‰ÐµÐ¼ Ñ‚ÐµÑ�Ñ‚Ðµ.i­  ug   Ð”Ð¾Ñ�Ñ‚Ð¸Ð³Ð½ÑƒÑ‚ rate limit/quota Groq. ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€Ð¸ Ñ‚ÐµÑ�Ñ‚ Ð¿Ð¾Ñ�Ð»Ðµ Ñ�Ð±Ñ€Ð¾Ñ�Ð° Ð»Ð¸Ð¼Ð¸Ñ‚Ð°.)iô  iö  i÷  u\   Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ� Ñ�ÐµÑ€Ð²ÐµÑ€Ð½Ð°Ñ� Ð¾ÑˆÐ¸Ð±ÐºÐ° Groq. ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€Ð¸ Ñ‚ÐµÑ�Ñ‚ Ð¿Ð¾Ð·Ð¶Ðµ.u\   ÐŸÑ€Ð¾Ð²ÐµÑ€ÑŒ Ð¾Ñ‚Ð²ÐµÑ‚ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð° Ð¸ Ñ�ÐµÑ‚ÐµÐ²ÑƒÑŽ Ð´Ð¾Ñ�Ñ‚ÑƒÐ¿Ð½Ð¾Ñ�Ñ‚ÑŒ API.zHTTP r\   ztype=zcode=u    Â· z. u    ÐŸÑ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€: )r   re   r   r,   r2   r   Újoin)rS   Ú	operationra   r(   r8   Úinfor$   r]   ÚremoteÚwhereÚhintÚpartss               r   Ú_diagnostic_errorrt   Ê   sŸ  € Ü
�HÓ
€CÜ˜#Ó€DØ�X‰X�mÓ$€FØ�8‰8�FÓÒ!˜r€DØ�X‰X�iÓ Ò,¤C¨£H€Fà�6‰{ˆm˜2˜i˜[Ð)€EÙØ�8˜E˜7 !Ð$Ñ$ˆà�‚}ð ]‰Ø	�3ŠØ�vÒ $Ð*HÒ"Hð B‰DØ˜Ò DÐ,NÒ$Nð x‰DØ˜-Ò'Ø-¨c°&©k¨]ð  ;fð  g‰Dà˜&‘k�]ð  #Sð  T‰DØ	�3Šð |‰Ø	�3ŠØx‰Ø	�?Ñ	"Øm‰àmˆàˆG€EÙØ�‰�u˜V˜HÐ%Ô&Ø‡x�x�ÔØ�‰�u˜T &™\˜NÐ+Ô,ÙØ�‰�u˜T˜F�^Ô$Ü˜Ÿ™ EÓ*¨r°$°Ð7LÈVÈHÐ-UÑUÓVÐVr    c                ó*  — | xs dj                  «       j                  «       }t        |«      }t        |«      \  }}	 |j                  j                  «       }t        |d|«      }g }	 t        |xs g «      }	|	D ]h  }
t        |
dd«      }|€!t        |
t        «      r|
j                  d«      }t        |xs d«      j                  «       }|sŒS||vsŒX|j                  |«       Œj |S # t        $ r}t        |d|«      |‚d}~ww xY w# t        $ r g }	Y Œ›w xY w)zJCall the provider's OpenAI-compatible GET /models with the same saved key.r   rl   NÚdataÚid)r   r   r   Ú_clientr   Úlistr1   rt   r^   r`   r-   r   r,   r2   )rS   r   r8   ÚclientÚ_Úpagera   r.   r7   Úiterabler   Úmodel_ids               r   Ú_list_available_modelsr   ó   s  € àŠ>�r×
 Ñ
 Ó
"×
(Ñ
(Ó
*€CÜ
�C‹.€CÜ˜“�I€FˆAðBØ�}‰}×!Ñ!Ó#ˆô �D˜& $Ó'€EØ€FðÜ˜š Ó$ˆð ò $ˆÜ˜4  tÓ,ˆØÐ¤
¨4´Ô 6Ø—x‘x “~ˆHÜ�x’~ 2Ó&×,Ñ,Ó.ˆÚ˜¨Ò.Ø�M‰M˜(Õ#ð$ð €Møô! ò BÜ  ]°CÓ8¸cÐAûðBûô ò ØŠðús)   ½C% Á'D Ã%	DÃ.C<Ã<DÄDÄDc                óz  — t        | «      }t        |«      }g }||j                  d«      g|j                  d«      xs g ¢D ]8  }t        |xs d«      j	                  «       }|sŒ#||vsŒ(|j                  |«       Œ: |D ]
  }||v sŒ|c S  dj                  |d d «      xs d}t        |d   › d|xs d	› d
|› �«      ‚)Nr   r   r   z, é   u   Ñ�Ð¿Ð¸Ñ�Ð¾Ðº Ð¿ÑƒÑ�Ñ‚r   u†   : Ð½Ð¸ Ð¾Ð´Ð½Ð° Ð½Ð°Ñ�Ñ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ� Ñ‚ÐµÐºÑ�Ñ‚Ð¾Ð²Ð°Ñ� Ð¼Ð¾Ð´ÐµÐ»ÑŒ ORIGUS Ð½Ðµ Ð½Ð°Ð¹Ð´ÐµÐ½Ð° Ð² GET /models. Ð�Ð°Ñ�Ñ‚Ñ€Ð¾ÐµÐ½Ð¾: u   â€”u#   . Ð”Ð¾Ñ�Ñ‚ÑƒÐ¿Ð½Ñ‹Ðµ Ð¼Ð¾Ð´ÐµÐ»Ð¸: )r   Úsetr   r,   r   r2   rm   r   )rS   Úconfigured_modelÚavailable_modelsr8   Ú	availableÚ
candidatesrb   Úpreviews           r   Ú_select_available_modelrˆ     sî   € Ü
�HÓ
€CÜÐ$Ó%€IØ€JØ&¨¯©°Ó(@Ð]ÀCÇGÁGÈHÓDUÒD[ÐY[Ð]ò )ˆ	Ü˜	š RÓ(×.Ñ.Ó0ˆ	Ú˜¨*Ò4Ø×Ñ˜iÕ(ð)ð  ò ˆ	Ø˜	Ò!ØÒðð �i‰iÐ(¨¨"Ð-Ó.ÒIÐ2I€GÜ
Øˆv‰;ˆ-ð Ø/Ò8°5Ð9Ð9\Ð]dÐ\eð	góð r    c                óB   — t        | «      }|sy ||d<   t        | |«       y )Nr(   )r	   r
   )rS   r(   Úsecrets      r   Ú_persist_provider_modelr‹     s%   € Ü˜Ó"€FÙØØ€Fˆ7�OÜ�˜&Õ!r    c                ór  — 	 ddl m} t	        | «      }t        | «      }t        |j                  d«      xs d«      j                  «       }|st        d|d   › d�«      ‚t        |j                  d	«      xs |d
   «      j                  «       } |||d   ¬«      |fS # t        $ r}t        d«      |‚d }~ww xY w)Nr   )ÚOpenAIuM   Ð�Ðµ ÑƒÑ�Ñ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½ Ð¿Ð°ÐºÐµÑ‚ openai (SDK Ñ�Ð¾Ð²Ð¼ÐµÑ�Ñ‚Ð¸Ð¼Ñ‹Ñ… API).rQ   r   zAPI key r   u    Ð½Ðµ Ð½Ð°Ñ�Ñ‚Ñ€Ð¾ÐµÐ½.r(   r   r   )rQ   r   )	Úopenair�   ÚImportErrorr   r   r	   r,   r   r   )rS   r�   ra   r8   rŠ   rQ   r(   s          r   rx   rx   '  s½   € ðuÝ!ô 	�(Ó€CÜ�xÓ €FÜ�—
‘
˜9Ó%Ò+¨Ó,×2Ñ2Ó4€GÙÜ˜X c¨&¡k ]Ð2IÐJÓKÐKÜ
ˆf�j‰j˜Ó!Ò9 S¨Ñ%9Ó
:×
@Ñ
@Ó
B€EÙ˜'¨3¨z©?Ô;¸EÐAÐAøô ò uÜÐjÓkÐqtÐtûðuús   ‚B Â	B6Â%B1Â1B6c           
     ó0  — t        j                  |j                  d«      «      j                  «       }t	        «       5 }|j                  d| ||t        «       d|f«      }|j                  «        t        |j                  «      cd d d «       S # 1 sw Y   y xY w)Nzutf-8z~
            INSERT INTO ai_runs(purpose,provider,model,created_at,status,input_hash)
            VALUES(?,?,?,?,?,?)
        Úrunning)
ÚhashlibÚsha256ÚencodeÚ	hexdigestr   r*   r   rL   ÚintÚ	lastrowid)ÚpurposerS   r(   Ú
input_textÚdigestr4   Úcurs          r   Ú
_run_startrœ   5  s   € Ü�>‰>˜*×+Ñ+¨GÓ4Ó5×?Ñ?ÓA€FÜ	‹ð "�cØ�K‰Kð ð �X˜e¤G£I¨i¸Ð?óAˆð 	�
‰
ŒÜ�3—=‘=Ó!÷"÷ "ò "ús   ½ABÂBc                óÚ   — t        «       5 }|j                  dt        j                  |d¬«      | f«       |j                  d|f«       |j	                  «        d d d «       y # 1 sw Y   y xY w)NzGUPDATE ai_runs SET status='ok',result_meta_json=?,error=NULL WHERE id=?FrI   zGUPDATE connectors SET status='ok',last_error=NULL WHERE connector_key=?)r   r*   r/   rK   rL   )Úrun_idrS   r)   r4   s       r   Ú_run_okrŸ   @  s]   € Ü	‹ð �cØ�‰Ð]Ü—Z‘Z °%Ô8¸Ð@ô	Bà�‰Ð]Ð_gÐ^iÔjØ�
‰
Œ÷	÷ ñ ús   ‹AA!Á!A*c                óÔ   — t        |«      d d }t        «       5 }|j                  d|| f«       |j                  d|d d |f«       |j                  «        d d d «       y # 1 sw Y   y xY w)Ni¸  z4UPDATE ai_runs SET status='error',error=? WHERE id=?zGUPDATE connectors SET status='error',last_error=? WHERE connector_key=?éÐ  )r,   r   r*   rL   )rž   rS   ra   Úmsgr4   s        r   Ú
_run_errorr£   H  si   € ÜˆC‹��$ˆ€CÜ	‹ð �cØ�‰ÐJÈCÐPVÈ<ÔXØ�‰Ð]Ð_bÐchÐdhÐ_iÐjrÐ^sÔtØ�
‰
Œ÷÷ ñ ús   ™<AÁA'c           
     óè  — 	 | j                   d   j                  j                  }t        |t        «      r|S t        |t        «      r�g }|D ]i  }t        |t        «      r.|j                  t        |j                  d«      xs d«      «       ŒA|j                  t        t        |dd«      xs d«      «       Œk dj                  |«      S t        |xs d«      S # t        $ r}t	        d«      |‚d }~ww xY w)Nr   uB   AI-Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€ Ð²ÐµÑ€Ð½ÑƒÐ» Ð¾Ñ‚Ð²ÐµÑ‚ Ð±ÐµÐ· Ñ‚ÐµÐºÑ�Ñ‚Ð°.r_   r   )Úchoicesr[   Úcontentr1   r   r`   r,   ry   r-   r2   r   r^   rm   )rY   Úvaluera   rs   r   s        r   Ú_contentr¨   P  sÝ   € ðjØ×Ñ˜qÑ!×)Ñ)×1Ñ1ˆô �%œÔ U˜lÜ�%œÔØˆØò 	CˆDÜ˜$œtÔ$ e§l¡l´3°t·x±xÀÓ7GÒ7MÈ2Ó3NÕ&OØ—,‘,œs¤7¨4°°rÓ#:Ò#@¸bÓAÕBð	Cð �w‰w�u‹~ÐÜˆuŠ{˜ÓÐøô ò jÜÐ_Ó`ÐfiÐiûðjús   ‚#C Ã	C1Ã C,Ã,C1c                óŒ   — | si S d}i }|D ]%  }	 | j                  |«      }|€Œt        |«      ||<   Œ' |S # t        $ r d }Y Œ"w xY w)N)zx-ratelimit-limit-requestszx-ratelimit-remaining-requestszx-ratelimit-reset-requestszx-ratelimit-limit-tokenszx-ratelimit-remaining-tokenszx-ratelimit-reset-tokenszretry-after)r   r1   r,   )ÚheadersÚkeysÚoutr   r§   s        r   Ú_headers_metar­   _  sj   € Ù˜2�Ið
€Dð 	€CØò 2ˆð	Ø—+‘+˜cÓ"ˆEð Ñ¤s¨5£z˜c #šhð2ð €Jøô ò 	ØŠEð	ús   �5µAÁAc                óf  — t        | «      \  }}||dœ}|�||d<   | dk(  r|�	dddii|d<   t        |j                  j                  dd «      }|�0 |j                  d
i |¤Ž}t        |d	d «      }	|j                  «       }
n( |j                  j                  j                  d
i |¤Ž}
d }	|
t        |	«      fS )N)r(   ÚmessagesÚresponse_formatr   rS   Úrequire_parametersTÚ
extra_bodyÚwith_raw_responserª   © )rx   r^   ÚchatÚcompletionsÚcreateÚparser­   )rS   r(   r¯   r°   rz   r{   ÚkwargsÚraw_apirc   rª   rY   s              r   Ú_requestr»   q  sÌ   € Ü�XÓ�H€Fˆ1Ø XÑ.€FØÐ"Ø"1ˆÐ Ñ!Ø�Ò /Ð"=Ø(Ð*>¸tÐ)DÐEˆˆ|Ñä�F—K‘K×+Ñ+Ð,?ÀÓE€GØÐØˆG�N‰NÑ$˜VÑ$ˆÜ˜˜I dÓ+ˆØ—‘“‰à/�—‘×(Ñ(×/Ñ/Ñ9°&Ñ9ˆØˆØ”M 'Ó*Ð*Ð*r    c                óÎ   — |t        | dd «      xs |t        | dd «      ||dœ}t        | dd «      }|�3ddddœ}|j                  «       D ]  \  }}	t        ||d «      }
|
€Œ|
||	<   Œ |S )	Nr(   rw   )rS   r(   Úresponse_idÚfallback_usedÚrate_limitsÚusageÚinput_tokensÚoutput_tokensÚtotal_tokens)Úprompt_tokensÚcompletion_tokensrÃ   )r^   r.   )rY   rS   r(   rª   r¾   r)   rÀ   ÚmappingÚsrcÚdstÚvals              r   Ú_usage_metarÊ   „  s’   € àÜ˜ ¨Ó.Ò7°%Ü˜h t¨DÓ1Ø%Øñ
€Dô �(˜7 4Ó
(€EØÐà*Ø /Ø)ñ
ˆð
 —}‘}“ò 	.‰GˆC�Ü˜˜c $Ó'ˆCØ‰¨#  S¢	ð	.ð €Kr    c                ó¾  — t        «       }| r@| j                  «       j                  «       g}|d   rB||d   D �cg c]	  }||vsŒ|‘Œ c}z  }n&|d   g}|d   r||d   D �cg c]	  }||vsŒ|‘Œ c}z  }g }t        |«      D ]C  \  }}|t        vst        |«      sŒt        |«      \  }}	|j                  ||dk(  r|r|n|	f«       ŒE |st        d«      ‚|S c c}w c c}w )Nr=   r>   r<   r   u§   AI-Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ñ‹ Ð½Ðµ Ð½Ð°Ñ�Ñ‚Ñ€Ð¾ÐµÐ½Ñ‹. Ð’ Admin â†’ ORIGUS Core Ð½Ð°Ñ�Ñ‚Ñ€Ð¾Ð¹ Groq Free (Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÐµÑ‚Ñ�Ñ�) Ð¸Ð»Ð¸ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€.)	rF   r   r   Ú	enumerater   r3   rx   r2   r   )
Úpreferred_providerÚmodel_overrideÚsettingsrE   r5   ÚroutesÚir   r{   rƒ   s
             r   Ú_routesrÒ   ™  s  € ÜÓ€HÙØ!×'Ñ'Ó)×/Ñ/Ó1Ð2ˆØÐ&Ò'Ø Ð*:Ñ!;ÖN˜A¸qÈº~’aÒNÑN‰EàÐ*Ñ+Ð,ˆØÐ&Ò'Ø Ð*:Ñ!;ÖN˜A¸qÈº~’aÒNÑNˆEà€FÜ˜5Ó!ò ^‰ˆˆ#Ø”iÑÔ'8¸Ô'=ØÜ" 3›<ÑˆÐ
Ø�‰�s¨a°ªd±~™NÐK[Ð\Õ]ð	^ñ
 ÜðSó
ð 	
ð €Mùò# Oùò Os   ¹	CÁCÁ 	CÁ*C)r°   rÍ   r(   c           	     ó.  — t        ||«      }g }t        |«      D ]X  \  }\  }	}
t        | |	|
|«      }	 t        |	|
||«      \  }}t	        ||	|
||dkD  «      }t        ||	|«       dt        |«      ||dœc S  t        ddj!                  |«      z   «      ‚# t        $ ry}t        |t        «      r*t        |«      j                  t        |	   d   dz   «      r|}nt        |	d||
«      }t        ||	|«       |j                  t        |«      «       Y d }~Œõd }~ww xY w)	Nr   T)rR   r_   r)   Ú	ai_run_idr   ú:úPOST /chat/completionsu]   Ð’Ñ�Ðµ Ð½Ð°Ñ�Ñ‚Ñ€Ð¾ÐµÐ½Ð½Ñ‹Ðµ AI-Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ñ‹ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð¸Ñ�ÑŒ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹. ú | )rÒ   rÌ   rœ   r»   rÊ   rŸ   r¨   r1   r`   r   r,   Ú
startswithr   rt   r£   r2   rm   )r˜   r™   r¯   r°   rÍ   r(   rÐ   ÚerrorsÚindexrS   Úchosen_modelrž   rY   rª   r)   ra   Ú
diagnostics                    r   Ú_executerÝ   ²  sF  € äÐ% eÓ,€FØ€FÜ)2°6Ó):ò Ñ%ˆÑ%ˆx˜Ü˜' (¨<¸
ÓCˆð	Ü% h¨|¸HÀ_ÓUÑˆH�WÜ˜X h¨|¸GÀEÈ!ÁGÓLˆDÜ�F˜8 DÔ)àÜ Ó)ØØ"ñ	ò ðô( ÐvÐy~÷  zDñ  zDð  EKó  zLñ  Ló  Mð  Møô ò 	Ü˜#œ|Ô,´°S³×1DÑ1DÄYÈxÑEXÐY_ÑE`ÐcfÑEfÔ1gØ‘
ä,¨XÐ6NÈsÐS_Ó`�
Ü�v˜h zÔ2Ø�M‰Mœ#˜j›/Ô*Üûð	ús   ²?BÂ	DÂA/DÄDc                óÞ  — | xs dj                  «       j                  «       }t        |«      }t        |«      \  }}g }g }	 t	        |«      }t        |«      }g }	||j                  d«      g|j                  d«      xs g ¢D ]=  }
t        |
xs d«      j                  «       }
|
sŒ#|
|v sŒ(|
|	vsŒ-|	j                  |
«       Œ? |	st        |||«       d }d}|	D ]9  }
|j                  |
«       	 t        ||
dddœgd «      \  }}t        |«       |}|
} n |�|s/dj                  d„ |D «       «      xs d}t!        |d   › d|› �«      ‚	 ||k7  }|rt1        ||«       ||||||t-        «       dœ}t)        «       5 }|j+                  dt-        «       t3        j4                  |d¬«      |f«       |j/                  «        d d d «       d||d   |d   |d   j7                  d«      dz   |||||t9        |«      |dœS # t        $ r™}t        |«      }|j                  d«      dk(  rf|j                  d	«      d
v rS|j                  |
t        |j                  d	«      xs d«      t        |j                  d«      xs d«      dœ«       Y d }~�Œ«t        |d||
«      |‚d }~ww xY w# t        $ r¾}t#        |t         «      r#t        |«      j%                  |d   dz   «      r|}n)t        |d|t'        «       j                  d«      xs |«      }t)        «       5 }|j+                  dt        |«      d d t-        «       |f«       |j/                  «        d d d «       ||‚# 1 sw Y   ||‚xY wd }~ww xY w# 1 sw Y   �Œ¬xY w) Nr   r   r   Úuseru(   ÐžÑ‚Ð²ÐµÑ‚ÑŒ Ð¾Ð´Ð½Ð¸Ð¼ Ñ�Ð»Ð¾Ð²Ð¾Ð¼: OK©Úroler¦   rW   ri   r]   >   rj   rk   r[   )r(   r]   r[   rÖ   r×   c              3  óB   K  — | ]  }|d    › d|d   › d|d   › �–— Œ y­w)r(   rg   r]   u    â€” r[   Nr´   )Ú.0r   s     r   ú	<genexpr>z test_provider.<locals>.<genexpr>û  s6   è ø€ ò àð ˜‘=�/  D¨¡L >°°t¸I±Ð6GÔHñùs   ‚u$   Ð½ÐµÑ‚ ÑƒÑ�Ð¿ÐµÑˆÐ½Ð¾Ð¹ Ð¼Ð¾Ð´ÐµÐ»Ð¸r   ud   : Ð²Ñ�Ðµ Ñ�Ð¾Ð²Ð¼ÐµÑ�Ñ‚Ð¸Ð¼Ñ‹Ðµ Ð¼Ð¾Ð´ÐµÐ»Ð¸ ORIGUS Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ñ‹ Ð½Ð°Ñ�Ñ‚Ñ€Ð¾Ð¹ÐºÐ°Ð¼Ð¸ Groq. rÕ   r(   zVUPDATE connectors SET status='error',last_error=?,last_test_at=? WHERE connector_key=?r¡   )r(   rƒ   Úmodel_auto_selectedr„   Úattempted_modelsÚpermission_blocked_modelsÚmodels_checked_atzbUPDATE connectors SET status='ok',last_test_at=?,last_error=NULL,meta_json=? WHERE connector_key=?FrI   Tr   ú/z/models)rR   rS   Úprovider_namer   Úmodels_endpointrƒ   r(   rå   ræ   rç   Úavailable_models_countr„   )r   r   r   rx   r   r‚   r   r,   r2   rˆ   r»   r¨   r1   re   rt   rm   r   r`   rØ   Úlocalsr   r*   r   rL   r‹   r/   rK   ÚrstripÚlen)rS   r   r8   Ú_client_objrƒ   ræ   rç   r„   r…   r†   rb   rY   r(   Úcandidate_responseÚ_headersÚ	model_excro   Údetailsra   rÜ   r4   Úmodel_changedr)   s                          r   Útest_providerrö   Í  sä  € Ø	Š�R×ÑÓ ×&Ñ&Ó(€CÜ�#‹€CÜ!(¨£Ñ €KÐ Ø"$ÐØ57Ðð7"Ü/°Ó4ÐÜÐ&Ó'ˆ	Øˆ
Ø*¨3¯7©7°?Ó+CÐ_ÀcÇgÁgÈhÓFWÒF]Ð[]Ð_ò 	-ˆIÜ˜)š/ rÓ*×0Ñ0Ó2ˆIÚ˜Y¨)Ò3¸	ÈÒ8SØ×!Ñ! )Õ,ð	-ñ Ü# CÐ(8Ð9IÔJàˆØˆØ#ò 	iˆIØ×#Ñ# IÔ.ðiÜ,4Ø˜	Ø#Ð.XÑYÐZØó-Ñ+Ð" 8ô
 Ð+Ô,Ø+�Ø�Ùð	ið2 Ð¡5Ø—J‘Jñ à5ôó ò 8ð 8ð ô Ø�v‘;�-ð   Dð  ELð  DMð  Nóð ð $)ð& Ð,Ñ,€MÙÜ  EÔ*ð Ø+Ø+Ø+Ø+Ø$=Ü#›Iñ
€Dô 
‹ð �cØ�‰ÐxÜ“YœtŸz™z¨$¸EÔBÀ3ÐGô	Ià�
‰
Œ÷ð
 ØØ˜F™Ø�z‘?Ø˜j™/×0Ñ0°Ó5°iÑ?Ø+ØØ+Ø+Ø$=Ü!$Ð%5Ó!6Ø+ñð øôc ò iÜ# IÓ.�Ø—8‘8˜MÓ*¨CÒ/°D·H±H¸VÓ4Dð Iñ 5ð .×4Ñ4Ø )Ü" 4§8¡8¨FÓ#3Ò#9°rÓ:Ü"% d§h¡h¨yÓ&9Ò&?¸RÓ"@ñ6ô õ
 Ü'¨Ð,DÀYÈyÓYÐ_hÐhûðiûô* ò 	"Ü�cœ<Ô(¬S°«X×-@Ñ-@ÀÀVÁÈsÑARÔ-SØ‰Jä(¨Ð-EÀcÌ&Ë(Ï,É,ÐW^ÓJ_ÒJsÐcsÓtˆJÜ‹Yð 	˜#Ø�K‰KÐpÜ˜Z›¨¨$Ð/´³	¸#Ð>ô@à�J‰JŒL÷	ð ˜cÐ!÷		ð ˜cÐ!þð	"ú÷0ñ ús‚   ÁA"J Â$J Â)J Â.<J Ã+$G3Ä6J Å5AM"Ç3	JÇ<A?JÉ;J ÊJÊJÊJ Ê	MÊ!A&MÌ:MÍMÍM	Í	MÍMÍ"M,)Úinstructionsr(   rS   c                ót   — |j                  «       st        d«      ‚|xs d}t        | |d|dœd|dœg||¬«      S )Nõ.   ÐŸÑƒÑ�Ñ‚Ð¾Ð¹ Ñ‚ÐµÐºÑ�Ñ‚ Ð´Ð»Ñ� Ð°Ð½Ð°Ð»Ð¸Ð·Ð°.uØ   Ð�Ð½Ð°Ð»Ð¸Ð·Ð¸Ñ€ÑƒÐ¹ Ñ�Ñ‚Ñ€Ð¾Ð³Ð¾ Ð¿Ñ€ÐµÐ´Ð¾Ñ�Ñ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ð¹ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð». Ð�Ðµ Ð²Ð¾Ñ�Ñ�Ñ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ð¹ Ð¾Ñ‚Ñ�ÑƒÑ‚Ñ�Ñ‚Ð²ÑƒÑŽÑ‰Ð¸Ðµ Ð½Ð¾Ñ€Ð¼Ñ‹ Ð¸ Ñ�Ð²Ð½Ð¾ Ð¾Ñ‚Ð¼ÐµÑ‡Ð°Ð¹ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ñ‹ Ð¸Ñ�Ñ‚Ð¾Ñ‡Ð½Ð¸ÐºÐ°.Úsystemrà   rß   )r˜   r™   r¯   rÍ   r(   )r   r   rÝ   )r˜   r_   r÷   r(   rS   rú   s         r   Úanalyze_textrû   .  sT   € Ø�:‰:Œ<œ|Ð,\Ó]Ð]Øò ð	Sð ô Ø 4Ø"¨VÑ4¸VÈdÑ5SÐTØ#¨%ôð r    )r(   rS   c                óò   — |j                  «       st        d«      ‚d|d|dœdœ}t        | |d|dœd|dœg|||¬	«      }	 t        j                  |d
   «      |d<   |S # t
        $ r}	t        d«      |	‚d }	~	ww xY w)Nrù   Újson_schemaT)r   ÚstrictÚschema)r\   rý   rú   rà   rß   )r˜   r™   r¯   r°   rÍ   r(   r_   rv   uT   AI Ð²ÐµÑ€Ð½ÑƒÐ» Ð½ÐµÐ²Ð°Ð»Ð¸Ð´Ð½Ñ‹Ð¹ JSON, Ð½ÐµÑ�Ð¼Ð¾Ñ‚Ñ€Ñ� Ð½Ð° Structured Outputs.)r   r   rÝ   r/   r0   r1   )
r˜   r_   r÷   Úschema_namerÿ   r(   rS   r°   r7   ra   s
             r   Ústructured_responser  ;  s›   € à�:‰:Œ<œ|Ð,\Ó]Ð]àØ)°4ÀÑHñ€Oô Ø 4Ø"¨\Ñ:À6ÐTXÑ;YÐZØ'¸8È%ô€Fð
|Ü—z‘z &¨¡.Ó1ˆˆv‰ð €Møô ò |ÜÐqÓrÐx{Ð{ûð|ús   ¿A Á	A6Á%A1Á1A6ÚobjectFÚstring)ÚscopeÚ	exclusionÚ
definitionÚ
conformityÚrequirementÚ	reference)r\   Úenumr\   Úarray)r\   r.   Únumber)Ú	rule_typeÚlegal_basisÚ	statementÚ
conditionsÚoutcomesÚ
confidence)r\   ÚadditionalPropertiesÚ
propertiesÚrequired)r]   ÚtitleÚdocument_typeÚrevision)ÚdocumentÚrulesr  r  )ÚcompleteÚpossibly_incompleteÚ
incomplete)r$   ÚscoreÚreasonsÚlast_visible_section)Úproduct_nameÚproduct_typer˜   r  )r   r§   Úsource)r]   Úreasonr  )ÚidentityÚfeaturesÚcandidate_regulationsÚmissing_questionsc                óD   — d}d| › d|› d|› �}t        d||dt        ¬«      S )Nu$  ÐžÑ†ÐµÐ½Ð¸ Ð¢ÐžÐ›Ð¬ÐšÐž Ð¿Ð¾Ð»Ð½Ð¾Ñ‚Ñƒ Ð¿Ñ€ÐµÐ´Ð¾Ñ�Ñ‚Ð°Ð²Ð»ÐµÐ½Ð½Ð¾Ð¹ ÐºÐ¾Ð¿Ð¸Ð¸ Ð½Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°. Ð�Ðµ Ð¸Ñ�Ð¿Ð¾Ð»ÑŒÐ·ÑƒÐ¹ Ð¿Ð°Ð¼Ñ�Ñ‚ÑŒ Ð¾ Ñ�Ð¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ð¸ Ð½Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ Ð°ÐºÑ‚Ð° Ð¸ Ð½Ðµ Ð´Ð¾Ð¿Ð¸Ñ�Ñ‹Ð²Ð°Ð¹ Ð¾Ñ‚Ñ�ÑƒÑ‚Ñ�Ñ‚Ð²ÑƒÑŽÑ‰Ð¸Ð¹ Ñ‚ÐµÐºÑ�Ñ‚. Ð•Ñ�Ð»Ð¸ Ð² ÐºÐ¾Ð¿Ð¸Ð¸ ÐµÑ�Ñ‚ÑŒ Ñ�Ñ�Ñ‹Ð»ÐºÐ¸ Ð½Ð° Ñ�Ñ‚Ð°Ñ‚ÑŒÐ¸/Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ�, ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ð² Ñ�Ñ‚Ñ€ÑƒÐºÑ‚ÑƒÑ€Ðµ ÐºÐ¾Ð¿Ð¸Ð¸ Ð½ÐµÑ‚, Ð¸Ð»Ð¸ ÐºÐ¾Ð½ÐµÑ† Ñ�Ð²Ð½Ð¾ Ð¾Ð±Ñ€Ñ‹Ð²Ð°ÐµÑ‚Ñ�Ñ�, Ñ�Ñ‚Ð°Ð²ÑŒ incomplete. ÐŸÑ€Ð¸ Ñ�Ð¾Ð¼Ð½ÐµÐ½Ð¸Ð¸ â€” possibly_incomplete.õ   ÐšÐ¾Ð´: õ   
Ð—Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº: u6   

Ð¡Ð¢Ð Ð£ÐšÐ¢Ð£Ð Ð�Ð«Ð™ Ð”Ð�Ð™Ð”Ð–Ð•Ð¡Ð¢ ÐšÐžÐŸÐ˜Ð˜:
Úlegal_completenessÚorigus_source_completeness©r˜   r_   r÷   r   rÿ   )r  ÚCOMPLETENESS_SCHEMA)Údocument_coder  rš   r÷   r_   s        r   Úassess_completenessr1  ‘  sL   € ð	Cð ð �M�?Ð"8¸¸Ð?xÐyð  yAð  
B€DÜØ$¨$¸LØ0Ô8Kôð r    c           
     óP   — d}d| › d|› d|› d|› d|› �
}t        d||dt        ¬	«      S )
Nuç  Ð˜Ð·Ð²Ð»ÐµÐºÐ¸ ÑŽÑ€Ð¸Ð´Ð¸Ñ‡ÐµÑ�ÐºÐ¸ Ð·Ð½Ð°Ñ‡Ð¸Ð¼Ñ‹Ðµ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð¸Ð· Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ð¤Ð Ð�Ð“ÐœÐ•Ð�Ð¢Ð� Ð½Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°. Ð�Ðµ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ñ�Ð¹ Ñ�Ð²ÐµÐ´ÐµÐ½Ð¸Ñ� Ð¸Ð· Ð¿Ð°Ð¼Ñ�Ñ‚Ð¸. Ð�Ðµ Ð´ÐµÐ»Ð°Ð¹ Ð²Ñ‹Ð²Ð¾Ð´ Ð¾ Ð¿Ð¾Ð»Ð½Ð¾Ñ‚Ðµ Ð²Ñ�ÐµÐ³Ð¾ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°. Ð¢Ð¸Ð¿Ñ‹ Ð¿Ñ€Ð°Ð²Ð¸Ð»: Ð¾Ð±Ð»Ð°Ñ�Ñ‚ÑŒ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ�, Ð¸Ñ�ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ, Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ðµ, Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ðµ Ñ�Ð¾Ð¾Ñ‚Ð²ÐµÑ‚Ñ�Ñ‚Ð²Ð¸Ñ�, Ð¾Ð±Ñ�Ð·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ðµ Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ðµ, Ð½Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ� Ñ�Ñ�Ñ‹Ð»ÐºÐ°. legal_basis ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ð¹ Ð½Ð°Ñ�Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ‚Ð¾Ñ‡Ð½Ð¾, Ð½Ð°Ñ�ÐºÐ¾Ð»ÑŒÐºÐ¾ Ñ�Ñ‚Ð¾ Ð²Ð¸Ð´Ð½Ð¾ Ð²Ð¾ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ðµ. Ð’Ñ�Ðµ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ‹ Ð·Ð°Ñ‚ÐµÐ¼ Ð¿Ñ€Ð¾Ð²ÐµÑ€Ñ�ÐµÑ‚ Ñ�Ð¿ÐµÑ†Ð¸Ð°Ð»Ð¸Ñ�Ñ‚.r*  r+  u   
Ð¤Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚: ré   z

Úlegal_rules_fragmentÚorigus_legal_fragmentr.  )r  ÚLEGAL_FRAGMENT_SCHEMA)r0  r  r_   Úfragment_indexÚfragment_totalr÷   Úpayloads          r   Úextract_legal_fragmentr9  Ÿ  sX   € ð	Xð ð ˜�Ð&<¸U¸Gð D"Ø"0Ð!1°°>Ð2BÀ$ÀtÀfðN€GäØ&¨GÀØ+Ô3Hôð r    )r(   c                ój   — | |||dœ}d}t        dt        j                  |dd¬«      |dt        |¬«      S )	N)r   r˜   ÚdescriptionÚcharacteristicsu†  Ð’Ñ‹Ð¿Ð¾Ð»Ð½Ð¸ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸ÑŽ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ†Ð¸Ð¸ Ð´Ð»Ñ� ORIGUS. Ð�Ðµ Ð²Ñ‹Ð½Ð¾Ñ�Ð¸ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ðµ ÑŽÑ€Ð¸Ð´Ð¸Ñ‡ÐµÑ�ÐºÐ¾Ðµ Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ Ð¾ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ð¼Ð¾Ñ�Ñ‚Ð¸ Ñ‚ÐµÑ…Ð½Ð¸Ñ‡ÐµÑ�ÐºÐ¸Ñ… Ñ€ÐµÐ³Ð»Ð°Ð¼ÐµÐ½Ñ‚Ð¾Ð² Ð¸ Ð½Ðµ Ð½Ð°Ð·Ð½Ð°Ñ‡Ð°Ð¹ Ñ�ÐµÑ€Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚/Ð´ÐµÐºÐ»Ð°Ñ€Ð°Ñ†Ð¸ÑŽ. Ð’Ñ‹Ð´ÐµÐ»Ð¸ Ñ„Ð°ÐºÑ‚Ð¸Ñ‡ÐµÑ�ÐºÐ¸Ðµ Ð¿Ñ€Ð¸Ð·Ð½Ð°ÐºÐ¸ Ð¸Ð· Ð²Ð²ÐµÐ´Ñ‘Ð½Ð½Ñ‹Ñ… Ð´Ð°Ð½Ð½Ñ‹Ñ…, Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶Ð¸ ÐºÐ°Ð½Ð´Ð¸Ð´Ð°Ñ‚Ð½Ñ‹Ðµ Ñ‚ÐµÑ…Ð½Ð¸Ñ‡ÐµÑ�ÐºÐ¸Ðµ Ñ€ÐµÐ³Ð»Ð°Ð¼ÐµÐ½Ñ‚Ñ‹ Ð´Ð»Ñ� Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ rules engine Ð¸ Ñ�Ñ„Ð¾Ñ€Ð¼ÑƒÐ»Ð¸Ñ€ÑƒÐ¹ Ð½ÐµÐ´Ð¾Ñ�Ñ‚Ð°ÑŽÑ‰Ð¸Ðµ Ð²Ð¾Ð¿Ñ€Ð¾Ñ�Ñ‹. Ð�Ðµ Ð¿Ñ€Ð¸Ð´ÑƒÐ¼Ñ‹Ð²Ð°Ð¹ Ñ…Ð°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð¸Ñ�Ñ‚Ð¸ÐºÐ¸.Úproduct_identificationFé   )rJ   ÚindentÚorigus_product_identity)r˜   r_   r÷   r   rÿ   r(   )r  r/   rK   ÚPRODUCT_IDENTITY_SCHEMA)r   r˜   r;  r<  r(   r8  r÷   s          r   Úidentify_productrB  ¯  sJ   € Ø 7¸ÐWfÑg€Gð	}ð ô Ø(¬d¯j©j¸ÈeÐ[\Ô.]Ø!Ð.GÔOfÐmrôð r    )r   r,   Úreturnúdict[str, Any])rC  zlist[dict[str, Any]])rC  rD  )r<   r,   r=   rD   r>   ú	list[str]rC  rD  )N)rS   r,   rQ   r,   r(   ú
str | NonerC  rD  )ra   r1   rC  rD  )
rS   r,   rn   r,   ra   r1   r(   rF  rC  r   )rS   r,   rC  rE  )rS   r,   rƒ   r,   r„   rE  rC  r,   )rS   r,   r(   r,   rC  ÚNone)rS   r,   )
r˜   r,   rS   r,   r(   r,   r™   r,   rC  r–   )rž   r–   rS   r,   r)   rD  rC  rG  )rž   r–   rS   r,   ra   r1   rC  rG  )rY   r   rC  r,   )rª   r   rC  rD  )rS   r,   r(   r,   r¯   úlist[dict[str, str]]r°   údict[str, Any] | None)rY   r   rS   r,   r(   r,   rª   rD  r¾   rD   rC  rD  )NN)rÍ   rF  rÎ   rF  rC  zlist[tuple[str, str]])r˜   r,   r™   r,   r¯   rH  r°   rI  rÍ   rF  r(   rF  rC  rD  )rS   r,   rC  rD  )r˜   r,   r_   r,   r÷   rF  r(   rF  rS   rF  rC  rD  )r˜   r,   r_   r,   r÷   r,   r   r,   rÿ   rD  r(   rF  rS   rF  rC  rD  )r0  r,   r  r,   rš   r,   rC  rD  )r0  r,   r  r,   r_   r,   r6  r–   r7  r–   rC  rD  )r   r,   r˜   r,   r;  r,   r<  rD  r(   rF  rC  rD  )3Ú
__future__r   r’   r/   ÚreÚtypingr   Úcore_dbr   Úcore_schemar   r   Úsecret_storer   r3   r	   r
   r   Ú__annotations__rB   rC   r   r:   rF   rO   rU   re   rt   r   rˆ   r‹   rx   rœ   rŸ   r£   r¨   r­   r»   rÊ   rÒ   rÝ   rö   rû   r  ÚRULE_ITEM_SCHEMAr5  r/  rA  r1  r9  rB  r´   r    r   ú<module>rR     s;  ðÞ "ã Û Û 	Ý å ß 1ß RÑ Rð Ø4Ø.ò
ð
 Nð Añð ØNØ+Ø%Ð'>Ð?ØXð wñð "Ø2Ø*Ø$Ð%ØUð }ññ+(€	Ð$ó ð> €Ø˜lÐ+Ð óó óFó2ô.5ó&+ô\&WóRó4ó$"óBó"óóóóô$+ó&ô*ð2 koØ)-¸TñMØ (ðMØ4<ðMØDQóMó6^ðB ?CÐRVÐimõ 
ð (,¸dñØ&ðØ5=ðØERóð( ¨5à$Ò,uÑvØ˜hÐ'Ø˜HÐ%Ø$¨f°XÐ->Ñ?Ø"¨F°8Ð+<Ñ=Ø˜XÐ&ñò \ñÐ ð ¨5ð °5à˜xÐ(°&¸Ð1BØ!'¨Ð 1¸fÀXÐ=Nñò Cñ
ð  Ð(8Ñ9ñ
ð ˜7Ð#ñÐ ð" ¨5à!Ò)XÑYØ˜Ð!Ø!¨6°(Ð*;Ñ<Ø & xÐ0ñ	ò Cñ	Ð ð ¨5ð °5à & xÐ0ÀÈÐ@QØ! (Ð+¸&ÀÐ9Jñò Nñ
ð #Ø°5Ø"(¨Ð!2¸FÀ8Ð;LÐW]Ð^fÐVgÑhÚ0ñ,
ñ ð
 )0Ø°5Ø"(¨Ð!2¸VÀHÐ<MÐ\bÐckÐ[lÑmÚ5ñ9
ñ !ð
 %,°V¸HÐ4EÑFñ'ò* Sñ/Ð ó6óð  jnö r    