рдореБрдЦреНрдп рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЬрд╛рдПрдБ

Gemini 2.5 Pro API: рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЧрд╛рдЗрдб

рдЬрд╛рдиреЗ рдХрд┐ Gemini 2.5 Pro API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдРрдк рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдореЙрдбрд▓ рдХреА рдмрдбрд╝реЗ рд╕рдВрджрд░реНрдн рд╡рд┐рдВрдбреЛ рдХрд╛ рд▓рд╛рдн рдХреИрд╕реЗ рдЙрдард╛рддреЗ рд╣реИрдВред
┬╖ 12 рдорд┐ре░ рдкрдврд╝реЗрдВ

AI рдХреЗ рд╕рд╛рде рдЦреЛрдЬреЗрдВ

рдХреНрдпрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг 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 рдкрд░ рдкреВрд░рд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рджреЗрдЦреЗрдВред

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 рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВред

google ai studio рдореЗрдВ api рдХреБрдВрдЬреА рдХреИрд╕реЗ рдмрдирд╛рдПрдБ

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)

рдХреБрдЫ рд╣реА рд╕реЗрдХрдВрдб рдореЗрдВ, рд╕рдВрджрд░реНрдн-рд╕рдЪреЗрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬрдирд░реЗрдЯ рд╣реЛ рдЧрдИред

gemini 2.5 pro рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП api рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛

рдиреЛрдЯ: рдЙрдЪреНрдЪ рд▓реЛрдб рдХреЗ рдХрд╛рд░рдг рдлрд┐рд▓рд╣рд╛рд▓ рдореЙрдбрд▓ рддрдХ рдореБрдлреНрдд рдкрд╣реБрдБрдЪ рдЙрдкрд▓рдмреНрдз рди рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдмрд╕ рдХреБрдЫ рдорд┐рдирдЯ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

6. рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди (рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ)

рдЖрдк рдореЙрдбрд▓ рд╕реЗ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред

response = await chat.send_message('Please run the code to ensure that everything is functioning properly.')
Markdown(response.text)

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдлрд╝реАрдЪрд░ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЙрдбрд▓ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддрд╛, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рддрдХ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рд╕рдХрддрд╛, рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

gemini 2.5 pro API рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛

рдиреЛрдЯ: 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 рдХреА рддрд░рд╣ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

gemini 2.5 pro рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ

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

gemini 2.5 pro рдРрдк рдХрдИ рддрд░рд╣ рдХреЗ рдлрд╝рд╛рдЗрд▓ рдЗрдирдкреБрдЯ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ

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

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореЙрдбрд▓ рд╕реБрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИред

gradio рдХреЗ рд╕рд╛рде gemini 2.5 pro рдкреНрд░реЛрдЬреЗрдХреНрдЯ

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

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

gradio рдХреЗ рд╕рд╛рде gemini 2.5 pro рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕

рд╕реЛрд░реНрд╕ рдХреЛрдб рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди GitHub рд░рд┐рдкреЙрдЬрд╝рд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: kingabzpro/Gemini-2.5-Pro-Coding-Appред

рдирд┐рд╖реНрдХрд░реНрд╖

рдПрдХ рд╕рд╣реА рдорд╛рдпрдиреЗ рдореЗрдВ AI рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рдЕрдм рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред LangChain рдЬреИрд╕реЗ рдЯреВрд▓реНрд╕ рд╕реЗ рдЬрдЯрд┐рд▓ рдРрдк рдмрдирд╛рдиреЗ, рд╡реЗрдХреНрдЯрд░ рд╕реНрдЯреЛрд░реНрд╕ рдЗрдВрдЯреАрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ, рдкреНрд░реЙрдореНрдкреНрдЯреНрд╕ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдпрд╛ рдЪреЗрди-рдСрдлрд╝-рдереЙрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдмрд╕ Google API рдХреЗ рдЬрд╝рд░рд┐рдП Gemini 2.5 Pro рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Gemini 2.5 Pro Chat API рд╡рд┐рднрд┐рдиреНрди рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдлрд╝реЙрд▓реЛ-рдЕрдк рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЕрддреНрдпрдВрдд рд╕рдЯреАрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

Abid Ali Awan

рд▓реЗрдЦрдХ

Abid Ali Awan

рдПрдХ рдкреНрд░рдорд╛рдгрд┐рдд рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрдЯрд┐рд╕реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЕрддреНрдпрд╛рдзреБрдирд┐рдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд╡рд╛рдЪрд╛рд░реА рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕рд╛рд╣рд┐рдд рд░рд╣рддрд╛/рд░рд╣рддреА рд╣реВрдБред рд╕реНрдкреАрдЪ рд░рд┐рдХреЙрдЧреНрдирд┐рд╢рди, рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ, MLOps, рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ AI рдФрд░ NLP рдореЗрдВ рдордЬрдмреВрдд рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдРрд╕реЗ рдмреБрджреНрдзрд┐рдорд╛рди рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдирд┐рдЦрд╛рд░реА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХреЗрдВред рддрдХрдиреАрдХреА рджрдХреНрд╖рддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЬрдЯрд┐рд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рднреА рдирд┐рдкреБрдг рд╣реВрдБред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВ рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрд╕ рдкрд░ рдПрдХ рдорд╛рдВрдЧ рдореЗрдВ рд░рд╣рдиреЗ рд╡рд╛рд▓рд╛/рд╡рд╛рд▓реА рдмреНрд▓реЙрдЧрд░ рдмрди рдЧрдпрд╛/рдЧрдИ рд╣реВрдБ, рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░реЛрдлреЗрд╢рдирд▓реЛрдВ рдХреЗ рдмрдврд╝рддреЗ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдФрд░ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛/рдХрд░рддреА рд╣реВрдБред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рдХрдВрдЯреЗрдВрдЯ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕рдВрдкрд╛рджрди рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реВрдБ, рдмрдбрд╝реЗ рднрд╛рд╖рд╛ рдореЙрдбрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рдРрд╕рд╛ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдФрд░ рдЖрдХрд░реНрд╖рдХ рдХрдВрдЯреЗрдВрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛/рд░рд╣реА рд╣реВрдБ рдЬреЛ рд╡реНрдпрд╡рд╕рд╛рдпреЛрдВ рдФрд░ рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рджреЛрдиреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдзрд┐рдХрддрдо рд▓рд╛рдн рдЙрдард╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХреЗред

рд╡рд┐рд╖рдп