插件调用详细说明

重要

模型插件调用需"申请体验"并通过后才可使用,否则API调用将返回错误状态码。

Dashscope插件功能能够使得大模型的生成内容与外部三方应用结合,使得模型生成的内容更加准确和丰富,模型将拥有更好的生成能力。您也可以通过开发自定义插件,来使得模型生成更符合您预期的结果。

使用插件功能,大模型生成可以在如下几个方面得到更好的扩展:

  • 可以获得更加实时性的消息,比如体育赛事报道、实时、热点新闻

  • 可以让用户获得更多的能力,比如查询酒店信息,预定酒店、预定机票

  • 可以让用户构建专属的信息库

插件模型概览

支持模型

模型英文名

支持插件中文名

支持插件英文名

通义千问

qwen-plus

文字识别

ocr

计算器

calculator

图片生成

text_to_image

万豪酒店预定推荐

haozhu_recommend_hotel

PDF解析

pdf_extracter

Python代码解释器

code_interpreter

插件使用

您可以在插件广场申请需要使用开通的插件,申请通过后才能使用相应插件功能。

与不使用插件只调用大模型的情况相似,您可以通过SDK和HTTP请求两种方法,让大模型在插件的支持下,返回生成结果。

本文详细描述了输入输出参数的含义,若您希望获得调用具体插件的例子,请查阅调用样例

SDK使用

前提条件

示例代码

说明

需要使用您的API-KEY替换示例中的YOUR_DASHSCOPE_API_KEY

同时满足:

Python SDK version: dashscope>=1.13.1

代码才能正常运行。

注意

Java暂不支持插件功能。

API-KEY设置

export DASHSCOPE_API_KEY=YOUR_DASHSCOPE_API_KEY

单轮问答

以下示例展示了调用通义千问模型对一个用户指令进行响应的代码。

from http import HTTPStatus
import dashscope


def call_with_messages():
    plugins = {'calculator': {}}  # choose the desired plugin(s).
    messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
                {'role': 'user', 'content': '12345*98765是多少'}]
    response = dashscope.Generation.call(
        model='qwen-plus',
        messages=messages,
        result_format='message',  # set the result to be "message" format.
        plugins=plugins,
    )
    if response.status_code == HTTPStatus.OK:
        print(response)
    else:
        print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
            response.request_id, response.status_code,
            response.code, response.message
        ))


if __name__ == '__main__':
    call_with_messages()

多轮会话

from http import HTTPStatus
import dashscope
from dashscope.api_entities.dashscope_response import Role


def call_with_messages():
    plugins = {'calculator': {}}  # choose the desired plugin(s).
    messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
                {'role': 'user', 'content': '12345 * 98765是多少'}]
    response = dashscope.Generation.call(
        model='qwen-plus',
        messages=messages,
        result_format='message',  # set the result to be "message" format.
        plugins=plugins,
    )
    if response.status_code == HTTPStatus.OK:
        print(response)
        messages.extend(response.output.choices[0]['messages'])
    else:
        print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
            response.request_id, response.status_code,
            response.code, response.message
        ))
        messages.append({'role': Role.USER, 'content': '调用插件计算一下再加上22222是多少'})
        response = dashscope.Generation.call(
            model='qwen-plus',
            messages=messages,
            result_format='message',  # set the result to be "message" format.
            plugins=plugins,
        )
        if response.status_code == HTTPStatus.OK:
            print(response)
        else:
            print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                response.request_id, response.status_code,
                response.code, response.message
            ))


if __name__ == '__main__':
    call_with_messages()

流式输出

from http import HTTPStatus
import dashscope


def call_with_messages():
    plugins = {'calculator': {}}  # choose the desired plugin(s).
    messages = [{'role': 'system', 'content': 'You are a helpful assistant.'},
                {'role': 'user', 'content': '12345*98765是多少'}]
    responses = dashscope.Generation.call(
        model='qwen-plus',
        messages=messages,
        result_format='message',  # set the result to be "message" format.
        plugins=plugins,
        stream=True,
    )
    for response in responses:
        if response.status_code == HTTPStatus.OK:
            print(response)
        else:
            print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
                response.request_id, response.status_code,
                response.code, response.message
            ))


