Base URL and SDK Migration7 tháng 7, 2026Flatkey

Di chuyển SDK đa mô hình: Giữ lại client OpenAI cho Claude, Gemini và DeepSeek

Lập kế hoạch di chuyển SDK đa mô hình mà vẫn giữ lại các client OpenAI trong khi thử nghiệm Claude, Gemini, DeepSeek, các công cụ, streaming, thanh toán và rollback.

Di chuyển SDK đa mô hình: Giữ lại client OpenAI cho Claude, Gemini và DeepSeek

Việc di chuyển SDK đa mô hình không nên bắt đầu bằng việc thay thế mọi thư viện client trong ứng dụng của bạn. Nếu mã nguồn sản phẩm của bạn đã sử dụng SDK OpenAI Python hoặc Node cho các hoàn thành trò chuyện (chat completions), bước đi đầu tiên an toàn hơn là giữ ổn định bề mặt client đó, chuyển lựa chọn nhà cung cấp vào cấu hình, và chứng minh hành vi của Claude, Gemini và DeepSeek đằng sau một tuyến đường tương thích trước khi bạn mở rộng lưu lượng truy cập.

Flatkey được xây dựng cho các đội ngũ muốn có một khóa duy nhất, một lớp định tuyến tương thích với OpenAI, quyền truy cập mô hình qua nhiều nhà cung cấp, và xem xét việc sử dụng và thanh toán ở một nơi. Điều đó làm cho nó hữu ích cho việc di chuyển SDK đa mô hình, nhưng nó không loại bỏ nhu cầu kiểm tra các họ điểm cuối (endpoint families), bí danh mô hình (model aliases), streaming, gọi công cụ (tool calls), và hồ sơ sử dụng. Hãy coi mọi mẫu mã ở đây như một khuôn mẫu cho đến khi bạn xác thực nó bằng khóa Flatkey của riêng mình và danh mục mô hình hiện tại.

Mục tiêu thực tế rất đơn giản: giữ lại đối tượng yêu cầu mà ứng dụng của bạn đã biết, cô lập một vài giá trị phải thay đổi, và xây dựng một gói bằng chứng (proof packet) trước khi chuyển đổi.

Ma trận Quyết định Di chuyển SDK Đa mô hình

Sử dụng ma trận này trước khi bạn thay đổi mã nguồn. Nó tách biệt những gì có thể giữ ổn định khỏi những gì phải trở thành có thể cấu hình.

LớpGiữ ổn địnhLàm cho có thể cấu hìnhBằng chứng cần lưu
Client SDKĐường dẫn import SDK OpenAI và gọi hoàn thành trò chuyện hiện cóKhóa API, URL cơ sở, thời gian chờ, chính sách thử lạiPhiên bản SDK và cấu hình khởi động đã được biên tập
Hình dạng yêu cầumessages, model, stream, các tools cơ bản nơi được hỗ trợCác phần bổ sung dành riêng cho nhà cung cấp và các tham số không được hỗ trợYêu cầu tối thiểu và phản hồi thô
Lựa chọn mô hìnhCác bí danh cấp ứng dụng như support_chat hoặc analysis_fastBí danh mô hình cổng và họ điểm cuốiẢnh chụp màn hình hoặc xuất danh mục mô hình
Vận hànhNhật ký, ID yêu cầu và xử lý lỗi hiện cóSiêu dữ liệu về nhà cung cấp, tuyến đường, sử dụng, hạn ngạch và khôi phụcBằng chứng từ bảng điều khiển/đọc lại
Phát hànhĐường dẫn triển khai ứng dụng hiện tạiCác biến môi trường cho việc triển khai theo tỷ lệ phần trăm và khôi phụcNgười chịu trách nhiệm khôi phục và cấu hình trước đó

Đây là nguyên tắc cốt lõi của việc di chuyển SDK đa mô hình: không trộn lẫn việc thay thế thư viện, di chuyển prompt, đánh giá nhà cung cấp, xác thực thanh toán và triển khai sản phẩm vào cùng một lần triển khai.

