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

ClawOps의 AI 전화 에이전트 예제를 보면 대부분 OpenAI Realtime을 사용합니다. 하지만 현실에서는 "Gemini가 한국어를 더 잘 알아듣는다", "Claude의 추론이 더 정확하다", "비용을 줄이고 싶다" 같은 이유로 다른 AI 엔진을 쓰고 싶은 경우가 많습니다.
ClawOps Voice Agent SDK는 세 가지 세션 타입을 지원합니다:
- OpenAI Realtime — OpenAI Realtime API (검증 완료, 기본)
- Gemini Realtime — Google Gemini Live API
- Pipeline — STT + LLM + TTS를 각각 선택해 조합
이 글에서는 Gemini Realtime과 Pipeline 모드의 설정법, Provider 조합, 커스텀 Provider 구현까지 다룹니다.
세션 타입 비교
| 세션 타입 | 장점 | 단점 | 추천 상황 |
|---|---|---|---|
| OpenAI Realtime | 가장 낮은 레이턴시, 검증 완료 | 비용 높음, OpenAI 종속 | 빠른 응답이 중요한 CS |
| Gemini Realtime | Google 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 | 클래스 | 설명 |
|---|---|---|
| Deepgram | DeepgramSTT | Deepgram Nova 기반, VAD 지원, 한국어 지원 |
LLM (텍스트 생성)
| Provider | 클래스 | 특징 |
|---|---|---|
| OpenAI | OpenAILLM | GPT-4o, GPT-4o-mini, Tool 호출 지원 |
| Anthropic | AnthropicLLM | Claude, 높은 추론 능력, Tool 호출 지원 |
GeminiLLM | Gemini, Tool 호출 지원 | |
| Ollama | OllamaLLM | 로컬 LLM, Tool 호출 지원 |
| Mistral | MistralLLM | Mistral AI, Tool 호출 지원 |
| Groq | GroqLLM | 초저지연, Tool 호출 지원 |
| Perplexity | PerplexityLLM | 웹 검색 기반 |
| Together | TogetherLLM | Together AI, Tool 호출 지원 |
| Fireworks | FireworksLLM | Fireworks AI, Tool 호출 지원 |
| DeepSeek | DeepSeekLLM | DeepSeek, Tool 호출 지원 |
| xAI | XaiLLM | Grok, Tool 호출 지원 |
TTS (텍스트→음성)
| Provider | 클래스 | 설명 |
|---|---|---|
| ElevenLabs | ElevenLabsTTS | WebSocket 기반 저지연, 자동 오디오 포맷 변환 |
오디오 변환 파이프라인
Pipeline 모드에서 오디오 포맷은 SDK가 자동으로 변환합니다:
- 수신: G.711 μ-law 8kHz → PCM16 → 16kHz 리샘플링 (STT 입력)
- 송신: TTS 출력 (24kHz PCM16) → 8kHz 리샘플링 → G.711 μ-law
개발자가 코덱이나 샘플레이트를 직접 다룰 필요가 없습니다.
Barge-In (끼어들기)
Pipeline 모드는 자동 barge-in을 지원합니다. AI가 응답 중일 때 고객이 말하면:
- Deepgram VAD의
SpeechStarted이벤트로 즉시 감지 - 현재 재생 중인 AI 오디오를
clear_audio()로 즉시 중단 - 진행 중인 LLM/TTS 응답 생성을 취소
- 사용자 발화가 확정되면 새 응답 생성
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 Node.js SDK 완전 가이드: TypeScript로 AI 전화 에이전트 만들기
ClawOps Node.js/TypeScript SDK로 AI 음성 에이전트를 구축하는 방법. 설치부터 REST API, AI Agent, Tool 등록, MCP 연동까지 실전 코드 예제와 함께 안내합니다.
가이드통화 녹음 전사 & AI 요약 API: 상담 내용을 자동으로 정리하는 법
ClawOps의 통화 전사(Transcript)와 AI 요약(Summary) API로 상담 통화를 텍스트로 변환하고 핵심 내용을 자동 추출하는 방법. Python/Node.js 코드와 웹훅 연동 가이드.
가이드AI 전화 에이전트 Call Transfer 구현 가이드: AI가 상담원에게 전화를 넘기는 법
ClawOps Voice Agent의 Call Transfer 기능으로 AI가 상담원에게 전화를 전환하는 방법. Blind Transfer, Warm Transfer, 전환 후 AI 복귀까지 Python/Node.js 코드와 함께 설명합니다.
가이드AI 전화 에이전트용 LLM 비교: GPT vs Claude vs Gemini
AI 전화 에이전트에 어떤 LLM을 써야 할까? GPT-4o, Claude, Gemini의 응답 속도, 한국어 품질, 가격, 음성 API 지원을 전화 에이전트 관점에서 비교합니다.
가이드AI 전화 에이전트 프롬프트 엔지니어링: 통화 품질을 결정하는 프롬프트 설계법
AI 전화 에이전트의 프롬프트를 설계하는 실전 가이드. 시스템 프롬프트 구조, 턴 제어, 예외 처리, 페르소나 설정까지 통화 품질을 높이는 핵심 기법을 정리합니다.