pipedog is an unofficial community port of Pipecat, not affiliated with Daily.
pipedog
LLM

Sarvam AI

SarvamLLMService streams chat completions from Sarvam AI through its OpenAI-compatible API.

Overview

Sarvam AI's models for Indian languages, over an OpenAI-compatible API (sarvam-105b, plus a few hosted open models).

  • SarvamLLMService: an OpenAILLMService subclass with Sarvam AI's base URL and default model.

Installation

bun add @pipedog/sarvam

It depends on @pipedog/openai, which is installed with it.

import { SarvamLLMService } from "@pipedog/sarvam/llm";

Prerequisites

  • A Sarvam account and an API key from the Sarvam dashboard.
  • Pass the key as apiKey. It is required, and the service never falls back to OPENAI_API_KEY. The examples read it from SARVAM_API_KEY.

SarvamLLMService

Configuration

Prop

Type

The other options (organization, project, defaultHeaders, serviceTier, retryOnTimeout, retryTimeoutSecs, function calling) are OpenAILLMService's. See OpenAI.

Base URLhttps://api.sarvam.ai/v2
Default modelsarvam-105b
Models to trysarvam-105b, sarvam-105b-conversations, gemma4, glm5.3, deepseekv4.1-flash. See the provider's catalog for the rest.

Settings

Runtime-updatable settings, passed as settings: new SarvamLLMService.Settings({...}) (SarvamLLMSettings). They are OpenAI's settings, with these defaults:

SettingTypeDefaultDescription
modelstring"sarvam-105b"Model name.
wikiGroundingboolean | nullnullSent as wiki_grounding when set. Only sarvam-105b and gemma4 support it.
reasoningEffort"low" | "medium" | "high" | nullnullSent as reasoning_effort when set, on the models that reason.

Every other setting keeps OpenAI's default. Unset sampling settings are left out of the request, so the provider's own defaults apply. extra carries provider-specific request fields.

Usage

llm.ts
import { LLMUpdateSettingsFrame } from "@pipedog/core/frames/frames";
import { SarvamLLMService } from "@pipedog/sarvam/llm";

const llm = new SarvamLLMService({
  apiKey: process.env.SARVAM_API_KEY ?? "",
  settings: new SarvamLLMService.Settings({
    model: "sarvam-105b",
    systemInstruction: "You are a helpful assistant in a voice conversation.",
  }),
});

Ground answers in Wikipedia and set the reasoning effort:

const grounded = new SarvamLLMService({
  apiKey: process.env.SARVAM_API_KEY ?? "",
  settings: new SarvamLLMService.Settings({
    model: "sarvam-105b",
    wikiGrounding: true,
    reasoningEffort: "low",
  }),
});

Change settings mid-call with an LLMUpdateSettingsFrame. The next completion uses them:

// Queue it on the worker, or push it from a processor upstream of the service.
const update = new LLMUpdateSettingsFrame({
  delta: new SarvamLLMService.Settings({ temperature: 0.2 }),
});

Notes

  • Runs a completion for each LLMContextFrame, between an LLMFullResponseStartFrame and an LLMFullResponseEndFrame, and streams the reply as LLMTextFrames, as OpenAILLMService does. Function calls, token usage metrics and runInference work the same way.
  • "developer" messages are sent as "user" messages, since the API doesn't support that role (supportsDeveloperRole is false).
  • Only deepseekv4.1-flash, gemma4, glm5.3, sarvam-105b and sarvam-105b-conversations are accepted as the model. Any other raises when the service is constructed.
  • When you don't pass baseUrl, it is chosen from the model: /v1 for sarvam-105b-conversations and /v2 for the rest.
  • A context that a model can't serve (an image for a model without vision, say) fails with a non-fatal ErrorFrame, not an exception, so an LLMSwitcher can fall back to another service.
  • The same package has Sarvam's speech-to-text and text-to-speech services.

Runtime notes

RuntimeWorksWhat it needs
Bun✅ yesNothing.
Node.js✅ yesNothing.
Deno✅ yesNothing.
Cloudflare Workers✅ yesNothing.

Generated from pipecat.runtimes and pipecat.compat in packages/sarvam/package.json: ✅ means the compat smoke test passes on that runtime.

  • The client is the official openai JS SDK (through @pipedog/openai), which talks through fetch. It works on Bun, Node, Deno and Cloudflare Workers.
  • The deprecated model constructor option is not ported. Use settings.
  • Tested against a local OpenAI-compatible mock server, not against Sarvam AI itself.

pipedog is an unofficial community TypeScript port of Pipecat. It is not affiliated with or endorsed by Daily or the Pipecat project.

Portions adapted from the Pipecat documentation, Copyright (c) 2024–2025 Daily, BSD-2-Clause (see apps/docs/LICENSE-pipecat-docs).

On this page