
    'iYa                        d 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	m
Z
mZmZ ddlmZ 	 ddlmZ  ee      j$                  j$                  dz  Z ee       	 ddlmZ d	Z	 ddlmZmZ d	Ze G d d             Z  G d d      Z!e G d d             Z" G d d      Z#d Z$e%dk(  r e$        yy# e$ r Y ^w xY w# e$ r d
ZddlZddlZY jw xY w# e$ r d
ZdZY nw xY w)aI  
GENESIS GEMINI EXECUTOR
=======================
Direct Gemini API execution for Hyperdrive mode.
Uses $300 Google AI Studio credits.

No Antigravity proxy needed - direct API calls.

Models (January 2026 - Updated):
- gemini-2.0-flash: Primary workhorse (2K RPM, 4M TPM, Unlimited RPD)
- gemini-2.5-flash: Newer model (1K RPM, 1M TPM, 10K RPD)
- gemini-2.5-pro: Complex reasoning (150 RPM, 2M TPM, 10K RPD)
- gemini-2.0-flash-lite: High throughput simple tasks (4K RPM)

Integrated with GeminiRateMaximizer for intelligent rate limit management.

Usage:
    executor = GeminiExecutor()
    result = executor.execute("Implement feature X")
    print(result.response)

    # With rate limit awareness
    executor = GeminiExecutor(use_rate_maximizer=True)
    result = executor.execute_optimized("Analyze this code", task_type="code_review")
    N)datetime	timedelta)Path)DictOptionalAnyList)	dataclass)load_dotenvz.envTF)GeminiRateMaximizerTaskTypec                   l    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
<   y	)GeminiResponsezResponse from Gemini execution.successresponsemodeltokens_usedcost_estimateexecution_timetask_completeNerror)__name__
__module____qualname____doc__bool__annotations__strintfloatr   r        -/mnt/e/genesis-system/core/gemini_executor.pyr   r   =   s:    )MMJE8C=r"   r   c                      e Zd ZdZg dZddddddZd	d
ddddd	dZdddddddddd	Zd-dedede	fdZ
dee   fdZ	 	 	 	 	 d.dededededededefdZ	 	 	 	 	 	 d/dedededededededefd Zdee   fd!Zd0d"ededefd#Z	 d1dededededededefd$Zdedededededefd%Zd&ed'efd(Z	 d2d)ed*edefd+Zdefd,Zy)3GeminiExecutorz
    Direct Gemini API executor for Genesis Hyperdrive.

    Uses $300 in Google AI Studio credits.
    No proxy needed - direct API calls.
    )GEMINI_API_KEYGOOGLE_API_KEYzJE:/genesis-system/Credentials/GoogleAIStudio-Gemini-AgileAdapt-API-KEY.txtgemini-3-flash-previewgemini-2.5-flashgemini-3-pro-previewgemini-2.0-flash-litegemini-2.0-flash-exp)flashflash2proliteexpg?g333333?g      @g333333?g333333?)zgemini-2.0-flashr(   r*   r)   zgemini-2.5-pror+   r,   )	researchcode_generationcode_reviewarchitecturesimple_extractionclassificationsummarizationagentic_visiondeep_visionNapi_keydefault_modeluse_rate_maximizerc                    |xs | j                         | _        | j                  j                  ||      | _        t        d      | _        d| _        d | _        |rt        r	 t               | _        t        r.| j                  r!t        j                  | j                         y y y # t        $ r}t        d|        Y d }~Qd }~ww xY w)Nz)E:/genesis-system/data/gemini_usage.jsonl        z.Warning: Could not initialize rate maximizer: r;   )_load_api_keyr;   MODELSgetr<   r   usage_log_pathtotal_spentrate_maximizerRATE_MAXIMIZER_AVAILABLEr   	ExceptionprintGENAI_AVAILABLEgenai	configure)selfr;   r<   r=   es        r#   __init__zGeminiExecutor.__init__z   s    6$"4"4"6![[__]MJ"#NO #":L&9&;# t||OODLL1  ,?  LFqcJKKLs   "B& &	C/CCreturnc                 T   | j                   dd D ]'  }t        j                  j                  |      }|s%|c S  t	        | j                   d         }|j                         rG|j                         j                         }d|v r#|j                  dd      d   j                         S |S y)z&Load API key from environment or file.N   =   )	API_KEY_SOURCESosenvironrC   r   exists	read_textstripsplit)rM   env_varkeykey_filecontents        r#   rA   zGeminiExecutor._load_api_key   s     ++BQ/ 	G**..)C
	 ,,Q/0??((*002Gg~}}S!,Q/5577Nr"   promptr   system_prompt
