Używamy cookies, żeby zwiększyć Twoje doświadczenia na stronie
CodeWorlds
Powrót do kolekcji
Przewodnik13 min czytania

Vapi

Vapi to platforma deweloperska do budowania głosowych agentów AI. Przewodnik po SDK, API, Flow Studio, tool calling, webhookach i integracji z LLM, TTS i STT.

Vapi - kompletny przewodnik po platformie głosowych agentów AI

Czym jest Vapi?

Vapi to platforma deweloperska do budowania, testowania i wdrażania głosowych agentów AI. Zamiast samodzielnie łączyć speech-to-text, modele językowe i text-to-speech, Vapi dostarcza zunifikowany pipeline, który obsługuje cały cykl rozmowy: nasłuchiwanie, myślenie i mówienie.

Platforma obsługuje ponad 300 milionów połączeń, uruchomiła 2.5 miliona asystentów i jest używana przez ponad 500 tysięcy deweloperów - od startupów po firmy z listy Fortune 500. Vapi pozwala zbudować pierwszego głosowego agenta w mniej niż godzinę, a dzięki modułowej architekturze możesz wybrać dowolnego dostawcę LLM, TTS i STT.

Dlaczego Vapi?

Kluczowe zalety Vapi

  1. Ultra-niska latencja - Poniżej 500ms czas odpowiedzi głos-do-głosu, co sprawia, że rozmowy brzmią naturalnie
  2. BYO Keys - Przynieś własne klucze API do dowolnych dostawców (OpenAI, Anthropic, ElevenLabs, Deepgram i więcej)
  3. Flow Studio - Wizualny builder do projektowania logiki konwersacji drag-and-drop
  4. Tool calling - Agenci mogą wywoływać twoje API w trakcie rozmowy (rezerwacje, CRM, bazy danych)
  5. Multilingual - Ponad 100 języków i akcentów
  6. Skalowalność - Obsługa milionów jednoczesnych połączeń
  7. SDK na każdą platformę - Web, iOS, Android, Python, backend

Vapi vs Retell AI vs Bland AI

CechaVapiRetell AIBland AI
Latencja~700ms~600ms~800ms
Koszt bazowy$0.05/min (+ dostawcy)~$0.07/min (all-in)~$0.09/min
Realny koszt$0.13-$0.31/min~$0.07-$0.15/min~$0.09-$0.20/min
Modele BYOPełne wsparcieOgraniczonePełne wsparcie
Visual builderFlow StudioTakPathways builder
Open sourceNieNieNie
HIPAA$1,000/mies. add-onW cenieW cenie
SDKWeb, iOS, Android, PythonWeb, PythonREST API
Jednoczesne połączenia1M+Nielimitowane20,000+/h
Najlepsze doCustom builds, dev-heavyInbound support, healthcareHigh-volume outbound

Architektura - jak działa Vapi?

Vapi działa jako warstwa orkiestracji między twoją aplikacją a dostawcami AI. Cały cykl rozmowy opiera się na trzech krokach:

1. Listen (nasłuchiwanie)

Speech-to-text (STT) zamienia głos rozmówcy na tekst. Vapi obsługuje dostawców takich jak Deepgram, Whisper (OpenAI), Gladia i Azure Speech.

2. Think (myślenie)

LLM przetwarza transkrypcję i generuje odpowiedź. Możesz użyć GPT-4o, Claude, Gemini, Llama lub dowolnego innego modelu. W tym kroku agent może też wywoływać narzędzia (tool calling).

3. Speak (mówienie)

Text-to-speech (TTS) zamienia odpowiedź na głos. Obsługiwani dostawcy to ElevenLabs, Play.ht, Azure TTS, LMNT i inni.

Zaawansowane funkcje konwersacji

  • Endpointing - Wykrywa, kiedy rozmówca skończył mówić
  • Interrupt detection - Pozwala rozmówcy przerwać agentowi w trakcie mówienia
  • Backchanneling - Wstawia krótkie potwierdzenia ("tak", "rozumiem") podczas przetwarzania
  • Emotion detection - Identyfikuje sygnały tonu takie jak pilność czy frustracja

Pierwsze kroki

Instalacja SDK

Code
Bash
npm install @vapi-ai/web

npm install @vapi-ai/server-sdk

pip install vapi_server_sdk

Instalacja CLI

Code
Bash
curl -sSL https://vapi.ai/install.sh | bash

CLI automatycznie wykrywa twój stack technologiczny (React, Vue, Next.js, Python, Go, Flutter, React Native) i generuje przykłady kodu dopasowane do projektu.

