DeepSeek V4 Pro API | Openoctopus
Integration Steps
Synchronous1.8s for up to 180s.succeeded / failed / cancelled.output_payload.assets[] URLs.Step 1 · Create Request
Submit generation input. Choose a backend language example below.
curl -X POST https://api.openoctopus.com/v1/chat/completions \\
-H "Content-Type: application/json" \\
-H "Authorization: Bearer ooq_your_api_key" \\
-d '{
"model": "openoctopus/deepseek-v4-pro",
"messages": [
{
"role": "user",
"content": "Write a concise summary of how OpenOctopus async tasks work."
}
]
}'Poll Task Status
Use the task ID from create response to poll execution status.
curl https://api.openoctopus.com/v1/tasks/task_id_from_previous_response \
-H "Authorization: Bearer ooq_your_api_key"const timeoutMs = 180000;
const intervalMs = 1800;
const startedAt = Date.now();
while (Date.now() - startedAt < timeoutMs) {
const r = await fetch("https://api.openoctopus.com/v1/tasks/task_id_from_previous_response", {
headers: { Authorization: "Bearer " + process.env.OPENOCTOPUS_API_KEY },
});
const task = await r.json();
if (!r.ok) throw new Error(task?.error?.message ?? "task query failed");
if (task.status === "queued" || task.status === "processing") {
await new Promise((resolve) => setTimeout(resolve, intervalMs));
continue;
}
if (task.status === "succeeded") {
console.log(task.output_payload);
break;
}
throw new Error(task?.error_message ?? "task failed");
}import time, requests
timeout_s = 180
interval_s = 1.8
started = time.time()
while time.time() - started < timeout_s:
resp = requests.get(
"https://api.openoctopus.com/v1/tasks/task_id_from_previous_response",
headers={"Authorization": f"Bearer {OPENOCTOPUS_API_KEY}"},
timeout=30,
)
task = resp.json()
if resp.status_code >= 400:
raise RuntimeError(task.get("error", {}).get("message", "task query failed"))
status = task.get("status")
if status in ("queued", "processing"):
time.sleep(interval_s)
continue
if status == "succeeded":
print(task.get("output_payload"))
break
raise RuntimeError(task.get("error_message", "task failed"))Request Example (From Internal)
{
"model": "openoctopus/your-model",
"input": {
"messages": "example",
"thinking": "example",
"reasoning_effort": "high",
"max_tokens": "4096",
"response_format": "example",
"stop": "example",
"stream": "true",
"stream_options": "example",
"temperature": "0.8",
"top_p": "0.9",
"tools": "example",
"tool_choice": "example",
"logprobs": "true",
"top_logprobs": "5",
"user_id": "user-123"
}
}Submit Response Example
{
"id": "00000000-0000-0000-0000-000000000000",
"status": "queued",
"model": "openoctopus/your-model"
}Input Schema (Standard + Provider Extension)
Standard request contract merged with this model's upstream input parameters.
| Field | Type | Required | Description | Example |
|---|---|---|---|---|
| messages | object[] | Yes | 对话消息列表 | - |
| model | string | Yes | 使用的模型的ID,可选值:deepseek-v4-flash, deepseek-v4-pro | deepseek-v4-flash |
| thinking | object | No | 推理配置 | - |
| reasoning_effort | string | No | 控制模型的推理强度,可选值:high, max | high |
| max_tokens | integer | No | 限制模型生成 completion 的最大 token 数 | - |
| response_format | object | No | 响应格式 | - |
| stop | object | No | 停止条件 | - |
| stream | boolean | No | 是否以流式发送消息增量 | true |
| stream_options | object | No | 流式选项 | - |
| temperature | number | No | 采样温度,介于0和2之间,默认1 | 0.8 |
| top_p | number | No | 核采样参数,默认1 | 0.9 |
| tools | object[] | No | 工具列表 | - |
| tool_choice | object | No | 工具选择 | - |
| logprobs | boolean | No | 是否返回输出 token 的对数概率 | true |
| top_logprobs | integer | No | 指定每个输出位置返回输出概率 top N 的 token,最大20 | 5 |
| user_id | string | No | 自定义用户标识,可选字符集[a-zA-Z0-9\-_],最大长度512 | user-123 |
{
"standard": {
"model": "public model slug (required)",
"prompt": "user prompt (required)",
"input": "provider-specific options (optional object)"
},
"providerExtension": {
"params": [
{
"name": "messages",
"type": "object[]",
"required": true,
"description": "对话消息列表",
"exposedToCustomer": true
},
{
"name": "model",
"type": "string",
"example": "deepseek-v4-flash",
"required": true,
"description": "使用的模型的ID,可选值:deepseek-v4-flash, deepseek-v4-pro",
"exposedToCustomer": false
},
{
"name": "thinking",
"type": "object",
"required": false,
"description": "推理配置",
"exposedToCustomer": false
},
{
"name": "reasoning_effort",
"type": "string",
"example": "high",
"required": false,
"description": "控制模型的推理强度,可选值:high, max",
"exposedToCustomer": false
},
{
"name": "max_tokens",
"type": "integer",
"required": false,
"description": "限制模型生成 completion 的最大 token 数",
"exposedToCustomer": false
},
{
"name": "response_format",
"type": "object",
"required": false,
"description": "响应格式",
"exposedToCustomer": false
},
{
"name": "stop",
"type": "object",
"required": false,
"description": "停止条件",
"exposedToCustomer": false
},
{
"name": "stream",
"type": "boolean",
"example": "true",
"required": false,
"description": "是否以流式发送消息增量",
"exposedToCustomer": false
},
{
"name": "stream_options",
"type": "object",
"required": false,
"description": "流式选项",
"exposedToCustomer": false
},
{
"name": "temperature",
"type": "number",
"example": "0.8",
"required": false,
"description": "采样温度,介于0和2之间,默认1",
"exposedToCustomer": false
},
{
"name": "top_p",
"type": "number",
"example": "0.9",
"required": false,
"description": "核采样参数,默认1",
"exposedToCustomer": false
},
{
"name": "tools",
"type": "object[]",
"required": false,
"description": "工具列表",
"exposedToCustomer": false
},
{
"name": "tool_choice",
"type": "object",
"required": false,
"description": "工具选择",
"exposedToCustomer": false
},
{
"name": "logprobs",
"type": "boolean",
"example": "true",
"required": false,
"description": "是否返回输出 token 的对数概率",
"exposedToCustomer": false
},
{
"name": "top_logprobs",
"type": "integer",
"example": "5",
"required": false,
"description": "指定每个输出位置返回输出概率 top N 的 token,最大20",
"exposedToCustomer": false
},
{
"name": "user_id",
"type": "string",
"example": "user-123",
"required": false,
"description": "自定义用户标识,可选字符集[a-zA-Z0-9\\-_],最大长度512",
"exposedToCustomer": false
}
]
}
}Output Schema (Standard + Provider Extension)
Standard output contract merged with provider extension fields.
Note: integrate against output_payload.assets[]. raw is optional and may be omitted by endpoint policy.
| Field | Type | Exposed | Description | Example |
|---|---|---|---|---|
| id | string | Yes | 该对话的唯一标识符 | chatcmpl-123 |
| choices | object[] | Yes | 模型生成的选项列表 | - |
| created | integer | Yes | 创建聊天完成时的 Unix 时间戳(秒) | 1677652288 |
| model | string | Yes | 生成该 completion 的模型名 | deepseek-v4-flash |
| system_fingerprint | string | Yes | 后端配置指纹 | fp_44709d6fcb |
| object | string | Yes | 对象类型,固定为 chat.completion | chat.completion |
| usage | object | Yes | token 使用情况 | - |
{
"standard": {
"id": "task id",
"status": "queued | processing | succeeded | failed | cancelled",
"queue": {
"enabled": "whether OpenOctopus local queue is enabled for this model",
"position": "1-based queue position while queued, 0 while processing, null when unavailable",
"size": "current queued request count for this model",
"concurrency": "local concurrent upstream submissions allowed for this model",
"upstreamQueueSupported": "whether the upstream provider has a reliable queue",
"upstreamCancelSupported": "whether the upstream provider supports cancellation"
},
"asset_storage": {
"provider": "supabase | aliyun-oss | tencent-cos",
"inputBucket": "bucket used for uploaded reference media",
"outputBucket": "bucket used for generated media",
"custom": "true when this model overrides default system asset storage"
},
"capability": "image_generation | video_generation",
"output_payload": {
"format": "openoctopus.image.output.v1 | openoctopus.video.output.v1",
"assets": "normalized output assets",
"raw": "optional sanitized debug payload (may be omitted depending on endpoint policy)"
}
},
"providerExtension": {
"fields": [
{
"name": "id",
"type": "string",
"example": "chatcmpl-123",
"description": "该对话的唯一标识符",
"exposedToCustomer": true
},
{
"name": "choices",
"type": "object[]",
"description": "模型生成的选项列表",
"exposedToCustomer": true
},
{
"name": "created",
"type": "integer",
"example": "1677652288",
"description": "创建聊天完成时的 Unix 时间戳(秒)",
"exposedToCustomer": true
},
{
"name": "model",
"type": "string",
"example": "deepseek-v4-flash",
"description": "生成该 completion 的模型名",
"exposedToCustomer": true
},
{
"name": "system_fingerprint",
"type": "string",
"example": "fp_44709d6fcb",
"description": "后端配置指纹",
"exposedToCustomer": true
},
{
"name": "object",
"type": "string",
"example": "chat.completion",
"description": "对象类型,固定为 chat.completion",
"exposedToCustomer": true
},
{
"name": "usage",
"type": "object",
"description": "token 使用情况",
"exposedToCustomer": true
}
]
}
}Final Output Example (Normalized)
{
"capability": "image_generation",
"status": "succeeded",
"output_payload": {
"format": "openoctopus.image.output.v1",
"assets": [
{
"type": "image",
"url": "https://example.com/result.png",
"mimeType": "image/png"
}
],
"raw": {
"id": "example",
"choices": "example",
"created": "example",
"model": "example",
"system_fingerprint": "example",
"object": "example",
"usage": "example"
}
}
}Step 4 · Error Handling Guide
Error codes below are loaded from internal gateway error definitions and should be treated as source of truth.
| Code | HTTP | Retryable | Category | Message |
|---|---|---|---|---|
| invalid_request | 400 | No | validation | The request payload is invalid. Check the required fields and try again. |
| unauthorized | 401 | No | auth | Authentication is required for this request. |
| invalid_api_key | 401 | No | auth | The API key is invalid or inactive. |
| insufficient_balance | 402 | No | billing | Your wallet balance is insufficient. Please top up and try again. |
| model_not_available | 404 | No | routing | The requested model is currently unavailable. |
| task_not_found | 404 | No | task | The requested task could not be found. |
| file_not_found | 404 | No | asset | The requested generated file is not available. |
| provider_offline | 503 | Yes | upstream | The selected model is temporarily unavailable. Please retry later. |
| provider_model_inactive | 503 | Yes | routing | The selected model is temporarily unavailable. Please retry later. |
| provider_credential_missing | 503 | Yes | system | The service is temporarily unavailable for this model. Please retry later. |
| provider_credential_incomplete | 503 | Yes | system | The service is temporarily unavailable for this model. Please retry later. |
| provider_credential_unusable | 503 | Yes | system | The service is temporarily unavailable for this model. Please retry later. |
| provider_credential_legacy | 503 | Yes | system | The service is temporarily unavailable for this model. Please retry later. |
| provider_credential_unavailable | 503 | Yes | system | The service is temporarily unavailable for this model. Please retry later. |
| provider_credential_decrypt_failed | 503 | Yes | system | The service is temporarily unavailable for this model. Please retry later. |
| model_billing_not_configured | 503 | No | system | The selected model is temporarily unavailable. Please retry later. |
| provider_pricing_not_configured | 503 | No | system | The selected model is temporarily unavailable. Please retry later. |
| database_operation_failed | 503 | Yes | system | The service could not access required internal records. Please retry later. |
| billing_resolution_failed | 503 | Yes | system | The selected model pricing could not be evaluated. Please retry later. |
| request_record_write_failed | 503 | Yes | system | The request could not be recorded internally. Please retry later. |
| api_key_touch_failed | 503 | Yes | system | The request was accepted but internal key tracking failed. Please retry later. |
| queue_unavailable | 503 | Yes | system | The internal job queue is temporarily unavailable. Please retry later. |
| provider_submit_failed | 502 | Yes | upstream | The generation provider could not accept the request. Please retry shortly. |
| provider_poll_failed | 502 | Yes | upstream | The generation provider could not complete the request. Please retry shortly. |
| upstream_failed | 502 | Yes | upstream | The generation provider failed to complete the request. Please retry shortly. |
| content_policy_violation | 400 | No | safety | The prompt or image was rejected by the provider safety policy. Please adjust the content and try again. |
| upstream_timeout | 504 | Yes | upstream | The generation request timed out. Please retry shortly. |
| upstream_result_missing | 502 | Yes | upstream | The generation provider returned an incomplete result. Please retry shortly. |
| video_output_missing | 502 | Yes | upstream | The generation provider returned an incomplete result. Please retry shortly. |
| service_unavailable | 503 | Yes | system | The service is temporarily unavailable. Please retry later. |
| internal_error | 500 | Yes | system | The service encountered an unexpected error. Please retry later. |
task.status=failed, always read error.code and match the table above; retry only when retryable=true.