指定前缀续写(Partial Mode)

在代码补全、文本续写等场景中,需要模型从已有的文本片段(前缀)开始继续生成。Partial Mode 可提供精确控制能力,确保模型输出的内容紧密衔接提供的前缀,提升生成结果的准确性与可控性。

使用方式

需在messages 数组中将最后一条消息的 role 设置为 assistant,并在其 content 中提供前缀,在此消息中设置参数 "partial": truemessages格式如下:

[
    {
        "role": "user",
        "content": "请补全这个斐波那契函数,勿添加其它内容"
    },
    {
        "role": "assistant",
        "content": "def calculate_fibonacci(n):\n    if n <= 1:\n        return n\n    else:\n",
        "partial": true
    }
]

模型会以前缀内容为起点开始生成。

支持的模型

  • 通义千问Max 系列

    qwen-max、qwen-max-latest、qwen-max-2024-09-19及之后的快照模型

  • 通义千问Plus 系列(非思考模式)

    qwen-plus、qwen-plus-latest、qwen-plus-2024-09-19及之后的快照模型

  • 通义千问Flash 系列(非思考模式)

    qwen-flash、qwen-flash-2025-07-28及之后的快照模型

  • 通义千问Coder 系列

    qwen3-coder-plus、qwen3-coder-flash、qwen3-coder-480b-a35b-instruct、qwen3-coder-30b-a3b-instruct、qwen-coder-plus、qwen-coder-plus-latest、qwen-coder-plus-2024-11-06、qwen-coder-turbo、qwen-coder-turbo-latest、qwen-coder-turbo-2024-09-19、qwen2.5-coder-32b-instruct、qwen2.5-coder-14b-instruct、qwen2.5-coder-7b-instruct、qwen2.5-coder-3b-instruct、qwen2.5-coder-1.5b-instruct、qwen2.5-coder-0.5b-instruct

  • 通义千问VL 系列

    • qwen-vl-max 系列

      qwen-vl-max、qwen-vl-max-latest、qwen-vl-max-2024-11-19、qwen-vl-max-2025-01-25及之后的快照模型

    • qwen-vl-plus 系列

      qwen-vl-plus、qwen-vl-plus-latest、qwen-vl-plus-2025-05-07、qwen-vl-plus-2024-08-09

  • 通义千问Turbo 系列(非思考模式)

    qwen-turbo、qwen-turbo-latest、qwen-turbo-2024-09-19及之后的快照模型

  • 通义千问开源系列

    Qwen3 开源模型(非思考模式)、qwen2.5-72b-instruct、qwen2.5-32b-instruct、qwen2.5-14b-instruct、qwen2.5-7b-instruct、qwen2.5-3b-instruct、qwen2.5-1.5b-instruct、qwen2.5-0.5b-instruct

  • 通义千问Math 系列

    qwen-math-plus、qwen-math-plus-latest、qwen-math-plus-0919、qwen-math-turbo、qwen-math-turbo-latest、qwen-math-turbo-0919、qwen2.5-math-72b-instruct、qwen2.5-math-7b-instruct、qwen2.5-math-1.5b-instruct

重要

思考模式模型暂不支持前缀续写功能。

快速开始

前提条件

获取API Key配置API Key到环境变量。如果通过 OpenAI SDK 或 DashScope SDK 进行调用,需要安装SDK。如果您是子业务空间的成员,请确保超级管理员已为该业务空间进行 模型授权操作

说明

暂不支持 DashScope Java SDK。

示例代码

代码补全是 Partial Mode 的核心应用场景。以下示例演示如何使用 qwen3-coder-plus 模型补全一个 Python 函数。

OpenAI兼容

Python

import os
from openai import OpenAI