Tworzenie asystenta

Code
TypeScript
import Vapi from "@vapi-ai/web";

const vapi = new Vapi("YOUR_PUBLIC_API_KEY");

const assistant = await vapi.assistants.create({
  name: "Customer Support Agent",
  firstMessage: "Hello! How can I help you today?",
  model: {
    provider: "openai",
    model: "gpt-4o",
    temperature: 0.7,
    messages: [
      {
        role: "system",
        content:
          "You are a friendly customer support agent. Help users with their orders and account questions.",
      },
    ],
  },
  voice: {
    provider: "11labs",
    voiceId: "21m00Tcm4TlvDq8ikWAM",
  },
});
Code
Python
from vapi import Vapi
import os

vapi = Vapi(token=os.getenv("VAPI_API_KEY"))

assistant = vapi.assistants.create(
    name="Customer Support Agent",
    first_message="Hello! How can I help you today?",
    model={
        "provider": "openai",
        "model": "gpt-4o",
        "temperature": 0.7,
        "messages": [
            {
                "role": "system",
                "content": "You are a friendly customer support agent. Help users with their orders and account questions.",
            }
        ],
    },
    voice={
        "provider": "11labs",
        "voiceId": "21m00Tcm4TlvDq8ikWAM",
    },
)

Rozpoczęcie rozmowy (Web)

Code
TypeScript
import Vapi from "@vapi-ai/web";

const vapi = new Vapi("YOUR_PUBLIC_API_KEY");

vapi.start("YOUR_ASSISTANT_ID");

vapi.on("call-start", () => {
  console.log("Call connected");
});

vapi.on("call-end", () => {
  console.log("Call ended");
});

vapi.on("message", (message) => {
  if (message.type === "transcript") {
    console.log(`${message.role}: ${message.transcript}`);
  }
});

vapi.on("error", (error) => {
  console.error("Call error:", error);
});

Rozpoczęcie rozmowy telefonicznej (Server)

Code
Python
from vapi import Vapi
import os

vapi = Vapi(token=os.getenv("VAPI_API_KEY"))

call = vapi.calls.create(
    phone_number_id="YOUR_PHONE_NUMBER_ID",
    customer={"number": "+1234567890"},
    assistant_id="YOUR_ASSISTANT_ID",
)

print(f"Call started: {call.id}")

Tool calling - wywoływanie narzędzi

Tool calling to jedna z najpotężniejszych funkcji Vapi. Pozwala agentowi wywoływać twoje API w trakcie rozmowy - sprawdzać status zamówienia, rezerwować wizytę, aktualizować CRM, czy pobierać dane z bazy.

Tworzenie narzędzia przez API

Code
Bash
curl -X POST 'https://api.vapi.ai/tool' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -d '{
    "type": "function",
    "function": {
      "name": "get_order_status",
      "description": "Check the current status of a customer order",
      "parameters": {
        "type": "object",
        "properties": {
          "order_id": {
            "type": "string",
            "description": "The unique order identifier"
          }
        },
        "required": ["order_id"]
      }
    },
    "server": {
      "url": "https://your-api.com/webhook/vapi"
    }
  }'

Dodawanie narzędzia do asystenta

Code
Bash
curl -X PATCH 'https://api.vapi.ai/assistant/ASSISTANT_ID' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": {
      "provider": "openai",
      "model": "gpt-4o",
      "toolIds": ["your-tool-id"]
    }
  }'

Zarządzanie narzędziami przez CLI

Code
Bash
vapi tool list

vapi tool get <tool-id>

vapi tool create

vapi tool test <tool-id>

vapi tool delete <tool-id>

Obsługa tool calla na serwerze

Kiedy agent wywołuje narzędzie, Vapi wysyła request do twojego serwera:

Code
JSON
{
  "message": {
    "type": "tool-calls",
    "toolCallList": [
      {
        "id": "toolu_01DTPAzUm5Gk3zxrpJ969oMF",
        "name": "get_order_status",
        "arguments": {
          "order_id": "ORD-12345"
        }
      }
    ]
  }
}

Twój serwer musi zwrócić wynik z odpowiednim toolCallId:

Code
JSON
{
  "results": [
    {
      "toolCallId": "toolu_01DTPAzUm5Gk3zxrpJ969oMF",
      "result": "Order ORD-12345 is currently being shipped. Expected delivery: tomorrow."
    }
  ]
}

Implementacja webhooków

Code
TypeScript
import express from "express";

const app = express();
app.use(express.json());

