
    iG                     &   % S r SSKrSSK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  \R&                  " S\R&                  " SS	5      5      rS
rSr\\\S.rSrSr\	 " S S5      5       r\	 " S S5      5       r " S S5      r0 r\\\4   \S'   \R@                  " 5       r!S$S\S\4S jjr"   S%S\S\S\\   S\#S\4
S jjr$S\4S\\\\4      S\S\#S\\   4S  jjr%S$S\S\\\4   4S! jjr&S" r'\(S#:X  a  \'" 5         gg)&a  
KIMI K2.5 SWARM INTEGRATION
============================
Moonshot AI's Kimi K2.5 as a Genesis execution backend.

Native PARL capabilities:
- 100 sub-agents per API call
- 1500 tool calls
- 8K / 32K / 128K context windows
- OpenAI-compatible API (drop-in replacement)

OpenRouter API base URL: https://openrouter.ai/api/v1
Model: moonshotai/kimi-k2.5

Usage:
    from core.kimi_swarm import KimiSwarm, execute_kimi_task, execute_kimi_swarm

    # Single task
    result = execute_kimi_task("Summarise this 100K doc", model="max")

    # Parallel swarm
    results = execute_kimi_swarm([
        {"prompt": "Analyse revenue pipeline"},
        {"prompt": "Draft marketing copy for TradiesVoice"},
        {"prompt": "Research competitor pricing"},
    ])

Author: Genesis System
Version: 1.0.0
    N)	dataclassfield)datetime)Path)DictListOptionalAnyOPENROUTER_API_KEYMOONSHOT_API_KEY zhttps://openrouter.ai/api/v1zmoonshotai/kimi-k2.5faststandardmax
   2   c                       \ rS rSr% Sr\\S'   \\S'   Sr\\S'   Sr	\\S'   Sr
\\S'   S	r\\S
'   S	r\\S'   Sr\\S'   Sr\\   \S'   \" \S9r\\\4   \S'   S\4S jrSrg)KimiResponseI   z)Structured response from a Kimi API call.textmodelr   prompt_tokenscompletion_tokenstotal_tokens        execution_timecost_estimateTsuccessNerrordefault_factoryraw_responsereturnc                     U R                   $ N)r   selfs    $E:\genesis-system\core\kimi_swarm.py__str__KimiResponse.__str__W   s    yy     )__name__
__module____qualname____firstlineno____doc__str__annotations__r   intr   r   r   floatr   r   boolr    r	   r   dictr#   r   r
   r*   __static_attributes__r-   r,   r)   r   r   I   s}    3
IJM3sL#NEM5GTE8C=#(#>L$sCx.> r,   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rg)KimiSwarmResult[   z'Result from a parallel swarm execution.r!   	responsesr   r   r   
total_costelapsed_secondssuccess_countfailure_countr$   c                 ~    U R                    Vs/ s H!  oR                  (       d  M  UR                  PM#     sn$ s  snf )z7Return just the text strings from successful responses.)r=   r   r   )r(   rs     r)   textsKimiSwarmResult.textse   s*     !%<1))<<<s   ::c                      U R                   S:H  $ )Nr   )rA   r'   s    r)   all_successKimiSwarmResult.all_successj   s    !!Q&&r,   r-   N)r.   r/   r0   r1   r2   r   listr=   r   r   r4   r   r5   r>   r6   r?   r@   rA   propertyr3   rD   r7   rG   r9   r-   r,   r)   r;   r;   [   s    1$)$$?ItL!?L#J OU M3M3=tCy = = 'T ' 'r,   r;   c                     ^  \ rS rSrSrSr\R                  " 5       rSS\	4U 4S jjjr
SS\	4S jjrS rS\	S\S	\S
\4S jrSS\	S\4S jjrS
\4S jr    SS\	S\\	   S\S\S\\	   S
\4S jjr\4S\\\	\4      S\S
\4S jjr   S S\	S\\	   S\S\S
\4
S jjr\4S\\\	\4      S\S
\4S jjrS
\\	\4   4S jrSrU =r $ )!	KimiSwarms   z
Kimi K2.5 swarm executor with native PARL capabilities.

