
    qi*f                     Z   % S r SSKrSSKrSSKrSSKrSSKJrJr  SSKJr  SSK	J
r
  SSKJrJrJrJr   SSKJr  \
" \5      R&                  R&                  S-  r\" \5        S	rS
SSS
SSS.rSSS.SSS.SSS.S.r\\\\\4   4   \S'   SrSrSrSrSr Sr!S1r"1 Skr#\ " S S5      5       r$\ " S S5      5       r% " S S5      r&Sq'\\&   \S '   S!\&4S" jr(S#\S!\$4S$ jr)S%\\   S!\%4S& jr*S!\+4S' jr,\-S(:X  a'  SSK.r.\," 5       r/\.R`                  " \/(       a  SOS)5        gg! \ a     Nf = f)*a  
GENESIS KIMI EXECUTOR
======================
Moonshot AI Kimi K2.5 as a Genesis execution backend.

Uses Moonshot's OpenAI-compatible API directly (not via OpenRouter).
Base URL: https://api.moonshot.cn/v1
Models: moonshot-v1-8k, moonshot-v1-32k, moonshot-v1-128k

Same interface as gemini_executor: execute_task_sync() + execute_tasks_parallel().

Model routing:
  - moonshot-v1-8k    (short tasks, rapid Q&A, classification)   $0.15/1M tokens
  - moonshot-v1-32k   (typical Genesis stories, code gen)         $0.15/1M tokens
  - moonshot-v1-128k  (long documents, multi-file, deep research) $0.60/1M tokens

Usage:
    executor = KimiExecutor()
    result = executor.execute_task_sync("What is 2 + 2?")
    print(result.response)

    # Parallel swarm
    results = executor.execute_tasks_parallel([
        "Analyse revenue pipeline",
        "Draft outreach email for TradiesVoice",
        "Research competitor pricing",
    ])
    for r in results:
        print(r.response)

Author: Genesis System
Version: 1.0.0
    N)	dataclassfield)datetime)Path)AnyDictListOptional)load_dotenvz.envzhttps://api.moonshot.cn/v1moonshot-v1-8kmoonshot-v1-32kmoonshot-v1-128k)8k32k128kfaststandardmax333333?inputoutputg333333?)r   r   r   MOONSHOT_PRICING2   
      g      ?g      N@  >   r           c                       \ rS rSr% Sr\\S'   \\S'   \\S'   \\S'   \	\S'   \	\S'   \\S	'   S
r
\\   \S'   Sr\\S'   Sr\\S'   S\4S jrSrg
)ExecutionResult]   z
Unified result from Kimi execution.

Mirrors the GeminiResponse pattern so the two executors are
interchangeable in the Genesis Execution Layer.
successresponsemodeltokens_usedcost_estimateexecution_timetask_completeNerrorr   prompt_tokenscompletion_tokensreturnc                     U R                   $ N)r&   selfs    'E:\genesis-system\core\kimi_executor.py__str__ExecutionResult.__str__q   s    }}     )__name__
__module____qualname____firstlineno____doc__bool__annotations__strintfloatr,   r
   r-   r.   r5   __static_attributes__r8   r7   r4   r#   r#   ]   s_     MMJE8C=M3s r7   r#   c                       \ rS rSr% Sr\" \S9r\\	   \
S'   Sr\\
S'   Sr\\
S'   Sr\\
S	'   Sr\\
S
'   Sr\\
S'   \S\\   4S j5       r\S\\   4S j5       r\S\4S j5       rSrg)KimiSwarmResultu   z+Aggregate result from a parallel swarm run.)default_factoryresultsr   total_tokens        
total_costelapsed_secondssuccess_countfailure_countr/   c                 X    U R                    Vs/ s H  oR                  PM     sn$ s  snf )z9All response texts (including failures as empty strings).)rH   r&   r3   rs     r4   	responsesKimiSwarmResult.responses   s"     %)LL1Lq

