AI Agent — Unified Intelligent Assistant

Orchestrator thông minh — điều phối 9+ AI services (ASR, OCR, LLM, TTS, CodeFinder, Face Recognition, Patient Simulator). Tự động intent routing, multi-LLM reasoning, WebSocket streaming.

FastAPI Port 8099 SSE Streaming WebSocket Intent Routing Multi-LLM
Manager Dashboard Chatbot
Base URL https://pnt.badt.vn/ai-agent/
Internal Port 8099
Authentication API Token (ai_agent)
Framework FastAPI + Uvicorn
GPU RTX 3060 + RTX 3070 + RTX 5060 Ti
Intents 14 intents

Tính năng nổi bật

Intent Routing

Tự động phân loại request và chọn sub-service phù hợp

Multi-LLM

Gemma4, Qwen3 14B, Qwen2.5 7B — tự động chọn model

SSE Streaming

Response streaming real-time cho chat và code

WebSocket

Chat duplex streaming với auth tích hợp

OpenAI Compatible

Drop-in /v1/chat/completions + /v1/models

Pipelines

Audio→Diagnosis, Image→Codes, Audio→Consult

Shell Exec

Chạy lệnh shell tự nhiên qua NL → command

Session Mgmt

Context-aware, multi-turn conversation

GPU Monitor

Theo dõi GPU status real-time

Authentication

Tất cả endpoints (trừ /, /health, /capabilities) yêu cầu API token trong header:

# Header required for all authenticated endpoints Authorization: Bearer <AI_AGENT_API_TOKEN>

Token scope: ai_agent — được cấu hình trong shared/api_auth_middleware.py.

WebSocket auth: Query param ?token=xxx hoặc JSON frame đầu tiên: {"type":"auth","token":"xxx"}.

Intent System

AI Agent tự động phân loại intent từ message người dùng. Có thể force intent qua parameter force_intent.

chat

Hội thoại chung

transcribe

ASR → Medical Transcribe

ocr

OCR → DeepSeek OCR

search_code

Search → CodeFinder

translate

Dịch thuật → LLM

summarize

Tóm tắt → LLM

analyze

Phân tích → LLM

tts

Text → Speech

code

Sinh code → Qwen3

debug

Debug code → Qwen3

patient_sim

Bệnh nhân ảo

face_recognize

Nhận dạng khuôn mặt

shell

Shell command

auto

Tự động detect

Danh mục Endpoints

MethodEndpointTagsDescription
GET/InfoService info
GET/healthInfoHealth check
GET/capabilitiesInfoDanh sách sub-services
GET/statusInfoStatus tất cả sub-services
POST/runAgentRun agent (auto-intent + streaming)
POST/run/multipartAgentRun with audio+image upload
POST/chatChatChat force-intent
POST/chat/rawAgentDirect LLM with messages array
POST/v1/chat/completionsOpenAIOpenAI-compatible chat
GET/v1/modelsOpenAIList available LLM models
POST/transcribeASRSpeech-to-text
POST/ocrOCRImage-to-text
POST/faceFaceFace recognition
POST/analyzeAnalysisPhân tích văn bản
POST/translateTranslationDịch thuật
POST/summarizeAnalysisTóm tắt văn bản
POST/searchSearchMedical code search
POST/ttsTTSText-to-speech
POST/patientMedical EduPatient simulator
POST/codeCodeCode generation (Qwen3)
POST/debugCodeCode debugging (Qwen3)
POST/shellShellExecute shell command
GET/gpuMonitoringGPU status
GET/sessionsSessionsList sessions
DELETE/sessions/{id}SessionsXóa session
GET/sessions/{id}SessionsGet session detail
WS/ws/chatAgentWebSocket streaming chat
POST/pipeline/audio-to-diagnosisPipelineAudio → diagnosis
POST/pipeline/audio-full-consultPipelineAudio → consult (with TTS)
POST/pipeline/image-to-codesPipelineImage → medical codes
POST/pipeline/image-full-analysisPipelineImage → full analysis

