代码拉取完成,页面将自动刷新
## SDK
主要包含拦截器、请求信息封装实体类、会话工厂、配置信息、创建接口。
在SDK中定义了ChatCompletionRequest(请求参数)、ChatCompletionResponse(返回结果)、EventType(消息类型)、Model(会话模型)、Role(角色)。
配置信息中设置url请求地址、密钥,还有okHttp配置信息:连接时间、读写时间。以及常量的定义。
拦截器把调用的api请求拦截,在这个请求中构建Authorization以及一些基本信息,执行,返回执行结果。
```java
@Override
public @NotNull Response intercept(Chain chain) throws IOException {
// 1. 获取原始 Request
Request original = chain.request();
// 2. 构建请求
Request request = original.newBuilder()
.url(original.url())
.header("Authorization", "Bearer " + BearerTokenUtils.getToken(configuration.getApiKey(), configuration.getApiSecret()))
.header("Content-Type", Configuration.JSON_CONTENT_TYPE)
.header("User-Agent", Configuration.DEFAULT_USER_AGENT)
.header("Accept", Configuration.SSE_CONTENT_TYPE)
.method(original.method(), original.body())
.build();
// 3. 返回执行结果
return chain.proceed(request);
}
```
会话工厂中配置日志、开启http客户端、创建API服务。封装工厂,提供接口。
```java
@Override
public OpenAiSession openSession() {
// 1. 日志配置
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(configuration.getLevel());
// 2. 开启 Http 客户端
OkHttpClient okHttpClient = new OkHttpClient
.Builder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(new OpenAiHTTPInterceptor(configuration))
.connectTimeout(configuration.getConnectTimeout(), TimeUnit.SECONDS)
.writeTimeout(configuration.getWriteTimeout(), TimeUnit.SECONDS)
.readTimeout(configuration.getReadTimeout(), TimeUnit.SECONDS)
.build();
configuration.setOkHttpClient(okHttpClient);
// 3. 创建 API 服务
IOpenAiApi openAiApi = new Retrofit.Builder()
.baseUrl(configuration.getApiHost())
.client(okHttpClient)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(JacksonConverterFactory.create())
.build().create(IOpenAiApi.class);
configuration.setOpenAiApi(openAiApi);
return new DefaultOpenAiSession(configuration);
}
```
会话服务中构建请求信息,返回时间结果。封装,提供接口。
```java
public DefaultOpenAiSession(Configuration configuration) {
this.configuration = configuration;
this.openAiApi = configuration.getOpenAiApi();
this.factory = configuration.createRequestFactory();
}
@Override
public EventSource completions(ChatCompletionRequest chatCompletionRequest, EventSourceListener eventSourceListener) throws JsonProcessingException {
// 构建请求信息
Request request = new Request.Builder()
.url(configuration.getApiHost().concat(IOpenAiApi.v3_completions).replace("{model}", chatCompletionRequest.getModel().getCode()))
.post(RequestBody.create(MediaType.parse("application/json"), chatCompletionRequest.toString()))
.build();
// 返回事件结果
return factory.newEventSource(request, eventSourceListener);
}
```
签名工具包,过期时间30分钟,缓存29分钟,登录创建apikey,用户登录时从缓存中查找token,如果有就直接返回,如果没有就创建token,使用HMAC256算法,根据apisecret创建,最后JWT工具类创建token并存入缓存。
## 项目流程
### 用户登录
1. 用户关注公众号获取验证码,这时候要配置微信公众号,提供get、post方法,配置内网穿透,配置基本信息。
2. 后端生成验证码并存入redis缓存中,然后根据openId+验证码绑定进行登录操作,为用户创建一个有效期为30分钟的Token,用户开始对话
### 开始对话
1. 用户登录之后,选择模型开始对话,这时候要判断用户的账户额度,在这里配置了规则工厂,在调用模型应答接口的时候进行权限判断,然后是次数校验。
2. 没额度了就去买额度,用户对额度商品进行下单操作,这里使用的是支付宝SDK,用户进行扫码支付,充值余额。
3. 用户冲完钱了,再次选择模型对话,complaintions接口将再次使用规则工厂进行过滤校验等操作
4. 校验失败:模型开始对话,不过是说你没钱了,或者封装错误信息进行回答。
5. 校验成功:模型开始对话,这里可以优化为多渠道AI,但目前只有GLM(因为api接口最容易访问),并且,现在只有文生文,文生图还未开发。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。