
    ik                        U d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZmZ ddlZ ej$                  ej&                          ej(                  e      Z	 ddlmZ 	 ddlmZ dd
lmZ dZ 	 ddl"m#Z#  e#d        e#d        G d de      Z$ G d d      Z% e%dddddde$jL                  g ddd
       e%dd d!d"d#de$jL                  g d$d%d&
       e%d'd d(d"d#de$jL                  g dd%d&
       e%d)ddd*d+d,e$jN                  d-d.gd/d0
       e%d1ddd*d2d,e$jN                  d-d.gd/d0
       e%d3d4d5d6d7d8e$jL                  d-d.gd/d
       e%d9d:d;dd<d=e$jN                  g d>d%d
       e%d?d@dAdBdCd=e$jN                  g d>d%d
       e%dDd@dAdBdEd,e$jN                  g dFd%d
       e%dGd@dAdBdde$jL                  g dHdd
       e%dId@dAdBdJd8e$jL                  d-d.gd/d
       e%dKd@dAdBdLdMe$jL                  g dNd/d
       e%dOd@dAdBdPdQe$jP                  g dRd%d
       e%dSd@dAdBdTdUe$jP                  g dVd%d
      dWZ)ee*e%f   e+dX<   dYdYdYdZdZd[d[dYdYd\d]
Z,ee*e*f   e+d^<    G d_ d`      Z-da Z.edbk(  r e.        yy# e$ r' ej5                  d        ej6                  d	       Y ;w xY w# e$ r dZ ejC                  d       Y Kw xY w# e$ r ejC                  d       Y Qw xY w)cu  
Genesis Multi-Model Swarm
Unified interface for Kimi K2.5, MiniMax M2.5, Gemini 2.0 Flash, and other swarm models.

COMMAND CENTRE DOCTRINE: This module enables Claude (orchestrator) to dispatch
work to cost-effective agent swarms (Kimi, MiniMax, Gemini) while staying
lightweight and responsive.

Cost Hierarchy (per MTok):
- Gemini 2.0 Flash:      ~$0.10 (fastest, best for computer use + agentic vision)
- DeepSeek-R1 Distill:  ~$0.12 (fast deep reasoning, 32B distill)
- DeepSeek-R1:          ~$0.55 (o1-level deep reasoning, 671B MoE — USE FOR STRATEGY)
- Kimi K2.5:            $1.07  (9x cheaper than Claude, #1 agentic benchmarks)
- MiniMax M2.5:         ~$1.00 (80.2% SWE-Bench, free via NVIDIA NIM/Kilo.ai)
- Haiku:                $1.00  (good for simple extractions)
- Sonnet:               $9.00  (management/coordination)
- Opus:                 $15.00 (architecture/strategic only)

Deep Reasoning Routing Guide:
- Use deepseek-r1 for: multi-step strategy, architecture decisions, complex RLM design,
  GTM planning, patent analysis, anything requiring extended chain-of-thought
- Use deepseek-r1-distill for: code review, math problems, faster reasoning tasks
- Use gemini-3-flash-preview for: computer use, agentic vision, screen understanding
- Use kimi-k2-moonshot for: agent swarms, long context, tool-use heavy tasks
- NEVER use Claude for tasks DeepSeek-R1 can handle — 27x cost difference

Author: Genesis System
Date: 2026-02-24
    N)DictListLiteralOptionalAny)Enum)ThreadPoolExecutoras_completed)level)OpenAIz1OpenAI SDK not installed. Run: pip install openai   )typesTFz\google-genai SDK not installed. Gemini native API unavailable. Run: pip install google-genai)load_dotenvz/mnt/e/genesis-system/.envz(/mnt/e/genesis-system/config/secrets.envz@python-dotenv not installed. Using system environment variables.c                   $    e Zd ZdZdZdZdZdZdZy)	ModelTierz'Model cost tiers for routing decisions.ultra_cheapcheapdeep_reasoningstandardpremiumN)	__name__
__module____qualname____doc__ULTRA_CHEAPCHEAPDEEP_REASONINGSTANDARDPREMIUM     //mnt/e/genesis-system/core/multi_model_swarm.pyr   r   J   s    1KE%NHGr!   r   c                       e Zd ZdZ	 	 ddedededededed	ed
ee   dede	e   fdZ
ede	e   fd       Zedefd       Zy)
SwarmModelz1Represents a model available for swarm execution.Nnameproviderapi_key_envbase_urlmodel_idcost_per_mtoktiercapabilities
max_tokens	rpm_limitc                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        y )N
r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   )selfr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   s              r"   __init__zSwarmModel.__init__V   sM     	 &  *	($"r!   returnc                 @    t        j                  | j                        S )zGet API key from environment.)osgetenvr'   r1   s    r"   api_keyzSwarmModel.api_keyn   s     yy))**r!   c                     | j                   duS )z*Check if model is available (has API key).Nr8   r7   s    r"   	availablezSwarmModel.availables   s     ||4''r!   )   N)r   r   r   r   strfloatr   r   intr   r2   propertyr8   boolr;   r    r!   r"   r$   r$   S   s    ; #'## # 	#
 # # # # 3i# # C=#0 +# + + (4 ( (r!   r$   z	Kimi K2.5z
NVIDIA NIMNVIDIA_NIM_API_KEYz#https://integrate.api.nvidia.com/v1zmoonshotai/kimi-k2.5gQ?)coderesearchlong_contextvisionagent_swarmr<   r0   zKimi K2.5 (Moonshot Direct)zMoonshot AIMOONSHOT_API_KEYzhttps://api.moonshot.cn/v1zkimi-k2)rC   rD   rE   rF   rG   	reasoning       zKimi K2.5 OfficialKIMI_API_KEYzMiniMax M2.1zhttps://api.nvidia.com/v1zminimaxai/minimax-m2.1        rC   rI   i   (   z
MiniMax M2zminimaxai/minimax-m2zMiniMax M2.5z
MiniMax AIMINIMAX_API_KEYz#https://api.minimax.io/anthropic/v1zminimax-m2.5g      ?u,   Gemini 3 Flash (Direct API — $200 credits)GoogleGEMINI_API_KEY_NEWzgemini-3-flash-previewg      ?)rC   rD   rF   fastcomputer_useagentic_visionthink_act_observez$Gemini 3 Flash (OpenRouter fallback)
OpenRouterOPENROUTER_API_KEYzhttps://openrouter.ai/api/v1zgoogle/gemini-3-flash-previewz&Gemini 2.0 Flash Exp (OpenRouter free)z google/gemini-2.0-flash-exp:free)rC   rD   rF   rR   rS   rT   zKimi K2.5 (OpenRouter))rC   rD   rE   zMiniMax M2.5 (OpenRouter)zminimax/minimax-m2.5zMiniMax M2.1 (OpenRouter)zminimax/minimax-m2.1g?)rC   rI   agentzDeepSeek-R1zdeepseek/deepseek-r1g?)r   strategyrC   matharchitecturerE   DeepSeek-R1 Distill 32Bz%deepseek/deepseek-r1-distill-qwen-32bgQ?)r   rC   rZ   rR   )zkimi-k25kimi-k2-moonshotkimi-k25-officialminimax-m21z
minimax-m2zminimax-m25gemini-flashopenrouter-gemini-flashzopenrouter-gemini-flash-expzopenrouter-kimizopenrouter-minimaxzopenrouter-minimax-m21deepseek-r1deepseek-r1-distillSWARM_MODELSr`   r]   rb   ra   )
rS   rT   screenrG   tool_user   rY   bulkrR   rC   TASK_ROUTINGc                      e Zd ZdZd Zd Zd Zedee	   fd       Z
	 	 	 	 	 d(de	d	e	d
e	dedee   dede	fdZ	 	 	 	 d)de	d
e	dee   dee   de	de	fdZ	 	 	 d*de	dee	   dee   d
e	de	f
dZ	 d+de	de	d
e	de	fdZ	 	 	 d,de	d
e	dedede	f
dZ	 	 d-de	d
e	dede	fdZdee	ef   de	dee	ef   fdZ	 	 d.deee	ef      de	dedeee	ef      fdZd eee	ef      d!e	de	fd"Z	 d/ded#   d$ed%   dee	   fd&Zdee	ef   fd'Zy)0MultiModelSwarmao  
    Unified swarm interface for cost-effective parallel execution.

    Usage:
        swarm = MultiModelSwarm()

        # Direct model execution
        result = swarm.execute("Write a CSV parser", model="kimi-k2-moonshot")

        # Gemini 2.0 Flash (native, no OpenAI SDK overhead)
        result = swarm.execute("Explain this code", model="gemini-flash")

        # Computer use / agentic vision
        result = swarm.execute_computer_use("What app is open?", image_path="screen.png")

        # Auto-routing by task type
        result = swarm.route_by_task_type("Analyse this strategy", task_type="strategy")
    c                 `    i | _         d| _        | j                          | j                          y)z'Initialize swarm with available models.N)clients_gemini_client_initialize_clients_initialize_geminir7   s    r"   r2   zMultiModelSwarm.__init__j  s)    *,"  "!r!   c                    t         st        j                  d       yt        j                  d      xs, t        j                  d      xs t        j                  d      }|st        j                  d       y	 t        j                  |      | _        t        j                  d       y# t        $ r"}t        j                  d	|        Y d}~yd}~ww xY w)
z
        Initialise native Gemini API client via google-genai SDK.

        Key priority: GEMINI_API_KEY_NEW > GEMINI_API_KEY > GOOGLE_API_KEY
        Model: gemini-3-flash-preview (best for computer use + agentic vision).
        zYgoogle-genai SDK not available; Gemini native API disabled. Run: pip install google-genaiNrQ   GEMINI_API_KEYGOOGLE_API_KEYzSNo Gemini API key found. Set GEMINI_API_KEY_NEW, GEMINI_API_KEY, or GOOGLE_API_KEY.r:   z9Gemini 2.0 Flash native client ready (GEMINI_API_KEY_NEW)z"Gemini native client init failed: )
GENAI_AVAILABLEloggerwarningr5   r6   genaiClientrm   info	Exception)r1   
gemini_keyes      r"   ro   z"MultiModelSwarm._initialize_geminiu  s     NN0  II*+ +yy)*+yy)* 	
 NNM 	E"',,z"BDKKST 	ENN?sCDD	Es   90B* *	C3CCc                    t         j                         D ]  \  }}|dk(  r|j                  r`	 t        |j                  |j
                        | j                  |<   t        j                  d|j                   d|j                   d       xt        j                  d	|j                   d
