স্ট্রিমিং মিথস্ক্রিয়া

একটি ইন্টারঅ্যাকশন তৈরি করার সময়, আপনি সার্ভার-প্রেরিত ইভেন্ট (SSE) ব্যবহার করে প্রতিক্রিয়াটি পর্যায়ক্রমে স্ট্রিম করতে stream: true সেট করতে পারেন।

পাইথন

from google import genai

client = genai.Client()

stream = client.interactions.create(
    model="gemini-3-flash-preview",
    input="Count to from 1 to 25.",
    stream=True,
)
for event in stream:
    if event.event_type == "step.delta":
        if event.delta.type == "text":
            print(event.delta.text, end="", flush=True)

জাভাস্ক্রিপ্ট

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const stream = await client.interactions.create({
    model: "gemini-3-flash-preview",
    input: "Count to from 1 to 25.",
    stream: true,
});
for await (const event of stream) {
    if (event.event_type === "step.delta") {
        if (event.delta.type === "text") {
            process.stdout.write(event.delta.text);
        }
    }
}

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Api-Revision: 2026-05-20" \
  --no-buffer \
  -d '{
    "model": "gemini-3-flash-preview",
    "input": "Count to from 1 to 25.",
    "stream": true
  }'
event: interaction.created
data: {"interaction":{"id":"v1_...","status":"in_progress","object":"interaction","model":"gemini-3-flash-preview"},"event_type":"interaction.created"}

event: interaction.status_update
data: {"interaction_id":"v1_...","status":"in_progress","event_type":"interaction.status_update"}

event: step.start
data: {"index":0,"step":{"type":"thought"},"event_type":"step.start"}

event: step.delta
data: {"index":0,"delta":{"signature":"...","type":"thought_signature"},"event_type":"step.delta"}

event: step.stop
data: {"index":0,"event_type":"step.stop"}

event: step.start
data: {"index":1,"step":{"type":"model_output"},"event_type":"step.start"}

event: step.delta
data: {"index":1,"delta":{"text":"1, 2, 3, 4, 5, 6, ","type":"text"},"event_type":"step.delta"}

event: step.delta
data: {"index":1,"delta":{"text":"7, 8, 9, 10, 11, 12, 13,","type":"text"},"event_type":"step.delta"}

...

event: step.stop
data: {"index":1,"event_type":"step.stop"}

event: interaction.completed
data: {"interaction":{"id":"v1_...","status":"completed","usage":{"total_tokens":346,"total_input_tokens":11,"input_tokens_by_modality":[{"modality":"text","tokens":11}],"total_cached_tokens":0,"total_output_tokens":90,"total_tool_use_tokens":0,"total_thought_tokens":245},"created":"2026-05-12T18:44:51Z","updated":"2026-05-12T18:44:51Z","service_tier":"standard","object":"interaction","model":"gemini-3-flash-preview"},"event_type":"interaction.completed"}

event: done
data: [DONE]

ইভেন্টের প্রকারভেদ

সার্ভার থেকে পাঠানো প্রতিটি ইভেন্টে একটি নামযুক্ত event_type এবং সংশ্লিষ্ট JSON ডেটা অন্তর্ভুক্ত থাকে। ইন্টারঅ্যাকশনস এপিআই একটি সিমেট্রিক স্ট্রিমিং মডেল ব্যবহার করে, যেখানে সমস্ত কন্টেন্ট—টেক্সট, টুল কল, চিন্তাভাবনা—একটি সামঞ্জস্যপূর্ণ ধাপ-ভিত্তিক ইভেন্টের মাধ্যমে প্রবাহিত হয়।

প্রতিটি স্ট্রিম এই ঘটনাপ্রবাহ অনুসরণ করে:

  1. interaction.created : ইন্টারঅ্যাকশনটি তৈরি করা হয়েছে, এতে মেটাডেটা (আইডি, মডেল, স্ট্যাটাস) অন্তর্ভুক্ত রয়েছে।
  2. একাধিক ধাপ , যার প্রতিটিতে রয়েছে:
    • একটি step.start ইভেন্ট, যা ধাপের ধরন নির্দেশ করে (যেমন, model_output , thought , function_call )।
    • সেই ধাপের জন্য ক্রমবর্ধমান ডেটা সহ এক বা একাধিক step.delta ইভেন্ট।
    • একটি step.stop ইভেন্ট যা ধাপটিকে সম্পূর্ণ হিসেবে চিহ্নিত করে।
  3. চূড়ান্ত usage পরিসংখ্যান সহ একটি interaction.completed ইভেন্ট।

যখন আপনি stream: false সেট করেন, তখন API একটি steps অ্যারে সহ একটি একক interaction অবজেক্ট রিটার্ন করে। steps এর প্রতিটি উপাদান হলো একটি step.startstep.delta (s) → step.stop চক্রের সম্পূর্ণ একত্রিত সংস্করণ।

interaction.created

