File size: 4,436 Bytes
3fd0067
740846d
b8a34b4
 
e106c9a
 
3fd0067
 
bdfd7a5
3fd0067
 
 
 
 
 
 
 
 
 
 
 
bdfd7a5
3fd0067
 
 
 
 
 
 
 
 
 
e106c9a
3fd0067
a517846
e106c9a
a517846
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
740846d
a517846
 
 
 
c02bb52
e106c9a
 
3fd0067
 
 
 
 
 
 
e106c9a
3fd0067
 
a517846
 
 
 
 
 
3fd0067
a517846
 
 
 
 
 
 
 
 
 
 
 
 
 
3fd0067
af3c122
a517846
 
 
 
cb63aa0
e106c9a
a517846
e106c9a
 
3fd0067
 
 
 
e106c9a
3fd0067
e106c9a
3fd0067
 
e106c9a
3fd0067
af3c122
b8a34b4
3fd0067
 
 
 
 
 
 
 
 
 
a517846
3fd0067
 
 
 
 
 
 
bdfd7a5
5f3d5cb
e106c9a
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
141
142
143
import os
import gradio as gr
from google import genai
from google.genai import types
import requests
import markdownify
from urllib.robotparser import RobotFileParser
from urllib.parse import urlparse

# Configure browser tools
def can_crawl_url(url: str, user_agent: str = "*") -> bool:
    """Check robots.txt permissions for a URL"""
    try:
        parsed_url = urlparse(url)
        robots_url = f"{parsed_url.scheme}://{parsed_url.netloc}/robots.txt"
        rp = RobotFileParser(robots_url)
        rp.read()
        return rp.can_fetch(user_agent, url)
    except Exception as e:
        print(f"Error checking robots.txt: {e}")
        return False

def load_page(url: str) -> str:
    """Load webpage content as markdown"""
    if not can_crawl_url(url):
        return f"URL {url} failed robots.txt check"
    try:
        response = requests.get(url, timeout=10)
        return markdownify.markdownify(response.text)
    except Exception as e:
        return f"Error loading page: {str(e)}"

# Initialize Gemini client
client = genai.Client(api_key=os.environ.get("GEMINI_API_KEY"))
MODEL = "gemini-2.0-flash"

TOOL_CONFIGS = {
    "web": [
        types.Tool(
            function_declarations=[
                types.FunctionDeclaration(
                    name="load_page",
                    description="Load webpage content as markdown",
                    parameters={
                        "type": "object",
                        "properties": {
                            "url": {"type": "string", "description": "Full URL to load"}
                        },
                        "required": ["url"]
                    }
                )
            ]
        ),
        types.Tool(google_search=types.GoogleSearch())
    ],
    "code": [
        types.Tool(code_execution=types.ToolCodeExecution())
    ]
}

SYSTEM_INSTRUCTION = """You are an AI assistant. Choose appropriate tools based on the query:
- Use web tools for real-time information
- Use code execution for calculations/analysis
- Never combine search with code execution"""

def format_response(parts):
    """Format response parts with proper Markdown formatting"""
    formatted = []
    for part in parts:
        if part.text:
            formatted.append(part.text)
        if part.executable_code:
            formatted.append(f"```python\n{part.executable_code.code}\n```")
        if part.code_execution_result:
            formatted.append(f"**Result**:\n```\n{part.code_execution_result.output}\n```")
    return "\n\n".join(formatted)

def select_tools(query: str) -> list:
    """Select appropriate tools based on query content"""
    if any(keyword in query.lower() for keyword in ["plot", "calculate", "simulate", "algorithm"]):
        return TOOL_CONFIGS["code"]
    return TOOL_CONFIGS["web"]

def generate_response(user_input):
    try:
        if not user_input.strip():
            raise ValueError("Please enter a valid query")
            
        selected_tools = select_tools(user_input)
        
        response = client.models.generate_content(
            model=MODEL,
            contents=[user_input],
            config=types.GenerateContentConfig(
                temperature=0.7,
                tools=selected_tools,
                system_instruction=SYSTEM_INSTRUCTION
            )
        )
        
        return format_response(response.candidates[0].content.parts)
        
    except Exception as e:
        return f"Error: {str(e)}"

# Create Gradio interface
with gr.Blocks(title="Gemini AI Assistant") as demo:
    gr.Markdown("# πŸš€ Gemini AI Assistant")
    gr.Markdown("Web β€’ Code β€’ Data Analysis")
    
    with gr.Row():
        input_box = gr.Textbox(
            label="Your Query",
            placeholder="Ask anything...",
            lines=3,
            max_lines=10
        )
        output_box = gr.Markdown(
            label="Response",
            elem_classes="markdown-output"
        )
    
    with gr.Row():
        submit_btn = gr.Button("Submit", variant="primary")
        clear_btn = gr.Button("Clear")
    
    def clear():
        return ["", ""]
    
    submit_btn.click(
        fn=generate_response,
        inputs=input_box,
        outputs=output_box
    )
    
    clear_btn.click(
        fn=clear,
        inputs=[],
        outputs=[input_box, output_box]
    )

if __name__ == "__main__":
    demo.launch(server_name="0.0.0.0", server_port=7860)