Gemini Live API 연결은 10분쯤 끊긴다…재개 로직을 먼저 넣어라

|작성자: QUASA 편집팀|5 분 소요
Gemini Live API 연결은 10분쯤 끊긴다…재개 로직을 먼저 넣어라

Gemini Live API로 실시간 음성·영상 앱을 만들 때는 WebSocket 연결의 종료와 대화의 종료를 따로 다뤄야 한다. Firebase AI Logic의 세션 관리 문서 에 따르면 연속 WebSocket 연결은 약 10분으로 제한되고 세션 컨텍스트는 128K 토큰까지다. 연결이 닫히기 전에 재개 핸들을 저장해 새 연결에 전달하고, 컨텍스트가 쌓이는 문제에는 압축 설정으로 대응한다.

구현 흐름은 모델과 입출력 방식을 정해 연결을 열고, 세션 설정에 함수를 선언하고, 수신 루프가 받은 호출을 앱에서 실행한 뒤 결과를 돌려주는 순서다. 같은 수신 루프에서 음성 출력뿐 아니라 재개 핸들 갱신과 종료 예고도 처리한다. 이 구조를 먼저 잡아야 함수가 실행되는 중에 소켓이 바뀌어도 대화 상태와 외부 작업 상태를 각각 추적할 수 있다.

연결을 열 때 수신 루프와 복구 설정을 함께 만든다

음성 응답을 받는 앱이라면 선택한 SDK의 세션 설정에서 응답 형식을 AUDIO로 지정한다. 영상이 필요할 때는 카메라 프레임을 입력으로 보내되, 영상 입력과 오디오 출력을 같은 개념으로 취급하지 않는다. Google Gen AI SDK의 서버 구현은 모델과 연결 설정을 live.connect에 넘기며, Firebase AI Logic은 별도의 Live 모델 생성과 연결 절차를 사용한다. 필드 이름과 설정 위치를 한 SDK에서 다른 SDK로 그대로 옮기면 재개나 압축이 켜지지 않을 수 있다.

연결 뒤에는 사용자 입력 전송과 서버 메시지 수신을 독립적으로 진행한다. 수신 측이 음성 청크만 소비하면 도구 호출이나 연결 제어 메시지를 놓칠 수 있으므로, 메시지 유형에 따라 응답 재생, 함수 실행, 핸들 저장, 종료 준비를 분기한다. 음성 생성이 이어지는 동안에도 새 입력과 제어 메시지를 처리할 수 있도록 외부 작업을 수신 반복문에서 오래 기다리게 하지 않는 편이 안전하다.

소켓 객체와 사용자의 대화 식별자는 별도 상태로 둔다. 소켓은 수명이 끝나 교체되지만 현재 대화의 재개 핸들과 진행 중인 함수 작업은 다음 연결에서도 판단 자료가 된다. 앱이 보존할 상태에는 마지막으로 유효한 핸들, 아직 결과를 반환하지 않은 호출, 실제 서비스에서 이미 완료된 작업의 기록이 포함된다. 이 저장 방식은 API가 자동으로 제공하는 보장이 아니라 중복 실행과 결과 누락을 막기 위한 애플리케이션 설계다.

함수 호출은 모델의 요청을 앱이 실행해 돌려주는 왕복이다

함수 선언에는 이름, 기능 설명, 인자 형식을 넣고 연결을 시작할 때 tools에 전달한다. 모델이 함수 호출을 생성하는 것은 실행 요청일 뿐이며, 데이터베이스 조회나 예약 변경 같은 실제 코드는 애플리케이션이 수행한다. 함수가 외부 시스템에 접근한다면 선언에 적힌 이름만 보고 실행하지 말고 호출 가능한 작업인지, 사용자가 그 작업을 할 권한이 있는지, 인자가 허용 범위에 있는지 확인한다.

  1. 연결 설정에 필요한 함수 선언을 넣는다. 현재 세션에서 쓰지 않을 작업은 노출하지 않고, 음성 출력 설정과 함께 연결을 연다.
  2. 수신 메시지의 tool_call에서 function_call을 읽는다. 이름과 인자뿐 아니라 호출 ID를 보관하고, 여러 호출이 한 메시지에 담기면 각각을 따로 처리한다.
  3. 앱에서 함수를 실행해 성공 값이나 실패 사유를 결과로 정리한다. 외부 서비스가 응답하지 않거나 권한 검사가 실패했다면 성공한 것처럼 결과를 꾸미지 않는다.
  4. 원래 호출의 이름과 ID에 맞춘 FunctionResponse를 만들어 send_tool_response로 반환한다. 이후 생성되는 음성이나 텍스트 응답도 계속 수신한다.

이 왕복은 모델이 앱의 함수를 직접 실행하는 방식이 아니다. 결과를 보내지 않으면 모델이 다음 응답에 사용할 정보가 없고, 재연결 때 호출을 무조건 재실행하면 상태 변경 작업이 중복될 수 있다. 예약이나 결제처럼 부작용이 있는 함수를 쓰는 경우에는 호출 ID를 앱의 작업 ID와 연결하고, 이미 완료한 작업인지 조회한 뒤 결과를 반환하도록 설계하는 편이 안전하다. 이 중복 방지 절차는 Live API의 자동 보증이 아니라 앱의 책임이다.

느린 함수는 모델별 비동기 지원을 확인한다

함수의 실행 시간이 길다면 모델이 결과를 기다리는 동안 대화를 계속할 수 있는지 먼저 구분해야 한다. Live API 모델 기능표 는 Gemini 3.8 Live의 비동기 함수 호출을 기본 동작으로 설명하고, Extended Thinking 변형은 비동기 방식만 지원한다고 구분한다. 반면 Gemini 3.1 Flash Live Preview는 순차 호출만 지원하므로 결과를 받기 전에는 모델 응답이 진행되지 않는다.

비동기 지원 모델에서는 오래 걸리는 조회를 별도 작업으로 실행하고, 완료 시 원래 호출에 맞는 결과를 반환하도록 구성한다. 모델이 비차단 호출을 지원하더라도 앱의 수신 루프 안에서 외부 요청을 동기적으로 기다리면 그동안 들어오는 오디오와 제어 메시지를 처리하기 어렵다. 작업 큐나 비동기 실행 단위를 쓰라는 권고는 특정 SDK가 요구하는 형식이라기보다 수신 흐름을 막지 않기 위한 구현 선택이다.

함수 결과를 대화에 끼워 넣는 시점도 모델의 지원 범위에 맞춰야 한다. 일부 모델은 결과를 즉시 반영하거나 현재 발화가 끝날 때 처리하거나 나중 대화의 맥락으로만 남기는 예약 방식을 제공하지만, 모든 Live 모델에 같은 설정이 통하지는 않는다. 따라서 비차단 호출 설정과 결과 예약 설정을 한 묶음의 보편적 옵션으로 간주하지 말고 배포 모델의 기능표에 맞춰 고른다.

검색 도구와 자체 함수는 같은 설정 요청에 넣지 않는다

Google Cloud의 Gemini 기능 설정 문서 는 같은 설정 요청에서 Google Search 같은 검색 도구와 함수 호출 같은 비검색 도구를 조합할 수 없다고 명시한다. 자체 함수 선언을 tools에 추가하면서 검색 도구도 함께 넣는 구성은 이 제한에 걸린다. 검색 도구끼리의 조합과 검색 도구·비검색 도구의 혼합은 서로 다른 문제다.

앱이 최신 웹 근거와 자체 서비스의 상태를 모두 필요로 한다면 기능의 경계를 애플리케이션에서 나눠야 한다. 예를 들어 웹 정보를 확인하는 요청과 내부 예약 상태를 조회하는 요청을 별도로 수행하고, 각 결과를 어떤 순서로 사용자 대화에 반영할지 앱이 조정할 수 있다. 이는 가능한 설계 예시이지, 한 Live 세션의 설정에서 금지된 도구 조합이 자동으로 허용된다는 뜻은 아니다.

종료 예고와 최신 핸들로 세션을 이어받는다

세션 재개는 기본적으로 켜져 있지 않으므로 초기 연결에서 재개 설정을 활성화해야 한다. 서버가 재개 가능한 상태와 새 핸들을 보내면, 수신 루프는 이전 값을 최신의 유효한 값으로 교체한다. 핸들을 저장하지 않은 채 연결만 다시 열면 새 소켓은 생겨도 이전 대화 맥락을 이어받을 수 없다.

서버의 종료 예고가 들어오면 다음 연결을 준비하고, 네트워크가 갑자기 끊어져도 저장한 핸들로 새 연결을 시도한다. 연결이 닫힐 때까지 기다렸다가 복구를 생각하면 새 연결 준비와 사용자 안내가 늦어질 수 있다. 재개 성공 여부는 소켓 연결 성공 여부와 별도로 판단하고, 실패하면 기존 맥락이 유지된 것처럼 응답을 이어가지 않도록 한다.

컨텍스트 압축은 재개와 다른 한도를 다룬다. 오디오와 영상 입력, 텍스트, 모델 출력이 누적되면 세션의 컨텍스트 창이 차고, 압축은 오래된 대화 일부를 버리거나 요약해 여유를 만든다. 영상과 오디오를 함께 보내는 앱은 컨텍스트가 더 빠르게 쌓일 수 있으므로 압축 시점을 입력 방식에 맞춰 정한다. 다만 지나치게 이른 압축은 이전 대화의 세부 내용을 잃게 할 수 있으므로 보존해야 할 정보와 지연을 함께 고려한다.

연결 복구 중 외부 함수가 끝났다면 완료 여부를 앱 기록으로 확인한 뒤 결과를 반환할 세션을 결정한다. 유효한 재개 핸들이 없거나 서버가 재개를 받아들이지 않으면 새 대화로 시작하고, 사용자가 이전 맥락이 이어지지 않았다는 사실을 알 수 있게 해야 한다. 소켓의 수명, 모델의 컨텍스트, 앱의 함수 작업을 서로 다른 상태로 관리해야 중단 지점마다 맞는 복구 동작을 선택할 수 있다.

함께 읽기:

공유:

뉴스레터 구독

최신 Web3, AI, 암호화폐 뉴스를 이메일로 받아보세요.

0