Singleton-safe. Thread-safe for parallel swarm use.
Modelled after Genesis's Qwen/Gemini integration patterns.
Nr   c                 "   > [         TU ]  U 5      $ r&   )super__new__)clsr   	__class__s     r)   rP   KimiSwarm.__new__~   s    ws##r,   c                 \   Xl         [        R                  U[        S   5      U l        [        U l        [        U l        [        [        5      R                  R                  S-  S-  U l        U R                  R                  R                  SSS9  SU l        SU l        SU l        S U l        g )Nr   datazkimi_usage.jsonlT)parentsexist_okr   r   )	model_keyKIMI_MODELSgetr   r   api_keyOPENROUTER_BASE_URLbase_urlr   __file__parentlog_pathmkdirtotal_callsr   r>   _client)r(   r   s     r)   __init__KimiSwarm.__init__   s     __UK
,CD
)+ X--44v=@RR""4$"?  r,   c                     U R                   c3   SSKJn  U" U R                  U R                  S9U l         U R                   $ U R                   $ ! [
         a    [        S5      ef = f)z>Lazy-load OpenAI client (OpenAI-compatible Moonshot endpoint).r   )OpenAI)r[   r]   z5openai package not installed. Run: pip install openai)rc   openairg   r[   r]   ImportErrorRuntimeError)r(   rg   s     r)   _get_clientKimiSwarm._get_client   sd    <<	)% LL!]]  ||t||	  "K s   &A A#r   r   r$   c                 b    [         R                  USSS.5      nUS-  US   -  US-  US   -  -   $ )z$Estimate USD cost from token counts.g333333?)inputoutputi@B rn   ro   )KIMI_PRICINGrZ   )r(   r   r   r   pricings        r)   _estimate_costKimiSwarm._estimate_cost   sH    ""5DD*IJY&''*::*gh.??@	