ইন্টারঅ্যাকশনটি প্রথমবার তৈরি করার সময় পাঠানো হয়। এতে ইন্টারঅ্যাকশন আইডি, মডেল এবং প্রাথমিক অবস্থা থাকে।

event: interaction.created
data: {"interaction": {"id": "...", "model": "gemini-3-flash-preview", "status": "in_progress", "object": "interaction"}, "event_type": "interaction.created"}

interaction.status_update

এটি মিথস্ক্রিয়া-স্তরের অবস্থার পরিবর্তনের সংকেত দেয়। এটি বিভিন্ন ধাপের মাঝে প্রদর্শিত হতে পারে।

event: interaction.status_update
data: {"interaction_id": "...", "status": "in_progress", "event_type": "interaction.status_update"}

step.start

একটি নতুন ধাপের সূচনা নির্দেশ করে। এতে ধাপের type এবং index থাকে। ধাপের ধরনটি নির্ধারণ করে যে কোন ডেল্টা টাইপগুলো প্রত্যাশিত এবং একটি নন-স্ট্রিমিং রেসপন্সে ধাপটি কীভাবে প্রদর্শিত হবে:

ধাপের ধরণ প্রত্যাশিত ডেল্টা প্রকার বর্ণনা
model_output text , image , audio মডেলের চূড়ান্ত প্রতিক্রিয়ার বিষয়বস্তু।
thought thought_signature , thought_summary চিন্তার ধারাবাহিকতার যুক্তির summary শুধুমাত্র তখনই উপস্থিত থাকে যখন thinking_summaries সক্রিয় করা থাকে।
function_call arguments_delta ক্লায়েন্টকে একটি ফাংশন কার্যকর করার জন্য অনুরোধ। ইন্টারঅ্যাকশন স্ট্যাটাসকে requires_action এ সেট করে।
সার্ভার-সাইড টুলস টুল ভেদে ভিন্ন হয় এপিআই দ্বারা সম্পাদিত টুলসমূহ (যেমন, google_search_call , google_search_result , code_execution_call , code_execution_result )।

সম্পূর্ণ তালিকার জন্য ইন্টারঅ্যাকশন এপিআই রেফারেন্স দেখুন।

event: step.start
data: {"index": 0, "step": {"type": "model_output"}, "event_type": "step.start"}

ফাংশন কল করার ক্ষেত্রে, এই ধাপে ফাংশনের নাম, আইডি এবং খালি আর্গুমেন্ট {} অন্তর্ভুক্ত থাকে।

event: step.start
data: {"index": 0, "step": {"type": "function_call", "id":"un6k8t18", "name": "get_weather", "arguments":{}}, "event_type": "step.start"}

step.delta

বর্তমান ধাপের জন্য ক্রমবর্ধমান ডেটা। delta অবজেক্টটিতে একটি type ফিল্ড থাকে যা এর আকৃতি নির্ধারণ করে।

উদাহরণ:

text : model_output ধাপ থেকে প্রাপ্ত ক্রমবর্ধমান টেক্সট টোকেন:

event: step.delta
data: {"index": 0, "delta": {"type": "text", "text": "Hello, my name is Phil"}, "event_type": "step.delta"}

event: step.delta
data: {"index": 0, "delta": {"type": "text", "text": ", and I live in Germany." }, "event_type": "step.delta"}

image : model_output ধাপ থেকে প্রাপ্ত Base64-এনকোডেড ছবির ডেটা:

event: step.delta
data: {"index": 0, "delta": {"type": "image", "mime_type": "image/jpeg", "data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCg..."}, "event_type": "step.delta"}

thought_summary : একটি thought ধাপ থেকে প্রাপ্ত চিন্তার সারাংশ:

event: step.delta
data: {"index": 0, "delta": {"type": "thought_summary", "content": {"type": "text", "text": "I need to find the GCD..."}}, "event_type": "step.delta"}

arguments_delta : ফাংশন কল আর্গুমেন্টের জন্য (আংশিক) JSON স্ট্রিং। ডেল্টাগুলো জুড়ে অবশ্যই একত্রিত করতে হবে:

event: step.delta
data: {"index": 0, "delta": {"type": "arguments_delta", "arguments": "{\"location\": \"San Francisco, CA\"}"}, "event_type": "step.delta"}

এগুলো হলো কয়েকটি সবচেয়ে প্রচলিত ডেল্টা টাইপ। সকল ডেল্টা টাইপের সম্পূর্ণ তালিকার জন্য, ইন্টারঅ্যাকশনস এপিআই রেফারেন্স দেখুন।

step.stop

একটি ধাপের সমাপ্তি নির্দেশ করে। এতে ধাপ index থাকে।

event: step.stop
data: {"index": 0, "event_type": "step.stop"}

interaction.completed