max_tokenstemperaturecached_content_namec                    |r| j                   j                  ||      n| j                  }t        j                         }| j                  st        dd|ddddd      S 	 t        r| j                  ||||||      }	n| j                  |||||      }	t        j                         |z
  }
t        |	j                               dz  }|dz  | j                  j                  |d      z  }d	|	v }t        d
|	|t        |      ||
|      }| j                  ||dd        | xj                  |z  c_        | j                  rQt        |j                               dz  }|rd}| j                  j!                  |t        |      t        |      d
       |S # t"        $ r;}t        dd|ddt        j                         |z
  dt%        |            cY d}~S d}~ww xY w)a  
        Execute a prompt with Gemini.

        Args:
            prompt: The task/prompt to execute
            model: Model to use (flash, pro, exp, or full model name)
            system_prompt: Optional system instruction
            max_tokens: Max output tokens
            temperature: Sampling temperature
            cached_content_name: Optional Titan Memory name to use

        Returns:
            GeminiResponse with results
        F r   zNo API key configured)r   r   r   r   r   r   r   r   ?i@B       ?TASK_COMPLETET)r   r   r   r   r   r   r   Nd   )input_tokensoutput_tokensr   )rB   rC   r<   timer;   r   rJ   _execute_with_sdk_execute_with_restlenr[   COSTSr   
_log_usagerE   rF   record_usagerH   r   )rM   r`   r   ra   rb   rc   rd   
model_name
start_timer   r   tokens_estimatecostr   resultrk   rN   s                    r#   executezGeminiExecutor.execute   s   . 7<T[[__UE2ASAS
YY[
||!  #-	 	;	11Jz;Pc
  22Jz; "YY[:5N "(.."23c9O#i/4::>>*d3SSD ,x7M#! 0"-+F OOFF4CL1$ """6<<>2S8&#$L##00!$\!2"%o"6 	 1  M 
	! #yy{Z7#!f	 	
	s   D.F 	G0GGG	task_typepriorityc                 ,   t        t        |j                               dz        |z   }| j                  rt        rd}	t
        r	 t        |      }	| j                  j                  ||	xs t
        j                  |      }
|
j                  }|
j                  dkD  rFt        j                  |
j                         n&| j                  j                  || j                        }| j!                  ||||||      S # t        $ r t
        j                  }	Y w xY w)a  
        Execute with intelligent model selection and rate limit awareness.

        Uses the GeminiRateMaximizer to select the best available model
        based on current utilization and task type.

        Args:
            prompt: The task/prompt to execute
            task_type: Type of task for routing (research, code_generation, etc.)
            system_prompt: Optional system instruction
            max_tokens: Max output tokens
            temperature: Sampling temperature
            priority: Request priority (1-10, lower = higher)
            cached_content_name: Optional Titan Memory name to use

        Returns:
            GeminiResponse with results
        rg   N)token_estimaterz   r{   r   )r`   r   ra   rb   rc   rd   )r   rp   r[   rF   rG   r   
ValueErrorGENERALschedule_requestr   delay_secondsrm   sleepTASK_ROUTINGrC   r<   ry   )rM   r`   rz   ra   rb   rc   r{   rd   r}   task_type_enum	scheduledr   s               r#   execute_optimizedz GeminiExecutor.execute_optimized  s   : S0367*D #;!N6%-i%8N
 ++<<-(<H,<,<! = I OOE &&*

9223 %%)))T5G5GHE ||'!# 3  
 	
) " 6%-%5%5N6s   C7 7DDc                     | j                   rT| j                   j                         }|j                  |j                  |j                  |j
                  |j                  dS y)z
        Get current rate limit utilization report.

        Returns:
            Utilization report dict or None if rate maximizer unavailable
        )	timestamp
best_modeltotal_capacity_usedmodelsrecommendationsN)rF   get_utilization_reportr   r   r   r   r   )rM   reports     r#   r   z%GeminiExecutor.get_utilization_reportD  s[     ((??AF#--$//'-'A'A --#)#9#9  r"   r}   c                    | j                   r4t        r.t        r(	 t        |      }| j                   j                  ||      S | j                  j                  || j                        S # t        $ r t        j                  }Y ]w xY w)z
        Get best available model for a request.

        Args:
            token_estimate: Estimated tokens needed
            task_type: Type of task

        Returns:
            Model name
        )	rF   rG   r   r~   r   get_best_modelr   rC   r<   )rM   r}   rz   r   s       r#   r   zGeminiExecutor.get_best_modelV  sw     #;2!))!4 &&55nnUU  $$Y0B0BCC	  2!)!1!12s   A' 'BBc                    |rK	 t         j                  j                  j                  |      }t         j                  j                  |      }nt        j                  ||      }t        j                  ||      }
|j                  ||
      }|j                  S # t        $ r2}	t        d| d|	        t        j                  ||      }Y d}	~	ld}	~	ww xY w)z&Execute using google-generativeai SDK.)cached_contentz*Titan Memory Warning: Failed to use cache : )rt   system_instructionN)max_output_tokensrc   )generation_config)rK   cachingCachedContentrC   GenerativeModelfrom_cached_contentrH   rI   GenerationConfiggenerate_contenttext)rM   r`   r   ra   rb   rc   rd   cache	model_objrN   r   r   s               r#   rn   z GeminiExecutor._execute_with_sdkj  s     33778KL!11EEUZE[	 -- #0I
 "22(#

 --/ . 

 }}/  BCVBWWYZ[Y\]^!11$'4	s   A	B 	C$(CCc                 X   d| d| j                    }dd|igig||dd}|r
