Chạy mem0 trên một base URL tương thích OpenAI tùy chỉnh.
Updated 2026-07-29
Provider OpenAI của mem0 nhận một config key openai_base_url. Đặt nó thành https://api.apisrouter.com/v1, truyền một key, và model trích xuất và cập nhật bộ nhớ có thể là bất kỳ id nào trong catalog, gồm cả Claude và DeepSeek, mà không đụng tới phần còn lại của pipeline bộ nhớ của bạn.
Câu trả lời nhanh: một config key bên trong khối llm.
Provider LLM OpenAI của mem0 phân giải endpoint của nó theo thứ tự: config trước, môi trường thứ hai, mặc định thứ ba: self.config.openai_base_url, sau đó biến môi trường OPENAI_BASE_URL, sau đó https://api.openai.com/v1. Vậy cách ghi đè sạch nhất là một key trong dict cấu hình llm: đặt openai_base_url thành https://api.apisrouter.com/v1, đặt api_key cạnh nó (hoặc export OPENAI_API_KEY), và mọi lệnh gọi trích xuất bộ nhớ định tuyến qua gateway. Đây là hành vi mem0 upstream, đọc được trong mem0/llms/openai.py, không phải một bản fork. SDK TypeScript phơi ra cùng cặp đó theo camelCase: openaiBaseUrl và apiKey. Giá trị trong dict cấu hình ghi đè biến môi trường, thứ ghi đè mặc định, nên một base URL ở cấp cấu hình thắng ngay cả trên các máy nơi OPENAI_BASE_URL trỏ tới nơi khác.
config = {
"llm": {
"provider": "openai",
"config": {
"model": "claude-sonnet-4-6",
"openai_base_url": "https://api.apisrouter.com/v1",
"api_key": os.environ["APISROUTER_API_KEY"],
},
}
}mem0 thực sự làm gì với LLM của nó.
mem0 (mem0ai trên GitHub, khoảng 61K star) là một lớp bộ nhớ cho agent AI. Mỗi lệnh gọi add() chạy một pipeline: LLM đọc các lượt hội thoại mới, trích xuất các bộ nhớ ứng viên, so sánh chúng với những gì đã lưu trữ, và quyết định theo từng bộ nhớ liệu nên thêm, cập nhật, xóa, hay bỏ qua. Đó là công việc lý luận thực sự, và nó xảy ra ở mỗi lần ghi, nên slot LLM chạy thường xuyên hơn nhiều so với hầu hết mọi người kỳ vọng khi họ gắn bộ nhớ vào một agent production. Truy xuất là nửa còn lại, và nó không dùng LLM chút nào: search() nhúng truy vấn và chạy tương đồng vector trên store. Hai client khác nhau, hai model khác nhau, cấu hình trong hai khối khác nhau (llm và embedder). Sự tách biệt này là điều quan trọng nhất cần hiểu trước khi định tuyến lại bất cứ thứ gì, vì nó nghĩa là bạn có thể di chuyển khối lượng công việc trích xuất sang một gateway đa vendor trong khi embedder giữ nguyên provider và index hiện có. Provider vẫn là "openai" trong cấu hình; mem0 chuyển tiếp field model như một chuỗi thuần qua /v1/chat/completions. Khi endpoint đứng sau openai_base_url phục vụ nhiều vendor, chuỗi đó có thể là một id Claude, GPT, DeepSeek, hoặc GLM, và việc đổi model trích xuất trở thành một thay đổi cấu hình một dòng thay vì một cuộc di dời provider.
Cài đặt đầy đủ: config dict hoặc biến môi trường.
Con đường config-dict là con đường chính xác: nó chỉ di chuyển LLM. Xây dict, đưa nó cho Memory.from_config, và dùng memory API như bình thường. Field api_key giữ key gateway hoàn toàn tách khỏi cài đặt vector-store và embedder của bạn. Con đường biến môi trường cũng tồn tại: các lớp OpenAI của mem0 đọc OPENAI_BASE_URL khi config key vắng mặt. Đó là một biến export và không đổi code, nhưng hãy lưu ý phạm vi: lớp OpenAI của embedder đọc cùng các biến đó (nó cũng tôn trọng tên OPENAI_API_BASE cũ hơn, thứ lớp LLM không dùng). Export OPENAI_BASE_URL và bạn đã di chuyển cả hai thành phần, điều này chỉ đúng nếu endpoint cũng phục vụ model embedding của bạn. Khi nghi ngờ, hãy ưu tiên config dict và để yên môi trường.
import os
from mem0 import Memory
config = {
"llm": {
"provider": "openai",
"config": {
"model": "claude-sonnet-4-6", # any catalog id
"openai_base_url": "https://api.apisrouter.com/v1",
"api_key": os.environ["APISROUTER_API_KEY"],
"temperature": 0.1,
},
},
# embedder block unchanged: keeps its own provider and key
}
m = Memory.from_config(config)
m.add("I prefer window seats and vegetarian meals.", user_id="alice")
print(m.search("seat preference?", user_id="alice"))Chọn model trích xuất.
Vòng lặp thực tế: giữ embedder của bạn cố định, chạy cùng một bộ fixture hội thoại qua hai hoặc ba model trích xuất, và so sánh khác biệt các bộ nhớ đã lưu. Đứng sau một endpoint, so sánh đó là một lần sửa chuỗi cấu hình cho mỗi ứng viên, và log sử dụng theo từng key định giá lần chạy của mỗi ứng viên cho bạn.
- Chất lượng trích xuất là chất lượng bộ nhớ. LLM quyết định điều gì đáng nhớ và liệu thông tin mới có mâu thuẫn với thông tin cũ không; một model bỏ lỡ một cập nhật làm ô nhiễm truy xuất cho mọi phiên tương lai. claude-sonnet-4-6 và gpt-5.5 là mức trung bình đáng tin cậy của sự đánh đổi này.
- Khối lượng lớn xảy ra ở mỗi lần ghi. Một sản phẩm chat gọi add() sau mỗi lượt trao đổi chạy trích xuất hàng nghìn lần mỗi ngày, đây là nơi một id nhanh như claude-haiku-4-5-20251001 hoặc deepseek-v4-flash giữ cho lớp bộ nhớ không chi phối hóa đơn token.
- Các lĩnh vực giàu mâu thuẫn (sở thích thay đổi, sự kiện hết hạn) hưởng lợi từ một model mạnh hơn trên add() dù nó tốn hơn mỗi lệnh gọi, vì một quyết định cập nhật sai sẽ đắt để phát hiện sau này.
- Temperature nên thấp. Trích xuất là một tác vụ quyết định có cấu trúc, không phải viết sáng tạo; mem0 phơi temperature trong cùng khối cấu hình, và khoảng 0.1 giữ các quyết định add/update/delete nhất quán.
Trả theo mức sử dụng · thấp hơn giá chính thức
Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.
| Mô hình | Giá chính thức | Giá của chúng tôi |
|---|---|---|
| Claude Sonnet 4.6 | $3.00 / $15.00 per M | $2.40 / $12.00 per M |
| GPT-5.5 | $5.00 / $30.00 per M | $4.00 / $24.00 per M |
| Claude Haiku 4.5 20251001 | $1.00 / $5.00 per M | $0.80 / $4.00 per M |
| DeepSeek V4 Flash | $0.14 / $0.28 per M | $0.10 / $0.30 per M |
| GLM-5.2 | $1.14 / $4.00 per M | $1.10 / $4.00 per M |
Các kiểu lỗi đặc thù của mem0.
Một OPENROUTER_API_KEY còn sót lại sẽ chiếm quyền định tuyến. Lớp LLM OpenAI của mem0 xử lý đặc biệt biến đó: khi nó được đặt, lớp này chuyển sang endpoint của OpenRouter và bỏ qua ý định của bạn. Nếu request không tới được base URL bạn đã cấu hình, hãy kiểm tra biến này trước và unset nó. Biến môi trường di chuyển nhiều hơn bạn định. OPENAI_BASE_URL được đọc bởi cả LLM và embedder. Nếu gateway không phục vụ model embedding của bạn, một ghi đè cấp môi trường làm hỏng search() trong khi add() vẫn hoạt động, biểu hiện như "ghi bộ nhớ ổn nhưng truy xuất rỗng hoặc lỗi". Hãy giới hạn ghi đè vào khối cấu hình llm và embedder sẽ không nhận ra gì cả. Config key là theo từng SDK. Python là snake_case (openai_base_url, api_key); TypeScript là camelCase (openaiBaseUrl, apiKey). Một key camelCase trong một dict Python bị âm thầm bỏ qua và bạn rơi về endpoint mặc định, trông y hệt như việc ghi đè "không hoạt động". Model id là chuỗi chính xác. mem0 không xác thực field model; nó chỉ chuyển tiếp. Một lỗi chính tả hiện ra là lỗi model-not-found từ gateway ở lần add() đầu tiên, và danh sách /v1/models là cách viết chuẩn. Đổi embedder là một quyết định về index, không phải một quyết định cấu hình. Embedding từ các model khác nhau sống trong các không gian vector khác nhau, nên đổi endpoint của embedder làm mất hiệu lực tương đồng với các vector hiện có. Di chuyển LLM là miễn phí; di chuyển embedder nghĩa là phải nhúng lại store. Hãy lên kế hoạch chúng như các cuộc di dời riêng biệt.
Ai định tuyến mem0 qua một gateway.
- Người xây agent thêm bộ nhớ bền vững vào trợ lý. Trích xuất chạy ở mỗi lần ghi, nên một bề mặt billing duy nhất với sử dụng theo từng key thắng một dashboard vendor thứ hai gắn thêm vào stack.
- Các đội muốn trích xuất chất lượng Claude đứng sau một cấu hình hình dạng OpenAI. Chuỗi provider vẫn là "openai"; chỉ base URL và model id thay đổi.
- Sản phẩm chat khối lượng lớn kiểm soát chi phí đơn vị của lớp bộ nhớ bằng cách ghép một chat model đỉnh cao với một id trích xuất nhanh, mỗi cái gọi được qua cùng endpoint.
- Lập trình viên đánh giá các model trích xuất song song. Mỗi ứng viên là một chuỗi model trên các fixture cố định, không phải một tích hợp provider mới cho mỗi vendor.
- Lập trình viên không có quyền truy cập billing của một vendor cụ thể. Truy cập dựa trên nạp tiền không yêu cầu thẻ loại bỏ phụ thuộc đăng ký theo từng provider.
Xác minh endpoint và debug add() đầu tiên.
Xác nhận gateway liệt kê model bạn đã cấu hình trước khi chạy pipeline; field model phải khớp chính xác một id được phục vụ. Lỗi lần chạy đầu theo một khuôn mẫu. Một lỗi 401 nghĩa là key mà LLM phân giải sai với endpoint nó phân giải, và vì cả hai đến từ một chuỗi config-hơn-env, hãy in cả hai giá trị hiệu lực thay vì giả định; một api_key trong config với một base URL từ env (hoặc ngược lại) là một sự không khớp kinh điển. Lỗi model-not-found là một lỗi chính tả id. Request rõ ràng đi tới openrouter.ai nghĩa là trường hợp đặc biệt OPENROUTER_API_KEY đã kích hoạt. Và nếu add() thành công trong khi search() thất bại, bạn đã vô tình di chuyển embedder qua môi trường; hãy giới hạn base URL vào khối llm. Khi bộ nhớ đã chạy, console APIsRouter hiển thị model theo từng request, số lượng token, và chi tiêu. Các lệnh gọi trích xuất nhỏ nhưng không ngừng, và góc nhìn sử dụng là cách bạn thấy lớp bộ nhớ thực sự tốn bao nhiêu trên mỗi nghìn lần ghi thay vì ước lượng nó.
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50Câu hỏi thường gặp
Config key nào trỏ mem0 vào một endpoint tương thích OpenAI tùy chỉnh?
openai_base_url bên trong cấu hình provider llm trong Python (openaiBaseUrl trong TypeScript). Giá trị cấu hình ghi đè biến môi trường OPENAI_BASE_URL, thứ ghi đè mặc định https://api.openai.com/v1, nên config dict là nơi chắc chắn nhất để đặt nó.
mem0 có thể trích xuất bộ nhớ với model Claude hoặc DeepSeek qua cách này không?
Có. Provider vẫn là "openai" và mem0 chuyển tiếp field model như một chuỗi thuần qua /v1/chat/completions. Bất kỳ id nào endpoint đứng sau openai_base_url phục vụ đều hoạt động, gồm cả id Claude, DeepSeek, và GLM.
Đặt OPENAI_BASE_URL có ảnh hưởng tới embedder không?
Có. Embedder OpenAI của mem0 đọc cùng biến môi trường (cộng tên OPENAI_API_BASE cũ hơn). Nếu bạn chỉ muốn di chuyển LLM, hãy đặt openai_base_url bên trong khối cấu hình llm và để yên môi trường.
Tôi có cần đổi embedder hoặc vector store để dùng cách này không?
Không. Khối llm và embedder là các client độc lập. LLM trích xuất có thể định tuyến qua gateway trong khi embedder giữ nguyên provider hiện tại và các vector hiện có của bạn vẫn hợp lệ. Đổi endpoint của embedder là một cuộc di dời riêng biệt cần nhúng lại store.
Vì sao request mem0 của tôi đi tới OpenRouter thay vì base URL của tôi?
Lớp LLM OpenAI của mem0 xử lý đặc biệt biến môi trường OPENROUTER_API_KEY: khi được đặt, nó định tuyến lại tới OpenRouter bất kể base URL của bạn. Unset biến đó và cấu hình openai_base_url sẽ có hiệu lực.
Điều này áp dụng cho nền tảng Mem0 đã host hay SDK mã nguồn mở?
SDK mã nguồn mở (Memory / Memory.from_config), nơi bạn kiểm soát cấu hình LLM. Nền tảng Mem0 đã host quản lý các lệnh gọi model của chính nó ở phía server, nên một base URL tùy chỉnh áp dụng khi bạn tự host lớp bộ nhớ.