ইন্টারঅ্যাকশন শেষ হলে পাঠানো হয়। এতে usage পরিসংখ্যানসহ চূড়ান্ত ইন্টারঅ্যাকশন অবজেক্টটি থাকে। নন-স্ট্রিমিং মোডে, এটিই হলো শীর্ষ-স্তরের রেসপন্স অবজেক্ট। রেসপন্সে steps অন্তর্ভুক্ত থাকে না।

event: interaction.completed
data: {"interaction": {"id": "v1_abc123", "status": "completed", "usage": {"total_input_tokens": 7, "total_output_tokens": 12, "total_tokens": 19}}, "event_type": "interaction.completed"}

error

ইন্টারঅ্যাকশনের সময় কোনো ত্রুটি ঘটলে এটি পাঠানো হয়। এতে একটি বার্তা এবং কোড সহ একটি ত্রুটি অবজেক্ট থাকে।

event: error
data: {"error":{"message":"Deadline expired before operation could complete.","code":"gateway_timeout"},"event_type":"error"}

টুল ব্যবহার করে স্ট্রিমিং

ইন্টারঅ্যাকশনস এপিআই একটিমাত্র রিকোয়েস্টে ক্লায়েন্ট-সাইড টুল (ফাংশন কলিং) এবং সার্ভার-সাইড টুল (গুগল সার্চ, কোড এক্সিকিউশন, ইত্যাদি) উভয়ের সাথেই স্ট্রিমিং সমর্থন করে। স্ট্রিমিং চলাকালীন, টুল ইনভোকেশনগুলো ইভেন্ট স্ট্রিমে টাইপ করা স্টেপ হিসেবে প্রদর্শিত হয়। ফাংশন কলের ক্ষেত্রে, step.start ইভেন্টটি ফাংশনের নাম সরবরাহ করে এবং step.delta ইভেন্টগুলো আর্গুমেন্টগুলোকে JSON স্ট্রিং ( arguments_delta ) হিসেবে স্ট্রিম করে। সম্পূর্ণ আর্গুমেন্টগুলো পেতে আপনাকে এই ডেল্টাগুলো একত্রিত করতে হবে। গুগল সার্চের মতো সার্ভার-সাইড টুলগুলো এপিআই দ্বারা স্বয়ংক্রিয়ভাবে এক্সিকিউট হয় এবং google_search_callgoogle_search_result স্টেপ তৈরি করে।

ফাংশন কলিং সহ স্ট্রিমিং