Info Endpoints

GET/Info

Thông tin service: tên, version, port, status, link docs.

Response:

{ "service": "AI Agent", "version": "1.0.0", "port": 8099, "status": "running", "docs": "/docs" }
GET/healthInfo

Health check. Returns 503 nếu agent chưa ready.

{"status":"healthy","service":"ai_agent","port":8099}
GET/capabilitiesInfo

Danh sách tất cả sub-services: id, name, description, tags, GPU.

GET/statusInfoAuth

Kiểm tra health status của tất cả sub-services (ASR, OCR, 3x LLM, TTS, CodeFinder, Face Recog, Patient Sim).

Agent Endpoints

POST/runAgentAuth

Endpoint chính của AI Agent. Tự động detect intent, chọn LLM, điều phối sub-services.

Request Body (JSON):

ParamTypeDefaultDescription
messagestring""Nội dung message
session_idstring|nullnullSession ID cho multi-turn
languagestring"vi"Ngôn ngữ (vi/en)
force_intentstring|nullnullForce intent (chat/transcribe/ocr/...)
force_llmstring|nullnullForce LLM (gemma4_service/qwen3_service)
streamboolfalseSSE streaming response

Streaming (SSE): Khi stream=true, response là SSE stream. Mỗi chunk là text fragment. Kết thúc với data: [DONE].

cURL:

curl -X POST https://pnt.badt.vn/ai-agent/run \
  -H "Authorization: Bearer $AI_AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message":"tóm tắt bệnh án: sốt 39°C, ho khan 5 ngày","language":"vi"}'

Response:

{ "response": "Bệnh nhân sốt cao 39°C kèm ho khan 5 ngày, cần xét nghiệm thêm...", "intent": "analyze", "model": "gemma4_service", "session_id": "abc123", "processing_time_ms": 2340 }
POST/run/multipartAgentAuth

Giống /run nhưng dùng multipart/form-data để upload audio/image.

Form fields: message, session_id, language, force_intent + file fields audio (WAV/MP3), image (JPG/PNG).

POST/chat/rawAgentAuth

Direct LLM call với messages array. Dùng cho PHP agent loop tool-calling.

Request Body:

ParamTypeDefaultDescription
messagesarrayArray of {role, content} objects
systemstring|nullnullSystem prompt override
force_llmstring|nullnullgemma4_service / qwen3_service / qwen_service
max_tokensint2048Max tokens
temperaturefloat0.3Sampling temp

cURL:

curl -X POST https://pnt.badt.vn/ai-agent/chat/raw \
  -H "Authorization: Bearer $AI_AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"messages":[{"role":"user","content":"Xin chào"}],"force_llm":"gemma4_service"}'

Chat & OpenAI-Compatible Endpoints

POST/chatChatAuth

Chat với force_intent="chat". Hỗ trợ SSE streaming.

Request Body: message, session_id, language, stream, max_tokens, temperature.

POST/v1/chat/completionsOpenAIAuth

OpenAI-compatible chat completion. Drop-in cho bất kỳ app nào dùng openai SDK.

Request Body:

ParamTypeDefaultDescription
modelstring|nullnullgemma4_service / qwen3_service / qwen_service (auto nếu null)
messagesarrayArray of {role, content} objects
temperaturefloat0.7Sampling temp
max_tokensint2048Max tokens
streamboolfalseStreaming (reserved)
systemstring|nullnullSystem prompt convenience field

cURL:

curl -X POST https://pnt.badt.vn/ai-agent/v1/chat/completions \
  -H "Authorization: Bearer $AI_AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"model":"gemma4_service","messages":[{"role":"user","content":"Hello"}],"temperature":0.7}'

Response:

{ "id": "chatcmpl-a1b2c3d4e5f6", "object": "chat.completion", "created": 1747032000, "model": "gemma4_service", "choices": [{ "index": 0, "message": {"role": "assistant", "content": "Xin chào! Tôi có thể giúp gì bạn?"}, "finish_reason": "stop" }], "usage": {"prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0} }
GET/v1/modelsOpenAIAuth

List available LLM models (gemma4_service, qwen3_service, qwen_service).

{ "object": "list", "data": [ {"id": "gemma4_service", "object": "model", "owned_by": "local"}, {"id": "qwen3_service", "object": "model", "owned_by": "local"}, {"id": "qwen_service", "object": "model", "owned_by": "local"} ] }

ASR & OCR & Face Endpoints

POST/transcribeASRAuth

Speech-to-text. Upload file audio, nhận transcription.

multipart/form-data:

FieldTypeDefaultDescription
filefileAudio file (WAV/MP3/OGG)
languagestring"vi"Ngôn ngữ
analyzeboolfalsePhân tích nội dung sau ASR
curl -X POST https://pnt.badt.vn/ai-agent/transcribe \
  -H "Authorization: Bearer $AI_AGENT_TOKEN" \
  -F "file=@recording.wav" -F "language=vi"
POST/ocrOCRAuth

Image-to-text. Upload ảnh, nhận văn bản trích xuất.

Fields: file (image), analyze (bool), search (bool → tìm mã y tế).

POST/faceFaceAuth

Face recognition. Upload ảnh khuôn mặt, nhận kết quả nhận dạng.

Analysis, Translation & Search Endpoints

POST/analyzeAnalysisAuth

Phân tích văn bản với LLM. Force intent "analyze".

Request: message, session_id, language.

POST/translateTranslationAuth

Dịch thuật với LLM.

Request Body:

ParamTypeDefaultDescription
textstringVăn bản cần dịch
source_langstring"auto"Ngôn ngữ nguồn
target_langstring"vi"Ngôn ngữ đích
session_idstring|nullnullSession ID
curl -X POST https://pnt.badt.vn/ai-agent/translate \
  -H "Authorization: Bearer $AI_AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"text":"Hello doctor","source_lang":"en","target_lang":"vi"}'

Response:

{ "response": "Xin chào bác sĩ", "source_text": "Hello doctor", "target_lang": "vi", "translated": "Xin chào bác sĩ", "intent": "translate", "model": "gemma4_service" }
POST/summarizeAnalysisAuth

Tóm tắt văn bản với LLM. Force intent "summarize".

Request: text, max_tokens, session_id.

POST/searchSearchAuth

Medical code search thông qua CodeFinder adapter.

Request Body:

ParamTypeDefaultDescription
querystringTừ khóa tìm kiếm
code_typesarray|nullnull["ICD10","ICPC2","CPT","SERVICE","PROCEDURE"]
top_kint10Số kết quả
hybridbooltrueHybrid search
curl -X POST https://pnt.badt.vn/ai-agent/search \
  -H "Authorization: Bearer $AI_AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"query":"tăng huyết áp","code_types":["ICD10"],"top_k":5}'

TTS & Medical Endpoints

POST/ttsTTSAuth

Text-to-speech. Chuyển văn bản thành giọng nói.

Request: text, language ("vi"/"en"), speed (1.0).

POST/patientMedical EduAuth

Tương tác với bệnh nhân ảo (Patient Simulator).

Request: message, patient_id, session_id.

Code & Shell Endpoints

POST/codeCodeAuth

Code generation. Tự động route sang Qwen3 14B cho code quality tốt nhất. Hỗ trợ SSE streaming.

Request: message, session_id, language, stream.

curl -X POST https://pnt.badt.vn/ai-agent/code \
  -H "Authorization: Bearer $AI_AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message":"Viết Python Flask REST API cho CRUD bệnh nhân","stream":false}'
POST/debugCodeAuth

Code debugging. Paste code + error message → Qwen3 phân tích và sửa lỗi. Hỗ trợ SSE streaming.

POST/shellShellAuth

Execute shell command trên server.

Request Body:

ParamTypeDefaultDescription
commandstringRaw command hoặc NL description (VD: "hiển thị 20 dòng cuối log")
workdirstring|nullnullWorking directory
timeoutint60Timeout seconds

Note: Dangerous commands (rm -rf /, mkfs, fork-bomb) bị block. Feature có thể tắt qua config SHELL_EXEC_ENABLED.

Monitoring & Session Endpoints

GET/gpuMonitoringAuth

GPU status real-time: temperature, utilization, memory usage cho tất cả GPU (RTX 3060, 3070, 5060 Ti).

GET/sessionsSessionsAuth

List tất cả active sessions.

GET/sessions/{session_id}SessionsAuth

Get session detail: messages history với role + content + timestamp.

DELETE/sessions/{session_id}SessionsAuth

Xóa session. Returns 404 nếu không tìm thấy.

{"deleted": "session_abc123"}

WebSocket Endpoint

WS/ws/chat?token=xxxAgent

WebSocket streaming chat với auth tích hợp.

Auth:

  • Query param: /ws/chat?token=AI_AGENT_TOKEN
  • Hoặc JSON frame đầu tiên: {"type":"auth","token":"xxx"}

Flow:

  1. Client gửi auth → server trả {"type":"auth_ok"}
  2. Client gửi JSON: {"message":"...","session_id":"...","language":"vi","force_intent":"...","force_llm":"..."}
  3. Server stream text fragments, chunk đầu là metadata {"intent":"...","model":"..."}
  4. Kết thúc: [DONE]

JavaScript example:

const ws = new WebSocket("wss://pnt.badt.vn/ai-agent/ws/chat?token=" + token);
ws.onmessage = (e) => {
  if (e.data === "[DONE]") { ws.close(); return; }
  // Parse JSON or plain text
  try { const meta = JSON.parse(e.data); console.log("Meta:", meta); }
  catch { console.log("Chunk:", e.data); }
};
ws.send(JSON.stringify({message:"Xin chào",language:"vi"}));

Pipeline Endpoints

Pipeline kết hợp nhiều service trong một request.

POST/pipeline/audio-to-diagnosisPipelineAuth

Audio → Diagnosis: Nhận audio đầu vào → ASR transcription → LLM phân tích triệu chứng. multipart/form-data với file + language.

POST/pipeline/audio-full-consultPipelineAuth

Audio → Consult + TTS: ASR → LLM tư vấn → TTS đọc lại kết quả. Trả về cả text + audio_base64.

POST/pipeline/image-to-codesPipelineAuth

Image → Medical Codes: OCR trích xuất text → LLM tìm mã ICD10/ICPC2.

POST/pipeline/image-full-analysisPipelineAuth

Image → Full Analysis: OCR → LLM phân tích chi tiết nội dung ảnh.

Thông số kỹ thuật

ServiceAI Agent (FastAPI)
Internal Port8099
FrameworkFastAPI + Uvicorn
AuthToken-based (ai_agent scope)
Primary LLMGemma4 E4B (INT4, 128K ctx)
Reasoning LLMQwen3 14B (Claude-distilled)
Fallback LLMQwen2.5 7B (AWQ)
Sub-services9 services
StreamingSSE + WebSocket
SessionIn-memory context manager
GPU 1RTX 3070 (ASR)
GPU 2RTX 3060 (OCR + LLMs)
GPU 3RTX 5060 Ti (Qwen3 14B)
OpenAI Compatible/v1/chat + /v1/models

Error Codes

HTTP StatusMeaningCommon Causes
200SuccessRequest processed successfully
401UnauthorizedMissing/invalid API token
403ForbiddenShell exec disabled or dangerous command blocked
404Not FoundSession ID không tồn tại
502Bad GatewaySub-service LLM timeout hoặc lỗi
503Service UnavailableAgent chưa ready