dd|igi|d<   t        j                  |      j                         }t        j
                  j                  ||dd	i
      }	t        j
                  j                  |	d      5 }
t        j                  |
j                         j                               }ddd       j                  dg       }|r<|d   j                  di       j                  dg       }|r|d   j                  dd      S y# 1 sw Y   ZxY w)z Execute using REST API directly.z8https://generativelanguage.googleapis.com/v1beta/models/z:generateContent?key=partsr   )maxOutputTokensrc   )contentsgenerationConfigsystemInstructionzContent-Typeapplication/json)dataheadersx   )timeoutN
candidatesr   r_   rf   )r;   jsondumpsencodeurllibrequestRequesturlopenloadsreaddecoderC   )rM   r`   r   ra   rb   rc   urlpayloadr   reqresprx   r   r   s                 r#   ro   z!GeminiExecutor._execute_with_rest  sC    IOdeieqeqdrs "VV$4#567#-*!
 ,3v}6M5N+OG'(zz'"))+nn$$#%78 % 
 ^^##C#5 	6ZZ		 2 2 45F	6 ZZb1
qM%%i488"EEQx||FB//	6 	6s   2D  D)rx   prompt_previewc           	         | j                   j                  j                  dd       t        j                         j                         |j                  |j                  |j                  |j                  |j                  |j                  |d}t        | j                   d      5 }|j                  t        j                  |      dz          ddd       y# 1 sw Y   yxY w)zLog usage for budget tracking.T)parentsexist_ok)r   r   tokensrw   r   r   r   r   a
N)rD   parentmkdirr   now	isoformatr   r   r   r   r   r   openwriter   r   )rM   rx   r   entryfs        r#   rr   zGeminiExecutor._log_usage  s    ""(((E "113\\(((($33~~#11,	
 $%%s+ 	.qGGDJJu%,-	. 	. 	.s   %(CCtaskworking_dirc                 r   |j                  dd      }|j                  dd      }|j                  dg       }|j                  dd      }dj                  |D cg c])  }dt        |t              r|j                  d|      n| + c}      }d	| d
| d| d| d| d}	d}
| j	                  |	|
      S c c}w )z
        Execute a task from tasks.json format.

        Builds a proper prompt with acceptance criteria
        and verification instructions.
        titlezUnknown Taskdescriptionrf   acceptance_criteriacontextr   z- z$# GENESIS HYPERDRIVE TASK

## Task: z

## Description
z

## Acceptance Criteria
z

## Context
z

## Working Directory
a  

## Instructions
1. Analyze this task carefully
2. Implement the solution
3. Verify against EACH acceptance criterion
4. Report PASS or FAIL for each criterion
5. If ALL criteria pass, include: TASK_COMPLETE
6. If ANY fail, explain what needs to be fixed

## Response Format
```
CRITERION 1: [PASS/FAIL] - [explanation]
CRITERION 2: [PASS/FAIL] - [explanation]
...

