File size: 6,313 Bytes
cf39fdd
8f4afba
 
eb383b4
8f4afba
 
 
cf39fdd
8f4afba
cf39fdd
b222573
d4bb802
 
eb383b4
d4bb802
eb383b4
d4bb802
 
 
8f4afba
 
cf39fdd
8f4afba
 
cf39fdd
66fb40b
d090fef
 
 
5c51c70
d090fef
cf39fdd
beaf9ba
b222573
 
beaf9ba
 
 
 
 
d090fef
 
b222573
beaf9ba
d090fef
 
 
 
 
 
 
b222573
d090fef
cf39fdd
d090fef
 
d4bb802
8f4afba
 
cf39fdd
8f4afba
b85e67b
 
 
 
 
2e436c7
0023761
1ad3e3c
d090fef
1ad3e3c
5c51c70
 
d090fef
1ad3e3c
d090fef
cf39fdd
8f4afba
 
1ad3e3c
 
 
d090fef
 
c9a71f8
d090fef
 
66fb40b
1ad3e3c
8f4afba
 
c9a71f8
66fb40b
b222573
8f4afba
66fb40b
d090fef
b222573
 
66fb40b
d090fef
 
 
 
 
 
1ad3e3c
b222573
1ad3e3c
 
d090fef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b222573
d090fef
8f4afba
b222573
d090fef
b222573
 
cf39fdd
8f4afba
2e436c7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import os
import subprocess
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from google import genai
from google.genai import types

app = FastAPI()

# CORS Configurations - Saari settings pehle jaisi safe hain
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
client = genai.Client(api_key=GEMINI_API_KEY)

class ChatRequest(BaseModel):
    message: str

# TOOL: Hardcore Terminal Execution System (Root Permission)
def run_terminal_command(command: str) -> str:
    """
    Executes any bash command inside the secure Linux sandbox workspace (/tmp).
    Use this to run python scripts, compile Flutter apps, build APKs, or manage git operations (like git worktree).
    """
    try:
        full_command = f"cd /tmp && {command}"
        env = os.environ.copy()
        
        result = subprocess.run(
            full_command, 
            shell=True, 
            capture_output=True, 
            text=True, 
            errors="replace",
            timeout=300,
            env=env
        )
        
        output = f"Exit Code: {result.returncode}\n"
        if result.stdout:
            output += f"STDOUT:\n{result.stdout}\n"
        if result.stderr:
            output += f"STDERR:\n{result.stderr}\n"
        return output
    except subprocess.TimeoutExpired:
        return "ERROR: Command execution timed out after 5 minutes to prevent server freeze."
    except Exception as e:
        return f"SYSTEM ERROR: {str(e)}"

@app.post("/chat")
async def agent_chat(request: ChatRequest):
    user_prompt = request.message
    
    system_instruction = (
        "You are an expert AI Agent Builder operating inside a fully equipped Linux sandbox.\n\n"
        "YOUR DEVELOPMENT ENVIRONMENT capabilities:\n"
        "- **Python 3** is installed. You can write and execute python scripts (`python3 script.py`).\n"
        "- **Flutter & Dart SDK** are pre-installed globally. You can run `flutter create` and `flutter build apk --release`.\n"
        "- **Android Native Build System** is pre-installed. Full OpenJDK 17, Android SDK (API 34), and Build-Tools (34.0.0) are ready. You can create Native Android apps (using gradle wrappers) and build them directly.\n"
        "- **HOP-AI SDK** is pre-installed. You can use 'import hop' in your python scripts to interact with remote cloud volumes, manage infrastructure, or offload long-running tasks if necessary.\n"
        "- You are operating with full administrative permissions inside the `/tmp` directory.\n\n"
        "YOUR AVAILABLE TOOLS:\n"
        "- `run_terminal_command`: Call this tool to run any shell/bash script or build commands. Do NOT wrap shell code in text-based markdown blocks if you intend to run it; execute it directly via this tool.\n"
        "- `Google Search`: You have native access to live Google Search. Use it automatically whenever you need to look up documentation for APIs (like catbox.moe, gofile.io, transfer.sh), research web endpoints, check dependency updates, or debug compilation errors.\n\n"
        "ADVANCED GIT WORKSPACE MANAGEMENT:\n"
        "- You are encouraged to use `git worktree` when managing parallel tasks, feature implementations, or isolated testing branches. Instead of risky checkout switching or stashing uncommitted modifications, utilize `git worktree add -b <branch-name> <path>` to spin up isolated, standalone directories inside `/tmp` for separate branches. This keeps the main codebase safe and unpolluted during builds.\n\n"
        "CRITICAL EXECUTION RULES:\n"
        "- Analyze tool execution outputs carefully. If a command or build script fails, analyze the error log, use Google Search to find a solution or documentation if needed, self-correct, update your code, and execute again until successful.\n"
        "- Once the objective is completed successfully (e.g., app compiled or file uploaded), present a clean summary and direct download links to the user."
    )
    
    try:
        # Custom functional tools mapping
        custom_tools = {
            "run_terminal_command": run_terminal_command
        }
        
        # Gemma-2-9b-it model configurations
        config = types.GenerateContentConfig(
            system_instruction=system_instruction,
            tools=[run_terminal_command, {'google_search': {}}],
            temperature=0.2
        )
        
        # Chat session explicitly locked to Gemma
        chat = client.chats.create(model='gemma2-9b-it', config=config)
        response = chat.send_message(user_prompt)
        
        max_turns = 6 
        current_turn = 0
        execution_history = []
        
        # AGENT EXECUTION LOOP
        while response.function_calls and current_turn < max_turns:
            function_responses = []
            
            for function_call in response.function_calls:
                name = function_call.name
                args = function_call.args
                call_id = function_call.id
                
                if name in custom_tools:
                    tool_output = custom_tools[name](**args)
                    
                    execution_history.append({
                        "turn": current_turn + 1,
                        "tool_called": name,
                        "arguments": args,
                        "raw_output": tool_output
                    })
                    
                    function_responses.append(
                        types.Part.from_function_response(
                            name=name,
                            response={"result": tool_output},
                            id=call_id
                        )
                    )
            
            if function_responses:
                response = chat.send_message(function_responses)
            else:
                break
                
            current_turn += 1
            
        return {
            "agent_response": response.text,
            "execution_history": execution_history if execution_history else None
        }

    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))