স্ট্রিমিং ব্যবহার করে ফাংশন কলিং করার জন্য, ক্লায়েন্টকে একটি মাল্টি-টার্ন কথোপকথন পরিচালনা করতে হবে: ১. টার্ন ১ (ফাংশন রিকোয়েস্ট): stream: true এবং আপনার সংজ্ঞায়িত tools সহ interactions.create কল করুন। এপিআই একটি function_call স্টেপ স্ট্রিম করবে। requires_action স্ট্যাটাস সহ ইন্টারঅ্যাকশনটি সম্পূর্ণ না হওয়া পর্যন্ত আপনাকে step.delta ইভেন্টগুলো থেকে ক্রমবর্ধমান আর্গুমেন্ট JSON স্ট্রিং ( arguments_delta ) জমা করতে হবে। ২. টার্ন ২ (রেজাল্ট পাঠানো): ` previous_interaction_id (যা প্রথম ইন্টারঅ্যাকশনের আইডির সাথে মেলে) পাস করে এবং input অ্যারের মধ্যে একটি function_result ব্লক পাঠিয়ে interactions.create আবার কল করুন। এটি স্ট্রিমটি পুনরায় চালু করে, যা মডেলকে তার চূড়ান্ত প্রতিক্রিয়া তৈরি করার সুযোগ দেয়।

পাইথন

from google import genai

client = genai.Client()

weather_tool = {
    "type": "function",
    "name": "get_weather",
    "description": "Get the current weather in a given location",
    "parameters": {
        "type": "object",
        "properties": {
            "location": {
                "type": "string",
                "description": "The city and state, e.g. San Francisco, CA"
            }
        },
        "required": ["location"]
    }
}

# Turn 1: Request function call
stream = client.interactions.create(
    model="gemini-3-flash-preview",
    tools=[weather_tool],
    input="What is the weather in Paris right now?",
    stream=True,
)

first_interaction_id = None
func_call_id = None
func_call_name = None
func_args_accumulated = ""

for event in stream:
    if event.event_type == "interaction.created":
        first_interaction_id = event.interaction.id
    elif event.event_type == "step.start":
        step = event.step
        if step.type == "function_call":
            func_call_id = step.id
            func_call_name = step.name
    elif event.event_type == "step.delta":
        if event.delta.type == "arguments_delta":
            func_args_accumulated += event.delta.arguments

# Turn 2: Execute tool and send the result back to resume stream
if func_call_id:
    # Execute weather_tool using accumulated arguments
    # args = json.loads(func_args_accumulated)
    dummy_result = {
        "content": [{"type": "text", "text": '{"weather": "Sunny and 22°C"}'}]
    }

    stream2 = client.interactions.create(
        model="gemini-3-flash-preview",
        previous_interaction_id=first_interaction_id,
        input=[{
            "type": "function_result",
            "name": func_call_name,
            "call_id": func_call_id,
            "result": dummy_result
        }],
        stream=True,
    )

    for event in stream2:
        if event.event_type == "step.delta":
            if event.delta.type == "text":
                print(event.delta.text, end="", flush=True)

জাভাস্ক্রিপ্ট

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const weatherTool = {
    type: "function",
    name: "get_weather",
    description: "Get the current weather in a given location",
    parameters: {
        type: "object",
        properties: {
            location: {
                type: "string",
                description: "The city and state, e.g. San Francisco, CA"
            }
        },
        required: ["location"]
    }
};

// Turn 1: Request function call
const stream = await client.interactions.create({
    model: "gemini-3-flash-preview",
    tools: [weatherTool],
    input: "What is the weather in Paris right now?",
    stream: true,
});

let firstInteractionId = null;
let funcCallId = null;
let funcCallName = null;
let funcArgsAccumulated = "";

for await (const event of stream) {
    if (event.event_type === "interaction.created") {
        firstInteractionId = event.interaction.id;
    } else if (event.event_type === "step.start") {
        const step = event.step;
        if (step.type === "function_call") {
            funcCallId = step.id;
            funcCallName = step.name;
        }
    } else if (event.event_type === "step.delta") {
        if (event.delta.type === "arguments_delta") {
            funcArgsAccumulated += event.delta.arguments;
        }
    }
}

// Turn 2: Execute tool and send the result back to resume stream
if (funcCallId && firstInteractionId && funcCallName) {
    // const args = JSON.parse(funcArgsAccumulated);
    const dummyResult = {
        content: [{ type: "text", text: '{"weather": "Sunny and 22°C"}' }]
    };

    const stream2 = await client.interactions.create({
        model: "gemini-3-flash-preview",
        previous_interaction_id: firstInteractionId,
        input: [{
            type: "function_result",
            name: funcCallName,
            call_id: funcCallId,
            result: dummyResult
        }],
        stream: true,
    });

    for await (const event of stream2) {
        if (event.event_type === "step.delta") {
            if (event.delta.type === "text") {
                process.stdout.write(event.delta.text);
            }
        }
    }
}

বিশ্রাম

পালা ১: ফাংশন কলের অনুরোধ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Api-Revision: 2026-05-20" \
  --no-buffer \
  -d '{
    "model": "gemini-3-flash-preview",
    "input": "What is the weather in Paris right now?",
    "stream": true,
    "tools": [
      {
        "type": "function",
        "name": "get_weather",
        "description": "Get the current weather in a given location",
        "parameters": {
          "type": "object",
          "properties": {
            "location": {
              "type": "string",
              "description": "The city and state, e.g. San Francisco, CA"
            }
          },
          "required": ["location"]
        }
      }
    ]
  }'

টার্ন ২: টার্ন ১ থেকে প্রাপ্ত previous_interaction_id এবং call_id ব্যবহার করে ফাংশনের ফলাফল পাঠান।

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Api-Revision: 2026-05-20" \
  --no-buffer \
  -d '{
    "model": "gemini-3-flash-preview",
    "previous_interaction_id": "v1_ChdGUVFJYXBXVUdLVEF4TjhQ...",
    "stream": true,
    "input": [
      {
        "type": "function_result",
        "name": "get_weather",
        "call_id": "CALL_ID",
        "result": {
          "content": [
            {
              "type": "text",
              "text": "{\"weather\": \"Sunny and 22°C\"}"
            }
          ]
        }
      }
    ]
  }'

একাধিক টুল ব্যবহার করে স্ট্রিমিং

নিম্নলিখিত উদাহরণটিতে একটি অনুরোধে function টুল এবং google_search উভয়ই ব্যবহার করা হয়েছে:

পাইথন

from google import genai

client = genai.Client()

tools = [
    {"type": "google_search"},
    {
        "type": "function",
        "name": "get_weather",
        "description": "Get the current weather in a given location",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "The city and state, e.g. San Francisco, CA"
                }
            },
            "required": ["location"]
        }
    }
]

stream = client.interactions.create(
    model="gemini-3-flash-preview",
    tools=tools,
    input="Search what it the largest mountain in Europe and what the weather is there right now?",
    stream=True,
)
for event in stream:
    if event.event_type == "step.start":
        step = event.step
        print(f"\n--- Step {event.index}: {step.type} ---")
        # Show details for tool steps
        if step.type == "google_search_call":
            print(f"  Search ID: {step.id}")
        elif step.type == "google_search_result":
            print(f"  Result for: {step.call_id}")
        elif step.type == "function_call":
            print(f"  Function: {step.name}({step.arguments})")
    elif event.event_type == "step.delta":
        if event.delta.type == "text":
            print(event.delta.text, end="", flush=True)
        elif event.delta.type == "google_search_call":
            print(f"  Queries: {event.delta.arguments}")
        elif event.delta.type == "arguments_delta":
            print(f"  Args chunk: {event.delta.arguments}", end="", flush=True)
    elif event.event_type == "interaction.completed":
        print(f"\n\nStatus: {event.interaction.status}")
        if event.interaction.status == "requires_action":
            print("Action required: provide function call results to continue.")

জাভাস্ক্রিপ্ট

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const tools = [
    { type: "google_search" },
    {
        type: "function",
        name: "get_weather",
        description: "Get the current weather in a given location",
        parameters: {
            type: "object",
            properties: {
                location: {
                    type: "string",
                    description: "The city and state, e.g. San Francisco, CA"
                }
            },
            required: ["location"]
        }
    }
];

const stream = await client.interactions.create({
    model: "gemini-3-flash-preview",
    tools: tools,
    input: "Search what it the largest mountain in Europe and what the weather is there right now?",
    stream: true,
});
for await (const event of stream) {
    if (event.event_type === "step.start") {
        const step = event.step;
        console.log(`\n--- Step ${event.index}: ${step.type} ---`);
        // Show details for tool steps
        if (step.type === "google_search_call") {
            console.log(`  Search ID: ${step.id}`);
        } else if (step.type === "google_search_result") {
            console.log(`  Result for: ${step.call_id}`);
        } else if (step.type === "function_call") {
            console.log(`  Function: ${step.name}(${JSON.stringify(step.arguments)})`);
        }
    } else if (event.event_type === "step.delta") {
        if (event.delta.type === "text") {
            process.stdout.write(event.delta.text);
        } else if (event.delta.type === "google_search_call") {
            console.log(`  Queries: ${JSON.stringify(event.delta.arguments?.queries)}`);
        } else if (event.step.type === "google_search_result") {
            console.log(`  Result for: ${event.step.call_id}`);
        } else if (event.delta.type === "arguments_delta") {
            process.stdout.write(`  Args chunk: ${event.delta.arguments}`);
        }
    } else if (event.event_type === "interaction.completed") {
        console.log(`\n\nStatus: ${event.interaction.status}`);
        if (event.interaction.status === "requires_action") {
            console.log("Action required: provide function call results to continue.");
        }
    }
}

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Api-Revision: 2026-05-20" \
  --no-buffer \
  -d '{
    "model": "gemini-3-flash-preview",
    "input": "Search what it the largest mountain in Europe and what the weather is there right now?",
    "stream": true,
    "tools": [
      { "type": "google_search" },
      {
        "type": "function",
        "name": "get_weather",
        "description": "Get the current weather in a given location",
        "parameters": {
          "type": "object",
          "properties": {
            "location": {
              "type": "string",
              "description": "The city and state, e.g. San Francisco, CA"
            }
          },
          "required": ["location"]
        }
      }
    ]
  }'
event: interaction.created
data: {"interaction":{"id":"v1_...","status":"in_progress","object":"interaction","model":"gemini-3-flash-preview"},"event_type":"interaction.created"}

event: interaction.status_update
data: {"interaction_id":"v1_...","status":"in_progress","event_type":"interaction.status_update"}

event: step.start
data: {"index":0,"step":{"id":"mkutnkgn","signature":"","type":"google_search_call"},"event_type":"step.start"}

event: step.delta
data: {"index":0,"delta":{"signature":"...","type":"google_search_call","arguments":{"queries":["largest mountain in Europe"]}},"event_type":"step.delta"}

event: step.stop
data: {"index":0,"event_type":"step.stop"}

event: step.start
data: {"index":1,"step":{"call_id":"mkutnkgn","signature":"","type":"google_search_result"},"event_type":"step.start"}

event: step.delta
data: {"index":1,"delta":{"signature":"...","type":"google_search_result","is_error":false},"event_type":"step.delta"}

event: step.stop
data: {"index":1,"event_type":"step.stop"}

event: step.start
data: {"index":2,"step":{"type":"thought"},"event_type":"step.start"}

event: step.delta
data: {"index":2,"delta":{"signature":"...","type":"thought_signature"},"event_type":"step.delta"}

event: step.stop
data: {"index":2,"event_type":"step.stop"}

event: step.start
data: {"index":3,"step":{"id":"ktr5aysg","type":"function_call","name":"get_weather","arguments":{}},"event_type":"step.start"}

event: step.delta
data: {"index":3,"delta":{"arguments":"{\"location\":\"Mount Elbrus, Russia\"}","type":"arguments_delta"},"event_type":"step.delta"}

event: step.stop
data: {"index":3,"event_type":"step.stop"}

event: interaction.completed
data: {"interaction":{"id":"v1_...","status":"requires_action","usage":{"total_tokens":299,"total_input_tokens":138,"input_tokens_by_modality":[{"modality":"text","tokens":138}],"total_cached_tokens":0,"total_output_tokens":20,"total_tool_use_tokens":0,"total_thought_tokens":141},"created":"2026-05-12T17:24:26Z","updated":"2026-05-12T17:24:26Z","service_tier":"standard","object":"interaction","model":"gemini-3-flash-preview"},"event_type":"interaction.completed"}

event: done
data: [DONE]

চিন্তাভাবনার সাথে স্ট্রিমিং

যখন মডেলটি থিঙ্কিং ব্যবহার করে, তখন আপনি দুটি স্বতন্ত্র ডেল্টা টাইপ সহ thought স্টেপস পাবেন: thought_summary (ক্রমবর্ধমান টেক্সট বা ইমেজ সারাংশ কন্টেন্ট) এবং thought_signature (মডেলের অভ্যন্তরীণ যুক্তির একটি এনক্রিপ্টেড উপস্থাপনা, যা step.stop এর আগে শেষ ডেল্টা হিসেবে পাঠানো হয়)। যদি thinking_summaries সক্রিয় করা থাকে, তাহলে thought_summary ডেল্টাগুলো মডেলের যুক্তির একটি সারাংশ স্ট্রিম করে। থিঙ্কিং সম্পর্কে আরও বিস্তারিত জানতে, থিঙ্কিং গাইড দেখুন।

পাইথন

from google import genai

client = genai.Client()

stream = client.interactions.create(
    model="gemini-3-flash-preview",
    input="What is the greatest common divisor of 1071 and 462?",
    generation_config={
        "thinking_summaries": "auto"
    },
    stream=True,
)
for event in stream:
    if event.event_type == "step.start":
        print(f"\n--- Step: {event.step.type} ---")
    elif event.event_type == "step.delta":
        if event.delta.type == "thought_summary":
            if event.delta.content.type == "text":
                print(event.delta.content.text, end="", flush=True)
        elif event.delta.type == "text":
            print(event.delta.text, end="", flush=True)

জাভাস্ক্রিপ্ট

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const stream = await client.interactions.create({
    model: "gemini-3-flash-preview",
    input: "What is the greatest common divisor of 1071 and 462?",
    generation_config: {
        thinking_summaries: "auto",
    },
    stream: true,
});
for await (const event of stream) {
    if (event.event_type === "step.start") {
        console.log(`\n--- Step: ${event.step.type} ---`);
    } else if (event.event_type === "step.delta") {
        if (event.delta.type === "thought_summary") {
            if (event.delta.content.type === "text") {
                process.stdout.write(event.delta.content.text);
            }
        } else if (event.delta.type === "text") {
            process.stdout.write(event.delta.text);
        }
    }
}

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Api-Revision: 2026-05-20" \
  --no-buffer \
  -d '{
    "model": "gemini-3-flash-preview",
    "input": "What is the greatest common divisor of 1071 and 462?",
    "stream": true,
    "generation_config": {
      "thinking_summaries": "auto"
    }
  }'
event: interaction.created
data: {"interaction":{"id":"v1_...","status":"in_progress","object":"interaction","model":"gemini-3-flash-preview"},"event_type":"interaction.created"}

event: interaction.status_update
data: {"interaction_id":"v1_...","status":"in_progress","event_type":"interaction.status_update"}

event: step.start
data: {"index":0,"step":{"type":"thought"},"event_type":"step.start"}

event: step.delta
data: {"index":0,"delta":{"content":{"text":"**Implementing Euclidean Algorithm**\n\nI've just worked through a detailed example applying the Euclidean algorithm to find the GCD of 1071 and 462, confirming its step-by-step nature. The calculations went smoothly, tracking the remainders until zero. My focus is now solidifying the implementation logic, ensuring accuracy and considering potential edge cases. I'll translate this example into code.\n\n\n","type":"text"},"type":"thought_summary"},"event_type":"step.delta"}

event: step.delta
data: {"index":0,"delta":{"signature":"...","type":"thought_signature"},"event_type":"step.delta"}

event: step.stop
data: {"index":0,"event_type":"step.stop"}

event: step.start
data: {"index":1,"step":{"type":"model_output"},"event_type":"step.start"}

...

এজেন্টদের সাথে স্ট্রিমিং

ইন্টারঅ্যাকশনস এপিআই (Interactions API) ডিপ রিসার্চ (Deep Research)-এর মতো এজেন্টদের সমর্থন করে। এজেন্টরা background=True ব্যবহার করে এবং অ্যাসিঙ্ক্রোনাসভাবে ফলাফল ফেরত দেয়, কিন্তু আপনি এজেন্টের ইন্টারঅ্যাকশন স্ট্রিমও করতে পারেন, যাতে অগ্রগতির আপডেট এবং মধ্যবর্তী ধাপগুলো ঘটার সাথে সাথেই পাওয়া যায়। আরও বিস্তারিত জানতে, ডিপ রিসার্চ গাইড দেখুন।

পাইথন

from google import genai

client = genai.Client()

stream = client.interactions.create(
    agent="deep-research-preview-04-2026",
    input="Research the latest advances in quantum computing.",
    stream=True,
    background=True,
    agent_config={
        "type": "deep-research",
        "thinking_summaries": "auto"
    }
)
for event in stream:
    if event.event_type == "step.start":
        print(f"\n--- Step: {event.step.type} ---")
    elif event.event_type == "step.delta":
        if event.delta.type == "text":
            print(event.delta.text, end="", flush=True)
        elif event.delta.type == "thought_summary":
            if event.delta.content.type == "text":
                print(event.delta.content.text, end="", flush=True)
    elif event.event_type == "interaction.completed":
        print(f"\n\nTotal Tokens: {event.interaction.usage.total_tokens}")

জাভাস্ক্রিপ্ট

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const stream = await client.interactions.create({
    agent: "deep-research-preview-04-2026",
    input: "Research the latest advances in quantum computing.",
    stream: true,
    background: true,
    agent_config: {
        type: "deep-research",
        thinking_summaries: "auto"
    }
});
for await (const event of stream) {
    if (event.event_type === "step.start") {
        console.log(`\n--- Step: ${event.step.type} ---`);
    } else if (event.event_type === "step.delta") {
        if (event.delta.type === "text") {
            process.stdout.write(event.delta.text);
        } else if (event.delta.type === "thought_summary") {
            if (event.delta.content.type === "text") {
                process.stdout.write(event.delta.content.text);
            }
        }
    } else if (event.event_type === "interaction.completed") {
        console.log(`\n\nTotal Tokens: ${event.interaction.usage.total_tokens}`);
    }
}

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Api-Revision: 2026-05-20" \
  --no-buffer \
  -d '{
    "agent": "deep-research-preview-04-2026",
    "input": "Research the latest advances in quantum computing.",
    "stream": true,
    "background": true,
    "agent_config": {
      "type": "deep-research",
      "thinking_summaries": "auto"
    }
  }'
event: interaction.created
data: {"interaction":{"id":"v1_...","status":"in_progress","object":"interaction","agent":"deep-research-preview-04-2026"},"event_type":"interaction.created"}

event: interaction.status_update
data: {"interaction_id":"v1_...","status":"in_progress","event_type":"interaction.status_update"}

event: step.start
data: {"index":0,"step":{"type":"thought"},"event_type":"step.start"}

event: step.delta
data: {"index":0,"delta":{"content":{"text":"***Generating research plan***\n\nTo best answer your request, I'm starting by constructing a comprehensive research plan. This will outline the key areas I need to investigate and the strategy I'll use to connect them."},"type":"thought_summary"},"event_type":"step.delta"}

... (additional thought steps) ...

event: step.stop
data: {"index":0,"event_type":"step.stop"}

event: step.start
data: {"index":1,"step":{"type":"model_output"},"event_type":"step.start"}

event: step.delta
data: {"index":1,"delta":{"text":"# The Quantum Inflection Point: Exhaustive Analysis of Hardware, Algorithms, and Market Dynamics in 2026\n\n## Executive Summary\n\n..."},"event_type":"step.delta"}

event: step.stop
data: {"index":1,"event_type":"step.stop"}

event: interaction.completed
data: {"interaction":{"id":"v1_...","status":"completed","usage":{"total_tokens":1117031,"total_input_tokens":428865,"total_output_tokens":22294,"total_thought_tokens":26213},"created":"2026-05-12T17:24:27Z","updated":"2026-05-12T17:24:27Z","object":"interaction","agent":"deep-research-preview-04-2026"},"event_type":"interaction.completed"}

event: done
data: [DONE]

স্ট্রিমিং ইমেজ জেনারেশন

ইন্টারঅ্যাকশনস এপিআই একই সাথে একাধিক আউটপুট মোডালিটি স্ট্রিমিং সমর্থন করে। ` response_formattext এবং image উভয়ই অনুরোধ করার মাধ্যমে, আপনি একই স্ট্রিমে মিশ্রিত টেক্সট এবং তৈরি করা ইমেজ পেতে পারেন।

