Gemini 2.5 Pro рдХреЗ API рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛
Google API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Gemini 2.5 Pro рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпреЗ рдЪрд░рдг рдЕрдкрдирд╛рдПрдБ:
1. рд╕реЗрдЯрдЕрдк
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ google-genai Python рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:
pip install google-genai
2. API рдХреБрдВрдЬреА рдЬрдирд░реЗрдЯ рдХрд░рдирд╛
рдпрд╣рд╛рдБ рдЬрд╛рдПрдБ: Google AI Studio рдФрд░ рдЕрдкрдиреА API рдХреБрдВрдЬреА рдЬрдирд░реЗрдЯ рдХрд░реЗрдВред рдлрд┐рд░, рдЗрд╕ API рдХреБрдВрдЬреА рдХреЛ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ environment variable рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред

3. GenAI рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдирд╛
API рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Google GenAI рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВред рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдкрдХреЛ Gemini 2.5 Pro рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рдиреЗ рджреЗрдЧрд╛ред
import os
from google import genai
from google.genai import types
from IPython.display import Markdown, HTML, Image, display
API_KEY = os.environ.get("GEMINI_API_KEY")
client = genai.Client(api_key=API_KEY)
4. рдлрд╝рд╛рдЗрд▓ рд▓реЛрдб рдХрд░реЗрдВ
рдЬрд┐рд╕ Python рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЖрдк рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЙрдореНрдкреНрдЯ рдмрдирд╛рдПрдБред
# Load the Python file as text
file_path = "secure_app.py"
with open(file_path, "r") as file:
doc_data = file.read()
prompt = "Please integrate user management into the FastAPI application."
contents = [
types.Part.from_bytes(
data=doc_data.encode("utf-8"),
mime_type="text/x-python",
),
prompt,
]
5. рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ
Gemini 2.5 Pro рдореЙрдбрд▓ (gemini-2.5-pro-exp-03-25) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЪреИрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдЗрдП рдФрд░ рдЙрд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдФрд░ рдкреНрд░реЙрдореНрдкреНрдЯ рджреАрдЬрд┐рдПред рдореЙрдбрд▓ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрдирд░реЗрдЯ рдХрд░реЗрдЧрд╛ред
chat = client.aio.chats.create(
model="gemini-2.5-pro-exp-03-25",
config=types.GenerateContentConfig(
tools=[types.Tool(code_execution=types.ToolCodeExecution)]
),
)
response = await chat.send_message(contents)
Markdown(response.text)
рдХреБрдЫ рд╣реА рд╕реЗрдХрдВрдб рдореЗрдВ, рд╕рдВрджрд░реНрдн-рд╕рдЪреЗрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрдирд░реЗрдЯ рд╣реЛ рдЧрдИред