IMPLEMENTATION:
[Your implementation or explanation]

STATUS: [TASK_COMPLETE or TASK_INCOMPLETE]
```

Execute now.zYou are a Genesis Hyperdrive agent executing autonomous tasks.
You have full authority to implement solutions.
Be precise, verify your work, and report accurately.
Never claim completion without actual verification.)ra   )rC   join
isinstancedictry   )rM   r   r   r   r   criteriar   ccriteria_textr`   ra   s              r#   execute_taskzGeminiExecutor.execute_task  s     .1hh}b188126((9b)		#
 Jq$,?}a(QGH#
 


      		 
  $L7
 ||F-|@@a#
s   .B4c           	      ^   d}d}d}| j                   j                         rVt        | j                         5 }|D ]2  }	 t        j                  |      }||j                  dd      z  }|dz  }4 	 ddd       ||||z
  ||dkD  r||z  ndt        ||z
  dz        dS #  Y gxY w# 1 sw Y   5xY w)	z Get current budget usage status.g     r@r?   r   rw   rT   Nrh   )total_budgetspent	remaining
iterationsavg_cost_per_iterationestimated_iterations_left)rD   rX   r   r   r   rC   r   )rM   r   r   r   r   liner   s          r#   get_budget_statusz GeminiExecutor.get_budget_status  s     
%%'d))* a D $

4 061!55"a
	 )%-$<FNej&8PT),lU.Bd-J)K
 	
 s"   B#/B,B#B B##B,)Nr-   T)NN    ffffff?N)generalNr   r      N)i  r   )N)zE:/genesis-system)r   r   r   r   rU   rB   rq   r   r   r   rO   r   rA   r   r    r   ry   r   r   r   r   rn   ro   rr   r   r   r!   r"   r#   r%   r%   J   ss   O *$%'%F !"& $ !% $E -3-.4112-
L2 23 2^b 2"x} , ! #'aa a 	a
 a a !a 
aL #! #'A
A
 A
 	A

 A
 A
 A
 !A
 
A
F $DS DC DX[ D6 $()) ) 	)
 ) ) !) 
)V'' ' 	'
 ' ' 
'R. . .* /@A@A @A 
	@AF
4 
r"   r%   c                   R    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZeed<   y	)
TitanMemoryz
    Represents a 'Titan' persistent memory block (Context Cache).
    
    This holds the reference to the cached content on Google's servers.
    namedisplay_namer   expire_timetoken_counti  ttl_secondsN)r   r   r   r   r   r   r   r   r!   r"   r#   r   r   /  s/    
 IJKr"   r   c                   t    e Zd ZdZdefdZ	 	 	 ddee   dededed	e	e
   f