Tài liệu chính thức nói gì về tính tương thích

Các SDK của OpenAI đã hỗ trợ mẫu bạn cần. Tệp README của OpenAI Python hiện tại ghi lại client OpenAI và tùy chọn base_url, và tệp README của Node ghi lại client OpenAI tiêu chuẩn và các hoàn thành trò chuyện. Tài liệu tham khảo API của OpenAI nói rằng Chat Completions tạo ra một phản hồi mô hình cho một cuộc trò chuyện, hỗ trợ streaming, và trả về một đối tượng hoàn thành trò chuyện hoặc các đoạn stream.

Nếu bạn đang chia nhỏ việc triển khai theo môi trường chạy (runtime), hãy kết hợp danh sách kiểm tra này với hướng dẫn URL cơ sở tùy chỉnh của SDK OpenAI Pythonhướng dẫn URL cơ sở của SDK OpenAI Node. Nếu quyết định đầu tiên là định tuyến nhà cung cấp thay vì thiết lập client, hãy sử dụng hướng dẫn định tuyến API Claude và GPT trước khi bạn chọn khối lượng công việc thử nghiệm.

Tính tương thích của nhà cung cấp khác nhau:

Nhà cung cấpTín hiệu tương thích chính thứcHàm ý di chuyển
OpenAI SDKPython hỗ trợ base_url; Node sử dụng baseURL; Chat Completions có các trường messages, model, stream, tools, và usage.Giữ lại trình bao bọc client OpenAI cho lát di chuyển đầu tiên.
Anthropic / ClaudeAnthropic công bố một lớp tương thích SDK OpenAI, nhưng nói rằng nó chủ yếu dành cho việc kiểm thử và so sánh, không phải là con đường sản xuất lâu dài cho hầu hết các trường hợp sử dụng. API Messages gốc sử dụng /v1/messages, max_tokens, messages, và một tham số system ở cấp cao nhất.Sử dụng tính tương thích để đánh giá nhanh, nhưng hãy kiểm tra các yêu cầu gốc của Claude trước khi dựa vào các tính năng dành riêng cho nhà cung cấp.
Google GeminiGoogle cho biết các mô hình Gemini có thể truy cập được thông qua các thư viện OpenAI Python, TypeScript/JavaScript và REST bằng cách thay đổi khóa API, URL cơ sở và mô hình.Gemini là một ứng cử viên tốt cho một bài kiểm tra sơ bộ (smoke test) theo dạng OpenAI, với việc lý luận và hành vi cụ thể của mô hình được xác minh riêng.
DeepSeekDeepSeek cho biết định dạng API của họ tương thích với OpenAI và Anthropic; tài liệu gọi lần đầu của họ liệt kê các URL cơ sở của OpenAI và Anthropic cùng các ví dụ định dạng OpenAI.DeepSeek có thể phù hợp với đường dẫn client OpenAI, nhưng việc ngừng sử dụng tên mô hình và các cài đặt tư duy cần được kiểm tra rõ ràng.
FlatkeyTrang mô hình công khai của Flatkey hiển thị các loại điểm cuối như openai, anthropic, và gemini; trang chủ hiển thị một tuyến đường hoàn thành trò chuyện tương thích với OpenAI.Chọn các mô hình theo họ điểm cuối, không chỉ dựa vào tên nhà cung cấp.

Bài học quan trọng là "tương thích với OpenAI" thường có nghĩa là client có thể gửi một yêu cầu có định dạng của OpenAI. Điều đó không có nghĩa là mọi tham số, lược đồ công cụ, kiểm soát suy luận, đầu vào đa phương tiện, hoặc trường sử dụng đều hoạt động giống hệt nhau giữa các nhà cung cấp.

Bước 1: Cố định Ranh giới Client

Bắt đầu quá trình di chuyển SDK đa mô hình bằng cách đặt client OpenAI đằng sau một factory cục bộ duy nhất. Factory này nên là nơi duy nhất biết về key, URL cơ sở, thời gian chờ, và bí danh mô hình.

