图像理解
本文介绍了自定义导入模型发布为服务后,调用图像理解相关API说明。
注意事项
(1)调用本文API前,需先导入并部署第三方模型,请查看快速导入并部署第三方模型。
(2)支持导入以下模型:
· InternLM-XComposer2
· LLaVA-v1.5-paddle(只支持paddle框架推理)
· Qwen-VL-Chat
· glm-4v-9b
· OpenGVLab/InternVL2-26B
· OpenGVLab/InternVL2-8B
· OpenGVLab/InternVL2-2B
· Qwen2-VL-7B-Instruct
· Qwen2-VL-72B-Instruct
接口描述
调用本接口,用于根据用户输入的图像和文字,回答图像有关问题。
鉴权说明
本文API,支持2种鉴权方式。不同鉴权方式,调用方式不同,请求头域、请求参数的Query参数不同,详见本文请求说明。开发者可以选择以下任一种方式进行鉴权。
- 访问凭证access_token鉴权
 - 基于安全认证AK/SK进行签名计算鉴权
 
请求结构
以访问凭证access_token鉴权方式为例,说明调用API请求结构,示例如下。
1POST /rpc/2.0/ai_custom/v1/wenxinworkshop/chatv/[创建服务时填写的API名称]?access_token=24.4a3a19b******18992 HTTP/1.1
2Host: aip.baidubce.com
3Content-Type: application/json
4
5{
6  "messages": [
7      {
8        "role": "user",
9        "content": [
10          {
11            "type": "text",
12            "text": "What'\''s in this image?"
13          },
14          {
15            "type": "image_url",
16            "image_url": {
17              "url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
18            }
19          }
20        ]
21      }
22    ]
23}
            API地址说明
创建服务时填写的API地址,相关内容请查看模型服务-在线服务-服务配置。
请求头域
除公共头域外,无其它特殊头域。注意:鉴权方式不同,对应请求头域不同。
请求参数
- Query参数
 
只有访问凭证access_token鉴权方式,需使用Query参数。
访问凭证access_token鉴权
| 名称 | 类型 | 必填 | 描述 | 
|---|---|---|---|
| access_token | string | 是 | 通过应用API Key和应用Secret Key获取的access_token,参考Access Token获取 | 
- Body参数
 