|j                   d        y# t        $ r/}t        j                  d|j                   d|        Y d}~d}~ww xY w)z:Initialize OpenAI-compatible clients for available models.r`   )r8   r(   zOK z available ()zFAIL z failed to initialize: NzSKIP z not available (no API key: )rd   itemsr;   r   r8   r(   rl   rt   rx   r%   r&   ry   ru   debugr'   )r1   	model_keymodelr{   s       r"   rn   z#MultiModelSwarm._initialize_clients  s     , 2 2 4 	IuN*S.4 %!&/DLL+ KK#ejj\enn=MQ OP EJJ<'CEDUDUCVVWX	 ! SNNU5::,6MaS#QRRSs   AC  	C8	%C33C8r3   c                     t        | j                  j                               }| j                  |j	                  d       |S )zFReturn all usable model keys (OpenAI-compat + native Gemini if ready).r`   )listrl   keysrm   append)r1   r   s     r"   available_modelsz MultiModelSwarm.available_models  s8     DLL%%'(*KK'r!   Ntaskr   system_prompttemperaturer-   streamc           	         |dk(  r| j                  |||      S || j                  vrAdj                  | j                        }t	        d| d| dt
        |   j                   d      t
        |   }| j                  |   }	t        j                  d|j                   d	|j                   d
       i }