import os
from openai import OpenAI


def make_llm_client() -> OpenAI:
    return OpenAI(
        api_key=os.environ["FLATKEY_API_KEY"],
        base_url=os.getenv("FLATKEY_BASE_URL", "https://router.flatkey.ai/v1"),
        timeout=float(os.getenv("LLM_TIMEOUT_SECONDS", "60")),
        max_retries=int(os.getenv("LLM_MAX_RETRIES", "2")),
    )


client = make_llm_client()

completion = client.chat.completions.create(
    model=os.environ["FLATKEY_MODEL"],
    messages=[
        {"role": "system", "content": "Bạn trả lời bằng các ghi chú triển khai ngắn gọn."},
        {"role": "user", "content": "Trả lời chính xác: migration probe ok"},
    ],
)

print(completion.choices[0].message.content)

Đối với Node:

import OpenAI from "openai";

export function makeLlmClient() {
  return new OpenAI({
    apiKey: process.env.FLATKEY_API_KEY,
    baseURL: process.env.FLATKEY_BASE_URL ?? "https://router.flatkey.ai/v1",
    timeout: Number(process.env.LLM_TIMEOUT_MS ?? 60000),
    maxRetries: Number(process.env.LLM_MAX_RETRIES ?? 2),
  });
}

const client = makeLlmClient();

const completion = await client.chat.completions.create({
  model: process.env.FLATKEY_MODEL,
  messages: [
    { role: "system", content: "Bạn trả lời bằng các ghi chú triển khai ngắn gọn." },
    { role: "user", content: "Trả lời chính xác: migration probe ok" },
  ],
});

console.log(completion.choices[0].message.content);

Ứng dụng nên gọi make_llm_client() hoặc makeLlmClient(), chứ không nên khởi tạo client ở nhiều nơi như controller, worker, và script. Ranh giới duy nhất đó là yếu tố cho phép quá trình di chuyển SDK đa mô hình có thể được hoàn tác.

Bước 2: Xây dựng Bản đồ Mô hình và Endpoint

Đừng trỏ mọi workload vào một tên mô hình mới duy nhất. Hãy bắt đầu với một bản đồ đặt tên cho workload, họ endpoint, nhà cung cấp hiện tại, nhà cung cấp mục tiêu, và giá trị để quay lui.

Tải công việcHọ EndpointĐường dẫn Hiện tạiĐường dẫn Mục tiêuPhương án Quay lui
Chat hỗ trợHoàn thành chat kiểu OpenAIMô hình OpenAI hiện tạiBí danh chat Flatkey cho GPT, Claude, Gemini, hoặc DeepSeekKey, URL cơ sở, và mô hình trước đó
Phân tích nội bộHoàn thành chat kiểu OpenAIMô hình OpenAI hiện tạiBí danh mô hình Flatkey được chọn cho suy luận và chi phíBí danh mô hình trước đó
Luồng công việc công cụHoàn thành chat với công cụMô hình tương thích công cụ hiện tạiMô hình ứng viên với hành vi công cụ đã được xác minhVô hiệu hóa tuyến nhà cung cấp
Giao diện người dùng streamingLuồng hoàn thành chatBộ phân tích luồng hiện tạiNhà cung cấp ứng viên với bằng chứng luồng thôChuyển lưu lượng luồng trở lại
Tính năng Claude gốcAPI Tin nhắn AnthropicClient Claude gốcGiữ lại client gốc nếu khả năng tương thích làm mất tính năng bắt buộcKhông di chuyển đường dẫn này

Trang mô hình của Flatkey rất hữu ích ở đây vì nó hiển thị các loại endpoint. Nếu một mô hình được liệt kê dưới một họ endpoint gốc, đừng cho rằng nó có sẵn thông qua đường dẫn chat của OpenAI cho đến khi danh mục tài khoản và các bài kiểm tra sơ bộ (smoke test) của bạn chứng minh điều đó.

Bước 3: Chạy Kiểm tra Sơ bộ (Smoke Test) với Bốn Nhà cung cấp

