Thực hành AI Local · Bài 10

Dựng router lai AI Local và cloud bằng LiteLLM

Bài thực hành cho người đã chạy Ollama và có khoá API của một dịch vụ đám mây, muốn mọi ứng dụng gọi qua một địa chỉ duy nhất: việc thường ngày chạy model trên máy, khi model local lỗi thì tự chuyển sang đám mây. Đi từng bước với LiteLLM Proxy: viết config.yaml, chạy bằng Docker, khoá bằng master key, đặt ngân sách có database, gọi thử và kiểm tra sức khoẻ. Dữ kiện đối chiếu tài liệu chính thức LiteLLM ngày 20–21/10/2026.

Cập nhật 21/10/2026⏱ 10 phút đọcCài đặt & bắt đầuTrung cấp → Nâng cao

Model local cho việc thường ngày, đám mây cho lúc cần

Một nhóm Marketing đã chạy Ollama cho việc tóm tắt, viết nháp. Nhưng mỗi ứng dụng lại cấu hình riêng: n8n trỏ thẳng Ollama, công cụ viết bài dùng khoá API đám mây, khi máy local tắt thì mọi thứ dừng, còn hoá đơn API không ai nắm. (Tình huống minh hoạ.)

Router lai giải quyết việc đó: mọi ứng dụng gọi một địa chỉ, router quyết định gửi tới model trên máy hay model đám mây. Phần lý thuyết đã có ở AI Local làm bộ não cho AI Agent; bài này đi từng bước với LiteLLM.

Router lai AI Local và cloud là gì?

Router lai AI Local và cloud là một proxy đứng giữa ứng dụng và các model: ứng dụng gọi một địa chỉ tương thích OpenAI, proxy gửi yêu cầu tới model chạy trên máy và tự chuyển sang model đám mây khi model local lỗi, đồng thời kiểm soát khoá và chi tiêu.

LiteLLM là một proxy như vậy: gọi hơn 100 API model theo chuẩn OpenAI, có theo dõi chi phí, cân bằng tải, ghi log; giấy phép MIT, trừ thư mục enterprise/. Bản ổn định mới nhất trên GitHub là v1.106.0 (18/10/2026).

Router lai AI Local và cloud bằng LiteLLM: n8n, OpenClaw, Hermes, ứng dụng nội bộ gọi một địa chỉ LiteLLM Proxy cổng 4000 có master key; model local qua ollama_chat tới Ollama cổng 11434; khi local lỗi, fallbacks chuyển sang model đám mây; tên model noi-bo chỉ chạy local cho dữ liệu nhạy cảm; ngân sách max_budget cần database Postgres
Hình: Một địa chỉ cho mọi ứng dụng, local làm chính, đám mây dự phòng (minh hoạ)
  1. Ứng dụngn8n, OpenClaw, Hermes, công cụ nội bộ gọi cổng 4000
  2. LiteLLM ProxyKiểm tra khoá, chọn model theo tên
  3. Model localollama_chat tới Ollama cổng 11434
  4. Dự phòng đám mâyChỉ khi model local lỗi sau số lần thử lại
Đường đi của một yêu cầu qua router lai.

Nguồn: LiteLLM GitHub · LiteLLM – bản mới nhất

Chuẩn bị

Nguồn: LiteLLM – Quick start

Bước 1: Viết config.yaml

Tệp config.yaml có các khối chính: model_list (danh sách model), litellm_settings, router_settings, general_settings. Mỗi model có model_name là tên ứng dụng gọi, litellm_params.model là model thật. Khoá đọc từ biến môi trường bằng os.environ/…. Tài liệu không có một tệp mẫu gộp đủ Ollama, đám mây và master key, nên mẫu dưới đây ghép từ cú pháp chính thức của trang Ollama, Anthropic, Fallbacks và Budgets; hãy thử trên máy thử trước:

config.yaml cho router laiCopy rồi lưu thành config.yaml trên máy chạy LiteLLM; thay phần trong <…>
model_list:
  - model_name: local                       # tên ứng dụng sẽ gọi
    litellm_params:
      model: ollama_chat/<tên model Ollama>
      api_base: http://host.docker.internal:11434   # chạy LiteLLM thẳng trên máy: http://localhost:11434
      keep_alive: "8m"                      # giữ model trong bộ nhớ 8 phút
    model_info:
      supports_function_calling: true       # chỉ để true khi model có gọi công cụ (tools)
  - model_name: noi-bo                      # chỉ chạy local, KHÔNG có dự phòng: dùng cho dữ liệu nhạy cảm
    litellm_params:
      model: ollama_chat/<tên model Ollama>
      api_base: http://host.docker.internal:11434
  - model_name: cloud
    litellm_params:
      model: anthropic/<tên model Claude>
      api_key: os.environ/ANTHROPIC_API_KEY   # khoá đọc từ biến môi trường

litellm_settings:
  num_retries: 2              # thử lại trên cùng model trước khi chuyển
  request_timeout: 120        # giây; ví dụ trong docs là 10, model local chậm nên để dài hơn
  fallbacks: [{"local": ["cloud"]}]   # local lỗi thì chuyển sang cloud
  allowed_fails: 3
  cooldown_time: 30           # tạm ngưng model lỗi trong 30 giây

general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY
MụcÝ nghĩa
ollama_chat/…Gọi Ollama theo kiểu chat; tài liệu LiteLLM khuyên dùng ollama_chat
api_baseĐịa chỉ Ollama. LiteLLM trong Docker dùng host.docker.internal; chạy thẳng trên máy dùng localhost
keep_aliveGiữ model trong bộ nhớ bao lâu; -1 là giữ mãi
fallbacksChạy theo thứ tự danh sách khi model chính lỗi sau num_retries lần
context_window_fallbacksTuỳ chọn: chuyển model khi câu hỏi vượt context của model local
cooldown_time, allowed_failsTạm ngưng model lỗi nhiều để không gọi mãi vào máy đang hỏng
master_keyKhoá quản trị; trang Virtual Keys ghi phải bắt đầu bằng sk-
Model noi-bo không nằm trong fallbacks: khi Ollama tắt, yêu cầu báo lỗi thay vì gửi dữ liệu lên đám mây. Đây là cách giữ đúng nguyên tắc "dữ liệu nhạy cảm ở lại máy".

Nguồn: LiteLLM – config.yaml · LiteLLM – Ollama · LiteLLM – Anthropic · LiteLLM – Fallbacks · LiteLLM – Virtual keys

Bước 2: Chạy LiteLLM bằng Docker

Đặt khoá vào tệp .env cạnh config.yaml, không ghi thẳng vào lệnh hay vào config:

Tệp .envTạo trên máy chạy LiteLLM; không dán vào chat hay prompt
# Tạo tệp .env cạnh config.yaml; không gửi tệp này cho ai, không đưa lên Git
LITELLM_MASTER_KEY=sk-<chuỗi ngẫu nhiên dài>
ANTHROPIC_API_KEY=<khoá API đám mây>

Lệnh dưới đây ghép từ lệnh Docker không database của tài liệu LiteLLM cùng cú pháp Docker chung (--env-file, gắn cổng vào 127.0.0.1, --add-host như trang n8n dùng cho Linux). Hãy thử trên máy thử trước:

Lệnh trên máy tính của bạnDán vào Terminal trong thư mục chứa config.yaml và .env; thay phần trong <…>
openssl rand -hex 32          # tạo chuỗi ngẫu nhiên cho master key (thêm sk- ở đầu)

docker run -d --name litellm \
  -v $(pwd)/config.yaml:/app/config.yaml \
  --env-file .env \
  --add-host host.docker.internal:host-gateway \
  -p 127.0.0.1:4000:4000 \
  ghcr.io/berriai/litellm:<tag phiên bản trên trang Releases> \
  --config /app/config.yaml