|j                  dk(  rddd}
	 |	j                  j                  j                  |j                  d|dd|dg||xs |j                   ||
xs d      }|r|S |j"                  d   j$                  j&                  }t)        |d      r[|j*                  }|j,                  dz  |j                  z  }t        j                  d|j,                   d|dd|j                          |S # t.        $ r+}t        j1                  d|j                   d|         d}~ww xY w)a  
        Execute a task using the specified model.

        Args:
            task: Task description / prompt
            model: Model key from SWARM_MODELS
            system_prompt: System instruction
            temperature: Sampling temperature (0-1)
            max_tokens: Max output tokens (None = model default)
            stream: Stream response chunks (not supported for native Gemini)

        Returns:
            Generated text response
        r`   )r   r   r-   z, zModel 'z' not available. Available: z
Setup: export z='your_key'zExecuting task on z ($/MTok)rV   zhttps://agileadapt.comzGenesis System)zHTTP-RefererzX-Titlesystem)rolecontentuserN)r   messagesr   r-   r   extra_headersr   usagei@B zTokens: z
 | Cost: $z.4fz
 | Model: zError executing task on : )_execute_gemini_nativerl   joinr   
ValueErrorrd   r'   rt   rx   r%   r*   r&   chatcompletionscreater)   r-   choicesmessager   hasattrr   total_tokensry   error)r1   r   r   r   r   r-   r   r;   
model_infoclientr   responseresultr   costr{   s                   r"   executezMultiModelSwarm.execute  s   0 N"..+% /   $		$"7"78I% <YK H!!-e!4!@!@ AN 
 "%(
e$((9Z=U=U<VV\]^ )+,. 8+M
	{{..55 ))%-@#5 (%>)>)>+3t 6 
H %%a(0088Fx) **Y6*:R:RRu112*T#J G(oo.0
 M 	LL3JOO3DBqcJK	s    AF' BF' '	G0&GG
image_data
image_mimec                    | j                   *t        j                  d       | j                  |d||      S t        d   }t        j                  d|j                   d       	 d}|rt        j                  |      }|r| d	| n|}|rt        j                  j                  |
      t        j                  j                  ||      g}	| j                   j                  j                  |j                  |	|      }
|
j                  S | j                   j                  j                  |j                  ||      }
|
j                  S # t         $ r}t        j#                  d|         d}~ww xY w)a  
        Execute via the native google-genai SDK using gemini-3-flash-preview.

        Falls back to OpenRouter gemini-flash if the native client is unavailable.

        Args:
            task: Prompt / question
            system_prompt: Prepended to the user prompt
            max_tokens: Maximum output tokens
            image_data: Raw image bytes for vision / computer-use tasks
            image_mime: MIME type of image (default: image/png)

        Returns:
            Generated text
        NzJNative Gemini client unavailable; falling back to openrouter-gemini-flash.ra   )r   r   r   r-   r`   z,Executing via Gemini 2.0 Flash native API ($r   )max_output_tokens

)text)data	mime_type)r   contentsconfigzGemini native API error: )rm   rt   ru   r   rd   rx   r*   genai_typesGenerateContentConfigPart	from_text
from_bytesmodelsgenerate_contentr)   r   ry   r   )r1   r   r   r-   r   r   r   r   full_promptr   r   r{   s               r"   r   z&MultiModelSwarm._execute_gemini_native  s   . &NN\ <</+%	     ".1
::;S;S:TTZ[	
	F$::&0 ;H]O4v6TK  $$..K.@$$//Z:/V  ..55FF$--%! G  ==   ..55FF$--(! G  ==  	LL4QC89	s   $B%E 
=E 	E/E**E/
image_pathc                 
   ddl }d}d}|r@|j                  |      \  }}|xs d}t        |d      5 }	|	j                         }ddd       n|r|}t        j                  d       | j                  ||||      S # 1 sw Y   3xY w)uB  
        Execute a computer use / agentic vision task via Gemini 2.0 Flash.

        Gemini 2.0 Flash is the recommended model for computer use —
        best-in-class vision understanding at ultra-low cost ($0.10/MTok).

        Args:
            task: Instruction/question about the screen content
            image_path: Path to screenshot file (PNG/JPEG)
            image_data: Raw image bytes (alternative to image_path)
            system_prompt: Vision-optimised system prompt

        Returns:
            Gemini's interpretation / next-action recommendation
        r   N	image/pngrbz>Routing computer_use task -> Gemini 2.0 Flash (agentic_vision))r   r   r   r   )	mimetypes