Bài kiểm tra sơ bộ (smoke test) tối thiểu hữu ích cho việc di chuyển SDK đa mô hình có bốn hàng nhà cung cấp và cùng một prompt. Hãy giữ cho prompt đơn giản để phong cách phản hồi không che giấu các lỗi truyền tải.

Kiểm traYêu cầuĐiều kiện ĐạtLỗi cần Phân loại
GPT hoặc mô hình OpenAI hiện tạiYêu cầu có định dạng OpenAI hiện có thông qua FlatkeyNhận được phản hồi, thấy được mức sử dụng, log liên kết đến bí danh mong đợiSai key, sai URL cơ sở, trùng lặp /v1, thiếu mô hình
ClaudeCùng yêu cầu có định dạng OpenAI thông qua bí danh Flatkey đã chọnNhận được phản hồi đơn giản; không có tính năng không được hỗ trợ trong yêu cầuÁnh xạ tin nhắn hệ thống, lược đồ công cụ, các tính năng chỉ có trên Claude gốc
GeminiCùng yêu cầu có định dạng OpenAI thông qua bí danh Flatkey đã chọnNhận được phản hồi đơn giản; các mặc định suy luận có thể chấp nhận đượcBí danh mô hình, cài đặt suy luận, các giả định đa phương thức
DeepSeekCùng yêu cầu có định dạng OpenAI thông qua bí danh Flatkey đã chọnNhận được phản hồi đơn giản; bí danh nhạy cảm với việc ngừng hỗ trợ là phiên bản hiện tạiĐổi tên mô hình, cài đặt tư duy, bộ phân tích luồng

Lưu lại phần thân yêu cầu thô, các header đã được biên tập, phần thân phản hồi, trạng thái HTTP, bí danh mô hình, ID yêu cầu nếu có, và mục sử dụng trên dashboard. Nếu bất kỳ nhà cung cấp nào cần một tham số khác, hãy chuyển tham số đó vào một hồ sơ nhà cung cấp thay vì rải các nhánh if provider == khắp ứng dụng của bạn.

Bước 4: Kiểm tra Streaming và Lệnh gọi Công cụ một cách Riêng biệt

Một yêu cầu hoàn thành đơn giản chỉ chứng minh được đường dẫn ít rủi ro nhất. Streaming và lệnh gọi công cụ là những hợp đồng riêng biệt.

Đối với streaming, hãy lưu:

Bằng chứngTại sao nó quan trọng
Header phản hồiXác nhận liệu tuyến đường có trả về dữ liệu luồng sự kiện (event-stream) hay không.
Sự kiện đầu tiênPhát hiện các vấn đề về bộ đệm hoặc trình phân tích cú pháp proxy.
Sự kiện cuối cùngXác nhận việc xử lý cuối luồng và hành vi sử dụng.
Đầu ra của trình phân tích cú pháp UIChứng minh rằng frontend của bạn không giả định hình dạng chunk của một nhà cung cấp cụ thể.

Đối với các công cụ, hãy kiểm tra một schema nhỏ trước:

{
  "type": "function",
  "function": {
    "name": "lookup_order_status",
    "description": "Trả về trạng thái đơn hàng thử nghiệm.",
    "parameters": {
      "type": "object",
      "properties": {
        "order_id": { "type": "string" }
      },
      "required": ["order_id"]
    }
  }
}

Đừng sử dụng schema công cụ sản xuất lớn nhất của bạn làm bằng chứng đầu tiên. Ví dụ, tài liệu tương thích của Anthropic chỉ ra những hạn chế về khả năng tương thích với OpenAI và khuyến nghị sử dụng API Claude gốc để có bộ tính năng đầy đủ của Claude. Đó chính xác là loại chi tiết mà một danh sách kiểm tra di chuyển SDK đa mô hình nên nắm bắt trước khi triển khai.

Bước 5: Giữ hồ sơ nhà cung cấp nhỏ gọn

