Session management with Live API

লাইভ এপিআই-তে, একটি সেশন বলতে একটি স্থায়ী সংযোগকে বোঝায় যেখানে একই সংযোগের মাধ্যমে ইনপুট এবং আউটপুট অবিচ্ছিন্নভাবে প্রবাহিত হয় ( এটি কীভাবে কাজ করে সে সম্পর্কে আরও পড়ুন)। এই অনন্য সেশন ডিজাইনটি কম ল্যাটেন্সি নিশ্চিত করে এবং বিশেষ কিছু ফিচার সমর্থন করে, কিন্তু এটি কিছু চ্যালেঞ্জও তৈরি করতে পারে, যেমন সেশনের সময়সীমা এবং সময়ের আগেই সেশন বন্ধ হয়ে যাওয়া। এই নির্দেশিকাটিতে লাইভ এপিআই ব্যবহার করার সময় উদ্ভূত সেশন ব্যবস্থাপনার চ্যালেঞ্জগুলো কাটিয়ে ওঠার কৌশলগুলো আলোচনা করা হয়েছে।

সেশন আজীবন

কম্প্রেশন ছাড়া, শুধুমাত্র অডিও সেশন ১৫ মিনিট এবং অডিও-ভিডিও সেশন ২ মিনিটে সীমাবদ্ধ থাকে। এই সীমা অতিক্রম করলে সেশনটি (এবং ফলস্বরূপ, সংযোগটিও) বিচ্ছিন্ন হয়ে যাবে, কিন্তু আপনি কনটেক্সট উইন্ডো কম্প্রেশন ব্যবহার করে সেশনকে অনির্দিষ্টকালের জন্য বাড়াতে পারেন।

একটি সংযোগের স্থায়িত্বও সীমিত, যা প্রায় ১০ মিনিট। সংযোগ বিচ্ছিন্ন হলে সেশনটিও শেষ হয়ে যায়। এক্ষেত্রে, আপনি সেশন রিজাম্পশন ব্যবহার করে একটিমাত্র সেশনকে একাধিক সংযোগে সক্রিয় রাখার জন্য কনফিগার করতে পারেন। সংযোগ শেষ হওয়ার আগে আপনি একটি ‘গোঅ্যাওয়ে’ বার্তাও পাবেন, যা আপনাকে পরবর্তী পদক্ষেপ নেওয়ার সুযোগ দেবে।

প্রসঙ্গ উইন্ডো সংকোচন

দীর্ঘ সেশন চালু করতে এবং আকস্মিক সংযোগ বিচ্ছিন্ন হওয়া এড়াতে, আপনি সেশন কনফিগারেশনের অংশ হিসেবে contextWindowCompression ফিল্ডটি সেট করে কনটেক্সট উইন্ডো কম্প্রেশন সক্রিয় করতে পারেন।

ContextWindowCompressionConfig- এ আপনি একটি স্লাইডিং-উইন্ডো মেকানিজম এবং কম্প্রেশন চালু করার জন্য প্রয়োজনীয় টোকেনের সংখ্যা কনফিগার করতে পারেন।

পাইথন

from google.genai import types

config = types.LiveConnectConfig(
    response_modalities=["AUDIO"],
    context_window_compression=(
        # Configures compression with default parameters.
        types.ContextWindowCompressionConfig(
            sliding_window=types.SlidingWindow(),
        )
    ),
)

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

const config = {
  responseModalities: [Modality.AUDIO],
  contextWindowCompression: { slidingWindow: {} }
};

অধিবেশন পুনরায় শুরু

সার্ভার যখন পর্যায়ক্রমে ওয়েবসকেট সংযোগ রিসেট করে, তখন সেশন বন্ধ হওয়া রোধ করতে, সেটআপ কনফিগারেশনের মধ্যে sessionResumption ফিল্ডটি কনফিগার করুন।

এই কনফিগারেশনটি পাস করলে সার্ভার SessionResumptionUpdate মেসেজ পাঠায়, যা ব্যবহার করে পরবর্তী সংযোগের SessionResumptionConfig.handle হিসেবে শেষ রিসাম্পশন টোকেনটি পাস করার মাধ্যমে সেশনটি পুনরায় চালু করা যায়।

সর্বশেষ সেশনটি শেষ হওয়ার পর পুনরায় শুরু করার টোকেনগুলো ২ ঘণ্টার জন্য বৈধ থাকে।

পাইথন

import asyncio
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-3.1-flash-live-preview"