if __name__ == '__main__':
    call_with_messages()

输入参数说明

参数

类型

默认值

说明

model

string

-

指定用于对话的通义千问模型名,若需使用插件,请指定为qwen-plus。

messages

array

-

用户与模型的对话历史。list中的每个元素形式为{"role":角色, "content": 内容}。角色当前可选值:system、user、assistant,其中,仅messages[0]中支持role为system,user和assistant需要交替出现

prompt

string

-

用户当前输入的期望模型执行指令。

plugins

dict

-

指定候选插件列表。具体参数填写详见插件参数说明

history (可选)

list[dict]

[]

即将废弃,请使用messages字段,用户与模型的对话历史,list中的每个元素是形式为{"user":"用户输入","bot":"模型输出"}的一轮对话,多轮对话按时间正序排列。

top_p (可选)

float

0.5

生成过程中核采样方法概率阈值,例如,取值为0.8时,仅保留概率加起来大于等于0.8的最可能token的最小集合作为候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的确定性越高。

stream(可选)

bool

False

是否使用流式输出。当以stream模式输出结果时,接口返回结果为generator,需要通过迭代获取结果,每个输出为当前生成的整个序列,最后一次输出为最终全部生成结果。

top_k

int

0

生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。默认值为0,表示不启用top_k策略,此时,仅有top_p策略生效。

enable_search

bool

False

生成时,是否参考搜索的结果。注意:打开搜索并不意味着一定会使用搜索结果;如果打开搜索,模型会将搜索结果作为prompt,进而“自行判断”是否生成结合搜索结果的文本,默认为false

seed

int

1234

生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。默认值 1234

temperature

float

1.0

用于控制随机性和多样性的程度。具体来说,temperature值控制了生成文本时对每个候选词的概率分布进行平滑的程度。较高的temperature值会降低概率分布的峰值,使得更多的低概率词被选择,生成结果更加多样化;而较低的temperature值则会增强概率分布的峰值,使得高概率词更容易被选择,生成结果更加确定。

取值范围:(0, 2)

python version >=1.10.1

java version >= 2.5.1

result_format

String

text

[text|message],默认为text。建议使用插件时,使用message类型,输出参考message结果示例

返回结果

第一轮对话返回结果如下。

{
    "status_code": 200,
    "request_id": "1ba713ab-b05a-914e-b4a6-72258ec1d5d8",
    "code": "",
    "message": "",
    "output": {
        "text": null,
        "finish_reason": null,
        "choices": [
            {
                "finish_reason": "stop",
                "message": null,
                "messages": [
                    {
                        "role": "assistant",
                        "plugin_call": {
                            "name": "calculator",
                            "arguments": "{\"payload__input__text\": \"12345*98765\", \"header__request_id\": \"f275e6\"}"
                        },
                        "content": "Thought: 我需要进行乘法运算,需要用到计算器API。"
                    },
                    {
                        "role": "plugin",
                        "name": "calculator",
                        "content": "{\"equations\": [\"12345 * 98765\"], \"results\": [1219253925.0]}",
                        "status": {
                            "code": 200,
                            "name": "Success",
                            "message": "success"
                        }
                    },
                    {
                        "role": "assistant",
                        "content": "Thought: 这个问题的答案是1219253925.0。\nFinal Answer: 1219253925.0"
                    }
                ]
            }
        ]
    },
    "usage": {
        "input_tokens": 22,
        "output_tokens": 130,
        "total_tokens": 152
    }
}

若使用上述的多轮对话例子,第二轮对话返回结果如下。

