ChatGPT Plugin开发setup - Java(Spring Boot) Python(fastapi)
记录一下快速模板,整体很简单,如果不接auth,只需要以下:
- 提供一个/.well-known/ai-plugin.json接口,返回openAI所需要的格式
- 提供openAPI规范的文档
- CORS设置
其他的和普通的web开发类似.
本地开发就直接使用localhost即可,前几天官方localhost无法联通,最近应该修复了.
要让GPT更好理解接口内容,接口需要写详细的文档,在文档内写清楚各个参数作用和可选值以及示例.
Spring Boot
增加对文档的依赖
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.1.0</version>
</dependency>
增加一个bean配置:
@Bean
public OpenAPI openAPI() {
    return new OpenAPI()
            .info(new Info().title("html fetcher")
                            .description("get content from url")
                            .version("1.0"));
}
文档的地址为/v3/api-docs
增加ai-plugin.json接口
@GetMapping(value = "/.well-known/ai-plugin.json", produces = "application/json")
public String aiPlugin() {
    return """
            {
                    "schema_version": "v1",
                    "name_for_human": "html fetcher Plugin",
                    "name_for_model": "html_fetcher",
                    "description_for_human": "Plugin for getting content from url",
                    "description_for_model": "Plugin for getting content from url",
                    "auth": {
                        "type": "none"
                    },
                    "api": {
                        "type": "openapi",
                        "url": "http://localhost:8080/v3/api-docs",
                        "is_user_authenticated": false
                    },
                    "logo_url": "http://localhost:8080/logo.png",
                    "contact_email": "support@example.com",
                    "legal_info_url": "http://www.example.com/legal"
                }
    """;
}
logo直接放到\resources\static中
内容根据自己插件修改,本地开发直接写localhost,部署写对应的网站地址.
CORS设置
测试的时候允许可以写*, 后续上线更改为openai.com:
@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}
要写自定义文档可以用spring-doc的相关注解.
比如写在接口上用@Operation, 字段上使用@Schema注解.
@Schema内可以用allowableValues和example等来约束openai的查询.
fastapi
fastapi自带openAPI集成,只需要把json dump成yaml即可, setup比较简单, 这里直接全部放一起了:
app = FastAPI()
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)
# static 文件夹用来做静态资源host 放logo
app.mount("/static", StaticFiles(directory="static"), name="static")
# json -> yaml
@app.get("/openapi.yaml")
async def get_openapi():
    return Response(content=yaml.dump(app.openapi()), media_type="application/yaml")
@app.get("/.well-known/ai-plugin.json")
async def openai_api_plugin():
    return {
        "schema_version": "v1",
        "name_for_human": "",
        "name_for_model": "",
        "description_for_human": "",
        "description_for_model": "",
        "auth": {
            "type": "none"
        },
        "api": {
            "type": "openapi",
            "url": "http://localhost:8000/openapi.yaml",
            "is_user_authenticated": False
        },
        "logo_url": "http://localhost:8000/static/logo.png",
        "contact_email": "support@example.com",
        "legal_info_url": "http://www.example.com/legal"
    }
自定义文档内容对于接口的可以用summary,response_description参数, query参数可以用Annotationd, 一个例子:
@app.get("/api/query_profit_data", summary='query profit data by company code, year and quarter', response_description="""
return profit data in format {"key":{"0":"value"}}, panda's dataframe""")
async def query_profit_data(code: Annotated[str, Query(description="the company code", example="sh.600000")],
                            year: Annotated[int, Query(description="year to get profit", example=2023)],
                            quarter: Annotated[
                                int, Query(description="quarter to get profit. allow values:1,2,3,4", example=1)]):
参考资料
chatgpt plugin: https://openai.com/blog/chatgpt-plugins
spring doc: https://springdoc.org/v2/
fastapi: https://fastapi.tiangolo.com/
ChatGPT Plugin开发setup - Java(Spring Boot) Python(fastapi)的更多相关文章
- Java Spring Boot VS .NetCore (六) UI  thymeleaf vs cshtml
		Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ... 