app.post("/webhook/vapi", async (req, res) => {
  const { message } = req.body;

  if (message.type === "tool-calls") {
    const results = await Promise.all(
      message.toolCallList.map(async (toolCall) => {
        if (toolCall.name === "get_order_status") {
          const order = await db.orders.findById(
            toolCall.arguments.order_id
          );
          return {
            toolCallId: toolCall.id,
            result: `Order ${order.id}: ${order.status}. ${order.trackingInfo}`,
          };
        }

        if (toolCall.name === "book_appointment") {
          const booking = await calendar.createEvent(
            toolCall.arguments
          );
          return {
            toolCallId: toolCall.id,
            result: `Appointment booked for ${booking.date} at ${booking.time}.`,
          };
        }

        return {
          toolCallId: toolCall.id,
          result: "Unknown tool",
        };
      })
    );

    return res.json({ results });
  }

  res.json({ received: true });
});

app.listen(3000);
Code
Python
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/webhook/vapi", methods=["POST"])
def handle_webhook():
    message = request.json.get("message", {})

    if message.get("type") == "tool-calls":
        results = []
        for tool_call in message.get("toolCallList", []):
            if tool_call["name"] == "get_order_status":
                order = db.orders.find_by_id(tool_call["arguments"]["order_id"])
                results.append({
                    "toolCallId": tool_call["id"],
                    "result": f"Order {order.id}: {order.status}. {order.tracking_info}",
                })

            elif tool_call["name"] == "book_appointment":
                booking = calendar.create_event(tool_call["arguments"])
                results.append({
                    "toolCallId": tool_call["id"],
                    "result": f"Appointment booked for {booking.date} at {booking.time}.",
                })

        return jsonify({"results": results})

    return jsonify({"received": True})

if __name__ == "__main__":
    app.run(port=3000)

Flow Studio - wizualny builder

Flow Studio to wizualny builder do projektowania logiki konwersacji bez pisania kodu. Umożliwia tworzenie złożonych scenariuszy rozmów za pomocą drag-and-drop.

Możliwości Flow Studio

  • Branching prompts - Różne ścieżki rozmowy w zależności od odpowiedzi
  • Conditional paths - Warunki logiczne (jeśli klient VIP → przekieruj do specjalisty)
  • Error fallback - Automatyczne obsługiwanie błędów i nieoczekiwanych odpowiedzi
  • Webhook triggers - Wywołanie zewnętrznych API w dowolnym momencie rozmowy
  • Transfer calls - Przekierowanie do żywego agenta z zachowaniem kontekstu

Squads - orkiestracja wielu asystentów

Squads pozwalają na koordynację wielu asystentów w jednej rozmowie. Każdy asystent ma swoją specjalizację, a transfery między nimi zachowują pełen kontekst rozmowy.

Przykładowy scenariusz:

  1. Recepcjonista - Wita klienta i identyfikuje potrzebę
  2. Specjalista techniczny - Rozwiązuje problemy techniczne
  3. Dział sprzedaży - Przedstawia ofertę i finalizuje zamówienie

Każdy transfer jest płynny - kolejny asystent wie, o czym była dotychczasowa rozmowa.

Dostawcy i integracje

LLM (modele językowe)

DostawcaModele
OpenAIGPT-4o, GPT-4o-mini, o1
AnthropicClaude Sonnet, Claude Haiku
GoogleGemini 1.5 Pro, Gemini Flash
MetaLlama 3.1 (przez Groq/Together)
CustomDowolny model przez Custom LLM URL

TTS (text-to-speech)

DostawcaOpis
ElevenLabsNajbardziej realistyczne głosy, klonowanie głosu
Play.htSzeroki wybór głosów, konkurencyjna cena
Azure TTSEnterprise-grade, wiele języków
LMNTSzybki, niski koszt
DeepgramUltraszybki TTS

STT (speech-to-text)

DostawcaOpis
DeepgramNajszybszy, najlepsza latencja
Whisper (OpenAI)Najdokładniejszy, więcej języków
GladiaDobry balans szybkości i jakości
Azure SpeechEnterprise, HIPAA-ready

Telephony

DostawcaOpis
TwilioNajpopularniejszy, globalny zasięg
TelnyxKonkurencyjna cena, dobra jakość
BYOCBring Your Own Carrier - podłącz swojego dostawcę

Vapi Evals - testowanie agentów

Vapi Evals to framework do testowania głosowych agentów przed wdrożeniem na produkcję. Pozwala tworzyć symulowane rozmowy i walidować zachowanie agenta.