{
    "status_code": 200,
    "request_id": "c9a32395-562f-91a8-ae75-87fb149b4595",
    "code": "",
    "message": "",
    "output": {
        "text": null,
        "finish_reason": null,
        "choices": [
            {
                "finish_reason": "stop",
                "message": null,
                "messages": [
                    {
                        "role": "assistant",
                        "plugin_call": {
                            "name": "calculator",
                            "arguments": "{\"payload__input__text\": \"1219253925+22222\", \"header__request_id\": \"2\"}"
                        },
                        "content": "Thought: 首先我需要将1219253925.0与22222相加,然后再使用计算器API来进行这个运算。"
                    },
                    {
                        "role": "plugin",
                        "name": "calculator",
                        "content": "{\"equations\": [\"1219253925 + 22222\"], \"results\": [1219276147.0]}",
                        "status": {
                            "code": 200,
                            "name": "Success",
                            "message": "success"
                        }
                    },
                    {
                        "role": "assistant",
                        "content": "Thought: 现在我知道了结果。\nFinal Answer: 1219276147.0"
                    }
                ]
            }
        ]
    },
    "usage": {
        "input_tokens": 86,
        "output_tokens": 147,
        "total_tokens": 233
    }
}

返回参数说明

返回参数

类型

说明

返回条件

status_code

int

200(HTTPStatus.OK)表示请求成功,否则表示请求失败,可以通过code获取错误码,通过message字段获取错误详细信息。

python才有这个字段,java失败会抛异常,异常信息为code,message内容

request_Id

string

系统生成的标志本次调用的id。

code

string

表示请求失败,表示错误码,成功忽略。

python only

message

string

失败,表示失败详细信息,成功忽略。

python only

output

dict

调用结果信息,对于千问模型,包含输出text。

usage

dict

计量信息,表示本次请求计量数据。

output.text

string

模型生成回复。

output.finish_reason

string

有三种情况:正在生成时为null,生成结束时如果由于停止token导致则为stop,生成结束时如果因为生成长度过长导致则为length。

usage.input_tokens

int

用户输入文本转换成Token后的长度。

usage.output_tokens

int

模型生成回复转换为Token后的长度。

choices

List

[]

当result_format为message

输出choices

choices[i].finish_reason

String

有三种情况:正在生成时为null,生成结束时如果由于停止token导致则为stop,生成结束时如果因为生成长度过长导致则为length。

当result_format为message

输出choices

choices[i].message

dict

模型生成消息输出,message/messages仅一个字段有值。

返回message字段表示单条message。

当模型触发插件调用时,返回messages字段表示多条message,用List方式表示。

当result_format为message

输出choices

choices[i].messages

List

message.role

String

模型role,大模型生成的文本内容为assistant,触发插件调用为plugin

message.plugin_call

dict

模型生成的插件调用信息,包括插件名和参数,仅当模型认为需要调用插件时生成

当message.role为assistant时

message.content

String

模型生成的文本

message.name

List

调用的插件名

当message.role为plugin时

message.status

dict

调用插件的状态,包括状态码和状态信息

message.content

String

插件返回的结果

HTTP使用

前提条件

请求地址

POST https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation

入参描述

传参方式

字段

类型

必选

描述

示例值

Header

Content-Type

String

请求类型:application/json 或者text/event-stream(开启 SSE 响应)

application/json

Authorization

String

API-Key,例如:Bearer d1**2a

Bearer d1**2a

X-DashScope-SSE

String

跟Accept: text/event-stream 二选一即可启用SSE响应

enable

X-DashScope-Plugin

String

可用的插件列表,与插件相关的参数信息,详见插件参数说明

{"haozhu_recommend_hotel":{},"general_information_retrieval":{"user_token": "eyJhbG……"}}

Body

model

String

指明需要调用的模型,调用插件请指定为qwen-plus

qwen-plus

input.prompt

String

用户当前输入的期望模型执行指令,支持中英文。

qwen-turbo prompt字段支持 6.5k Tokens 长度;

qwen-plus prompt字段支持 6.5k Tokens 长度

哪个公园距离我更近

input.history

List

用户与模型的对话历史,list中的每个元素是形式为{"user":"用户输入","bot":"模型输出"}的一轮对话,多轮对话按时间正序排列。

"history": [

{

"user":"今天天气好吗?",

"bot":"今天天气不错,要出去玩玩嘛?"

},

{

"user":"那你有什么地方推荐?",

"bot":"我建议你去公园,春天来了,花朵开了,很美丽。"

}

]

input.messages

List

用户与模型的对话历史,对话接口未来都会有message传输,不过prompt和history会持续兼容,list中的每个元素形式为{"role":角色, "content": 内容}。角色当前可选值:system、user、assistant。未来可以扩展到更多role。

