OpenAI SDK
UberLLM triển khai OpenAI Chat Completions API. Mọi mã nguồn sử dụng SDK chính thức openai (hoặc một client tương thích) đều hoạt động bằng cách thiết lập hai điều sau:
base_url/baseURL→https://api.uberllm.dev/v1api_key/apiKey→ keyull_của bạn
Mọi thứ khác — messages, tools, response_format, stream,
max_tokens, temperature — đều không thay đổi.
Python
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.uberllm.dev/v1",
api_key=os.environ["UBERLLM_API_KEY"],
)
# Non-streaming
resp = client.chat.completions.create(
model="deepseek/deepseek-v4-flash",
messages=[{"role": "user", "content": "Explain rope embeddings briefly."}],
)
print(resp.choices[0].message.content)
print(resp.usage) # prompt_tokens / completion_tokens are returned per request
# Streaming
stream = client.chat.completions.create(
model="deepseek/deepseek-v4-flash",
messages=[{"role": "user", "content": "Count to five."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)
TypeScript / JavaScript
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.uberllm.dev/v1",
apiKey: process.env.UBERLLM_API_KEY,
});
const resp = await client.chat.completions.create({
model: "deepseek/deepseek-v4-flash",
messages: [{ role: "user", content: "Explain rope embeddings briefly." }],
});
console.log(resp.choices[0].message.content);
Gọi công cụ
Gọi công cụ/hàm được chuyển tiếp nguyên trạng. Sử dụng các mô hình có hỗ trợ công cụ (xem Mô hình & định tuyến; danh mục đánh dấu supports_tools).
resp = client.chat.completions.create(
model="deepseek/deepseek-v4-flash",
messages=[{"role": "user", "content": "What is the weather in Paris?"}],
tools=[{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get the current weather for a city",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}],
)
print(resp.choices[0].message.tool_calls)
Một phản hồi gọi công cụ luôn kết thúc bằng finish_reason: "tool_calls" (stop_reason: "tool_use" trên /v1/messages), dù có streaming hay không, bất kể nhà cung cấp nào đã cung cấp nó. Gửi lại mỗi lệnh gọi công cụ đúng như bạn đã nhận được: một số mang theo trường extra_content (chữ ký suy nghĩ của Gemini) mà mô hình cần trong lượt tiếp theo.
Cấu trúc phản hồi
Mọi phản hồi đều có các trường giống nhau bất kể nhà cung cấp nào đã xử lý nó: các trường hoàn thành trò chuyện của OpenAI (id, object, created, model, choices, usage) và usage.cost_usd của chúng tôi. Các trường mà nhà cung cấp tự thêm vào (x_groq, service_tier, system_fingerprint, usage.queue_time và những trường tương tự) đều bị loại bỏ.
Các mô hình suy luận gửi phần suy luận của chúng trong cả reasoning và reasoning_content, với cùng một nội dung văn bản, trong message (hoặc delta khi streaming), để một client đọc bất kỳ trường nào cũng nhận được nó. Khi một nhà cung cấp gửi reasoning_details theo kiểu OpenRouter, chúng sẽ được chuyển tiếp nguyên trạng. Một phản hồi không có suy luận sẽ không có trường nào trong số đó.
Các trường yêu cầu mà nhà cung cấp từ chối nhưng chỉ dùng để điều chỉnh câu trả lời (reasoning, thinking, verbosity, top_k và các trường tương tự) sẽ bị loại bỏ đối với nhà cung cấp đó, và reasoning: {"effort": "low"} được gửi dưới dạng reasoning_effort khi cần thiết. Nội dung tin nhắn được gửi dưới dạng danh sách các phần văn bản sẽ được chuyển thành một chuỗi duy nhất cho nhà cung cấp chỉ chấp nhận chuỗi. Một hình ảnh, âm thanh hoặc tệp được gửi đến một mô hình chỉ đọc văn bản sẽ bị từ chối với một 400 rõ ràng thông báo điều đó: hãy kiểm tra input_modalities trong GET /v1/models trước.
Liệt kê các mô hình
curl https://api.uberllm.dev/v1/models \
-H "Authorization: Bearer $UBERLLM_API_KEY"
Trả về định dạng danh sách của OpenAI ({"object":"list","data":[{"id": "...", ...}]})
với các mô hình trò chuyện bạn có thể gọi ngay bây giờ; ?type=all thêm vào các mô hình hình ảnh, video, âm nhạc và
giọng nói. Mỗi mô hình trò chuyện có context_length, max_output_tokens,
input_modalities, supports_tools, supports_reasoning, supports_vision và
supported_parameters (xem Mô hình & định tuyến).
Danh mục công khai (không cần xác thực) cũng có tại GET /api/v1/public/models với
giá theo từng endpoint.
Sử dụng streaming
Đối với các yêu cầu streaming, UberLLM tự động yêu cầu thông tin sử dụng token
(stream_options.include_usage), nên chunk cuối cùng mang một đối tượng usage
với cost_usd, đây là chi phí cuộc gọi được tính bằng đô la Mỹ. Một phản hồi không phải
streaming cũng có usage.cost_usd và header X-UberLLM-Cost-USD (ngoại trừ
một phản hồi chậm đã bắt đầu bằng các khoảng trắng keepalive: khi đó chỉ có trường body).
Hóa đơn của bạn là chi phí mà marketplace báo cáo cho cuộc gọi đó. Phản hồi không
chờ báo cáo đó: khi báo cáo chưa có, cost_usd là ước tính của chúng tôi, và
số dư của bạn cùng Dashboard → Activity sẽ hiển thị khoản phí chính xác sau đó một chút. Nếu thông tin sử dụng bị
thiếu, UberLLM sẽ chuyển sang ước tính của tokenizer — những dòng như vậy được gắn cờ trong
Dashboard → Activity.
API Phản hồi
client.responses.create và client.responses.stream cũng hoạt động, trên mọi mô hình trò chuyện: văn bản, lệnh gọi công cụ (function_call → function_call_output), đầu ra có cấu trúc và truyền phát. UberLLM không lưu trữ bất cứ điều gì, vì vậy hãy gửi toàn bộ cuộc trò chuyện trong input mỗi lần gọi thay vì previous_response_id. Chi tiết:
API Phản hồi.
r = client.responses.create(
model="deepseek/deepseek-v4.1-flash",
instructions="Answer in one short sentence.",
input="What is the capital of France?",
)
print(r.output_text)
Lưu ý
- Ký tự
/v1ở cuối là bắt buộc trong base URL. - Mỗi yêu cầu được gửi đến một nhà cung cấp bên thứ ba có sẵn cho mô hình và được tính phí theo mức nhà cung cấp đã tính, không có phí UberLLM. Xem Giá cả.
- Để biết về các lần thử lại tự động và các tùy chọn định tuyến mà UberLLM chấp nhận, hãy xem Mô hình & định tuyến.