নিম্নলিখিত উদাহরণটি তথ্য অনুসন্ধান করতে এবং চিত্রসহ একটি গল্প তৈরি করতে gemini-3.1-flash-image-preview (Nano Banana 2) ব্যবহার করে।

পাইথন

from google import genai

client = genai.Client()

stream = client.interactions.create(
    model="gemini-3.1-flash-image-preview",
    tools=[{"type": "google_search", "search_types": ["web_search", "image_search"]}],
    input="Search for the history of the Colosseum and write a short illustrated story about a gladiator named Marcus. Interleave text and generated images.",
    response_format=[
        {"type": "text"},
        {"type": "image"}
    ],
    stream=True,
)

for event in stream:
    if event.event_type == "step.delta":
        if event.delta.type == "text":
            print(event.delta.text, end="", flush=True)
        elif event.delta.type == "image":
            print(f"\n[Image chunk: {len(event.delta.data)} bytes]", end="", flush=True)

জাভাস্ক্রিপ্ট

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const stream = await client.interactions.create({
    model: "gemini-3.1-flash-image-preview",
    tools: [{ type: "google_search", search_types: ["web_search", "image_search"] }],
    input: "Search for the history of the Colosseum and write a short illustrated story about a gladiator named Marcus. Interleave text and generated images.",
    response_format: [
        { type: "text" },
        { type: "image" }
    ],
    stream: true,
});