guess_typeopenreadrt   rx   r   )
r1   r   r   r   r   r   	raw_bytesmime_fs
             r"   execute_computer_usez$MultiModelSwarm.execute_computer_useY  s    4 		**:6GD!&;Dj$' %1FFH	% %"ITU**' 	 + 
 	
% %s   A99B	task_typec                     t         j                  |d      }t        j                  d| d|        |dv r| j	                  ||      S  | j
                  d|||d|S )a  
        Execute a task using automatic model routing based on task_type.

        Routing table (TASK_ROUTING):
          computer_use / agentic_vision / screen  -> gemini-flash
          agent_swarm / tool_use                  -> kimi-k2-moonshot
          deep_reasoning / strategy               -> deepseek-r1
          bulk / fast / code                      -> gemini-flash / openrouter-gemini-flash

        Args:
            task: The task prompt
            task_type: Key in TASK_ROUTING (or any string; unknown defaults to gemini-flash)
            system_prompt: System instruction
            **kwargs: Additional args forwarded to execute()

        Returns:
            Generated response from the routed model
        r`   zroute_by_task_type: 'z' -> rS   rT   re   )r   r   )r   r   r   r    )rh   getrt   rx   r   r   )r1   r   r   r   kwargsr   s         r"   route_by_task_typez"MultiModelSwarm.route_by_task_type  so    2   N;+I;eE7CD DD,,$m,TTt||ZU-ZSYZZr!   rR   c                     |rdnd}|| j                   vrt        d      t        j                  d|rdnd        | j	                  |||d|      S )	u0  
        Dispatch a deep reasoning task to DeepSeek-R1 via OpenRouter.

        DeepSeek-R1 provides o1-level reasoning at ~$0.55/MTok — 27x cheaper than Opus.
        Use for: strategy, architecture, multi-step analysis, complex planning.

        Args:
            task: The reasoning task or question
            system_prompt: Chain-of-thought system context
            fast: If True, use distilled 32B variant ($0.12/MTok)
            max_tokens: Max output tokens (default 8192)

        Returns:
            Reasoning output from DeepSeek-R1
        rc   rb   z<DeepSeek-R1 not available. Ensure OPENROUTER_API_KEY is set.zDeep reasoning via r\   zDeepSeek-R1 671BrM   )r   r   r   r   r-   )rl   r   rt   rx   r   )r1   r   r   rR   r-   r   s         r"   deep_reasonzMultiModelSwarm.deep_reason  sp    0 .2)}	DLL(N  	!t";I[!\]	
 ||'!  
 	
r!   timeoutc                 $   | d| }t         j                  d       	 t        j                  dd|gdd|d      }|j                  dk7  rQ|j
                  j                         xs d	|j                   }t         j                  d
|        t        d|       |j                  j                         }t         j                  dt        |       d       |S # t        j                  $ r t        d| d      t        $ r t        d      w xY w)a(  Execute a task via Gemini CLI (uses Google AI Pro credits).

        Args:
            task: The task/prompt
            system_prompt: System context prepended to the task
            timeout: Maximum seconds to wait

        Returns:
            Generated text response from Gemini CLI
        r   z5Executing task via Gemini CLI (Google AI Pro credits)geminiz-pTz/mnt/e/genesis-system)capture_outputr   r   cwdr   zGemini CLI exited with code zGemini CLI error: zGemini CLI failed: zGemini CLI returned z charszGemini CLI timed out after sz@Gemini CLI not found. Install: npm install -g @google/gemini-cli)rt   rx   
subprocessrun
returncodestderrstripr   RuntimeErrorstdoutlenTimeoutExpiredFileNotFoundError)r1   r   r   r   r   r   	error_msgoutputs           r"   execute_gemini_cliz"MultiModelSwarm.execute_gemini_cli  s#     'tD62KL	^^4-#+F   A%MM'') J5f6G6G5HI  1)=>"%8#DEE]]((*FKK.s6{m6BCM(( 	I!<WIQGHH  	R 	s   B:C 6D	task_specdefault_modelc           	         |j                  dd      }|j                  d|      }|j                  dd      }|j                  dd      }|j                  d|d	d
       }	 |dk(  r| j                  ||      }n| j                  |||      }t        j	                  d| d| d|        |||dd	|dS # t
        $ r:}	t        j                  d| d| d|	        |d	|dt        |	      |dcY d	}	~	S d	}	~	ww xY w)zBExecute a single task spec. Thread-safe; used by parallel_execute.r    r   r   You are a helpful assistant.agent_idunknownlabelNP   z
gemini-cli)r   )r   r   [z] SUCCESS on  | success)r   r   r   statusr   r   z] FAILED on r   failed)r   r   r   rt   rx   ry   r   r=   )
r1   r   r   r   r   r   r   
task_labelr   r{   s
             r"   _execute_singlezMultiModelSwarm._execute_single  s    }}VR(g}5!o7UV==Y7]]7D"I6
	$00]0Sd%}UKK!H:]5'ZLIJ" #$   		LL1XJl5'A3?@""Q$ 		s   AB3 3	C6</C1+C61C6tasksmax_workersc                    g }t        |      }t        j                  d| d| d       t        j                         }t	        |      5 }|D ci c]   }|j                  | j                  ||      |" }	}d}
t        |	      D ]k  }|
dz  }
|j                         }|j                  |       |d   dk(  rd	nd
}t        j                  d|
 d| d| d|j                  dd       d|d    
       m 	 ddd       t        j                         |z
  }t        d |D              }t        j                  d| d| d|dd       |S c c}w # 1 sw Y   YxY w)u  
        Execute multiple tasks in TRUE parallel using ThreadPoolExecutor.

        Args:
            tasks: List of task dicts — keys: 'task', 'model' (opt),
                   'system_prompt' (opt), 'agent_id' (opt), 'label' (opt)
            default_model: Default model when task dict omits 'model'
            max_workers: Max concurrent threads

        Returns:
            List of result dicts: 'task', 'result', 'model', 'status', 'error', 'agent_id'
        z
Launching z! agents in parallel (max_workers=r}   )r   r   r   r   r   OKFAILr   /z] r   r   ?r   Nc              3   2   K   | ]  }|d    dk(  sd  yw)r   r   r   Nr    ).0rs     r"   	<genexpr>z3MultiModelSwarm.parallel_execute.<locals>.<genexpr>a  s     GaakY.FGs   zParallel execution complete: z succeeded in .1fr   )r   rt   rx   timer	   submitr   r
   r   r   r   sum)r1   r   r   r   resultstotal
start_timeexecutorr   future_to_task	completedfuturer   status_iconelapsed	successess                   r"   parallel_executez MultiModelSwarm.parallel_execute8  sx   $ E
j'HUVWXYY[
K8 	H "'  4 4iOQZZN 
 I&~6 Q	v&&,X&6)&Cd	{!E7"[Mzz*c233vg6GI	" ))+
*G7GG	+I;awnWUXMYZ[	
 +	 	s   
E
%E4A=E
E

Er   
output_dirc           
         t        j                  |d       t        |      ddg d}|D ]  }|j                  dd      }|j                  dd      j	                  dd	      }|j                  d
d      }|j	                  dd	      j	                  dd	      }| d	| d}	t         j
                  j                  ||	      }
|j                  dd      }|rt        |
dd      5 }|j                  d| d       |j                  d|j                  dd       d       |j                  d| d       |j                  d|j                  dd       d       |j                  |       ddd       |dxx   dz  cc<   nt        |
dd      5 }|j                  d| d       |j                  d|j                  dd       d       |j                  d       |j                  d|j                  dd       d       ddd       |dxx   dz  cc<   |d    j                  ||j                  dd      ||	|j                  d      d!       ! t         j
                  j                  |d"      }t        |dd      5 }t        j                  ||d#$       ddd       t        j                  d%| d&|d    d'|d    d(       |S # 1 sw Y   ^xY w# 1 sw Y   xY w# 1 sw Y   IxY w))z~Save each agent's output to individual markdown files in output_dir.

        Returns path to the _summary.json file.
        T)exist_okr   )r   r  failuresagentsr   r   r   r   r   r    z.mdr   r   wzutf-8)encodingz	# Agent: 
z	# Model: z
# Status: z# Task: r   r   Nr  r   z# Status: FAILED
z	# Error: r   r  r  )r   r   r   filer   z_summary.json   )indentzResults saved to r   z succeeded, z failed)r5   makedirsr   r   replacepathr   r   writer   jsondumprt   rx   )r1   r   r
  summaryr   r   r   r   safe_idfilenamefilepathr   r   summary_paths                 r"   save_resultszMultiModelSwarm.save_resultsg  s    	J. \	#
   	Fzz*i8HJJw	2::3DEZZ)4F&&sC088cBG!!E7#.Hww||J9Hjj2.G(C': %aGGiz45GGi

7I(F'GrJKGGj34GGhvzz&)'D&ETJKGGG$% $)$(C': LaGGiz45GGi

7I(F'GrJKGG02GGi

7I(F'GrJK	L
 
#q(#H$$$GY7  G,& 5 	D ww||J@,g6 	,!IIgq+	, 	
|2{#$L1D0EWN	
 ?% %L L 	, 	,s&    BK
A1K:KK	K	K$)rC   rD   rF   rI   rR   rS   rT   rG   priority)r   qualityspeedc                    |dv r| j                   rdS dS |dk(  rd| j                  v ryd| j                  v ryt        j                         D cg c]6  \  }}||j                  v r#|| j                  v s|dk(  r| j                   ||f8 }}}|sy|dk(  r|j                  d	 
       n1|dk(  r|j                  d 
       n|dk(  r|j                  d 
       |r|d   d   S dS c c}}w )u  
        Recommend the best available model for a task type.

        Hard overrides:
          computer_use / agentic_vision -> gemini-flash (Gemini 2.0 Flash native)
          agent_swarm                   -> kimi-k2-moonshot

        Args:
            task_type: Descriptor of the task
            priority: Ranking criterion — cost, quality, or speed

        Returns:
            Model key string, or None if nothing matches
        r   r`   ra   rG   r]   r^   Nr   c                      | d   j                   S Nr   r*   xs    r"   <lambda>z1MultiModelSwarm.recommend_model.<locals>.<lambda>  s    !A$*<*< r!   )keyr#  c                 "    | d   j                    S r'  r(  r)  s    r"   r+  z1MultiModelSwarm.recommend_model.<locals>.<lambda>  s    1Q4+=+=*= r!   r$  c                      | d   j                   S r'  )r-   r)  s    r"   r+  z1MultiModelSwarm.recommend_model.<locals>.<lambda>  s    !A$// r!   r   )rm   rl   rd   r~   r,   sort)r1   r   r"  r,  r   