Trzy metody walidacji

  1. Exact match - Dokładne dopasowanie dla deterministycznych odpowiedzi
  2. Regex patterns - Elastyczne wzorce dla zmiennych formatów
  3. AI judges - Semantyczna ewaluacja przez AI dla złożonych odpowiedzi

Testowanie przez CLI

Code
Bash
vapi listen --forward-to localhost:3000/tools/webhook

Ta komenda uruchamia lokalny serwer, który odbiera eventy webhookowe z Vapi i przekazuje je do twojego serwera deweloperskiego w czasie rzeczywistym.

MCP (Model Context Protocol)

Vapi obsługuje MCP, co pozwala asystentowi dynamicznie korzystać z narzędzi udostępnianych przez serwery MCP podczas rozmowy. Zamiast definiować narzędzia statycznie, agent może odkrywać i wywoływać narzędzia w runtime.

Cennik

Koszt bazowy

ElementKoszt
Platforma Vapi$0.05/min
STT (Deepgram)~$0.01/min
LLM (GPT-4o)~$0.02-$0.20/min
TTS (ElevenLabs)~$0.04/min
Telephony (Twilio)~$0.01/min
Łącznie~$0.13-$0.31/min

Darmowe kredyty

Nowi użytkownicy otrzymują $10 darmowych kredytów. Przy realnym koszcie $0.13-$0.31/min to około 30-75 minut rozmów.

SIP Lines

Każdy plan zawiera 10 jednoczesnych linii SIP. Dodatkowe linie kosztują $10/miesiąc za każdą.

HIPAA Compliance

Zgodność z HIPAA jest dostępna jako add-on za $1,000/miesiąc.

Porównanie kosztów

PlatformaRealny koszt/minDarmowe kredytyHIPAA
Vapi$0.13-$0.31$10$1,000/mies.
Retell AI$0.07-$0.15TakW cenie
Bland AI$0.09-$0.20TakW cenie

Praktyczne zastosowania

Customer support bot

Code
TypeScript
const assistant = await vapi.assistants.create({
  name: "Support Agent",
  firstMessage: "Hi! Welcome to Acme Support. How can I help you?",
  model: {
    provider: "openai",
    model: "gpt-4o",
    messages: [
      {
        role: "system",
        content: `You are a customer support agent for Acme Corp.
You can check order status, process returns, and answer product questions.
Always be friendly and professional. If you cannot resolve an issue,
offer to transfer to a human agent.`,
      },
    ],
    toolIds: ["order-status-tool", "return-tool", "transfer-tool"],
  },
  voice: {
    provider: "11labs",
    voiceId: "21m00Tcm4TlvDq8ikWAM",
  },
});

Appointment scheduler

Code
TypeScript
const assistant = await vapi.assistants.create({
  name: "Booking Agent",
  firstMessage: "Hello! I can help you schedule an appointment. What day works best for you?",
  model: {
    provider: "openai",
    model: "gpt-4o",
    messages: [
      {
        role: "system",
        content: `You are an appointment scheduling assistant for a dental clinic.
Collect: patient name, preferred date/time, reason for visit.
Check availability using the check_slots tool before confirming.
Always confirm the final booking details before saving.`,
      },
    ],
    toolIds: ["check-slots-tool", "book-appointment-tool"],
  },
  voice: {
    provider: "11labs",
    voiceId: "pNInz6obpgDQGcFmaJgB",
  },
});

Lead qualification

Code
TypeScript
const assistant = await vapi.assistants.create({
  name: "Sales Qualifier",
  firstMessage:
    "Hi! Thanks for your interest in our product. I'd love to learn more about your needs.",
  model: {
    provider: "anthropic",
    model: "claude-sonnet-4-5-20250514",
    messages: [
      {
        role: "system",
        content: `You are a sales qualification agent.
Ask about: company size, current solution, budget range, timeline.
Score the lead as hot/warm/cold based on responses.
Save qualification data using the save_lead tool.
If the lead is hot, offer to schedule a demo with a sales rep.`,
      },
    ],
    toolIds: ["save-lead-tool", "schedule-demo-tool"],
  },
  voice: {
    provider: "playht",
    voiceId: "jennifer",
  },
});

Integracja z React

Code
TypeScript
import { useState } from "react";
import Vapi from "@vapi-ai/web";

const vapi = new Vapi("YOUR_PUBLIC_API_KEY");