- Java Spring boot 多商户入驻 外卖|跑腿|代驾 Uniapp版本
		技术说明: 源码下载:https://www.yuanmahy.com/8357.html 开发环境:jdk1.8,mysql5.7,node 9.4,redis6.2,npm6.9 开发工具:前端使 ... 
- Java Spring Boot VS .NetCore (一)来一个简单的 Hello World
		系列文章 Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filte ... 
- Java Spring Boot VS .NetCore (二)实现一个过滤器Filter
		Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ... 
- Java Spring Boot VS .NetCore (三)Ioc容器处理
		Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ... 
- Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore
		Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ... 
- Java Spring Boot VS .NetCore (五)MyBatis vs EFCore
		Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ... 
- Java Spring Boot VS .NetCore (七)  配置文件
		Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ... 
- Java Spring Boot VS .NetCore (八)  Java 注解  vs .NetCore Attribute
		Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ... 
- Java Spring Boot VS .NetCore (九)  Spring  Security vs .NetCore Security
		Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ... 
随机推荐
- 读取远程服务器linux指定目录下文本内容(工具类)
			package com.aa.dataadmin.common.utils; import cn.hutool.extra.ssh.JschUtil; import com.jcraft.jsch.C ... 
- 开源不易、安全慎行,中国软件如何走向文明?丨RTE 技术环境月报 202205
			各位开发者小伙伴: 这里是 2022 年第 5 期的 RTE<技术环境月报>--致力于成为对大家"有用"的 Highlight 看板--每月初通过 RTC 开发者社区( ... 
- 如何基于 React Native 快速实现一个视频通话应用
			今天,我们将会一起开发一个包含 RTE (实时互动)场景的 Flutter 应用. 项目介绍 靠自研开发包含实时互动功能的应用非常繁琐,你要解决维护服务器.负载均衡等难题,同时还要保证稳定的低延迟. ... 
- 记一次 .NET 某企业 ERP网站系统 崩溃分析
			一:背景 1. 讲故事 前段时间收到了一个朋友的求助,说他的ERP网站系统会出现偶发性崩溃,找了好久也没找到是什么原因,让我帮忙看下,其实崩溃好说,用 procdump 自动抓一个就好,拿到 dump ... 
- 简单入门echart方法
			图表用echart, 然后前端的 HTML 跟 nodejs , nodejs 去调用 后端PHP的接口 链接:https://www.jianshu.com/p/1f2c37c5c02f 官网:h ... 
- 企业实践 | 国产操作系统之光? 银河麒麟KylinOS-V10(SP3)高级服务器操作系统基础安装篇
			[点击 关注「 全栈工程师修炼指南」公众号 ] 设为「️ 星标」带你从基础入门 到 全栈实践 再到 放弃学习! 涉及 网络安全运维.应用开发.物联网IOT.学习路径 .个人感悟 等知识分享. 希望各位 ... 
- 快速部署Ceph分布式高可用集群
			快速部署Ceph分布式高可用集群 Ceph简介 Ceph是一个PB,EB级别的分布式存储系统,可以提供文件存储,对象存储.和块存储,它可靠性高,易扩展,管理简便,其中对象存储和块存储可以和其他云平台集 ... 
- day05  运算符和流程控制
			Day05 逻辑运算符 成员运算符 身份运算符 流程控制(重点) if判断 while循环 标志位的使用 逻辑运算符 and 与 #可以用and链接多个条件,会按照从左到右的顺序依次判断,有一个为F ... 
- day118:MoFang:根据激活/未激活的状态分别显示树桩&种植植物&解锁树桩&化肥/修剪/浇水/宠物粮小图标数字的显示
			登录 1.根据激活状态和未激活状态分别显示树桩 2.用户使用植物道具进行果树种植 3.解锁树桩 4.化肥/修剪/浇水/宠物粮小图标显示 种植栏的功能实现 1. 客户端需要的植物相关参数: 总树桩数量, ... 
- CentOS7---部署Tomcat和安装Jpress
			总览需求 1. 简述静态网页和动态网页的区别. 2. 简述 Webl.0 和 Web2.0 的区别. 3. 安装tomcat8,配置服务启动脚本,部署jpress应用. 1.简述静态网页和动态网页的区 ... 