рдиреЛрдЯ: рдЙрдЪреНрдЪ рд▓реЛрдб рдХреЗ рдХрд╛рд░рдг рдлрд┐рд▓рд╣рд╛рд▓ рдореЙрдбрд▓ рддрдХ рдореБрдлреНрдд рдкрд╣реБрдБрдЪ рдЙрдкрд▓рдмреНрдз рди рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдмрд╕ рдХреБрдЫ рдорд┐рдирдЯ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
6. рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди (рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ)
рдЖрдк рдореЙрдбрд▓ рд╕реЗ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
response = await chat.send_message('Please run the code to ensure that everything is functioning properly.')
Markdown(response.text)
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдлрд╝реАрдЪрд░ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЙрдбрд▓ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддрд╛, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рд╕рдХрддрд╛, рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдиреЛрдЯ: Gemini 2.5 Pro рдореЙрдбрд▓ рдореЗрдВ рдЙрдиреНрдирдд "рд╕реЛрдЪрдиреЗ" рдХреА рдХреНрд╖рдорддрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпреЗ Google AI Studio рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди API рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрддреАрдВред
Gemini 2.5 Pro рдХреЗ рд╕рд╛рде рдПрдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдРрдк рдмрдирд╛рдирд╛
рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИтАФрдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдлрд╝рд╛рдЗрд▓реЗрдВ рдпрд╛ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд╛рд▓рд╛ ZIP рдЖрд░реНрдХрд╛рдЗрд╡ рднреАтАФрдПрдХ рдЪреИрдЯ-рдЖрдзрд╛рд░рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдорд╕реНрдпрд╛рдПрдБ рдвреВрдБрдв рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╛рд░рдВрдкрд░рд┐рдХ AI рдХреЛрдб рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛ рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдмрдбрд╝реЗ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рд╕рдВрдШрд░реНрд╖ рдХрд░рддреЗ рд╣реИрдВ, Gemini 2.5 Pro рдЕрдкрдиреА рд▓рдВрдмреА рд╕рдВрджрд░реНрдн рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдореБрджреНрджреЛрдВ рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╕рдорд╛рдзрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
1. рдЖрд╡рд╢реНрдпрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛
gradio UI рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ zipfile36 ZIP рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдБрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред
pip install gradio==5.14.0
pip install zipfile36==0.1.3
2. рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ UI рд╕реЗрдЯрдЕрдк
рдЖрд╡рд╢реНрдпрдХ Python рдкреИрдХреЗрдЬ рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░реЗрдВ, рдЧреНрд▓реЛрдмрд▓ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, GenAI рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ, UI рдХреЙрдиреНрд╕реНрдЯреИрдВрдЯ рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рд╕рдкреЛрд░реНрдЯреЗрдб рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдПрдБред
import os
import zipfile
from typing import Dict, List, Optional, Union
import gradio as gr
from google import genai
from google.genai import types
# Retrieve API key for Google GenAI from the environment variables.
GOOGLE_API_KEY = os.environ.get("GOOGLE_API_KEY")
# Initialize the client so that it can be reused across functions.
CLIENT = genai.Client(api_key=GOOGLE_API_KEY)
# Global variables
EXTRACTED_FILES = {}
# Store chat sessions
CHAT_SESSIONS = {}
TITLE = """<h1 align="center">тЬи Gemini Code Analysis</h1>"""
AVATAR_IMAGES = (None, "https://media.roboflow.com/spaces/gemini-icon.png")
# List of supported text extensions (alphabetically sorted)
TEXT_EXTENSIONS = [
".bat",
".c",
".cfg",
".conf",
".cpp",
".cs",
".css",
".go",
".h",
".html",
".ini",
".java",
".js",
".json",
".jsx",
".md",
".php",
".ps1",
".py",
".rb",
".rs",
".sh",
".toml",
".ts",
".tsx",
".txt",
".xml",
".yaml",
".yml",
]
3. рдлрд╝рдВрдХреНрд╢рди: extract_text_from_zip
extract_text_from_zip() рдлрд╝рдВрдХреНрд╢рди ZIP рдЖрд░реНрдХрд╛рдЗрд╡ рдХреЗ рдЕрдВрджрд░ рдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдПрдХ рдбрд┐рдХреНрд╢рдирд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
def extract_text_from_zip(zip_file_path: str) -> Dict[str, str]:
text_contents = {}
with zipfile.ZipFile(zip_file_path, "r") as zip_ref:
for file_info in zip_ref.infolist():
# Skip directories
if file_info.filename.endswith("/"):
continue
# Skip binary files and focus on text files
file_ext = os.path.splitext(file_info.filename)[1].lower()
if file_ext in TEXT_EXTENSIONS:
try:
with zip_ref.open(file_info) as file:
content = file.read().decode("utf-8", errors="replace")
text_contents[file_info.filename] = content
except Exception as e:
text_contents[file_info.filename] = (
f"Error extracting file: {str(e)}"
)
return text_contents
4. рдлрд╝рдВрдХреНрд╢рди: extract_text_from_single_file
extract_text_from_single_file() рдлрд╝рдВрдХреНрд╢рди рдПрдХрд▓ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдбрд┐рдХреНрд╢рдирд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
def extract_text_from_single_file(file_path: str) -> Dict[str, str]:
text_contents = {}
filename = os.path.basename(file_path)
file_ext = os.path.splitext(filename)[1].lower()
if file_ext in TEXT_EXTENSIONS:
try:
with open(file_path, "r", encoding="utf-8", errors="replace") as file:
content = file.read()
text_contents[filename] = content
except Exception as e:
text_contents[filename] = f"Error reading file: {str(e)}"
return text_contents
5. рдлрд╝рдВрдХреНрд╢рди: upload_zip
upload_zip() рдлрд╝рдВрдХреНрд╢рди рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВтАФрдЪрд╛рд╣реЗ ZIP рд╣реЛрдВ рдпрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВтАФрдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ, рдЯреЗрдХреНрд╕реНрдЯ рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдЪреИрдЯ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
def upload_zip(files: Optional[List[str]], chatbot: List[Union[dict, gr.ChatMessage]]):
global EXTRACTED_FILES
# Handle multiple file uploads
if len(files) > 1:
total_files_processed = 0
total_files_extracted = 0
file_types = set()
# Process each file
for file in files:
filename = os.path.basename(file)
file_ext = os.path.splitext(filename)[1].lower()
# Process based on file type
if file_ext == ".zip":
extracted_files = extract_text_from_zip(file)
file_types.add("zip")
else:
extracted_files = extract_text_from_single_file(file)
file_types.add("text")
if extracted_files:
total_files_extracted += len(extracted_files)
# Store the extracted content in the global variable
EXTRACTED_FILES[filename] = extracted_files
total_files_processed += 1
# Create a summary message for multiple files
file_types_str = (
"files"
if len(file_types) > 1
else ("ZIP files" if "zip" in file_types else "text files")
)
# Create a list of uploaded file names
file_list = "\n".join([f"- {os.path.basename(file)}" for file in files])
chatbot.append(
gr.ChatMessage(
role="user",
content=f"<p>ЁЯУЪ Multiple {file_types_str} uploaded ({total_files_processed} files)</p><p>Extracted {total_files_extracted} text file(s) in total</p><p>Uploaded files:</p><pre>{file_list}</pre>",
)
)
# Handle single file upload (original behavior)
elif len(files) == 1:
file = files[0]
filename = os.path.basename(file)
file_ext = os.path.splitext(filename)[1].lower()
# Process based on file type
if file_ext == ".zip":
extracted_files = extract_text_from_zip(file)
file_type_msg = "ЁЯУж ZIP file"
else:
extracted_files = extract_text_from_single_file(file)
file_type_msg = "ЁЯУД File"
if not extracted_files:
chatbot.append(
gr.ChatMessage(
role="user",
content=f"<p>{file_type_msg} uploaded: {filename}, but no text content was found or the file format is not supported.</p>",
)
)
else:
file_list = "\n".join([f"- {name}" for name in extracted_files.keys()])
chatbot.append(
gr.ChatMessage(
role="user",
content=f"<p>{file_type_msg} uploaded: {filename}</p><p>Extracted {len(extracted_files)} text file(s):</p><pre>{file_list}</pre>",
)
)
# Store the extracted content in the global variable
EXTRACTED_FILES[filename] = extracted_files
return chatbot
6. рдлрд╝рдВрдХреНрд╢рди: user
user() рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдХреЛ рдЪреИрдЯрдмреЙрдЯ рдХреА рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рд╣рд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
def user(text_prompt: str, chatbot: List[gr.ChatMessage]):
if text_prompt:
chatbot.append(gr.ChatMessage(role="user", content=text_prompt))
return "", chatbot
7. рдлрд╝рдВрдХреНрд╢рди: get_message_content
get_message_content() рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рд╕рдВрджреЗрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдХреНрд╢рдирд░реА рдпрд╛ Gradio рдЪреИрдЯ рд╕рдВрджреЗрд╢ рджреЛ рдореЗрдВ рд╕реЗ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
def get_message_content(msg):
if isinstance(msg, dict):
return msg.get("content", "")
return msg.content
8. рдлрд╝рдВрдХреНрд╢рди: send_to_gemini
send_to_gemini() рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░реЙрдореНрдкреНрдЯ Gemini AI рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХрд░рддреЗ рд╣реБрдП рдЪреИрдЯрдмреЙрдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдб рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
def send_to_gemini(chatbot: List[Union[dict, gr.ChatMessage]]):
global EXTRACTED_FILES, CHAT_SESSIONS
if len(chatbot) == 0:
chatbot.append(
gr.ChatMessage(
role="assistant",
content="Please enter a message to start the conversation.",
)
)
return chatbot
# Get the last user message as the prompt
user_messages = [
msg
for msg in chatbot
if (isinstance(msg, dict) and msg.get("role") == "user")
or (hasattr(msg, "role") and msg.role == "user")
]
if not user_messages:
chatbot.append(
gr.ChatMessage(
role="assistant",
content="Please enter a message to start the conversation.",
)
)
return chatbot
last_user_msg = user_messages[-1]
prompt = get_message_content(last_user_msg)
# Skip if the last message was about uploading a file (ZIP, single file, or multiple files)
if (
"ЁЯУж ZIP file uploaded:" in prompt
or "ЁЯУД File uploaded:" in prompt
or "ЁЯУЪ Multiple files uploaded" in prompt
):
chatbot.append(
gr.ChatMessage(
role="assistant",
content="What would you like to know about the code in this ZIP file?",
)
)
return chatbot
# Generate a unique session ID based on the extracted files or use a default key for no files
if EXTRACTED_FILES:
session_key = ",".join(sorted(EXTRACTED_FILES.keys()))
else:
session_key = "no_files"
# Create a new chat session if one doesn't exist for this set of files
if session_key not in CHAT_SESSIONS:
# Configure Gemini with code execution capability
CHAT_SESSIONS[session_key] = CLIENT.chats.create(
model="gemini-2.5-pro-exp-03-25",
)
# Send all extracted files to the chat session first
initial_contents = []
for zip_name, files in EXTRACTED_FILES.items():
for filename, content in files.items():
file_ext = os.path.splitext(filename)[1].lower()
mime_type = "text/plain"
# Set appropriate mime type based on file extension
if file_ext == ".py":
mime_type = "text/x-python"
elif file_ext in [".js", ".jsx"]:
mime_type = "text/javascript"
elif file_ext in [".ts", ".tsx"]:
mime_type = "text/typescript"
elif file_ext == ".html":
mime_type = "text/html"
elif file_ext == ".css":
mime_type = "text/css"
elif file_ext in [".json", ".jsonl"]:
mime_type = "application/json"
elif file_ext in [".xml", ".svg"]:
mime_type = "application/xml"
# Create a header with the filename to preserve original file identity
file_header = f"File: {filename}\n\n"
file_content = file_header + content
initial_contents.append(
types.Part.from_bytes(
data=file_content.encode("utf-8"),
mime_type=mime_type,
)
)
# Initialize the chat context with files if available
if initial_contents:
initial_contents.append(
"I've uploaded these code files for you to analyze. I'll ask questions about them next."
)
# Use synchronous API instead of async
CHAT_SESSIONS[session_key].send_message(initial_contents)
# For sessions without files, we don't need to send an initial message
# Append a placeholder for the assistant's response
chatbot.append(gr.ChatMessage(role="assistant", content=""))
# Send the user's prompt to the existing chat session using streaming API
response = CHAT_SESSIONS[session_key].send_message_stream(prompt)
# Process the response stream - text only (no images)
output_text = ""
for chunk in response:
if chunk.candidates and chunk.candidates[0].content.parts:
for part in chunk.candidates[0].content.parts:
if part.text is not None:
# Append the new chunk of text
output_text += part.text
# Update the last assistant message with the current accumulated response
if isinstance(chatbot[-1], dict):
chatbot[-1]["content"] = output_text
else:
chatbot[-1].content = output_text
# Yield the updated chatbot to show streaming updates in the UI
yield chatbot
# Return the final chatbot state
return chatbot
9. рдлрд╝рдВрдХреНрд╢рди: reset_app
rest_app() рдлрд╝рдВрдХреНрд╢рди рдЪреИрдЯ рд╣рд┐рд╕реНрдЯреНрд░реА рдФрд░ рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
def reset_app(chatbot):
global EXTRACTED_FILES, CHAT_SESSIONS
# Clear the global variables
EXTRACTED_FILES = {}
CHAT_SESSIONS = {}
# Reset the chatbot with a welcome message
return [
gr.ChatMessage(
role="assistant",
content="App has been reset. You can start a new conversation or upload new files.",
)
]
10. Gradio UI рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕
рдЖрдЗрдП Gradio рдХреЙрдореНрдкреЛрдиреЗрдВрдЯреНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ: рдЪреИрдЯрдмреЙрдЯ, рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ, рдЕрдкрд▓реЛрдб рдмрдЯрди, рдФрд░ рдХрдВрдЯреНрд░реЛрд▓ рдмрдЯрдиред
# Define the Gradio UI components
chatbot_component = gr.Chatbot(
label="Gemini 2.5 Pro",
type="messages",
bubble_full_width=False,
avatar_images=AVATAR_IMAGES,
scale=2,
height=350,
)
text_prompt_component = gr.Textbox(
placeholder="Ask a question or upload code files to analyze...",
show_label=False,
autofocus=True,
scale=28,
)
upload_zip_button_component = gr.UploadButton(
label="Upload",
file_count="multiple",
file_types=[".zip"] + TEXT_EXTENSIONS,
scale=1,
min_width=80,
)
send_button_component = gr.Button(
value="Send", variant="primary", scale=1, min_width=80
)
reset_button_component = gr.Button(
value="Reset", variant="stop", scale=1, min_width=80
)
# Define input lists for button chaining
user_inputs = [text_prompt_component, chatbot_component]
11. Gradio рдРрдк рд▓реЗрдЖрдЙрдЯ
рд╕рд╛рдлрд╝-рд╕реБрдерд░реЗ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Gradio рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХрд░реЗрдВред
with gr.Blocks(theme=gr.themes.Ocean()) as demo:
gr.HTML(TITLE)
with gr.Column():
chatbot_component.render()
with gr.Row(equal_height=True):
text_prompt_component.render()
send_button_component.render()
upload_zip_button_component.render()
reset_button_component.render()
# When the Send button is clicked, first process the user text then send to Gemini
send_button_component.click(
fn=user,
inputs=user_inputs,
outputs=[text_prompt_component, chatbot_component],
queue=False,
).then(
fn=send_to_gemini,
inputs=[chatbot_component],
outputs=[chatbot_component],
api_name="send_to_gemini",
)
# Allow submission using the Enter key
text_prompt_component.submit(
fn=user,
inputs=user_inputs,
outputs=[text_prompt_component, chatbot_component],
queue=False,
).then(
fn=send_to_gemini,
inputs=[chatbot_component],
outputs=[chatbot_component],
api_name="send_to_gemini_submit",
)
# Handle ZIP file uploads
upload_zip_button_component.upload(
fn=upload_zip,
inputs=[upload_zip_button_component, chatbot_component],
outputs=[chatbot_component],
queue=False,
)
# Handle Reset button clicks
reset_button_component.click(
fn=reset_app,
inputs=[chatbot_component],
outputs=[chatbot_component],
queue=False,
)
12. рдРрдк рд▓реЙрдиреНрдЪ рдХрд░рдирд╛
рдХрдИ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреВрдЗрдВрдЧ рд╕рдХреНрд╖рдо рдХрд░рдХреЗ Gradio рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реЛрдХрд▓реА рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред
# Launch the demo interface
demo.queue(max_size=99, api_open=False).launch(
debug=False,
show_error=True,
server_port=9595,
server_name="localhost",
)
Gemini 2.5 Pro рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдРрдк рдХрд╛ рдкрд░реАрдХреНрд╖рдг
рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдП рдЧрдП рд╕рднреА рдХреЛрдб рд╕реНрд░реЛрддреЛрдВ рдХреЛ main.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХрд╕рд╛рде рд░рдЦреЗрдВ (рдореИрдВрдиреЗ рдЗрд╕реЗ GitHub рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЙрдкреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ)ред рдЗрд╕реЗ рдирд┐рдореНрди рдХрдорд╛рдВрдб рд╕реЗ рдЪрд▓рд╛рдПрдБ:
python main.py
рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ URL рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛: http://localhost:9595/
рдЖрдк URL рдХреЙрдкреА рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рдЪреИрдЯрдмреЙрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рд╣рдо рдЗрд╕реЗ ChatGPT рдХреА рддрд░рд╣ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