for await (const event of stream) {
    if (event.event_type === "step.delta") {
        if (event.delta.type === "text") {
            process.stdout.write(event.delta.text);
        } else if (event.delta.type === "image") {
            console.log(`\n[Image chunk: ${event.delta.data.length} bytes]`);
        }
    }
}

বিশ্রাম

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Api-Revision: 2026-05-20" \
  --no-buffer \
  -d '{
    "model": "gemini-3.1-flash-image-preview",
    "input": "Search for the history of the Colosseum and write a short illustrated story about a gladiator named Marcus. Interleave text and generated images.",
    "stream": true,
    "tools": [
      { "type": "google_search",
        "search_types": ["web_search", "image_search"]
      }
    ],
    "generation_config": {
      "thinking_summaries": "auto"
    },
    "response_format": [
      { "type": "text" }, { "type": "image"}
    ]
  }'
event: interaction.created
data: {"interaction":{"id":"v1_...","status":"in_progress","object":"interaction","model":"gemini-3.1-flash-image-preview"},"event_type":"interaction.created"}

event: interaction.status_update
data: {"interaction_id":"v1_...","status":"in_progress","event_type":"interaction.status_update"}

event: step.start
data: {"index":0,"step":{"type":"model_output"},"event_type":"step.start"}

event: step.delta
data: {"index":0,"delta":{"text":"Here is a short illustrated story about the Colosseum...\n\n### Part 1: The New Flavian Amphitheater\n\n...","type":"text"},"event_type":"step.delta"}

