logo
5

开发文心一言的天气插件

在前文构建插件应用的过程中,发现有查询天气的插件。带有对插件开发的好奇,于是打算跟着开发文档开发一个天气查询的插件,一开始跟着千帆平台的文档开发,发现目前暂未支持本地的调试开发,于是去开发一个文心一言的天气插件。
如果说文心一言是一个智能中枢大脑,插件就是文心一言的耳,目,手。
官方给出了插件生态的三个建设方向:
  • 信息增强:更具时效和专业性的信息
  • 服务增强:自动化执行一些常见任务
  • 能力增强:多模态的输入和输出
我们开发的天气插件就属于第一类的信息增强

开发准备

权限申请

在开始插件开发之前,我们需要开通插件开发的权限,直接去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.1
info:
title: 天气助手
description: 准确实时的城市天气查询
version: "v1"
servers:
- url: http://127.0.0.1:8081
paths:
/get_weather:
post:
operationId: get_cityweather
summary: 查询城市天气
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/requestBody"
responses:
"200":
description: 天气查询完成
content:
application/json:
schema:
$ref: "#/components/schemas/messageResponse"
components:
schemas:
requestBody:
type: object
required: [city]
properties:
city:
type: string
description: 给定城市
messageResponse:
type: object
required: [weather]
properties:
weather:
type: string
description: 城市天气信息

demo_service.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
import random
app = 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=" + city
weather = 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_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("/.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)

进行插件的本地调试

  1. 需要先启动 api 服务,执行 python demo_server.py,然后复制 http://127.0.0.1:8081
  1. 打开文心一言官网,点击 选择插件 ,开发插件 ,
  1. 把复制的本地连接粘贴进来,提交,提示成功就已完成
  1. 打开本地调试,并勾选天气助手即可实现
这里我们需要修改 ai-plugin.json中的name_for_human,因为这是全局唯一的,不能重复
  1. 结果展示
当然这只是一个简略的实现,还需要许多改进。
完成比完美更重要~
评论
用户头像