Nguồn: LiteLLM – Docker quick start · LiteLLM – Deploy · LiteLLM – Release cycle · n8n – host.docker.internal trên Linux

Bước 3: Gọi thử và kiểm tra đã chạy đúng

Lệnh trên máy tính của bạnDán vào Terminal trên máy chạy LiteLLM; đặt LITELLM_API_KEY là master key hoặc virtual key
curl http://localhost:4000/health/liveliness          # không cần khoá, trả "I'm alive!"

curl -X POST 'http://localhost:4000/chat/completions' \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $LITELLM_API_KEY" \
  -d '{"model": "local", "messages": [{"role": "user", "content": "Chào bạn, bạn là model nào?"}]}'
GET /health (cần khoá) gọi thật tới từng model nên tốn token phía đám mây; đừng đặt lịch gọi dày. Theo dõi tình trạng thường xuyên thì dùng /health/liveliness.

Nguồn: LiteLLM – Health · LiteLLM – gọi thử · LiteLLM – SDK OpenAI

Bước 4: Ngân sách và khoá riêng cho từng ứng dụng (cần database)

Điểm dễ nhầm nhất: không có database thì max_budget không có tác dụng, proxy vẫn phục vụ khi đã vượt. Virtual key (khoá con cấp cho từng ứng dụng) cũng cần Postgres và master key. Tài liệu có sẵn bộ Docker Compose gồm LiteLLM và Postgres:

Lệnh trên máy tính của bạnDán vào Terminal trong một thư mục mới; lệnh nguyên văn docs, thêm dòng LITELLM_BIND
curl -sSLO https://github.com/BerriAI/litellm/raw/main/docker/docker-compose.quickstart.yml
printf 'LITELLM_MASTER_KEY=sk-%s\nLITELLM_SALT_KEY=sk-%s\n' "$(openssl rand -hex 32)" "$(openssl rand -hex 32)" > .env
echo 'LITELLM_BIND=127.0.0.1:' >> .env      # chỉ nghe trên chính máy (biến có trong tệp compose)
docker compose -f docker-compose.quickstart.yml up -d
  1. Giữ nguyên tệp .env: LITELLM_SALT_KEY không được đổi sau khi đã thêm model, đổi đi thì thông tin đăng nhập đã lưu không đọc được nữa.
  2. Bộ compose này không gắn config.yaml; model lưu trong database. Mở http://localhost:4000/ui, đăng nhập user admin, mật khẩu là master key nếu chưa đặt UI_PASSWORD, rồi thêm model local và model đám mây. Trên Linux, nếu container không gọi được host.docker.internal, cần thêm ánh xạ host-gateway tương tự --add-host (cú pháp Docker chung, thử trên máy thử trước).
  3. Tạo virtual key có ngân sách cho từng ứng dụng bằng lệnh dưới. Vượt ngân sách, yêu cầu bị từ chối với lỗi ExceededTokenBudget; không đặt budget_duration thì ngân sách không bao giờ đặt lại.
Lệnh trên máy tính của bạnDán vào Terminal trên máy chạy LiteLLM; thay master key
curl 'http://localhost:4000/key/generate' \
--header 'Authorization: Bearer <master key>' \
--header 'Content-Type: application/json' \
--data-raw '{"max_budget": 10, "budget_duration": "30d"}'   # 10 USD mỗi 30 ngày (ví dụ minh hoạ)

Ngân sách chung cho cả proxy đặt trong litellm_settings bằng max_budget và budget_duration (ví dụ 30d) của config.yaml; cách này cũng chỉ có tác dụng khi proxy có database, và bộ compose ở trên không gắn sẵn config.yaml. Ngân sách riêng theo từng model là tính năng Enterprise.

Nguồn: LiteLLM – Docker có Postgres · Tệp compose quickstart · LiteLLM – Budgets · LiteLLM – Admin UI · LiteLLM – Salt key

