DEV Community

li xu
li xu

Posted on

OpenAI SDK baseURL setup for DeepSeek, Qwen, and Kimi routes

AI assistance disclosure: this article was prepared with AI assistance and reviewed before publication.

Disclosure: I work on Botat. This is a technical integration note, not a neutral vendor ranking.

If you are testing DeepSeek, Qwen, Kimi, or other Chinese-strong model routes from outside China, the easiest integration path is often not a new SDK. It is a configurable OpenAI SDK client with a different baseURL, API key, and model ID.

That still needs careful validation. OpenAI-compatible means the request shape is familiar. It does not mean every OpenAI feature behaves identically.

The minimal config shape

Keep provider settings outside application logic:

OPENAI_BASE_URL=https://your-provider.example/v1
OPENAI_API_KEY=your_api_key
OPENAI_MODEL=your_verified_model_id
Enter fullscreen mode Exit fullscreen mode

Do not publish hard-coded production model IDs until you have verified the current model list inside the provider account.

Node.js example

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: process.env.OPENAI_BASE_URL,
});

const response = await client.chat.completions.create({
  model: process.env.OPENAI_MODEL,
  messages: [
    { role: "user", content: "Reply with one short sentence." }
  ],
  stream: false,
});

console.log(response.choices[0]?.message?.content);
Enter fullscreen mode Exit fullscreen mode

Python example

from openai import OpenAI
import os

client = OpenAI(
    api_key=os.environ["OPENAI_API_KEY"],
    base_url=os.environ["OPENAI_BASE_URL"],
)

response = client.chat.completions.create(
    model=os.environ["OPENAI_MODEL"],
    messages=[{"role": "user", "content": "Reply with one short sentence."}],
    stream=False,
)

print(response.choices[0].message.content)
Enter fullscreen mode Exit fullscreen mode

Smoke test before debugging wrappers

If your app fails, test the route outside your framework first:

curl "$OPENAI_BASE_URL/chat/completions" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"YOUR_MODEL_ID","messages":[{"role":"user","content":"Reply with one short sentence."}],"stream":false}'
Enter fullscreen mode Exit fullscreen mode

Check these before changing application code:

  • whether the base URL should include /v1
  • whether your key can access the selected model
  • whether the endpoint accepts the SDK's default parameters
  • whether the provider supports streaming in the same shape
  • whether errors preserve upstream 400, 401, 403, 429, and 5xx status codes

Capability checks matter

For Chinese-strong OpenAI-compatible routes, I would test these separately:

  • response_format and JSON mode
  • tools and tool_choice
  • strict JSON schema
  • streaming deltas
  • sampling parameters such as top_p, stop, penalties, and seed
  • provider-specific reasoning fields
  • retry behavior and timeout behavior

A common mistake is to debug a full agent stack before checking whether a single raw chat completion works.

Where Botat fits

Botat is one OpenAI-compatible gateway for overseas developers evaluating Chinese-strong models for non-sensitive Chinese content, batch jobs, coding assistance, localization checks, and retryable tasks.

Do not use Botat or any China-model route for sensitive personal data, confidential customer data, regulated data, or strict data-residency workloads.

I wrote a longer checklist here: https://botat.com/en/openai-sdk-base-url-deepseek-qwen/?utm_source=devto&utm_medium=owned_content&utm_campaign=overseas_10_signup_sprint&utm_content=devto_openai_sdk_base_url_20260611

Practical rule

Treat OpenAI-compatible providers as request-shape compatible first. Then build a small capability matrix before you wire the route into production.

Top comments (0)