@livekit/agents 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/inference/api_protos.cjs +104 -0
- package/dist/inference/api_protos.cjs.map +1 -0
- package/dist/inference/api_protos.d.cts +222 -0
- package/dist/inference/api_protos.d.ts +222 -0
- package/dist/inference/api_protos.d.ts.map +1 -0
- package/dist/inference/api_protos.js +70 -0
- package/dist/inference/api_protos.js.map +1 -0
- package/dist/inference/index.cjs +56 -0
- package/dist/inference/index.cjs.map +1 -0
- package/dist/inference/index.d.cts +8 -0
- package/dist/inference/index.d.ts +8 -0
- package/dist/inference/index.d.ts.map +1 -0
- package/dist/inference/index.js +23 -0
- package/dist/inference/index.js.map +1 -0
- package/dist/inference/llm.cjs +299 -0
- package/dist/inference/llm.cjs.map +1 -0
- package/dist/inference/llm.d.cts +107 -0
- package/dist/inference/llm.d.ts +107 -0
- package/dist/inference/llm.d.ts.map +1 -0
- package/dist/inference/llm.js +270 -0
- package/dist/inference/llm.js.map +1 -0
- package/dist/inference/stt.cjs +313 -0
- package/dist/inference/stt.cjs.map +1 -0
- package/dist/inference/stt.d.cts +87 -0
- package/dist/inference/stt.d.ts +87 -0
- package/dist/inference/stt.d.ts.map +1 -0
- package/dist/inference/stt.js +292 -0
- package/dist/inference/stt.js.map +1 -0
- package/dist/inference/tts.cjs +324 -0
- package/dist/inference/tts.cjs.map +1 -0
- package/dist/inference/tts.d.cts +77 -0
- package/dist/inference/tts.d.ts +77 -0
- package/dist/inference/tts.d.ts.map +1 -0
- package/dist/inference/tts.js +306 -0
- package/dist/inference/tts.js.map +1 -0
- package/dist/inference/utils.cjs +76 -0
- package/dist/inference/utils.cjs.map +1 -0
- package/dist/inference/utils.d.cts +5 -0
- package/dist/inference/utils.d.ts +5 -0
- package/dist/inference/utils.d.ts.map +1 -0
- package/dist/inference/utils.js +51 -0
- package/dist/inference/utils.js.map +1 -0
- package/dist/llm/remote_chat_context.cjs.map +1 -1
- package/dist/llm/remote_chat_context.d.cts +2 -0
- package/dist/llm/remote_chat_context.d.ts +2 -0
- package/dist/llm/remote_chat_context.d.ts.map +1 -1
- package/dist/llm/remote_chat_context.js.map +1 -1
- package/dist/tts/tts.cjs +1 -1
- package/dist/tts/tts.cjs.map +1 -1
- package/dist/tts/tts.js +1 -1
- package/dist/tts/tts.js.map +1 -1
- package/dist/utils.cjs +11 -0
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +1 -0
- package/dist/utils.d.ts +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +10 -0
- package/dist/utils.js.map +1 -1
- package/dist/voice/agent.cjs +16 -3
- package/dist/voice/agent.cjs.map +1 -1
- package/dist/voice/agent.d.cts +5 -3
- package/dist/voice/agent.d.ts +5 -3
- package/dist/voice/agent.d.ts.map +1 -1
- package/dist/voice/agent.js +20 -3
- package/dist/voice/agent.js.map +1 -1
- package/dist/voice/agent_activity.cjs +4 -2
- package/dist/voice/agent_activity.cjs.map +1 -1
- package/dist/voice/agent_activity.d.ts.map +1 -1
- package/dist/voice/agent_activity.js +4 -2
- package/dist/voice/agent_activity.js.map +1 -1
- package/dist/voice/agent_session.cjs +16 -3
- package/dist/voice/agent_session.cjs.map +1 -1
- package/dist/voice/agent_session.d.cts +4 -3
- package/dist/voice/agent_session.d.ts +4 -3
- package/dist/voice/agent_session.d.ts.map +1 -1
- package/dist/voice/agent_session.js +20 -3
- package/dist/voice/agent_session.js.map +1 -1
- package/dist/voice/events.cjs +2 -0
- package/dist/voice/events.cjs.map +1 -1
- package/dist/voice/events.d.cts +4 -1
- package/dist/voice/events.d.ts +4 -1
- package/dist/voice/events.d.ts.map +1 -1
- package/dist/voice/events.js +2 -0
- package/dist/voice/events.js.map +1 -1
- package/dist/voice/generation.cjs.map +1 -1
- package/dist/voice/generation.d.cts +1 -0
- package/dist/voice/generation.d.ts +1 -0
- package/dist/voice/generation.d.ts.map +1 -1
- package/dist/voice/generation.js.map +1 -1
- package/dist/voice/room_io/_input.cjs +9 -0
- package/dist/voice/room_io/_input.cjs.map +1 -1
- package/dist/voice/room_io/_input.d.ts.map +1 -1
- package/dist/voice/room_io/_input.js +10 -0
- package/dist/voice/room_io/_input.js.map +1 -1
- package/dist/voice/room_io/_output.cjs +1 -1
- package/dist/voice/room_io/_output.cjs.map +1 -1
- package/dist/voice/room_io/_output.d.cts +1 -0
- package/dist/voice/room_io/_output.d.ts +1 -0
- package/dist/voice/room_io/_output.d.ts.map +1 -1
- package/dist/voice/room_io/_output.js +1 -1
- package/dist/voice/room_io/_output.js.map +1 -1
- package/dist/voice/room_io/room_io.cjs +1 -1
- package/dist/voice/room_io/room_io.cjs.map +1 -1
- package/dist/voice/room_io/room_io.d.cts +20 -0
- package/dist/voice/room_io/room_io.d.ts +20 -0
- package/dist/voice/room_io/room_io.d.ts.map +1 -1
- package/dist/voice/room_io/room_io.js +1 -1
- package/dist/voice/room_io/room_io.js.map +1 -1
- package/dist/voice/transcription/synchronizer.cjs +1 -1
- package/dist/voice/transcription/synchronizer.cjs.map +1 -1
- package/dist/voice/transcription/synchronizer.d.cts +1 -0
- package/dist/voice/transcription/synchronizer.d.ts +1 -0
- package/dist/voice/transcription/synchronizer.d.ts.map +1 -1
- package/dist/voice/transcription/synchronizer.js +1 -1
- package/dist/voice/transcription/synchronizer.js.map +1 -1
- package/dist/worker.cjs +3 -3
- package/dist/worker.cjs.map +1 -1
- package/dist/worker.d.cts +3 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +4 -4
- package/dist/worker.js.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +2 -1
- package/src/inference/api_protos.ts +82 -0
- package/src/inference/index.ts +32 -0
- package/src/inference/llm.ts +463 -0
- package/src/inference/stt.ts +444 -0
- package/src/inference/tts.ts +432 -0
- package/src/inference/utils.ts +66 -0
- package/src/llm/remote_chat_context.ts +2 -2
- package/src/tts/tts.ts +1 -1
- package/src/utils.ts +11 -0
- package/src/voice/agent.ts +31 -7
- package/src/voice/agent_activity.ts +2 -0
- package/src/voice/agent_session.ts +30 -6
- package/src/voice/events.ts +6 -0
- package/src/voice/generation.ts +1 -1
- package/src/voice/room_io/_input.ts +12 -1
- package/src/voice/room_io/_output.ts +1 -1
- package/src/voice/room_io/room_io.ts +21 -2
- package/src/voice/transcription/synchronizer.ts +1 -1
- package/src/worker.ts +5 -10
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import * as llm from '../llm/index.js';
|
|
3
|
+
import type { APIConnectOptions } from '../types.js';
|
|
4
|
+
import { type AnyString } from './utils.js';
|
|
5
|
+
export type OpenAIModels = 'openai/gpt-5' | 'openai/gpt-5-mini' | 'openai/gpt-5-nano' | 'openai/gpt-4.1' | 'openai/gpt-4.1-mini' | 'openai/gpt-4.1-nano' | 'openai/gpt-4o' | 'openai/gpt-4o-mini' | 'openai/gpt-oss-120b';
|
|
6
|
+
export type GoogleModels = 'google/gemini-2.0-flash-lite';
|
|
7
|
+
export type QwenModels = 'qwen/qwen3-235b-a22b-instruct';
|
|
8
|
+
export type KimiModels = 'moonshotai/kimi-k2-instruct';
|
|
9
|
+
export type DeepSeekModels = 'deepseek-ai/deepseek-v3';
|
|
10
|
+
type ChatCompletionPredictionContentParam = OpenAI.Chat.Completions.ChatCompletionPredictionContent;
|
|
11
|
+
type WebSearchOptions = OpenAI.Chat.Completions.ChatCompletionCreateParams.WebSearchOptions;
|
|
12
|
+
type ToolChoice = OpenAI.Chat.Completions.ChatCompletionCreateParams['tool_choice'];
|
|
13
|
+
type Verbosity = 'low' | 'medium' | 'high';
|
|
14
|
+
export interface ChatCompletionOptions extends Record<string, unknown> {
|
|
15
|
+
frequency_penalty?: number;
|
|
16
|
+
logit_bias?: Record<string, number>;
|
|
17
|
+
logprobs?: boolean;
|
|
18
|
+
max_completion_tokens?: number;
|
|
19
|
+
max_tokens?: number;
|
|
20
|
+
metadata?: Record<string, string>;
|
|
21
|
+
modalities?: Array<'text' | 'audio'>;
|
|
22
|
+
n?: number;
|
|
23
|
+
parallel_tool_calls?: boolean;
|
|
24
|
+
prediction?: ChatCompletionPredictionContentParam | null;
|
|
25
|
+
presence_penalty?: number;
|
|
26
|
+
prompt_cache_key?: string;
|
|
27
|
+
reasoning_effort?: 'minimal' | 'low' | 'medium' | 'high';
|
|
28
|
+
safety_identifier?: string;
|
|
29
|
+
seed?: number;
|
|
30
|
+
service_tier?: 'auto' | 'default' | 'flex' | 'scale' | 'priority';
|
|
31
|
+
stop?: string | string[];
|
|
32
|
+
store?: boolean;
|
|
33
|
+
temperature?: number;
|
|
34
|
+
top_logprobs?: number;
|
|
35
|
+
top_p?: number;
|
|
36
|
+
user?: string;
|
|
37
|
+
verbosity?: Verbosity;
|
|
38
|
+
web_search_options?: WebSearchOptions;
|
|
39
|
+
tool_choice?: ToolChoice;
|
|
40
|
+
}
|
|
41
|
+
export type LLMModels = OpenAIModels | GoogleModels | QwenModels | KimiModels | DeepSeekModels | AnyString;
|
|
42
|
+
export interface InferenceLLMOptions {
|
|
43
|
+
model: LLMModels;
|
|
44
|
+
provider?: string;
|
|
45
|
+
baseURL: string;
|
|
46
|
+
apiKey: string;
|
|
47
|
+
apiSecret: string;
|
|
48
|
+
modelOptions: ChatCompletionOptions;
|
|
49
|
+
}
|
|
50
|
+
export interface GatewayOptions {
|
|
51
|
+
apiKey: string;
|
|
52
|
+
apiSecret: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Livekit Cloud Inference LLM
|
|
56
|
+
*/
|
|
57
|
+
export declare class LLM extends llm.LLM {
|
|
58
|
+
private client;
|
|
59
|
+
private opts;
|
|
60
|
+
constructor(opts: {
|
|
61
|
+
model: LLMModels;
|
|
62
|
+
provider?: string;
|
|
63
|
+
baseURL?: string;
|
|
64
|
+
apiKey?: string;
|
|
65
|
+
apiSecret?: string;
|
|
66
|
+
modelOptions?: InferenceLLMOptions['modelOptions'];
|
|
67
|
+
});
|
|
68
|
+
label(): string;
|
|
69
|
+
get model(): string;
|
|
70
|
+
static fromModelString(modelString: string): LLM;
|
|
71
|
+
chat({ chatCtx, toolCtx, connOptions, parallelToolCalls, toolChoice, extraKwargs, }: {
|
|
72
|
+
chatCtx: llm.ChatContext;
|
|
73
|
+
toolCtx?: llm.ToolContext;
|
|
74
|
+
connOptions?: APIConnectOptions;
|
|
75
|
+
parallelToolCalls?: boolean;
|
|
76
|
+
toolChoice?: llm.ToolChoice;
|
|
77
|
+
extraKwargs?: Record<string, unknown>;
|
|
78
|
+
}): LLMStream;
|
|
79
|
+
}
|
|
80
|
+
export declare class LLMStream extends llm.LLMStream {
|
|
81
|
+
private model;
|
|
82
|
+
private provider?;
|
|
83
|
+
private providerFmt;
|
|
84
|
+
private client;
|
|
85
|
+
private modelOptions;
|
|
86
|
+
private gatewayOptions?;
|
|
87
|
+
private toolCallId?;
|
|
88
|
+
private toolIndex?;
|
|
89
|
+
private fncName?;
|
|
90
|
+
private fncRawArguments?;
|
|
91
|
+
constructor(llm: LLM, { model, provider, client, chatCtx, toolCtx, gatewayOptions, connOptions, modelOptions, providerFmt, }: {
|
|
92
|
+
model: LLMModels;
|
|
93
|
+
provider?: string;
|
|
94
|
+
client: OpenAI;
|
|
95
|
+
chatCtx: llm.ChatContext;
|
|
96
|
+
toolCtx?: llm.ToolContext;
|
|
97
|
+
gatewayOptions?: GatewayOptions;
|
|
98
|
+
connOptions: APIConnectOptions;
|
|
99
|
+
modelOptions: Record<string, any>;
|
|
100
|
+
providerFmt?: llm.ProviderFormat;
|
|
101
|
+
});
|
|
102
|
+
protected run(): Promise<void>;
|
|
103
|
+
private parseChoice;
|
|
104
|
+
private createRunningToolCallChunk;
|
|
105
|
+
}
|
|
106
|
+
export {};
|
|
107
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/inference/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import OpenAI from "openai";
|
|
2
|
+
import {
|
|
3
|
+
APIConnectionError,
|
|
4
|
+
APIStatusError,
|
|
5
|
+
APITimeoutError,
|
|
6
|
+
DEFAULT_API_CONNECT_OPTIONS,
|
|
7
|
+
toError
|
|
8
|
+
} from "../index.js";
|
|
9
|
+
import * as llm from "../llm/index.js";
|
|
10
|
+
import { createAccessToken } from "./utils.js";
|
|
11
|
+
const DEFAULT_BASE_URL = "https://agent-gateway.livekit.cloud/v1";
|
|
12
|
+
class LLM extends llm.LLM {
|
|
13
|
+
client;
|
|
14
|
+
opts;
|
|
15
|
+
constructor(opts) {
|
|
16
|
+
super();
|
|
17
|
+
const { model, provider, baseURL, apiKey, apiSecret, modelOptions } = opts;
|
|
18
|
+
const lkBaseURL = baseURL || process.env.LIVEKIT_INFERENCE_URL || DEFAULT_BASE_URL;
|
|
19
|
+
const lkApiKey = apiKey || process.env.LIVEKIT_INFERENCE_API_KEY || process.env.LIVEKIT_API_KEY;
|
|
20
|
+
if (!lkApiKey) {
|
|
21
|
+
throw new Error("apiKey is required: pass apiKey or set LIVEKIT_API_KEY");
|
|
22
|
+
}
|
|
23
|
+
const lkApiSecret = apiSecret || process.env.LIVEKIT_INFERENCE_API_SECRET || process.env.LIVEKIT_API_SECRET;
|
|
24
|
+
if (!lkApiSecret) {
|
|
25
|
+
throw new Error("apiSecret is required: pass apiSecret or set LIVEKIT_API_SECRET");
|
|
26
|
+
}
|
|
27
|
+
this.opts = {
|
|
28
|
+
model,
|
|
29
|
+
provider,
|
|
30
|
+
baseURL: lkBaseURL,
|
|
31
|
+
apiKey: lkApiKey,
|
|
32
|
+
apiSecret: lkApiSecret,
|
|
33
|
+
modelOptions: modelOptions || {}
|
|
34
|
+
};
|
|
35
|
+
this.client = new OpenAI({
|
|
36
|
+
baseURL: this.opts.baseURL,
|
|
37
|
+
timeout: 15e3
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
label() {
|
|
41
|
+
return "inference.LLM";
|
|
42
|
+
}
|
|
43
|
+
get model() {
|
|
44
|
+
return this.opts.model;
|
|
45
|
+
}
|
|
46
|
+
static fromModelString(modelString) {
|
|
47
|
+
return new LLM({ model: modelString });
|
|
48
|
+
}
|
|
49
|
+
chat({
|
|
50
|
+
chatCtx,
|
|
51
|
+
toolCtx,
|
|
52
|
+
connOptions = DEFAULT_API_CONNECT_OPTIONS,
|
|
53
|
+
parallelToolCalls,
|
|
54
|
+
toolChoice,
|
|
55
|
+
// TODO(AJS-270): Add response_format parameter support
|
|
56
|
+
extraKwargs
|
|
57
|
+
}) {
|
|
58
|
+
let modelOptions = { ...extraKwargs || {} };
|
|
59
|
+
parallelToolCalls = parallelToolCalls !== void 0 ? parallelToolCalls : this.opts.modelOptions.parallel_tool_calls;
|
|
60
|
+
if (toolCtx && Object.keys(toolCtx).length > 0 && parallelToolCalls !== void 0) {
|
|
61
|
+
modelOptions.parallel_tool_calls = parallelToolCalls;
|
|
62
|
+
}
|
|
63
|
+
toolChoice = toolChoice !== void 0 ? toolChoice : this.opts.modelOptions.tool_choice;
|
|
64
|
+
if (toolChoice) {
|
|
65
|
+
modelOptions.tool_choice = toolChoice;
|
|
66
|
+
}
|
|
67
|
+
modelOptions = { ...modelOptions, ...this.opts.modelOptions };
|
|
68
|
+
return new LLMStream(this, {
|
|
69
|
+
model: this.opts.model,
|
|
70
|
+
provider: this.opts.provider,
|
|
71
|
+
client: this.client,
|
|
72
|
+
chatCtx,
|
|
73
|
+
toolCtx,
|
|
74
|
+
connOptions,
|
|
75
|
+
modelOptions,
|
|
76
|
+
gatewayOptions: {
|
|
77
|
+
apiKey: this.opts.apiKey,
|
|
78
|
+
apiSecret: this.opts.apiSecret
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
class LLMStream extends llm.LLMStream {
|
|
84
|
+
model;
|
|
85
|
+
provider;
|
|
86
|
+
providerFmt;
|
|
87
|
+
client;
|
|
88
|
+
modelOptions;
|
|
89
|
+
gatewayOptions;
|
|
90
|
+
toolCallId;
|
|
91
|
+
toolIndex;
|
|
92
|
+
fncName;
|
|
93
|
+
fncRawArguments;
|
|
94
|
+
constructor(llm2, {
|
|
95
|
+
model,
|
|
96
|
+
provider,
|
|
97
|
+
client,
|
|
98
|
+
chatCtx,
|
|
99
|
+
toolCtx,
|
|
100
|
+
gatewayOptions,
|
|
101
|
+
connOptions,
|
|
102
|
+
modelOptions,
|
|
103
|
+
providerFmt
|
|
104
|
+
}) {
|
|
105
|
+
super(llm2, { chatCtx, toolCtx, connOptions });
|
|
106
|
+
this.client = client;
|
|
107
|
+
this.gatewayOptions = gatewayOptions;
|
|
108
|
+
this.provider = provider;
|
|
109
|
+
this.providerFmt = providerFmt || "openai";
|
|
110
|
+
this.modelOptions = modelOptions;
|
|
111
|
+
this.model = model;
|
|
112
|
+
}
|
|
113
|
+
async run() {
|
|
114
|
+
var _a;
|
|
115
|
+
let retryable = true;
|
|
116
|
+
this.toolCallId = this.fncName = this.fncRawArguments = this.toolIndex = void 0;
|
|
117
|
+
try {
|
|
118
|
+
const messages = await this.chatCtx.toProviderFormat(
|
|
119
|
+
this.providerFmt
|
|
120
|
+
);
|
|
121
|
+
const tools = this.toolCtx ? Object.entries(this.toolCtx).map(([name, func]) => ({
|
|
122
|
+
type: "function",
|
|
123
|
+
function: {
|
|
124
|
+
name,
|
|
125
|
+
description: func.description,
|
|
126
|
+
parameters: llm.toJsonSchema(
|
|
127
|
+
func.parameters
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
})) : void 0;
|
|
131
|
+
const requestOptions = { ...this.modelOptions };
|
|
132
|
+
if (!tools) {
|
|
133
|
+
delete requestOptions.tool_choice;
|
|
134
|
+
}
|
|
135
|
+
if (this.gatewayOptions) {
|
|
136
|
+
this.client.apiKey = await createAccessToken(
|
|
137
|
+
this.gatewayOptions.apiKey,
|
|
138
|
+
this.gatewayOptions.apiSecret
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
if (this.provider) {
|
|
142
|
+
const extraHeaders = requestOptions.extra_headers ? requestOptions.extra_headers : {};
|
|
143
|
+
extraHeaders["X-LiveKit-Inference-Provider"] = this.provider;
|
|
144
|
+
requestOptions.extra_headers = extraHeaders;
|
|
145
|
+
}
|
|
146
|
+
const stream = await this.client.chat.completions.create(
|
|
147
|
+
{
|
|
148
|
+
model: this.model,
|
|
149
|
+
messages,
|
|
150
|
+
tools,
|
|
151
|
+
stream: true,
|
|
152
|
+
stream_options: { include_usage: true },
|
|
153
|
+
...requestOptions
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
timeout: this.connOptions.timeoutMs
|
|
157
|
+
}
|
|
158
|
+
);
|
|
159
|
+
for await (const chunk of stream) {
|
|
160
|
+
for (const choice of chunk.choices) {
|
|
161
|
+
if (this.abortController.signal.aborted) {
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
const chatChunk = this.parseChoice(chunk.id, choice);
|
|
165
|
+
if (chatChunk) {
|
|
166
|
+
retryable = false;
|
|
167
|
+
this.queue.put(chatChunk);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (chunk.usage) {
|
|
171
|
+
const usage = chunk.usage;
|
|
172
|
+
retryable = false;
|
|
173
|
+
this.queue.put({
|
|
174
|
+
id: chunk.id,
|
|
175
|
+
usage: {
|
|
176
|
+
completionTokens: usage.completion_tokens,
|
|
177
|
+
promptTokens: usage.prompt_tokens,
|
|
178
|
+
promptCachedTokens: ((_a = usage.prompt_tokens_details) == null ? void 0 : _a.cached_tokens) || 0,
|
|
179
|
+
totalTokens: usage.total_tokens
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
} catch (error) {
|
|
185
|
+
if (error instanceof OpenAI.APIConnectionTimeoutError) {
|
|
186
|
+
throw new APITimeoutError({ options: { retryable } });
|
|
187
|
+
} else if (error instanceof OpenAI.APIError) {
|
|
188
|
+
throw new APIStatusError({
|
|
189
|
+
message: error.message,
|
|
190
|
+
options: {
|
|
191
|
+
statusCode: error.status,
|
|
192
|
+
body: error.error,
|
|
193
|
+
requestId: error.request_id,
|
|
194
|
+
retryable
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
} else {
|
|
198
|
+
throw new APIConnectionError({
|
|
199
|
+
message: toError(error).message,
|
|
200
|
+
options: { retryable }
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
} finally {
|
|
204
|
+
this.queue.close();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
parseChoice(id, choice) {
|
|
208
|
+
const delta = choice.delta;
|
|
209
|
+
if (delta === void 0) return void 0;
|
|
210
|
+
if (delta.tool_calls) {
|
|
211
|
+
for (const tool of delta.tool_calls) {
|
|
212
|
+
if (!tool.function) {
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
let callChunk;
|
|
216
|
+
if (this.toolCallId && tool.id && tool.index !== this.toolIndex) {
|
|
217
|
+
callChunk = this.createRunningToolCallChunk(id, delta);
|
|
218
|
+
this.toolCallId = this.fncName = this.fncRawArguments = void 0;
|
|
219
|
+
}
|
|
220
|
+
if (tool.function.name) {
|
|
221
|
+
this.toolIndex = tool.index;
|
|
222
|
+
this.toolCallId = tool.id;
|
|
223
|
+
this.fncName = tool.function.name;
|
|
224
|
+
this.fncRawArguments = tool.function.arguments || "";
|
|
225
|
+
} else if (tool.function.arguments) {
|
|
226
|
+
this.fncRawArguments = (this.fncRawArguments || "") + tool.function.arguments;
|
|
227
|
+
}
|
|
228
|
+
if (callChunk) {
|
|
229
|
+
return callChunk;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (choice.finish_reason && ["tool_calls", "stop"].includes(choice.finish_reason) && this.toolCallId !== void 0) {
|
|
234
|
+
const callChunk = this.createRunningToolCallChunk(id, delta);
|
|
235
|
+
this.toolCallId = this.fncName = this.fncRawArguments = void 0;
|
|
236
|
+
return callChunk;
|
|
237
|
+
}
|
|
238
|
+
if (!delta.content) {
|
|
239
|
+
return void 0;
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
id,
|
|
243
|
+
delta: {
|
|
244
|
+
role: "assistant",
|
|
245
|
+
content: delta.content
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
createRunningToolCallChunk(id, delta) {
|
|
250
|
+
return {
|
|
251
|
+
id,
|
|
252
|
+
delta: {
|
|
253
|
+
role: "assistant",
|
|
254
|
+
content: delta.content || void 0,
|
|
255
|
+
toolCalls: [
|
|
256
|
+
llm.FunctionCall.create({
|
|
257
|
+
callId: this.toolCallId || "",
|
|
258
|
+
name: this.fncName || "",
|
|
259
|
+
args: this.fncRawArguments || ""
|
|
260
|
+
})
|
|
261
|
+
]
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
export {
|
|
267
|
+
LLM,
|
|
268
|
+
LLMStream
|
|
269
|
+
};
|
|
270
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/inference/llm.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport OpenAI from 'openai';\nimport {\n APIConnectionError,\n APIStatusError,\n APITimeoutError,\n DEFAULT_API_CONNECT_OPTIONS,\n toError,\n} from '../index.js';\nimport * as llm from '../llm/index.js';\nimport type { APIConnectOptions } from '../types.js';\nimport { type AnyString, createAccessToken } from './utils.js';\n\nconst DEFAULT_BASE_URL = 'https://agent-gateway.livekit.cloud/v1';\n\nexport type OpenAIModels =\n | 'openai/gpt-5'\n | 'openai/gpt-5-mini'\n | 'openai/gpt-5-nano'\n | 'openai/gpt-4.1'\n | 'openai/gpt-4.1-mini'\n | 'openai/gpt-4.1-nano'\n | 'openai/gpt-4o'\n | 'openai/gpt-4o-mini'\n | 'openai/gpt-oss-120b';\n\nexport type GoogleModels = 'google/gemini-2.0-flash-lite';\n\nexport type QwenModels = 'qwen/qwen3-235b-a22b-instruct';\n\nexport type KimiModels = 'moonshotai/kimi-k2-instruct';\n\nexport type DeepSeekModels = 'deepseek-ai/deepseek-v3';\n\ntype ChatCompletionPredictionContentParam = OpenAI.Chat.Completions.ChatCompletionPredictionContent;\ntype WebSearchOptions = OpenAI.Chat.Completions.ChatCompletionCreateParams.WebSearchOptions;\ntype ToolChoice = OpenAI.Chat.Completions.ChatCompletionCreateParams['tool_choice'];\ntype Verbosity = 'low' | 'medium' | 'high';\n\nexport interface ChatCompletionOptions extends Record<string, unknown> {\n frequency_penalty?: number;\n logit_bias?: Record<string, number>;\n logprobs?: boolean;\n max_completion_tokens?: number;\n max_tokens?: number;\n metadata?: Record<string, string>;\n modalities?: Array<'text' | 'audio'>;\n n?: number;\n parallel_tool_calls?: boolean;\n prediction?: ChatCompletionPredictionContentParam | null;\n presence_penalty?: number;\n prompt_cache_key?: string;\n reasoning_effort?: 'minimal' | 'low' | 'medium' | 'high';\n safety_identifier?: string;\n seed?: number;\n service_tier?: 'auto' | 'default' | 'flex' | 'scale' | 'priority';\n stop?: string | string[];\n store?: boolean;\n temperature?: number;\n top_logprobs?: number;\n top_p?: number;\n user?: string;\n verbosity?: Verbosity;\n web_search_options?: WebSearchOptions;\n\n // livekit-typed arguments\n tool_choice?: ToolChoice;\n // TODO(brian): support response format\n // response_format?: OpenAI.Chat.Completions.ChatCompletionCreateParams['response_format']\n}\n\nexport type LLMModels =\n | OpenAIModels\n | GoogleModels\n | QwenModels\n | KimiModels\n | DeepSeekModels\n | AnyString;\n\nexport interface InferenceLLMOptions {\n model: LLMModels;\n provider?: string;\n baseURL: string;\n apiKey: string;\n apiSecret: string;\n modelOptions: ChatCompletionOptions;\n}\n\nexport interface GatewayOptions {\n apiKey: string;\n apiSecret: string;\n}\n\n/**\n * Livekit Cloud Inference LLM\n */\nexport class LLM extends llm.LLM {\n private client: OpenAI;\n private opts: InferenceLLMOptions;\n\n constructor(opts: {\n model: LLMModels;\n provider?: string;\n baseURL?: string;\n apiKey?: string;\n apiSecret?: string;\n modelOptions?: InferenceLLMOptions['modelOptions'];\n }) {\n super();\n\n const { model, provider, baseURL, apiKey, apiSecret, modelOptions } = opts;\n\n const lkBaseURL = baseURL || process.env.LIVEKIT_INFERENCE_URL || DEFAULT_BASE_URL;\n const lkApiKey = apiKey || process.env.LIVEKIT_INFERENCE_API_KEY || process.env.LIVEKIT_API_KEY;\n if (!lkApiKey) {\n throw new Error('apiKey is required: pass apiKey or set LIVEKIT_API_KEY');\n }\n\n const lkApiSecret =\n apiSecret || process.env.LIVEKIT_INFERENCE_API_SECRET || process.env.LIVEKIT_API_SECRET;\n if (!lkApiSecret) {\n throw new Error('apiSecret is required: pass apiSecret or set LIVEKIT_API_SECRET');\n }\n\n this.opts = {\n model,\n provider,\n baseURL: lkBaseURL,\n apiKey: lkApiKey,\n apiSecret: lkApiSecret,\n modelOptions: modelOptions || {},\n };\n\n this.client = new OpenAI({\n baseURL: this.opts.baseURL,\n timeout: 15000,\n });\n }\n\n label(): string {\n return 'inference.LLM';\n }\n\n get model(): string {\n return this.opts.model;\n }\n\n static fromModelString(modelString: string): LLM {\n return new LLM({ model: modelString });\n }\n\n chat({\n chatCtx,\n toolCtx,\n connOptions = DEFAULT_API_CONNECT_OPTIONS,\n parallelToolCalls,\n toolChoice,\n // TODO(AJS-270): Add response_format parameter support\n extraKwargs,\n }: {\n chatCtx: llm.ChatContext;\n toolCtx?: llm.ToolContext;\n connOptions?: APIConnectOptions;\n parallelToolCalls?: boolean;\n toolChoice?: llm.ToolChoice;\n // TODO(AJS-270): Add responseFormat parameter\n extraKwargs?: Record<string, unknown>;\n }): LLMStream {\n let modelOptions: Record<string, unknown> = { ...(extraKwargs || {}) };\n\n parallelToolCalls =\n parallelToolCalls !== undefined\n ? parallelToolCalls\n : this.opts.modelOptions.parallel_tool_calls;\n\n if (toolCtx && Object.keys(toolCtx).length > 0 && parallelToolCalls !== undefined) {\n modelOptions.parallel_tool_calls = parallelToolCalls;\n }\n\n toolChoice = toolChoice !== undefined ? toolChoice : this.opts.modelOptions.tool_choice;\n if (toolChoice) {\n modelOptions.tool_choice = toolChoice;\n }\n\n // TODO(AJS-270): Add response_format support here\n\n modelOptions = { ...modelOptions, ...this.opts.modelOptions };\n\n return new LLMStream(this, {\n model: this.opts.model,\n provider: this.opts.provider,\n client: this.client,\n chatCtx,\n toolCtx,\n connOptions,\n modelOptions,\n gatewayOptions: {\n apiKey: this.opts.apiKey,\n apiSecret: this.opts.apiSecret,\n },\n });\n }\n}\n\nexport class LLMStream extends llm.LLMStream {\n private model: LLMModels;\n private provider?: string;\n private providerFmt: llm.ProviderFormat;\n private client: OpenAI;\n private modelOptions: Record<string, unknown>;\n\n private gatewayOptions?: GatewayOptions;\n private toolCallId?: string;\n private toolIndex?: number;\n private fncName?: string;\n private fncRawArguments?: string;\n\n constructor(\n llm: LLM,\n {\n model,\n provider,\n client,\n chatCtx,\n toolCtx,\n gatewayOptions,\n connOptions,\n modelOptions,\n providerFmt,\n }: {\n model: LLMModels;\n provider?: string;\n client: OpenAI;\n chatCtx: llm.ChatContext;\n toolCtx?: llm.ToolContext;\n gatewayOptions?: GatewayOptions;\n connOptions: APIConnectOptions;\n modelOptions: Record<string, any>;\n providerFmt?: llm.ProviderFormat;\n },\n ) {\n super(llm, { chatCtx, toolCtx, connOptions });\n this.client = client;\n this.gatewayOptions = gatewayOptions;\n this.provider = provider;\n this.providerFmt = providerFmt || 'openai';\n this.modelOptions = modelOptions;\n this.model = model;\n }\n\n protected async run(): Promise<void> {\n // current function call that we're waiting for full completion (args are streamed)\n // (defined inside the run method to make sure the state is reset for each run/attempt)\n let retryable = true;\n this.toolCallId = this.fncName = this.fncRawArguments = this.toolIndex = undefined;\n\n try {\n const messages = (await this.chatCtx.toProviderFormat(\n this.providerFmt,\n )) as OpenAI.ChatCompletionMessageParam[];\n\n const tools = this.toolCtx\n ? Object.entries(this.toolCtx).map(([name, func]) => ({\n type: 'function' as const,\n function: {\n name,\n description: func.description,\n parameters: llm.toJsonSchema(\n func.parameters,\n ) as unknown as OpenAI.Chat.Completions.ChatCompletionTool['function']['parameters'],\n },\n }))\n : undefined;\n\n const requestOptions: Record<string, unknown> = { ...this.modelOptions };\n if (!tools) {\n delete requestOptions.tool_choice;\n }\n\n // Dynamically set the access token for the LiveKit Agent Gateway API\n if (this.gatewayOptions) {\n this.client.apiKey = await createAccessToken(\n this.gatewayOptions.apiKey,\n this.gatewayOptions.apiSecret,\n );\n }\n\n if (this.provider) {\n const extraHeaders = requestOptions.extra_headers\n ? (requestOptions.extra_headers as Record<string, string>)\n : {};\n extraHeaders['X-LiveKit-Inference-Provider'] = this.provider;\n requestOptions.extra_headers = extraHeaders;\n }\n\n const stream = await this.client.chat.completions.create(\n {\n model: this.model,\n messages,\n tools,\n stream: true,\n stream_options: { include_usage: true },\n ...requestOptions,\n },\n {\n timeout: this.connOptions.timeoutMs,\n },\n );\n\n for await (const chunk of stream) {\n for (const choice of chunk.choices) {\n if (this.abortController.signal.aborted) {\n break;\n }\n const chatChunk = this.parseChoice(chunk.id, choice);\n if (chatChunk) {\n retryable = false;\n this.queue.put(chatChunk);\n }\n }\n\n if (chunk.usage) {\n const usage = chunk.usage;\n retryable = false;\n this.queue.put({\n id: chunk.id,\n usage: {\n completionTokens: usage.completion_tokens,\n promptTokens: usage.prompt_tokens,\n promptCachedTokens: usage.prompt_tokens_details?.cached_tokens || 0,\n totalTokens: usage.total_tokens,\n },\n });\n }\n }\n } catch (error) {\n if (error instanceof OpenAI.APIConnectionTimeoutError) {\n throw new APITimeoutError({ options: { retryable } });\n } else if (error instanceof OpenAI.APIError) {\n throw new APIStatusError({\n message: error.message,\n options: {\n statusCode: error.status,\n body: error.error,\n requestId: error.request_id,\n retryable,\n },\n });\n } else {\n throw new APIConnectionError({\n message: toError(error).message,\n options: { retryable },\n });\n }\n } finally {\n this.queue.close();\n }\n }\n\n private parseChoice(\n id: string,\n choice: OpenAI.ChatCompletionChunk.Choice,\n ): llm.ChatChunk | undefined {\n const delta = choice.delta;\n\n // https://github.com/livekit/agents/issues/688\n // the delta can be None when using Azure OpenAI (content filtering)\n if (delta === undefined) return undefined;\n\n if (delta.tool_calls) {\n // check if we have functions to calls\n for (const tool of delta.tool_calls) {\n if (!tool.function) {\n continue; // oai may add other tools in the future\n }\n\n /**\n * The way OpenAI streams tool calls is a bit tricky.\n *\n * For any new tool call, it first emits a delta tool call with id, and function name,\n * the rest of the delta chunks will only stream the remaining arguments string,\n * until a new tool call is started or the tool call is finished.\n * See below for an example.\n *\n * Choice(delta=ChoiceDelta(content=None, function_call=None, refusal=None, role='assistant', tool_calls=None), finish_reason=None, index=0, logprobs=None)\n * [ChoiceDeltaToolCall(index=0, id='call_LaVeHWUHpef9K1sd5UO8TtLg', function=ChoiceDeltaToolCallFunction(arguments='', name='get_weather'), type='function')]\n * [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='{\"location\": \"P', name=None), type=None)]\n * [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='aris}', name=None), type=None)]\n * [ChoiceDeltaToolCall(index=1, id='call_ThU4OmMdQXnnVmpXGOCknXIB', function=ChoiceDeltaToolCallFunction(arguments='', name='get_weather'), type='function')]\n * [ChoiceDeltaToolCall(index=1, id=None, function=ChoiceDeltaToolCallFunction(arguments='{\"location\": \"T', name=None), type=None)]\n * [ChoiceDeltaToolCall(index=1, id=None, function=ChoiceDeltaToolCallFunction(arguments='okyo', name=None), type=None)]\n * Choice(delta=ChoiceDelta(content=None, function_call=None, refusal=None, role=None, tool_calls=None), finish_reason='tool_calls', index=0, logprobs=None)\n */\n let callChunk: llm.ChatChunk | undefined;\n // If we have a previous tool call and this is a new one, emit the previous\n if (this.toolCallId && tool.id && tool.index !== this.toolIndex) {\n callChunk = this.createRunningToolCallChunk(id, delta);\n this.toolCallId = this.fncName = this.fncRawArguments = undefined;\n }\n\n // Start or continue building the current tool call\n if (tool.function.name) {\n this.toolIndex = tool.index;\n this.toolCallId = tool.id;\n this.fncName = tool.function.name;\n this.fncRawArguments = tool.function.arguments || '';\n } else if (tool.function.arguments) {\n this.fncRawArguments = (this.fncRawArguments || '') + tool.function.arguments;\n }\n\n if (callChunk) {\n return callChunk;\n }\n }\n }\n\n // If we're done with tool calls, emit the final one\n if (\n choice.finish_reason &&\n ['tool_calls', 'stop'].includes(choice.finish_reason) &&\n this.toolCallId !== undefined\n ) {\n const callChunk = this.createRunningToolCallChunk(id, delta);\n this.toolCallId = this.fncName = this.fncRawArguments = undefined;\n return callChunk;\n }\n\n // Regular content message\n if (!delta.content) {\n return undefined;\n }\n\n return {\n id,\n delta: {\n role: 'assistant',\n content: delta.content,\n },\n };\n }\n\n private createRunningToolCallChunk(\n id: string,\n delta: OpenAI.Chat.Completions.ChatCompletionChunk.Choice.Delta,\n ): llm.ChatChunk {\n return {\n id,\n delta: {\n role: 'assistant',\n content: delta.content || undefined,\n toolCalls: [\n llm.FunctionCall.create({\n callId: this.toolCallId || '',\n name: this.fncName || '',\n args: this.fncRawArguments || '',\n }),\n ],\n },\n };\n }\n}\n"],"mappings":"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","names":["llm"]}
|