d
Zded	e	e
   fdZd	ee
   fdZy)TitanMemoryManagerz=
    Manages the 'Titan' memory layer (Context Caching).
    r;   c                 `    || _         t        r!t        j                  | j                          y y )Nr@   )r;   rJ   rK   rL   )rM   r;   s     r#   rO   zTitanMemoryManager.__init__C  s!    OODLL1 r"   Nfilesr   r   ttl_minutesrP   c           	      H   t         st        d       y	 |xs  dt        t        j                                }g }t        dt	        |       d       |D ]  }|j                         sd}|j                  dk(  rd}n5|j                  d	k(  rd
}n#|j                  dk(  rd}n|j                  dk(  rd}t        j                  |||j                        }|j                  |        t        d       |D ]j  }	|	j                  j                  dk(  st        j                  d       t        j                  |	j                        }	|	j                  j                  dk(  rNl t        d| d       t        j                  j                  j!                  ||d|t#        |            }
t%        |
j                  |
j&                  |
j(                  t+        |
j,                        |
j.                  j0                  |dz        S # t2        $ r}t        d|        Y d}~yd}~ww xY w)zG
        Create a new Titan Memory block from a list of files.
        z4Error: Titan Memory requires google-generativeai SDKNgenesis_memory_zTitan Memory: Uploading z	 files...z
text/plainz.pyztext/x-pythonz.mdztext/markdownz.jsonr   z.htmlz	text/html)path	mime_typer   z,Titan Memory: Waiting for file processing...
PROCESSINGrT   zTitan Memory: creating cache 'z'...ztYou are the Genesis System. You have full recursive knowledge of your own source code provided in this memory block.)minutes)r   r   r   r   ttl<   )r   r   r   r   r   r   zTitan Memory Error: )rJ   rI   r   rm   rp   rX   suffixrK   upload_filer   appendstater   get_filer   r   creater   r   r   r   r   r   usage_metadatatotal_token_countrH   )rM   r   r   r   r   uploaded_files	file_pathr   pfr   r   rN   s               r#   create_memoryz TitanMemoryManager.create_memoryH  s    HI0	'O_S=M<N+OLN ,SZL	BC" *	 '')(	##u,/i%%.O	%%0>P)%%0k)&&IYbYgYgh%%b)* @A# /gglll2JJqMqvv.A gglll2/ 2<.EFMM//66) $Z'k2 7 E ZZ"//kk 1 12!00BB'",   	(,-	s&   C;H  AH  B!H   	H!	HH!r   c                 ,   t         sy	 t        j                  j                  j	                  |      }t        |j                  |j                  |j                  t        |j                        |j                  j                        S # t        $ r Y yw xY w)z"Retrieve an existing memory block.Nr   r   r   r   r   )rJ   rK   r   r   rC   r   r   r   r   r   r   r   r   rH   )rM   r   r   s      r#   
get_memoryzTitanMemoryManager.get_memory  s{    t
	MM//33D9EZZ"//kk 1 12!00BB   		s   A=B 	BBc                 `   t         sg S g }	 t        j                  j                  j	                         D ]f  }|j                  t        |j                  |j                  |j                  t        |j                        |j                  j                               h 	 |S # t        $ r Y |S w xY w)zList all active memories.r  )rJ   rK   r   r   listr   r   r   r   r   r   r   r   r   rH   )rM   memoriesr   s      r#   list_memoriesz TitanMemoryManager.list_memories  s    r	
	4499; !&!3!3++ #E$5$5 6 % 4 4 F F!    		s   BB   	B-,B-)Nzgemini-2.0-flash-001r   )r   r   r   r   r   rO   r	   r   r   r   r   r  r  r
  r!   r"   r#   r   r   >  s    2 2 !+>Dz> > 	>
 > 
+	>@s x'< tK0 r"   r   c                  L   t               } t        d       | j                  st        d       yt        d| j                  dd  d| j                  dd         t        d| j                          t        d	       | j	                  d
d      }t        d|j
                          t        d|j                  dd         t        d|j                          t        d|j                  d       t        d|j                  dd       t        r+t        d       t        | j                        }t        d       |j                  rt        d|j                          t        d       | j                         }|j                         D ]  \  }}t        | d|         y)zQuick test of Gemini execution.z=== GEMINI EXECUTOR TEST ===\nzERROR: No API key found!Nz	API Key: 
   z...zDefault Model: z\n--- Testing Simple Prompt ---z*What is 2 + 2? Reply with just the number.r-   )r   z	Success: z
Response: rj   zTokens: zCost: $z.4fzTime: z.2fsz)\n--- Testing Titan Memory Capability ---zTitan Manager initialized.zError: z\n--- Budget Status ---r   )r%   rI   r;   r<   ry   r   r   r   r   r   rJ   r   r   r   items)executorrx   titanstatusr]   values         r#   test_geminir    s   H	
+, ()	Ih&&s+,C0@0@0E/F
GH	OH223
45 

,-4  F
 
Ifnn%
&'	Jvt,-
./	HV''(
)*	GF((-
./	F6((-Q
/0 :;"8#3#34*+ ||~&' 

$%'')Flln !
URw !r"   __main__)&r   rV   r   rm   r   r   pathlibr   typingr   r   r   r	   dataclassesr
   dotenvr   __file__r   	_env_pathImportErrorgoogle.generativeaigenerativeairK   rJ   urllib.requestr   urllib.errorcore.gemini_rate_maximizerr   r   rG   r   r%   r   r   r  r   r!   r"   r#   <module>r"     s  4 
   (  , , !	"X%%,,v5I	
'OH# 	  	  	 b
 b
J   h hV*!Z zM ]  		  O  $Hs5   -B4 B? '
C 4B<;B<?CC	C C 