"input":{

"messages":[

{

"role": "system",

"content": "You are a helpful assistant."

},

{

"role": "user",

"content": "你好,附近哪里有博物馆?"

}]

}

input.messages.role

String

message存在的时候不能缺省

input.messages.content

String

parameters.result_format

String

"text"表示旧版本的text

"message"表示兼容openai的message

"text"

parameters.top_p

Float

生成时,核采样方法的概率阈值。例如,取值为0.8时,仅保留累计概率之和大于等于0.8的概率分布中的token,作为随机采样的候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的随机性越低。默认值 0.5。注意,取值不要大于等于1

0.5

parameters.top_k

Integer

生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。注意:如果top_k的值大于100,top_k将采用默认值0,表示不启用top_k策略,此时仅有top_p策略生效。

50

parameters.seed

Integer

生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。默认值 1234

65535

parameters.enable_search

Bool

生成时,是否参考搜索的结果。注意:打开搜索并不意味着一定会使用搜索结果;如果打开搜索,模型会将搜索结果作为prompt,进而“自行判断”是否生成结合搜索结果的文本,默认为false

true 或者 false

出参描述

字段

类型

输出格式

描述

示例值

output.text

String

入参result_format=text时候的返回值

包含本次请求的算法输出内容。

我建议你去颐和园

output.finish_reason

String

有三种情况:正在生成时为null,生成结束时如果由于停止token导致则为stop,生成结束时如果因为生成长度过长导致则为length。

stop

output.choise[list]

List

入参result_format=message时候的返回值

入参result_format=message时候的返回值

"choices": [

{

"finish_reason":"null",

"message": {

"role": "bot",

"content": "周围的咖啡馆在...",

}

]

output.choise[x].finish_reason

String

停止原因,null:生成过程中

stop:stop token导致结束

length:生成长度导致结束

output.choise[x].message

Dict

返回message字段表示单条message。

当模型触发插件调用时,返回messages字段表示多条message,用List方式表示。

output.choise[x].messages

List

message.role

String

入参result_format=message时候的返回值

角色当前可选值:system、user、assistant、plugin。

作为输出时,大模型生成的文本内容为assistant,触发插件调用为plugin。

"messages": [

{

"role": "assistant",

"plugin_call": {

"name": "calculator",

"arguments": "{\"payload__input__text\": \"12345*98765\", \"header__request_id\": \"f275e6\"}"

},

"content": "Thought: 我需要进行乘法运算,需要用到计算器API。"

},

{

"role": "plugin",

"name": "calculator",

"content": "{\"equations\": [\"12345 * 98765\"], \"results\": [1219253925.0]}",

"status": {

"code": 200,

"name": "Success",

"message": "success"

}

},

{

"role": "assistant",

"content": "Thought: 这个问题的答案是1219253925.0。\nFinal Answer: 1219253925.0"

}

]

message.content

String

当message.role为assistant时,为模型生成的文本

当message.role为plugin时,为插件返回的结果

message.plugin_call

Dict

入参result_format=message,并且使用了插件时候的返回值

当message.role为assistant时,模型生成的插件调用信息,包括插件名和参数,仅当模型认为需要调用插件时生成。

message.name

List

当message.role为plugin时,调用的插件名

message.status

String

当message.role为plugin时,调用插件的状态,包括状态码和状态信息

usage.output_tokens

Integer

通用

本次请求算法输出内容的 token 数目。

380

usage.input_tokens

Integer

本次请求输入内容的 token 数目。在打开了搜索的情况下,输入的 token 数目因为还需要添加搜索相关内容支持,所以会超出客户在请求中的输入。

633

request_id

String

本次请求的系统唯一码

7574ee8f-38a3-4b1e-9280-11c33ab46e51

请求示例(SSE关闭)

以下示例展示通过CURL命令来调用通义千问模型的脚本(SSE 关闭)。SSE关闭意味着服务端将一次性返回所有结果。

说明

需要使用您的API-KEY替换示例中的<your-dashscope-api-key> ,代码才能正常运行。

curl -v --location --request POST 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer <your-dashscope-api-key>' \
--header 'Content-Type: application/json' \
--header 'X-DashScope-Plugin: {"calculator":{}}' \
--data-raw '{
    "model": "qwen-plus",
    "input": {
        "messages": [
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "12345*98765是多少"
            }
        ]
    },
    "parameters": {
        "result_format": "message",
        "seed": 42
    }
}'

