§
    ÔŸ’j±   ã                  ó”   — 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lm	Z	 ddl
mZ  ej        d¦  «        Z G d„ d	¦  «        ZdS )
zKAI Agent Work Shift Scheduler & Anti-Spam Rate Limiting Service for DSCons.é    )ÚannotationsN)Údatetime)ÚAny)ÚErpDatabaseClientzdscons.agent_schedulerc                  ó  — e Zd ZU dZdddddddd	d
dddœddddddddddddœddddddddddd dœd!d"d#d$d%d&d'd(dd)d*dœd+d,d-d.d/d'd0d1ddd2dœd3d4d5d6d7d0d8d9dd:d dœd;d<d=d>d?d8d@dAddBddœdCdDdEdFdGd@dHdIdd:d dœgZdJedK<   dZd[dQ„Zd\dR„Zd]dT„Z	 d^d_dY„Z	dLS )`ÚAgentSchedulerServicezUManages business work shifts and enforces anti-spam rate limiting across AI Personas.zSHIFT-01-SITEÚphucu   PhÃºcu$   Chá»‰ huy trÆ°á»Ÿng Hiá»‡n trÆ°á»�ngz07:30 - 09:00g      @g      "@ug   Thu tháº­p nháº­t trÃ¬nh xe Howo 4 chÃ¢n, sá»• ca mÃ¡y Ä‘Ã o Kobelco vÃ  cháº¥m cÃ´ng hiá»‡n trÆ°á»�ng.Úlmstudiozqwen2.5-7b-instructé<   )Úshift_idÚ
agent_codeÚ
agent_nameÚ
role_titleÚtime_windowÚ
start_hourÚend_hourÚprimary_taskÚpreferred_providerÚpreferred_modelÚrate_limit_per_minzSHIFT-02-QAQCÚhungu   HÆ°ngu   Ká»¹ sÆ° QA/QC & HSEz09:00 - 10:30g      %@um   Tháº©m Ä‘á»‹nh káº¿t quáº£ nÃ©n máº«u bÃª tÃ´ng R28, chá»©ng chá»‰ xuáº¥t xÆ°á»Ÿng CO/CQ váº­t tÆ° cÃ¡t Ä‘Ã¡.Ú
openrouterzanthropic/claude-fable-5é
   zSHIFT-03-QS-BOQÚquynhu   Quá»³nhu   Ká»¹ sÆ° QS & Dá»± toÃ¡n BOQz10:30 - 12:00g      (@uv   BÃ³c tÃ¡ch khá»‘i lÆ°á»£ng thi cÃ´ng thá»±c táº¿, tÃ­nh toÃ¡n Ä‘Æ¡n giÃ¡ Ä‘á»‹nh má»©c 2026 vÃ  láº­p phá»¥ lá»¥c 03a.zdeepseek/deepseek-v4-proé   zSHIFT-04-ACCOUNTINGÚnamÚNamu   Káº¿ toÃ¡n trÆ°á»Ÿngz13:30 - 15:00g      +@g      .@ux   Ä�á»‘i soÃ¡t 3 bÃªn HÃ³a Ä‘Æ¡n VAT Ä‘iá»‡n tá»­ (MISA/GDT), kháº¥u trá»« táº¡m á»©ng 10% vÃ  giá»¯ láº¡i 5% báº£o hÃ nh.zanthropic/claude-opus-4.8é   zSHIFT-05-LEGALÚthaou   Tháº£ou   TrÆ°á»Ÿng ban PhÃ¡p cháº¿z15:00 - 16:30g     €0@ub   RÃ  soÃ¡t Ä‘iá»�u khoáº£n Há»£p Ä‘á»“ng FIDIC Clause 14.3 vÃ  quy Ä‘á»‹nh Luáº­t XÃ¢y dá»±ng 2025.é   zSHIFT-06-DIRECTORÚtungu   TÃ¹ngu   GiÃ¡m Ä‘á»‘c Dá»± Ã¡nz16:30 - 17:30g     €1@ui   Ä�Ã¡nh giÃ¡ chá»‰ sá»‘ tiáº¿n Ä‘á»™ SPI / chi phÃ­ CPI, kÃ½ duyá»‡t phÃ¡t hÃ nh há»“ sÆ¡ thanh toÃ¡n IPC.zstealth/ox-alphazSHIFT-07-SECRETARYÚthuyu   ThÃºyu   ThÆ° kÃ½ & Cung á»©ngz17:30 - 18:30g     €2@uj   Theo dÃµi Ä‘Æ¡n Ä‘áº·t hÃ ng PO, phiáº¿u nháº­p kho GRN vÃ  Ä‘á»‘i chiáº¿u phiáº¿u cÃ¢n bÃ¹n KÃªnh Ä�Ã´ng.z.mistralai/mistral-small-24b-instruct-2501:freezSHIFT-08-OPSÚminhÚMinhu*   Ä�iá»�u phá»‘i & Quáº£n trá»‹ Há»‡ thá»‘ngz18:30 - 19:30g     €3@ue   Tá»•ng káº¿t hoáº¡t Ä‘á»™ng trong ngÃ y, quÃ©t háº¡n dÃ¹ng Stealth Models vÃ  sao lÆ°u vector Qdrant.úlist[dict[str, Any]]ÚWORK_SHIFTSNÚpostgres_clientúErpDatabaseClient | NoneÚreturnÚNonec                ó>   — |pt          ¦   «         | _        i | _        d S ©N)r   r'   Ú_last_request_timestamp)Úselfr'   s     ú:C:\Projects\DSCons\app\services\agent_scheduler_service.pyÚ__init__zAgentSchedulerService.__init__€   s$   € Ø.ÐEÕ2CÑ2EÔ2EˆÔØ9;ˆÔ$Ð$Ð$ó    c                ó  — t          j        ¦   «         }|j        |j        dz  z   }g }| j        D ]U}|d         |cxk    o|d         k     nc }t          |¦  «        }||d<   |rdnd|d<   d|d	<   |                     |¦  «         ŒV|S )