candidatess         r"   recommend_modelzMultiModelSwarm.recommend_model  s   , DD%)%8%8>W>WW%!T\\1)"dll2* ,8+=+=+?
'S%E...t||#>)d.A.A.M %L

 
 vOO <O="OO =O> OO 9O:#-z!}Q747%
s   ;C&c           	         | j                   }t        t              }|D ci c]3  }|t        v r)t        |   j                  dt        |   j                   d5 }}|D cg c]  }|t        v r|t        |   j                  f! }}t        |      ||rt        |      |z  dz  ddnd|t        |d d	      d
   | j                  dut        dS c c}w c c}w )zIReturn swarm statistics including routing table and Gemini native status.$z/MTokd   r   %z0%c                     | d   S r'  r    r)  s    r"   r+  z+MultiModelSwarm.get_stats.<locals>.<lambda>  s
    QqT r!   )NN)r,  defaultr   N)r   total_modelsavailability_rater   cheapestgemini_nativerouting_table)r   r   rd   r%   r*   minrm   rh   )r1   available_keysr8  kcost_breakdown	all_costss         r"   	get_statszMultiModelSwarm.get_stats  s   ..<( $
L  O  Al1o&C&C%DE"JJ
 
 $
L  Q--.
	 
 !$N 3(   ',6<cB!D%)$I><PQRS!00<)
 	


s   8C$C)r_   #You are a helpful coding assistant.gffffff?NF)r   NNr   )NNzYou are a computer vision assistant with expertise in understanding screenshots, UI elements, and agentic web/desktop tasks. Describe precisely what you see and suggest the next action.)r   )zIYou are a deep reasoning AI. Think step by step. Be thorough and precise.FrJ   )rC     )r_      )r   )r   r   r   r   r2   ro   rn   r@   r   r=   r   r>   r   r?   rA   r   bytesr   r   r   r   r   r   r   r   r	  r!  r   r1  rB  r    r!   r"   rj   rj   V  s   &"E@2 $s)   #B $(QQ Q 	Q
 Q SMQ Q 