L111s   'c                 ~    U R                    Vs/ s H!  oR                  (       d  M  UR                  PM#     sn$ s  snf )zOnly successful response texts.)rH   r%   r&   rP   s     r4   successful_responses$KimiSwarmResult.successful_responses   s*     %)LL>LqII


L>>>s   ::c                      U R                   S:H  $ )Nr   )rN   r2   s    r4   all_successKimiSwarmResult.all_success   s    !!Q&&r7   r8   N)r9   r:   r;   r<   r=   r   listrH   r	   r#   r?   rI   rA   rK   rB   rL   rM   rN   propertyr@   rR   rU   r>   rX   rC   r8   r7   r4   rE   rE   u   s    5%*4%@GT/"@L#J OU M3M3249 2 2 ?d3i ? ? 'T ' 'r7   rE   c                      \ rS rSrSrSS\4S\\   S\S\4S jjr	\
S	\\   4S
 j5       rS	\4S jrS r\
S\S\S\S	\4S j5       r\
S\S	\4S j5       r    S!S\S\\   S\\   S\S\S	\4S jjr     S"S\\   S\\   S\\   S\S\S\\   S	\4S jjrS\S	\4S jrS\S\S	S4S jrS	\\\4   4S jrS	\\\4   4S jrS rg)#KimiExecutor   uD  
Direct Moonshot API executor for Genesis.

Provides the same interface as GeminiExecutor:
  - execute_task_sync(task)  — synchronous single call
  - execute_tasks_parallel(tasks) — parallel swarm execution

Thread-safe; safe to instantiate multiple times (each instance holds its
own OpenAI client and usage counters).
Nr   api_keydefault_modelmax_workersc                 H   U=(       d    U R                  5       U l        [        R                  U[        5      U l        [        U[        5      U l        [        S5      U l
        U R                  R                  R                  SSS9  SU l        SU l        SU l        S U l        g )Nz0E:/genesis-system/data/kimi_executor_usage.jsonlT)parentsexist_okr   rJ   )_load_api_keyr_   MOONSHOT_MODELSgetDEFAULT_MODELr`   minMAX_CONCURRENT_WORKERSra   r   usage_log_pathparentmkdirtotal_callsrI   rK   _client)r3   r_   r`   ra   s       r4   __init__KimiExecutor.__init__   s     6$"4"4"6,00N{,BC"#UV""(((E r7   r/   c                      S H<  n [         R                  R                  U S5      R                  5       nU(       d  M:  Us  $    g)z9Load API key from environment (prefers MOONSHOT_API_KEY).)MOONSHOT_API_KEYMOONSHOT_KEY N)osenvironrg   strip)varkeys     r4   re   KimiExecutor._load_api_key   s:     8C**..b)//1Cs
 8 r7   c                 ,    [        U R                  5      $ )z(Return True if the API key is available.)r>   r_   r2   s    r4   is_configuredKimiExecutor.is_configured   s    DLL!!r7   c                     U R                   c!   SSKJn  U" U R
                  [        S9U l         U R                   $ ! [         a  n[	        S5      UeSnAff = f)z2Lazy-load and return the OpenAI-compatible client.Nr   )OpenAIz5openai package not installed. Run: pip install openai)r_   base_url)ro   openair   ImportErrorRuntimeErrorr_   MOONSHOT_BASE_URL)r3   r   excs      r4   _get_clientKimiExecutor._get_client   s]    <<)
 "*DL ||  "Ks   ; 
AAAr'   r-   r.   c                 b    [         R                  U SSS.5      nUS-  US   -  US-  US   -  -   $ )z,Return estimated USD cost for a single call.r   r   i@B r   r   )r   rg   )r'   r-   r.   pricings       r4   _estimate_costKimiExecutor._estimate_cost   sJ     #&&u.MNY&''*:: 9,0AAB	
r7   taskc                 R    [        U R                  5       5      nUS:  a  gUS:  a  gg)u   
Auto-select model based on task length.