Hồ sơ nhà cung cấp nên mô tả sự khác biệt, không nên chứa logic nghiệp vụ.

{
  "support_chat": {
    "base_url_env": "FLATKEY_BASE_URL",
    "model_env": "FLATKEY_SUPPORT_CHAT_MODEL",
    "endpoint_family": "openai_chat_completions",
    "stream": true,
    "tools": "basic",
    "fallback_alias": "support_chat_previous"
  },
  "analysis_fast": {
    "base_url_env": "FLATKEY_BASE_URL",
    "model_env": "FLATKEY_ANALYSIS_FAST_MODEL",
    "endpoint_family": "openai_chat_completions",
    "stream": false,
    "tools": "none",
    "fallback_alias": "analysis_fast_previous"
  }
}

Giữ các tính năng gốc của nhà cung cấp ra khỏi đường dẫn client OpenAI được chia sẻ trừ khi bạn có các bài kiểm tra cho mọi nhà cung cấp mục tiêu. Nếu cần các trích dẫn của Claude, hành vi phương tiện truyền thông cụ thể của Gemini, các điều khiển suy nghĩ của DeepSeek, hoặc một điểm cuối hàng loạt gốc của nhà cung cấp, hãy tạo một adapter gốc có tên và giữ đường dẫn tương thích với OpenAI cho các khối lượng công việc thực sự phù hợp.

Bước 6: Chứng minh thanh toán và khôi phục

Một quá trình di chuyển trả về văn bản nhưng làm mất bằng chứng thanh toán là chưa hoàn thành. Trước khi tăng lưu lượng truy cập, hãy lưu:

Kiểm tra hoạt độngĐiều kiện đạt
Khả năng hiển thị việc sử dụngYêu cầu xuất hiện trong nhật ký hoặc phần sử dụng của Flatkey với ngữ cảnh tuyến đường/mô hình dự kiến.
Xem xét chi phíHồ sơ giá cả hoặc sử dụng đủ rõ ràng để bộ phận tài chính hoặc vận hành đối chiếu.
Hành vi hạn ngạchMột hạn ngạch thử nghiệm thấp hoặc ngưỡng ngân sách hoạt động như mong đợi trong một khóa không phải sản xuất.
Phân loại lỗiCác lỗi 401, 403, 404, 429, 5xx, và lỗi của nhà cung cấp được ánh xạ tới các hành động rõ ràng của người sở hữu.
Khôi phụcMột thay đổi môi trường sẽ trả lưu lượng truy cập về khóa/URL cơ sở/mô hình trước đó.

Đây là lúc việc xem xét thanh toán và sử dụng thống nhất của Flatkey trở nên quan trọng. Mục tiêu không chỉ là truy cập vào nhiều mô hình hơn. Mục tiêu của việc di chuyển SDK đa mô hình là quyền truy cập mà bộ phận sản phẩm, vận hành và tài chính có thể kiểm tra sau khi lưu lượng truy cập được chuyển đổi.

Quy trình chuyển đổi để di chuyển SDK đa mô hình

Sử dụng thứ tự này cho lát cắt sản xuất đầu tiên:

  1. Chọn một khối lượng công việc có rủi ro thấp với một client OpenAI SDK hiện có.
  2. Thêm factory client và các biến môi trường mà không thay đổi nhà cung cấp hiện tại.
  3. Chứng minh mô hình hiện tại thông qua factory mới.
  4. Chứng minh một mục tiêu Claude, Gemini hoặc DeepSeek với một yêu cầu hoàn thành đơn giản.
  5. Chỉ chứng minh streaming và các công cụ nếu khối lượng công việc đó sử dụng chúng.
  6. Xác minh việc sử dụng, thanh toán, xử lý lỗi và khôi phục.
  7. Định tuyến một tỷ lệ nhỏ lưu lượng truy cập đến bí danh mô hình mới.
  8. Xem xét các lỗi theo nhà cung cấp và họ điểm cuối trước khi thêm khối lượng công việc tiếp theo.