Qt <$(&*%FF F SM	F
 UOF F 
FV %)&*K-
-
 SM-
 UO	-

 -
 
-
n <	 [ [  [ 	 [ 
 [T X(
(
 (
 (
 (
 
(
b C	,, , 	,
 
,d$S>$ $ 
c3h	$R +	-DcN#- - 	-
 
d38n	-^<d38n%< < 
	<P 9?08<
08 4508 
#08d
4S> 
r!   rj   c            
      n   t        d       t        d       t        d       t                t               } t        d       | j                  D ]U  }|t        v r=t        |   }t        d|j                   d|j
                   d|j                   d       Ht        d|        W t                | j                  sMt        d       t        j                         D ]*  \  }}t        d	|j                   d
|j                          , y| j                         }t        d|d    d|d    d       t        d|d           t        d|d           t                t        d       t        j                         D ]  \  }}t        d|dd|         t                | j                  d   }|t        v rt        |   j                  n|}t        d| d       	 | j                  d|d      }	t        d|	        t                t        d       y# t        $ r}
t        d |
        Y d}
~
2d}
~
ww xY w)!zTest script.zP================================================================================zGENESIS MULTI-MODEL SWARMzAvailable Models:z  OK z - $z/MTok (r}   z+WARNING: No models available. Set API keys:z	  export z='your_key'  # NzStats: r   r   r8  z models availablez
Cheapest: r:  zGemini native: r;  zRouting table:z  20sz -> r   zTesting z...z:Write a one-sentence explanation of async/await in Python.r4  )r   r-   zResult: zError: )printrj   r   rd   r%   r*   r&   r~   r'   rB  rh   r   ry   )swarmr   mr,  r   statsr   
test_model
model_namer   r{   s              r"   mainrO    s-   	(O	
%&	(O	GE	
++ '	$Y'AE!&&aoo%6gajj\KLE)%&' 
G!!;<&,,. 	NJCIe//0

|LM	NOOE	GE,-.an0E/FFW
XY	JuZ()
*+	OE/23
45	G	
 , 2 2 4 3	99S/i[123	G''*J)3|)CZ %%  
HZL
$%H  

 	!" 
G	(O	  sms   "H 	H4H//H4__main__)/r   r5   sysr  r   r   typingr   r   r   r   r   enumr   concurrent.futuresr	   r
   loggingbasicConfigINFO	getLoggerr   rt   openair   ImportErrorr   exitgoogle.genairv   r   r   rs   ru   dotenvr   r   r$   r   r   r   rd   r=   __annotations__rh   rj   rO  r    r!   r"   <module>r_     s  < 
 
    5 5  ?    ',, '			8	$	 1OW",-:;
 #( #(X (6'__R  #*&-___ $!"-__R (,)""k* (,'""k* %6__k*" ;()""r  *3(/0""r  $.5(/3""]$ "%(/'__9 %((/'__k* )((/'__3  (/'%%c &&(/8%%?oC'd3
?# CT %$$((##$$/ d38n $a

 a

P3l zF G   
LLDECHHQK  O
NN	(  W
NNUVWs6   (I> /J- >K >(J*)J*-K	K	K&%K&