大家都知道文心一言很厉害,那怎么对接,开发插件,更好的来使用呢?下面给大家打个样!
1.插件介绍
插件将“文心一言”AI能力与外部应用相结合,既能丰富大模型的能力和应用场景,也能利用大模型的生成能力完成此前无法实现的任务。
主要分3类,具体如下:
- 信息增强
- 交互增强
- 服务增强
2.插件开发权限申请
申请地址:yiyan.baidu.com/developer
直接申请即可
3.快速开始
- 构思插件 manifest 描述文件(ai-plugin.json,必选)
- 定义插件服务描述文件(openapi.yaml,必选)
- 启动插件服务并且对齐描述文件(openapi服务,必选)
- 上传配置文件并调试(接入流程,必选)
此外需要提供服务的独立IP服务器一台。
4.具体实现
目录结构如下
│ demo_server.py
│ logo.png
│ readme.md
│ requirements.txt
│ test.py
└─.well-known
ai-plugin.json
openapi.yaml
可以直接从demo上更改(本地调试为例,提供一套示例demo文件 [百度网盘下载链接],提取码: vdp1):
yiyan_plugin_demo/ # 插件demo注册的根目录
|—.well-known
|— ai-plugin.json #插件主描述文件
|— openapi.yaml #插件API服务的标准描述文件
|— logo.png #插件的图标文件
|— demo_server.py #插件注册服务,可以启动到本地
|— requirements.txt #启动插件注册服务所依赖的库,要求python >= 3.7
|— readme.md # 说明文件
4.1 获取股票信息
主要是实现:
- 股票信息获取
- 传回到一言
- 此外需要申请免费的股票信息获取key
demo_server.py 启动插件
#!/usr/env python3
# -*- coding: UTF-8 -*-
import requests
from flask import Flask, request, send_file, make_response
from flask_cors import CORS
import json
app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "https://yiyan.baidu.com"}})
API_KEY = "自己申请***********"
BASE_URL = "https://www.alphavantage.co/query"
def make_json_response(data, status_code=200):
response = make_response(json.dumps(data), status_code)
response.headers["Content-Type"] = "application/json"
return response
@app.route('/stock', methods=['GET'])
def get_stock_data():
symbol = request.args.get('symbol')
params = {"function": "GLOBAL_QUOTE", "symbol": symbol, "apikey": API_KEY}
response = requests.get(BASE_URL, params=params)
print(response.json())
return response.json()
@app.route("https://b2.7b2.com/logo.png")
async def plugin_logo():
"""
注册用的:返回插件的logo,要求48 x 48大小的png文件.
注意:API路由是固定的,事先约定的。
"""
return send_file('logo.png', mimetype='image/png')
@app.route("https://b2.7b2.com/.well-known/ai-plugin.json")
async def plugin_manifest():
"""
注册用的:返回插件的描述文件,描述了插件是什么等信息。
注意:API路由是固定的,事先约定的。
"""
host = request.host_url
with open(".well-known/ai-plugin.json", encoding="utf-8") as f:
text = f.read().replace("PLUGIN_HOST", host)
return text, 200, {"Content-Type": "application/json"}
@app.route("https://b2.7b2.com/.well-known/openapi.yaml")
async def openapi_spec():
"""
注册用的:返回插件所依赖的插件服务的API接口描述,参照openapi规范编写。
注意:API路由是固定的,事先约定的。
"""
with open(".well-known/openapi.yaml", encoding="utf-8") as f:
text = f.read()
return text, 200, {"Content-Type": "text/yaml"}
@app.route("/")
def index():
return "Hello world! Your web application is working!"
if __name__ == '__main__':
app.run(debug=True, host='127.0.0.1', port=8081)
4.2 ai-plugin.json接口配置
- 构思插件 manifest 描述文件(ai-plugin.json,必选)
一个插件需要一份ai-plugin.json命名的manifest文件,这个文件需要描述插件的基本信息。
种类 | 类型 | 描述/选项 | 是否必填 |
---|---|---|---|
schema_version | String | 插件的版本号,用于开发者标记和使用 | ✅ |
name_for_model | String | 模型将用于定位插件的名称(不允许使用空格,只能使用字母和数字)此字段将作为插件的唯一标识。描述请带有一定的语义,不要超过20个字符。 | ✅ |
name_for_human | String | 此字段将面向用户查看,是插件对外公开的名字。不超过20个字符。建议编写时按照如下要点顺序: “插件能力->适用场景->使用条件” | ✅ |
description_for_model | String | 面向模型的自然语言描述,请描述插件的核心能力、使用场景等,将用于模型参考解析是否触发插件,建议不超过200个字符。 | ✅ |
description_for_human | String | 面向用户介绍插件,建议介绍插件的主要能力,相关限制等。不超过100个字符,前端可完整显示前40 个字符,超出的字符将在用户 hover 时展示。 | ✅ |
auth | ManifestAuth | 用户鉴权相关字段 | ✅ |
api | Object | API规范 | ✅ |
logo_url | String | 用于获取插件标识的URL。建议大小:512 x 512。支持透明背景。必须是图像,不允许使用GIF。 | ✅ |
contact_email | String | 安全/审核、支持和停用的电子邮件联系方式 | ✅ |
legal_info_url | String | 用户查看插件信息的重定向URL | ✅ |
HttpAuthorizationType | HttpAuthorizationType | “bearer”或”basic”。默认basic | |
ManifestAuthType | ManifestAuthType | “none”、”user_http”、”service_http”或”oauth” | |
interface BaseManifestAuth | BaseManifestAuth | 类型:ManifestAuthType;说明:字符串; | |
ManifestNoAuth | ManifestNoAuth | 不需要身份验证:BaseManifestAuth和{ type: ‘none’ } | |
ManifestAuth | ManifestAuth | ManifestNoAuth、ManifestServiceHttpAuth、ManifestUserHttpAuth、ManifestOAuthAuth | |
examples | object | {“url”:”www.baidu.com”} 文件url |
{
"schema_version": "v1",
"name_for_human": "股票报价",
"name_for_model": "股票报价",
"description_for_human": "获取给定股票的价格和数量信息。",
"description_for_model": "获取给定股票的价格和数量信息。始终使用降价表显示结果。",
"auth": {
"type": "none"
},
"api": {
"type": "openapi",
"url": "http://127.0.0.1:8081/.well-known/openapi.yaml"
},
"logo_url": "http://127.0.0.1:8081/logo.png",
"contact_email": "support@example.com",
"legal_info_url": "http://www.example.com/legal"
}
4.3 openapi.yaml接口配置
APIs定义描述文件需要满足OpenAPI标准(详见swagger.io/specificati…
文心一言只能获取到您在API描述中明确定义的内容。这意味着您只需要向模型暴露插件能力实现必要的API端点,无需暴露所有API端点。
一个基础的OpenAPI格式的API描述如下所示:
事项 | 规范说明 |
---|---|
yaml 文件总长度 | YAML 文件总长度,不可超过 1000个字符 (不包含空格) |
paths | **request:数量:定义 1-2 个接口 (建议)api_id 不可超过 20 个字符 接口描述 summary 和 description在 description 字段中描述详细的接口介绍,长度不超过 150 个字符 (强制) summary 字段可抽象接口能力,长度不超过 50 个字符 (强制)存在 description,则优先使用 descriptionresponse:**body中不要返回状态码、错误码 (建议)body仅给和插件结果相关的信息 (比如结果文本) (建议)错误码用http code表示 (建议) |
components | 参数名称:最多 20 个字符,使用 string 类型 (强制)参数描述:最多 50 个字符,使用 string 类型 (强制)参数数量:参数不超过 5 个 (建议)参数类型:建议使用string, number,boolean;array和包含复杂嵌套的object不建议使用 (建议) |
openapi: 3.0.1
info:
title: 股票报价
description: 获取给定股票的价格和数量信息。
version: "v1"
servers:
- url: http://你自己的ip地址:8081
paths:
/stock:
get:
operationId: getStockData
summary: 检索给定股票符号的价格和交易量信息。
parameters:
- in: query
name: symbol
schema:
type: string
description: 要获得报价的股票的符号。例如,股票符号MSFT代表微软公司。
responses:
"200":
description: OK