§
    s˜–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                  óf  — 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/d0dd1d2dd3d4dœd5d6d7d8d9d:d;d<dd=d>dœd?d@dAdBdCdDdEdFddGdHdœdIdJdKdLdMdNdOdPdd3dQdœdRdSdTdUdVdEdWdXddYd4dœdZd[d\d]d^d_d`daddbd!dœdcdddedfdgdhdidjddYd4dœgZdkedl<   d{d|dr„Zd}ds„Zd~du„Z	 dd€dz„Z	dmS )�ÚAgentSchedulerServicezUManages business work shifts and enforces anti-spam rate limiting across AI Personas.zSHIFT-01-EARLY-SITEÚphucu   PhÃºcu,   Tiáº¿n Ä‘á»™ & Nháº¯c viá»‡c cÃ´ng trÆ°á»�ngz06:00 - 08:30g      @g      !@ut   Thu tháº­p nháº­t trÃ¬nh xe Howo 4 chÃ¢n, sá»• ca mÃ¡y Ä‘Ã o Kobelco vÃ  Ä‘Ã´n Ä‘á»‘c 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-LOGISTICSÚtuanu   Tuáº¥nu.   Ká»¹ sÆ° Ä�á»‹nh má»©c & Báº£ng giÃ¡ Logisticsz07:00 - 09:30g      @g      #@u…   PhÃ¢n tÃ­ch biáº¿n Ä‘á»™ng giÃ¡ thÃ©p HÃ²a PhÃ¡t, xi mÄƒng HÃ  TiÃªn vÃ  Ä‘iá»�u phá»‘i váº­n táº£i váº­t tÆ° Ä‘áº¿n cÃ´ng trÆ°á»�ng.Ú
openrouterzanthropic/claude-3-haikué   zSHIFT-03-QAQCÚhungu   HÃ¹ngu'   Ká»¹ thuáº­t hiá»‡n trÆ°á»�ng & Ca mÃ¡yz08:30 - 10:30g      %@u{   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 Ä‘Ã¡ vÃ  mÃ¡y mÃ³c.zanthropic/claude-fable-5é
   zSHIFT-04-METHODSÚlamu   LÃ¢mu4   Ká»¹ sÆ° Biá»‡n phÃ¡p thi cÃ´ng & CÃ´ng trÃ¬nh táº¡mz09:00 - 11:30g      "@g      '@u   Thiáº¿t káº¿ biá»‡n phÃ¡p chá»‘ng vÄƒng táº§ng háº§m, tÃ­nh toÃ¡n kháº£ nÄƒng chá»‹u lá»±c cá»« Larsen vÃ  giÃ n giÃ¡o bao che.zdeepseek/deepseek-r1é   zSHIFT-05-QS-BOQÚquynhu   Quá»³nhu"   Káº¿ toÃ¡n chi phÃ­ & DÃ²ng tiá»�nz10:30 - 12:30g      )@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-06-ACCOUNTINGÚnamÚNamu   TÃ i chÃ­nh & Quyáº¿t toÃ¡nz13:30 - 15:30g      +@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-07-CLIENTÚlanÚLanu   ChÄƒm sÃ³c khÃ¡ch hÃ ng & CÄ�Tz14:00 - 16:30g      ,@g     €0@uˆ   Gá»­i bÃ¡o cÃ¡o tiáº¿n Ä‘á»™ báº±ng hÃ¬nh áº£nh flycam cho Ban Quáº£n lÃ½ Dá»± Ã¡n, giáº£i Ä‘Ã¡p tháº¯c máº¯c CÄ�T vá»� cháº¥t lÆ°á»£ng.zopenai/gpt-4o-minié   zSHIFT-08-LEGALÚthaou   Tháº£ou&   Há»“ sÆ¡ phÃ¡p lÃ½ & Ä�á»‹nh má»©c BoQz15:00 - 17:00g      .@g      1@u}   RÃ  soÃ¡t Ä‘iá»�u khoáº£n Há»£p Ä‘á»“ng FIDIC Clause 14.3 vÃ  quy Ä‘á»‹nh Luáº­t XÃ¢y dá»±ng 2026 chá»‘ng rá»§i ro thanh tra.é   zSHIFT-09-DIRECTORÚtungu   TÃ¹ngu%   Kiá»ƒm toÃ¡n ná»™i bá»™ & SoÃ¡t lá»—iz16:30 - 18:00g      2@u„   Ä�Ã¡nh giÃ¡ chá»‰ sá»‘ tiáº¿n Ä‘á»™ SPI / chi phÃ­ CPI, kÃ½ duyá»‡t phÃ¡t hÃ nh há»“ sÆ¡ thanh toÃ¡n IPC xuáº¥t ra Chá»§ Ä�áº§u TÆ°.zstealth/ox-alphazSHIFT-10-SECRETARYÚthuyu   Thá»§yu&   Trá»£ lÃ½ GiÃ¡m Ä‘á»‘c & Ä�iá»�u hÃ nhz17:30 - 19:30g     €1@g     €3@uƒ   Theo dÃµi Ä‘Æ¡n Ä‘áº·t hÃ ng PO, phiáº¿u nháº­p kho GRN, táº­p há»£p bÃ¡o cÃ¡o ngÃ y vÃ  Ä‘á»‘i chiáº¿u phiáº¿u cÃ¢n tráº¡m trá»™n.z.mistralai/mistral-small-24b-instruct-2501:freezSHIFT-11-OPSÚminhÚMinhu-   Ä�iá»�u phá»‘i tá»•ng & PhÃ¡p lÃ½ Luáº­t 2026z19:00 - 21:00g      3@g      5@uy   Tá»•ng káº¿t hoáº¡t Ä‘á»™ng toÃ n cÃ´ng ty trong ngÃ y, quÃ©t tá»± trá»‹ (Autonomous Sweep) vÃ  sao lÆ°u CSDL ná»™i bá»™.ú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     úLC:\Projects\DSCons\app\modules\agents\application\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)r5   r@   Úcurrent_time_decÚresultÚsÚ	is_activeÚitems          r6   Ú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˜$ÑÔÐÐØˆr8   ú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© )r5   s    r6   Úget_anti_spam_shield_statusz1AgentSchedulerService.get_anti_spam_shield_statusº   sG   € ð VØ'(Ø+.Ø$0ð #AØ#fð ð  ðð ð ð 1ð
ð 
ð 	
r8   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)	Útimer4   ÚgetÚrandomÚuniformÚloggerÚdebugÚasyncioÚsleep)r5   r   rZ   Úkeyr@   Úlast_tÚelapsedÚmin_gapÚjitterÚrequired_waitÚwaiteds              r6   Ú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Ñ)Øˆr8   r3   )r.   r/   r0   r1   )r0   r,   )r0   rK   )r   )r   rY   rZ   rY   r0   r[   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   Ú__annotations__r7   rJ   rX   rm   rW   r8   r6   r   r      s­  € € € € € € Ø_Ð_ð
 .Ø Ø!ØHØ*ØØð SØ",Ø4Ø"$ð	
ð 	
ð -Ø Ø"ØJØ*ØØð dØ".Ø9Ø"$ð	
ð 	
ð (Ø Ø!ØCØ*ØØð ZØ".Ø9Ø"$ð	
ð 	
ð +ØØ ØPØ*ØØð ^Ø".Ø5Ø"#ð	
ð 	
ð *Ø!Ø#Ø>Ø*ØØð UØ".Ø9Ø"#ð	
ð 	
ð .ØØØ7Ø*ØØð WØ".Ø:Ø"$ð	
ð 	
ð *ØØØ:Ø*ØØð gØ".Ø3Ø"$ð	
ð 	
ð )Ø Ø"ØBØ*ØØð \Ø".Ø9Ø"#ð	
ð 	
ð ,Ø Ø!ØAØ*ØØð cØ".Ø1Ø"#ð	
ð 	
ð -Ø Ø"ØBØ*ØØð bØ".ØOØ"$ð	
ð 	
ð 'Ø Ø ØIØ*ØØð XØ".Ø1Ø"#ð	
ð 	
ðGP)€Kð Pð Pð Pñ Pðd<ð <ð <ð <ð <ðð ð ð ð
ð 
ð 
ð 
ð* 0<ðð ð ð ð ð ð r8   r   )rq   Ú
__future__r   rd   Úloggingr`   r^   r   Útypingr   Úapp.core.postgres.erp_clientr   Ú	getLoggerrb   r   rW   r8   r6   ú<module>rx      sÆ   ðØ QÐ Qà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à :Ð :Ð :Ð :Ð :Ð :à	ˆÔ	Ð3Ñ	4Ô	4€ðVð Vð Vð Vð Vñ Vô Vð Vð Vð Vr8   