Chat Completions
1. Endpoint
/v1/chat/completions
2. Method
POST
3. Request Parameters
Header
| Parameter | Type | Required | Description |
|---|---|---|---|
| Authorization | string | Yes | Bearer API key, for example Bearer sk-xxxxxxxx |
| Content-Type | string | Yes | application/json |
Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| model | string | Yes | Model ID. See the model list below |
| messages | array | Yes | Conversation messages. Each item uses the Message schema |
| temperature | float | No | Sampling temperature. Range: 0-2. Default: 1 |
| top_p | float | No | Nucleus sampling parameter. Range: 0-1. Default: 1 |
| max_tokens | integer | No | Maximum number of tokens to generate |
| stream | boolean | No | Whether to enable streaming output. Default: false |
| stop | string/array | No | Stop sequence. Up to 4 stop sequences are supported |
| frequency_penalty | float | No | Frequency penalty. Range: -2-2. Default: 0 |
| presence_penalty | float | No | Presence penalty. Range: -2-2. Default: 0 |
| n | integer | No | Number of responses to generate. Default: 1 |
Model List
| model | Description |
|---|---|
qwen3.5-plus |
qwen3.5-plus |
qwen3.6-plus |
qwen3.6-plus |
qwen3.7-plus |
qwen3.7-plus |
qwen3.7-max |
qwen3.7-max |
kimi-k2.6 |
kimi-k2.6 |
deepseek-v3-2-251201 |
deepseek-v3-2-251201 |
deepseek-v4-flash |
deepseek-v4-flash |
deepseek-v4-pro |
deepseek-v4-pro |
Object Schemas
Message
| Parameter | Type | Required | Description |
|---|---|---|---|
| role | string | Yes | Message role. Supported values: system, user, assistant |
| content | string | Yes | Message content |
4. Response Parameters
Non-streaming requests return a chat.completion object.
| Parameter | Type | Description |
|---|---|---|
| id | string | Unique request ID |
| object | string | Object type. Fixed value: chat.completion |
| created | integer | Creation timestamp in seconds |
| model | string | Model ID used for this request |
| choices | array | Generated response choices |
| usage | object | Token usage statistics |
choices
| Parameter | Type | Description |
|---|---|---|
| index | integer | Choice index |
| message | object | Generated message object |
| finish_reason | string | Finish reason, for example stop for normal completion or length when the token limit is reached |
message
| Parameter | Type | Description |
|---|---|---|
| role | string | Role |
| content | string | Response content |
usage
| Parameter | Type | Description |
|---|---|---|
| prompt_tokens | integer | Number of input tokens |
| completion_tokens | integer | Number of output tokens |
| total_tokens | integer | Total number of tokens |
Streaming requests return text/event-stream. Each event starts with data: and the stream ends with data: [DONE].
5. Examples
Non-streaming request
curl -X POST https://hiharness.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{
"model": "qwen3.5-plus",
"messages": [
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "Hello, please introduce yourself."}
],
"temperature": 0.7,
"max_tokens": 1024
}'
Non-streaming response
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1748236800,
"model": "qwen3.5-plus",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello! I am an AI assistant. How can I help you?"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 15,
"completion_tokens": 18,
"total_tokens": 33
}
}
Streaming request
curl -X POST https://hiharness.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <YOUR_API_KEY>" \
-d '{
"model": "qwen3.5-plus",
"messages": [
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "Hello, please introduce yourself."}
],
"stream": true,
"temperature": 0.7,
"max_tokens": 1024
}'
Streaming response
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1748236800,"model":"qwen3.5-plus","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1748236800,"model":"qwen3.5-plus","choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1748236800,"model":"qwen3.5-plus","choices":[{"index":0,"delta":{"content":"!"},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1748236800,"model":"qwen3.5-plus","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]
6. Python Examples
requests non-streaming
import requests
BASE_URL = "https://hiharness.ai"
API_KEY = "sk-xxxxxxxx"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}",
}
payload = {
"model": "qwen3.5-plus",
"messages": [
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "Hello, please introduce yourself."},
],
"temperature": 0.7,
"max_tokens": 1024,
}
response = requests.post(
f"{BASE_URL}/v1/chat/completions",
headers=headers,
json=payload,
)
response.raise_for_status()
result = response.json()
print(result["choices"][0]["message"]["content"])
requests streaming
import json
import requests
BASE_URL = "https://hiharness.ai"
API_KEY = "sk-xxxxxxxx"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}",
}
payload = {
"model": "qwen3.5-plus",
"messages": [
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "Hello, please introduce yourself."},
],
"stream": True,
"temperature": 0.7,
"max_tokens": 1024,
}
response = requests.post(
f"{BASE_URL}/v1/chat/completions",
headers=headers,
json=payload,
stream=True,
)
response.raise_for_status()
for line in response.iter_lines():
if not line:
continue
line = line.decode("utf-8")
if not line.startswith("data: "):
continue
data = line[6:]
if data == "[DONE]":
break
chunk = json.loads(data)
delta = chunk["choices"][0]["delta"]
if "content" in delta:
print(delta["content"], end="", flush=True)
print()
OpenAI Python Client non-streaming
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxxxxxx",
base_url="https://hiharness.ai/v1",
)
response = client.chat.completions.create(
model="qwen3.5-plus",
messages=[
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "Hello, please introduce yourself."},
],
temperature=0.7,
max_tokens=1024,
)
print(response.choices[0].message.content)
OpenAI Python Client streaming
from openai import OpenAI
client = OpenAI(
api_key="sk-xxxxxxxx",
base_url="https://hiharness.ai/v1",
)
stream = client.chat.completions.create(
model="qwen3.5-plus",
messages=[
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "Hello, please introduce yourself."},
],
stream=True,
temperature=0.7,
max_tokens=1024,
)
for chunk in stream:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="", flush=True)
print()
7. Error Codes
| HTTP Status Code | Description |
|---|---|
| 400 | Invalid request parameters |
| 401 | API key is invalid or missing |
| 429 | Rate limit exceeded |
| 500 | Internal server error |
| 503 | Model service is temporarily unavailable |