# 1. 初始化客户端
client = OpenAI(
    # 若没有配置环境变量,请将下行替换为:api_key="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

# 2. 定义需要补全的代码前缀
prefix = """def calculate_fibonacci(n):
    if n <= 1:
        return n
    else:
"""

# 3. 发起 Partial Mode 请求
# 注意:messages 数组的最后一条消息 role 为 "assistant",并包含 "partial": True
completion = client.chat.completions.create(
    model="qwen3-coder-plus",
    messages=[
        {"role": "user", "content": "请补全这个斐波那契函数,勿添加其它内容"},
        {"role": "assistant", "content": prefix, "partial": True},
    ],
)

# 4. 手动拼接前缀和模型生成的内容
generated_code = completion.choices[0].message.content
complete_code = prefix + generated_code

print(complete_code)

返回结果

def calculate_fibonacci(n):
    if n <= 1:
        return n
    else:
        return calculate_fibonacci(n-1) + calculate_fibonacci(n-2)

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    // 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:apiKey: "sk-xxx",
    apiKey: process.env.DASHSCOPE_API_KEY,
    baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
});

// 定义需要补全的代码前缀
const prefix = `def calculate_fibonacci(n):
    if n <= 1:
        return n
    else:
`;

const completion = await openai.chat.completions.create({
    model: "qwen3-coder-plus",  // 使用代码模型
    messages: [
        { role: "user", content: "请补全这个斐波那契函数,勿添加其它内容" },
        { role: "assistant", content: prefix, partial: true }
    ],
});

// 手动拼接前缀和模型生成的内容
const generatedCode = completion.choices[0].message.content;
const completeCode = prefix + generatedCode;

console.log(completeCode);

curl

curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3-coder-plus",
    "messages": [
        {
            "role": "user", 
            "content": "请补全这个斐波那契函数,勿添加其它内容"
        },
        {
            "role": "assistant",
            "content": "def calculate_fibonacci(n):\n    if n <= 1:\n        return n\n    else:\n",
            "partial": true
        }
    ]
}'

返回结果

{
    "choices": [
        {
            "message": {
                "content": "        return calculate_fibonacci(n-1) + calculate_fibonacci(n-2)",
                "role": "assistant"
            },
            "finish_reason": "stop",
            "index": 0,
            "logprobs": null
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 48,
        "completion_tokens": 19,
        "total_tokens": 67,
        "prompt_tokens_details": {
            "cache_type": "implicit",
            "cached_tokens": 0
        }
    },
    "created": 1756800231,
    "system_fingerprint": null,
    "model": "qwen3-coder-plus",
    "id": "chatcmpl-d103b1cf-4bda-942f-92d6-d7ecabfeeccb"
}

DashScope

Python

import os
import dashscope

messages = [
    {
        "role": "user", 
        "content": "请补全这个斐波那契函数,勿添加其它内容"
    },
    {
        "role": "assistant",
        "content": "def calculate_fibonacci(n):\n    if n <= 1:\n        return n\n    else:\n",
        "partial": True
    }
]
response = dashscope.Generation.call(
    # 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    model='qwen3-coder-plus',
    messages=messages,
    result_format='message',  
)

# 手动拼接前缀和模型生成的内容
prefix = "def calculate_fibonacci(n):\n    if n <= 1:\n        return n\n    else:\n"
generated_code = response.output.choices[0].message.content
complete_code = prefix + generated_code

print(complete_code)

返回结果

def calculate_fibonacci(n):
    if n <= 1:
        return n
    else:
        return calculate_fibonacci(n-1) + calculate_fibonacci(n-2)

curl

curl -X POST "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation" \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
    "model": "qwen3-coder-plus",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": "请补全这个斐波那契函数,勿添加其它内容"
            },
            {
                "role": "assistant",
                "content": "def calculate_fibonacci(n):\n    if n <= 1:\n        return n\n    else:\n",
                "partial": true
            }
        ]
    },
    "parameters": {
        "result_format": "message"
    }
}'

返回结果