Nếu khối lượng công việc đầu tiên cần các tính năng gốc của nhà cung cấp, hãy chọn một khối lượng công việc khác cho lần di chuyển SDK đa mô hình đầu tiên. Lát cắt đầu tiên nên chứng minh mô hình di chuyển, chứ không phải mọi khả năng của mô hình.

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

Tôi có thể sử dụng một client OpenAI SDK cho Claude, Gemini và DeepSeek không?

Bạn thường có thể giữ một client OpenAI SDK cho các tuyến đường tương thích với OpenAI, nhưng bạn vẫn cần các bài kiểm tra cụ thể cho từng nhà cung cấp. Google và DeepSeek có tài liệu về quyền truy cập tương thích với OpenAI. Anthropic có tài liệu về một lớp tương thích OpenAI SDK, nhưng nói rằng nó chủ yếu dành cho việc kiểm tra và so sánh hơn là lựa chọn sản xuất lâu dài cho hầu hết các trường hợp sử dụng.

Tôi có nên di chuyển lưu lượng truy cập Responses API theo cách tương tự không?

Chỉ khi cổng đích và mô hình đích hỗ trợ rõ ràng họ điểm cuối mà bạn đang sử dụng. Chat Completions và Responses không phải là cùng một hợp đồng. Bắt đầu với họ điểm cuối mà ứng dụng của bạn đã sử dụng, sau đó tạo một kế hoạch kiểm tra riêng cho Responses.

Sai lầm phổ biến nhất khi di chuyển SDK đa mô hình là gì?

Sai lầm phổ biến nhất là coi việc thay đổi URL cơ sở là toàn bộ quá trình di chuyển. Một quá trình di chuyển SDK đa mô hình thực sự cũng xác minh tên mô hình, họ điểm cuối, streaming, công cụ, việc sử dụng, hạn ngạch, xử lý lỗi và khôi phục.

Khi nào tôi nên giữ lại một SDK gốc của nhà cung cấp?

Giữ lại một SDK gốc của nhà cung cấp khi khối lượng công việc của bạn phụ thuộc vào các tính năng cụ thể của nhà cung cấp mà lớp tương thích không hỗ trợ. Các tính năng gốc của Claude, đường dẫn phương tiện truyền thông cụ thể của Gemini, hoặc các điều khiển suy luận cụ thể của DeepSeek có thể là lý do để tạo một adapter riêng.

Danh sách kiểm tra cuối cùng

Trước khi bạn gọi quá trình di chuyển là hoàn tất, hãy xác nhận rằng bạn đã:

MụcHoàn thành khi
Client factoryTất cả các đường dẫn ứng dụng đều sử dụng một trình bao bọc SDK OpenAI hoặc một bộ điều hợp gốc được đặt tên.
Tách cấu hìnhKhóa API, URL cơ sở, bí danh mô hình, thời gian chờ, số lần thử lại và chủ sở hữu tuyến đường được điều khiển bởi môi trường.
Bằng chứng nhà cung cấpCác ứng viên GPT, Claude, Gemini và DeepSeek đã được kiểm tra với bằng chứng thô đã lưu.
Bằng chứng tính năngStreaming và các công cụ đã được kiểm tra riêng biệt với trò chuyện thông thường.
Bằng chứng hoạt độngViệc sử dụng, thanh toán, hạn ngạch, nhật ký và lỗi đều hiển thị cho đúng chủ sở hữu.
Bằng chứng khôi phụcMột thay đổi được ghi lại sẽ trả lại khối lượng công việc về tuyến đường trước đó.

Việc di chuyển SDK đa mô hình hoạt động tốt nhất khi nó diễn ra một cách đơn giản: một khối lượng công việc nhỏ, một ranh giới client, một bản đồ mô hình và bằng chứng cho mỗi nhà cung cấp bạn thêm vào. Khi bạn đã sẵn sàng chạy các thử nghiệm đó thông qua một tuyến đường thống nhất, hãy lấy khóa Flatkey và bắt đầu với một đường dẫn trò chuyện tương thích với OpenAI có rủi ro thấp.