mirror of
https://github.com/hanzoai/calendar.git
synced 2026-10-30 14:46:43 +00:00
* add trigger * small fixes * add missing workflow DTOs * small fixes * use activeOnWithChildren * fix active on when switching trigger type * remove add variable dropdown * feat: lang support * fix: type errors * feat: select voice agent * refactor: address feedback * refactor: address feedback * refactor: missing import * fix: types * add getAllWorkflowsFromRoutingForm to WorkflowService * fix error caused by undefined evt * fix type error * fix type error * fix tests * feat: add inbound calls * chore: formatting * chore * feat: finish inbound call * chore: formatting * fix: update bug * fix: types * code clean up * final fixes and clean up * remove console.log * remove template text form from triggers * add routing form repoditory function * refactor: Agent Configuration Sheet (#23930) * refactor: agent configuration sheet * chore: use default phone numbre * refactor: improvements * refactor: improvements * fix: types * fix: feedback * fix bug with key * chore: * fix: feedback * fix: prompt * add comments * fix: review * fix: review * refactor: class * refactor: class * fix test * allow cal ai action on form triggers * move any reusable code to scheduleAIPhoneCall * add missing await * use predefined FormSubmissionData type * add .trim() to sms message * pass contextData instead * finish base setup * add missing trigger in update-workflow.input.ts * allow cal.ai action for form triggers in handler * chore: add support for form workflows on api v2 * fixup! chore: add support for form workflows on api v2 * ai phone call on form submissions (WIP) * use existing type for Option array * pass chosen event type id * refactor: rename * Update apps/web/public/static/locales/en/common.json * Update apps/web/public/static/locales/en/common.json * add missing imports * chore: update set value * fix: remove index * fix: type error * fix: update tetss * use only repository functions in update handler * move all prisma queries from list.handler * review suggestions * fix: use logger * chore: handle workflows api v2 * chore: handle workflows api v2, split in 2 endpoints * fix workflow step creation * remove connect agent and fixes types * add type to workflow * chore: use workflow type in apiv2 WorkflowsOutputService * update worklfow type on update * chore: use workflow type in apiv2 WorkflowsOutputService * fix template body for torm trigger * some UI fixes for email subject/body * resetting email body when changing form triggers * use type field to query workflows * clean up all old active on values * remove responseId from all funciton calls * remove undefined from updateTemplate * refactor: don't use static * fix: type * refactor: split routing form and event-type workflows code * refactor: split routing form and event-type workflows code * fix template text when adding action * chore: don't rename WorkflowActivationDto to avoid ci blocking * refine update schedule to use only allowed actions * fix type error * don't allow whatsapp action with form trigger * fix type error * return early if activeOn array is empty * fix: from step type in BaseFormWorkflowStepDto * fixup! fix: from step type in BaseFormWorkflowStepDto * api v2 updates * move all prisma calls to repository (service/workflows.ts) * use FORM_TRIGGER_WORKFLOW_EVENTS for form queries * use userRepository * use FORM_TRIGGER_WORKFLOW_EVENTS in isFormTrigger * code clean up * code clean up * use repository functions in formSubmissionValidation.ts * fix: schema * refactor: * remove action check in update handler * add event type selection * event type selector improvements * adjust update.handler * set outboundEventTypeId * add back trpc import * fix agent repository functions * clean up * fix bugs caused by merge * pass eventTypeId to updateToolsFromAgentId * add migration for outboundEventTypeId * add SMS actions to allowed form action constants * add cal ai to allowed form actions * pick correct event type for web call * pass correct routed event type id * remove unsued import * fixes for offset api v2 * add missing responseId * fix failing test * fix failing test * improve error message * remove unused imports * chore: handle sms step action for form worklfow in dtos * fix typo * missing missing newStep * minor fixes * remove changes * add routedEventTypeId * fix type error * fix type error * fix typ error in executAPIPhoneCall.tsx * add back inboundEventTypeId * remove console.log * remove outdated code * small fixes * don't throw error for missing phone number * add back filtered triggerOptions * fix eventTypeId in testCall handler * fix type error * update migration * fix trigger is not defined * convert eventTypeId to string * only use outboundEventTypeId for FORM_SUBMITTED trigger * show toast when no event type selected * fix type errors * add missing translation * fix type error * remove callType * fix tests * small fixes * clean up AgentConfigurationSheet * remove EventTypeSelector file * code clean up * clean up * clean up * use resusable function for TestPhoneCallDialog and WebCallDialog * rename result * fix types for event type id * use repository runction in workflowReminder.ts * fix type error * pass eventTypeIds correctly * fix typo * Update apps/web/public/static/locales/en/common.json Co-authored-by: Udit Takkar <[email protected]> * use watch instead of getValues * change to z.record(z.unknown()) instead of any() * fix type of eventTypeId * check permissinon for outBoundEventTypeId * add isNaN check * improve function name * update tools when outbound agent event type id changes * pass missing outboundEventTypeId * update migration * fix test * remove cal-ai step from test --------- Co-authored-by: CarinaWolli <[email protected]> Co-authored-by: Udit Takkar <[email protected]> Co-authored-by: Udit Takkar <[email protected]> Co-authored-by: Benny Joo <[email protected]> Co-authored-by: cal.com <[email protected]> Co-authored-by: Morgan <[email protected]> Co-authored-by: Peer Richelsen <[email protected]>
212 lines
5.7 KiB
TypeScript
212 lines
5.7 KiB
TypeScript
/**
|
|
* Service layer mappers for RetellAI
|
|
* Maps between service/interface types and internal Retell types
|
|
*/
|
|
import type {
|
|
AIPhoneServiceConfiguration,
|
|
AIPhoneServiceUpdateModelParams,
|
|
AIPhoneServiceTools,
|
|
AIPhoneServiceProviderType,
|
|
} from "../../interfaces/AIPhoneService.interface";
|
|
import type { AgentWithDetailsData } from "../interfaces/AgentRepositoryInterface";
|
|
import type {
|
|
RetellLLMGeneralTools,
|
|
UpdateLLMRequest,
|
|
CreateLLMRequest,
|
|
CreateAgentRequest,
|
|
UpdateAgentRequest,
|
|
RetellAgentWithDetails,
|
|
Language,
|
|
RetellAgent,
|
|
RetellLLM,
|
|
} from "./types";
|
|
|
|
export class RetellAIServiceMapper {
|
|
/**
|
|
* Maps AI configuration to Retell tools format
|
|
*/
|
|
static buildGeneralTools(
|
|
config: AIPhoneServiceConfiguration<AIPhoneServiceProviderType.RETELL_AI>
|
|
): NonNullable<RetellLLMGeneralTools> {
|
|
const tools: NonNullable<RetellLLMGeneralTools> = [
|
|
{
|
|
type: "end_call",
|
|
name: "end_call",
|
|
description: "Hang up the call, triggered only after appointment successfully scheduled.",
|
|
},
|
|
];
|
|
|
|
// Add calendar tools if configured
|
|
if (config.calApiKey && config.eventTypeId && config.timeZone) {
|
|
tools.push(
|
|
{
|
|
type: "check_availability_cal" as const,
|
|
name: "check_availability",
|
|
cal_api_key: config.calApiKey,
|
|
event_type_id: config.eventTypeId,
|
|
timezone: config.timeZone,
|
|
},
|
|
{
|
|
type: "book_appointment_cal" as const,
|
|
name: "book_appointment",
|
|
cal_api_key: config.calApiKey,
|
|
event_type_id: config.eventTypeId,
|
|
timezone: config.timeZone,
|
|
}
|
|
);
|
|
}
|
|
|
|
// Add any additional tools from config
|
|
if (config.generalTools) {
|
|
tools.push(...config.generalTools);
|
|
}
|
|
|
|
return tools;
|
|
}
|
|
|
|
/**
|
|
* Maps AI configuration to CreateLLMRequest
|
|
*/
|
|
static mapToCreateLLMRequest(
|
|
config: AIPhoneServiceConfiguration,
|
|
generalTools: RetellLLMGeneralTools
|
|
): CreateLLMRequest {
|
|
return {
|
|
general_prompt: config.generalPrompt,
|
|
begin_message: config.beginMessage,
|
|
general_tools: generalTools,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Maps AI configuration to CreateAgentRequest
|
|
*/
|
|
static mapToCreateAgentRequest(
|
|
llmId: string,
|
|
eventTypeId?: number,
|
|
voiceId = "11labs-Adrian"
|
|
): CreateAgentRequest {
|
|
return {
|
|
response_engine: { llm_id: llmId, type: "retell-llm" },
|
|
agent_name: `agent-${eventTypeId || "default"}-${Date.now()}`,
|
|
voice_id: voiceId,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Maps update model params to Retell format
|
|
*/
|
|
static mapToUpdateLLMRequest(
|
|
data: AIPhoneServiceUpdateModelParams<AIPhoneServiceProviderType.RETELL_AI>
|
|
): UpdateLLMRequest {
|
|
return {
|
|
general_prompt: data.general_prompt,
|
|
begin_message: data.begin_message,
|
|
general_tools: data.general_tools ?? undefined,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Maps agent update data to Retell format
|
|
*/
|
|
static mapToUpdateAgentRequest(data: {
|
|
agent_name?: string | null;
|
|
voice_id?: string;
|
|
language?: Language;
|
|
responsiveness?: number;
|
|
interruption_sensitivity?: number;
|
|
}): UpdateAgentRequest {
|
|
return data;
|
|
}
|
|
|
|
/**
|
|
* Maps phone number update data
|
|
*/
|
|
static mapPhoneNumberUpdateData(
|
|
inboundAgentId?: string | null,
|
|
outboundAgentId?: string | null
|
|
): { inbound_agent_id?: string | null; outbound_agent_id?: string | null } {
|
|
const updateData: { inbound_agent_id?: string | null; outbound_agent_id?: string | null } = {};
|
|
|
|
if (inboundAgentId !== undefined) {
|
|
updateData.inbound_agent_id = inboundAgentId;
|
|
}
|
|
|
|
if (outboundAgentId !== undefined) {
|
|
updateData.outbound_agent_id = outboundAgentId;
|
|
}
|
|
|
|
return updateData;
|
|
}
|
|
|
|
/**
|
|
* Format agent for listing response
|
|
*/
|
|
static formatAgentForList(agent: AgentWithDetailsData) {
|
|
return {
|
|
id: agent.id,
|
|
name: agent.name,
|
|
providerAgentId: agent.providerAgentId,
|
|
enabled: agent.enabled,
|
|
userId: agent.userId,
|
|
teamId: agent.teamId,
|
|
createdAt: agent.createdAt,
|
|
updatedAt: agent.updatedAt,
|
|
outboundPhoneNumbers: agent.outboundPhoneNumbers,
|
|
team: agent.team,
|
|
user: agent.user,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Format agent details response
|
|
*/
|
|
static formatAgentDetails(
|
|
agent: AgentWithDetailsData,
|
|
retellAgent: RetellAgent,
|
|
llmDetails: RetellLLM
|
|
): RetellAgentWithDetails {
|
|
return {
|
|
id: agent.id,
|
|
name: agent.name,
|
|
providerAgentId: agent.providerAgentId,
|
|
enabled: agent.enabled,
|
|
userId: agent.userId,
|
|
teamId: agent.teamId,
|
|
inboundEventTypeId: agent.inboundEventTypeId,
|
|
outboundEventTypeId: agent.outboundEventTypeId,
|
|
outboundPhoneNumbers: agent.outboundPhoneNumbers,
|
|
retellData: {
|
|
agentId: retellAgent.agent_id,
|
|
agentName: retellAgent.agent_name,
|
|
voiceId: retellAgent.voice_id,
|
|
responseEngine: retellAgent.response_engine,
|
|
language: retellAgent.language,
|
|
responsiveness: retellAgent.responsiveness,
|
|
interruptionSensitivity: retellAgent.interruption_sensitivity,
|
|
generalPrompt: llmDetails.general_prompt,
|
|
beginMessage: llmDetails.begin_message,
|
|
generalTools: llmDetails.general_tools,
|
|
llmId: llmDetails.llm_id,
|
|
},
|
|
createdAt: agent.createdAt,
|
|
updatedAt: agent.updatedAt,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Extract LLM update data from params
|
|
*/
|
|
static extractLLMUpdateData(
|
|
generalPrompt?: string | null,
|
|
beginMessage?: string | null,
|
|
generalTools?: AIPhoneServiceTools<AIPhoneServiceProviderType.RETELL_AI>
|
|
): UpdateLLMRequest {
|
|
return {
|
|
general_prompt: generalPrompt,
|
|
begin_message: beginMessage,
|
|
general_tools: generalTools,
|
|
};
|
|
}
|
|
}
|