Heuristic:
  < 2 000 words  → 8k  (cheapest)
  2 000–8 000    → 32k
  > 8 000        → 128k (long context)
i@  r   i  r   r   )lensplit)r   
word_counts     r4   _select_model_for_task#KimiExecutor._select_model_for_task   s-     &
%$r7   promptsystem_prompt
max_tokenstemperaturec                    U R                  5       (       d#  [        SSU=(       d    U R                  SSSSSS9$ U(       a  [        R	                  X"5      OU R                  U5      n/ nU(       a  UR                  SUS.5        UR                  S	US.5        [        R                  " 5       nS
n	[        [        5       GHG  n
 U R                  5       nUR                  R                  R                  UUUUS9n[        R                  " 5       U-
  nUR                  nU(       a  UR                  OSnU(       a  UR                   OSnU(       a  UR"                  OSnU R%                  XoU5      nUR&                  S   R(                  R*                  =(       d    SnSU;   n[        SUUUUUUUUS9	nU =R,                  S-  sl        U =R"                  U-  sl        U =R.                  U-  sl        U R1                  UUS
S 5        Us  $    [        R                  " 5       U-
  n[        SSUSSUSU	S9$ ! [2         Ga  n[5        U5      n	[7        [7        USS
5      SS
5      nU[8        ;   =(       d    SU	R;                  5       ;   =(       d    SU	;   nU[<        ;   =(       d6    U=(       d-    SU	R;                  5       ;   =(       d    SU	R;                  5       ;   nU(       a  U
[        S-
  :X  a   S
nA  M  [?        [@        SU
-  -  [B        5      nU(       a  [E        US5      n[        RF                  " U5         S
nAGM|  S
nAff = f)u  
Execute a single prompt with exponential-backoff retry on rate limits.

Args:
    prompt:        The user prompt / task description.
    model:         Model key ("fast", "standard", "max") or full name.
                   If None, auto-selected from prompt length.
    system_prompt: Optional system message.
    max_tokens:    Maximum output tokens.
    temperature:   Sampling temperature (0–1).

Returns:
    ExecutionResult with response and cost metadata.
Fru   r   rJ   z7MOONSHOT_API_KEY not set. Add to E:\genesis-system\.env)r%   r&   r'   r(   r)   r*   r+   r,   system)rolecontentuserN)r'   messagesr   r   TASK_COMPLETET)	r%   r&   r'   r(   r)   r*   r+   r-   r.      x   r&   status_codez
rate limit429timeout
connection   g      @)$r}   r#   r`   rf   rg   r   appendtimerangeMAX_RETRIESr   chatcompletionscreateusager-   r.   rI   r   choicesmessager   rn   rK   
_log_usage	Exceptionr@   getattrRATE_LIMIT_CODESlowerRETRYABLE_CODESri   RETRY_BASE_DELAYRETRY_MAX_DELAYr   sleep)r3   r   r'   r   r   r   resolved_modelr   
start_time
last_errorattemptclientr&   elapsedr   r-   r.   rI   costtextr+   resultr   r   is_rate_limitis_retryabledelays                              r4   executeKimiExecutor.execute   s   , !!##"1t11!"#Q	 	  -,,V4 	 *,OOX-HIF;<YY[
$(
[)G?"))+!;;2299(%) +	 :  ))+
2 7< 3 3!?DE$;$;!!5:u11**>J[\''*22::@b /4 7( !( ,"&#*"/"/&7
   A% !!\1!4't5M *D ))+
* "	
 		
7  " X
%gc:t&DmUYZ  #33 +#z'7'7'99+
*   ?2 :$: J$4$4$66: $z'7'7'99	  $w+/'A ,W=O sOE

5!!1"s!   EH11L><B,L9/AL99L>tasksc           	      t  ^ ^^^^^^ T(       d
  [        5       $ [        U=(       d    T R                  [        [	        T5      5      m[
        R
                  " 5       nS[        [           4UUUU UUU4S jjn [        R                  " 5       n	U	R                  5       (       a\  SSKn
U
R                  R                  SS9 nUR                  [        R                  U" 5       5      nUR!                  5       nSSS5        OU	R#                  U" 5       5      n [
        R
                  " 5       U-
  n['        S W 5       5      n['        S U 5       5      n['        S	 U 5       5      n[	        U5      U-
  n[        UUUUUUS
9$ ! , (       d  f       Nx= f! [$         a    [        R                  " U" 5       5      n Nf = f)aO  
Execute multiple tasks in parallel using asyncio + thread pool.

Up to 50 concurrent workers (configurable).
Tasks are returned in the same order they were submitted.

Args:
    tasks:         List of prompt strings.
    model:         Model key or full name (None = auto-select per task).
    system_prompt: Shared system message applied to every task.
    max_tokens:    Max output tokens per task.
    temperature:   Sampling temperature.
    max_workers:   Override concurrent workers (default: self.max_workers).

Returns:
    KimiSwarmResult with ordered results and aggregate stats.
r/   c                  
  >^^#    [         R                  " T5      m[         R                  " 5       mS[        S[        4UUUUUUU
4S jjn [         R
                  " T	 Vs/ s H
  o" U5      PM     sn6 I S h  vN $ s  snf  N	7f)Ntask_promptr/   c           
         >#    T IS h  vN   TR                  S U 4UUUUU4S jj5      I S h  vN sS S S 5      IS h  vN   $  N: N N	! , IS h  vN  (       d  f       g = f7f)Nc                 *   > TR                  U TTTTS9$ )N)r   r'   r   r   r   r   )pr   r'   r3   r   r   s    r4   <lambda>YKimiExecutor.execute_tasks_parallel.<locals>._run_all.<locals>._run_one.<locals>.<lambda>  s"    dll#$"'*7'1(3 /; /r7   )run_in_executor)r   loopr   r'   r3   semr   r   s    r4   _run_oneGKimiExecutor.execute_tasks_parallel.<locals>._run_all.<locals>._run_one  sG     3!%!5!5!,  	" 	 33	 333sR   A%AA%!AAAA%A	 A%A	A%A"AA"A%)asyncio	Semaphoreget_event_loopr@   r#   gather)r   tr   r   effective_workersr   r'   r3   r   r   r   s     @@r4   _run_all5KimiExecutor.execute_tasks_parallel.<locals>._run_all  sj     ##$56C))+DC O   !u)Eu!(1+u)EFFF)EFs   ABA<0B7B8
Br   Nr   )ra   c              3   8   #    U  H  oR                   v   M     g 7fr1   )r(   .0rQ   s     r4   	<genexpr>6KimiExecutor.execute_tasks_parallel.<locals>.<genexpr>  s     ?,Q==,   c              3   8   #    U  H  oR                   v   M     g 7fr1   )r)   r   s     r4   r   r     s     ?,Q,r   c              3   J   #    U  H  oR                   (       d  M  S v   M     g7f)r   N)r%   r   s     r4   r   r     s     A|!yyAA|s   #	#)rH   rI   rK   rL   rM   rN   )rE   ri   ra   rj   r   r   r	   r#   r   r   
is_runningconcurrent.futuresfuturesThreadPoolExecutorsubmitrunr   run_until_completer   sum)r3   r   r'   r   r   r   ra   r   r   r   
concurrentpoolfutureresults_listr   rI   rK   rM   rN   r   s   ``````             @r4   execute_tasks_parallel#KimiExecutor.execute_tasks_parallelr  sn   4 "$$+4++"J
 YY[
	G_ 5 	G 	G(	3))+D  )''::q:IT![[hjAF:@--/L JI  $66xzB ))+
*?,???,??
A|AAL)M9 %!#''
 	
 JI
  	3";;xz2L	3s7   7AF >6E>4F =F >
FF F %F76F7c                 *    U R                   " SSU0UD6$ )zh
Synchronous single-task execution.

Matches the genesis_execution_layer.execute_task_sync() signature.
r   r8   r   )r3   r   kwargss      r4   execute_task_syncKimiExecutor.execute_task_sync  s     ||242622r7   r   prompt_previewc                    [         R                  " 5       R                  5       UR                  UR                  UR
                  UR                  [        UR                  S5      [        UR                  S5      UR                  UR                  US.
n [        U R                  SSS9 nUR                  [        R                   " U5      S-   5        SSS5        g! , (       d  f       g= f! ["         a     gf = f)	z-Append a JSONL log entry for budget tracking.      )
	timestampr'   r-   r.   rI   cost_usdexecution_time_sr%   r+   r   autf-8encoding
N)r   now	isoformatr'   r-   r.   r(   roundr)   r*   r%   r+   openrk   writejsondumpsr   )r3   r   r   entryfhs        r4   r   KimiExecutor._log_usage  s     "113\\#11!'!9!9"..f22A6 %f&;&;Q ?~~#11,
	d))3ARE*T12 BAA 		s0   C, ))CC, 
C)%C, )C, ,
C98C9c                    U R                  5       U R                  [        U R                  U R                  U R
                  [        U R                  S5      U R                  (       a#  U R                  SS  SU R                  SS  3S.$ SS.$ )z@Return current executor status (mirrors GeminiExecutor pattern).   Nr   z...zNOT SET)
configuredr`   r   ra   rn   rI   total_cost_usdapi_key_preview)	r}   r`   r   ra   rn   rI   r  rK   r_   r2   s    r4   
get_statusKimiExecutor.get_status  s     ,,.!//)++++ --#DOOQ7 << <<#$CRS(9':;
 	
 
 	
r7   c                    SnSnU R                   R                  5       (       aW  [        U R                   SSS9 nU H3  n [        R                  " U5      nXR                  SS5      -  nUS-  nM5     SSS5        US:  a  X-  OSn[        US	5      U[        US
5      [        [        R                  5       5      S.$ ! [        R                  [        4 a     M  f = f! , (       d  f       Nq= f)zAGet cost tracking (parallel to GeminiExecutor.get_budget_status).rJ   r   rQ   r   r  r   r   Nr  r   )total_spent_usdrn   avg_cost_per_callmodels)rk   existsr  r	  loadsrg   JSONDecodeErrorKeyErrorr  rZ   rf   values)r3   spentcallsr  liner  avgs          r4   get_budget_statusKimiExecutor.get_budget_status  s    %%''d))3ARD $

4 0:s!;;
	  B  %qyemc$UA !&sA?1134	
 	
 !00(;  BAs/   C /B=/C=CCCC
C,)ro   r_   r`   ra   rn   rK   rI   rk   )NN    ffffff?)NNr%  r&  N)r9   r:   r;   r<   r=   DEFAULT_CONCURRENT_WORKERSr
   r@   rA   rp   staticmethodre   r>   r}   r   rB   r   r   r#   r   r	   rE   r   r   r   r   r   r  r#  rC   r8   r7   r4   r]   r]      s   	 "&'5	#  	, 8C=  "t "" 
c 
# 
# 
RW 
 
  S  S    *  $'+ |
|
 }|
  }	|

 |
 |
 
|
F  $'+ %)V
CyV
 }V
  }	V

 V
 V
 c]V
 
V
t3c 3 3 # $ ,
DcN 
"
4S> 
r7   r]   _default_executorr/   c                  0    [         c
  [        5       q [         $ r1   )r)  r]   r8   r7   r4   _get_default_executorr+    s     (Nr7   r   c                 8    [        5       R                  " U 40 UD6$ )z
Drop-in replacement for genesis_execution_layer.execute_task_sync().

Routes through the Moonshot API with auto model selection.
)r+  r   )r   r   s     r4   r   r   "  s     !"44TDVDDr7   r   c                 8    [        5       R                  " U 40 UD6$ )uC  
Parallel swarm execution — up to 50 concurrent workers.

Example:
    from core.kimi_executor import execute_tasks_parallel
    results = execute_tasks_parallel([
        "Summarise the Q1 revenue pipeline",
        "Draft outreach email for TradiesVoice",
    ])
    for r in results.results:
        print(r.response)
)r+  r   )r   r   s     r4   r   r   +  s     !"99%J6JJr7   c                  R   [        S5        [        S5        [        S5        [        5       n U R                  5       (       d"  [        S5        [        S5        [        S5        gU R                  5       n[        SUS    35        [        S	US
    35        [        SUS    35        [        5         [        S5        U R	                  SSSS9nUR
                  (       a  [        S5        [        SUR                  R                  5        35        [        SUR                   35        [        SUR                  S 35        [        SUR                  S S35        [        SUR                   35        O[        SUR                   35        g[        5         [        S5        U R                  / SQSSSS9nUR                  (       a  [        S UR                   S![!        UR"                  5       S"35        [%        UR"                  S#5       H/  u  pE[        S$U S%UR                  R                  5       < 35        M1     [        S&UR&                   35        [        S'UR(                  S 35        [        S(UR*                  S S35        Ot[        S)UR,                   S*35        UR"                   H.  nUR
                  (       a  M  [        S+UR                   35        M0     UR                  S,:  a  [        S-5        Og[        5         [        S5        [        S.5        [        S5        g/)0zi
Execute a live API call against Moonshot and print results.

Returns True on SUCCESS, False on failure.
z<============================================================u   KIMI EXECUTOR — LIVE TESTz [FAIL] MOONSHOT_API_KEY not set.z%       Add to E:\genesis-system\.env:z       MOONSHOT_API_KEY=sk-...Fz
API Key : r  z
Model   : r`   z
Workers : ra   z1--- Test 1: Single execution (moonshot-v1-8k) ---z*What is 2 + 2? Reply with just the number.r      )r   r'   r   z	  SUCCESSz  Response : z  Tokens   : z  Cost     : $z.8fz  Latency  : z.2fsz  Model    : z
  FAILED: z8--- Test 2: Parallel swarm (3 tasks, moonshot-v1-8k) ---)zReply with just the word: ALPHAzReply with just the word: BETAzReply with just the word: GAMMAr   )r   r'   r   ra   u     SUCCESS — /z tasks passedr   z  Task z: z  Total tokens : z  Total cost   : $z  Wall time    : u     PARTIAL FAILURE — z tasks failedz	  Error: r   u8     (Partial success — rate limit transient, acceptable)zKIMI EXECUTOR TEST: SUCCESST)printr]   r}   r  r   r%   r&   rx   r(   r)   r*   r'   r,   r   rX   rM   r   rH   	enumeraterI   rK   rL   rN   )executorstatusr   swarm_resultirQ   s         r4   _run_live_testr8  ?  s    
(O	
'(	(O~H!!##0178./  "F	Jv/01
23	Jvo./
01	Jvm,-
./	G 

=>;  F ~~	foo335678f00123v33C89:f33C8:;fll^,-
6<<.)*	G 

DE22

  3 	L |99:!C@T@T<U;VVcdel22A6DAGA3b!1!1!3 678 7!,";";!<=>"<#:#:3"?@A!,">">s!C1EF&|'A'A&B-PQ%%A999	!''+, & %%*LM	G	(O	
'(	(Or7   __main__r   )1r=   r   r	  rv   r   dataclassesr   r   r   pathlibr   typingr   r   r	   r
   dotenvr   __file__rl   	_env_pathr   r   rf   r   r@   rB   r?   rh   rj   r'  r   r   r   r   r   r#   rE   r]   r)  r+  r   r   r>   r8  r9   sysokexitr8   r7   r4   <module>rC     s   D   	  (   , ,	"X%%,,v5I	 1  ! #'$7"&$7"&$71 $sDe,,-  "    5 +   . ' ' '8~
 ~
L -1 8L) 0| EC Eo EK$s) K/ K(P Pf z		BHH"Q! A  		s   -D! !D*)D*