
    qi*f                     D   U d Z ddlZddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZ 	 ddlmZ  e
e      j&                  j&                  dz  Z ee       d	Zd
ddd
dddZddddddddddZeeeeef   f   ed<   dZdZdZdZdZ dZ!dhZ"h dZ#e G d d             Z$e G d d             Z% G d d      Z&da'ee&   ed <   d!e&fd"Z(d#ed!e$fd$Z)d%ee   d!e%fd&Z*d!e+fd'Z,e-d(k(  r"ddl.Z. e,       Z/ e.j`                  e/rdnd)       yy# e$ r Y w xY w)*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                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   d	Z	e
e   ed
<   dZeed<   dZeed<   defdZy	)ExecutionResultz
    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                     | j                   S N)r%   selfs    +/mnt/e/genesis-system/core/kimi_executor.py__str__zExecutionResult.__str__q   s    }}    )__name__
__module____qualname____doc__bool__annotations__strintfloatr+   r
   r,   r-   r4    r5   r3   r#   r#   ]   s_     MMJE8C=M3s r5   r#   c                       e Zd ZU dZ ee      Zee   e	d<   dZ
ee	d<   dZee	d<   dZee	d<   dZee	d	<   dZee	d
<   edee   fd       Zedee   fd       Zedefd       Zy)KimiSwarmResultz+Aggregate result from a parallel swarm run.)default_factoryresultsr   total_tokens        
total_costelapsed_secondssuccess_countfailure_countr.   c                 T    | j                   D cg c]  }|j                   c}S c c}w )z9All response texts (including failures as empty strings).)rC   r%   r2   rs     r3   	responseszKimiSwarmResult.responses   s      %)LL1q

111s   %c                 n    | j                   D cg c]  }|j                  s|j                   c}S c c}w )zOnly successful response texts.)rC   r$   r%   rK   s     r3   successful_responsesz$KimiSwarmResult.successful_responses   s&     %)LL>qAII

>>>s   22c                      | j                   dk(  S )Nr   )rI   r1   s    r3   all_successzKimiSwarmResult.all_success   s    !!Q&&r5   N)r6   r7   r8   r9   r   listrC   r	   r#   r;   rD   r=   rF   r>   rG   rH   rI   propertyr<   rM   rO   r:   rQ   r?   r5   r3   rA   rA   u   s    5%*4%@GT/"@L#J OU M3M3249 2 2 ?d3i ? ? 'T ' 'r5   rA   c                   j   e Zd ZdZddefdee   dedefdZe	dee   fd	       Z
defd
Zd Ze	dedededefd       Ze	dedefd       Z	 	 	 	 ddedee   dee   dededefdZ	 	 	 	 	 d dee   dee   dee   dededee   defdZdedefdZdededdfdZdeeef   fdZdeeef   fdZy)!KimiExecutoru`  
    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                 D   |xs | j                         | _        t        j                  |t              | _        t        |t              | _        t        d      | _
        | j                  j                  j                  dd       d| _        d| _        d| _        d | _        y )Nz0E:/genesis-system/data/kimi_executor_usage.jsonlT)parentsexist_okr   rE   )_load_api_keyrV   MOONSHOT_MODELSgetDEFAULT_MODELrW   minMAX_CONCURRENT_WORKERSrX   r   usage_log_pathparentmkdirtotal_callsrD   rF   _client)r2   rV   rW   rX   s       r3   __init__zKimiExecutor.__init__   s     6$"4"4"6,00N{,BC"#UV""(((E r5   r.   c                  z    dD ]6  } t         j                  j                  | d      j                         }|s4|c S  y)z9Load API key from environment (prefers MOONSHOT_API_KEY).)MOONSHOT_API_KEYMOONSHOT_KEY N)osenvironr^   strip)varkeys     r3   r\   zKimiExecutor._load_api_key   s=     8 	C**..b)//1C
	 r5   c                 ,    t        | j                        S )z(Return True if the API key is available.)r:   rV   r1   s    r3   is_configuredzKimiExecutor.is_configured   s    DLL!!r5   c                     | j                   $	 ddlm}  || j
                  t              | _         | j                   S # t        $ r}t	        d      |d}~ww xY w)z2Lazy-load and return the OpenAI-compatible client.Nr   )OpenAIz5openai package not installed. Run: pip install openai)rV   base_url)rf   openairt   ImportErrorRuntimeErrorrV   MOONSHOT_BASE_URL)r2   rt   excs      r3   _get_clientzKimiExecutor._get_client   s]    <<)
 "*DL ||  "Ks   = 	AAAr&   r,   r-   c                 b    t         j                  | ddd      }|dz  |d   z  |dz  |d   z  z   S )z,Return estimated USD cost for a single call.r   r   i@B r   r   )r   r^   )r&   r,   r-   pricings       r3   _estimate_costzKimiExecutor._estimate_cost   sJ     #&&u.MNY&''*:: 9,0AAB	
r5   taskc                 N    t        | j                               }|dkD  ry|dkD  ryy)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     r3   _select_model_for_taskz#KimiExecutor._select_model_for_task   s-     &
%$r5   promptsystem_prompt
max_tokenstemperaturec                    | j                         s!t        dd|xs | j                  ddddd      S |rt        j	                  ||      n| j                  |      }g }|r|j                  d|d       |j                  d	|d       t        j                         }d
}	t        t              D ]8  }
	 | j                         }|j                  j                  j                  ||||      }t        j                         |z
  }|j                  }|r|j                  nd}|r|j                   nd}|r|j"                  nd}| j%                  |||      }|j&                  d   j(                  j*                  xs d}d|v }t        d||||||||	      }| xj,                  dz  c_        | xj"                  |z  c_        | xj.                  |z  c_        | j1                  ||d
d        |c S  t        j                         |z
  }t        dd|dd|d|	      S # t2        $ r}t5        |      }	t7        t7        |dd
      dd
      }|t8        v xs d|	j;                         v xs d|	v }|t<        v xs* |xs& d|	j;                         v xs d|	j;                         v }|r|
t        dz
  k(  rY d
}~ t?        t@        d|
z  z  tB              }|rtE        |d      }t        jF                  |       Y d
}~?d
}~ww xY w)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.
        Frk   r   rE   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      @)$rr   r#   rW   r]   r^   r   appendtimerangeMAX_RETRIESr{   chatcompletionscreateusager,   r-   rD   r~   choicesmessager   re   rF   
_log_usage	Exceptionr<   getattrRATE_LIMIT_CODESlowerRETRYABLE_CODESr`   RETRY_BASE_DELAYRETRY_MAX_DELAYr   sleep)r2   r   r&   r   r   r   resolved_modelr   
start_time
last_errorattemptclientr%   elapsedr   r,   r-   rD   costtextr*   resultrz   r   is_rate_limitis_retryabledelays                              r3   executezKimiExecutor.execute   s   , !!#"1t11!"#Q	 	  u-,,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    1D3H	K0BK+(=K++K0tasksc                 H    s
t               S t        |xs  j                  t        t	                    t        j
                         }dt        t           f fd}	 t        j                         }	|	j                         r_ddl}
