mirror of
https://github.com/jambonz/jambonz-feature-server.git
synced 2025-12-20 16:50:39 +00:00
update deepgram voice agent (#1191)
* update deepgram voice agent * fix lint * wip * wip
This commit is contained in:
@@ -41,25 +41,25 @@ class TaskLlmVoiceAgent_S2S extends Task {
|
||||
this.actionHook = this.data.actionHook;
|
||||
this.eventHook = this.data.eventHook;
|
||||
this.toolHook = this.data.toolHook;
|
||||
const {settingsConfiguration} = this.data.llmOptions;
|
||||
const {Settings} = this.data.llmOptions;
|
||||
|
||||
if (typeof settingsConfiguration !== 'object') {
|
||||
throw new Error('llmOptions with an initial settingsConfiguration is required for VoiceAgent S2S');
|
||||
if (typeof Settings !== 'object') {
|
||||
throw new Error('llmOptions with an initial Settings is required for VoiceAgent S2S');
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
const {audio, ...rest} = settingsConfiguration;
|
||||
const cfg = this.settingsConfiguration = rest;
|
||||
const {audio, ...rest} = Settings;
|
||||
const cfg = this.Settings = rest;
|
||||
|
||||
if (!cfg.agent) throw new Error('llmOptions.settingsConfiguration.agent is required for VoiceAgent S2S');
|
||||
if (!cfg.agent) throw new Error('llmOptions.Settings.agent is required for VoiceAgent S2S');
|
||||
if (!cfg.agent.think) {
|
||||
throw new Error('llmOptions.settingsConfiguration.agent.think is required for VoiceAgent S2S');
|
||||
throw new Error('llmOptions.Settings.agent.think is required for VoiceAgent S2S');
|
||||
}
|
||||
if (!cfg.agent.think.model) {
|
||||
throw new Error('llmOptions.settingsConfiguration.agent.think.model is required for VoiceAgent S2S');
|
||||
if (!cfg.agent.think.provider?.model) {
|
||||
throw new Error('llmOptions.Settings.agent.think.provider.model is required for VoiceAgent S2S');
|
||||
}
|
||||
if (!cfg.agent.think.provider?.type) {
|
||||
throw new Error('llmOptions.settingsConfiguration.agent.think.provider.type is required for VoiceAgent S2S');
|
||||
throw new Error('llmOptions.Settings.agent.think.provider.type is required for VoiceAgent S2S');
|
||||
}
|
||||
|
||||
this.results = {
|
||||
@@ -92,7 +92,7 @@ class TaskLlmVoiceAgent_S2S extends Task {
|
||||
const {path} = this.connectionOptions || {};
|
||||
if (path) return path;
|
||||
|
||||
return '/agent';
|
||||
return '/v1/agent/converse';
|
||||
}
|
||||
|
||||
async _api(ep, args) {
|
||||
@@ -194,19 +194,19 @@ class TaskLlmVoiceAgent_S2S extends Task {
|
||||
|
||||
async _sendInitialMessage(ep) {
|
||||
const mcpTools = this.parent.isMcpEnabled ? await this.parent.mcpService.getAvailableMcpTools() : [];
|
||||
if (mcpTools && mcpTools.length > 0 && this.settingsConfiguration.agent?.think) {
|
||||
if (mcpTools && mcpTools.length > 0 && this.Settings.agent?.think) {
|
||||
const convertedTools = mcpTools.map((tool) => ({
|
||||
name: tool.name,
|
||||
description: tool.description,
|
||||
parameters: tool.inputSchema
|
||||
}));
|
||||
|
||||
this.settingsConfiguration.agent.think.functions = [
|
||||
this.Settings.agent.think.functions = [
|
||||
...convertedTools,
|
||||
...(this.settingsConfiguration.agent.think?.functions || [])
|
||||
...(this.Settings.agent.think?.functions || [])
|
||||
];
|
||||
}
|
||||
if (!await this._sendClientEvent(ep, this.settingsConfiguration)) {
|
||||
if (!await this._sendClientEvent(ep, this.Settings)) {
|
||||
this.notifyTaskDone();
|
||||
}
|
||||
}
|
||||
@@ -267,38 +267,43 @@ class TaskLlmVoiceAgent_S2S extends Task {
|
||||
/* tool calls */
|
||||
else if (type === 'FunctionCallRequest') {
|
||||
this.logger.debug({evt}, 'TaskLlmVoiceAgent_S2S:_onServerEvent - function_call');
|
||||
const {function_name:name, function_call_id:call_id, input: args} = evt;
|
||||
|
||||
const mcpTools = this.parent.isMcpEnabled ? await this.parent.mcpService.getAvailableMcpTools() : [];
|
||||
if (mcpTools.some((tool) => tool.name === name)) {
|
||||
this.logger.debug({call_id, name, args}, 'TaskLlmVoiceAgent_S2S:_onServerEvent - calling mcp tool');
|
||||
try {
|
||||
const res = await this.parent.mcpService.callMcpTool(name, args);
|
||||
this.logger.debug({res}, 'TaskLlmVoiceAgent_S2S:_onServerEvent - function_call - mcp result');
|
||||
this.processToolOutput(_ep, call_id, {
|
||||
data: {
|
||||
type: 'FunctionCallResponse',
|
||||
function_call_id: call_id,
|
||||
output: res.content[0]?.text || 'There is no output from the function call',
|
||||
}
|
||||
});
|
||||
return;
|
||||
} catch (err) {
|
||||
this.logger.info({err, evt}, 'TaskLlmVoiceAgent_S2S - error calling function');
|
||||
this.results = {
|
||||
completionReason: 'client error calling mcp function',
|
||||
error: err
|
||||
};
|
||||
endConversation = true;
|
||||
}
|
||||
} else if (!this.toolHook) {
|
||||
if (!this.toolHook && mcpTools.length === 0) {
|
||||
this.logger.warn({evt}, 'TaskLlmVoiceAgent_S2S:_onServerEvent - no toolHook defined!');
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
const {functions} = evt;
|
||||
const handledFunctions = [];
|
||||
|
||||
try {
|
||||
await this.parent.sendToolHook(call_id, {name, args});
|
||||
if (mcpTools && mcpTools.length > 0) {
|
||||
for (const func of functions) {
|
||||
const {name, arguments: args, id} = func;
|
||||
const tool = mcpTools.find((tool) => tool.name === name);
|
||||
if (tool) {
|
||||
handledFunctions.push(name);
|
||||
const response = await this.parent.mcpService.callMcpTool(name, JSON.parse(args));
|
||||
this.logger.debug({response}, 'TaskLlmVoiceAgent_S2S:_onServerEvent - function_call - mcp result');
|
||||
this.processToolOutput(_ep, id, {
|
||||
data: {
|
||||
type: 'FunctionCallResponse',
|
||||
id,
|
||||
name,
|
||||
content: response.length > 0 ? response[0].text : 'There is no output from the function call'
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const func of functions) {
|
||||
const {name, arguments: args, id} = func;
|
||||
if (!handledFunctions.includes(name)) {
|
||||
await this.parent.sendToolHook(id, {name, args: JSON.parse(args)});
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
this.logger.info({err, evt}, 'TaskLlmVoiceAgent - error calling function');
|
||||
this.logger.info({err, evt}, 'TaskLlmVoiceAgent_S2S:_onServerEvent - error calling function');
|
||||
this.results = {
|
||||
completionReason: 'client error calling function',
|
||||
error: err
|
||||
|
||||
Reference in New Issue
Block a user