@livekit/agents-plugin-google 1.0.0-next.0
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/LICENSE +201 -0
- package/README.md +89 -0
- package/dist/beta/gemini_tts.cjs +239 -0
- package/dist/beta/gemini_tts.cjs.map +1 -0
- package/dist/beta/gemini_tts.d.cts +47 -0
- package/dist/beta/gemini_tts.d.ts +47 -0
- package/dist/beta/gemini_tts.d.ts.map +1 -0
- package/dist/beta/gemini_tts.js +221 -0
- package/dist/beta/gemini_tts.js.map +1 -0
- package/dist/beta/gemini_tts.test.cjs +9 -0
- package/dist/beta/gemini_tts.test.cjs.map +1 -0
- package/dist/beta/gemini_tts.test.d.cts +2 -0
- package/dist/beta/gemini_tts.test.d.ts +2 -0
- package/dist/beta/gemini_tts.test.d.ts.map +1 -0
- package/dist/beta/gemini_tts.test.js +8 -0
- package/dist/beta/gemini_tts.test.js.map +1 -0
- package/dist/beta/index.cjs +42 -0
- package/dist/beta/index.cjs.map +1 -0
- package/dist/beta/index.d.cts +3 -0
- package/dist/beta/index.d.ts +3 -0
- package/dist/beta/index.d.ts.map +1 -0
- package/dist/beta/index.js +7 -0
- package/dist/beta/index.js.map +1 -0
- package/dist/beta/realtime/api_proto.cjs +17 -0
- package/dist/beta/realtime/api_proto.cjs.map +1 -0
- package/dist/beta/realtime/api_proto.d.cts +26 -0
- package/dist/beta/realtime/api_proto.d.ts +26 -0
- package/dist/beta/realtime/api_proto.d.ts.map +1 -0
- package/dist/beta/realtime/api_proto.js +1 -0
- package/dist/beta/realtime/api_proto.js.map +1 -0
- package/dist/beta/realtime/index.cjs +29 -0
- package/dist/beta/realtime/index.cjs.map +1 -0
- package/dist/beta/realtime/index.d.cts +3 -0
- package/dist/beta/realtime/index.d.ts +3 -0
- package/dist/beta/realtime/index.d.ts.map +1 -0
- package/dist/beta/realtime/index.js +5 -0
- package/dist/beta/realtime/index.js.map +1 -0
- package/dist/beta/realtime/realtime_api.cjs +993 -0
- package/dist/beta/realtime/realtime_api.cjs.map +1 -0
- package/dist/beta/realtime/realtime_api.d.cts +267 -0
- package/dist/beta/realtime/realtime_api.d.ts +267 -0
- package/dist/beta/realtime/realtime_api.d.ts.map +1 -0
- package/dist/beta/realtime/realtime_api.js +974 -0
- package/dist/beta/realtime/realtime_api.js.map +1 -0
- package/dist/index.cjs +58 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/llm.cjs +381 -0
- package/dist/llm.cjs.map +1 -0
- package/dist/llm.d.cts +82 -0
- package/dist/llm.d.ts +82 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +362 -0
- package/dist/llm.js.map +1 -0
- package/dist/llm.test.cjs +8 -0
- package/dist/llm.test.cjs.map +1 -0
- package/dist/llm.test.d.cts +2 -0
- package/dist/llm.test.d.ts +2 -0
- package/dist/llm.test.d.ts.map +1 -0
- package/dist/llm.test.js +7 -0
- package/dist/llm.test.js.map +1 -0
- package/dist/models.cjs +17 -0
- package/dist/models.cjs.map +1 -0
- package/dist/models.d.cts +5 -0
- package/dist/models.d.ts +5 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +1 -0
- package/dist/models.js.map +1 -0
- package/dist/tools.cjs +17 -0
- package/dist/tools.cjs.map +1 -0
- package/dist/tools.d.cts +3 -0
- package/dist/tools.d.ts +3 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1 -0
- package/dist/tools.js.map +1 -0
- package/dist/utils.cjs +137 -0
- package/dist/utils.cjs.map +1 -0
- package/dist/utils.d.cts +14 -0
- package/dist/utils.d.ts +14 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +112 -0
- package/dist/utils.js.map +1 -0
- package/package.json +56 -0
- package/src/beta/gemini_tts.test.ts +11 -0
- package/src/beta/gemini_tts.ts +309 -0
- package/src/beta/index.ts +6 -0
- package/src/beta/realtime/api_proto.ts +41 -0
- package/src/beta/realtime/index.ts +5 -0
- package/src/beta/realtime/realtime_api.ts +1440 -0
- package/src/index.ts +20 -0
- package/src/llm.test.ts +10 -0
- package/src/llm.ts +463 -0
- package/src/models.ts +100 -0
- package/src/tools.ts +6 -0
- package/src/utils.ts +157 -0
package/src/utils.ts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2025 LiveKit, Inc.
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
import type { FunctionDeclaration, Schema } from '@google/genai';
|
|
5
|
+
import { llm } from '@livekit/agents';
|
|
6
|
+
import type { JSONSchema7 } from 'json-schema';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* JSON Schema v7
|
|
10
|
+
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01
|
|
11
|
+
*/
|
|
12
|
+
export type JSONSchema7Definition = JSONSchema7 | boolean;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Converts JSON Schema 7 to OpenAPI Schema 3.0
|
|
16
|
+
*/
|
|
17
|
+
// Adapted from https://github.com/vercel/ai/blob/main/packages/google/src/convert-json-schema-to-openapi-schema.ts
|
|
18
|
+
export function convertJSONSchemaToOpenAPISchema(jsonSchema: JSONSchema7Definition): unknown {
|
|
19
|
+
// parameters need to be undefined if they are empty objects:
|
|
20
|
+
if (jsonSchema == null || isEmptyObjectSchema(jsonSchema)) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (typeof jsonSchema === 'boolean') {
|
|
25
|
+
return { type: 'boolean', properties: {} };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const {
|
|
29
|
+
type,
|
|
30
|
+
description,
|
|
31
|
+
required,
|
|
32
|
+
properties,
|
|
33
|
+
items,
|
|
34
|
+
allOf,
|
|
35
|
+
anyOf,
|
|
36
|
+
oneOf,
|
|
37
|
+
format,
|
|
38
|
+
const: constValue,
|
|
39
|
+
minLength,
|
|
40
|
+
enum: enumValues,
|
|
41
|
+
} = jsonSchema;
|
|
42
|
+
|
|
43
|
+
const result: Record<string, unknown> = {};
|
|
44
|
+
|
|
45
|
+
if (description) result.description = description;
|
|
46
|
+
if (required) result.required = required;
|
|
47
|
+
if (format) result.format = format;
|
|
48
|
+
|
|
49
|
+
if (constValue !== undefined) {
|
|
50
|
+
result.enum = [constValue];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Handle type
|
|
54
|
+
if (type) {
|
|
55
|
+
if (Array.isArray(type)) {
|
|
56
|
+
if (type.includes('null')) {
|
|
57
|
+
result.type = type.filter((t) => t !== 'null')[0];
|
|
58
|
+
result.nullable = true;
|
|
59
|
+
} else {
|
|
60
|
+
result.type = type;
|
|
61
|
+
}
|
|
62
|
+
} else if (type === 'null') {
|
|
63
|
+
result.type = 'null';
|
|
64
|
+
} else {
|
|
65
|
+
result.type = type;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Handle enum
|
|
70
|
+
if (enumValues !== undefined) {
|
|
71
|
+
result.enum = enumValues;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (properties != null) {
|
|
75
|
+
result.properties = Object.entries(properties).reduce(
|
|
76
|
+
(acc, [key, value]) => {
|
|
77
|
+
acc[key] = convertJSONSchemaToOpenAPISchema(value);
|
|
78
|
+
return acc;
|
|
79
|
+
},
|
|
80
|
+
{} as Record<string, unknown>,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (items) {
|
|
85
|
+
result.items = Array.isArray(items)
|
|
86
|
+
? items.map(convertJSONSchemaToOpenAPISchema)
|
|
87
|
+
: convertJSONSchemaToOpenAPISchema(items);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (allOf) {
|
|
91
|
+
result.allOf = allOf.map(convertJSONSchemaToOpenAPISchema);
|
|
92
|
+
}
|
|
93
|
+
if (anyOf) {
|
|
94
|
+
// Handle cases where anyOf includes a null type
|
|
95
|
+
if (anyOf.some((schema) => typeof schema === 'object' && schema?.type === 'null')) {
|
|
96
|
+
const nonNullSchemas = anyOf.filter(
|
|
97
|
+
(schema) => !(typeof schema === 'object' && schema?.type === 'null'),
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
if (nonNullSchemas.length === 1) {
|
|
101
|
+
// If there's only one non-null schema, convert it and make it nullable
|
|
102
|
+
const converted = convertJSONSchemaToOpenAPISchema(
|
|
103
|
+
nonNullSchemas[0] as JSONSchema7Definition,
|
|
104
|
+
);
|
|
105
|
+
if (typeof converted === 'object') {
|
|
106
|
+
result.nullable = true;
|
|
107
|
+
Object.assign(result, converted);
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
// If there are multiple non-null schemas, keep them in anyOf
|
|
111
|
+
result.anyOf = nonNullSchemas.map(convertJSONSchemaToOpenAPISchema);
|
|
112
|
+
result.nullable = true;
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
result.anyOf = anyOf.map(convertJSONSchemaToOpenAPISchema);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (oneOf) {
|
|
119
|
+
result.oneOf = oneOf.map(convertJSONSchemaToOpenAPISchema);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (minLength !== undefined) {
|
|
123
|
+
result.minLength = minLength;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function isEmptyObjectSchema(jsonSchema: JSONSchema7Definition): boolean {
|
|
130
|
+
return (
|
|
131
|
+
jsonSchema != null &&
|
|
132
|
+
typeof jsonSchema === 'object' &&
|
|
133
|
+
jsonSchema.type === 'object' &&
|
|
134
|
+
(jsonSchema.properties == null || Object.keys(jsonSchema.properties).length === 0) &&
|
|
135
|
+
!jsonSchema.additionalProperties
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function toFunctionDeclarations(toolCtx: llm.ToolContext): FunctionDeclaration[] {
|
|
140
|
+
const functionDeclarations: FunctionDeclaration[] = [];
|
|
141
|
+
|
|
142
|
+
for (const [name, tool] of Object.entries(toolCtx)) {
|
|
143
|
+
const { description, parameters } = tool;
|
|
144
|
+
const jsonSchema = llm.toJsonSchema(parameters);
|
|
145
|
+
|
|
146
|
+
// Create a deep copy to prevent the Google GenAI library from mutating the schema
|
|
147
|
+
const schemaCopy = JSON.parse(JSON.stringify(jsonSchema));
|
|
148
|
+
|
|
149
|
+
functionDeclarations.push({
|
|
150
|
+
name,
|
|
151
|
+
description,
|
|
152
|
+
parameters: convertJSONSchemaToOpenAPISchema(schemaCopy) as Schema,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return functionDeclarations;
|
|
157
|
+
}
|