async def main():
    print(f"Connecting to the service with handle {previous_session_handle}...")
    async with client.aio.live.connect(
        model=model,
        config=types.LiveConnectConfig(
            response_modalities=["AUDIO"],
            session_resumption=types.SessionResumptionConfig(
                # The handle of the session to resume is passed here,
                # or else None to start a new session.
                handle=previous_session_handle
            ),
        ),
    ) as session:
        while True:
            await session.send_client_content(
                turns=types.Content(
                    role="user", parts=[types.Part(text="Hello world!")]
                )
            )
            async for message in session.receive():
                # Periodically, the server will send update messages that may
                # contain a handle for the current state of the session.
                if message.session_resumption_update:
                    update = message.session_resumption_update
                    if update.resumable and update.new_handle:
                        # The handle should be retained and linked to the session.
                        return update.new_handle

                # For the purposes of this example, placeholder input is continually fed
                # to the model. In non-sample code, the model inputs would come from
                # the user.
                if message.server_content and message.server_content.turn_complete:
                    break

if __name__ == "__main__":
    asyncio.run(main())

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

import { GoogleGenAI, Modality } from '@google/genai';

const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';

async function live() {
  const responseQueue = [];

  async function waitMessage() {
    let done = false;
    let message = undefined;
    while (!done) {
      message = responseQueue.shift();
      if (message) {
        done = true;
      } else {
        await new Promise((resolve) => setTimeout(resolve, 100));
      }
    }
    return message;
  }

  async function handleTurn() {
    const turns = [];
    let done = false;
    while (!done) {
      const message = await waitMessage();
      turns.push(message);
      if (message.serverContent && message.serverContent.turnComplete) {
        done = true;
      }
    }
    return turns;
  }

console.debug('Connecting to the service with handle %s...', previousSessionHandle)
const session = await ai.live.connect({
  model: model,
  callbacks: {
    onopen: function () {
      console.debug('Opened');
    },
    onmessage: function (message) {
      responseQueue.push(message);
    },
    onerror: function (e) {
      console.debug('Error:', e.message);
    },
    onclose: function (e) {
      console.debug('Close:', e.reason);
    },
  },
  config: {
    responseModalities: [Modality.AUDIO],
    sessionResumption: { handle: previousSessionHandle }
    // The handle of the session to resume is passed here, or else null to start a new session.
  }
});

const inputTurns = 'Hello how are you?';
session.sendClientContent({ turns: inputTurns });

const turns = await handleTurn();
for (const turn of turns) {
  if (turn.sessionResumptionUpdate) {
    if (turn.sessionResumptionUpdate.resumable && turn.sessionResumptionUpdate.newHandle) {
      let newHandle = turn.sessionResumptionUpdate.newHandle
      // ...Store newHandle and start new session with this handle here
    }
  }
}

  session.close();
}

async function main() {
  await live().catch((e) => console.error('got error', e));
}

main();

সেশন সংযোগ বিচ্ছিন্ন হওয়ার আগে একটি বার্তা পাওয়া

সার্ভার একটি GoAway বার্তা পাঠায়, যা নির্দেশ করে যে বর্তমান সংযোগটি শীঘ্রই বিচ্ছিন্ন হয়ে যাবে। এই বার্তায় timeLeft অন্তর্ভুক্ত থাকে, যা অবশিষ্ট সময় নির্দেশ করে এবং সংযোগটি ABORTED হিসেবে বিচ্ছিন্ন হওয়ার আগে আপনাকে পরবর্তী পদক্ষেপ নেওয়ার সুযোগ দেয়।

পাইথন

async for response in session.receive():
    if response.go_away is not None:
        # The connection will soon be terminated
        print(response.go_away.time_left)

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

const turns = await handleTurn();

for (const turn of turns) {
  if (turn.goAway) {
    console.debug('Time left: %s\n', turn.goAway.timeLeft);
  }
}

প্রজন্ম সম্পূর্ণ হলে একটি বার্তা পাওয়া যায়

সার্ভার একটি generationComplete বার্তা পাঠায়, যা নির্দেশ করে যে মডেলটি প্রতিক্রিয়া তৈরি করা শেষ করেছে।

পাইথন

async for response in session.receive():
    if response.server_content.generation_complete is True:
        # The generation is complete

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

const turns = await handleTurn();

for (const turn of turns) {
  if (turn.serverContent && turn.serverContent.generationComplete) {
    // The generation is complete
  }
}

এরপর কী?

সম্পূর্ণ ক্যাপাবিলিটিজ গাইড, টুল ইউজ পেজ, অথবা লাইভ এপিআই কুকবুক- এ লাইভ এপিআই নিয়ে কাজ করার আরও উপায় অন্বেষণ করুন।