elevenlabs-webhook-nodejs 1.0.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/.claude/settings.local.json +27 -0
- package/.dockerignore +6 -0
- package/.env.example +43 -0
- package/BEFORE-PRODUCTION.md +32 -0
- package/Dockerfile +23 -0
- package/SYSTEM_OVERVIEW.md +942 -0
- package/SYSTEM_STATUS.md +332 -0
- package/backup_script/main.py +146 -0
- package/baileys/.dockerignore +7 -0
- package/baileys/Dockerfile +13 -0
- package/baileys/README.md +412 -0
- package/baileys/index.js +499 -0
- package/baileys/package-lock.json +2532 -0
- package/baileys/package.json +25 -0
- package/baileys/server.js +96 -0
- package/baileys/src/config.js +55 -0
- package/baileys/src/middleware/api-key.js +16 -0
- package/baileys/src/routes/accounts.js +51 -0
- package/baileys/src/routes/chats.js +103 -0
- package/baileys/src/routes/webhooks.js +34 -0
- package/baileys/src/services/account-store.js +259 -0
- package/baileys/src/services/webhook-dispatcher.js +161 -0
- package/baileys/src/services/worker-manager.js +597 -0
- package/baileys/src/utils/jid.js +79 -0
- package/baileys/src/utils/logger.js +16 -0
- package/baileys/src/utils/use-mongodb-auth-state.js +122 -0
- package/baileys/worker.js +721 -0
- package/dist/app.d.ts +1 -0
- package/dist/app.js +84 -0
- package/dist/app.js.map +1 -0
- package/dist/config/agentPrompts.json +19 -0
- package/dist/config/database.d.ts +1 -0
- package/dist/config/database.js +26 -0
- package/dist/config/database.js.map +1 -0
- package/dist/config/env.d.ts +41 -0
- package/dist/config/env.js +81 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.js +73 -0
- package/dist/config/index.js.map +1 -0
- package/dist/controllers/webhook.controller.d.ts +10 -0
- package/dist/controllers/webhook.controller.js +128 -0
- package/dist/controllers/webhook.controller.js.map +1 -0
- package/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.js +13 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/hooks/webhookValidator.d.ts +2 -0
- package/dist/hooks/webhookValidator.js +47 -0
- package/dist/hooks/webhookValidator.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations/001_session-architecture.d.ts +3 -0
- package/dist/migrations/001_session-architecture.js +119 -0
- package/dist/migrations/001_session-architecture.js.map +1 -0
- package/dist/migrations/002_agent-ref.d.ts +3 -0
- package/dist/migrations/002_agent-ref.js +55 -0
- package/dist/migrations/002_agent-ref.js.map +1 -0
- package/dist/migrations/003_shift-schedule.d.ts +3 -0
- package/dist/migrations/003_shift-schedule.js +48 -0
- package/dist/migrations/003_shift-schedule.js.map +1 -0
- package/dist/migrations/004_invert-shift-to-clinic-hours.d.ts +3 -0
- package/dist/migrations/004_invert-shift-to-clinic-hours.js +27 -0
- package/dist/migrations/004_invert-shift-to-clinic-hours.js.map +1 -0
- package/dist/migrations/005_composite-baileys-chat-ids.d.ts +3 -0
- package/dist/migrations/005_composite-baileys-chat-ids.js +47 -0
- package/dist/migrations/005_composite-baileys-chat-ids.js.map +1 -0
- package/dist/migrations/migration.model.d.ts +18 -0
- package/dist/migrations/migration.model.js +45 -0
- package/dist/migrations/migration.model.js.map +1 -0
- package/dist/migrations/migration.routes.d.ts +2 -0
- package/dist/migrations/migration.routes.js +37 -0
- package/dist/migrations/migration.routes.js.map +1 -0
- package/dist/migrations/migration.runner.d.ts +19 -0
- package/dist/migrations/migration.runner.js +74 -0
- package/dist/migrations/migration.runner.js.map +1 -0
- package/dist/models/ConversationClaim.d.ts +13 -0
- package/dist/models/ConversationClaim.js +44 -0
- package/dist/models/ConversationClaim.js.map +1 -0
- package/dist/models/ConversationEvaluation.d.ts +23 -0
- package/dist/models/ConversationEvaluation.js +92 -0
- package/dist/models/ConversationEvaluation.js.map +1 -0
- package/dist/models/Summary.d.ts +37 -0
- package/dist/models/Summary.js +78 -0
- package/dist/models/Summary.js.map +1 -0
- package/dist/models/Transcription.d.ts +34 -0
- package/dist/models/Transcription.js +71 -0
- package/dist/models/Transcription.js.map +1 -0
- package/dist/models/WhatsAppRecipient.d.ts +23 -0
- package/dist/models/WhatsAppRecipient.js +53 -0
- package/dist/models/WhatsAppRecipient.js.map +1 -0
- package/dist/modules/admin/admin.routes.d.ts +2 -0
- package/dist/modules/admin/admin.routes.js +1966 -0
- package/dist/modules/admin/admin.routes.js.map +1 -0
- package/dist/modules/admin/elevenlabs-test-chat.routes.d.ts +2 -0
- package/dist/modules/admin/elevenlabs-test-chat.routes.js +158 -0
- package/dist/modules/admin/elevenlabs-test-chat.routes.js.map +1 -0
- package/dist/modules/admin/whatsapp-test-chat.routes.d.ts +2 -0
- package/dist/modules/admin/whatsapp-test-chat.routes.js +204 -0
- package/dist/modules/admin/whatsapp-test-chat.routes.js.map +1 -0
- package/dist/modules/agents/agent.model.d.ts +38 -0
- package/dist/modules/agents/agent.model.js +92 -0
- package/dist/modules/agents/agent.model.js.map +1 -0
- package/dist/modules/agents/agent.routes.d.ts +2 -0
- package/dist/modules/agents/agent.routes.js +61 -0
- package/dist/modules/agents/agent.routes.js.map +1 -0
- package/dist/modules/appointment-validation/appointment-validation.model.d.ts +76 -0
- package/dist/modules/appointment-validation/appointment-validation.model.js +118 -0
- package/dist/modules/appointment-validation/appointment-validation.model.js.map +1 -0
- package/dist/modules/appointment-validation/appointment-validation.routes.d.ts +2 -0
- package/dist/modules/appointment-validation/appointment-validation.routes.js +202 -0
- package/dist/modules/appointment-validation/appointment-validation.routes.js.map +1 -0
- package/dist/modules/appointment-validation/appointment-validation.service.d.ts +53 -0
- package/dist/modules/appointment-validation/appointment-validation.service.js +827 -0
- package/dist/modules/appointment-validation/appointment-validation.service.js.map +1 -0
- package/dist/modules/auth/auth.model.d.ts +17 -0
- package/dist/modules/auth/auth.model.js +64 -0
- package/dist/modules/auth/auth.model.js.map +1 -0
- package/dist/modules/auth/auth.routes.d.ts +2 -0
- package/dist/modules/auth/auth.routes.js +202 -0
- package/dist/modules/auth/auth.routes.js.map +1 -0
- package/dist/modules/auth/auth.service.d.ts +28 -0
- package/dist/modules/auth/auth.service.js +183 -0
- package/dist/modules/auth/auth.service.js.map +1 -0
- package/dist/modules/auth/refresh-token.model.d.ts +13 -0
- package/dist/modules/auth/refresh-token.model.js +52 -0
- package/dist/modules/auth/refresh-token.model.js.map +1 -0
- package/dist/modules/billing/billing-alert.model.d.ts +16 -0
- package/dist/modules/billing/billing-alert.model.js +47 -0
- package/dist/modules/billing/billing-alert.model.js.map +1 -0
- package/dist/modules/billing/billing-period-snapshot.model.d.ts +35 -0
- package/dist/modules/billing/billing-period-snapshot.model.js +68 -0
- package/dist/modules/billing/billing-period-snapshot.model.js.map +1 -0
- package/dist/modules/billing/billing.model.d.ts +18 -0
- package/dist/modules/billing/billing.model.js +62 -0
- package/dist/modules/billing/billing.model.js.map +1 -0
- package/dist/modules/billing/billing.routes.d.ts +2 -0
- package/dist/modules/billing/billing.routes.js +63 -0
- package/dist/modules/billing/billing.routes.js.map +1 -0
- package/dist/modules/billing/billing.service.d.ts +69 -0
- package/dist/modules/billing/billing.service.js +498 -0
- package/dist/modules/billing/billing.service.js.map +1 -0
- package/dist/modules/billing/payment.model.d.ts +24 -0
- package/dist/modules/billing/payment.model.js +57 -0
- package/dist/modules/billing/payment.model.js.map +1 -0
- package/dist/modules/calls/call.model.d.ts +41 -0
- package/dist/modules/calls/call.model.js +97 -0
- package/dist/modules/calls/call.model.js.map +1 -0
- package/dist/modules/calls/call.routes.d.ts +2 -0
- package/dist/modules/calls/call.routes.js +103 -0
- package/dist/modules/calls/call.routes.js.map +1 -0
- package/dist/modules/campaigns/campaign.model.d.ts +45 -0
- package/dist/modules/campaigns/campaign.model.js +98 -0
- package/dist/modules/campaigns/campaign.model.js.map +1 -0
- package/dist/modules/campaigns/campaign.routes.d.ts +2 -0
- package/dist/modules/campaigns/campaign.routes.js +323 -0
- package/dist/modules/campaigns/campaign.routes.js.map +1 -0
- package/dist/modules/campaigns/campaign.service.d.ts +11 -0
- package/dist/modules/campaigns/campaign.service.js +86 -0
- package/dist/modules/campaigns/campaign.service.js.map +1 -0
- package/dist/modules/google-calendar/google-calendar.routes.d.ts +2 -0
- package/dist/modules/google-calendar/google-calendar.routes.js +32 -0
- package/dist/modules/google-calendar/google-calendar.routes.js.map +1 -0
- package/dist/modules/inbound-call/inbound-call-config.model.d.ts +20 -0
- package/dist/modules/inbound-call/inbound-call-config.model.js +68 -0
- package/dist/modules/inbound-call/inbound-call-config.model.js.map +1 -0
- package/dist/modules/inbound-call/inbound-call.routes.d.ts +2 -0
- package/dist/modules/inbound-call/inbound-call.routes.js +243 -0
- package/dist/modules/inbound-call/inbound-call.routes.js.map +1 -0
- package/dist/modules/leads/lead.model.d.ts +24 -0
- package/dist/modules/leads/lead.model.js +54 -0
- package/dist/modules/leads/lead.model.js.map +1 -0
- package/dist/modules/leads/lead.routes.d.ts +2 -0
- package/dist/modules/leads/lead.routes.js +201 -0
- package/dist/modules/leads/lead.routes.js.map +1 -0
- package/dist/modules/plans/plan.model.d.ts +25 -0
- package/dist/modules/plans/plan.model.js +59 -0
- package/dist/modules/plans/plan.model.js.map +1 -0
- package/dist/modules/surveys/survey.model.d.ts +30 -0
- package/dist/modules/surveys/survey.model.js +75 -0
- package/dist/modules/surveys/survey.model.js.map +1 -0
- package/dist/modules/surveys/survey.routes.d.ts +2 -0
- package/dist/modules/surveys/survey.routes.js +153 -0
- package/dist/modules/surveys/survey.routes.js.map +1 -0
- package/dist/modules/tenants/tenant.model.d.ts +86 -0
- package/dist/modules/tenants/tenant.model.js +127 -0
- package/dist/modules/tenants/tenant.model.js.map +1 -0
- package/dist/modules/tenants/tenant.routes.d.ts +2 -0
- package/dist/modules/tenants/tenant.routes.js +65 -0
- package/dist/modules/tenants/tenant.routes.js.map +1 -0
- package/dist/modules/users/user.routes.d.ts +2 -0
- package/dist/modules/users/user.routes.js +106 -0
- package/dist/modules/users/user.routes.js.map +1 -0
- package/dist/modules/webhooks/elevenlabs-tool.routes.d.ts +20 -0
- package/dist/modules/webhooks/elevenlabs-tool.routes.js +85 -0
- package/dist/modules/webhooks/elevenlabs-tool.routes.js.map +1 -0
- package/dist/modules/webhooks/elevenlabs-tool.service.d.ts +11 -0
- package/dist/modules/webhooks/elevenlabs-tool.service.js +360 -0
- package/dist/modules/webhooks/elevenlabs-tool.service.js.map +1 -0
- package/dist/modules/webhooks/elevenlabs.routes.d.ts +2 -0
- package/dist/modules/webhooks/elevenlabs.routes.js +34 -0
- package/dist/modules/webhooks/elevenlabs.routes.js.map +1 -0
- package/dist/modules/webhooks/elevenlabs.service.d.ts +6 -0
- package/dist/modules/webhooks/elevenlabs.service.js +512 -0
- package/dist/modules/webhooks/elevenlabs.service.js.map +1 -0
- package/dist/modules/webhooks/unipile.routes.d.ts +2 -0
- package/dist/modules/webhooks/unipile.routes.js +780 -0
- package/dist/modules/webhooks/unipile.routes.js.map +1 -0
- package/dist/modules/whatsapp/appointment.model.d.ts +27 -0
- package/dist/modules/whatsapp/appointment.model.js +58 -0
- package/dist/modules/whatsapp/appointment.model.js.map +1 -0
- package/dist/modules/whatsapp/operator-request.model.d.ts +29 -0
- package/dist/modules/whatsapp/operator-request.model.js +65 -0
- package/dist/modules/whatsapp/operator-request.model.js.map +1 -0
- package/dist/modules/whatsapp/stt-usage.model.d.ts +16 -0
- package/dist/modules/whatsapp/stt-usage.model.js +53 -0
- package/dist/modules/whatsapp/stt-usage.model.js.map +1 -0
- package/dist/modules/whatsapp/whatsapp-chat.model.d.ts +23 -0
- package/dist/modules/whatsapp/whatsapp-chat.model.js +55 -0
- package/dist/modules/whatsapp/whatsapp-chat.model.js.map +1 -0
- package/dist/modules/whatsapp/whatsapp-contact-profile.model.d.ts +23 -0
- package/dist/modules/whatsapp/whatsapp-contact-profile.model.js +54 -0
- package/dist/modules/whatsapp/whatsapp-contact-profile.model.js.map +1 -0
- package/dist/modules/whatsapp/whatsapp-message.model.d.ts +30 -0
- package/dist/modules/whatsapp/whatsapp-message.model.js +52 -0
- package/dist/modules/whatsapp/whatsapp-message.model.js.map +1 -0
- package/dist/modules/whatsapp/whatsapp-session.model.d.ts +33 -0
- package/dist/modules/whatsapp/whatsapp-session.model.js +65 -0
- package/dist/modules/whatsapp/whatsapp-session.model.js.map +1 -0
- package/dist/modules/whatsapp/whatsapp.routes.d.ts +2 -0
- package/dist/modules/whatsapp/whatsapp.routes.js +1237 -0
- package/dist/modules/whatsapp/whatsapp.routes.js.map +1 -0
- package/dist/plugins/cors.d.ts +3 -0
- package/dist/plugins/cors.js +11 -0
- package/dist/plugins/cors.js.map +1 -0
- package/dist/plugins/jwt.d.ts +3 -0
- package/dist/plugins/jwt.js +22 -0
- package/dist/plugins/jwt.js.map +1 -0
- package/dist/plugins/rawBody.d.ts +3 -0
- package/dist/plugins/rawBody.js +16 -0
- package/dist/plugins/rawBody.js.map +1 -0
- package/dist/plugins/rbac.d.ts +5 -0
- package/dist/plugins/rbac.js +29 -0
- package/dist/plugins/rbac.js.map +1 -0
- package/dist/routes/admin.routes.d.ts +2 -0
- package/dist/routes/admin.routes.js +169 -0
- package/dist/routes/admin.routes.js.map +1 -0
- package/dist/routes/health.routes.d.ts +2 -0
- package/dist/routes/health.routes.js +16 -0
- package/dist/routes/health.routes.js.map +1 -0
- package/dist/routes/webhook.routes.d.ts +2 -0
- package/dist/routes/webhook.routes.js +17 -0
- package/dist/routes/webhook.routes.js.map +1 -0
- package/dist/services/ai/base.ai.d.ts +19 -0
- package/dist/services/ai/base.ai.js +120 -0
- package/dist/services/ai/base.ai.js.map +1 -0
- package/dist/services/ai/gemini.service.d.ts +11 -0
- package/dist/services/ai/gemini.service.js +43 -0
- package/dist/services/ai/gemini.service.js.map +1 -0
- package/dist/services/ai/index.d.ts +2 -0
- package/dist/services/ai/index.js +26 -0
- package/dist/services/ai/index.js.map +1 -0
- package/dist/services/ai/openai.service.d.ts +11 -0
- package/dist/services/ai/openai.service.js +50 -0
- package/dist/services/ai/openai.service.js.map +1 -0
- package/dist/services/elevenlabs.service.d.ts +52 -0
- package/dist/services/elevenlabs.service.js +447 -0
- package/dist/services/elevenlabs.service.js.map +1 -0
- package/dist/services/google-calendar.service.d.ts +60 -0
- package/dist/services/google-calendar.service.js +494 -0
- package/dist/services/google-calendar.service.js.map +1 -0
- package/dist/services/inbound-call-schedule.service.d.ts +11 -0
- package/dist/services/inbound-call-schedule.service.js +162 -0
- package/dist/services/inbound-call-schedule.service.js.map +1 -0
- package/dist/services/netgsm.service.d.ts +41 -0
- package/dist/services/netgsm.service.js +89 -0
- package/dist/services/netgsm.service.js.map +1 -0
- package/dist/services/unipile.service.d.ts +41 -0
- package/dist/services/unipile.service.js +149 -0
- package/dist/services/unipile.service.js.map +1 -0
- package/dist/services/whatsapp-agent.service.d.ts +139 -0
- package/dist/services/whatsapp-agent.service.js +2055 -0
- package/dist/services/whatsapp-agent.service.js.map +1 -0
- package/dist/services/whatsapp.service.d.ts +26 -0
- package/dist/services/whatsapp.service.js +206 -0
- package/dist/services/whatsapp.service.js.map +1 -0
- package/dist/templates/index.d.ts +39 -0
- package/dist/templates/index.js +35 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/receptionist.d.ts +2 -0
- package/dist/templates/receptionist.js +39 -0
- package/dist/templates/receptionist.js.map +1 -0
- package/dist/templates/survey.d.ts +2 -0
- package/dist/templates/survey.js +41 -0
- package/dist/templates/survey.js.map +1 -0
- package/dist/types/index.d.ts +173 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.js +105 -0
- package/dist/utils/logger.js.map +1 -0
- package/docker-compose.nestjs.yml +89 -0
- package/docker-compose.yml +78 -0
- package/docs/AI_AGENT_ENHANCEMENT_PLAN.md +164 -0
- package/docs/API.md +1193 -0
- package/docs/API_ENDPOINTS.md +344 -0
- package/docs/ARCHITECTURE.md +305 -0
- package/docs/AUTH_API.md +252 -0
- package/docs/BILLING_SMS_ALERTS.md +94 -0
- package/docs/CHAT_ASSIGNMENT_SYSTEM.md +118 -0
- package/docs/CLIENT_TOOLS_AND_FEATURES.md +337 -0
- package/docs/ELEVENLABS_WEBHOOK_TOOLS.md +644 -0
- package/docs/FRONTEND_CHECKLIST.md +227 -0
- package/docs/IMPLEMENTATION_STATUS.md +470 -0
- package/docs/MIGRATION_GUIDE.md +96 -0
- package/docs/MISSINGS_REPORT.md +507 -0
- package/docs/NESTJS_MIGRATION_REFERENCE.md +5136 -0
- package/docs/PROJECT_DESCRIPTION.md +1038 -0
- package/docs/SCALING.md +148 -0
- package/docs/SESSION_SUMMARY_2026_03_17.md +135 -0
- package/docs/WHATSAPP_AGENT.md +1086 -0
- package/docs/architecture/00-SYSTEM-OVERVIEW.md +318 -0
- package/docs/architecture/01-DATABASE-SCHEMA.md +2564 -0
- package/docs/architecture/02-AUTHENTICATION.md +1040 -0
- package/docs/architecture/03-MULTI-CLINIC.md +742 -0
- package/docs/architecture/04-WHATSAPP-AGENT.md +608 -0
- package/docs/architecture/05-OPERATOR-WORKFLOW.md +444 -0
- package/docs/architecture/06-BAILEYS-MICROSERVICE.md +616 -0
- package/docs/architecture/07-APPOINTMENTS.md +849 -0
- package/docs/architecture/08-VOICE-CALLS.md +470 -0
- package/docs/architecture/09-OUTBOUND-CAMPAIGNS.md +542 -0
- package/docs/architecture/10-CLIENT-TOOLS.md +665 -0
- package/docs/architecture/11-BILLING.md +458 -0
- package/docs/architecture/12-SECURITY.md +216 -0
- package/docs/architecture/13-LOGGING-AUDIT.md +549 -0
- package/docs/architecture/14-META-BUSINESS-API.md +454 -0
- package/docs/architecture/15-AI-MODULE.md +479 -0
- package/docs/architecture/16-BACKGROUND-JOBS.md +469 -0
- package/docs/architecture/17-REALTIME-LIVECHAT.md +447 -0
- package/docs/architecture/18-FILE-STORAGE.md +410 -0
- package/docs/architecture/19-PATIENTS.md +1034 -0
- package/docs/architecture/20-TREATMENTS-AND-PLANS.md +774 -0
- package/docs/architecture/21-BEFORE-AFTER-PHOTOS.md +519 -0
- package/docs/database.md +456 -0
- package/docs/ornek-randevu-onay.csv +3 -0
- package/ecosystem.config.js +16 -0
- package/elevenlabs-convai-api-reference.md +1171 -0
- package/frontend/.dockerignore +2 -0
- package/frontend/Dockerfile +24 -0
- package/frontend/README.md +75 -0
- package/frontend/components.json +25 -0
- package/frontend/eslint.config.js +23 -0
- package/frontend/index.html +13 -0
- package/frontend/nginx.conf +37 -0
- package/frontend/package-lock.json +8709 -0
- package/frontend/package.json +71 -0
- package/frontend/public/favicon.svg +1 -0
- package/frontend/public/icons.svg +24 -0
- package/frontend/src/App.tsx +125 -0
- package/frontend/src/components/error-boundary.tsx +50 -0
- package/frontend/src/components/shared/activity-timeline.tsx +66 -0
- package/frontend/src/components/shared/appointment-calendar.css +80 -0
- package/frontend/src/components/shared/appointment-calendar.tsx +245 -0
- package/frontend/src/components/shared/chat-bubble.tsx +72 -0
- package/frontend/src/components/shared/combobox.tsx +119 -0
- package/frontend/src/components/shared/confirm-dialog.tsx +57 -0
- package/frontend/src/components/shared/data-table-pagination.tsx +97 -0
- package/frontend/src/components/shared/data-table-toolbar.tsx +39 -0
- package/frontend/src/components/shared/empty-state.tsx +27 -0
- package/frontend/src/components/shared/file-upload.tsx +140 -0
- package/frontend/src/components/shared/index.ts +20 -0
- package/frontend/src/components/shared/language-switcher.tsx +29 -0
- package/frontend/src/components/shared/notification-dropdown.tsx +115 -0
- package/frontend/src/components/shared/page-header.tsx +23 -0
- package/frontend/src/components/shared/stat-card.tsx +37 -0
- package/frontend/src/components/shared/status-badge.tsx +70 -0
- package/frontend/src/components/shared/status-dot.tsx +43 -0
- package/frontend/src/components/ui/alert-dialog.tsx +187 -0
- package/frontend/src/components/ui/alert.tsx +76 -0
- package/frontend/src/components/ui/avatar.tsx +109 -0
- package/frontend/src/components/ui/badge.tsx +52 -0
- package/frontend/src/components/ui/breadcrumb.tsx +125 -0
- package/frontend/src/components/ui/button.tsx +60 -0
- package/frontend/src/components/ui/calendar.tsx +219 -0
- package/frontend/src/components/ui/card.tsx +103 -0
- package/frontend/src/components/ui/chart.tsx +371 -0
- package/frontend/src/components/ui/checkbox.tsx +29 -0
- package/frontend/src/components/ui/collapsible.tsx +19 -0
- package/frontend/src/components/ui/command.tsx +194 -0
- package/frontend/src/components/ui/dialog.tsx +158 -0
- package/frontend/src/components/ui/dropdown-menu.tsx +268 -0
- package/frontend/src/components/ui/input-group.tsx +156 -0
- package/frontend/src/components/ui/input.tsx +20 -0
- package/frontend/src/components/ui/label.tsx +20 -0
- package/frontend/src/components/ui/pagination.tsx +130 -0
- package/frontend/src/components/ui/popover.tsx +90 -0
- package/frontend/src/components/ui/progress.tsx +83 -0
- package/frontend/src/components/ui/radio-group.tsx +36 -0
- package/frontend/src/components/ui/scroll-area.tsx +54 -0
- package/frontend/src/components/ui/select.tsx +199 -0
- package/frontend/src/components/ui/separator.tsx +23 -0
- package/frontend/src/components/ui/sheet.tsx +138 -0
- package/frontend/src/components/ui/sidebar.tsx +723 -0
- package/frontend/src/components/ui/skeleton.tsx +13 -0
- package/frontend/src/components/ui/sonner.tsx +47 -0
- package/frontend/src/components/ui/switch.tsx +30 -0
- package/frontend/src/components/ui/table.tsx +114 -0
- package/frontend/src/components/ui/tabs.tsx +82 -0
- package/frontend/src/components/ui/textarea.tsx +18 -0
- package/frontend/src/components/ui/toggle-group.tsx +89 -0
- package/frontend/src/components/ui/toggle.tsx +43 -0
- package/frontend/src/components/ui/tooltip.tsx +64 -0
- package/frontend/src/hooks/use-mobile.ts +19 -0
- package/frontend/src/i18n/index.ts +20 -0
- package/frontend/src/i18n/locales/en.json +786 -0
- package/frontend/src/i18n/locales/tr.json +786 -0
- package/frontend/src/index.css +134 -0
- package/frontend/src/layouts/admin-layout.tsx +111 -0
- package/frontend/src/layouts/app-header.tsx +130 -0
- package/frontend/src/layouts/app-layout.tsx +19 -0
- package/frontend/src/layouts/app-sidebar.tsx +212 -0
- package/frontend/src/layouts/auth-guard.tsx +31 -0
- package/frontend/src/layouts/mobile-sidebar.tsx +120 -0
- package/frontend/src/lib/api.ts +68 -0
- package/frontend/src/lib/hooks/use-appointments.ts +224 -0
- package/frontend/src/lib/hooks/use-availability-blocks.ts +83 -0
- package/frontend/src/lib/hooks/use-chats.ts +236 -0
- package/frontend/src/lib/hooks/use-clinic-detail.ts +171 -0
- package/frontend/src/lib/hooks/use-clinics.ts +37 -0
- package/frontend/src/lib/hooks/use-doctor-calendar.ts +80 -0
- package/frontend/src/lib/hooks/use-examinations.ts +89 -0
- package/frontend/src/lib/hooks/use-medical-history.ts +52 -0
- package/frontend/src/lib/hooks/use-patients.ts +296 -0
- package/frontend/src/lib/hooks/use-photo-sets.ts +118 -0
- package/frontend/src/lib/hooks/use-treatment-plans.ts +152 -0
- package/frontend/src/lib/hooks/use-treatments.ts +125 -0
- package/frontend/src/lib/hooks/use-users.ts +172 -0
- package/frontend/src/lib/utils.ts +6 -0
- package/frontend/src/main.tsx +17 -0
- package/frontend/src/pages/admin/agents/detail.tsx +774 -0
- package/frontend/src/pages/admin/agents/import.tsx +280 -0
- package/frontend/src/pages/admin/agents/index.tsx +245 -0
- package/frontend/src/pages/admin/ai-playground.tsx +543 -0
- package/frontend/src/pages/appointments/create-appointment-dialog.tsx +390 -0
- package/frontend/src/pages/appointments/index.tsx +860 -0
- package/frontend/src/pages/audit/index.tsx +24 -0
- package/frontend/src/pages/auth/login.tsx +194 -0
- package/frontend/src/pages/billing/index.tsx +24 -0
- package/frontend/src/pages/calendar/index.tsx +704 -0
- package/frontend/src/pages/calendar-connections/index.tsx +295 -0
- package/frontend/src/pages/calls/index.tsx +24 -0
- package/frontend/src/pages/campaigns/index.tsx +24 -0
- package/frontend/src/pages/chats/index.tsx +981 -0
- package/frontend/src/pages/clinics/index.tsx +224 -0
- package/frontend/src/pages/clinics/settings.tsx +412 -0
- package/frontend/src/pages/components-showcase.tsx +773 -0
- package/frontend/src/pages/connections/index.tsx +328 -0
- package/frontend/src/pages/dashboard.tsx +50 -0
- package/frontend/src/pages/leads/index.tsx +24 -0
- package/frontend/src/pages/my-schedule/index.tsx +496 -0
- package/frontend/src/pages/patients/create-patient-dialog.tsx +358 -0
- package/frontend/src/pages/patients/detail.tsx +1195 -0
- package/frontend/src/pages/patients/edit-patient-dialog.tsx +387 -0
- package/frontend/src/pages/patients/examinations-tab.tsx +460 -0
- package/frontend/src/pages/patients/index.tsx +381 -0
- package/frontend/src/pages/patients/medical-history-dialog.tsx +207 -0
- package/frontend/src/pages/patients/photo-sets-tab.tsx +616 -0
- package/frontend/src/pages/patients/timeline-tab.tsx +164 -0
- package/frontend/src/pages/patients/treatment-plans-tab.tsx +598 -0
- package/frontend/src/pages/phone-numbers/detail.tsx +427 -0
- package/frontend/src/pages/phone-numbers/index.tsx +455 -0
- package/frontend/src/pages/platform/index.tsx +454 -0
- package/frontend/src/pages/settings/index.tsx +126 -0
- package/frontend/src/pages/treatments/index.tsx +487 -0
- package/frontend/src/pages/users/doctor-profile.tsx +672 -0
- package/frontend/src/pages/users/edit.tsx +329 -0
- package/frontend/src/pages/users/index.tsx +407 -0
- package/frontend/src/pages/validation/index.tsx +24 -0
- package/frontend/src/stores/auth.store.ts +108 -0
- package/frontend/src/stores/ui.store.ts +41 -0
- package/frontend/tsconfig.app.json +32 -0
- package/frontend/tsconfig.json +13 -0
- package/frontend/tsconfig.node.json +26 -0
- package/frontend/vite.config.ts +29 -0
- package/nestjs/.dockerignore +5 -0
- package/nestjs/.env.docker +64 -0
- package/nestjs/.prettierrc +4 -0
- package/nestjs/Dockerfile +36 -0
- package/nestjs/README.md +98 -0
- package/nestjs/eslint.config.mjs +35 -0
- package/nestjs/nest-cli.json +8 -0
- package/nestjs/package-lock.json +13390 -0
- package/nestjs/package.json +114 -0
- package/nestjs/prisma/migrations/20260409161536_add_message_metadata_fields/migration.sql +1746 -0
- package/nestjs/prisma/migrations/20260410140436_add_agent_ai_fields/migration.sql +36 -0
- package/nestjs/prisma/migrations/20260410175519_add_agent_clinic_assignments/migration.sql +21 -0
- package/nestjs/prisma/migrations/20260412094344_make_agent_tenant_optional/migration.sql +2 -0
- package/nestjs/prisma/migrations/20260412110008_add_admin_chat_sessions/migration.sql +47 -0
- package/nestjs/prisma/migrations/migration_lock.toml +3 -0
- package/nestjs/prisma/schema.prisma +1843 -0
- package/nestjs/prisma/seed.ts +375 -0
- package/nestjs/prisma.config.ts +14 -0
- package/nestjs/src/admin/admin.controller.ts +27 -0
- package/nestjs/src/admin/admin.module.ts +16 -0
- package/nestjs/src/admin/admin.service.ts +91 -0
- package/nestjs/src/admin/ai-chat-session.service.ts +454 -0
- package/nestjs/src/admin/ai-test.controller.ts +191 -0
- package/nestjs/src/admin/superadmin.controller.ts +106 -0
- package/nestjs/src/agents/agents.controller.ts +262 -0
- package/nestjs/src/agents/agents.module.ts +13 -0
- package/nestjs/src/agents/agents.service.ts +733 -0
- package/nestjs/src/agents/dto/create-agent.dto.ts +99 -0
- package/nestjs/src/agents/dto/index.ts +2 -0
- package/nestjs/src/agents/dto/update-agent.dto.ts +148 -0
- package/nestjs/src/app.module.ts +115 -0
- package/nestjs/src/appointment-validation/appointment-validation.controller.ts +194 -0
- package/nestjs/src/appointment-validation/appointment-validation.module.ts +16 -0
- package/nestjs/src/appointment-validation/appointment-validation.service.ts +450 -0
- package/nestjs/src/appointment-validation/dto/create-batch.dto.ts +105 -0
- package/nestjs/src/appointment-validation/dto/index.ts +1 -0
- package/nestjs/src/appointment-validation/processors/validation-dispatch.processor.ts +26 -0
- package/nestjs/src/appointment-validation/processors/validation-sync.processor.ts +23 -0
- package/nestjs/src/appointments/appointments.controller.ts +268 -0
- package/nestjs/src/appointments/appointments.module.ts +13 -0
- package/nestjs/src/appointments/appointments.service.ts +773 -0
- package/nestjs/src/appointments/dto/create-appointment.dto.ts +72 -0
- package/nestjs/src/appointments/dto/index.ts +4 -0
- package/nestjs/src/appointments/dto/query-appointments.dto.ts +60 -0
- package/nestjs/src/appointments/dto/update-appointment.dto.ts +43 -0
- package/nestjs/src/appointments/dto/update-status.dto.ts +18 -0
- package/nestjs/src/appointments/processors/reminder.processor.ts +243 -0
- package/nestjs/src/audit/audit.controller.ts +84 -0
- package/nestjs/src/audit/audit.decorator.ts +20 -0
- package/nestjs/src/audit/audit.interceptor.ts +67 -0
- package/nestjs/src/audit/audit.interfaces.ts +15 -0
- package/nestjs/src/audit/audit.module.ts +12 -0
- package/nestjs/src/audit/audit.service.ts +177 -0
- package/nestjs/src/auth/auth.controller.ts +116 -0
- package/nestjs/src/auth/auth.module.ts +25 -0
- package/nestjs/src/auth/auth.service.ts +612 -0
- package/nestjs/src/auth/dto/change-password.dto.ts +13 -0
- package/nestjs/src/auth/dto/forgot-password.dto.ts +8 -0
- package/nestjs/src/auth/dto/index.ts +6 -0
- package/nestjs/src/auth/dto/login.dto.ts +13 -0
- package/nestjs/src/auth/dto/refresh.dto.ts +8 -0
- package/nestjs/src/auth/dto/register.dto.ts +28 -0
- package/nestjs/src/auth/dto/reset-password.dto.ts +13 -0
- package/nestjs/src/auth/permissions.config.ts +85 -0
- package/nestjs/src/availability-blocks/availability-blocks.controller.ts +83 -0
- package/nestjs/src/availability-blocks/availability-blocks.module.ts +10 -0
- package/nestjs/src/availability-blocks/availability-blocks.service.ts +202 -0
- package/nestjs/src/billing/billing.controller.ts +104 -0
- package/nestjs/src/billing/billing.module.ts +12 -0
- package/nestjs/src/billing/billing.service.ts +398 -0
- package/nestjs/src/billing/dto/index.ts +2 -0
- package/nestjs/src/billing/dto/query-billing.dto.ts +29 -0
- package/nestjs/src/billing/dto/record-payment.dto.ts +60 -0
- package/nestjs/src/billing/processors/alerts.processor.ts +216 -0
- package/nestjs/src/billing/processors/snapshot.processor.ts +181 -0
- package/nestjs/src/calls/calls.controller.ts +92 -0
- package/nestjs/src/calls/calls.module.ts +10 -0
- package/nestjs/src/calls/calls.service.ts +359 -0
- package/nestjs/src/calls/dto/index.ts +1 -0
- package/nestjs/src/calls/dto/query-calls.dto.ts +46 -0
- package/nestjs/src/clinics/clinics.controller.ts +226 -0
- package/nestjs/src/clinics/clinics.module.ts +11 -0
- package/nestjs/src/clinics/clinics.service.ts +203 -0
- package/nestjs/src/clinics/dto/create-clinic.dto.ts +40 -0
- package/nestjs/src/clinics/dto/create-meta-connection.dto.ts +44 -0
- package/nestjs/src/clinics/dto/index.ts +4 -0
- package/nestjs/src/clinics/dto/update-clinic.dto.ts +133 -0
- package/nestjs/src/clinics/dto/update-meta-connection.dto.ts +22 -0
- package/nestjs/src/clinics/meta-connections.service.ts +210 -0
- package/nestjs/src/common/decorators/accessible-clinics.decorator.ts +9 -0
- package/nestjs/src/common/decorators/current-user.decorator.ts +10 -0
- package/nestjs/src/common/decorators/features.decorator.ts +7 -0
- package/nestjs/src/common/decorators/index.ts +4 -0
- package/nestjs/src/common/decorators/permissions.decorator.ts +13 -0
- package/nestjs/src/common/gateways/events.gateway.ts +157 -0
- package/nestjs/src/common/guards/clinic-access.guard.ts +40 -0
- package/nestjs/src/common/guards/features.guard.ts +38 -0
- package/nestjs/src/common/guards/index.ts +5 -0
- package/nestjs/src/common/guards/jwt-auth.guard.ts +54 -0
- package/nestjs/src/common/guards/permissions.guard.ts +50 -0
- package/nestjs/src/common/guards/superadmin.guard.ts +35 -0
- package/nestjs/src/common/interceptors/request-context.interceptor.ts +32 -0
- package/nestjs/src/common/interceptors/superadmin-tenant.interceptor.ts +42 -0
- package/nestjs/src/common/interfaces/jwt-payload.interface.ts +11 -0
- package/nestjs/src/config/config.module.ts +13 -0
- package/nestjs/src/database/database.module.ts +9 -0
- package/nestjs/src/database/prisma.service.ts +20 -0
- package/nestjs/src/database/tenant-context.ts +27 -0
- package/nestjs/src/google-calendar/google-calendar.controller.ts +259 -0
- package/nestjs/src/google-calendar/google-calendar.module.ts +10 -0
- package/nestjs/src/google-calendar/google-calendar.service.ts +811 -0
- package/nestjs/src/integrations/ai/ai.interface.ts +74 -0
- package/nestjs/src/integrations/ai/ai.module.ts +11 -0
- package/nestjs/src/integrations/ai/ai.service.ts +148 -0
- package/nestjs/src/integrations/ai/providers/anthropic.provider.ts +146 -0
- package/nestjs/src/integrations/ai/providers/openai.provider.ts +158 -0
- package/nestjs/src/integrations/elevenlabs/elevenlabs.module.ts +8 -0
- package/nestjs/src/integrations/elevenlabs/elevenlabs.service.ts +226 -0
- package/nestjs/src/integrations/encryption/encryption.module.ts +9 -0
- package/nestjs/src/integrations/encryption/encryption.service.ts +31 -0
- package/nestjs/src/integrations/image/image.module.ts +9 -0
- package/nestjs/src/integrations/image/image.service.ts +61 -0
- package/nestjs/src/integrations/meta-business/meta-business.module.ts +10 -0
- package/nestjs/src/integrations/meta-business/meta-instagram.service.ts +94 -0
- package/nestjs/src/integrations/meta-business/meta-webhook.service.ts +52 -0
- package/nestjs/src/integrations/meta-business/meta-whatsapp.service.ts +254 -0
- package/nestjs/src/integrations/minio/minio.module.ts +9 -0
- package/nestjs/src/integrations/minio/minio.service.ts +88 -0
- package/nestjs/src/integrations/netgsm/netgsm.module.ts +8 -0
- package/nestjs/src/integrations/netgsm/netgsm.service.ts +17 -0
- package/nestjs/src/integrations/tektippay/tektippay.module.ts +8 -0
- package/nestjs/src/integrations/tektippay/tektippay.service.ts +23 -0
- package/nestjs/src/leads/dto/index.ts +2 -0
- package/nestjs/src/leads/dto/query-leads.dto.ts +50 -0
- package/nestjs/src/leads/dto/update-lead.dto.ts +26 -0
- package/nestjs/src/leads/leads.controller.ts +184 -0
- package/nestjs/src/leads/leads.module.ts +10 -0
- package/nestjs/src/leads/leads.service.ts +375 -0
- package/nestjs/src/logging/logging.controller.ts +82 -0
- package/nestjs/src/logging/logging.module.ts +11 -0
- package/nestjs/src/logging/logging.service.ts +180 -0
- package/nestjs/src/main.ts +86 -0
- package/nestjs/src/outbound-campaigns/dto/create-campaign.dto.ts +47 -0
- package/nestjs/src/outbound-campaigns/dto/index.ts +3 -0
- package/nestjs/src/outbound-campaigns/dto/update-campaign.dto.ts +31 -0
- package/nestjs/src/outbound-campaigns/dto/upload-entries.dto.ts +35 -0
- package/nestjs/src/outbound-campaigns/outbound-campaigns.controller.ts +307 -0
- package/nestjs/src/outbound-campaigns/outbound-campaigns.module.ts +13 -0
- package/nestjs/src/outbound-campaigns/outbound-campaigns.service.ts +471 -0
- package/nestjs/src/outbound-campaigns/processors/campaign-dispatch.processor.ts +366 -0
- package/nestjs/src/patients/documents.service.ts +231 -0
- package/nestjs/src/patients/dto/create-examination.dto.ts +34 -0
- package/nestjs/src/patients/dto/create-note.dto.ts +14 -0
- package/nestjs/src/patients/dto/create-patient.dto.ts +86 -0
- package/nestjs/src/patients/dto/create-photo-set.dto.ts +32 -0
- package/nestjs/src/patients/dto/index.ts +10 -0
- package/nestjs/src/patients/dto/update-examination.dto.ts +29 -0
- package/nestjs/src/patients/dto/update-medical-history.dto.ts +47 -0
- package/nestjs/src/patients/dto/update-patient.dto.ts +87 -0
- package/nestjs/src/patients/dto/update-photo-set.dto.ts +28 -0
- package/nestjs/src/patients/dto/upload-document.dto.ts +31 -0
- package/nestjs/src/patients/dto/upload-photo.dto.ts +27 -0
- package/nestjs/src/patients/examinations.service.ts +271 -0
- package/nestjs/src/patients/medical-history.service.ts +149 -0
- package/nestjs/src/patients/notes.service.ts +172 -0
- package/nestjs/src/patients/patients.controller.ts +485 -0
- package/nestjs/src/patients/patients.module.ts +22 -0
- package/nestjs/src/patients/patients.service.ts +412 -0
- package/nestjs/src/patients/photo-sets.service.ts +389 -0
- package/nestjs/src/phone-numbers/dto/create-phone-number.dto.ts +57 -0
- package/nestjs/src/phone-numbers/dto/index.ts +3 -0
- package/nestjs/src/phone-numbers/dto/update-phone-number.dto.ts +38 -0
- package/nestjs/src/phone-numbers/dto/update-schedule.dto.ts +39 -0
- package/nestjs/src/phone-numbers/phone-numbers.controller.ts +125 -0
- package/nestjs/src/phone-numbers/phone-numbers.module.ts +10 -0
- package/nestjs/src/phone-numbers/phone-numbers.service.ts +209 -0
- package/nestjs/src/plans/dto/create-plan.dto.ts +70 -0
- package/nestjs/src/plans/dto/index.ts +2 -0
- package/nestjs/src/plans/dto/update-plan.dto.ts +80 -0
- package/nestjs/src/plans/plans.controller.ts +50 -0
- package/nestjs/src/plans/plans.module.ts +10 -0
- package/nestjs/src/plans/plans.service.ts +115 -0
- package/nestjs/src/platform/dto/create-tenant.dto.ts +36 -0
- package/nestjs/src/platform/dto/index.ts +2 -0
- package/nestjs/src/platform/dto/update-tenant-platform.dto.ts +44 -0
- package/nestjs/src/platform/platform.controller.ts +79 -0
- package/nestjs/src/platform/platform.module.ts +10 -0
- package/nestjs/src/platform/platform.service.ts +301 -0
- package/nestjs/src/queue/queue.module.ts +56 -0
- package/nestjs/src/redis/redis.module.ts +20 -0
- package/nestjs/src/tenants/dto/index.ts +1 -0
- package/nestjs/src/tenants/dto/update-tenant.dto.ts +15 -0
- package/nestjs/src/tenants/tenants.controller.ts +45 -0
- package/nestjs/src/tenants/tenants.module.ts +10 -0
- package/nestjs/src/tenants/tenants.service.ts +41 -0
- package/nestjs/src/tools/adapters/elevenlabs-http.adapter.ts +51 -0
- package/nestjs/src/tools/adapters/elevenlabs-ws.adapter.ts +59 -0
- package/nestjs/src/tools/handlers/calendar.tools.ts +441 -0
- package/nestjs/src/tools/handlers/notification.tools.ts +34 -0
- package/nestjs/src/tools/handlers/operator.tools.ts +303 -0
- package/nestjs/src/tools/handlers/patient.tools.ts +242 -0
- package/nestjs/src/tools/handlers/payment.tools.ts +43 -0
- package/nestjs/src/tools/handlers/validation.tools.ts +152 -0
- package/nestjs/src/tools/tool-registry.service.ts +221 -0
- package/nestjs/src/tools/tool.decorator.ts +16 -0
- package/nestjs/src/tools/tool.interfaces.ts +26 -0
- package/nestjs/src/tools/tools.module.ts +50 -0
- package/nestjs/src/treatments/dto/create-plan-item.dto.ts +27 -0
- package/nestjs/src/treatments/dto/create-treatment-plan.dto.ts +69 -0
- package/nestjs/src/treatments/dto/create-treatment.dto.ts +59 -0
- package/nestjs/src/treatments/dto/index.ts +6 -0
- package/nestjs/src/treatments/dto/update-plan-item.dto.ts +23 -0
- package/nestjs/src/treatments/dto/update-treatment-plan.dto.ts +22 -0
- package/nestjs/src/treatments/dto/update-treatment.dto.ts +70 -0
- package/nestjs/src/treatments/treatment-plans.service.ts +362 -0
- package/nestjs/src/treatments/treatments.controller.ts +265 -0
- package/nestjs/src/treatments/treatments.module.ts +14 -0
- package/nestjs/src/treatments/treatments.service.ts +165 -0
- package/nestjs/src/users/doctor-profiles.service.ts +202 -0
- package/nestjs/src/users/dto/index.ts +4 -0
- package/nestjs/src/users/dto/invite-user.dto.ts +52 -0
- package/nestjs/src/users/dto/update-clinic-assignments.dto.ts +9 -0
- package/nestjs/src/users/dto/update-doctor-profile.dto.ts +49 -0
- package/nestjs/src/users/dto/update-user.dto.ts +41 -0
- package/nestjs/src/users/users.controller.ts +142 -0
- package/nestjs/src/users/users.module.ts +11 -0
- package/nestjs/src/users/users.service.ts +250 -0
- package/nestjs/src/webhooks/elevenlabs-tool.controller.ts +66 -0
- package/nestjs/src/webhooks/elevenlabs-webhook.controller.ts +60 -0
- package/nestjs/src/webhooks/meta-webhook.controller.ts +178 -0
- package/nestjs/src/webhooks/processors/elevenlabs-webhook.processor.ts +28 -0
- package/nestjs/src/webhooks/webhooks.module.ts +17 -0
- package/nestjs/src/whatsapp/chat-context.service.ts +281 -0
- package/nestjs/src/whatsapp/dto/add-blacklist.dto.ts +13 -0
- package/nestjs/src/whatsapp/dto/index.ts +2 -0
- package/nestjs/src/whatsapp/dto/send-message.dto.ts +14 -0
- package/nestjs/src/whatsapp/listeners/meta-message.listener.ts +579 -0
- package/nestjs/src/whatsapp/meta-auth.controller.ts +268 -0
- package/nestjs/src/whatsapp/meta-instagram-auth.controller.ts +244 -0
- package/nestjs/src/whatsapp/operator.service.ts +692 -0
- package/nestjs/src/whatsapp/processors/cost-sweep.processor.ts +130 -0
- package/nestjs/src/whatsapp/processors/grace.processor.ts +191 -0
- package/nestjs/src/whatsapp/processors/message-buffer.processor.ts +138 -0
- package/nestjs/src/whatsapp/processors/message-cleanup.processor.ts +148 -0
- package/nestjs/src/whatsapp/processors/meta-token-refresh.processor.ts +114 -0
- package/nestjs/src/whatsapp/processors/operator-expiry.processor.ts +105 -0
- package/nestjs/src/whatsapp/processors/profile-update.processor.ts +234 -0
- package/nestjs/src/whatsapp/processors/session-cleanup.processor.ts +178 -0
- package/nestjs/src/whatsapp/processors/session-labels.processor.ts +248 -0
- package/nestjs/src/whatsapp/whatsapp-agent.service.ts +2506 -0
- package/nestjs/src/whatsapp/whatsapp-recovery.service.ts +117 -0
- package/nestjs/src/whatsapp/whatsapp.controller.ts +398 -0
- package/nestjs/src/whatsapp/whatsapp.module.ts +51 -0
- package/nestjs/src/whatsapp/whatsapp.service.ts +592 -0
- package/nestjs/test/app.e2e-spec.ts +25 -0
- package/nestjs/test/jest-e2e.json +9 -0
- package/nestjs/tsconfig.build.json +4 -0
- package/nestjs/tsconfig.json +25 -0
- package/nginx.example.conf +18 -0
- package/package.json +47 -0
- package/scripts/addRecipient.ts +48 -0
- package/scripts/listRecipients.ts +31 -0
- package/scripts/migrate-agent-ref.ts +86 -0
- package/scripts/migrate-sessions.ts +183 -0
- package/scripts/promote.ts +27 -0
- package/scripts/retrigger.ts +84 -0
- package/scripts/seed.ts +435 -0
- package/scripts/testSend.ts +63 -0
- package/src/app.ts +85 -0
- package/src/config/agentPrompts.json +19 -0
- package/src/config/database.ts +21 -0
- package/src/config/env.ts +94 -0
- package/src/config/index.ts +86 -0
- package/src/controllers/webhook.controller.ts +150 -0
- package/src/errors/index.ts +9 -0
- package/src/hooks/webhookValidator.ts +55 -0
- package/src/index.ts +68 -0
- package/src/migrations/001_session-architecture.ts +138 -0
- package/src/migrations/002_agent-ref.ts +65 -0
- package/src/migrations/003_shift-schedule.ts +55 -0
- package/src/migrations/004_invert-shift-to-clinic-hours.ts +30 -0
- package/src/migrations/005_composite-baileys-chat-ids.ts +60 -0
- package/src/migrations/migration.model.ts +27 -0
- package/src/migrations/migration.routes.ts +40 -0
- package/src/migrations/migration.runner.ts +112 -0
- package/src/models/ConversationClaim.ts +17 -0
- package/src/models/ConversationEvaluation.ts +91 -0
- package/src/models/Summary.ts +77 -0
- package/src/models/Transcription.ts +68 -0
- package/src/models/WhatsAppRecipient.ts +37 -0
- package/src/modules/admin/admin.routes.ts +2385 -0
- package/src/modules/admin/elevenlabs-test-chat.routes.ts +193 -0
- package/src/modules/admin/whatsapp-test-chat.routes.ts +244 -0
- package/src/modules/agents/agent.model.ts +93 -0
- package/src/modules/agents/agent.routes.ts +65 -0
- package/src/modules/appointment-validation/appointment-validation.model.ts +163 -0
- package/src/modules/appointment-validation/appointment-validation.routes.ts +275 -0
- package/src/modules/appointment-validation/appointment-validation.service.ts +1028 -0
- package/src/modules/auth/auth.model.ts +42 -0
- package/src/modules/auth/auth.routes.ts +199 -0
- package/src/modules/auth/auth.service.ts +210 -0
- package/src/modules/auth/refresh-token.model.ts +26 -0
- package/src/modules/billing/billing-alert.model.ts +28 -0
- package/src/modules/billing/billing-period-snapshot.model.ts +68 -0
- package/src/modules/billing/billing.model.ts +42 -0
- package/src/modules/billing/billing.routes.ts +67 -0
- package/src/modules/billing/billing.service.ts +562 -0
- package/src/modules/billing/payment.model.ts +42 -0
- package/src/modules/calls/call.model.ts +102 -0
- package/src/modules/calls/call.routes.ts +118 -0
- package/src/modules/campaigns/campaign.model.ts +111 -0
- package/src/modules/campaigns/campaign.routes.ts +402 -0
- package/src/modules/campaigns/campaign.service.ts +99 -0
- package/src/modules/google-calendar/google-calendar.routes.ts +31 -0
- package/src/modules/inbound-call/inbound-call-config.model.ts +49 -0
- package/src/modules/inbound-call/inbound-call.routes.ts +289 -0
- package/src/modules/leads/lead.model.ts +40 -0
- package/src/modules/leads/lead.routes.ts +246 -0
- package/src/modules/logs/log.model.ts +27 -0
- package/src/modules/logs/log.routes.ts +102 -0
- package/src/modules/plans/plan.model.ts +45 -0
- package/src/modules/surveys/survey.model.ts +70 -0
- package/src/modules/surveys/survey.routes.ts +187 -0
- package/src/modules/tenants/tenant.model.ts +181 -0
- package/src/modules/tenants/tenant.routes.ts +78 -0
- package/src/modules/users/user.routes.ts +126 -0
- package/src/modules/webhooks/elevenlabs-tool.routes.ts +94 -0
- package/src/modules/webhooks/elevenlabs-tool.service.ts +491 -0
- package/src/modules/webhooks/elevenlabs.routes.ts +34 -0
- package/src/modules/webhooks/elevenlabs.service.ts +565 -0
- package/src/modules/webhooks/unipile.routes.ts +917 -0
- package/src/modules/whatsapp/appointment.model.ts +47 -0
- package/src/modules/whatsapp/operator-request.model.ts +58 -0
- package/src/modules/whatsapp/stt-usage.model.ts +30 -0
- package/src/modules/whatsapp/whatsapp-chat.model.ts +39 -0
- package/src/modules/whatsapp/whatsapp-contact-profile.model.ts +41 -0
- package/src/modules/whatsapp/whatsapp-message.model.ts +41 -0
- package/src/modules/whatsapp/whatsapp-session.model.ts +60 -0
- package/src/modules/whatsapp/whatsapp.routes.ts +1435 -0
- package/src/plugins/cors.ts +7 -0
- package/src/plugins/jwt.ts +18 -0
- package/src/plugins/rawBody.ts +12 -0
- package/src/plugins/rbac.ts +24 -0
- package/src/routes/admin.routes.ts +208 -0
- package/src/routes/health.routes.ts +12 -0
- package/src/routes/webhook.routes.ts +12 -0
- package/src/services/ai/base.ai.ts +132 -0
- package/src/services/ai/gemini.service.ts +41 -0
- package/src/services/ai/index.ts +24 -0
- package/src/services/ai/openai.service.ts +48 -0
- package/src/services/elevenlabs.service.ts +532 -0
- package/src/services/google-calendar.service.ts +656 -0
- package/src/services/inbound-call-schedule.service.ts +174 -0
- package/src/services/netgsm.service.ts +128 -0
- package/src/services/unipile.service.ts +200 -0
- package/src/services/whatsapp-agent.service.ts +2479 -0
- package/src/services/whatsapp.service.ts +245 -0
- package/src/templates/index.ts +71 -0
- package/src/templates/receptionist.ts +44 -0
- package/src/templates/survey.ts +44 -0
- package/src/types/index.ts +218 -0
- package/src/utils/logger.ts +83 -0
- package/tsconfig.json +19 -0
- package/web/.dockerignore +4 -0
- package/web/Dockerfile +18 -0
- package/web/README.md +73 -0
- package/web/components.json +23 -0
- package/web/eslint.config.js +23 -0
- package/web/index.html +14 -0
- package/web/nginx.conf +18 -0
- package/web/package-lock.json +10292 -0
- package/web/package.json +48 -0
- package/web/public/favicon.ico +0 -0
- package/web/public/vite.svg +1 -0
- package/web/src/App.tsx +191 -0
- package/web/src/assets/react.svg +1 -0
- package/web/src/components/Layout.tsx +261 -0
- package/web/src/components/LeadConversation.tsx +251 -0
- package/web/src/components/ProtectedRoute.tsx +20 -0
- package/web/src/components/conversation-review/CardAudioPlayer.tsx +200 -0
- package/web/src/components/conversation-review/CardEvaluation.tsx +351 -0
- package/web/src/components/conversation-review/CardMetadata.tsx +44 -0
- package/web/src/components/conversation-review/ConversationCard.tsx +95 -0
- package/web/src/components/conversation-review/ReviewContainer.tsx +120 -0
- package/web/src/components/conversation-review/ReviewFilters.tsx +88 -0
- package/web/src/components/empty-state.tsx +15 -0
- package/web/src/components/page-header.tsx +19 -0
- package/web/src/components/page-loader.tsx +32 -0
- package/web/src/components/pagination.tsx +38 -0
- package/web/src/components/stat-card.tsx +27 -0
- package/web/src/components/status-badge.tsx +125 -0
- package/web/src/components/ui/alert.tsx +66 -0
- package/web/src/components/ui/badge.tsx +48 -0
- package/web/src/components/ui/button.tsx +64 -0
- package/web/src/components/ui/card.tsx +92 -0
- package/web/src/components/ui/checkbox.tsx +32 -0
- package/web/src/components/ui/dialog.tsx +158 -0
- package/web/src/components/ui/dropdown-menu.tsx +255 -0
- package/web/src/components/ui/input.tsx +21 -0
- package/web/src/components/ui/label.tsx +22 -0
- package/web/src/components/ui/progress.tsx +29 -0
- package/web/src/components/ui/select.tsx +188 -0
- package/web/src/components/ui/separator.tsx +28 -0
- package/web/src/components/ui/sheet.tsx +123 -0
- package/web/src/components/ui/skeleton.tsx +13 -0
- package/web/src/components/ui/sonner.tsx +35 -0
- package/web/src/components/ui/table.tsx +116 -0
- package/web/src/components/ui/tabs.tsx +89 -0
- package/web/src/components/ui/textarea.tsx +18 -0
- package/web/src/components/ui/tooltip.tsx +57 -0
- package/web/src/components/whatsapp/ChatDetail.tsx +417 -0
- package/web/src/components/whatsapp/ChatHeader.tsx +78 -0
- package/web/src/components/whatsapp/ChatList.tsx +107 -0
- package/web/src/components/whatsapp/ChatListItem.tsx +60 -0
- package/web/src/components/whatsapp/MessageBubble.tsx +46 -0
- package/web/src/components/whatsapp/MessageInput.tsx +63 -0
- package/web/src/components/whatsapp/MessageStream.tsx +135 -0
- package/web/src/components/whatsapp/SessionDivider.tsx +65 -0
- package/web/src/components/whatsapp/SessionHistory.tsx +119 -0
- package/web/src/components/whatsapp/settings/AiSettingsTab.tsx +268 -0
- package/web/src/components/whatsapp/settings/CalendarTab.tsx +339 -0
- package/web/src/components/whatsapp/settings/ConnectionTab.tsx +236 -0
- package/web/src/components/whatsapp/settings/NotificationsTab.tsx +109 -0
- package/web/src/components/whatsapp/settings/OperatorTab.tsx +303 -0
- package/web/src/contexts/AuthContext.tsx +103 -0
- package/web/src/index.css +130 -0
- package/web/src/lib/api.ts +92 -0
- package/web/src/lib/utils.ts +6 -0
- package/web/src/main.tsx +10 -0
- package/web/src/pages/AppointmentDetail.tsx +206 -0
- package/web/src/pages/AppointmentValidation.tsx +157 -0
- package/web/src/pages/AppointmentValidationDetail.tsx +617 -0
- package/web/src/pages/AppointmentValidationNew.tsx +1005 -0
- package/web/src/pages/Appointments.tsx +283 -0
- package/web/src/pages/Billing.tsx +126 -0
- package/web/src/pages/CallDetail.tsx +293 -0
- package/web/src/pages/CallSettings.tsx +313 -0
- package/web/src/pages/Calls.tsx +188 -0
- package/web/src/pages/CampaignDetail.tsx +216 -0
- package/web/src/pages/CampaignNew.tsx +277 -0
- package/web/src/pages/CampaignResults.tsx +185 -0
- package/web/src/pages/Campaigns.tsx +171 -0
- package/web/src/pages/Dashboard.tsx +336 -0
- package/web/src/pages/InboundSchedule.tsx +246 -0
- package/web/src/pages/LeadDetail.tsx +183 -0
- package/web/src/pages/Leads.tsx +258 -0
- package/web/src/pages/Login.tsx +99 -0
- package/web/src/pages/Register.tsx +129 -0
- package/web/src/pages/Settings.tsx +133 -0
- package/web/src/pages/SurveyDetail.tsx +232 -0
- package/web/src/pages/SurveyPreview.tsx +179 -0
- package/web/src/pages/Surveys.tsx +207 -0
- package/web/src/pages/Users.tsx +199 -0
- package/web/src/pages/WhatsApp.tsx +147 -0
- package/web/src/pages/WhatsAppSettings.tsx +215 -0
- package/web/src/pages/admin/AdminBaileysMessageLog.tsx +331 -0
- package/web/src/pages/admin/AdminBaileysRawMessages.tsx +318 -0
- package/web/src/pages/admin/AdminConversationReview.tsx +116 -0
- package/web/src/pages/admin/AdminCredits.tsx +467 -0
- package/web/src/pages/admin/AdminElevenLabsAgentDetail.tsx +332 -0
- package/web/src/pages/admin/AdminElevenLabsAgents.tsx +164 -0
- package/web/src/pages/admin/AdminElevenLabsBatchCallDetail.tsx +214 -0
- package/web/src/pages/admin/AdminElevenLabsBatchCalls.tsx +293 -0
- package/web/src/pages/admin/AdminElevenLabsConversationDetail.tsx +230 -0
- package/web/src/pages/admin/AdminElevenLabsConversations.tsx +228 -0
- package/web/src/pages/admin/AdminElevenLabsInboundCalls.tsx +293 -0
- package/web/src/pages/admin/AdminElevenLabsPhoneNumbers.tsx +506 -0
- package/web/src/pages/admin/AdminElevenLabsTestChat.tsx +258 -0
- package/web/src/pages/admin/AdminElevenLabsWebhooks.tsx +289 -0
- package/web/src/pages/admin/AdminEvaluationDashboard.tsx +520 -0
- package/web/src/pages/admin/AdminLeads.tsx +339 -0
- package/web/src/pages/admin/AdminLogs.tsx +283 -0
- package/web/src/pages/admin/AdminMigrations.tsx +247 -0
- package/web/src/pages/admin/AdminPlans.tsx +313 -0
- package/web/src/pages/admin/AdminSystem.tsx +391 -0
- package/web/src/pages/admin/AdminTenantBillableItems.tsx +464 -0
- package/web/src/pages/admin/AdminTenantDetail.tsx +1317 -0
- package/web/src/pages/admin/AdminTenants.tsx +274 -0
- package/web/src/pages/admin/AdminWhatsApp.tsx +618 -0
- package/web/src/pages/admin/AdminWhatsAppTestChat.tsx +328 -0
- package/web/src/types/index.ts +242 -0
- package/web/tsconfig.app.json +32 -0
- package/web/tsconfig.json +13 -0
- package/web/tsconfig.node.json +26 -0
- package/web/vite.config.ts +23 -0
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
# ElevenLabs Webhook Tools — Setup Guide
|
|
2
|
+
|
|
3
|
+
> Webhook tools allow the AI agent to call your backend during **SIP trunk voice calls** (inbound & outbound). Unlike client tools (used for WhatsApp text conversations over WebSocket), webhook tools are HTTP endpoints that ElevenLabs POSTs to during a live call.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
1. [Overview](#1-overview)
|
|
10
|
+
2. [Architecture](#2-architecture)
|
|
11
|
+
3. [Prerequisites](#3-prerequisites)
|
|
12
|
+
4. [Creating Webhook Tools in ElevenLabs Panel](#4-creating-webhook-tools-in-elevenlabs-panel)
|
|
13
|
+
5. [Tool Reference](#5-tool-reference)
|
|
14
|
+
6. [Dynamic Variables Setup](#6-dynamic-variables-setup)
|
|
15
|
+
7. [Testing](#7-testing)
|
|
16
|
+
8. [Troubleshooting](#8-troubleshooting)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 1. Overview
|
|
21
|
+
|
|
22
|
+
During a SIP trunk voice call, the AI agent can invoke **webhook tools** to perform actions like checking appointment availability, booking slots, or retrieving patient history. ElevenLabs sends an HTTP POST to your server, waits for the JSON response, and uses it to continue the conversation.
|
|
23
|
+
|
|
24
|
+
**Available webhook tools:**
|
|
25
|
+
|
|
26
|
+
| Tool | Purpose |
|
|
27
|
+
|------|---------|
|
|
28
|
+
| `check_availability` | Check available appointment slots for a given date |
|
|
29
|
+
| `reserve_slot` | Book an appointment on Google Calendar |
|
|
30
|
+
| `list_reservations` | List the patient's upcoming appointments |
|
|
31
|
+
| `cancel_reservation` | Cancel an existing appointment |
|
|
32
|
+
| `reschedule_reservation` | Cancel an old appointment and book a new one |
|
|
33
|
+
| `check_patient_history` | Retrieve patient profile, past appointments, and interaction history |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 2. Architecture
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
┌──────────────┐ POST /webhooks/elevenlabs/tools/:toolName
|
|
41
|
+
│ ElevenLabs │ ──────────────────────────────────────────────────► ┌──────────────┐
|
|
42
|
+
│ AI Agent │ │ Our Backend │
|
|
43
|
+
│ (SIP Call) │ ◄────────────────────────────────────────────────── │ (Fastify) │
|
|
44
|
+
└──────────────┘ JSON response (tool result) └──────┬───────┘
|
|
45
|
+
│
|
|
46
|
+
┌──────▼───────┐
|
|
47
|
+
│ Google Cal / │
|
|
48
|
+
│ MongoDB / SMS│
|
|
49
|
+
└──────────────┘
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Flow:**
|
|
53
|
+
1. Patient calls the clinic's SIP number (inbound) or AI calls the patient (outbound)
|
|
54
|
+
2. During the conversation, the AI decides to use a tool (e.g., "Let me check availability for Monday")
|
|
55
|
+
3. ElevenLabs POSTs to the configured webhook URL with the tool parameters
|
|
56
|
+
4. Our backend resolves the tenant from `agent_id`, executes the tool logic, returns JSON
|
|
57
|
+
5. ElevenLabs reads the response and the AI continues the conversation naturally
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 3. Prerequisites
|
|
62
|
+
|
|
63
|
+
Before configuring webhook tools, ensure:
|
|
64
|
+
|
|
65
|
+
- [ ] Your backend is deployed and publicly accessible (HTTPS required)
|
|
66
|
+
- [ ] `ELEVENLABS_WEBHOOK_SECRET` is set in your `.env` file
|
|
67
|
+
- [ ] The tenant has **Google Calendar connected** (for appointment tools)
|
|
68
|
+
- [ ] The ElevenLabs agent exists in the `agents` collection with a valid `elevenlabs_agent_id`
|
|
69
|
+
- [ ] The agent is assigned to a tenant and is `is_active: true`
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## 4. Creating Webhook Tools in ElevenLabs Panel
|
|
74
|
+
|
|
75
|
+
### Step-by-Step for Each Tool
|
|
76
|
+
|
|
77
|
+
1. Go to [ElevenLabs Dashboard](https://elevenlabs.io/app/conversational-ai)
|
|
78
|
+
2. Select your **voice agent** (the one used for SIP trunk calls)
|
|
79
|
+
3. Navigate to the **Tools** section in the agent configuration
|
|
80
|
+
4. Click **"Add Tool"** → Select **"Webhook"**
|
|
81
|
+
|
|
82
|
+
For each tool below, fill in the fields as described.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### 4.1. check_availability
|
|
87
|
+
|
|
88
|
+
**Purpose:** Check available appointment slots for a specific date.
|
|
89
|
+
|
|
90
|
+
| Field | Value |
|
|
91
|
+
|-------|-------|
|
|
92
|
+
| **Name** | `check_availability` |
|
|
93
|
+
| **Description** | `Belirtilen tarih için müsait randevu saatlerini kontrol eder. Hasta randevu almak istediğinde önce bu aracı kullanarak müsait saatleri kontrol et.` |
|
|
94
|
+
| **Webhook URL** | `https://YOUR_DOMAIN/webhooks/elevenlabs/tools/check_availability` |
|
|
95
|
+
| **Method** | `POST` |
|
|
96
|
+
|
|
97
|
+
**Request Headers:**
|
|
98
|
+
|
|
99
|
+
| Key | Value |
|
|
100
|
+
|-----|-------|
|
|
101
|
+
| `x-api-key` | `{your ELEVENLABS_WEBHOOK_SECRET}` |
|
|
102
|
+
| `Content-Type` | `application/json` |
|
|
103
|
+
|
|
104
|
+
**Request Body Schema (Properties):**
|
|
105
|
+
|
|
106
|
+
| Property | Type | Required | Description |
|
|
107
|
+
|----------|------|----------|-------------|
|
|
108
|
+
| `agent_id` | `string` | Yes | `Sistem tarafından otomatik sağlanır. Değer: {{agent_id}}` |
|
|
109
|
+
| `conversation_id` | `string` | No | `Sistem tarafından otomatik sağlanır. Değer: {{conversation_id}}` |
|
|
110
|
+
| `patient_phone` | `string` | Yes | `Sistem tarafından otomatik sağlanır. Değer: {{phone_number}}` |
|
|
111
|
+
| `patient_name` | `string` | No | `Hastanın adı (varsa). Değer: {{patient_name}}` |
|
|
112
|
+
| `date` | `string` | Yes | `Kontrol edilecek tarih. YYYY-MM-DD formatında (ör: 2026-03-15)` |
|
|
113
|
+
|
|
114
|
+
> **Important:** Mark `agent_id`, `conversation_id`, `patient_phone`, `patient_name` as **hidden/fixed** parameters with their dynamic variable values. Only `date` should be filled by the AI.
|
|
115
|
+
|
|
116
|
+
**Tool Settings:**
|
|
117
|
+
|
|
118
|
+
| Setting | Value |
|
|
119
|
+
|---------|-------|
|
|
120
|
+
| **Response timeout** | `10` seconds |
|
|
121
|
+
| **Execution mode** | `immediate` |
|
|
122
|
+
| **Disable interruptions** | `true` (while checking) |
|
|
123
|
+
| **Pre-tool speech** | `true` — Set speech like: `"Bir saniye, o tarihe bakıyorum..."` |
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### 4.2. reserve_slot
|
|
128
|
+
|
|
129
|
+
**Purpose:** Book an appointment slot.
|
|
130
|
+
|
|
131
|
+
| Field | Value |
|
|
132
|
+
|-------|-------|
|
|
133
|
+
| **Name** | `reserve_slot` |
|
|
134
|
+
| **Description** | `Hastaya randevu oluşturur. Önce check_availability ile müsait saatleri kontrol et, sonra hastanın seçtiği saati bu araçla rezerve et.` |
|
|
135
|
+
| **Webhook URL** | `https://YOUR_DOMAIN/webhooks/elevenlabs/tools/reserve_slot` |
|
|
136
|
+
| **Method** | `POST` |
|
|
137
|
+
|
|
138
|
+
**Request Headers:** (Same as check_availability)
|
|
139
|
+
|
|
140
|
+
**Request Body Schema:**
|
|
141
|
+
|
|
142
|
+
| Property | Type | Required | Description |
|
|
143
|
+
|----------|------|----------|-------------|
|
|
144
|
+
| `agent_id` | `string` | Yes | Hidden. `{{agent_id}}` |
|
|
145
|
+
| `conversation_id` | `string` | No | Hidden. `{{conversation_id}}` |
|
|
146
|
+
| `patient_phone` | `string` | Yes | Hidden. `{{phone_number}}` |
|
|
147
|
+
| `patient_name` | `string` | Yes | `Hastanın adı soyadı` |
|
|
148
|
+
| `iso_start` | `string` | Yes | `Randevu başlangıç zamanı ISO 8601 formatında (ör: 2026-03-15T10:00:00+03:00)` |
|
|
149
|
+
| `iso_end` | `string` | Yes | `Randevu bitiş zamanı ISO 8601 formatında (ör: 2026-03-15T10:30:00+03:00)` |
|
|
150
|
+
| `notes` | `string` | No | `Randevu notu (hastanın belirttiği şikayet, istek vb.)` |
|
|
151
|
+
|
|
152
|
+
**Tool Settings:**
|
|
153
|
+
|
|
154
|
+
| Setting | Value |
|
|
155
|
+
|---------|-------|
|
|
156
|
+
| **Response timeout** | `15` seconds |
|
|
157
|
+
| **Execution mode** | `immediate` |
|
|
158
|
+
| **Disable interruptions** | `true` |
|
|
159
|
+
| **Pre-tool speech** | `true` — `"Randevunuzu oluşturuyorum, bir saniye lütfen..."` |
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
### 4.3. list_reservations
|
|
164
|
+
|
|
165
|
+
**Purpose:** List patient's upcoming appointments.
|
|
166
|
+
|
|
167
|
+
| Field | Value |
|
|
168
|
+
|-------|-------|
|
|
169
|
+
| **Name** | `list_reservations` |
|
|
170
|
+
| **Description** | `Hastanın mevcut randevularını listeler. Hasta mevcut randevularını sormak istediğinde bu aracı kullan.` |
|
|
171
|
+
| **Webhook URL** | `https://YOUR_DOMAIN/webhooks/elevenlabs/tools/list_reservations` |
|
|
172
|
+
| **Method** | `POST` |
|
|
173
|
+
|
|
174
|
+
**Request Headers:** (Same)
|
|
175
|
+
|
|
176
|
+
**Request Body Schema:**
|
|
177
|
+
|
|
178
|
+
| Property | Type | Required | Description |
|
|
179
|
+
|----------|------|----------|-------------|
|
|
180
|
+
| `agent_id` | `string` | Yes | Hidden. `{{agent_id}}` |
|
|
181
|
+
| `conversation_id` | `string` | No | Hidden. `{{conversation_id}}` |
|
|
182
|
+
| `patient_phone` | `string` | Yes | Hidden. `{{phone_number}}` |
|
|
183
|
+
| `patient_name` | `string` | No | Hidden. `{{patient_name}}` |
|
|
184
|
+
|
|
185
|
+
> No additional AI-filled parameters needed. All context comes from dynamic variables.
|
|
186
|
+
|
|
187
|
+
**Tool Settings:**
|
|
188
|
+
|
|
189
|
+
| Setting | Value |
|
|
190
|
+
|---------|-------|
|
|
191
|
+
| **Response timeout** | `10` seconds |
|
|
192
|
+
| **Execution mode** | `immediate` |
|
|
193
|
+
| **Disable interruptions** | `true` |
|
|
194
|
+
| **Pre-tool speech** | `true` — `"Randevularınıza bakıyorum..."` |
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
### 4.4. cancel_reservation
|
|
199
|
+
|
|
200
|
+
**Purpose:** Cancel an existing appointment.
|
|
201
|
+
|
|
202
|
+
| Field | Value |
|
|
203
|
+
|-------|-------|
|
|
204
|
+
| **Name** | `cancel_reservation` |
|
|
205
|
+
| **Description** | `Hastanın mevcut bir randevusunu iptal eder. Önce list_reservations ile randevuları listele, sonra hastanın iptal etmek istediği randevunun event_id değerini bu araçla gönder.` |
|
|
206
|
+
| **Webhook URL** | `https://YOUR_DOMAIN/webhooks/elevenlabs/tools/cancel_reservation` |
|
|
207
|
+
| **Method** | `POST` |
|
|
208
|
+
|
|
209
|
+
**Request Headers:** (Same)
|
|
210
|
+
|
|
211
|
+
**Request Body Schema:**
|
|
212
|
+
|
|
213
|
+
| Property | Type | Required | Description |
|
|
214
|
+
|----------|------|----------|-------------|
|
|
215
|
+
| `agent_id` | `string` | Yes | Hidden. `{{agent_id}}` |
|
|
216
|
+
| `conversation_id` | `string` | No | Hidden. `{{conversation_id}}` |
|
|
217
|
+
| `patient_phone` | `string` | Yes | Hidden. `{{phone_number}}` |
|
|
218
|
+
| `patient_name` | `string` | No | Hidden. `{{patient_name}}` |
|
|
219
|
+
| `event_id` | `string` | Yes | `İptal edilecek randevunun event_id değeri (list_reservations sonucundan alınır)` |
|
|
220
|
+
|
|
221
|
+
**Tool Settings:**
|
|
222
|
+
|
|
223
|
+
| Setting | Value |
|
|
224
|
+
|---------|-------|
|
|
225
|
+
| **Response timeout** | `10` seconds |
|
|
226
|
+
| **Execution mode** | `immediate` |
|
|
227
|
+
| **Disable interruptions** | `true` |
|
|
228
|
+
| **Pre-tool speech** | `true` — `"Randevunuzu iptal ediyorum..."` |
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
### 4.5. reschedule_reservation
|
|
233
|
+
|
|
234
|
+
**Purpose:** Reschedule (cancel old + book new) in one step.
|
|
235
|
+
|
|
236
|
+
| Field | Value |
|
|
237
|
+
|-------|-------|
|
|
238
|
+
| **Name** | `reschedule_reservation` |
|
|
239
|
+
| **Description** | `Hastanın mevcut randevusunu başka bir tarihe/saate taşır. Eski randevuyu iptal edip yeni randevuyu oluşturur. Önce list_reservations ile mevcut randevuyu bul, sonra check_availability ile yeni tarihteki müsait saatleri kontrol et.` |
|
|
240
|
+
| **Webhook URL** | `https://YOUR_DOMAIN/webhooks/elevenlabs/tools/reschedule_reservation` |
|
|
241
|
+
| **Method** | `POST` |
|
|
242
|
+
|
|
243
|
+
**Request Headers:** (Same)
|
|
244
|
+
|
|
245
|
+
**Request Body Schema:**
|
|
246
|
+
|
|
247
|
+
| Property | Type | Required | Description |
|
|
248
|
+
|----------|------|----------|-------------|
|
|
249
|
+
| `agent_id` | `string` | Yes | Hidden. `{{agent_id}}` |
|
|
250
|
+
| `conversation_id` | `string` | No | Hidden. `{{conversation_id}}` |
|
|
251
|
+
| `patient_phone` | `string` | Yes | Hidden. `{{phone_number}}` |
|
|
252
|
+
| `patient_name` | `string` | Yes | `Hastanın adı soyadı` |
|
|
253
|
+
| `old_event_id` | `string` | Yes | `Eski randevunun event_id değeri` |
|
|
254
|
+
| `new_iso_start` | `string` | Yes | `Yeni randevu başlangıç zamanı ISO 8601 formatında` |
|
|
255
|
+
| `new_iso_end` | `string` | Yes | `Yeni randevu bitiş zamanı ISO 8601 formatında` |
|
|
256
|
+
| `notes` | `string` | No | `Randevu notu` |
|
|
257
|
+
|
|
258
|
+
**Tool Settings:**
|
|
259
|
+
|
|
260
|
+
| Setting | Value |
|
|
261
|
+
|---------|-------|
|
|
262
|
+
| **Response timeout** | `20` seconds |
|
|
263
|
+
| **Execution mode** | `immediate` |
|
|
264
|
+
| **Disable interruptions** | `true` |
|
|
265
|
+
| **Pre-tool speech** | `true` — `"Randevunuzu yeni tarihe taşıyorum, bir saniye..."` |
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
### 4.6. check_patient_history
|
|
270
|
+
|
|
271
|
+
**Purpose:** Retrieve full patient history for context during the call.
|
|
272
|
+
|
|
273
|
+
| Field | Value |
|
|
274
|
+
|-------|-------|
|
|
275
|
+
| **Name** | `check_patient_history` |
|
|
276
|
+
| **Description** | `Hastanın geçmiş randevularını, iletişim profilini ve önceki etkileşimlerini getirir. Hasta hakkında bilgi edinmek veya geçmiş randevularını sorgulamak için kullan.` |
|
|
277
|
+
| **Webhook URL** | `https://YOUR_DOMAIN/webhooks/elevenlabs/tools/check_patient_history` |
|
|
278
|
+
| **Method** | `POST` |
|
|
279
|
+
|
|
280
|
+
**Request Headers:** (Same)
|
|
281
|
+
|
|
282
|
+
**Request Body Schema:**
|
|
283
|
+
|
|
284
|
+
| Property | Type | Required | Description |
|
|
285
|
+
|----------|------|----------|-------------|
|
|
286
|
+
| `agent_id` | `string` | Yes | Hidden. `{{agent_id}}` |
|
|
287
|
+
| `conversation_id` | `string` | No | Hidden. `{{conversation_id}}` |
|
|
288
|
+
| `patient_phone` | `string` | Yes | Hidden. `{{phone_number}}` |
|
|
289
|
+
| `patient_name` | `string` | No | Hidden. `{{patient_name}}` |
|
|
290
|
+
|
|
291
|
+
**Tool Settings:**
|
|
292
|
+
|
|
293
|
+
| Setting | Value |
|
|
294
|
+
|---------|-------|
|
|
295
|
+
| **Response timeout** | `10` seconds |
|
|
296
|
+
| **Execution mode** | `immediate` |
|
|
297
|
+
| **Disable interruptions** | `true` |
|
|
298
|
+
| **Pre-tool speech** | `true` — `"Bilgilerinize bakıyorum..."` |
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 5. Tool Reference
|
|
303
|
+
|
|
304
|
+
### Request Format
|
|
305
|
+
|
|
306
|
+
All tools receive a POST request with JSON body. The body contains both **context fields** (injected via dynamic variables) and **tool-specific parameters** (filled by the AI).
|
|
307
|
+
|
|
308
|
+
```json
|
|
309
|
+
{
|
|
310
|
+
"agent_id": "agent_xxxxxxxxxxxx",
|
|
311
|
+
"conversation_id": "conv_xxxxxxxxxxxx",
|
|
312
|
+
"patient_phone": "+905551234567",
|
|
313
|
+
"patient_name": "Ahmet Yilmaz",
|
|
314
|
+
"date": "2026-03-15"
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Response Format
|
|
319
|
+
|
|
320
|
+
All tools return JSON. Success responses return `200`, errors return `422`.
|
|
321
|
+
|
|
322
|
+
**Success example (check_availability):**
|
|
323
|
+
```json
|
|
324
|
+
{
|
|
325
|
+
"date": "2026-03-15",
|
|
326
|
+
"available_slots": [
|
|
327
|
+
{ "start": "09:00", "end": "09:30" },
|
|
328
|
+
{ "start": "10:00", "end": "10:30" },
|
|
329
|
+
{ "start": "14:00", "end": "14:30" }
|
|
330
|
+
],
|
|
331
|
+
"appointment_duration_minutes": 30
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**Success example (reserve_slot):**
|
|
336
|
+
```json
|
|
337
|
+
{
|
|
338
|
+
"reserved": true,
|
|
339
|
+
"event_id": "abc123xyz",
|
|
340
|
+
"start": "2026-03-15T10:00:00+03:00",
|
|
341
|
+
"end": "2026-03-15T10:30:00+03:00",
|
|
342
|
+
"patient_name": "Ahmet Yilmaz"
|
|
343
|
+
}
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**Success example (list_reservations):**
|
|
347
|
+
```json
|
|
348
|
+
{
|
|
349
|
+
"reservations": [
|
|
350
|
+
{
|
|
351
|
+
"event_id": "abc123xyz",
|
|
352
|
+
"summary": "Ahmet Yilmaz - Randevu",
|
|
353
|
+
"start": "2026-03-15T10:00:00+03:00",
|
|
354
|
+
"end": "2026-03-15T10:30:00+03:00"
|
|
355
|
+
}
|
|
356
|
+
],
|
|
357
|
+
"count": 1
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
**Success example (cancel_reservation):**
|
|
362
|
+
```json
|
|
363
|
+
{
|
|
364
|
+
"cancelled": true,
|
|
365
|
+
"event_id": "abc123xyz"
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Success example (reschedule_reservation):**
|
|
370
|
+
```json
|
|
371
|
+
{
|
|
372
|
+
"rescheduled": true,
|
|
373
|
+
"old_event_id": "abc123xyz",
|
|
374
|
+
"new_event_id": "def456uvw",
|
|
375
|
+
"start": "2026-03-16T14:00:00+03:00",
|
|
376
|
+
"end": "2026-03-16T14:30:00+03:00",
|
|
377
|
+
"patient_name": "Ahmet Yilmaz"
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
**Error example:**
|
|
382
|
+
```json
|
|
383
|
+
{
|
|
384
|
+
"error": "Google Calendar not configured"
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## 6. Dynamic Variables Setup
|
|
391
|
+
|
|
392
|
+
Dynamic variables are injected at conversation start and are available to all webhook tools. Configure these on the agent's **Dynamic Variables** section.
|
|
393
|
+
|
|
394
|
+
### For Outbound Calls (call_patient)
|
|
395
|
+
|
|
396
|
+
These are automatically injected by our backend when initiating a SIP trunk outbound call via `toolCallPatient`:
|
|
397
|
+
|
|
398
|
+
| Variable | Source | Example |
|
|
399
|
+
|----------|--------|---------|
|
|
400
|
+
| `patient_name` | WhatsApp chat contact name | `Ahmet Yilmaz` |
|
|
401
|
+
| `patient_phone` | WhatsApp chat contact phone | `+905551234567` |
|
|
402
|
+
| `conversation_history` | Built from chat context | `Patient: Merhaba...` |
|
|
403
|
+
| `call_reason` | AI-provided reason for calling | `Randevu hatırlatması` |
|
|
404
|
+
|
|
405
|
+
### For Inbound Calls (SIP Trunk)
|
|
406
|
+
|
|
407
|
+
Configure these dynamic variables in the ElevenLabs agent settings:
|
|
408
|
+
|
|
409
|
+
| Variable | Value / Source | Description |
|
|
410
|
+
|----------|---------------|-------------|
|
|
411
|
+
| `agent_id` | The agent's own ID (hardcode it) | Used to resolve tenant in webhook |
|
|
412
|
+
| `phone_number` | `{{phone_number}}` (ElevenLabs built-in) | Caller's phone number from SIP |
|
|
413
|
+
| `patient_name` | `{{caller_name}}` or empty | Caller ID name if available |
|
|
414
|
+
| `current_date` | `{{current_date}}` or hardcode | Today's date for the AI |
|
|
415
|
+
|
|
416
|
+
> **Note:** `{{phone_number}}` is an ElevenLabs built-in variable for SIP/phone calls that resolves to the caller's phone number in E.164 format.
|
|
417
|
+
|
|
418
|
+
### Mapping Dynamic Variables to Tool Parameters
|
|
419
|
+
|
|
420
|
+
In the webhook tool schema, reference dynamic variables using `{{variable_name}}` syntax for hidden/fixed parameters:
|
|
421
|
+
|
|
422
|
+
```
|
|
423
|
+
agent_id → {{agent_id}}
|
|
424
|
+
patient_phone → {{phone_number}}
|
|
425
|
+
patient_name → {{patient_name}}
|
|
426
|
+
conversation_id → {{conversation_id}}
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
This way, these values are automatically injected into every tool call without the AI needing to fill them.
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
## 7. Testing
|
|
434
|
+
|
|
435
|
+
### cURL Test
|
|
436
|
+
|
|
437
|
+
Test the webhook endpoint directly:
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
# check_availability
|
|
441
|
+
curl -X POST https://YOUR_DOMAIN/webhooks/elevenlabs/tools/check_availability \
|
|
442
|
+
-H "Content-Type: application/json" \
|
|
443
|
+
-H "x-api-key: YOUR_ELEVENLABS_WEBHOOK_SECRET" \
|
|
444
|
+
-d '{
|
|
445
|
+
"agent_id": "agent_xxxxxxxxxxxx",
|
|
446
|
+
"conversation_id": "test_conv_001",
|
|
447
|
+
"patient_phone": "+905551234567",
|
|
448
|
+
"patient_name": "Test Hasta",
|
|
449
|
+
"date": "2026-03-15"
|
|
450
|
+
}'
|
|
451
|
+
|
|
452
|
+
# reserve_slot
|
|
453
|
+
curl -X POST https://YOUR_DOMAIN/webhooks/elevenlabs/tools/reserve_slot \
|
|
454
|
+
-H "Content-Type: application/json" \
|
|
455
|
+
-H "x-api-key: YOUR_ELEVENLABS_WEBHOOK_SECRET" \
|
|
456
|
+
-d '{
|
|
457
|
+
"agent_id": "agent_xxxxxxxxxxxx",
|
|
458
|
+
"conversation_id": "test_conv_001",
|
|
459
|
+
"patient_phone": "+905551234567",
|
|
460
|
+
"patient_name": "Test Hasta",
|
|
461
|
+
"iso_start": "2026-03-15T10:00:00+03:00",
|
|
462
|
+
"iso_end": "2026-03-15T10:30:00+03:00",
|
|
463
|
+
"notes": "Dis agrisi"
|
|
464
|
+
}'
|
|
465
|
+
|
|
466
|
+
# list_reservations
|
|
467
|
+
curl -X POST https://YOUR_DOMAIN/webhooks/elevenlabs/tools/list_reservations \
|
|
468
|
+
-H "Content-Type: application/json" \
|
|
469
|
+
-H "x-api-key: YOUR_ELEVENLABS_WEBHOOK_SECRET" \
|
|
470
|
+
-d '{
|
|
471
|
+
"agent_id": "agent_xxxxxxxxxxxx",
|
|
472
|
+
"patient_phone": "+905551234567"
|
|
473
|
+
}'
|
|
474
|
+
|
|
475
|
+
# cancel_reservation
|
|
476
|
+
curl -X POST https://YOUR_DOMAIN/webhooks/elevenlabs/tools/cancel_reservation \
|
|
477
|
+
-H "Content-Type: application/json" \
|
|
478
|
+
-H "x-api-key: YOUR_ELEVENLABS_WEBHOOK_SECRET" \
|
|
479
|
+
-d '{
|
|
480
|
+
"agent_id": "agent_xxxxxxxxxxxx",
|
|
481
|
+
"patient_phone": "+905551234567",
|
|
482
|
+
"event_id": "abc123xyz"
|
|
483
|
+
}'
|
|
484
|
+
|
|
485
|
+
# check_patient_history
|
|
486
|
+
curl -X POST https://YOUR_DOMAIN/webhooks/elevenlabs/tools/check_patient_history \
|
|
487
|
+
-H "Content-Type: application/json" \
|
|
488
|
+
-H "x-api-key: YOUR_ELEVENLABS_WEBHOOK_SECRET" \
|
|
489
|
+
-d '{
|
|
490
|
+
"agent_id": "agent_xxxxxxxxxxxx",
|
|
491
|
+
"patient_phone": "+905551234567"
|
|
492
|
+
}'
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### Checklist
|
|
496
|
+
|
|
497
|
+
- [ ] Backend returns `200` with correct JSON for each tool
|
|
498
|
+
- [ ] Backend returns `401` when `x-api-key` is missing or wrong
|
|
499
|
+
- [ ] Backend returns `404` for unknown tool names
|
|
500
|
+
- [ ] Backend returns `400` when `agent_id` is missing
|
|
501
|
+
- [ ] Backend returns `422` with `{ "error": "..." }` for business logic errors
|
|
502
|
+
- [ ] Appointments created via voice call have `source: "voice_call"` in MongoDB
|
|
503
|
+
- [ ] SMS notifications fire when appointment is created/cancelled/rescheduled
|
|
504
|
+
- [ ] Test an actual SIP call end-to-end and verify the AI uses tools correctly
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## 8. Troubleshooting
|
|
509
|
+
|
|
510
|
+
### Common Issues
|
|
511
|
+
|
|
512
|
+
| Symptom | Cause | Fix |
|
|
513
|
+
|---------|-------|-----|
|
|
514
|
+
| `401 Unauthorized` | Wrong `x-api-key` header | Ensure the header value matches `ELEVENLABS_WEBHOOK_SECRET` in `.env` |
|
|
515
|
+
| `400 agent_id is required` | Dynamic variable not mapped | Add `agent_id` as a hidden parameter with `{{agent_id}}` value |
|
|
516
|
+
| `Agent not found or inactive` | `elevenlabs_agent_id` doesn't match any active agent | Verify the agent exists in the `agents` collection and `is_active: true` |
|
|
517
|
+
| `Google Calendar not configured` | Tenant hasn't connected Google Calendar | Connect Google Calendar in tenant settings |
|
|
518
|
+
| Tool timeout (no response) | Backend unreachable or slow | Check server logs; increase `response_timeout_secs` in tool config |
|
|
519
|
+
| AI doesn't use the tool | Tool description unclear | Improve the tool description in ElevenLabs to better guide the AI |
|
|
520
|
+
|
|
521
|
+
### Logs
|
|
522
|
+
|
|
523
|
+
All webhook tool calls are logged with:
|
|
524
|
+
```
|
|
525
|
+
Webhook tool call received { toolName, agentId, conversationId, patientPhone }
|
|
526
|
+
Webhook tool call completed { toolName, agentId, conversationId, resultPreview }
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
Check server logs for `Webhook tool call` entries.
|
|
530
|
+
|
|
531
|
+
---
|
|
532
|
+
|
|
533
|
+
## 9. Appointment Validation Agent Setup
|
|
534
|
+
|
|
535
|
+
The appointment validation system uses batch outbound calls to confirm patient appointments. A dedicated ElevenLabs agent handles these calls with a specific webhook tool.
|
|
536
|
+
|
|
537
|
+
### Agent Prompt (Turkish)
|
|
538
|
+
|
|
539
|
+
```
|
|
540
|
+
Sen {{clinic_name}} kliniginin randevu onay asistanisin. Hastaneden ariyorsun ve hastanin randevusunu onaylamak istiyorsun.
|
|
541
|
+
|
|
542
|
+
Gorev:
|
|
543
|
+
1. Kendinizi tanit: "Merhaba, ben {{clinic_name}}'den ariyorum"
|
|
544
|
+
2. Hastanin adini dogrula: "{{patient_name}} ile mi gorusuyorum?"
|
|
545
|
+
3. Randevu bilgilerini oku: "{{appointment_date}} tarihinde saat {{appointment_time}}'de {{doctor_name}} ile randevunuz bulunuyor"
|
|
546
|
+
4. Hastaya randevuyu onaylayip onaylamadığını sor
|
|
547
|
+
5. Hasta onaylarsa "confirm_appointment_validation" aracini result="confirmed" ile cagir
|
|
548
|
+
6. Hasta iptal etmek isterse "confirm_appointment_validation" aracini result="cancelled" ile cagir
|
|
549
|
+
7. Hasta ertelemek isterse yeni tercih edilen zamani sor ve "confirm_appointment_validation" aracini result="reschedule" ile cagir, reschedule_request alanina hastanin tercihini yaz
|
|
550
|
+
8. Kibarca vedalas
|
|
551
|
+
|
|
552
|
+
Onemli kurallar:
|
|
553
|
+
- Kisa ve net konus
|
|
554
|
+
- Hasta telefona cevap vermezse veya mesgulse araci cagirma
|
|
555
|
+
- Her durumda "confirm_appointment_validation" aracini tam olarak bir kez cagir
|
|
556
|
+
- Hastanin mesajini patient_message alanina kisa ozetle
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### Dynamic Variables
|
|
560
|
+
|
|
561
|
+
Configure these on the agent:
|
|
562
|
+
|
|
563
|
+
| Variable | Source | Description |
|
|
564
|
+
|----------|--------|-------------|
|
|
565
|
+
| `clinic_name` | Per-recipient (from tenant) | Clinic/tenant name — auto-injected |
|
|
566
|
+
| `patient_name` | Per-recipient | Patient's full name |
|
|
567
|
+
| `patient_phone` | Per-recipient | Patient phone (E.164) |
|
|
568
|
+
| `appointment_date` | Per-recipient | Appointment date (YYYY-MM-DD) |
|
|
569
|
+
| `appointment_time` | Per-recipient | Appointment time (HH:MM) |
|
|
570
|
+
| `doctor_name` | Per-recipient | Doctor name |
|
|
571
|
+
| `department` | Per-recipient | Department |
|
|
572
|
+
| `notes` | Per-recipient | Additional notes |
|
|
573
|
+
| `current_date` | Per-recipient | Today's date |
|
|
574
|
+
|
|
575
|
+
These are injected automatically via `conversationInitiationClientData.dynamicVariables` for each recipient in the batch call.
|
|
576
|
+
|
|
577
|
+
### Webhook Tool: `confirm_appointment_validation`
|
|
578
|
+
|
|
579
|
+
| Field | Value |
|
|
580
|
+
|-------|-------|
|
|
581
|
+
| **Name** | `confirm_appointment_validation` |
|
|
582
|
+
| **Description** | `Hastanin randevu onay sonucunu kaydeder. Hasta randevuyu onaylarsa, iptal ederse veya ertelemek isterse bu araci cagir.` |
|
|
583
|
+
| **Webhook URL** | `https://YOUR_DOMAIN/webhooks/elevenlabs/tools/confirm_appointment_validation` |
|
|
584
|
+
| **Method** | `POST` |
|
|
585
|
+
|
|
586
|
+
**Request Headers:**
|
|
587
|
+
|
|
588
|
+
| Key | Value |
|
|
589
|
+
|-----|-------|
|
|
590
|
+
| `x-api-key` | `{your ELEVENLABS_WEBHOOK_SECRET}` |
|
|
591
|
+
| `Content-Type` | `application/json` |
|
|
592
|
+
|
|
593
|
+
**Request Body Schema:**
|
|
594
|
+
|
|
595
|
+
| Property | Type | Required | Description |
|
|
596
|
+
|----------|------|----------|-------------|
|
|
597
|
+
| `agent_id` | `string` | Yes | Hidden. `{{agent_id}}` |
|
|
598
|
+
| `conversation_id` | `string` | Yes | Hidden. `{{conversation_id}}` |
|
|
599
|
+
| `patient_phone` | `string` | Yes | Hidden. `{{phone_number}}` |
|
|
600
|
+
| `result` | `string` | Yes | `Sonuc: "confirmed", "cancelled", veya "reschedule"` |
|
|
601
|
+
| `reschedule_request` | `string` | No | `Hastanin tercih ettigi yeni zaman (erteleme durumunda)` |
|
|
602
|
+
| `patient_message` | `string` | No | `Hastanin iletmek istedigi mesaj veya not` |
|
|
603
|
+
|
|
604
|
+
**Tool Settings:**
|
|
605
|
+
|
|
606
|
+
| Setting | Value |
|
|
607
|
+
|---------|-------|
|
|
608
|
+
| **Response timeout** | `10` seconds |
|
|
609
|
+
| **Execution mode** | `immediate` |
|
|
610
|
+
| **Disable interruptions** | `true` |
|
|
611
|
+
| **Pre-tool speech** | `false` |
|
|
612
|
+
|
|
613
|
+
### Response Examples
|
|
614
|
+
|
|
615
|
+
**Success:**
|
|
616
|
+
```json
|
|
617
|
+
{
|
|
618
|
+
"recorded": true,
|
|
619
|
+
"result": "confirmed"
|
|
620
|
+
}
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
**Error (conversation not found):**
|
|
624
|
+
```json
|
|
625
|
+
{
|
|
626
|
+
"error": "Appointment not found for this conversation"
|
|
627
|
+
}
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
---
|
|
631
|
+
|
|
632
|
+
## File Map
|
|
633
|
+
|
|
634
|
+
| File | Purpose |
|
|
635
|
+
|------|---------|
|
|
636
|
+
| `src/modules/webhooks/elevenlabs-tool.routes.ts` | Fastify route — auth + dispatch |
|
|
637
|
+
| `src/modules/webhooks/elevenlabs-tool.service.ts` | Tool handler logic — tenant resolution + tool implementations |
|
|
638
|
+
| `src/modules/whatsapp/appointment.model.ts` | Appointment model — supports `source: 'voice_call'` |
|
|
639
|
+
| `src/modules/appointment-validation/appointment-validation.model.ts` | Batch model — tracks validation campaigns and entries |
|
|
640
|
+
| `src/modules/appointment-validation/appointment-validation.service.ts` | Batch business logic — create, submit, sync, export |
|
|
641
|
+
| `src/modules/appointment-validation/appointment-validation.routes.ts` | Batch REST endpoints |
|
|
642
|
+
| `src/services/google-calendar.service.ts` | Google Calendar API — shared by both client and webhook tools |
|
|
643
|
+
| `src/services/elevenlabs.service.ts` | ElevenLabs SDK wrapper — SIP trunk + batch calling |
|
|
644
|
+
| `src/app.ts` | Route registration — `/webhooks/elevenlabs/tools` + `/appointment-validation` |
|