r,   eventrU   c                 J   [         R                  " 5       R                  5       UU R                  U=(       d    0 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.)	timestamprt   r   rU   azutf-8)encoding
N)
r   now	isoformatr   openr`   writejsondumps	Exception)r(   rt   rU   entryfs        r)   _logKimiSwarm._log   s|     "113ZZJB	
	dmmS7;q

5)D01 <;; 		s/   B )B;B 
BB B 
B"!B"c                 n    [        U R                  =(       a    U R                  R                  5       5      $ )zCheck if API key is set.)r7   r[   stripr'   s    r)   _is_configuredKimiSwarm._is_configured   s#    DLL9T\\%7%7%9::r,   promptsystem
max_tokenstemperaturemodel_overridec                    U R                  5       (       d  [        SU R                  SSS9$ U=(       d    U R                  n[        R                  " 5       n/ nU(       a  UR	                  SUS.5        UR	                  SUS.5         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                  XmU5      nU =R                  S
-  sl        U =R                  U-  sl        U =R                  U-  sl        U
R                   S	   R"                  R$                  =(       d    SnU R'                  SUSS UU[)        US5      S.5        [        UUUUUUUSU
R*                  U
R                  S.S9	$ ! [,         a]  n[        R                  " 5       U-
  n[/        U5      nU R'                  SUSS U[)        US5      S.5        [        SUUSUS9s SnA$ SnAff = f)a&  
Execute a single Kimi task.

Args:
    prompt: The user prompt
    system: Optional system message
    max_tokens: Max tokens to generate
    temperature: Sampling temperature (0-1)
    model_override: Override the default model for this call

Returns:
    KimiResponse with text and metadata
r   Fz`OPENROUTER_API_KEY not set. Get key from https://openrouter.ai and add to E:\genesis-system\.envr   r   r   r    r   )rolecontentuser)r   messagesr   r   r      execute_successNd      )prompt_previewtokenscost_usd	elapsed_sT)idr   )	r   r   r   r   r   r   r   r   r#   execute_error)r   r    r   )r   r   r   r   r    )r   r   r   timeappendrk   chatcompletionscreateusager   r   r   rr   rb   r>   choicesmessager   r   roundr   r   r3   )r(   r   r   r   r   r   r   
start_timer   clientresponseelapsedr   r   r   r   costr   e	error_msgs                       r)   executeKimiSwarm.execute   s8   * ""$$jjz	  ,$**YY[
OOX&ABF;<;	%%'F{{..55!%'	 6 H iikJ.GNNE38E//aM;@ 7 7a165--AL&&u=NOD !-OOt#O##A&..66<"DII'"(#,& "7A.	*   +"3)&"$,KK(..I
 
  	iikJ.GAIIIo"(#,""7A.(   & 	s    E!G* *
I4AIIItasksmax_workersc                   ^  U(       d
  [        5       $ [        R                  " 5       n[        U[        [	        U5      5      nT R                  S[	        U5      US.5        S[        S[        4U 4S jjn/ n[        R                  R                  US9 n[        U5       VV	s0 s H  u  pUR                  XY5      U_M     n
nn	S/[	        U5      -  n[        R                  R                  U
5       H  nX   n UR                  5       X'   M     UnSSS5        [        R                  " 5       U-
  n[%        S U 5       5      n[	        U5      U-
  n[%        S U 5       5      n[%        S U 5       5      nT R                  SUUUU['        US5      S.5        [        UUUUUUS9$ s  sn	nf ! [         a,  n[        ST R                   S	[#        U5      S
9X'    SnAM  SnAff = f! , (       d  f       N= f)ua  
Execute multiple tasks in parallel using ThreadPoolExecutor.

This leverages Kimi's native PARL architecture — up to 100 concurrent
sub-agents, each running an independent chain of up to 1500 tool calls.

Args:
    tasks: List of task dicts with keys:
           - prompt (required)
           - system (optional)
           - max_tokens (optional, default 4096)
           - temperature (optional, default 0.7)
           - model_override (optional)
    max_workers: Parallel threads (max 50 via this wrapper; Kimi supports 100 native)

Returns:
    KimiSwarmResult with all responses and aggregate stats
swarm_start)
task_countworkerstaskr$   c           
         > TR                  U R                  SS5      U R                  SS 5      U R                  SS5      U R                  SS5      U R                  SS 5      S	9$ )
Nr   r   r   r      r   ffffff?r   )r   r   r   r   r   )r   rZ   )r   r(   s    r)   run_task)KimiSwarm.swarm_execute.<locals>.run_taskA  s`    <<xx"-xx$/88L$7 HH]C8#xx(8$?    r,   )r   Nr   Fr   c              3   \   #    U  H"  o(       d  M  UR                   (       d  M  S v   M$     g7f)r   N)r   .0rC   s     r)   	<genexpr>*KimiSwarm.swarm_execute.<locals>.<genexpr>Z  s     Dy!AA!))AAys   
,,	,c              3   J   #    U  H  o(       d  M  UR                   v   M     g 7fr&   )r   r   s     r)   r   r   \  s     B9a>1>>9   
##c              3   J   #    U  H  o(       d  M  UR                   v   M     g 7fr&   )r   r   s     r)   r   r   ]  s     A)Qq)r   swarm_completer   )r   failedr   total_cost_usdr   )r=   r   r>   r?   r@   rA   )r;   r   minMAX_SWARM_WORKERSlenr   r   r   
concurrentfuturesThreadPoolExecutor	enumeratesubmitas_completedresultr   r   r3   sumr   )r(   r   r   r   effective_workersr   r=   executorir   
future_maporderedfutureidxr   r   r@   rA   r   r>   s   `                   r)   swarm_executeKimiSwarm.swarm_execute  s   . "$$YY[
->E
K		-e*("
 	
	4 	L 	 	22?P2QU]LUV[L\]L\(//(91<L\J]fs5z)G$,,99*E (#)==?GL F  I R ))+
*DyDDI6B9BBA)AA
		"$#((w*%
 	 %!#''
 	
7 ^ ! #/tzz5A$GL RQsH   G$"F% 8G$9F+G$%G$+
G!5!GG$G!!G$$
G2c                    ^ ^^^^#    [         R                  " 5       nUR                  SUUU UU4S j5      I Sh  vN $  N7f)z*Async wrapper for use in asyncio contexts.Nc                  ,   > TR                  TTT T5      $ r&   )r   )r   r   r(   r   r   s   r)   <lambda>)KimiSwarm.execute_async.<locals>.<lambda>{  s    DLL[Ir,   asyncioget_event_looprun_in_executor)r(   r   r   r   r   loops   ````` r)   execute_asyncKimiSwarm.execute_asyncp  s<      %%'))II
 
 	
 
s   3A?Ac                 ~   ^ ^^#    [         R                  " 5       nUR                  SUU U4S j5      I Sh  vN $  N7f)z Async wrapper for swarm_execute.Nc                  (   > TR                  TT 5      $ r&   )r   )r   r(   r   s   r)   r   /KimiSwarm.swarm_execute_async.<locals>.<lambda>  s    D&&uk:r,   r   )r(   r   r   r   s   ``` r)   swarm_execute_asyncKimiSwarm.swarm_execute_async~  s9      %%')):
 
 	
 
s   1=;=c                 2   U R                  5       U R                  U R                  U R                  U R                  U R
                  [        U R                  S5      [        U R                  5      U R                  (       a  U R                  SS  S3S.	$ SS.	$ )zReturn current client status.   N   z...zNOT SET)	
configuredr   rX   r]   rb   r   r   api_key_setapi_key_preview)
r   r   rX   r]   rb   r   r   r>   r7   r[   r'   s    r)   
get_statusKimiSwarm.get_status  s     --/ZZ++ --#DOOQ7-;?<<$,,r"2!337

 
	
 NW

 
	
r,   )	rc   r[   r]   r`   r   rX   rb   r>   r   r   r&   )Nr   r   N)Nr   r   )!r.   r/   r0   r1   r2   	_instance	threadingLock_lockr3   rP   rd   rk   r5   r6   rr   r   r   r7   r   r	   r   r   DEFAULT_SWARM_WORKERSr   r
   r;   r   r   r   r   r9   __classcell__)rR   s   @r)   rL   rL   s   s    INNE$C $ $c $
C 
 
PS 
X] 
# T ; ; !% (,`` ` 	`
 ` !` 
`J 1O
DcN#O
 O
 
	O
h !% 

 
 	

 
 

" 1

DcN#

 

 
	


DcN 
 
r,   rL   
_instancesr   r   r$   c                     [            U [        ;  a  [        U S9[        U '   [        U    sSSS5        $ ! , (       d  f       g= f)z;Get or create a singleton KimiSwarm for a given model tier.r   N)_instances_lockr   rL   r   s    r)   _get_instancer     s.    	
" ) 6Ju%  
s	   #4
Ar   r   r   c                 P    [        U5      nUR                  XUS9nUR                  $ )z
Quick single-task Kimi executor.

Returns the response text directly (empty string on failure).
Check KimiSwarm.execute() for structured response with metadata.
)r   r   r   )r   r   r   )r   r   r   r   swarmr   s         r)   execute_kimi_taskr    s*     % E}}Fj}QH==r,   r   r   c                 N    [        U5      nUR                  XS9nUR                  $ )a  
Quick parallel swarm executor.

