nexus-ai-pro 2.20.2 → 2.22.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/API_STABILITY.md +93 -0
- package/CHANGELOG.md +208 -1
- package/README.md +11 -6
- package/SECURITY.md +16 -2
- package/dist/adapter-kit/gather.d.ts +76 -0
- package/dist/adapter-kit/gather.js +147 -0
- package/dist/adapter-kit/index.d.ts +1 -0
- package/dist/adapter-kit/index.js +1 -0
- package/dist/adapter-kit/record.d.ts +3 -1
- package/dist/adapter-kit/record.js +20 -5
- package/dist/agent/openapi.d.ts +94 -8
- package/dist/agent/openapi.js +528 -32
- package/dist/cli/adapters.d.ts +4 -3
- package/dist/cli/adapters.js +71 -2
- package/dist/cli/doctor.js +3 -0
- package/dist/cli.js +3 -1
- package/dist/core/config-builder.d.ts +1 -0
- package/dist/core/config-builder.js +1 -0
- package/dist/core/defaults.d.ts +34 -0
- package/dist/core/defaults.js +39 -0
- package/dist/core/secure-stream.js +4 -1
- package/dist/decisions/completion.d.ts +10 -7
- package/dist/decisions/completion.js +82 -8
- package/dist/decisions/core.d.ts +88 -43
- package/dist/decisions/core.js +115 -28
- package/dist/decisions/errors.d.ts +25 -0
- package/dist/decisions/errors.js +12 -0
- package/dist/decisions/index.d.ts +6 -5
- package/dist/decisions/index.js +2 -1
- package/dist/decisions/integrations.d.ts +14 -5
- package/dist/decisions/integrations.js +16 -1
- package/dist/decisions/mock.d.ts +5 -3
- package/dist/decisions/mock.js +4 -1
- package/dist/decisions/pictures.d.ts +43 -0
- package/dist/decisions/pictures.js +103 -0
- package/dist/decisions/typesafe.d.ts +33 -5
- package/dist/decisions/typesafe.js +121 -8
- package/dist/doctor/index.d.ts +6 -9
- package/dist/doctor/index.js +41 -0
- package/dist/embeddings/adapters.d.ts +1 -1
- package/dist/embeddings/adapters.js +3 -3
- package/dist/embeddings/batch-google.d.ts +27 -8
- package/dist/embeddings/batch-google.js +112 -36
- package/dist/embeddings/batch-mock.js +1 -1
- package/dist/embeddings/batch.js +10 -4
- package/dist/embeddings/engine.js +14 -13
- package/dist/embeddings/index.d.ts +1 -1
- package/dist/embeddings/inputs.d.ts +26 -3
- package/dist/embeddings/inputs.js +84 -5
- package/dist/embeddings/mock.js +1 -1
- package/dist/embeddings/models.js +39 -4
- package/dist/loaders/csv.d.ts +23 -1
- package/dist/loaders/csv.js +125 -72
- package/dist/loaders/index.d.ts +7 -2
- package/dist/loaders/input.d.ts +6 -0
- package/dist/loaders/input.js +42 -1
- package/dist/loaders/json.d.ts +14 -3
- package/dist/loaders/json.js +171 -20
- package/dist/loaders/web.d.ts +55 -0
- package/dist/loaders/web.js +20 -1
- package/dist/mcp/client.d.ts +54 -5
- package/dist/mcp/client.js +171 -20
- package/dist/mcp/http.d.ts +45 -0
- package/dist/mcp/http.js +233 -0
- package/dist/mcp/index.d.ts +4 -2
- package/dist/mcp/index.js +3 -1
- package/dist/mcp/protocol.d.ts +107 -0
- package/dist/mcp/sampling.d.ts +41 -0
- package/dist/mcp/sampling.js +52 -0
- package/dist/mcp/server.d.ts +96 -14
- package/dist/mcp/server.js +274 -59
- package/dist/models/data.js +20 -1
- package/dist/operations/adapters.d.ts +1 -0
- package/dist/operations/adapters.js +3 -1
- package/dist/protocols/a2a-grpc.js +10 -3
- package/dist/protocols/a2a-signing.d.ts +65 -0
- package/dist/protocols/a2a-signing.js +133 -0
- package/dist/protocols/a2a.d.ts +14 -0
- package/dist/protocols/a2a.js +60 -5
- package/dist/providers/cohere.js +16 -2
- package/dist/providers/google.js +7 -1
- package/dist/providers/ollama.d.ts +1 -1
- package/dist/providers/ollama.js +35 -27
- package/dist/providers/openai.js +19 -2
- package/dist/rag/pinecone.d.ts +63 -2
- package/dist/rag/pinecone.js +80 -0
- package/dist/realtime/conversation.js +18 -0
- package/dist/realtime/gemini-live.transport.d.ts +28 -3
- package/dist/realtime/gemini-live.transport.js +170 -32
- package/dist/realtime/session.d.ts +2 -0
- package/dist/realtime/session.js +19 -4
- package/dist/realtime/types.d.ts +35 -3
- package/dist/security/output-guard.js +4 -1
- package/dist/server/auth.d.ts +263 -2
- package/dist/server/auth.js +432 -5
- package/dist/server/deployments.d.ts +3 -2
- package/dist/server/deployments.js +6 -1
- package/dist/telephony/index.d.ts +1 -1
- package/dist/telephony/manager.d.ts +8 -1
- package/dist/telephony/manager.js +13 -0
- package/dist/telephony/providers/telnyx.d.ts +18 -5
- package/dist/telephony/providers/telnyx.js +44 -7
- package/dist/telephony/providers/twilio.d.ts +3 -1
- package/dist/telephony/providers/twilio.js +16 -0
- package/dist/tracing/stores.d.ts +2 -0
- package/dist/tracing/stores.js +1 -0
- package/dist/tracing/tracer.d.ts +5 -2
- package/dist/tracing/tracer.js +6 -3
- package/dist/types/embeddings.d.ts +47 -5
- package/dist/types/messages.d.ts +7 -0
- package/dist/types/principal.d.ts +1 -1
- package/dist/types/response.d.ts +5 -0
- package/dist/types/telephony.d.ts +38 -0
- package/dist/types/tracing.d.ts +6 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/voice/providers/google.d.ts +44 -0
- package/dist/voice/providers/google.js +215 -0
- package/dist-cjs/adapter-kit/gather.d.ts +76 -0
- package/dist-cjs/adapter-kit/gather.js +152 -0
- package/dist-cjs/adapter-kit/index.d.ts +1 -0
- package/dist-cjs/adapter-kit/index.js +4 -1
- package/dist-cjs/adapter-kit/record.d.ts +3 -1
- package/dist-cjs/adapter-kit/record.js +20 -5
- package/dist-cjs/agent/openapi.d.ts +94 -8
- package/dist-cjs/agent/openapi.js +530 -32
- package/dist-cjs/cli/adapters.d.ts +4 -3
- package/dist-cjs/cli/adapters.js +70 -1
- package/dist-cjs/cli/doctor.js +3 -0
- package/dist-cjs/core/config-builder.d.ts +1 -0
- package/dist-cjs/core/config-builder.js +5 -1
- package/dist-cjs/core/defaults.d.ts +34 -0
- package/dist-cjs/core/defaults.js +44 -0
- package/dist-cjs/core/secure-stream.js +4 -1
- package/dist-cjs/decisions/completion.d.ts +10 -7
- package/dist-cjs/decisions/completion.js +81 -7
- package/dist-cjs/decisions/core.d.ts +88 -43
- package/dist-cjs/decisions/core.js +134 -46
- package/dist-cjs/decisions/errors.d.ts +25 -0
- package/dist-cjs/decisions/errors.js +16 -0
- package/dist-cjs/decisions/index.d.ts +6 -5
- package/dist-cjs/decisions/index.js +5 -1
- package/dist-cjs/decisions/integrations.d.ts +14 -5
- package/dist-cjs/decisions/integrations.js +16 -1
- package/dist-cjs/decisions/mock.d.ts +5 -3
- package/dist-cjs/decisions/mock.js +4 -1
- package/dist-cjs/decisions/pictures.d.ts +43 -0
- package/dist-cjs/decisions/pictures.js +109 -0
- package/dist-cjs/decisions/typesafe.d.ts +33 -5
- package/dist-cjs/decisions/typesafe.js +126 -13
- package/dist-cjs/doctor/index.d.ts +6 -9
- package/dist-cjs/doctor/index.js +41 -0
- package/dist-cjs/embeddings/adapters.d.ts +1 -1
- package/dist-cjs/embeddings/adapters.js +3 -3
- package/dist-cjs/embeddings/batch-google.d.ts +27 -8
- package/dist-cjs/embeddings/batch-google.js +112 -36
- package/dist-cjs/embeddings/batch-mock.js +1 -1
- package/dist-cjs/embeddings/batch.js +9 -3
- package/dist-cjs/embeddings/engine.js +13 -12
- package/dist-cjs/embeddings/index.d.ts +1 -1
- package/dist-cjs/embeddings/inputs.d.ts +26 -3
- package/dist-cjs/embeddings/inputs.js +89 -5
- package/dist-cjs/embeddings/mock.js +1 -1
- package/dist-cjs/embeddings/models.js +39 -4
- package/dist-cjs/loaders/csv.d.ts +23 -1
- package/dist-cjs/loaders/csv.js +126 -71
- package/dist-cjs/loaders/index.d.ts +7 -2
- package/dist-cjs/loaders/input.d.ts +6 -0
- package/dist-cjs/loaders/input.js +43 -1
- package/dist-cjs/loaders/json.d.ts +14 -3
- package/dist-cjs/loaders/json.js +170 -19
- package/dist-cjs/loaders/web.d.ts +55 -0
- package/dist-cjs/loaders/web.js +21 -1
- package/dist-cjs/mcp/client.d.ts +54 -5
- package/dist-cjs/mcp/client.js +171 -20
- package/dist-cjs/mcp/http.d.ts +45 -0
- package/dist-cjs/mcp/http.js +236 -0
- package/dist-cjs/mcp/index.d.ts +4 -2
- package/dist-cjs/mcp/index.js +5 -1
- package/dist-cjs/mcp/protocol.d.ts +107 -0
- package/dist-cjs/mcp/sampling.d.ts +41 -0
- package/dist-cjs/mcp/sampling.js +55 -0
- package/dist-cjs/mcp/server.d.ts +96 -14
- package/dist-cjs/mcp/server.js +273 -58
- package/dist-cjs/models/data.js +20 -1
- package/dist-cjs/operations/adapters.d.ts +1 -0
- package/dist-cjs/operations/adapters.js +3 -1
- package/dist-cjs/protocols/a2a-grpc.js +10 -3
- package/dist-cjs/protocols/a2a-signing.d.ts +65 -0
- package/dist-cjs/protocols/a2a-signing.js +140 -0
- package/dist-cjs/protocols/a2a.d.ts +14 -0
- package/dist-cjs/protocols/a2a.js +65 -6
- package/dist-cjs/providers/cohere.js +16 -2
- package/dist-cjs/providers/google.js +7 -1
- package/dist-cjs/providers/ollama.d.ts +1 -1
- package/dist-cjs/providers/ollama.js +35 -27
- package/dist-cjs/providers/openai.js +19 -2
- package/dist-cjs/rag/pinecone.d.ts +63 -2
- package/dist-cjs/rag/pinecone.js +81 -0
- package/dist-cjs/realtime/conversation.js +18 -0
- package/dist-cjs/realtime/gemini-live.transport.d.ts +28 -3
- package/dist-cjs/realtime/gemini-live.transport.js +170 -32
- package/dist-cjs/realtime/session.d.ts +2 -0
- package/dist-cjs/realtime/session.js +19 -4
- package/dist-cjs/realtime/types.d.ts +35 -3
- package/dist-cjs/security/output-guard.js +4 -1
- package/dist-cjs/server/auth.d.ts +263 -2
- package/dist-cjs/server/auth.js +437 -5
- package/dist-cjs/server/deployments.d.ts +3 -2
- package/dist-cjs/server/deployments.js +6 -1
- package/dist-cjs/telephony/index.d.ts +1 -1
- package/dist-cjs/telephony/manager.d.ts +8 -1
- package/dist-cjs/telephony/manager.js +13 -0
- package/dist-cjs/telephony/providers/telnyx.d.ts +18 -5
- package/dist-cjs/telephony/providers/telnyx.js +44 -7
- package/dist-cjs/telephony/providers/twilio.d.ts +3 -1
- package/dist-cjs/telephony/providers/twilio.js +16 -0
- package/dist-cjs/tracing/stores.d.ts +2 -0
- package/dist-cjs/tracing/stores.js +1 -0
- package/dist-cjs/tracing/tracer.d.ts +5 -2
- package/dist-cjs/tracing/tracer.js +6 -3
- package/dist-cjs/types/embeddings.d.ts +47 -5
- package/dist-cjs/types/messages.d.ts +7 -0
- package/dist-cjs/types/principal.d.ts +1 -1
- package/dist-cjs/types/response.d.ts +5 -0
- package/dist-cjs/types/telephony.d.ts +38 -0
- package/dist-cjs/types/tracing.d.ts +6 -0
- package/dist-cjs/version.d.ts +1 -1
- package/dist-cjs/version.js +1 -1
- package/dist-cjs/voice/providers/google.d.ts +44 -0
- package/dist-cjs/voice/providers/google.js +252 -0
- package/llms.txt +1 -1
- package/package.json +17 -1
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.GoogleVoiceProvider = void 0;
|
|
37
|
+
const base64_js_1 = require("../../utils/base64.js");
|
|
38
|
+
const media_duration_js_1 = require("../../utils/media-duration.js");
|
|
39
|
+
const errors_js_1 = require("../errors.js");
|
|
40
|
+
const DEFAULT_TRANSCRIPTION_MODEL = 'gemini-3.8-flash';
|
|
41
|
+
const DEFAULT_SPEECH_MODEL = 'gemini-3.8-flash-tts';
|
|
42
|
+
const DEFAULT_VOICE = 'Kore';
|
|
43
|
+
const SPEECH_RATE = 24_000;
|
|
44
|
+
const INLINE_AUDIO_BYTES = 14 * 1024 * 1024;
|
|
45
|
+
class GoogleVoiceProvider {
|
|
46
|
+
config;
|
|
47
|
+
info = {
|
|
48
|
+
name: 'google',
|
|
49
|
+
isLocal: false,
|
|
50
|
+
supports: { transcription: true, speech: true, realtime: false },
|
|
51
|
+
};
|
|
52
|
+
constructor(config) {
|
|
53
|
+
this.config = config;
|
|
54
|
+
}
|
|
55
|
+
async transcribe(request, context) {
|
|
56
|
+
if (request.timestampGranularities?.length ||
|
|
57
|
+
(request.responseFormat !== undefined && request.responseFormat !== 'json' && request.responseFormat !== 'text')) {
|
|
58
|
+
throw new errors_js_1.VoiceProviderError('Gemini transcribes to text alone, without timings or subtitles; ask for json or text', 'google');
|
|
59
|
+
}
|
|
60
|
+
const model = request.model || this.config.transcriptionModel || DEFAULT_TRANSCRIPTION_MODEL;
|
|
61
|
+
const signal = context?.signal ?? request.signal;
|
|
62
|
+
const { part, bytes } = await this.audioPart(request.audio, signal);
|
|
63
|
+
const instruction = [
|
|
64
|
+
'Transcribe the speech in this audio word for word, in the language it is spoken in.',
|
|
65
|
+
request.language ? `It is in ${request.language}.` : '',
|
|
66
|
+
request.prompt ? `Names and spellings it may hold: ${request.prompt}` : '',
|
|
67
|
+
'Answer with the transcript alone.',
|
|
68
|
+
]
|
|
69
|
+
.filter(Boolean)
|
|
70
|
+
.join(' ');
|
|
71
|
+
const answer = await this.generate(model, {
|
|
72
|
+
contents: [{ role: 'user', parts: [{ text: instruction }, part] }],
|
|
73
|
+
generationConfig: { temperature: request.temperature ?? 0 },
|
|
74
|
+
}, signal, context);
|
|
75
|
+
const text = (answer.candidates?.[0]?.content?.parts ?? [])
|
|
76
|
+
.map((item) => item.text ?? '')
|
|
77
|
+
.join('')
|
|
78
|
+
.trim();
|
|
79
|
+
const duration = bytes ? (0, media_duration_js_1.readMediaDuration)(bytes) : undefined;
|
|
80
|
+
return {
|
|
81
|
+
text,
|
|
82
|
+
providerUsed: 'google',
|
|
83
|
+
modelUsed: answer.modelVersion ?? model,
|
|
84
|
+
...(request.language ? { language: request.language } : {}),
|
|
85
|
+
...(duration ? { durationSeconds: duration.durationMs / 1000 } : {}),
|
|
86
|
+
raw: answer,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async speak(request, context) {
|
|
90
|
+
const format = request.format ?? 'wav';
|
|
91
|
+
if (format !== 'wav' && format !== 'pcm') {
|
|
92
|
+
throw new errors_js_1.VoiceProviderError(`Gemini speaks WAV or raw PCM, not ${format}`, 'google');
|
|
93
|
+
}
|
|
94
|
+
const model = request.model || this.config.speechModel || DEFAULT_SPEECH_MODEL;
|
|
95
|
+
const voice = request.voice || this.config.defaultVoice || DEFAULT_VOICE;
|
|
96
|
+
const direction = [
|
|
97
|
+
request.instructions,
|
|
98
|
+
request.speed !== undefined && request.speed !== 1 ? `Speak at ${request.speed} times the usual pace.` : '',
|
|
99
|
+
]
|
|
100
|
+
.filter(Boolean)
|
|
101
|
+
.join(' ');
|
|
102
|
+
const answer = await this.generate(model, {
|
|
103
|
+
contents: [{ role: 'user', parts: [{ text: request.text }] }],
|
|
104
|
+
...(direction ? { systemInstruction: { parts: [{ text: direction }] } } : {}),
|
|
105
|
+
generationConfig: {
|
|
106
|
+
responseModalities: ['AUDIO'],
|
|
107
|
+
speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: voice } } },
|
|
108
|
+
},
|
|
109
|
+
}, context?.signal ?? request.signal, context);
|
|
110
|
+
const inline = (answer.candidates?.[0]?.content?.parts ?? []).find((item) => item.inlineData?.data)?.inlineData;
|
|
111
|
+
if (!inline?.data)
|
|
112
|
+
throw new errors_js_1.VoiceProviderError('Gemini answered with no audio', 'google');
|
|
113
|
+
const received = (0, base64_js_1.decodeBase64)(inline.data);
|
|
114
|
+
const wav = isWav(received);
|
|
115
|
+
const rate = Number(/rate=(\d+)/i.exec(inline.mimeType ?? '')?.[1] ?? SPEECH_RATE);
|
|
116
|
+
const data = format === 'wav' ? (wav ? received : wavOf(received, rate)) : wav ? samplesOf(received) : received;
|
|
117
|
+
const mimeType = format === 'wav' ? 'audio/wav' : `audio/L16;rate=${wav ? rateOf(received) : rate}`;
|
|
118
|
+
return {
|
|
119
|
+
audio: { data, format, mimeType },
|
|
120
|
+
providerUsed: 'google',
|
|
121
|
+
modelUsed: answer.modelVersion ?? model,
|
|
122
|
+
voice,
|
|
123
|
+
format,
|
|
124
|
+
mimeType,
|
|
125
|
+
raw: answer,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
async audioPart(input, signal) {
|
|
129
|
+
if ('url' in input && input.url.startsWith('https://generativelanguage.googleapis.com/')) {
|
|
130
|
+
return {
|
|
131
|
+
part: { fileData: { mimeType: input.mimeType ?? mimeTypeOf(input.url) ?? 'audio/wav', fileUri: input.url } },
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const bytes = await this.read(input, signal);
|
|
135
|
+
if (bytes.byteLength > INLINE_AUDIO_BYTES) {
|
|
136
|
+
throw new errors_js_1.VoiceProviderError(`The audio is ${Math.ceil(bytes.byteLength / 1024 / 1024)} MB; Gemini takes at most 14 MB inline, so upload it to the Files API and pass its URI as the url`, 'google');
|
|
137
|
+
}
|
|
138
|
+
const mimeType = input.mimeType ??
|
|
139
|
+
('filename' in input && input.filename ? mimeTypeOf(input.filename) : undefined) ??
|
|
140
|
+
('path' in input ? mimeTypeOf(input.path) : undefined) ??
|
|
141
|
+
(0, media_duration_js_1.readMediaDuration)(bytes)?.mimeType ??
|
|
142
|
+
'audio/wav';
|
|
143
|
+
return { part: { inlineData: { mimeType, data: (0, base64_js_1.encodeBase64)(bytes) } }, bytes };
|
|
144
|
+
}
|
|
145
|
+
async read(input, signal) {
|
|
146
|
+
if ('url' in input) {
|
|
147
|
+
const response = await (this.config.fetch ?? fetch)(input.url, signal ? { signal } : {});
|
|
148
|
+
if (!response.ok)
|
|
149
|
+
throw new errors_js_1.VoiceProviderError(`The audio at ${input.url} answered ${response.status}`, 'google');
|
|
150
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
151
|
+
}
|
|
152
|
+
if ('path' in input) {
|
|
153
|
+
const { readFile } = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
|
|
154
|
+
return new Uint8Array(await readFile(input.path));
|
|
155
|
+
}
|
|
156
|
+
if ('base64' in input)
|
|
157
|
+
return (0, base64_js_1.decodeBase64)(input.base64);
|
|
158
|
+
if ('buffer' in input) {
|
|
159
|
+
return input.buffer instanceof ArrayBuffer ? new Uint8Array(input.buffer) : new Uint8Array(input.buffer);
|
|
160
|
+
}
|
|
161
|
+
const pieces = [];
|
|
162
|
+
for await (const piece of input.stream) {
|
|
163
|
+
pieces.push(typeof piece === 'string' ? new TextEncoder().encode(piece) : new Uint8Array(piece));
|
|
164
|
+
}
|
|
165
|
+
const bytes = new Uint8Array(pieces.reduce((total, piece) => total + piece.byteLength, 0));
|
|
166
|
+
let offset = 0;
|
|
167
|
+
for (const piece of pieces) {
|
|
168
|
+
bytes.set(piece, offset);
|
|
169
|
+
offset += piece.byteLength;
|
|
170
|
+
}
|
|
171
|
+
return bytes;
|
|
172
|
+
}
|
|
173
|
+
async generate(model, body, signal, context) {
|
|
174
|
+
const base = (this.config.baseUrl ?? 'https://generativelanguage.googleapis.com/v1beta').replace(/\/+$/, '');
|
|
175
|
+
const qualified = model.startsWith('models/') ? model : `models/${model}`;
|
|
176
|
+
const credential = await context?.credential?.(this.info.name);
|
|
177
|
+
const response = await (this.config.fetch ?? fetch)(`${base}/${qualified}:generateContent`, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
headers: {
|
|
180
|
+
'content-type': 'application/json',
|
|
181
|
+
'x-goog-api-key': credential?.apiKey ?? this.config.apiKey,
|
|
182
|
+
...this.config.headers,
|
|
183
|
+
...credential?.headers,
|
|
184
|
+
},
|
|
185
|
+
body: JSON.stringify(body),
|
|
186
|
+
...(signal ? { signal } : {}),
|
|
187
|
+
});
|
|
188
|
+
if (!response.ok) {
|
|
189
|
+
const message = await response.text().catch(() => response.statusText);
|
|
190
|
+
throw new errors_js_1.VoiceProviderError(`Gemini voice request failed: ${response.status} ${message.slice(0, 500)}`, 'google');
|
|
191
|
+
}
|
|
192
|
+
return (await response.json());
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
exports.GoogleVoiceProvider = GoogleVoiceProvider;
|
|
196
|
+
const AUDIO_TYPES = {
|
|
197
|
+
wav: 'audio/wav',
|
|
198
|
+
mp3: 'audio/mp3',
|
|
199
|
+
aiff: 'audio/aiff',
|
|
200
|
+
aac: 'audio/aac',
|
|
201
|
+
ogg: 'audio/ogg',
|
|
202
|
+
flac: 'audio/flac',
|
|
203
|
+
};
|
|
204
|
+
function mimeTypeOf(name) {
|
|
205
|
+
const extension = /\.([A-Za-z0-9]+)(?:[?#]|$)/.exec(name)?.[1]?.toLowerCase();
|
|
206
|
+
return extension ? AUDIO_TYPES[extension] : undefined;
|
|
207
|
+
}
|
|
208
|
+
function isWav(bytes) {
|
|
209
|
+
return ascii(bytes, 0, 4) === 'RIFF' && ascii(bytes, 8, 4) === 'WAVE';
|
|
210
|
+
}
|
|
211
|
+
function ascii(bytes, at, length) {
|
|
212
|
+
return String.fromCharCode(...bytes.subarray(at, at + length));
|
|
213
|
+
}
|
|
214
|
+
function rateOf(wav) {
|
|
215
|
+
const view = new DataView(wav.buffer, wav.byteOffset, wav.byteLength);
|
|
216
|
+
for (let at = 12; at + 8 <= wav.length; at += 8 + view.getUint32(at + 4, true)) {
|
|
217
|
+
if (ascii(wav, at, 4) === 'fmt ')
|
|
218
|
+
return view.getUint32(at + 12, true);
|
|
219
|
+
}
|
|
220
|
+
return SPEECH_RATE;
|
|
221
|
+
}
|
|
222
|
+
function samplesOf(wav) {
|
|
223
|
+
const view = new DataView(wav.buffer, wav.byteOffset, wav.byteLength);
|
|
224
|
+
for (let at = 12; at + 8 <= wav.length; at += 8 + view.getUint32(at + 4, true)) {
|
|
225
|
+
if (ascii(wav, at, 4) === 'data')
|
|
226
|
+
return wav.subarray(at + 8, at + 8 + view.getUint32(at + 4, true));
|
|
227
|
+
}
|
|
228
|
+
return wav;
|
|
229
|
+
}
|
|
230
|
+
function wavOf(samples, rate) {
|
|
231
|
+
const wav = new Uint8Array(44 + samples.byteLength);
|
|
232
|
+
const view = new DataView(wav.buffer);
|
|
233
|
+
const text = (at, value) => {
|
|
234
|
+
for (let index = 0; index < value.length; index++)
|
|
235
|
+
wav[at + index] = value.charCodeAt(index);
|
|
236
|
+
};
|
|
237
|
+
text(0, 'RIFF');
|
|
238
|
+
view.setUint32(4, 36 + samples.byteLength, true);
|
|
239
|
+
text(8, 'WAVE');
|
|
240
|
+
text(12, 'fmt ');
|
|
241
|
+
view.setUint32(16, 16, true);
|
|
242
|
+
view.setUint16(20, 1, true);
|
|
243
|
+
view.setUint16(22, 1, true);
|
|
244
|
+
view.setUint32(24, rate, true);
|
|
245
|
+
view.setUint32(28, rate * 2, true);
|
|
246
|
+
view.setUint16(32, 2, true);
|
|
247
|
+
view.setUint16(34, 16, true);
|
|
248
|
+
text(36, 'data');
|
|
249
|
+
view.setUint32(40, samples.byteLength, true);
|
|
250
|
+
wav.set(samples, 44);
|
|
251
|
+
return wav;
|
|
252
|
+
}
|
package/llms.txt
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
Import only what you use. The root import is the client and nothing else, and every other capability has its own entry point with a size budget CI enforces; [the packaging guide](https://raw.githubusercontent.com/mkhitar-abrahamyan/nexus-ai/main/docs/packaging.md) publishes what each one costs. The package has no required dependencies: a graph-only application loads 81 KB, and installs nothing but this package. The client, the provider adapters, graphs, agents, and the agent protocols run on Node.js, Deno, Bun, edge runtimes, and browsers; [the runtimes guide](https://raw.githubusercontent.com/mkhitar-abrahamyan/nexus-ai/main/docs/runtimes.md) lists the entry points that need Node.js, and why.
|
|
6
6
|
|
|
7
7
|
- Install with `npm install nexus-ai-pro`. It needs Node.js 22 or newer, and ships ESM and CommonJS builds with shared types. License: MIT.
|
|
8
|
-
- It has
|
|
8
|
+
- It has 200 entry points. `nexus-ai-pro` itself is the client, and every other capability has its own subpath, such as `nexus-ai-pro/graph`.
|
|
9
9
|
- Nothing is a required dependency. Install only the optional peers you use: `@anthropic-ai/sdk`, `@types/node`, `ajv`, `ajv-formats`, `ollama`, `openai`, `zod`.
|
|
10
10
|
- Each guide explains every export of its entry points, then lists them in a reference generated from the doc comments.
|
|
11
11
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nexus-ai-pro",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.22.0",
|
|
4
4
|
"description": "Typed AI framework for TypeScript: provider routing and failover, durable agent graphs and workflows, retrieval over any vector store, MCP, evals, guardrails, and cost control",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist-cjs/index.js",
|
|
@@ -270,6 +270,16 @@
|
|
|
270
270
|
"default": "./dist-cjs/voice/providers/openai.js"
|
|
271
271
|
}
|
|
272
272
|
},
|
|
273
|
+
"./voice/google": {
|
|
274
|
+
"import": {
|
|
275
|
+
"types": "./dist/voice/providers/google.d.ts",
|
|
276
|
+
"default": "./dist/voice/providers/google.js"
|
|
277
|
+
},
|
|
278
|
+
"require": {
|
|
279
|
+
"types": "./dist-cjs/voice/providers/google.d.ts",
|
|
280
|
+
"default": "./dist-cjs/voice/providers/google.js"
|
|
281
|
+
}
|
|
282
|
+
},
|
|
273
283
|
"./voice/session": {
|
|
274
284
|
"import": {
|
|
275
285
|
"types": "./dist/voice/session.d.ts",
|
|
@@ -2063,6 +2073,8 @@
|
|
|
2063
2073
|
"conformance:images:record": "tsx tests/conformance.images.ts --record",
|
|
2064
2074
|
"test:portable": "node scripts/check-portability.mjs && node tests/portable/run.mjs node && node tests/portable/edge.mjs",
|
|
2065
2075
|
"test:browser": "node tests/browser.mjs",
|
|
2076
|
+
"test:browser:firefox": "node tests/browser.mjs firefox",
|
|
2077
|
+
"test:browser:webkit": "node tests/browser.mjs webkit",
|
|
2066
2078
|
"test:browser:realtime": "node tests/browser-realtime.mjs",
|
|
2067
2079
|
"bench:surfaces": "node --expose-gc --no-warnings scripts/bench-surfaces.mjs",
|
|
2068
2080
|
"bench:streams": "node scripts/bench-asset-streams.mjs",
|
|
@@ -2197,6 +2209,7 @@
|
|
|
2197
2209
|
"nexus-ai-pro-2-7": "npm:nexus-ai-pro@^2.7.0",
|
|
2198
2210
|
"ollama": "^0.5.6",
|
|
2199
2211
|
"openai": "^4.52.0",
|
|
2212
|
+
"playwright-core": "^1.64.1",
|
|
2200
2213
|
"tsx": "^4.16.0",
|
|
2201
2214
|
"typescript": "^5.5.0",
|
|
2202
2215
|
"wasmoon": "^1.16.0",
|
|
@@ -2311,6 +2324,9 @@
|
|
|
2311
2324
|
"voice/openai": [
|
|
2312
2325
|
"dist-cjs/voice/providers/openai.d.ts"
|
|
2313
2326
|
],
|
|
2327
|
+
"voice/google": [
|
|
2328
|
+
"dist-cjs/voice/providers/google.d.ts"
|
|
2329
|
+
],
|
|
2314
2330
|
"voice/session": [
|
|
2315
2331
|
"dist-cjs/voice/session.d.ts"
|
|
2316
2332
|
],
|