uL   Láº¥y lá»‹ch lÃ m viá»‡c phÃ¢n bá»• so le trong ngÃ y cá»§a 9 NhÃ¢n sá»± AI.g      N@r   r   Úis_current_shiftÚACTIVE_DUTYÚSTANDBYÚstatusÚANTI_SPAM_RATE_LIMIT_GUARDÚprotection_strategy)r   ÚnowÚhourÚminuter&   ÚdictÚappend)r.   r9   Úcurrent_time_decÚresultÚsÚ	is_activeÚitems          r/   Úget_daily_schedulez(AgentSchedulerService.get_daily_schedule„   s¯   € åŒl‰nŒnˆØœ8 s¤z°DÑ'8Ñ9ÐàˆØÔ!ð 	 ð 	 ˆAØ˜,œÐ+;ÐKÐKÒKÐK¸aÀ
¼mÒKÐKÐKÐKˆIÝ˜‘7”7ˆDØ'0ˆDÐ#Ñ$Ø.7ÐF˜]˜]¸YˆD�‰NØ*FˆDÐ&Ñ'Ø�MŠM˜$ÑÔÐÐØˆr1   údict[str, Any]c                ó    — dddddddœg d¢d	d
œS )ud   BÃ¡o cÃ¡o tráº¡ng thÃ¡i bá»™ Ä‘á»‡m báº£o vá»‡ chá»‘ng Rate Limit & Spam Detection cá»§a OpenRouter.z;Distributed Time-Shifted Queue with Multi-Provider Failoverr   g      @z
0.5 - 2.0su\   Tá»± Ä‘á»™ng chuyá»ƒn tiáº¿p sang Local LM Studio (Offline 0% Cost) hoáº·c Gemini API DirectuA   Tá»± Ä‘á»™ng háº¡ cáº¥p sang Gemini 2.0 Flash / Qwen 32B an toÃ n)Úopenrouter_429Ústealth_expired)zToken Bucket Rate LimiterzDynamic Artificial JitterzPayload Batch Aggregationz$Local LM Studio Zero-Cost OffloadingÚOPTIMAL_PROTECTED)ÚstrategyÚopenrouter_free_rpm_capÚminimum_request_gap_secondsÚjitter_range_secondsÚfallback_routesÚactive_guardsÚsystem_health© )r.   s    r/   Úget_anti_spam_shield_statusz1AgentSchedulerService.get_anti_spam_shield_status“   sG   € ð VØ'(Ø+.Ø$0ð #AØ#fð ð  ðð ð ð 1ð
ð 
ð 	
r1   r   ÚstrÚproviderÚfloatc              ƒ  ót  K  — |› d|› �}t          j         ¦   «         }| j                             |d¦  «        }||z
  }d}t          j        dd¦  «        }||z   |z
  }	|	dk    r9t
                               d||	¦  «         t          j        |	¦  «        ƒ d{V —† |	}