| 名称 | 类型 | 必填 | 描述 | 
|---|---|---|---|
| messages | List(MultimodalMessage) | 是 | 聊天上下文信息,说明: (1)messages成员不能为空,1个成员表示单轮对话 (2)最后一个message为当前请求的信息,前面的message为历史对话信息 (3)当前只支持单轮对话且message中必须包含type=text  | 
| stream | bool | 否 | 是否以流式接口的形式返回数据;默认false | 
| temperature | float | 否 | 较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定,大于0 | 
| top_p | float | 否 | 影响输出文本的多样性,取值越大,生成文本的多样性越强。默认0.8,取值范围 [0, 1.0] | 
| user_id | string | 否 | 表示最终用户的唯一标识符 | 
MultimodalMessage
| 名称 | 类型 | 必填 | 描述 | 
|---|---|---|---|
| role | string | 是 | 当前支持以下: user:表示用户 assistant:表示对话助手  | 
| content | List(Content) | 是 | 对话内容 | 
Content说明
| 名称 | 类型 | 必填 | 描述 | 
|---|---|---|---|
| type | string | 是 | 当前支持以下: text:表示文本 image_url:表示图片存储URL  | 
| text | string | 否 | 文本内容,说明: (1)一个content中text与image_url有且只有一个 (2)InternLM-XComposer2模型服务,文本内容必须有image_url数量的<ImageHere>关键字  | 
| image_url | ImageURL | 否 | 图片存储URL,说明: (1)一个content中text与image_url有且只有一个 (2)只有第一轮对话可以包含image_url  | 
ImageURL说明
| 名称 | 类型 | 必填 | 描述 | 
|---|---|---|---|
| url | string | 是 | base64图片,支持格式:jpg、png、bmp | 
响应头域
除公共头域外,无其它特殊头域。
响应参数
| 名称 | 类型 | 描述 | 
|---|---|---|
| id | string | 本次请求的唯一标识,可用于排查问题 | 
| object | string | 回包类型“chat.completion”:多轮对话返回 | 
| model | string | 本次请求调用的model | 
| created | int | 时间戳 | 
| choices | choices | 返回结果。只有当stream=false,即为非流式模式调用时返回此字段 | 
| choices | sse_choices | 返回结果。只有当stream=true,即为流式接口模式时返回此字段 | 
| usage | usage | token统计信息 | 
choices说明
| 名称 | 类型 | 描述 | 
|---|---|---|
| index | int | choice列表中的序号 | 
| message | message | 响应信息 | 
| need_clear_history | bool | 表示用户输入是否存在安全风险,是否关闭当前会话,清理历史会话信息, true:表示用户输入存在安全风险,建议关闭当前会话,清理历史会话信息; false:否,表示用户输入无安全风险  | 
| ban_round | int | 当need_clear_history为true时,次字段会告知第几轮对话有敏感信息,如果是当前问题,ban_round = -1 | 
| finish_reason | string | 输出内容标识,说明: · normal:输出内容完全由大模型生成,未触发截断、替换  | 
| flag | int | 返回flag表示触发安全 | 
sse_choices说明
| 名称 | 类型 | 描述 | 
|---|---|---|
| index | int | choice列表中的序号 | 
| delta | delta | 响应信息 | 
| is_end | bool | 流式接口模式下会返回,表示当前子句是否是最后一句 | 
| need_clear_history | bool | 值为true表示用户输入存在安全风险,建议关闭当前会话,清理历史会话信息,当前模型不过安全,实际返回永远是false | 
| ban_round | int | 当need_clear_history为true时,次字段会告知第几轮对话有敏感信息,如果是当前问题,ban_round = -1 | 
| finish_reason | string | 输出内容标识,取值访问及定义如下:"normal":输出内容完全由大模型生成,未触发截断、替换; | 
| flag | int | 返回flag表示触发安全 | 
delta说明
| 名称 | 类型 | 描述 | 
|---|---|---|
| content | string | 流式响应内容 | 
usage说明
| 名称 | 类型 | 描述 | 
|---|---|---|
| prompt_tokens | int | 问题tokens数 | 
| completion_tokens | int | 回答tokens数 | 
| total_tokens | int | tokens总数 | 
注意 :同步模式和流式模式,响应参数返回不同,详细内容参考示例描述。
- 同步模式下,响应参数为以上字段的完整json包。
 - 流式模式下,各字段的响应参数为 data: {响应参数}。
 
请求示例(非流式)
以访问凭证access_token鉴权方式为例,说明如何调用API,示例如下。
1# 步骤一,获取access_token,替换下列示例中的应用API Key与应用Secret Key
2curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[应用API Key]&client_secret=[应用Secret Key]'
3
4# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的”调用接口获取的access_token“;
5curl -X POST  'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chatv/[创建服务时填写的API名称]?access_token=[步骤一调用接口获取的access_token]' -d '{
6   "messages": [
7      {
8        "role": "user",
9        "content": [
10          {
11            "type": "text",
12            "text": "What'\''s in this image?"
13          },
14          {
15            "type": "image_url",
16            "image_url": {
17              "url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
18            }
19          }
20        ]
21      }
22    ]
23}'
        1import requests
2import json
3
4def get_access_token():
5    """
6    使用应用API Key,应用Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
7    """
8        
9    url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[应用API Key]&client_secret=[应用Secret Key]"
10    
11    payload = json.dumps("")
12    headers = {
13        'Content-Type': 'application/json',
14        'Accept': 'application/json'
15    }
16    
17    response = requests.request("POST", url, headers=headers, data=payload)
18    return response.json().get("access_token")
19
20
21def main():
22   
23    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chatv/[创建服务时填写的API名称]?access_token=" + get_access_token()
24    
25    payload = json.dumps({
26        "messages": [
27          {
28            "role": "user",
29            "content": [
30              {
31                "type": "text",
32                "text": "What'\''s in this image?"
33              },
34              {
35                "type": "image_url",
36                "image_url": {
37                  "url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
38                }
39              }
40            ]
41         }
42       ]
43    })
44    headers = {
45        'Content-Type': 'application/json'
46    }
47    
48    response = requests.request("POST", url, headers=headers, data=payload)
49    
50    print(response.text)
51    
52
53if __name__ == '__main__':
54    main()
        响应示例(非流式)