Chia việc giữa local và đám mây

Chia việc trong router lai LiteLLM: tên model local cho tóm tắt, viết nháp, phân loại, dự phòng sang cloud khi lỗi; tên model noi-bo cho hợp đồng, dữ liệu khách, chỉ chạy Ollama, không dự phòng; tên model cloud cho việc khó cần chất lượng cao; mỗi ứng dụng một virtual key có max_budget và budget_duration 30d; không mở cổng 4000 ra Internet
Hình: Ba tên model, ba cách xử lý dữ liệu (minh hoạ)
Tên model ứng dụng gọiDùng cho (ví dụ minh hoạ)Khi Ollama lỗi
noi-boHợp đồng, dữ liệu khách, số liệu tài chínhBáo lỗi, chờ máy local
localTóm tắt, viết nháp, phân loại tin nhắnChuyển sang cloud
cloudViệc khó: phân tích dài, văn phong tinh tế, Agent nhiều công cụKhông liên quan

Ứng dụng chỉ cần đổi tên model để đổi cách xử lý, không phải sửa khoá hay địa chỉ. Chọn việc nào đi đâu: 40 việc AI Local làm được.

Lỗi thường gặp

Hiện tượngNguyên nhân thường gặpCách xử lý
Container báo không kết nối được OllamaDùng localhost bên trong Docker, hoặc Ollama chỉ nghe 127.0.0.1 trên LinuxDùng host.docker.internal, thêm --add-host, đặt OLLAMA_HOST kèm tường lửa
Đặt ngân sách mà vẫn vượtChạy không có databaseChạy bộ compose có Postgres
Cài bằng pip ra bản cũ 1.83.9Python dưới 3.10Dùng Python 3.10 trở lên hoặc uv tool install
Không kéo được image main-stableTag này bỏ từ 1.84.0Dùng tag phiên bản dạng 1.84.0 hoặc v1.84.0, chọn bản mới trên trang Releases
Khoá đã lưu không đọc đượcĐã đổi LITELLM_SALT_KEYKhôi phục giá trị cũ từ bản sao lưu .env
Model local hay bị chuyển sang cloudrequest_timeout quá ngắn so với tốc độ máyTăng thời gian chờ, chọn model nhỏ hơn
Hoá đơn đám mây tăng do kiểm traGọi /health theo lịch dàyDùng /health/liveliness

Nguồn: LiteLLM – Quick start · LiteLLM – Release cycle · LiteLLM – Health

Cập nhật và gỡ cài đặt

Nguồn: LiteLLM releases · LiteLLM – Deploy

An toàn

Danh sách kiểm tra đầy đủ: Chi phí thật và bảo mật khi dùng AI Local.

Nguồn: LiteLLM – Production

Bắt đầu từ đâu?

  1. Hôm nay: chạy LiteLLM không database với hai model local và cloud, gọi thử, thử tắt Ollama.
  2. Tuần này: chuyển một ứng dụng (vd workflow n8n) sang gọi qua LiteLLM, thêm tên noi-bo cho việc nhạy cảm.
  3. Khi nhiều ứng dụng, nhiều người: chạy bản có Postgres, cấp virtual key có ngân sách cho từng ứng dụng.

Bài tiếp theo: truy cập AI Local từ xa an toàn qua Tailscale. Muốn được tư vấn hoặc cài đặt AI Local theo nhu cầu riêng, bạn có thể đăng ký Tư vấn 1-1 hoặc Coaching 1-1 cho doanh nghiệp; chi phí báo sau buổi tư vấn.

Đọc tiếp: Truy cập từ xa qua Tailscale →

Câu hỏi thường gặp

LiteLLM có mất phí không?

Phần mềm LiteLLM có giấy phép MIT, trừ thư mục enterprise. Bạn tự chạy trên máy của mình nên không trả phí cho LiteLLM; vẫn trả phí API cho model đám mây khi yêu cầu đi sang đó. Ngân sách riêng theo từng model là tính năng Enterprise.