{
    "output": {
        "choices": [
            {
                "message": {
                    "content": "        return calculate_fibonacci(n-1) + calculate_fibonacci(n-2)",
                    "role": "assistant"
                },
                "finish_reason": "stop"
            }
        ]
    },
    "usage": {
        "total_tokens": 67,
        "output_tokens": 19,
        "input_tokens": 48,
        "prompt_tokens_details": {
            "cache_type": "implicit",
            "cached_tokens": 0
        },
        "cached_tokens": 0
    },
    "request_id": "c61c62e5-cf97-90bc-a4ee-50e5e117b93f"
}

使用示例

传入图片或视频

qwen-vl-max系列与qwen-vl-plus系列模型支持在输入图像、视频数据时进行前缀续写,可应用于产品介绍、社交媒体内容创作、新闻稿生成、创意文案等场景。

OpenAI兼容

Python

import os
from openai import OpenAI

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

completion = client.chat.completions.create(
    model="qwen-vl-max",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://img.alicdn.com/imgextra/i3/O1CN01zFX2Bs1Q0f9pESgPC_!!6000000001914-2-tps-450-450.png"
                    },
                },
                {"type": "text", "text": "我要发社交媒体,请帮我想一下文案。"},
            ],
        },
        {
            "role": "assistant",
            "content": "今天发现了一家宝藏咖啡馆",
            "partial": True,
        },
    ],
)
print(completion.choices[0].message.content)

返回结果

,这款提拉米苏简直是味蕾的享受!每一口都能感受到咖啡与奶油的完美融合,幸福感爆棚~ #美食分享 #提拉米苏 #咖啡时光

希望你喜欢这个文案!如果有任何修改需求,请随时告诉我。

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    // 若没有配置环境变量,请用百炼API Key将下行替换为:apiKey: "sk-xxx"
    apiKey: process.env.DASHSCOPE_API_KEY,
    baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
});

async function main() {
    const response = await openai.chat.completions.create({
        model: "qwen-vl-max",  // 此处以qwen-vl-max为例,可按需更换模型名称。
        messages: [
            {
                role: "user",
                content: [
                    {
                        type: "image_url",
                        image_url: {
                            "url": "https://img.alicdn.com/imgextra/i3/O1CN01zFX2Bs1Q0f9pESgPC_!!6000000001914-2-tps-450-450.png"
                        }
                    },
                    {
                        type: "text",
                        text: "我要发社交媒体,请帮我想一下文案。"
                    }
                ]
            },
            {
                role: "assistant",
                content: "今天发现了一家宝藏咖啡馆",
                "partial": true
            }
        ]
    });
    console.log(response.choices[0].message.content);
}

main();

curl

示例代码

curl -X POST 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
  "model": "qwen-vl-max",
  "messages": [
    {
      "role": "user",
      "content": [
        {
          "type": "image_url",
          "image_url": {
            "url": "https://img.alicdn.com/imgextra/i3/O1CN01zFX2Bs1Q0f9pESgPC_!!6000000001914-2-tps-450-450.png"
          }
        },
        {
          "type": "text",
          "text": "我要发社交媒体,请帮我想一下文案。"
        }
      ]
    },
    {
      "role": "assistant",
      "content": "今天发现了一家宝藏咖啡馆",
      "partial": true
    }
  ]
}'

返回结果

{
    "choices": [
        {
            "message": {
                "content": ",这款提拉米苏简直是味蕾的享受!每一口都是咖啡与奶油的完美融合,幸福感爆棚~ #美食分享 #提拉米苏 #咖啡时光\n\n希望你喜欢这个文案!如果有任何修改需求,请随时告诉我。",
                "role": "assistant"
            },
            "finish_reason": "stop",
            "index": 0,
            "logprobs": null
        }
    ],
    "object": "chat.completion",
    "usage": {
        "prompt_tokens": 282,
        "completion_tokens": 56,
        "total_tokens": 338,
        "prompt_tokens_details": {
            "cached_tokens": 0
        }
    },
    "created": 1756802933,
    "system_fingerprint": null,
    "model": "qwen-vl-max",
    "id": "chatcmpl-5780cbb7-ebae-9c63-b098-f8cc49e321f0"
}

