🤖

AI Agent — Unified Intelligent Assistant

Tự động nhận biết ý định, điều phối 8 services AI trên 4 GPU, hỗ trợ hội thoại có lịch sử và streaming real-time

Port 8099 CPU Orchestrator WebSocket Streaming Intent Detection Session Memory
Mở Chatbot Swagger UI

Khả Năng Nhận Diện Ý Định

AI Agent tự động phân tích tin nhắn + audio/image để chọn đúng service, không cần chỉ định thủ công.

Transcribe

Nhận dạng giọng nói → văn bản

OCR

Trích xuất văn bản từ ảnh

Translate

Dịch thuật đa ngôn ngữ

Search

Tìm mã ICD-10, ICPC2, CPT

Summarize

Tóm tắt văn bản dài

Analyze

Phân tích y tế chuyên sâu

Chat

Hội thoại thông minh có liên tục

TTS

Chuyển văn bản → giọng nói

Patient Sim

Bệnh nhân ảo y tế

GPU Status

Giám sát GPU trực tiếp

Face Recognize

Nhận diện khuôn mặt

💡 Chaining thông minh: Khi gửi audio + "phân tích" → tự động TranscribeAnalyze. Khi gửi ảnh + "tìm mã" → OCRSearch ICD.

Danh Sách Endpoints

MethodEndpointMô tảAuth
GET/healthKiểm tra trạng thái agent
GET/capabilitiesDanh sách services tích hợp
GET/statusHealth check tất cả sub-services
POST/runEndpoint thông minh — tự detect intent từ JSONBearer
POST/run/multipartInput hỗn hợp (text + audio + image)Bearer
POST/chatHội thoại có session memoryBearer
POST/transcribeASR — Audio → văn bảnBearer
POST/ocrOCR từ ảnh/tài liệuBearer
POST/faceNhận diện khuôn mặtBearer
POST/translateDịch thuật đa ngôn ngữBearer
POST/summarizeTóm tắt văn bảnBearer
POST/analyzePhân tích chuyên sâuBearer
POST/searchTìm kiếm mã ICD-10, ICPC2, CPTBearer
POST/ttsText-to-SpeechBearer
POST/patientBệnh nhân ảo y tếBearer
GET/gpuTrạng thái 4 GPUBearer
GET/sessionsDanh sách sessionsBearer
GET/sessions/{id}Chi tiết 1 sessionBearer
WS/ws/chatWebSocket streaming real-timeHeader
POST/pipeline/audio-to-diagnosisPipeline: Audio → Chẩn đoánBearer
POST/pipeline/audio-full-consultPipeline: Audio → Tư vấn → Đọc lạiBearer
POST/pipeline/image-to-codesPipeline: Ảnh → Mã ICDBearer
POST/pipeline/image-full-analysisPipeline: Ảnh → Phân tích đầy đủBearer

Cấu Trúc Response

Tất cả endpoints trả về cùng 1 cấu trúc JSON nhất quán:

{
  "session_id": "uuid-string", // ID session (tự tạo nếu không gửi)
  "intent": "chat", // Intent đã phát hiện
  "response": "Nội dung trả lời...", // Kết quả văn bản chính
  "audio_base64": null, // Base64 audio nếu có TTS
  "data": { ... }, // Dữ liệu phụ (OCR text, search results...)
  "steps": [
    { "step": "classify", "intent": "chat", "confidence": 0.97 },
    { "step": "chat", "service": "gemma2_service" }
  ],
  "duration_ms": 1250, // Thời gian xử lý (ms)
  "error": null // null nếu thành công
}

Ví Dụ Code

Chat thông thường:

# Chat
curl -X POST https://pnt.badt.vn/ai_agent/chat \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message":"Triệu chứng sốt xuất huyết?","language":"vi"}'

Auto-detect intent (endpoint /run):

curl -X POST https://pnt.badt.vn/ai_agent/run \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"message":"Dịch sang tiếng Anh: xin chào bác sĩ"}'

OCR + tìm mã ICD:

curl -X POST https://pnt.badt.vn/ai_agent/ocr \
  -H "Authorization: Bearer $TOKEN" \
  -F "file=@prescription.jpg" \
  -F "search=true"
import requests

BASE = "https://pnt.badt.vn/ai_agent"
TOKEN = "your_api_token"
HDR = {"Authorization": f"Bearer {TOKEN}"}

# Giữ session liên tục qua nhiều tin nhắn
session_id = None
while True:
    msg = input("Bạn: ")
    resp = requests.post(f"{BASE}/chat", headers=HDR, json={
        "message": msg,
        "session_id": session_id,
        "language": "vi"
    }).json()
    session_id = resp["session_id"]
    print(f"AI: {resp['response']}")
const BASE = 'https://pnt.badt.vn/ai_agent';
const TOKEN = 'your_api_token';

async function chat(message, sessionId = null) {
    const res = await fetch(`${BASE}/chat`, {
        method: 'POST',
        headers: { 'Authorization': `Bearer ${TOKEN}`,
                   'Content-Type': 'application/json' },
        body: JSON.stringify({ message, session_id: sessionId, language: 'vi' })
    });
    return res.json();
}

// Tìm kiếm mã ICD-10
const result = await fetch(`${BASE}/search`, {
    method: 'POST',
    headers: { 'Authorization': `Bearer ${TOKEN}`,
               'Content-Type': 'application/json' },
    body: JSON.stringify({ query: 'đau đầu', top_k: 5 })
}).then(r => r.json());
import asyncio, json, websockets

async def stream_chat():
    uri = "wss://pnt.badt.vn/ai_agent/ws/chat"
    hdrs = [("Authorization", "Bearer your_token")]
    async with websockets.connect(uri, extra_headers=hdrs) as ws:
        await ws.send(json.dumps({
            "message": "Triệu chứng viêm phổi?",
            "language": "vi"
        }))
        async for chunk in ws:
            if chunk == "[DONE]": break
            print(chunk, end="", flush=True)

asyncio.run(stream_chat())

Kiến Trúc & Luồng Xử Lý

AI Agent hoạt động như một CPU-only orchestrator, điều phối các GPU services:

Client Request Intent Classifier Context Manager Agent Router

ASR :8020 OCR :8040 LLM :8042 TTS :8041 Search :8060 Face :8001

Unified JSON Response

Các Pipeline Tự Động

🎙️ Audio + "phân tích":
Upload Audio Whisper ASR LLM Analyze Response
📷 Image + "tìm mã":
Upload Image DeepSeek OCR ICD/ICPC Search Response
🔊 Audio Full Consult Pipeline:
Audio ASR LLM Analyze TTS Audio Response

Services Tích Hợp

ServicePortGPUMô tả
medical_transcribe8020RTX 3070 (CVD=0)Whisper Turbo ASR tiếng Việt y tế
deepseek_ocr_service8040RTX 3060 (CVD=3)DeepSeek OCR đa ngôn ngữ
gemma2_service8042RTX 3060 (CVD=1 via :8090)Gemma2-9B-AWQ — LLM chính
qwen_service8043RTX 3060 (CVD=2 via :8091)Qwen2.5-7B — Tool-calling LLM
text2speech_service8041CPUTTS 28+ ngôn ngữ
codefinder8060CPUSemantic search ICD-10/ICPC2/CPT
face_recognition_app8001RTX 3060 (CVD=0)Nhận diện khuôn mặt
medical_patient_simulator8025CPUBệnh nhân ảo y tế (RAG)
🔁 LLM Fallback: Nếu qwen_service không sẵn sàng, agent tự chuyển sang gemma2_service để đảm bảo liên tục.