依赖
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.0.0</version> </dependency>
1.获取参数
从百度云获取固定参数
String client_id = "usl..............."; String client_secret = "T5xrE5k...............";
2.完整代码
package com.center.common.utils; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.common.constants.RedisConstant; import com.common.core.HttpRequestServer; import com.common.redis.RedisOperation; import okhttp3.*; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; /** * @description: some desc * @author: ccxt * @paramete: int * @date: 2023/12/9 10:48 */ @Component public class ChatGptWenUtil { static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build(); private static ConcurrentHashMap<Long, String> map = new ConcurrentHashMap<>(); /** * @param uid 用户id * @param redisOperation redis工具类 * 用户 获取自己的token标识,因token数量有限,所以存放token时间较长 */ public static void getToken(Long uid,RedisOperation redisOperation) throws IOException { String client_id = "usl8CQ...................."; String client_secret = "T5xrE......................."; String grant_type = "client_credentials"; MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, ""); Request request = new Request.Builder() .url("https://aip.baidubce.com/oauth/2.0/token?client_id=" + client_id + "&client_secret=" + client_secret + "&grant_type=" + grant_type) .method("POST", body) .addHeader("Content-Type", "application/json") .addHeader("Accept", "application/json") .build(); Response response = HTTP_CLIENT.newCall(request).execute(); if (response.body()==null){ throw new RuntimeException("accessToken 获取失败"); } String string = response.body().string(); JSONObject jsonObject = JSON.parseObject(string); String accessToken = (String) jsonObject.get("access_token"); //将token放入redis中 设置27 天过期时间,原token一个月过期时间,token数量有限 String key = RedisConstant.CACHE_SIGN + RedisConstant.USER_WEN_XIN_YI_YAN_TOKEN; redisOperation.hset(key,uid.toString(),accessToken, 27 * 24 * 3600); } /** * @param uid 用户 id * @param redisOperation redis工具类 *从redis中获取用户的token,放入临时缓存中 */ private static void getTokenByMap(Long uid,RedisOperation redisOperation) { String key = RedisConstant.CACHE_SIGN + RedisConstant.USER_WEN_XIN_YI_YAN_TOKEN; Object o = redisOperation.hget(key,uid.toString()); if (o !=null){ map.put(uid, o.toString()); } } /** * @param msg 对话消息 * @param uid 用户 id * @param redisOperation redis工具类 * @return {@code JSONObject } * redis中有改用户信息,从redis中获取该用户token,放入临时缓存中 */ public static JSONObject ChatGptDialogueCall(HashMap<String, String> msg, Long uid,RedisOperation redisOperation) throws IOException { ArrayList<HashMap> messages = new ArrayList<>(); messages.add(msg); HashMap<String, Object> requestBody = new HashMap<>(); requestBody.put("messages", messages); String outputStr = JSON.toJSONString(requestBody); String token = null; // 从缓存中获取token token = map.get(uid); if (StringUtils.isEmpty(token)) { // 从redis中获取token放入临时缓存中 getTokenByMap(uid,redisOperation); token = map.get(uid); if (StringUtils.isEmpty(token)){ // 调用百度云接口获取token放入redis中 getToken(uid,redisOperation); getTokenByMap(uid,redisOperation); token = map.get(uid); } } JSONObject info = new JSONObject(); String path = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=" + token; JSONObject object = HttpRequestServer.wenChatGpt(path, "POST", outputStr, "application/json"); if (object.containsKey("error_code")) { info.put("error_code", object.getString("error_code")); info.put("error_msg", object.getString("error_msg")); return info; } String result = object.getString("result"); info.put("uid", uid); info.put("result", result); return info; } /** * @param uid 用户 id * 用户 退出时 清除存放token临时缓存的方法 */ public static void deleteMapToken(Long uid){ map.remove(uid); } }
3.调用代码
try { HashMap<String, String> map = new HashMap<>(); // 固定参数 map.put("role", "user"); map.put("content", "对话内容"); jsonObject = ChatGptWenUtil.ChatGptDialogueCall(map, uid, redisOperation); } catch (Exception e) { e.printStackTrace(); }
tokenjsonsopclichatchatgptgptmmoappjavacodesemparsetpubaiduivacreateseoscriptoauth