OpenAI-compatible API proxy for chat.qwen.ai with Flask server and Python API
Project description
Qwen Web API Proxy
Qwen API Proxy exposes the upstream chat.qwen.ai service through an OpenAI-compatible API. It provides a local Flask server and a Python API for issuing chat completions programmatically.
Features:
- OpenAI-compatible
v1/chat/completionsendpoint - Python API
QwenApifor synchronous completions
Installation
Install dependencies:
pip install flask flask-cors requests
The service reads configuration from environment variables:
| Variable | Description | Default |
|---|---|---|
QWEN_AUTH_TOKEN |
Authorization token copied from chat.qwen.ai | required |
QWEN_BASE_URL |
Upstream API base URL | https://chat.qwen.ai |
PORT |
Port for the Flask server | 5000 |
QWEN_DEBUG |
Set to 1 to enable debug logging |
0 |
For authentication, you can either set the QWEN_AUTH_TOKEN environment variable or create a token.txt file in the current working directory with the token. To get the token, follow the steps:
- login to chat.qwen.ai;
- press F12 to open the browser's developer tools;
- navigate to the
Consoletab; - input
localStorage.getItem("token")and press Enter; - copy the token (without quotes) and paste it into the
token.txtfile or set theQWEN_AUTH_TOKENenvironment variable.
Usage
Run the server
python -m qwen.server
The app binds to 0.0.0.0:<PORT> and exposes the following endpoints:
GET /health– health checkGET /v1/models– list modelsPOST /v1/chat/completions– OpenAI-compatible chat completionsDELETE /v1/chats/<chat_id>– delete a stored chat session upstream
Python API
from qwen import QwenApi
messages = [{"role": "user", "content": "Hello, Qwen!"}]
client = QwenApi("qwen-flash")
response: str = client(
messages,
enable_thinking=True,
thinking_budget=2048,
)
print(response)
QwenApi raises ConfigurationError when the token is missing and QwenAPIError for upstream request issues.
Chat parameters
messages(list): List of messages in the format of [{"role": "user", "content": "Hello, Qwen!"}]. Or a single string containing the user query.model(str): Model name. The name mapping is defined inqwen/config.py, including:DEFAULT_MODEL_MAP: dict[str, str] = { "qwen": "qwen3-max", "qwen-think": "qwen3-235b-a22b", # 2507 "qwen-coder": "qwen3-coder-plus", "qwen-flash": "qwen-plus-2025-09-11", # next-80b-a3b "qwen-vl": "qwen3-vl-plus", # Qwen3-VL-235B-A22B }
enable_thinking(bool): SetTrueto request autodocumented reasoning. Defaults to the upstream user preference when omitted. Not available on all models.thinking_budget(int): Optional token budget for reasoning content. Only used whenenable_thinking=True.
Notes
- rate limit unknown - not recommended to use on main account
- currently only supports single user message
- streaming is not supported
License
GPLv3 License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qwen_webapi-0.1.2.tar.gz.
File metadata
- Download URL: qwen_webapi-0.1.2.tar.gz
- Upload date:
- Size: 18.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.10.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2dc2a032eb202cd82401d538a24df12713cdb6659f4cbfb52c0c559249fe577a
|
|
| MD5 |
a3d1efdcbe545db5f31700b441ffbf8f
|
|
| BLAKE2b-256 |
b324391a02d191777b8b5cc31dc4421a824751a0494904d1f22dd344cd4b52a5
|
File details
Details for the file qwen_webapi-0.1.2-py3-none-any.whl.
File metadata
- Download URL: qwen_webapi-0.1.2-py3-none-any.whl
- Upload date:
- Size: 18.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.10.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49466a865c1da80f2957a3247923ebdc46b218f1eb4ef46b01df3a4d76930500
|
|
| MD5 |
13339fd57bb04e2d95a8f2da8f7b0f50
|
|
| BLAKE2b-256 |
fe5973578b649f3632b2eb663486179f5f9f02c6a54271399dbcda1bd0729bb2
|