export function VoiceAssistant() {
  const [isActive, setIsActive] = useState(false);
  const [transcript, setTranscript] = useState<string[]>([]);

  const startCall = async () => {
    setIsActive(true);
    await vapi.start("YOUR_ASSISTANT_ID");
  };

  const endCall = () => {
    vapi.stop();
    setIsActive(false);
  };

  vapi.on("message", (message) => {
    if (message.type === "transcript" && message.transcriptType === "final") {
      setTranscript((prev) => [
        ...prev,
        `${message.role}: ${message.transcript}`,
      ]);
    }
  });

  return (
    <div className="flex flex-col items-center gap-4 p-6">
      <button
        onClick={isActive ? endCall : startCall}
        className={`px-6 py-3 rounded-full font-medium ${
          isActive
            ? "bg-red-500 hover:bg-red-600 text-white"
            : "bg-blue-500 hover:bg-blue-600 text-white"
        }`}
      >
        {isActive ? "End Call" : "Start Call"}
      </button>
      <div className="w-full max-w-md space-y-2">
        {transcript.map((line, i) => (
          <p key={i} className="text-sm text-gray-700 dark:text-gray-300">
            {line}
          </p>
        ))}
      </div>
    </div>
  );
}

Ograniczenia i wyzwania

  1. Złożony cennik - Wielowarstwowa struktura kosztów (platforma + STT + LLM + TTS + telephony) utrudnia budżetowanie
  2. Developer-first - Wymaga umiejętności programistycznych, nie nadaje się dla zespołów bez developerów
  3. Zarządzanie dostawcami - Musisz zarządzać 4-5 oddzielnymi dostawcami z osobnymi rozliczeniami
  4. HIPAA drogi - $1,000/miesiąc za zgodność z HIPAA, podczas gdy konkurencja oferuje to w cenie
  5. Vendor lock-in - Mimo BYO keys, logika orkiestracji jest powiązana z platformą Vapi
  6. Latencja zmienna - ~700ms średnio, ale może rosnąć w zależności od wybranych dostawców

FAQ

Czy mogę użyć własnych modeli AI?

Tak, Vapi obsługuje BYO (Bring Your Own) keys dla wszystkich komponentów pipeline'u. Możesz użyć dowolnego LLM, TTS i STT. Jeśli twój model jest hostowany u wspieranego dostawcy, wystarczy podać klucz API. Dla custom modeli hostowanych gdzie indziej, użyj Custom LLM URL.

Ile kosztuje minuta rozmowy?

Bazowa opłata Vapi to $0.05/min, ale realny koszt to $0.13-$0.31/min po dodaniu kosztów STT, LLM, TTS i telefonii. Dokładna kwota zależy od wybranych dostawców.

Czy Vapi obsługuje polski?

Tak, Vapi obsługuje ponad 100 języków, w tym polski. Jakość zależy od wybranych dostawców STT i TTS - Whisper (OpenAI) i ElevenLabs oferują dobre wsparcie dla polskiego.

Jak szybko mogę zbudować pierwszego agenta?

Rejestracja zajmuje około 10 minut. Konfiguracja pierwszego agenta kolejne 20-30 minut. W ciągu godziny możesz mieć działającego agenta głosowego, który odbiera telefony i prowadzi naturalne rozmowy.

Czy Vapi jest open source?

Nie, Vapi jest platformą zamkniętą. SDK klienckie (Web, Python) są dostępne na GitHubie, ale sam silnik orkiestracji jest proprietary. Jeśli szukasz open-source alternatywy, sprawdź Vocode.

Kiedy wybrać Vapi zamiast Retell AI lub Bland AI?

Wybierz Vapi, gdy potrzebujesz maksymalnej kontroli nad pipeline'em głosowym, chcesz używać custom modeli, budujesz produkt deweloperski lub potrzebujesz Flow Studio do wizualnego projektowania konwersacji. Retell jest lepszy dla prostszych wdrożeń i healthcare, a Bland dla kampanii outbound na dużą skalę.

Podsumowanie

Vapi to najpotężniejsza platforma do budowania głosowych agentów AI, jeśli masz zespół deweloperski i potrzebujesz pełnej kontroli nad każdym elementem pipeline'u. Modułowa architektura BYO keys, Flow Studio, tool calling i wsparcie dla 100+ języków sprawiają, że możesz zbudować dokładnie takiego agenta, jakiego potrzebujesz.

Główne kompromisy to złożony cennik (realnie $0.13-$0.31/min vs prostsze modele konkurencji) i wymóg umiejętności technicznych. Dla zespołów z developerami budujących zaawansowane rozwiązania głosowe - Vapi jest standardem branżowym.