响应示例(SSE关闭)

{
    "status_code": 200,
    "request_id": "1ba713ab-b05a-914e-b4a6-72258ec1d5d8",
    "code": "",
    "message": "",
    "output": {
        "text": null,
        "finish_reason": null,
        "choices": [
            {
                "finish_reason": "stop",
                "message": null,
                "messages": [
                    {
                        "role": "assistant",
                        "plugin_call": {
                            "name": "calculator",
                            "arguments": "{\"payload__input__text\": \"12345*98765\", \"header__request_id\": \"f275e6\"}"
                        },
                        "content": "Thought: 我需要进行乘法运算,需要用到计算器API。"
                    },
                    {
                        "role": "plugin",
                        "name": "calculator",
                        "content": "{\"equations\": [\"12345 * 98765\"], \"results\": [1219253925.0]}",
                        "status": {
                            "code": 200,
                            "name": "Success",
                            "message": "success"
                        }
                    },
                    {
                        "role": "assistant",
                        "content": "Thought: 这个问题的答案是1219253925.0。\nFinal Answer: 1219253925.0"
                    }
                ]
            }
        ]
    },
    "usage": {
        "input_tokens": 22,
        "output_tokens": 130,
        "total_tokens": 152
    }
}

上述代码会在整体文本生成完成后,一次性返回所有输出结果。

请求示例(SSE开启)

通过代码--header 'X-DashScope-SSE: enable'在HTTP header中设置SSE开启,让大模型一边生成一边输出,即通过流式输出的方式尽快地将中间结果显示在屏幕上。

以下示例展示通过CURL命令来调用通义千问模型的脚本(SSE 开启)。

curl -v --location --request POST 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation' \
--header 'Authorization: Bearer <your-dashscope-api-key>' \
--header 'X-DashScope-SSE: enable' \
--header 'Content-Type: application/json' \
--header 'X-DashScope-Plugin: {"calculator":{}}' \
--data-raw '{
    "model": "qwen-plus",
    "input": {
        "messages": [
            {
                "role": "system",
                "content": "You are a helpful assistant."
            },
            {
                "role": "user",
                "content": "12345*98765是多少"
            }
        ]
    },
    "parameters": {
        "result_format": "message",
        "seed": 42
    }
}'

响应示例(SSE开启)

id:1
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"messages":[{"content":"Thought: ","role":"assistant"}],"finish_reason":"null"}]},"usage":{"total_tokens":25,"input_tokens":22,"output_tokens":3},"request_id":"3a072613-a0e9-9980-a93d-32bb1fbe6f99"}

id:2
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"messages":[{"content":"Thought: 我需要使用计算器API来进行数学运算","role":"assistant"}],"finish_reason":"null"}]},"usage":{"total_tokens":33,"input_tokens":22,"output_tokens":11},"request_id":"3a072613-a0e9-9980-a93d-32bb1fbe6f99"}
... ... ... ...
... ... ... ...


id:15
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"messages":[{"plugin_call":{"name":"calculator","arguments":"{\"payload__input__text\": \"12345*98765\", \"header__request_id\": \"\"}"},"content":"Thought: 我需要使用计算器API来进行数学运算。","role":"assistant"},{"name":"calculator","role":"plugin","content":"{\"equations\": [\"12345 * 98765\"], \"results\": [1219253925.0]}","status":{"name":"Success","message":"success","code":200}},{"content":"Thought: 这个结果是正确的,我可以告诉用户12345乘以98765等于多少了。\nFinal Answer: 1219253925","role":"assistant"}],"finish_reason":"stop"}]},"usage":{"total_tokens":148,"input_tokens":22,"output_tokens":126},"request_id":"3a072613-a0e9-9980-a93d-32bb1fbe6f99"}

状态码说明

DashScope通用状态码请查阅:返回状态码说明