|
j                  j                  d      5 }|j                  t        j                   |             }|j!                         }ddd       n|	j#                   |             }t        j
                         |z
  }t'        d D              }t'        d |D              }t'        d	 |D              }t	        |      |z
  }t        ||||||
      S # 1 sw Y   uxY w# t$        $ r t        j                   |             }Y w xY w)a  
        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                     K   t        j                        t        j                         dt        dt        f
fd} t        j
                  	D cg c]
  } | |       c}  d {   S c c}w 7 	w)Ntask_promptr.   c           
         K   4 d {    j                  d | ffd	       d {   cd d d       d {    S 7 87 7 	# 1 d {  7  sw Y   y xY ww)Nc                 0    j                  |       S )N)r   r&   r   r   r   r   )pr   r&   r2   r   r   s    r3   <lambda>zYKimiExecutor.execute_tasks_parallel.<locals>._run_all.<locals>._run_one.<locals>.<lambda>  s$    dll#$"'*7'1(3 /; / r5   )run_in_executor)r   loopr   r&   r2   semr   r   s    r3   _run_onezGKimiExecutor.execute_tasks_parallel.<locals>._run_all.<locals>._run_one  sb      
 
!%!5!5!,  	" 	
 
 
	
 
 
 
sQ   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&   r2   r   r   r   s     @@r3   _run_allz5KimiExecutor.execute_tasks_parallel.<locals>._run_all  sg     ##$56C))+DC O   !u)E!(1+)EFFF)EFs   AA<A5)A<0A:1
A<r   Nr   )rX   c              3   4   K   | ]  }|j                     y wr0   )r'   .0rL   s     r3   	<genexpr>z6KimiExecutor.execute_tasks_parallel.<locals>.<genexpr>  s     ?Q1==?   c              3   4   K   | ]  }|j                     y wr0   )r(   r   s     r3   r   z6KimiExecutor.execute_tasks_parallel.<locals>.<genexpr>  s     ?Q?r   c              3   :   K   | ]  }|j                   sd   yw)r   N)r$   r   s     r3   r   z6KimiExecutor.execute_tasks_parallel.<locals>.<genexpr>  s     A!qyyAAs   )rC   rD   rF   rG   rH   rI   )rA   r`   rX   ra   r   r   r	   r#   r   r   
is_runningconcurrent.futuresfuturesThreadPoolExecutorsubmitrunr   run_until_completerx   sum)r2   r   r&   r   r   r   rX   r   r   r   
concurrentpoolfutureresults_listr   rD   rF   rH   rI   r   s   ``````             @r3   execute_tasks_parallelz#KimiExecutor.execute_tasks_parallelr  sw   4 "$$+4++"J
 YY[
	G_ 5 	G 	G(	3))+D )''::q:I JT![[hjAF:@--/LJ J  $66xzB ))+
*?,???,??
A|AAL)M9 %!#''
 	
