开发文心一言的天气插件
大模型开发/技术交流
- 社区上线
- 开箱评测
- 插件应用
2023.09.261073看过
在前文构建插件应用的过程中,发现有查询天气的插件。带有对插件开发的好奇,于是打算跟着开发文档开发一个天气查询的插件,一开始跟着千帆平台的文档开发,发现目前暂未支持本地的调试开发,于是去开发一个文心一言的天气插件。
如果说文心一言是一个智能中枢大脑,插件就是文心一言的耳,目,手。
官方给出了插件生态的三个建设方向:
-
信息增强:更具时效和专业性的信息
-
服务增强:自动化执行一些常见任务
-
能力增强:多模态的输入和输出
我们开发的天气插件就属于第一类的信息增强。
开发准备
权限申请
在开始插件开发之前,我们需要开通插件开发的权限,直接去https://yiyan.baidu.com/developer申请即可。
必备的步骤
创建一个插件必备的步骤
-
构思插件 manifest 描述文件(ai-plugin.json,必选)
-
定义插件服务描述文件(openapi.yaml,必选)
-
编写示例描述文件(example.yaml,可选)
-
启动插件服务(openapi服务, 必选)
简单来说我们必要的文件有三个
-
ai-plugin.json
-
openapi.yaml
-
demo_server.py
引用一下官方文档https://yiyan.baidu.com/developer/doc#5llaiqbti ,因为里面对于这些文件的描述都足够详细,也有一个简单的小 demo。这里就不详细介绍每个参数的含义
这里查询天气使用的是有免费额度的api,所以没有申请
apikey
开发过程
下载官方的 demo.zip 文件,在此基础上进行修改
api-plugin.yaml
{"schema_version": "v1","name_for_human": "天气助手","name_for_model": "weather0926","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"}
openapi.yaml
openapi: 3.0.1info:title: 天气助手description: 准确实时的城市天气查询version: "v1"servers:- url: http://127.0.0.1:8081paths:/get_weather:post:operationId: get_cityweathersummary: 查询城市天气requestBody:required: truecontent:application/json:schema:$ref: "#/components/schemas/requestBody"responses:"200":description: 天气查询完成content:application/json:schema:$ref: "#/components/schemas/messageResponse"components:schemas:requestBody:type: objectrequired: [city]properties:city:type: stringdescription: 给定城市messageResponse:type: objectrequired: [weather]properties:weather:type: stringdescription: 城市天气信息
demo_service.py
#!/usr/env python3# -*- coding: UTF-8 -*-import requestsfrom flask import Flask, request, send_file, make_responsefrom flask_cors import CORSimport jsonimport randomapp = Flask(__name__)CORS(app, resources={r"/*": {"origins": "https://yiyan.baidu.com"}})wordbook = []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("/get_weather", methods=['POST'])async def get_weather():"""获取天气"""city = request.json.get('city')x = "http://api.wer.plus/api/tian?city=" + cityweather = requests.get(url=x).json()return make_json_response({"weather": weather})@app.route("/logo.png")async def plugin_logo():"""注册用的:返回插件的logo,要求48 x 48大小的png文件.注意:API路由是固定的,事先约定的。"""return send_file('logo.png', mimetype='image/png')@app.route("/.well-known/ai-plugin.json")async def plugin_manifest():"""注册用的:返回插件的描述文件,描述了插件是什么等信息。注意:API路由是固定的,事先约定的。"""host = request.host_urlwith 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("/.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 'welcome to my webpage!'if __name__ == '__main__':app.run(debug=True, host='127.0.0.1', port=8081)
进行插件的本地调试
-
需要先启动 api 服务,执行 python demo_server.py,然后复制
http://127.0.0.1:8081
-
打开文心一言官网,点击 选择插件 ,开发插件 ,
-
把复制的本地连接粘贴进来,提交,提示成功就已完成
-
打开本地调试,并勾选天气助手即可实现
这里我们需要修改
ai-plugin.json
中的name_for_human
,因为这是全局唯一的,不能重复
-
结果展示
当然这只是一个简略的实现,还需要许多改进。
完成比完美更重要~
评论