DashScope

Python

示例代码

import os
import dashscope

messages = [
    {
        "role": "user",
        "content": [
            {
                "image": "https://img.alicdn.com/imgextra/i3/O1CN01zFX2Bs1Q0f9pESgPC_!!6000000001914-2-tps-450-450.png"
            },
            {"text": "我要发社交媒体,请帮我想一下文案。"},
        ],
    },
    {"role": "assistant", "content": "今天发现了一家宝藏咖啡馆", "partial": True},
]

response = dashscope.MultiModalConversation.call(
    #若没有配置环境变量, 请用百炼API Key将下行替换为: api_key ="sk-xxx"
    api_key=os.getenv("DASHSCOPE_API_KEY"), 
    model="qwen-vl-max", 
    messages=messages
)

print(response.output.choices[0].message.content[0]["text"])

返回结果

,这款提拉米苏简直是味蕾的享受!每一口都能感受到咖啡与奶油的完美融合,幸福感爆棚~ #美食分享 #提拉米苏 #咖啡时光

希望你喜欢这个文案!如果有任何修改需求,请随时告诉我。

curl

示例代码

curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "model": "qwen-vl-max",
    "input":{
        "messages":[
            {"role": "user",
             "content": [
               {"image": "https://img.alicdn.com/imgextra/i3/O1CN01zFX2Bs1Q0f9pESgPC_!!6000000001914-2-tps-450-450.png"},
               {"text": "我要发社交媒体,请帮我想一下文案。"}]
            },
            {"role": "assistant",
             "content": "今天发现了一家宝藏咖啡馆",
             "partial": true
            }
        ]
    }
}'

返回结果

{
    "output": {
        "choices": [
            {
                "message": {
                    "content": [
                        {
                            "text": ",这款提拉米苏简直是味蕾的享受!每一口都能感受到咖啡与奶油的完美融合,幸福感爆棚~ #美食分享 #提拉米苏 #咖啡时光\n\n希望你喜欢这个文案!如果有任何修改需求,请随时告诉我。"
                        }
                    ],
                    "role": "assistant"
                },
                "finish_reason": "stop"
            }
        ]
    },
    "usage": {
        "total_tokens": 339,
        "input_tokens_details": {
            "image_tokens": 258,
            "text_tokens": 24
        },
        "output_tokens": 57,
        "input_tokens": 282,
        "output_tokens_details": {
            "text_tokens": 57
        },
        "image_tokens": 258
    },
    "request_id": "c741328c-23dc-9286-bfa7-626a4092ca09"
}

基于不完整输出进行续写

如果大模型返回不完整的内容,可使用 Partial Mode 对不完整的内容续写,使其语义完整。大模型可能返回不完整内容的情况:

  • max_tokens参数设置过小,使模型返回被截断的内容。

  • 非流式输出触发超时,已生成的内容不完整。

    超时不再报错,而是将已生成内容返回,详情参见如何处理模型超时的情况

OpenAI兼容

Python

import os
from openai import OpenAI

# 初始化客户端
client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

def chat_completion(messages,max_tokens=None):
    response = client.chat.completions.create(
        model="qwen-plus",
        messages=messages,
        max_tokens=max_tokens
    )
    print(f"###停止生成原因:{response.choices[0].finish_reason}")
    
    return response.choices[0].message.content

# 使用示例
messages = [{"role": "user", "content": "请写一个短篇科幻故事"}]

# 第一轮调用,设置max_tokens为40
first_content = chat_completion(messages, max_tokens=40)
print(first_content)
# 将第一轮的响应加入到assistant message,并设置partial=True
messages.append({"role": "assistant", "content": first_content, "partial": True})

# 第二轮调用
second_content = chat_completion(messages)
print("###完整内容:")
print(first_content+second_content)

返回结果