J J
  	3";;xz2L	3s+   *AE; .6E/$E; /E84E; ;#F! F!c                 *     | j                   dd|i|S )z
        Synchronous single-task execution.

        Matches the genesis_execution_layer.execute_task_sync() signature.
        r   r?   r   )r2   r   kwargss      r3   execute_task_synczKimiExecutor.execute_task_sync  s     t||242622r5   r   prompt_previewc                    t        j                         j                         |j                  |j                  |j
                  |j                  t        |j                  d      t        |j                  d      |j                  |j                  |d
}	 t        | j                  dd      5 }|j                  t        j                   |      dz          ddd       y# 1 sw Y   yxY w# t"        $ r Y yw xY w)	z-Append a JSONL log entry for budget tracking.      )
	timestampr&   r,   r-   rD   cost_usdexecution_time_sr$   r*   r   autf-8encoding
N)r   now	isoformatr&   r,   r-   r'   roundr(   r)   r$   r*   openrb   writejsondumpsr   )r2   r   r   entryfhs        r3   r   zKimiExecutor._log_usage  s     "113\\#11!'!9!9"..f22A6 %f&;&;Q ?~~#11,
	d))3A 3RE*T123 3 3 		s0   C( +(CC( C%!C( %C( (	C43C4c                    | j                         | j                  t        | j                  | j                  | j
                  t        | j                  d      | j                  r#| j                  dd  d| j                  dd  dS ddS )z@Return current executor status (mirrors GeminiExecutor pattern).   Nr   z...zNOT SET)
configuredrW   ru   rX   re   rD   total_cost_usdapi_key_preview)	rr   rW   ry   rX   re   rD   r   rF   rV   r1   s    r3   
get_statuszKimiExecutor.get_status  s     ,,.!//)++++ --#DOOQ7 << <<#$CRS(9':;
 	
 
 	
r5   c                    d}d}| j                   j                         rYt        | j                   dd      5 }|D ]2  }	 t        j                  |      }||j                  dd      z  }|dz  }4 	 ddd       |dkD  r||z  nd}t        |d	      |t        |d
      t        t        j                               dS # t        j                  t        f$ r Y w xY w# 1 sw Y   jxY w)zAGet cost tracking (parallel to GeminiExecutor.get_budget_status).rE   r   rL   r   r   r   r   Nr   r   )total_spent_usdre   avg_cost_per_callmodels)rb   existsr   r   loadsr^   JSONDecodeErrorKeyErrorr   rR   r]   values)r2   spentcallsr   liner   avgs          r3   get_budget_statuszKimiExecutor.get_budget_status  s    %%'d))3A R D $

4 0:s!;;
	  %qyeemc$UA !&sA?1134	
 	
 !00(;  s.   C/B:-C:CCCCC")NN    ffffff?)NNr  r  N)r6   r7   r8   r9   DEFAULT_CONCURRENT_WORKERSr
   r<   r=   rg   staticmethodr\   r:   rr   r{   r>   r~   r   r#   r   r	   rA   r   r   r   r   r   r   r  r?   r5   r3   rU   rU      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> 
r5   rU   _default_executorr.   c                  .    t         
t               a t         S r0   )r  rU   r?   r5   r3   _get_default_executorr    s     (Nr5   r   c                 8     t               j                  | fi |S )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     r3   r   r   "  s      5 "44TDVDDr5   r   c                 8     t               j                  | fi |S )uk  
    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     r3   r   r   +  s      : "99%J6JJr5   c                  *   t        d       t        d       t        d       t               } | j                         s"t        d       t        d       t        d       y| j                         }t        d|d           t        d	|d
           t        d|d           t                t        d       | j	                  ddd      }|j
                  rt        d       t        d|j                  j                                 t        d|j                          t        d|j                  d       t        d|j                  dd       t        d|j                          nt        d|j                          yt                t        d       | j                  g dddd      }|j                  rt        d |j                   d!t!        |j"                         d"       t%        |j"                  d#      D ].  \  }}t        d$| d%|j                  j                                0 t        d&|j&                          t        d'|j(                  d       t        d(|j*                  dd       nkt        d)|j,                   d*       |j"                  D ]'  }|j
                  rt        d+|j                          ) |j                  d,k\  rt        d-       nyt                t        d       t        d.       t        d       y/)0zu
    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   : rW   z
Workers : rX   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   rX   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)printrU   rr   r   r   r$   r%   rn   r'   r(   r)   r&   r+   r   rQ   rH   r   rC   	enumeraterD   rF   rG   rI   )executorstatusr   swarm_resultirL   s         r3   _run_live_testr  ?  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6 	9DAqGA3b!1!1!3 678	9!,";";!<=>"<#:#:3"?@A!,">">s!C1EF&|'A'A&B-PQ%% 	-A99	!''+,	- %%*LM	G	(O	
'(	(Or5   __main__r   )1r9   r   r   rl   r   dataclassesr   r   r   pathlibr   typingr   r   r	   r
   dotenvr   __file__rc   	_env_pathrw   ry   r]   r   r<   r>   r;   r_   ra   r  r   r   r   r   r   r#   rA   rU   r  r  r   r   r:   r  r6   sysokexitr?   r5   r3   <module>r*     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CHH"Q! A  		s   -D DD