Vì sao đã đặt max_budget mà vẫn vượt?

Tài liệu LiteLLM ghi rõ: không có database thì max_budget không có tác dụng, proxy vẫn phục vụ khi đã vượt ngân sách. Muốn giới hạn chi tiêu, chạy LiteLLM kèm Postgres như mục Bước 4.

Dữ liệu nhạy cảm có bị đẩy lên đám mây khi model local lỗi không?

Có, nếu tên model đó được cấu hình fallbacks sang model đám mây. Với dữ liệu không được rời máy, tạo một tên model riêng chỉ trỏ tới Ollama và không khai báo fallbacks cho nó.

Ứng dụng nào gọi được qua LiteLLM?

Mọi ứng dụng nhận địa chỉ tương thích OpenAI: đặt base URL là địa chỉ proxy (cổng 4000) và khoá là master key hoặc virtual key. Cách nối OpenClaw, Hermes, n8n với endpoint loại này xem bài AI Local làm bộ não cho AI Agent.

Có nên dùng tag latest cho image Docker?

Tài liệu LiteLLM khuyên ghim một tag phiên bản cụ thể thay vì latest. Từ bản 1.84.0, tag có dạng 1.84.0 hoặc v1.84.0, không còn hậu tố -stable.

Tài liệu liên quan

Xem tất cả tài liệu hướng dẫn →

Đăng ký Tư vấn 1-1 về AI Local – Nguyễn Đức, Aduca
Bước tiếp theo

Đăng ký Tư vấn 1-1 về AI Local

Chuyên gia Aduca cùng bạn xem nhu cầu, máy đang có và dữ liệu cần bảo vệ, rồi đề xuất nên chạy AI Local, dùng đám mây hay kết hợp. Dịch vụ cài AI Local nằm trong gói Tư vấn 1-1 hoặc Coaching 1-1; chi phí báo sau buổi tư vấn.

Về AducaChuỗi bài do đội ngũ Aduca biên soạn từ kinh nghiệm đào tạo và triển khai AI Agent cho Marketing – Sales. Aduca Academy do Nguyễn Đức – Chủ tịch Aduca Group sáng lập; ông kinh doanh thương mại điện tử từ 2012, chạy quảng cáo Facebook từ 2014 và đào tạo từ 2016. Phần thực hành từng bước nằm trong các thư mục OpenClaw, Hermes Agent, Claude, ChatGPT và n8n, Second Brain.

Nguồn tham khảo

Lịch sử cập nhật

Miễn trừ trách nhiệm

Bài viết thuộc chuỗi kiến thức của Công ty Cổ phần Giáo dục Aduca, chia sẻ miễn phí cho mục đích học tập. Thông tin kỹ thuật đối chiếu với tài liệu chính thức của các dự án và nền tảng tại ngày cập nhật (có ghi nguồn); phần nhận định là quan điểm của Aduca. OpenClaw, Hermes Agent, Claude (thương hiệu của Anthropic), ChatGPT (thương hiệu của OpenAI), n8n (thương hiệu của n8n GmbH), các phần mềm chạy model và các model AI mở (Ollama, LM Studio, Qwen, Gemma, gpt-oss…), Obsidian, Notion, phương pháp Building a Second Brain (Tiago Forte) cùng các phần mềm, dịch vụ nêu trong bài thuộc về chủ sở hữu tương ứng, không thuộc Aduca; Aduca không phải đối tác chính thức của các công ty này. Tính năng, gói và giá có thể thay đổi bất cứ lúc nào – hãy kiểm tra trang chính thức trước khi mua. Kết quả áp dụng phụ thuộc quy trình, dữ liệu và con người của từng doanh nghiệp; bài viết không cam kết doanh thu hay hiệu quả cụ thể. © 2026 Aduca — được trích dẫn khi ghi rõ nguồn aduca.vn.