@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.
Files changed (99) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +89 -0
  3. package/dist/beta/gemini_tts.cjs +239 -0
  4. package/dist/beta/gemini_tts.cjs.map +1 -0
  5. package/dist/beta/gemini_tts.d.cts +47 -0
  6. package/dist/beta/gemini_tts.d.ts +47 -0
  7. package/dist/beta/gemini_tts.d.ts.map +1 -0
  8. package/dist/beta/gemini_tts.js +221 -0
  9. package/dist/beta/gemini_tts.js.map +1 -0
  10. package/dist/beta/gemini_tts.test.cjs +9 -0
  11. package/dist/beta/gemini_tts.test.cjs.map +1 -0
  12. package/dist/beta/gemini_tts.test.d.cts +2 -0
  13. package/dist/beta/gemini_tts.test.d.ts +2 -0
  14. package/dist/beta/gemini_tts.test.d.ts.map +1 -0
  15. package/dist/beta/gemini_tts.test.js +8 -0
  16. package/dist/beta/gemini_tts.test.js.map +1 -0
  17. package/dist/beta/index.cjs +42 -0
  18. package/dist/beta/index.cjs.map +1 -0
  19. package/dist/beta/index.d.cts +3 -0
  20. package/dist/beta/index.d.ts +3 -0
  21. package/dist/beta/index.d.ts.map +1 -0
  22. package/dist/beta/index.js +7 -0
  23. package/dist/beta/index.js.map +1 -0
  24. package/dist/beta/realtime/api_proto.cjs +17 -0
  25. package/dist/beta/realtime/api_proto.cjs.map +1 -0
  26. package/dist/beta/realtime/api_proto.d.cts +26 -0
  27. package/dist/beta/realtime/api_proto.d.ts +26 -0
  28. package/dist/beta/realtime/api_proto.d.ts.map +1 -0
  29. package/dist/beta/realtime/api_proto.js +1 -0
  30. package/dist/beta/realtime/api_proto.js.map +1 -0
  31. package/dist/beta/realtime/index.cjs +29 -0
  32. package/dist/beta/realtime/index.cjs.map +1 -0
  33. package/dist/beta/realtime/index.d.cts +3 -0
  34. package/dist/beta/realtime/index.d.ts +3 -0
  35. package/dist/beta/realtime/index.d.ts.map +1 -0
  36. package/dist/beta/realtime/index.js +5 -0
  37. package/dist/beta/realtime/index.js.map +1 -0
  38. package/dist/beta/realtime/realtime_api.cjs +993 -0
  39. package/dist/beta/realtime/realtime_api.cjs.map +1 -0
  40. package/dist/beta/realtime/realtime_api.d.cts +267 -0
  41. package/dist/beta/realtime/realtime_api.d.ts +267 -0
  42. package/dist/beta/realtime/realtime_api.d.ts.map +1 -0
  43. package/dist/beta/realtime/realtime_api.js +974 -0
  44. package/dist/beta/realtime/realtime_api.js.map +1 -0
  45. package/dist/index.cjs +58 -0
  46. package/dist/index.cjs.map +1 -0
  47. package/dist/index.d.cts +4 -0
  48. package/dist/index.d.ts +4 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +20 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/llm.cjs +381 -0
  53. package/dist/llm.cjs.map +1 -0
  54. package/dist/llm.d.cts +82 -0
  55. package/dist/llm.d.ts +82 -0
  56. package/dist/llm.d.ts.map +1 -0
  57. package/dist/llm.js +362 -0
  58. package/dist/llm.js.map +1 -0
  59. package/dist/llm.test.cjs +8 -0
  60. package/dist/llm.test.cjs.map +1 -0
  61. package/dist/llm.test.d.cts +2 -0
  62. package/dist/llm.test.d.ts +2 -0
  63. package/dist/llm.test.d.ts.map +1 -0
  64. package/dist/llm.test.js +7 -0
  65. package/dist/llm.test.js.map +1 -0
  66. package/dist/models.cjs +17 -0
  67. package/dist/models.cjs.map +1 -0
  68. package/dist/models.d.cts +5 -0
  69. package/dist/models.d.ts +5 -0
  70. package/dist/models.d.ts.map +1 -0
  71. package/dist/models.js +1 -0
  72. package/dist/models.js.map +1 -0
  73. package/dist/tools.cjs +17 -0
  74. package/dist/tools.cjs.map +1 -0
  75. package/dist/tools.d.cts +3 -0
  76. package/dist/tools.d.ts +3 -0
  77. package/dist/tools.d.ts.map +1 -0
  78. package/dist/tools.js +1 -0
  79. package/dist/tools.js.map +1 -0
  80. package/dist/utils.cjs +137 -0
  81. package/dist/utils.cjs.map +1 -0
  82. package/dist/utils.d.cts +14 -0
  83. package/dist/utils.d.ts +14 -0
  84. package/dist/utils.d.ts.map +1 -0
  85. package/dist/utils.js +112 -0
  86. package/dist/utils.js.map +1 -0
  87. package/package.json +56 -0
  88. package/src/beta/gemini_tts.test.ts +11 -0
  89. package/src/beta/gemini_tts.ts +309 -0
  90. package/src/beta/index.ts +6 -0
  91. package/src/beta/realtime/api_proto.ts +41 -0
  92. package/src/beta/realtime/index.ts +5 -0
  93. package/src/beta/realtime/realtime_api.ts +1440 -0
  94. package/src/index.ts +20 -0
  95. package/src/llm.test.ts +10 -0
  96. package/src/llm.ts +463 -0
  97. package/src/models.ts +100 -0
  98. package/src/tools.ts +6 -0
  99. 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
+ }