停止生成原因为length表示触发了max_tokens的限制;停止生成原因为stop表示大模型生成自然结束,或触发了stop参数。

###停止生成原因:length
**《记忆的尽头》**

在遥远的未来,地球早已不再适合人类居住。大气层被污染,海洋干涸,城市变成了废墟。人类被迫迁移到一颗名为“
###停止生成原因:stop
###完整内容:
**《记忆的尽头》**

在遥远的未来,地球早已不再适合人类居住。大气层被污染,海洋干涸,城市变成了废墟。人类被迫迁移到一颗名为“伊甸星”的宜居星球,那里有蔚蓝的天空、清新的空气和无尽的资源。

然而,伊甸星并非真正的天堂。它没有人类的历史,没有过去,也没有记忆。

......

**“如果我们忘记了自己是谁,我们还算是人类吗?”**

——完——

Node.js

import OpenAI from "openai";

const openai = new OpenAI({
    // 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:apiKey: "sk-xxx",
    apiKey: process.env.DASHSCOPE_API_KEY,
    baseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1"
});

async function chatCompletion(messages, maxTokens = null) {
    const completion = await openai.chat.completions.create({
        model: "qwen-plus",
        messages: messages,
        max_tokens: maxTokens
    });
    
    console.log(`###停止生成原因:${completion.choices[0].finish_reason}`);
    return completion.choices[0].message.content;
}

// 使用示例
async function main() {
    let messages = [{"role": "user", "content": "请写一个短篇科幻故事"}];

    try {
        // 第一轮调用,设置max_tokens为40
        const firstContent = await chatCompletion(messages, 40);
        console.log(firstContent);
        
        // 将第一轮的响应加入到assistant message,并设置partial=true
        messages.push({"role": "assistant", "content": firstContent, "partial": true});

        // 第二轮调用
        const secondContent = await chatCompletion(messages);
        console.log("###完整内容:");
        console.log(firstContent + secondContent);
        
    } catch (error) {
        console.error('执行出错:', error);
    }
}

// 运行示例
main();

DashScope

Python

示例代码

import os
import dashscope

def chat_completion(messages, max_tokens=None):
    response = dashscope.Generation.call(
        # 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:api_key="sk-xxx",
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        model='qwen-plus',
        messages=messages,
        max_tokens=max_tokens,
        result_format='message',  
    )
    
    print(f"###停止生成原因:{response.output.choices[0].finish_reason}")
    return response.output.choices[0].message.content

# 使用示例
messages = [{"role": "user", "content": "请写一个短篇科幻故事"}]

# 第一轮调用,设置max_tokens为40
first_content = chat_completion(messages, max_tokens=40)
print(first_content)

# 将第一轮的响应加入到assistant message,并设置partial=True
messages.append({"role": "assistant", "content": first_content, "partial": True})

# 第二轮调用
second_content = chat_completion(messages)
print("###完整内容:")
print(first_content + second_content)

返回结果

###停止生成原因:length
标题:**《时间折纸》**

---

公元2179年,人类终于掌握了时间旅行的技术。但这项技术并不是通过庞大的机器或复杂的能量场实现的,而是一
###停止生成原因:stop
###完整内容:
标题:**《时间折纸》**

---

公元2179年,人类终于掌握了时间旅行的技术。但这项技术并不是通过庞大的机器或复杂的能量场实现的,而是一张纸。

一张能折叠时间的纸。

它被称为“时间折纸”,由一种来自外星文明的未知物质制成。科学家们无法解释它的原理,只知道,只要在纸上画出某个场景,再进行特定的折叠方式,就能打开一扇通往过去或未来的门。

......

“你不是时间的钥匙,只是提醒我们,未来,始终掌握在我们手中。”

然后,我把它撕成了碎片。

---

**(完)**

计费说明

根据请求的输入 Token 和输出 Token 计费。前缀部分作为输入 Token。

错误码

如果模型调用失败并返回报错信息,请参见错误信息进行解决。