1{
2  "id": "as-34qizrn6c2",
3  "object": "chat.completion",
4  "created": 1677652288,
5  "model": "j23r****vl_chat",
6  "choices": [{
7    "index": 0,
8    "message": {
9      "role": "assistant",
10      "content": "\n\nThis image shows a wooden boardwalk extending through a lush green marshland.",
11    },
12    "finish_reason": "normal"
13  }],
14  "usage": {
15    "prompt_tokens": 9,
16    "completion_tokens": 12,
17    "total_tokens": 21
18  }
19}
            请求示例(流式)
1# 步骤一,获取access_token,替换下列示例中的应用API Key与应用Secret Key
2curl 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[API Key]&client_secret=[Secret Key]'
3
4# 步骤二,调用本文API,使用步骤一获取的access_token,替换下列示例中的”调用接口获取的access_token“
5curl -X POST 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chatv/[创建服务时填写的API名称]?access_token=[步骤一调用接口获取的access_token]' -d '{
6  "messages": [
7          {
8            "role": "user",
9            "content": [
10              {
11                "type": "text",
12                "text": "What'\''s in this image?"
13              },
14              {
15                "type": "image_url",
16                "image_url": {
17                  "url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
18                }
19              }
20            ]
21         }
22       ],
23  "stream": true
24}'
        1import requests
2import json
3
4def get_access_token():
5    """
6    使用应用API Key,应用Secret Key 获取access_token,替换下列示例中的应用API Key、应用Secret Key
7    """
8        
9    url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=[应用API Key]&client_secret=[应用Secret Key]"
10    
11    payload = json.dumps("")
12    headers = {
13        'Content-Type': 'application/json',
14        'Accept': 'application/json'
15    }
16    
17    response = requests.request("POST", url, headers=headers, data=payload)
18    return response.json().get("access_token")
19
20
21def main():
22   
23    url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chatv/[创建服务时填写的API名称]?access_token=" + get_access_token()
24    
25    payload = json.dumps({
26        "messages": [
27          {
28            "role": "user",
29            "content": [
30              {
31                "type": "text",
32                "text": "What'\''s in this image?"
33              },
34              {
35                "type": "image_url",
36                "image_url": {
37                  "url": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX0YyCwrWoajFF******Frq7/3gDaWpvmgVxtNXiwQf/9k="
38                }
39              }
40            ]
41         }
42       ],
43         "stream": True
44    })
45    headers = {
46        'Content-Type': 'application/json'
47    }
48    
49    response = requests.request("POST", url, headers=headers, data=payload, stream=True)
50    
51    for line in response.iter_lines():
52        print(line.decode("UTF-8"))
53    
54
55if __name__ == '__main__':
56    main()
        响应示例(流式)
1{"id":"as-34qizrn6c2","object":"chat.completion.chunk","created":1694268190,"model":"j23r1p7w_test_qwen_vl_chat", "choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
2
3{"id":"as-34qizrn6c2","object":"chat.completion.chunk","created":1694268190,"model":"j23r1p7w_test_qwen_vl_chat", "choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}
4
5....
6
7{"id":"as-34qizrn6c2","object":"chat.completion.chunk","created":1694268190,"model":"j23r1p7w_test_qwen_vl_chat", "choices":[{"index":0,"delta":{},"finish_reason":"normal"}]}
            错误码
如果请求错误,服务器返回的JSON文本包含以下参数。
| 名称 | 描述 | 
|---|---|
| error_code | 错误码 | 
| error_msg | 错误描述信息,帮助理解和解决发生的错误 | 
例如Access Token失效返回以下内容,需要重新获取新的Access Token再次请求。
1{
2  "error_code": 110,
3  "error_msg": "Access token invalid or no longer valid"
4}
            更多相关错误码,请查看错误码说明。
