基于 FreeSWITCH、Spring Boot 和 Vue 3 的开源呼叫中心系统,支持多租户、人工呼入呼出、智能外呼任务、ACD 技能组路由、IVR、WebRTC 坐席与录音管理,适用于企业客服和外呼业务,也可作为 AI 语音应用的呼叫底座。
An enterprise-grade AI call center system built on FreeSwitch and Spring Boot, providing multi-tenant, multi-skill-group, and intelligent routing — a complete set of call center capabilities.
中文 | English
🌟 If this project helps you, please give it a ⭐ Star! 🙏
Official site: https://dongjb741280.github.io/ai-call-center/
This is an AI call center solution built on a microservices architecture, integrating FreeSwitch as the call engine and providing complete call management, agent management, intelligent routing, monitoring and statistics. It supports multi-company and multi-skill-group management, with enterprise-grade high-concurrency and high-availability characteristics.
This project is primarily intended for large-scale human inbound and outbound calling scenarios, or as the foundation for AI-powered unattended calling.
For a pure AI call center (unattended-first), please refer to:
| Dashboard | Agent Management |
|---|---|
![]() |
![]() |
| IVR Management | Agent Monitor |
|---|---|
![]() |
![]() |
flowchart LR
AG[Agent Console<br/>Vue3 + JsSIP Softphone] -- WebSocket --> CALL
CP[Caller / Customer] -- SIP/RTP --> FS[FreeSWITCH<br/>Media & Signaling]
FS <-- "ESL events / commands" --> CALL[voxai-call<br/>Call Control :7200]
FS -. Local recording files .-> MEDIA[FS_MEDIA<br/>Recording File Server :7430]
CALL -- HTTP GET recordings --> MEDIA
CALL -- HTTP --> IVR[voxai-ivr<br/>IVR Engine :7300]
IVR -- callback --> CALL
ADMIN[voxai-admin<br/>Admin API :7100] -- config --> CALL
CALL --> R[(Redis)]
CALL --> DB[(MySQL)]
CALL -- Upload recordings --> M[(MinIO)]
ADMIN --> DB
ADMIN --> N[Nacos]
CALL --> N
FS_MEDIA serves FreeSWITCH local recording files over HTTP on port 7430. After hangup, voxai-call downloads recordings from this server and uploads them to MinIO. See Recording Upload Flow.
ai-call-center/
├── voxai-common/ # Core business module (data layer)
├── voxai-admin/ # Admin API service (port 7100)
├── voxai-call/ # FreeSwitch integration service (port 7200)
├── voxai-ivr/ # IVR engine service (port 7300)
├── voxai-dialer/ # External outbound scheduler (HTTP client, disabled by default)
├── freeswitch/ # FreeSwitch configuration and Docker image
├── portal/ # Product portal (VoxHub)
├── docs/ # Business docs (scope/flows/data model/engine interfaces)
├── .github/workflows/ # GitHub Actions (portal CI/CD)
├── .gitlab-ci.yml # GitLab CI/CD pipeline
└── Dockerfile # Multi-stage Docker build
- Backend framework: Spring Boot 2.3.12
- Microservices: Spring Cloud + Nacos
- Database: MySQL/PostgreSQL/Oracle/SQL Server (multi-database support)
- Cache: Redis
- Message queue: RabbitMQ (optional Kafka)
- File storage: MinIO
- Call engine: FreeSwitch
- Build tool: Maven + Jib (build images without a Docker Daemon)
- Image registry: Harbor
- Containerization: Docker
- CI/CD: GitLab CI + Watchtower auto-deploy
- Entities: company, agent, skill group, call records and other business entities
- Data access: MyBatis mappers
- Utilities: encryption, ID generation and other common utilities
- Administration: agent management, skill group management, company configuration
- Auth: Spring Security + JWT
- Scheduled tasks: Quartz scheduler
- Statistics: call statistics, agent state statistics
- File management: MinIO integration
- Call control: inbound/outbound, transfer, hold, mute, etc.
- Intelligent routing: ACD (Automatic Call Distribution) algorithms
- Agent state: real-time state management and monitoring
- WebSocket: real-time communication
- TCP service: agent state subscription
- Event handling: FreeSwitch event listening and processing
- Flow engine: parses
cc_ivr_workflow.contentinto a node graph, executes by play/input/transfer - Interaction: playback and digit collection via FreeSwitch
playback/play_and_get_digits - Handoff: calls back
voxai-callon completion to route to skill group/agent/VDN/hangup
Independent scheduler with cruise/predictive pacing, command acknowledgements, lease recovery and CDR result submission. See deployment and recovery before enabling.
- Inbound handling: automatic routing to a skill group
- Outbound: agent-initiated calls
- Call transfer: agent-to-agent transfer, skill-group transfer
- Call hold: hold / unhold
- Mute control: agent mute / unmute
- VDN identification: service number matches
cc_vdn_phone→cc_vdn_code, selects the active route bycc_vdn_schedule(weekday/date/time range) - Route types (
cc_vdn_config.route_type): skill group / playback / IVR / agent / outbound - Digit navigation: collect digits with
play_and_get_digitsafter playback, match againstcc_vdn_dtmfto route to skill group/IVR/route code/agent extension/hangup - IVR engine:
voxai-ivrparses thecc_ivr_workflowdefinition, executes play/input/transfer, then hands back
- Multiple assignment strategies:
- Least answered
- Least talk time
- Longest ready
- Random
- Round-robin
- Custom
- Queuing strategies: priority queue, VIP queue
- Overflow handling: queue timeout, skill-group overflow
- Memory agent: match the customer's historical agent
- State management: ready, busy, talking, offline, etc.
- Multiple login methods: SIP, WebRTC, phone
- Access control: role-based permission management
- Real-time monitoring: agent state, call state
- Statistics: call volume, answer rate, average talk time
- Report export: Excel report export
- JDK 1.8+
- Maven 3.6+
- MySQL 5.7+ / PostgreSQL 10+ / Oracle 11g+ / SQL Server 2016+
- Redis 5.0+
- FreeSwitch 1.10+
- Docker & Docker Compose
- Create the database
- Initialize the database: table scripts and migration SQL are under
docs/sql/(voxai.sqlfull database dump,migration_*.sqlincremental migrations) - Update the database connection settings in the config file
Edit application-dev.properties:
# Database
spring.datasource.url=jdbc:mysql://localhost:3306/voxai
spring.datasource.username=root
spring.datasource.password=your_password
# Redis
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=your_redis_password
# MinIO
voxai.minio.endpoint=http://localhost:9000
voxai.minio.access.key=admin
voxai.minio.secret.key=your_secret_key# Build all modules (skip tests)
mvn clean install -DskipTests
# Build a single module
mvn clean install -pl voxai-admin -DskipTests# voxai-admin (admin backend, port 7100)
java -jar voxai-admin/target/voxai-admin-1.0.0.jar
# voxai-call (call service, port 7200)
java -jar voxai-call/target/voxai-call-1.0.0.jar
# voxai-ivr (IVR engine, port 7300)
java -jar voxai-ivr/target/voxai-ivr-1.0.0.jar# Build and push to Harbor
mvn compile jib:build -pl voxai-admin,voxai-call \
-DsendCredentialsOverHttp=true \
-Ddocker.repostory=localhost:8444 \
-Djib.to.tags=latest
# Or build to the local Docker Daemon
mvn compile jib:dockerBuild -pl voxai-admin# Pull from Harbor and start
docker pull localhost:8444/voxai/voxai-admin:latest
docker run -d --name voxai-admin --network host \
localhost:8444/voxai/voxai-admin:latest- voxai-admin:
http://localhost:7100/voxai-admin/swagger-ui/index.html - voxai-call:
http://localhost:7200/voxai-call/swagger-ui/index.html
- voxai-admin: admin backend service (port 7100)
- voxai-call: call control service (port 7200)
- voxai-ivr: IVR engine service (port 7300)
- FS_MEDIA: recording file server on the FreeSWITCH media node (HTTP port 7430), used by
voxai-callto retrieve local recordings - freeswitch: call engine (port 5060)
- MySQL: business data storage
- Redis: cache and session storage
- MinIO: recording files and media storage
Compile → Unit Tests → SonarQube → Package → Jib Build (Harbor) → Nexus Publish → 1Panel API Deploy
↓
Watchtower (k8s-work-4)
Dual safeguard, auto pull & restart
- CI (GitLab): build, test, code scan, Jib pushes images to Harbor
- Harbor: local image registry (
localhost:8444) - Dual CD safeguard:
- Option A (1Panel API): CI actively triggers
images/pull+containers/upgrade - Option B (Watchtower): runs in the background on k8s-work-4, periodically checks and auto-deploys
- Both coexist without conflict; either one succeeding is enough
- Option A (1Panel API): CI actively triggers
docker run -d \
--name watchtower --restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /root/.docker/config.json:/config.json \
-e DOCKER_CONFIG=/ \
containrrr/watchtower \
--interval 30 --cleanup \
voxai-admin voxai-callDepends on the Harbor login credentials in
/root/.docker/config.json
| Variable | Description |
|---|---|
HARBOR_REGISTRY |
Harbor image registry address |
HARBOR_REGISTRY_USER |
Harbor username |
HARBOR_REGISTRY_PASS |
Harbor password |
ONEPANEL_URL |
1Panel panel address (Option A) |
ONEPANEL_API_KEY |
1Panel API Key (Option A) |
SONAR_HOST_URL |
SonarQube server address |
SONAR_TOKEN |
SonarQube Token |
NEXUS_URL / NEXUS_USER / NEXUS_PASSWORD |
Nexus repository credentials |
- Development (dev)
- Production (prod)
- Nacos config center integration
- MySQL (primary)
- PostgreSQL
- Oracle
- SQL Server
- JWT token authentication
- Encrypted password storage
- API permission control
Admin context path
/voxai-admin(port 7100), call context path/voxai-call(port 7200).
POST /voxai-admin/index/login- admin loginGET /voxai-admin/index/logout- admin logoutGET /voxai-admin/index/health- admin health checkGET /voxai-call/index/health- call health check
GET /voxai-admin/config/agent- agent listPOST /voxai-admin/config/agent- add agentGET /voxai-admin/config/group- skill group listPOST /voxai-admin/config/group- add skill groupGET /voxai-admin/config/group/agent/{id}- agents in a skill group
POST /voxai-call/cti/call/makeCall- make a callPOST /voxai-call/cti/call/hangup- hang upPOST /voxai-call/cti/call/hold/cancelHold- hold / unholdPOST /voxai-call/cti/call/readyMute/cancelMute- mute / unmutePOST /voxai-call/cti/agent/ready/notReady- set ready / not readyPOST /voxai-call/cti/agent/logout- agent logoutGET /voxai-call/cti/admin/call- call list
GET /voxai-admin/index/health- voxai-admin health check (port 7100)GET /voxai-call/index/health- voxai-call health check (port 7200)
- Logback logging configuration
- ELK log collection support
- Structured log output
- Prometheus metrics collection
- JVM performance monitoring
- Database connection pool monitoring
src/main/java/
├── com.voxai.api/ # API service
│ ├── web/ # Controller layer
│ ├── service/ # Service layer
│ └── configration/ # Configuration classes
├── com.voxai.core/ # Core module
│ ├── entity/ # Entities
│ ├── mapper/ # Data access layer
│ └── enums/ # Enums
└── com.voxai/ # FreeSwitch integration
├── cc/ # Call control
├── fs/ # FreeSwitch event handling
└── websocket/ # WebSocket communication
- Follow the Alibaba Java Development Manual
- Use a unified exception handling mechanism
- Support multi-tenant data isolation
- Async processing for better performance
A: Refer to the configuration files under freeswitch/, which support both CentOS and Debian.
A: Implement a new assignment algorithm under voxai-call/src/main/java/com/voxai/cc/acd/assign/.
A: Integrate via WebHook callbacks or message queues, supporting HTTP and RabbitMQ.
A: Add new entities and interfaces in the voxai-common module, and implement the concrete business logic in voxai-admin.
This project is licensed under the MIT License. See the LICENSE file for details.
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Author: dongjianbin
- Email: [email protected]
- Repository: GitHub Repository
- Integrated Jib image builds, removing the Docker Daemon dependency
- Added GitLab CI + Harbor + Watchtower auto-deploy pipeline
- Unified Harbor environment variable naming (
HARBOR_REGISTRYprefix)
- Initial release
- Basic call center features
- FreeSwitch call engine integration
- Multi-tenant management
- Complete API endpoints
Note: This project is for learning and research only. For commercial use, please ensure compliance with relevant laws and regulations.