тАЬUploadтАЭ рдмрдЯрди рдПрдХрд▓ рдФрд░ рдПрдХрд╛рдзрд┐рдХ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб, рд╕рд╛рде рд╣реА рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП zip рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред рддреЛ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ рдпрджрд┐ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ 20 рд╕реЗ рдЕрдзрд┐рдХ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ; рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдРрдк рдЙрдиреНрд╣реЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдХреЗ Gemini 2.5 Pro API рдХреЛ рднреЗрдЬ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдЖрдЗрдП рдХрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ рдФрд░ Gemini 2.5 Pro рд╕реЗ рд╣рдорд╛рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреЗрд╣рддрд░ рдХрд░рд╡рд╛рдПрдБред┬а
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореЙрдбрд▓ рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред

рд╣рдо рдЗрд╕реЗ secure_app.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рд╕реБрдЭрд╛рд╡ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ тАЬResetтАЭ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рддрдЪреАрдд рд╢реБрд░реВ рдХрд░реЗрдВред

рд╕реЛрд░реНрд╕ рдХреЛрдб рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: kingabzpro/Gemini-2.5-Pro-Coding-Appред
рдирд┐рд╖реНрдХрд░реНрд╖
рдПрдХ рд╕рд╣реА рдорд╛рдпрдиреЗ рдореЗрдВ AI рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рдЕрдм рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред LangChain рдЬреИрд╕реЗ рдЯреВрд▓реНрд╕ рд╕реЗ рдЬрдЯрд┐рд▓ рдРрдк рдмрдирд╛рдиреЗ, рд╡реЗрдХреНрдЯрд░ рд╕реНрдЯреЛрд░реНрд╕ рдЗрдВрдЯреАрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ, рдкреНрд░реЙрдореНрдкреНрдЯреНрд╕ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдпрд╛ рдЪреЗрди-рдСрдлрд╝-рдереЙрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдмрд╕ Google API рдХреЗ рдЬрд╝рд░рд┐рдП Gemini 2.5 Pro рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Gemini 2.5 Pro Chat API рд╡рд┐рднрд┐рдиреНрди рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдлрд╝реЙрд▓реЛ-рдЕрдк рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЕрддреНрдпрдВрдд рд╕рдЯреАрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдкреНрд░рдорд╛рдгрд┐рдд рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрдЯрд┐рд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╡рд╛рдЪрд╛рд░реА рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕рд╛рд╣рд┐рдд рд░рд╣рддрд╛/рд░рд╣рддреА рд╣реВрдБред рд╕реНрдкреАрдЪ рд░рд┐рдХреЙрдЧреНрдирд┐рд╢рди, рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ, MLOps, рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ AI рдФрд░ NLP рдореЗрдВ рдордЬрдмреВрдд рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдРрд╕реЗ рдмреБрджреНрдзрд┐рдорд╛рди рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд┐рдЦрд╛рд░реА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХреЗрдВред рддрдХрдиреАрдХреА рджрдХреНрд╖рддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЬрдЯрд┐рд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рднреА рдирд┐рдкреБрдг рд╣реВрдБред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВ рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрд╕ рдкрд░ рдПрдХ рдорд╛рдВрдЧ рдореЗрдВ рд░рд╣рдиреЗ рд╡рд╛рд▓рд╛/рд╡рд╛рд▓реА рдмреНрд▓реЙрдЧрд░ рдмрди рдЧрдпрд╛/рдЧрдИ рд╣реВрдБ, рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░реЛрдлреЗрд╢рдирд▓реЛрдВ рдХреЗ рдмрдврд╝рддреЗ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛/рдХрд░рддреА рд╣реВрдБред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рдХрдВрдЯреЗрдВрдЯ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕рдВрдкрд╛рджрди рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реВрдБ, рдмрдбрд╝реЗ рднрд╛рд╖рд╛ рдореЙрдбрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдРрд╕рд╛ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдФрд░ рдЖрдХрд░реНрд╖рдХ рдХрдВрдЯреЗрдВрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛/рд░рд╣реА рд╣реВрдБ рдЬреЛ рд╡реНрдпрд╡рд╕рд╛рдпреЛрдВ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рджреЛрдиреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдзрд┐рдХрддрдо рд▓рд╛рдн рдЙрдард╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХреЗред

рдХреНрдпрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг AI рдРрдк рдмрдирд╛рдирд╛ рднреА рд╡реЗрдХреНрдЯрд░ рд╕реНрдЯреЛрд░реНрд╕, RAG рдЯреВрд▓реНрд╕, API, рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд╛ рдЭрдВрдЭрдЯ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИ? рдЕрдм рдирд╣реАрдВред Gemini 2.5 Pro 10 рд▓рд╛рдЦ рдЯреЛрдХрдиреНрд╕ рдХреА рд▓рдВрдмреА рд╕рдВрджрд░реНрдн рд╡рд┐рдВрдбреЛ (рдЬрд┐рд╕реЗ рджреЛрдЧреБрдирд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ) рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА RAG рдпрд╛ рд╡реЗрдХреНрдЯрд░ рд╕реНрдЯреЛрд░ рдЯреВрд▓ рдХреЗ рд╕реАрдзреЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИред
Gemini 2.5 Pro рдПрдХ рд░реАрдЬрдирд┐рдВрдЧ рдореЙрдбрд▓ рд╣реИ рдЬреЛ рдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рд╡рд┐рд╢рд╛рд▓ рд╕рдВрджрд░реНрдн рд╡рд┐рдВрдбреЛ рдХреЛрдб-рдХреЗрдВрджреНрд░рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдореВрд▓реНрдп рдХреЗ рджреНрд╡рд╛рд░ рдЦреЛрд▓рддреА рд╣реИред рдЗрд╕реАрд▓рд┐рдП, рдЗрд╕ рдмреНрд▓реЙрдЧ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдРрд╕рд╛ рд╡реЗрдм рдРрдк рдмрдирд╛рдХрд░ рджрд┐рдЦрд╛рдКрдБрдЧрд╛ рдЬреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╣реА рд╕реЗрдХрдВрдб рдореЗрдВ рдЖрдкрдХреЗ рдХреЛрдбрд┐рдВрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдореИрдВ рд╕реАрдзреЗ рдХреЛрдб рдкрд░ рдЖрддрд╛ рд╣реВрдБтАФрдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдореЙрдбрд▓ рдХрд╛ рдУрд╡рд░рд╡реНрдпреВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдЗрдВрдЯреНрд░реЛ рдмреНрд▓реЙрдЧ рдХреЛ рджреЗрдЦреЗрдВ Gemini 2.5 Pro, рдФрд░ рдирд╡реАрдирддрдо рдореЙрдбрд▓, Gemini 3ред рдпрджрд┐ рдЖрдк рдирдП Computer Use рдлрд╝реАрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ Gemini 2.5 Computer Use рдкрд░ рдкреВрд░рд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреЗрдЦреЗрдВред