← 블로그 목록
가이드2026-05-21

OpenAI 말고 Gemini·Claude로 AI 전화 에이전트 만들기: Pipeline 모드 완전 가이드

OpenAI 말고 Gemini·Claude로 AI 전화 에이전트 만들기: Pipeline 모드 완전 가이드

ClawOps - AI 전화 에이전트 플랫폼

ClawOps의 AI 전화 에이전트 예제를 보면 대부분 OpenAI Realtime을 사용합니다. 하지만 현실에서는 "Gemini가 한국어를 더 잘 알아듣는다", "Claude의 추론이 더 정확하다", "비용을 줄이고 싶다" 같은 이유로 다른 AI 엔진을 쓰고 싶은 경우가 많습니다.

ClawOps Voice Agent SDK는 세 가지 세션 타입을 지원합니다:

  1. OpenAI Realtime — OpenAI Realtime API (검증 완료, 기본)
  2. Gemini Realtime — Google Gemini Live API
  3. Pipeline — STT + LLM + TTS를 각각 선택해 조합

이 글에서는 Gemini Realtime과 Pipeline 모드의 설정법, Provider 조합, 커스텀 Provider 구현까지 다룹니다.

세션 타입 비교

세션 타입장점단점추천 상황
OpenAI Realtime가장 낮은 레이턴시, 검증 완료비용 높음, OpenAI 종속빠른 응답이 중요한 CS
Gemini RealtimeGoogle AI 생태계, 합리적 비용검증 전Gemini 선호 / Google Cloud 사용 팀
Pipeline각 컴포넌트 자유 선택, 비용 최적화 가능레이턴시 상대적으로 높음Claude/Mistral/로컬 LLM 사용, 비용 최적화

Gemini Realtime: Google AI로 전화 에이전트

설치

# Python
pip install clawops[agent,gemini]

# Node.js
npm install @teamlearners/clawops ws @google/genai

환경변수

export CLAWOPS_API_KEY="your-api-key"
export CLAWOPS_ACCOUNT_ID="your-account-id"
export GOOGLE_API_KEY="your-google-key"      # Google AI Studio

# 또는 Vertex AI 사용 시:
# export GOOGLE_GENAI_USE_VERTEXAI=true
# export GOOGLE_CLOUD_PROJECT="your-project-id"
# export GOOGLE_CLOUD_LOCATION="us-central1"

Python 코드

from clawops.agent import ClawOpsAgent, GeminiRealtime
import asyncio

agent = ClawOpsAgent(
    from_="07012341234",
    session=GeminiRealtime(
        system_prompt="친절한 고객 상담원입니다. 한국어로 응대합니다.",
        voice="Kore",
        language="ko",
    ),
)

asyncio.run(agent.serve())

Node.js 코드

import { ClawOpsAgent, GeminiRealtime } from '@teamlearners/clawops/agent';

const agent = new ClawOpsAgent({
  from: '07012341234',
  session: new GeminiRealtime({
    systemPrompt: '친절한 고객 상담원입니다. 한국어로 응대합니다.',
    voice: 'Kore',
    language: 'ko',
  }),
});

await agent.serve();

기본 모델은 gemini-3.1-flash-live-preview입니다.

VAD (Voice Activity Detection) 세부 설정

Gemini Live API의 음성 감지를 세밀하게 조정할 수 있습니다:

session = GeminiRealtime(
    system_prompt="상담원입니다.",
    voice="Kore",
    realtime_input_config={
        "automatic_activity_detection": {
            "start_of_speech_sensitivity": "START_SENSITIVITY_HIGH",
            "end_of_speech_sensitivity": "END_SENSITIVITY_HIGH",
            "prefix_padding_ms": 20,
            "silence_duration_ms": 100,
        },
        "activity_handling": "NO_INTERRUPTION",
    },
)

activity_handling"NO_INTERRUPTION"으로 설정하면 고객이 말하는 중에 AI가 끊지 않습니다.

Pipeline 모드: STT + LLM + TTS 자유 조합

Pipeline 모드의 진정한 강점은 각 컴포넌트를 독립적으로 선택할 수 있다는 것입니다.

설치 (조합에 따라)

# Deepgram STT + OpenAI LLM + ElevenLabs TTS
pip install clawops[agent,deepgram,elevenlabs,openai]

# Deepgram STT + Claude LLM + ElevenLabs TTS
pip install clawops[agent,deepgram,elevenlabs,anthropic-llm]

# Deepgram STT + Gemini LLM + ElevenLabs TTS
pip install clawops[agent,deepgram,elevenlabs,gemini]

# 모든 extras 한번에 설치
pip install clawops[agent-all]

환경변수

export CLAWOPS_API_KEY="your-api-key"
export CLAWOPS_ACCOUNT_ID="your-account-id"
export DEEPGRAM_API_KEY="your-deepgram-key"
export ELEVENLABS_API_KEY="your-elevenlabs-key"

# LLM에 따라:
export OPENAI_API_KEY="your-openai-key"         # OpenAILLM
export ANTHROPIC_API_KEY="your-anthropic-key"   # AnthropicLLM
export GOOGLE_API_KEY="your-google-key"         # GeminiLLM
export MISTRAL_API_KEY="your-mistral-key"       # MistralLLM
export GROQ_API_KEY="your-groq-key"             # GroqLLM

기본 Pipeline 예제: Deepgram + OpenAI + ElevenLabs

from clawops.agent import ClawOpsAgent
from clawops.agent.pipeline import PipelineSession, DeepgramSTT, OpenAILLM, ElevenLabsTTS
import asyncio

agent = ClawOpsAgent(
    from_="07012341234",
    session=PipelineSession(
        system_prompt="친절한 고객 상담원입니다.",
        stt=DeepgramSTT(language="ko"),
        llm=OpenAILLM(model="gpt-4o-mini"),
        tts=ElevenLabsTTS(voice_id="EXAVITQu4vr4xnSDxMaL"),
    ),
)

asyncio.run(agent.serve())

Claude로 교체: Deepgram + Anthropic + ElevenLabs

from clawops.agent.pipeline import PipelineSession, DeepgramSTT, AnthropicLLM, ElevenLabsTTS

agent = ClawOpsAgent(
    from_="07012341234",
    session=PipelineSession(
        system_prompt="복잡한 기술 상담을 처리하는 AI입니다.",
        stt=DeepgramSTT(language="ko"),
        llm=AnthropicLLM(model="claude-sonnet-4-20250514"),
        tts=ElevenLabsTTS(voice_id="EXAVITQu4vr4xnSDxMaL"),
    ),
)

Gemini LLM 사용

from clawops.agent.pipeline import PipelineSession, DeepgramSTT, GeminiLLM, ElevenLabsTTS

agent = ClawOpsAgent(
    from_="07012341234",
    session=PipelineSession(
        system_prompt="상담원입니다.",
        stt=DeepgramSTT(language="ko"),
        llm=GeminiLLM(model="gemini-2.5-flash"),
        tts=ElevenLabsTTS(voice_id="EXAVITQu4vr4xnSDxMaL"),
    ),
)

초저지연 Groq LLM

from clawops.agent.pipeline import PipelineSession, DeepgramSTT, GroqLLM, ElevenLabsTTS

agent = ClawOpsAgent(
    from_="07012341234",
    session=PipelineSession(
        system_prompt="상담원입니다.",
        stt=DeepgramSTT(language="ko"),
        llm=GroqLLM(model="llama-3.3-70b-versatile"),
        tts=ElevenLabsTTS(voice_id="EXAVITQu4vr4xnSDxMaL"),
    ),
)

로컬 LLM (Ollama)

from clawops.agent.pipeline import PipelineSession, DeepgramSTT, OllamaLLM, ElevenLabsTTS

agent = ClawOpsAgent(
    from_="07012341234",
    session=PipelineSession(
        system_prompt="상담원입니다.",
        stt=DeepgramSTT(language="ko"),
        llm=OllamaLLM(model="llama3"),  # 로컬에서 실행
        tts=ElevenLabsTTS(voice_id="EXAVITQu4vr4xnSDxMaL"),
    ),
)

지원 Provider 전체 목록

STT (음성→텍스트)

Provider클래스설명
DeepgramDeepgramSTTDeepgram Nova 기반, VAD 지원, 한국어 지원

LLM (텍스트 생성)

Provider클래스특징
OpenAIOpenAILLMGPT-4o, GPT-4o-mini, Tool 호출 지원
AnthropicAnthropicLLMClaude, 높은 추론 능력, Tool 호출 지원
GoogleGeminiLLMGemini, Tool 호출 지원
OllamaOllamaLLM로컬 LLM, Tool 호출 지원
MistralMistralLLMMistral AI, Tool 호출 지원
GroqGroqLLM초저지연, Tool 호출 지원
PerplexityPerplexityLLM웹 검색 기반
TogetherTogetherLLMTogether AI, Tool 호출 지원
FireworksFireworksLLMFireworks AI, Tool 호출 지원
DeepSeekDeepSeekLLMDeepSeek, Tool 호출 지원
xAIXaiLLMGrok, Tool 호출 지원

TTS (텍스트→음성)

Provider클래스설명
ElevenLabsElevenLabsTTSWebSocket 기반 저지연, 자동 오디오 포맷 변환

오디오 변환 파이프라인

Pipeline 모드에서 오디오 포맷은 SDK가 자동으로 변환합니다:

  1. 수신: G.711 μ-law 8kHz → PCM16 → 16kHz 리샘플링 (STT 입력)
  2. 송신: TTS 출력 (24kHz PCM16) → 8kHz 리샘플링 → G.711 μ-law

개발자가 코덱이나 샘플레이트를 직접 다룰 필요가 없습니다.

Barge-In (끼어들기)

Pipeline 모드는 자동 barge-in을 지원합니다. AI가 응답 중일 때 고객이 말하면:

  1. Deepgram VAD의 SpeechStarted 이벤트로 즉시 감지
  2. 현재 재생 중인 AI 오디오를 clear_audio()로 즉시 중단
  3. 진행 중인 LLM/TTS 응답 생성을 취소
  4. 사용자 발화가 확정되면 새 응답 생성

Debounce(0.5초)가 적용되어 짧은 추임새에 의한 불필요한 중단을 방지합니다.

커스텀 Provider 만들기

빌트인 Provider로 충족되지 않으면 직접 만들 수 있습니다.

커스텀 STT

from collections.abc import AsyncIterator
from clawops.agent.pipeline import SpeechEvent

class MySTT:
    async def transcribe(
        self, audio_stream: AsyncIterator[bytes]
    ) -> AsyncIterator[SpeechEvent]:
        # audio_stream: PCM16 signed 16-bit LE, 16kHz, mono
        # SpeechEvent(type="interim", transcript="...") → barge-in 트리거
        # SpeechEvent(type="final", transcript="...")   → 확정된 텍스트
        async for chunk in audio_stream:
            # 음성 인식 로직
            yield SpeechEvent(type="final", transcript="인식된 텍스트")

커스텀 LLM

class MyLLM:
    async def generate(
        self,
        messages: list[dict],
        tools: list[dict] | None = None,
    ) -> AsyncIterator[str]:
        # OpenAI Chat Completions 형식의 messages + tools
        # 텍스트 토큰을 스트리밍으로 yield
        yield "안녕하세요, "
        yield "무엇을 도와드릴까요?"

커스텀 TTS

class MyTTS:
    sample_rate: int = 24000  # 리샘플링을 위한 출력 샘플레이트

    async def synthesize(
        self, text_stream: AsyncIterator[str]
    ) -> AsyncIterator[bytes]:
        # text_stream: 문장 단위로 분할된 텍스트
        # PCM16 오디오 청크를 yield
        async for text in text_stream:
            audio_bytes = await my_tts_engine.synthesize(text)
            yield audio_bytes

커스텀 Provider의 sample_rate 속성을 설정하면 SDK가 자동으로 8kHz로 리샘플링합니다.

사용

agent = ClawOpsAgent(
    from_="07012341234",
    session=PipelineSession(
        system_prompt="상담원입니다.",
        stt=MySTT(),
        llm=MyLLM(),
        tts=MyTTS(),
    ),
)

Pipeline + Tool 등록

Pipeline 모드에서도 Tool 등록은 동일하게 작동합니다:

from clawops.agent import ClawOpsAgent
from clawops.agent.pipeline import PipelineSession, DeepgramSTT, AnthropicLLM, ElevenLabsTTS

agent = ClawOpsAgent(
    from_="07012341234",
    session=PipelineSession(
        system_prompt="쇼핑몰 상담원입니다. 주문 조회를 도와드립니다.",
        stt=DeepgramSTT(language="ko"),
        llm=AnthropicLLM(model="claude-sonnet-4-20250514"),
        tts=ElevenLabsTTS(voice_id="EXAVITQu4vr4xnSDxMaL"),
    ),
)

@agent.tool
async def check_order(order_id: str) -> str:
    """주문 상태를 확인합니다."""
    return f"주문 {order_id}: 배송 중"

asyncio.run(agent.serve())

어떤 조합을 선택해야 하나?

우선순위추천 조합
응답 속도OpenAI Realtime (올인원, 가장 낮은 레이턴시)
추론 정확도Pipeline: Deepgram + AnthropicLLM (Claude) + ElevenLabs
비용 최적화Pipeline: Deepgram + GroqLLM + ElevenLabs
Google 생태계Gemini Realtime 또는 Pipeline: Deepgram + GeminiLLM + ElevenLabs
데이터 주권Pipeline: Deepgram + OllamaLLM (로컬) + ElevenLabs

마무리

ClawOps Voice Agent SDK는 OpenAI 하나에 종속되지 않습니다. Gemini Realtime으로 Google AI를, Pipeline 모드로 Claude·Mistral·Groq·Ollama까지 자유롭게 조합할 수 있습니다. 커스텀 Provider를 만들면 어떤 AI 엔진이든 전화 에이전트로 연결할 수 있습니다.

3일 무료 Trial로 직접 테스트해보세요 → claw-ops.com


관련 글: AI 전화 에이전트 만들기 · AI 전화 에이전트용 LLM 비교 · 한국어 STT·TTS 비교

관련 글 더 보기

ClawOps AI 전화 API로 시작하기

070 번호 발급부터 AI 음성 통화까지, REST API 몇 줄이면 됩니다.