nd}
t          j         ¦   «         | j        |<   |
S )	uƒ   Kiá»ƒm soÃ¡t táº§n suáº¥t gá»�i API cá»§a tá»«ng AI Agent, tá»± Ä‘á»™ng chÃ¨n jitter Ä‘á»ƒ chá»‘ng bá»‹ OpenRouter gáº¯n cá»� spam.ú:g        g       @g      à?gÍÌÌÌÌÌü?r   u:   [ANTI-SPAM GUARD] GiÃ£n cÃ¡ch gá»�i API cho %s trong %.2fsN)	Útimer-   ÚgetÚrandomÚuniformÚloggerÚdebugÚasyncioÚsleep)r.   r   rS   Úkeyr9   Úlast_tÚelapsedÚmin_gapÚjitterÚrequired_waitÚwaiteds              r/   Úthrottle_agent_callz)AgentSchedulerService.throttle_agent_call§   sÞ   è è € ð Ð(Ð(˜hÐ(Ð(ˆÝŒi‰kŒkˆØÔ-×1Ò1°#°sÑ;Ô;ˆØ˜‘,ˆàˆÝ”  SÑ)Ô)ˆØ  6Ñ)¨WÑ4ˆà˜1ÒÐÝ�LŠLØLØØñô ð õ
 ”- Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ø"ˆFˆFàˆFå,0¬I©K¬KˆÔ$ SÑ)Øˆr1   r,   )r'   r(   r)   r*   )r)   r%   )r)   rD   )r   )r   rR   rS   rR   r)   rT   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   Ú__annotations__r0   rC   rQ   rf   rP   r1   r/   r   r      s  € € € € € € Ø_Ð_ð
 (Ø Ø!Ø@Ø*ØØð FØ",Ø4Ø"$ð	
ð 	
ð (Ø Ø!Ø0Ø*ØØð LØ".Ø9Ø"$ð	
ð 	
ð *Ø!Ø#Ø8Ø*ØØð UØ".Ø9Ø"#ð	
ð 	
ð .ØØØ0Ø*ØØð WØ".Ø:Ø"$ð	
ð 	
ð )Ø Ø"Ø5Ø*ØØð AØ".Ø9Ø"#ð	
ð 	
ð ,Ø Ø!Ø1Ø*ØØð HØ".Ø1Ø"#ð	
ð 	
ð -Ø Ø!Ø1Ø*ØØð IØ".ØOØ"$ð	
ð 	
ð 'Ø Ø ØFØ*ØØð DØ".Ø1Ø"#ð	
ð 	
ðyi)€Kð ið ið iñ iðV<ð <ð <ð <ð <ðð ð ð ð
ð 
ð 
ð 
ð* 0<ðð ð ð ð ð ð r1   r   )rj   Ú
__future__r   r]   ÚloggingrY   rW   r   Útypingr   Úapp.core.postgres.erp_clientr   Ú	getLoggerr[   r   rP   r1   r/   ú<module>rq      sÆ   ðØ QÐ Qà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à :Ð :Ð :Ð :Ð :Ð :à	ˆÔ	Ð3Ñ	4Ô	4€ðoð oð oð oð oñ oô oð oð oð or1   