...

event: step.stop
data: {"index":0,"event_type":"step.stop"}

event: step.start
data: {"index":1,"step":{"type":"thought"},"event_type":"step.start"}

event: step.delta
data: {"index":1,"delta":{"signature":"...","type":"thought_signature"},"event_type":"step.delta"}

event: step.stop
data: {"index":1,"event_type":"step.stop"}

event: step.start
data: {"index":2,"step":{"type":"model_output"},"event_type":"step.start"}

event: step.delta
data: {"index":2,"delta":{"mime_type":"image/jpeg","data":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCg...","type":"image"},"event_type":"step.delta"}

event: step.delta
data: {"index":2,"delta":{"text":"### Part 2: The Hypogeum and the Wait\n\n...","type":"text"},"event_type":"step.delta"}

...

event: step.stop
data: {"index":2,"event_type":"step.stop"}

event: step.start
data: {"index":3,"step":{"type":"thought"},"event_type":"step.start"}

event: step.delta
data: {"index":3,"delta":{"signature":"...","type":"thought_signature"},"event_type":"step.delta"}

event: step.stop
data: {"index":3,"event_type":"step.stop"}

event: step.start
data: {"index":4,"step":{"type":"model_output"},"event_type":"step.start"}

event: step.delta
data: {"index":4,"delta":{"mime_type":"image/jpeg","data":"/9j/4AAQSkZJRgABAQAAAQABAAD/...","type":"image"},"event_type":"step.delta"}

event: step.delta
data: {"index":4,"delta":{"text":"### Part 3: The Moment of Spectacle\n\n...","type":"text"},"event_type":"step.delta"}

...

event: step.stop
data: {"index":4,"event_type":"step.stop"}

event: interaction.completed
data: {"interaction":{"id":"v1_...","status":"completed","usage":{"total_tokens":6128,"total_input_tokens":29,"total_output_tokens":6099,"output_tokens_by_modality":[{"modality":"image","tokens":4480}]}},"event_type":"interaction.completed"}

event: done
data: [DONE]

অজানা ঘটনা মোকাবেলা করা

এপিআই-এর ভার্সনিং নীতি অনুসারে, সময়ের সাথে সাথে নতুন ইভেন্ট টাইপ এবং ডেল্টা টাইপ যুক্ত হতে পারে। আপনার কোডের উচিত অজানা ইভেন্ট টাইপগুলো সুষ্ঠুভাবে পরিচালনা করা—কোনো ত্রুটি দেখানোর পরিবর্তে, অপরিচিত ইভেন্টগুলো লগ করুন এবং এড়িয়ে যান।

এরপর কী?