Agent Gemini Deep Research autonomicznie planuje, wykonuje i syntetyzuje wieloetapowe zadania badawcze. Ta funkcja korzysta z modelu Gemini 3 Pro, który przeszukuje złożone zasoby informacji, korzystając z wyszukiwarki i Twoich danych, aby tworzyć szczegółowe raporty z wykazem źródeł.
Zadania badawcze obejmują iteracyjne wyszukiwanie i czytanie, a ich wykonanie może potrwać kilka minut. Aby uruchamiać agenta asynchronicznie i sprawdzać wyniki, musisz używać wykonywania w tle (ustaw background=true). Więcej informacji znajdziesz w sekcji Obsługa długotrwałych zadań.
Poniższy przykład pokazuje, jak rozpocząć zadanie badawcze w tle i sprawdzać wyniki.
Python
import time
from google import genai
client = genai.Client()
interaction = client.interactions.create(
input="Research the history of Google TPUs.",
agent='deep-research-pro-preview-12-2025',
background=True
)
print(f"Research started: {interaction.id}")
while True:
interaction = client.interactions.get(interaction.id)
if interaction.status == "completed":
print(interaction.outputs[-1].text)
break
elif interaction.status == "failed":
print(f"Research failed: {interaction.error}")
break
time.sleep(10)
JavaScript
import { GoogleGenAI } from '@google/genai';
const client = new GoogleGenAI({});
const interaction = await client.interactions.create({
input: 'Research the history of Google TPUs.',
agent: 'deep-research-pro-preview-12-2025',
background: true
});
console.log(`Research started: ${interaction.id}`);
while (true) {
const result = await client.interactions.get(interaction.id);
if (result.status === 'completed') {
console.log(result.outputs[result.outputs.length - 1].text);
break;
} else if (result.status === 'failed') {
console.log(`Research failed: ${result.error}`);
break;
}
await new Promise(resolve => setTimeout(resolve, 10000));
}
REST
# 1. Start the research task
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
"input": "Research the history of Google TPUs.",
"agent": "deep-research-pro-preview-12-2025",
"background": true
}'
# 2. Poll for results (Replace INTERACTION_ID)
# curl -X GET "https://generativelanguage.googleapis.com/v1beta/interactions/INTERACTION_ID" \
# -H "x-goog-api-key: $GEMINI_API_KEY"
Wyszukaj, używając własnych danych
Deep Research ma dostęp do różnych narzędzi. Domyślnie agent ma dostęp do informacji w publicznym internecie za pomocą narzędzi google_search i url_context. Nie musisz domyślnie określać tych narzędzi. Jeśli jednak chcesz dodatkowo przyznać agentowi dostęp do własnych danych za pomocą narzędzia File Search, musisz dodać je w sposób pokazany w poniższym przykładzie.
Python
import time
from google import genai
client = genai.Client()
interaction = client.interactions.create(
input="Compare our 2025 fiscal year report against current public web news.",
agent="deep-research-pro-preview-12-2025",
background=True,
tools=[
{
"type": "file_search",
"file_search_store_names": ['fileSearchStores/my-store-name']
}
]
)
JavaScript
const interaction = await client.interactions.create({
input: 'Compare our 2025 fiscal year report against current public web news.',
agent: 'deep-research-pro-preview-12-2025',
background: true,
tools: [
{ type: 'file_search', file_search_store_names: ['fileSearchStores/my-store-name'] },
]
});
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
"input": "Compare our 2025 fiscal year report against current public web news.",
"agent": "deep-research-pro-preview-12-2025",
"background": true,
"tools": [
{"type": "file_search", "file_search_store_names": ["fileSearchStores/my-store-name"]},
]
}'
Sterowanie i formatowanie
Możesz sterować danymi wyjściowymi agenta, podając w prompcie konkretne instrukcje formatowania. Umożliwia to dzielenie raportów na określone sekcje i podsekcje, uwzględnianie tabel danych oraz dostosowywanie tonu do różnych odbiorców (np. „technical”, „executive”, „casual”).
W tekście wejściowym wyraźnie określ żądany format wyjściowy.
Python
prompt = """
Research the competitive landscape of EV batteries.
Format the output as a technical report with the following structure:
1. Executive Summary
2. Key Players (Must include a data table comparing capacity and chemistry)
3. Supply Chain Risks
"""
interaction = client.interactions.create(
input=prompt,
agent="deep-research-pro-preview-12-2025",
background=True
)
JavaScript
const prompt = `
Research the competitive landscape of EV batteries.
Format the output as a technical report with the following structure:
1. Executive Summary
2. Key Players (Must include a data table comparing capacity and chemistry)
3. Supply Chain Risks
`;
const interaction = await client.interactions.create({
input: prompt,
agent: 'deep-research-pro-preview-12-2025',
background: true,
});
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
"input": "Research the competitive landscape of EV batteries.\n\nFormat the output as a technical report with the following structure: \n1. Executive Summary\n2. Key Players (Must include a data table comparing capacity and chemistry)\n3. Supply Chain Risks",
"agent": "deep-research-pro-preview-12-2025",
"background": true
}'
Obsługa długotrwałych zadań
Deep Research to wieloetapowy proces obejmujący planowanie, wyszukiwanie, czytanie i pisanie. Ten cykl zwykle przekracza standardowe limity czasu oczekiwania synchronicznych wywołań interfejsu API.
Przedstawiciele muszą korzystać z background=True. Interfejs API od razu zwraca obiekt częściowy
Interaction. Za pomocą właściwości id możesz pobrać interakcję na potrzeby ankiety. Stan interakcji zmieni się z in_progress na completed lub failed.
Streaming
Deep Research obsługuje przesyłanie strumieniowe, dzięki czemu możesz otrzymywać aktualizacje w czasie rzeczywistym dotyczące postępów w badaniach. Musisz ustawić wartości stream=True i background=True.
Poniższy przykład pokazuje, jak rozpocząć zadanie badawcze i przetworzyć strumień.
Co najważniejsze, pokazuje, jak śledzić zdarzenie interaction_id z interaction.start. Ten identyfikator będzie potrzebny do wznowienia strumienia w przypadku przerwy w działaniu sieci. Ten kod wprowadza też zmienną event_id, która umożliwia wznowienie połączenia w miejscu, w którym zostało przerwane.
Python
stream = client.interactions.create(
input="Research the history of Google TPUs.",
agent="deep-research-pro-preview-12-2025",
background=True,
stream=True,
agent_config={
"type": "deep-research",
"thinking_summaries": "auto"
}
)
interaction_id = None
last_event_id = None
for chunk in stream:
if chunk.event_type == "interaction.start":
interaction_id = chunk.interaction.id
print(f"Interaction started: {interaction_id}")
if chunk.event_id:
last_event_id = chunk.event_id
if chunk.event_type == "content.delta":
if chunk.delta.type == "text":
print(chunk.delta.text, end="", flush=True)
elif chunk.delta.type == "thought_summary":
print(f"Thought: {chunk.delta.content.text}", flush=True)
elif chunk.event_type == "interaction.complete":
print("\nResearch Complete")
JavaScript
const stream = await client.interactions.create({
input: 'Research the history of Google TPUs.',
agent: 'deep-research-pro-preview-12-2025',
background: true,
stream: true,
agent_config: {
type: 'deep-research',
thinking_summaries: 'auto'
}
});
let interactionId;
let lastEventId;
for await (const chunk of stream) {
// 1. Capture Interaction ID
if (chunk.event_type === 'interaction.start') {
interactionId = chunk.interaction.id;
console.log(`Interaction started: ${interactionId}`);
}
// 2. Track IDs for potential reconnection
if (chunk.event_id) lastEventId = chunk.event_id;
// 3. Handle Content
if (chunk.event_type === 'content.delta') {
if (chunk.delta.type === 'text') {
process.stdout.write(chunk.delta.text);
} else if (chunk.delta.type === 'thought_summary') {
console.log(`Thought: ${chunk.delta.content.text}`);
}
} else if (chunk.event_type === 'interaction.complete') {
console.log('\nResearch Complete');
}
}
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions?alt=sse" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
"input": "Research the history of Google TPUs.",
"agent": "deep-research-pro-preview-12-2025",
"background": true,
"stream": true,
"agent_config": {
"type": "deep-research",
"thinking_summaries": "auto"
}
}'
# Note: Look for the 'interaction.start' event to get the interaction ID.
Ponownie łączę ze strumieniem
Podczas długotrwałych zadań badawczych mogą wystąpić przerwy w działaniu sieci. Aby sobie z tym poradzić, aplikacja powinna przechwytywać błędy połączenia i wznawiać strumień za pomocą client.interactions.get().
Aby wznowić, musisz podać 2 wartości:
- Identyfikator interakcji: uzyskany ze zdarzenia
interaction.startw strumieniu początkowym. - Identyfikator ostatniego wydarzenia: identyfikator ostatniego wydarzenia, które zostało przetworzone. Dzięki temu serwer będzie mógł wznowić wysyłanie zdarzeń po tym konkretnym momencie. Jeśli nie podasz tej wartości, otrzymasz początek transmisji.
Poniższe przykłady pokazują odporny wzorzec: próba przesyłania strumieniowego początkowego żądania create i przełączanie się na pętlę get w przypadku utraty połączenia.
Python
import time
from google import genai
client = genai.Client()
# Configuration
agent_name = 'deep-research-pro-preview-12-2025'
prompt = 'Compare golang SDK test frameworks'
# State tracking
last_event_id = None
interaction_id = None
is_complete = False
def process_stream(event_stream):
"""Helper to process events from any stream source."""
global last_event_id, interaction_id, is_complete
for event in event_stream:
# Capture Interaction ID
if event.event_type == "interaction.start":
interaction_id = event.interaction.id
print(f"Interaction started: {interaction_id}")
# Capture Event ID
if event.event_id:
last_event_id = event.event_id
# Print content
if event.event_type == "content.delta":
if event.delta.type == "text":
print(event.delta.text, end="", flush=True)
elif event.delta.type == "thought_summary":
print(f"Thought: {event.delta.content.text}", flush=True)
# Check completion
if event.event_type in ['interaction.complete', 'error']:
is_complete = True
# 1. Attempt initial streaming request
try:
print("Starting Research...")
initial_stream = client.interactions.create(
input=prompt,
agent=agent_name,
background=True,
stream=True,
agent_config={
"type": "deep-research",
"thinking_summaries": "auto"
}
)
process_stream(initial_stream)
except Exception as e:
print(f"\nInitial connection dropped: {e}")
# 2. Reconnection Loop
# If the code reaches here and is_complete is False, we resume using .get()
while not is_complete and interaction_id:
print(f"\nConnection lost. Resuming from event {last_event_id}...")
time.sleep(2)
try:
resume_stream = client.interactions.get(
id=interaction_id,
stream=True,
last_event_id=last_event_id
)
process_stream(resume_stream)
except Exception as e:
print(f"Reconnection failed, retrying... ({e})")
JavaScript
let lastEventId;
let interactionId;
let isComplete = false;
// Helper to handle the event logic
const handleStream = async (stream) => {
for await (const chunk of stream) {
if (chunk.event_type === 'interaction.start') {
interactionId = chunk.interaction.id;
}
if (chunk.event_id) lastEventId = chunk.event_id;
if (chunk.event_type === 'content.delta') {
if (chunk.delta.type === 'text') {
process.stdout.write(chunk.delta.text);
} else if (chunk.delta.type === 'thought_summary') {
console.log(`Thought: ${chunk.delta.content.text}`);
}
} else if (chunk.event_type === 'interaction.complete') {
isComplete = true;
}
}
};
// 1. Start the task with streaming
try {
const stream = await client.interactions.create({
input: 'Compare golang SDK test frameworks',
agent: 'deep-research-pro-preview-12-2025',
background: true,
stream: true,
agent_config: {
type: 'deep-research',
thinking_summaries: 'auto'
}
});
await handleStream(stream);
} catch (e) {
console.log('\nInitial stream interrupted.');
}
// 2. Reconnect Loop
while (!isComplete && interactionId) {
console.log(`\nReconnecting to interaction ${interactionId} from event ${lastEventId}...`);
try {
const stream = await client.interactions.get(interactionId, {
stream: true,
last_event_id: lastEventId
});
await handleStream(stream);
} catch (e) {
console.log('Reconnection failed, retrying in 2s...');
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
REST
# 1. Start the research task (Initial Stream)
# Watch for event: interaction.start to get the INTERACTION_ID
# Watch for "event_id" fields to get the LAST_EVENT_ID
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions?alt=sse" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
"input": "Compare golang SDK test frameworks",
"agent": "deep-research-pro-preview-12-2025",
"background": true,
"stream": true,
"agent_config": {
"type": "deep-research",
"thinking_summaries": "auto"
}
}'
# ... Connection interrupted ...
# 2. Reconnect (Resume Stream)
# Pass the INTERACTION_ID and the LAST_EVENT_ID you saved.
curl -X GET "https://generativelanguage.googleapis.com/v1beta/interactions/INTERACTION_ID?stream=true&last_event_id=LAST_EVENT_ID&alt=sse" \
-H "x-goog-api-key: $GEMINI_API_KEY"
Dodatkowe pytania i interakcje
Po przesłaniu przez pracownika obsługi klienta ostatecznego raportu możesz kontynuować rozmowę, korzystając z previous_interaction_id. Dzięki temu możesz poprosić o wyjaśnienie, podsumowanie lub rozwinięcie konkretnych sekcji badania bez konieczności ponownego rozpoczynania całego zadania.
Python
import time
from google import genai
client = genai.Client()
interaction = client.interactions.create(
input="Can you elaborate on the second point in the report?",
model="gemini-3-pro-preview",
previous_interaction_id="COMPLETED_INTERACTION_ID"
)
print(interaction.outputs[-1].text)
JavaScript
const interaction = await client.interactions.create({
input: 'Can you elaborate on the second point in the report?',
agent: 'deep-research-pro-preview-12-2025',
previous_interaction_id: 'COMPLETED_INTERACTION_ID'
});
console.log(interaction.outputs[-1].text);
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
"input": "Can you elaborate on the second point in the report?",
"agent": "deep-research-pro-preview-12-2025",
"previous_interaction_id": "COMPLETED_INTERACTION_ID"
}'
Kiedy używać agenta Deep Research w Gemini
Deep Research to agent, a nie tylko model. Najlepiej sprawdza się w przypadku zbiorów zadań, które wymagają podejścia „analityk w pudełku”, a nie czatu o niskim poziomie opóźnień.
| Funkcja | Standardowe modele Gemini | Agent Deep Research w Gemini |
|---|---|---|
| Opóźnienie | Sekundy | Minuty (asynchroniczne/w tle) |
| Proces | Generowanie -> Dane wyjściowe | Planowanie –> Wyszukiwanie –> Czytanie –> Iteracja –> Wynik |
| Dane wyjściowe | tekst konwersacyjny, kod, krótkie podsumowania; | Szczegółowe raporty, obszerne analizy, tabele porównawcze |
| Najlepsze zastosowania | Chatboty, wyodrębnianie, pisanie kreatywne | analiza rynku, należyta staranność, przegląd literatury, analiza konkurencji; |
Dostępność i ceny
- Dostępność: dostępna w interfejsie Interactions API w Google AI Studio i Gemini API.
- Ceny: szczegółowe informacje i stawki znajdziesz na stronie z cennikiem.
Bezpieczeństwo
Przyznanie agentowi dostępu do internetu i plików prywatnych wymaga starannego rozważenia zagrożeń związanych z bezpieczeństwem.
- Wstrzykiwanie promptów za pomocą plików: agent odczytuje zawartość podanych przez Ciebie plików. Upewnij się, że przesłane dokumenty (pliki PDF, pliki tekstowe) pochodzą z zaufanych źródeł. Złośliwy plik może zawierać ukryty tekst, który ma na celu manipulowanie danymi wyjściowymi agenta.
- Ryzyko związane z treściami w internecie: agent przeszukuje publiczny internet. Stosujemy co prawda zaawansowane filtry bezpieczeństwa, ale istnieje ryzyko, że agent napotka i przetworzy złośliwe strony internetowe. Zalecamy sprawdzenie
citationspodanych w odpowiedzi, aby zweryfikować źródła. - Eksfiltracja: zachowaj ostrożność, prosząc Agenta o podsumowanie poufnych danych wewnętrznych, jeśli zezwalasz mu też na przeglądanie internetu.
Sprawdzone metody
- Prompt for unknowns (Prośba o informacje w przypadku braku danych): podaj agentowi instrukcje dotyczące postępowania w przypadku braku danych. Na przykład dodaj do promptu „Jeśli konkretne dane za 2025 r. nie są dostępne, wyraźnie zaznacz, że są to prognozy lub że są niedostępne, zamiast je szacować”.
- Podaj kontekst: ugruntuj wiedzę agenta, podając informacje lub ograniczenia bezpośrednio w prompcie wejściowym.
- Dane wejściowe multimodalne: agent Deep Research obsługuje dane wejściowe multimodalne. Używaj go ostrożnie, ponieważ zwiększa koszty i ryzyko przepełnienia okna kontekstu.
Ograniczenia
- Stan wersji beta: interfejs Interactions API jest dostępny w wersji beta. Funkcje i schematy mogą ulec zmianie.
- Niestandardowe narzędzia: obecnie nie możesz udostępniać agentowi Deep Research niestandardowych narzędzi do wywoływania funkcji ani zdalnych serwerów MCP (Model Context Protocol).
- Ustrukturyzowane dane wyjściowe i zatwierdzanie planu: agent Deep Research Agent nie obsługuje obecnie zatwierdzania planowania przez człowieka ani ustrukturyzowanych danych wyjściowych.
- Maksymalny czas badania: agent Deep Research ma maksymalny czas badania wynoszący 60 minut. Większość zadań powinna zostać ukończona w ciągu 20 minut.
- Wymagania dotyczące sklepu: wykonywanie agenta za pomocą
background=Truewymagastore=True. - Wyszukiwarka Google: wyszukiwarka Google jest domyślnie włączona i do wyników podstawowych mają zastosowanie określone ograniczenia.
- Dane wejściowe audio: dane wejściowe audio nie są obsługiwane.
Co dalej?
- Dowiedz się więcej o interfejsie Interactions API.
- Dowiedz się więcej o modelu Gemini 3 Pro, który obsługuje tego agenta.
- Dowiedz się, jak korzystać z własnych danych za pomocą narzędzia Wyszukiwanie plików.