使用说明
医疗诊所人工智能管理员
一款基于Telnyx的语音人工智能助手,可处理医疗实践的预约安排、患者查询和管理任务。使用Flask、FastMCP构建,并部署在铁路上。前端部署在Vercel上。
用例
医疗管理涉及大量基于电话的工作:收集患者信息、安排预约和管理实践物流。该项目展示了Telnyx Voice AI如何自动化这些任务,使医务人员能够专注于患者护理,而AI则处理日常调度操作。
现在试试
电话号码: 1-406-381-2086
实时仪表板: https://telnyx-assignment-dashboard.vercel.app/
注: 您的电话号码需要在Telnyx系统中进行验证才能拨打电话。
演示脚本
拨打上面的号码,尝试以下互动:
-
查看可用的医生:
- “有什么医生?”
- “我能看见谁?”
-
预约:
- “我想和史密斯医生预约明天下午2点见面。”
- 当被询问时,请提供您的姓名和电话号码
- 确认细节
-
检查可用性:
- “2025年12月17日星期五,琼斯博士的时间是什么时候?”
-
重新安排预约:
- “我需要用ID 21重新安排预约”
- 提供新的日期和时间
-
查看您的预约:
- “我有什么预约?”
当您与机器人交互时,仪表板会实时更新。
建筑
┌─────────────┐
│ Caller │
└──────┬──────┘
│ (Voice)
▼
┌─────────────┐
│ Telnyx │ ◄── Dynamic Webhook Variables
│ Voice AI │ (Caller Context)
└──────┬──────┘
│ (Tool Calls)
▼
┌─────────────┐
│ MCP Server │ ◄── Custom tools for appointments
│ (FastMCP) │ doctors, availability, etc.
└──────┬──────┘
│ (HTTP)
▼
┌─────────────┐
│ Flask API │ ◄── REST endpoints
│ │ Database operations
└──────┬──────┘
│
▼
┌─────────────┐
│ PostgreSQL │ (Production) / SQLite (Local)
└─────────────┘
组件
- Telnyx语音AI:处理语音交互和自然语言理解
- MCP服务器:为AI助手提供查询和修改约会数据的工具
- API弗拉斯克:RESTful后端管理预约、患者和医生
- PostgreSQL/SQLite:具有双重支持的数据库(Postgres在生产中,SQLite用于本地开发)
- 前端仪表板:实时查看预约和实践数据
核心功能
AI助手:Telnyx语音AI配置了自定义接待员提示
MCP服务器集成:6个自定义工具(get_doctors、check_availability、book_appointment、重新安排约会、cancel_appointments、get_appointments)
动态Webhook变量:用于个性化问候的呼叫者上下文检索
公共部署:所有服务部署在Railway上,前端部署在Vercel上
技术栈
后端
- python
- 烧瓶 -REST API框架
- PostgreSQL / 数据库 -数据库(生产/开发)
- FastMCP -模型上下文协议服务器
- psycopg -PostgreSQL适配器
- httpx -用于异步操作的HTTP客户端
前端
- HTML/CSS/JavaScript -仪表板界面
- 维塞尔 -前端托管
基础设施
- 铁路 -后端和MCP服务器托管
- Telnyx -语音AI平台
实时部署
服务
统一资源定位符
前端仪表板
https://telnyx-assignment-dashboard.vercel.app/
API弗拉斯克
https://telnyx-assignment-production.up.railway.app/sanity
还可以使用/directors、/references和/dictors来查看这些特定的JSON端点
MCP服务器
https://web-production-24917.up.railway.app/mcp
API终点
GET /doctors-列出所有医生GET /patients-列出所有患者GET /appointments-列出约会(可选?patient_phone=过滤器)GET /appointments/available?doctor_id=&date=-检查可用时隙(即。https://telnyx-assignment-production.up.railway.app/appointments/available?doctor_id=1&date=2025-12-15)POST /appointments-预订新预约PUT /appointments/<id>-更新预约(重新安排或取消)POST /webhook/caller-context-用于呼叫者信息的动态webhook 注意-POST/PUT请求需要JSON正文
GitHub存储库
- API弗拉斯克: https://github.com/grantkazan/telnyx-assignment
- MCP服务器: https://github.com/grantkazan/weather-mcp
- 仪表盘: https://github.com/grantkazan/telnyx-assignment-dashboard
主要特点
动态呼叫者识别
当现有患者呼叫时,webhook会检索他们的姓名。“谢谢你打电话来……嗨,格兰特!”
数据验证
- 防止安排过去的约会
- 防止双重预约患者
- 验证日期格式并处理闰年
- 预约前检查医生的可用性
确认工作流程
机器人在预订前确认所有预约细节:
- 患者姓名和电话号码
- 医生姓名
- 日期和时间
- 等待用户明确确认
实时仪表盘
在一个干净的网络界面中查看所有预约、医生和患者,该界面会随着语音系统的变化而更新。
测试覆盖
快乐之路场景
- 获取可用医生列表
- 检查特定医生和日期的可用时间段
- 按预约ID检索预约信息
- 列出患者的所有预约
- 作为新患者预约(由于Telnyx平台中的电话号码要求,很难进行测试)
- 以现有患者身份预约
- 重新安排现有预约
错误处理场景
- 防止医生同时预约两次
- 拒绝无效日期(例如2月35日、9月31日)
- 正确识别闰年(不是2027年2月29日)
- 拒绝与不存在的医生预约
- 优雅地处理用户错误(例如,输入时打喷嚏、重复信息)
- 防止安排过去的约会
- 防止患者冲突(同一患者、同一时间、不同医生)
已知问题和限制
会话上下文
- 当在一次通话中重新安排多个约会时,机器人可能会引用获取的第一个约会ID,而不是后续的约会ID
- 变通方案:分别呼叫多个约会更新
验证边缘案例
- 取消不存在的约会ID将返回成功(应返回404)
- 如果用户在不提供所需信息的情况下说“确认”,机器人确认接受不完整的数据
- 备注:后端验证工作正常;这些都是用户体验的改进
语音识别
- 电话号码需要清晰的发音才能准确捕捉
- 匿名/被阻止的呼叫者ID路由到语音邮件
- Bot在再见后没有明确结束通话(继续监听)
时间限制
- 从技术上讲,允许在未来预约1秒以上(没有最小缓冲时间)
- 备注:在实践中,语音对话会增加30秒以上的自然延迟
未来改进
优先级增强
- 更好的预约管理:按上下文参考预约(“我的下一个预约”),而不是要求身份证
- 候补名单功能:因取消预约而有空时给患者打电话
- 增强的患者数据:支持更新电话号码、地址、保险信息等。
- 最小预订缓冲区:强制要求预约的最短交付周期为5-10分钟。或其他交付周期。
用户体验
- 多预约对话跟踪改进
- 当预约细节不完整时,进行更明确的确认
- 再见时自动终止通话
最后说明
- 所有测试和演示都可以通过前端网页和电话号码完成。
- 我想有可能克隆所有repo并在本地运行所有内容,但是,自从我的机器和公共设备上都能正常工作以来,我还没有尝试过这种方法。
- 在尝试克隆存储库并设置其他所有内容时,您的里程很可能会有所不同。特别是关于端口和环境变量。
