程序員必備網站:
天夢星服務平臺 (tmxkj.top)
https://tmxkj.top/#/
1.pom.xml
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.72</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId></dependency><dependency><groupId>org.jetbrains</groupId><artifactId>annotations</artifactId><version>13.0</version><scope>compile</scope></dependency>
spark:ai:hostUrl: https://spark-api.xf-yun.com/v3.5/chatappId: ####apiSecret: #####apiKey: ######
2.實體類
import cn.hutool.json.JSONObject;
import lombok.Data;@Data
public class SparkDto {private JSONObject payload;private JSONObject parameter;private JSONObject header;
}
@Data
public class SparkParamDto {private String content;
}
?
3.Tool工具類
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.example.springbootServiceNetwork.demos.web.Config.JwtInfo;
import com.example.springbootServiceNetwork.demos.web.Dto.SparkDto;
import com.example.springbootServiceNetwork.demos.web.Dto.SparkParamDto;
import okhttp3.HttpUrl;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;/*** 訊飛星火工具類*/
public class SparkUtil {/*** 構建 鑒權方法* @param hostUrl* @param apiKey* @param apiSecret* @return* @throws Exception*/public static String getAuthUrl(String hostUrl, String apiKey, String apiSecret) throws Exception {URL url = new URL(hostUrl);// 時間SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);format.setTimeZone(TimeZone.getTimeZone("GMT"));String date = format.format(new Date());// 拼接String preStr = "host: " + url.getHost() + "\n" +"date: " + date + "\n" +"GET " + url.getPath() + " HTTP/1.1";// System.err.println(preStr);// SHA256加密Mac mac = Mac.getInstance("hmacsha256");SecretKeySpec spec = new SecretKeySpec(apiSecret.getBytes(StandardCharsets.UTF_8), "hmacsha256");mac.init(spec);byte[] hexDigits = mac.doFinal(preStr.getBytes(StandardCharsets.UTF_8));// Base64加密String sha = Base64.getEncoder().encodeToString(hexDigits);// System.err.println(sha);// 拼接String authorization = String.format("api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"", apiKey, "hmac-sha256", "host date request-line", sha);// 拼接地址HttpUrl httpUrl = Objects.requireNonNull(HttpUrl.parse("https://" + url.getHost() + url.getPath())).newBuilder().//addQueryParameter("authorization", Base64.getEncoder().encodeToString(authorization.getBytes(StandardCharsets.UTF_8))).//addQueryParameter("date", date).//addQueryParameter("host", url.getHost()).//build();// System.err.println(httpUrl.toString());return httpUrl.toString();};/*** 構建請求參數* @param jwtInfo* @param appId* @param sparkParam* @return* @throws Exception*/public static String getSparkJson(JwtInfo jwtInfo, String appId, SparkParamDto sparkParam) throws Exception {SparkDto sprarkDto = new SparkDto();//----------------payload-----------------JSONObject payload=new JSONObject();JSONObject message=new JSONObject();JSONArray text=new JSONArray();JSONObject textObj=new JSONObject();textObj.put("role","user");textObj.put("content",sparkParam.getContent());text.add(textObj);message.put("text",text);payload.put("message",message);sprarkDto.setPayload(payload);//----------------parameter-----------------JSONObject parameter=new JSONObject(); // parameter參數JSONObject chat=new JSONObject();chat.put("domain","generalv2");chat.put("temperature",0.5);chat.put("max_tokens",2000);parameter.put("chat",chat);sprarkDto.setParameter(parameter);//----------------header-----------------JSONObject header = new JSONObject();header.put("app_id", appId);header.put("uid", jwtInfo.getUserId());sprarkDto.setHeader(header);return JSON.toJSONString(sprarkDto);}}
4.業務層
? ? ?圖片解析
import com.example.springbootServiceNetwork.demos.web.Config.JwtInfo;
import com.example.springbootServiceNetwork.demos.web.Config.Result;
import com.example.springbootServiceNetwork.demos.web.Dto.SparkParamDto;public interface SparkService {Result SparkChat(SparkParamDto sparkParam, JwtInfo jwtInfo);
}
@Service
public class SparkServiceImpl implements SparkService {@Value("${spark.ai.hostUrl}")private String hostUrl;@Value("${spark.ai.appId}")private String appId;@Value("${spark.ai.apiSecret}")private String apiSecret;@Value("${spark.ai.apiKey}")private String apiKey;@Overridepublic Result SparkChat(SparkParamDto sparkParamDto, JwtInfo jwtInfo) {Result result = new Result();try {// 構建鑒權urlString authUrl = getAuthUrl(hostUrl, apiKey, apiSecret);OkHttpClient client = new OkHttpClient.Builder().build();String url = authUrl.toString().replace("http://", "ws://").replace("https://", "wss://");Request request = new Request.Builder().url(url).build();String body = getSparkJson(jwtInfo,appId,sparkParamDto);StringBuilder builderSb =new StringBuilder();CompletableFuture<String> messageReceived = new CompletableFuture<>();WebSocket webSocket = client.newWebSocket(request, new WebSocketListener(){@Overridepublic void onOpen(WebSocket webSocket, Response response) {webSocket.send(body);}@Overridepublic void onMessage(WebSocket webSocket, String res) {JSONObject obj = JSON.parseObject(res);String str= obj.getJSONObject("payload").getJSONObject("choices").getJSONArray("text").getJSONObject(0).getString("content");builderSb.append(str);if(obj.getJSONObject("header").getLong("status")==2){webSocket.close(1000, "Closing WebSocket connection");messageReceived.complete(res); // 將收到的消息傳遞給 CompletableFuture}}});String resItem = messageReceived.get(30, TimeUnit.SECONDS);; // 阻塞等待消息返回webSocket.close(1000, "Closing WebSocket connection");result.setData(builderSb.toString());result.setCode(200);result.setMsg("天夢星");}catch (Exception e){e.printStackTrace();}return result;}}
5.控制層
import com.example.springbootServiceNetwork.demos.web.Config.JwtInfo;
import com.example.springbootServiceNetwork.demos.web.Config.Result;
import com.example.springbootServiceNetwork.demos.web.Dto.SparkParamDto;
import com.example.springbootServiceNetwork.demos.web.Service.JwtRedistService;
import com.example.springbootServiceNetwork.demos.web.Service.SparkService;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;@RestController
@RequestMapping("/Spark")
public class SparkController {@Resourceprivate SparkService sparkService;@Resourceprivate JwtRedistService jwtRedistService;@PostMapping("/chat")public Result SparkChatApi(@RequestBody SparkParamDto sparkParam, @RequestHeader("token") String token){JwtInfo jwtInfo = jwtRedistService.getUserInfo(token);if(jwtInfo.getPass()){return sparkService.SparkChat(sparkParam,jwtInfo);}else {return jwtInfo.getResult();}}
}
6.測試
http://localhost:8082/Spark/chat{"content":"幫我寫一份本地js模糊查詢"
}{"code": 200,"msg": "天夢星","data": "以下是一個簡單的本地 JavaScript 模糊查詢的示例代碼:\n\n```javascript\n// 假設有一個數據列表,包含商品的名稱和價格\nconst products = [\n { name: \"蘋果\", price: 1.99 },\n { name: \"香蕉\", price: 0.99 },\n { name: \"橙子\", price: 2.49 },\n { name: \"草莓\", price: 3.99 },\n];\n\n// 實現模糊查詢函數\nfunction searchProducts(keyword) {\n // 將關鍵字轉換為小寫,以忽略大小寫的差異\n const lowerCaseKeyword = keyword.toLowerCase();\n\n // 使用數組的 filter 方法進行模糊查詢\n const results = products.filter((product) => {\n // 將商品名稱轉換為小寫,并使用 includes 方法檢查是否包含關鍵字\n return product.name.toLowerCase().includes(lowerCaseKeyword);\n });\n\n return results;\n}\n\n// 測試模糊查詢函數\nconst keyword = \"果\"; // 輸入要查詢的關鍵字\nconst searchResults = searchProducts(keyword);\nconsole.log(searchResults);\n```\n\n上述代碼中,我們首先定義了一個包含商品名稱和價格的數據列表 `products`。然后實現了一個 `searchProducts` 函數,該函數接受一個關鍵字作為參數,并返回包含該關鍵字的商品列表。在函數內部,我們將關鍵字轉換為小寫,并使用數組的 `filter` 方法對商品列表進行模糊查詢。最后,我們通過調用 `searchProducts` 函數并打印結果來進行測試。"
}
?備注:這步驟是我的業務流程,你可以省略不寫
JwtInfo jwtInfo = jwtRedistService.getUserInfo(token);
返回數據格式,已有忽略
@Data
public class Result {private Integer code;//狀態碼private Object msg;//狀態信息或者報錯信息private Object data;//返回數據private Integer count;//總條數
}
已經三天沒吃飯了,大佬行行好
?