Returns list of response texts in submission order.

Args:
    tasks: List of {"prompt": ..., "system": ..., "max_tokens": ...}
    model: "fast" | "standard" | "max"
    max_workers: Parallel threads

Example:
    results = execute_kimi_swarm([
        {"prompt": "Analyse Q1 revenue"},
        {"prompt": "Draft tradie outreach email"},
        {"prompt": "Research Moonshot pricing"},
    ])
)r   r   )r   r   rD   )r   r   r   r   r   s        r)   execute_kimi_swarmr    s+    , % E  u FF<<r,   c                 4    [        U 5      R                  5       $ )z*Return status dict for a given model tier.)r   r   r   s    r)   kimi_statusr    s    **,,r,   c                     SSK n U R                  SS9nUR                  S/ SQSSS	9  UR                  S
[        SSS9  UR                  SSSS9  UR	                  5       nUR
                  (       a1  SSKn[        UR                  [        UR                  5      SS95        g[        SUR                   S35        [        UR                  S9nUR                  5       nUS   (       dY  [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        [        S5        gUR                  UR                  5      nUR                  (       a  [        S 5        [        S!UR                   35        [        S"UR                    35        [        S#UR"                   35        [        S$UR$                  S% 35        [        S&UR&                  S' S(35        g[        S)UR(                   35        g)*z4Run a quick connectivity test from the command line.r   Nu'   Kimi K2.5 Swarm — Genesis Integration)descriptionz--modelr   r   zModel tier to test)r   defaulthelpz--promptz*What is 2 + 2? Reply with just the number.zTest prompt)typer  r	  z--status
store_truezShow status only)actionr	     )indentzTesting Kimi K2.5 (z) ...r   r   z"
[ERROR] MOONSHOT_API_KEY not set.zTo get your key:z'  1. Go to https://platform.moonshot.cnz  2. Create account / log inz!  3. Navigate to API Keys sectionz  4. Create a new keyz#  5. Add to E:\genesis-system\.env:z     MOONSHOT_API_KEY=sk-...z

[SUCCESS]z
Model:    z
Response: z
Tokens:   zCost:     $z.6fz
Latency:  z.2fsz

[FAILED] )argparseArgumentParseradd_argumentr3   
parse_argsstatusr~   printr   r  r   rL   r   r   r   r   r   r   r   r   r    )r  parserargs_jsonr   r  r   s          r)   	_cli_testr    s   $$1Z$[F
	+FPV1  3

6b*  ,

<>PQD{{ekk+djj1!k<=	

|5
12DJJ'EF,34 !78,-12%&56,-}}T[[)H
8>>*+,
8==/*+
800123H223789
82237q9:HNN+,-r,   __main__r   )r   Nr   ))r2   osr~   r   r   concurrent.futuresr   r   dataclassesr   r   r   pathlibr   typingr   r   r	   r
   getenvr   r\   
KIMI_MODELrY   r   r   r   r;   rL   r   r3   r4   r   r   r   r5   r  r  r  r  r.   r-   r,   r)   <module>r"     s  > 
      (   , , YYII "%  5 #
       " ' ' '.c
 c
V	 $&
Di  %.."! !i !  	 SM 	
 	& ,S#X  
#Y	6-s -DcN -*.Z zK r,   