From 95463a427e4a25661471869384919739091d71af Mon Sep 17 00:00:00 2001 From: wangxiangshun Date: Sat, 1 Nov 2025 14:58:36 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E4=B8=B4=E6=97=B6Key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 1 + .idea/encodings.xml | 2 + .../web/controller/ai/AiCommonController.java | 18 +++++ .../com/vetti/web/service/ICommonService.java | 19 +++++ .../web/service/impl/CommonServiceImpl.java | 76 +++++++++++++++++++ .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-druid.yml | 1 + .../target/classes/application-druid.yml | 2 +- .../domain/dto/RealtimeClientSecretDto.java | 24 ++++++ .../classes/mapper/system/SysUserMapper.xml | 1 + 10 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 vetti-admin/src/main/java/com/vetti/web/service/ICommonService.java create mode 100644 vetti-admin/src/main/java/com/vetti/web/service/impl/CommonServiceImpl.java create mode 100644 vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 7883a6b..162e62e 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -11,6 +11,7 @@ + diff --git a/.idea/encodings.xml b/.idea/encodings.xml index bb396d2..910cea3 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -13,6 +13,8 @@ + + diff --git a/vetti-admin/src/main/java/com/vetti/web/controller/ai/AiCommonController.java b/vetti-admin/src/main/java/com/vetti/web/controller/ai/AiCommonController.java index d84dcc4..ebc1fa0 100644 --- a/vetti-admin/src/main/java/com/vetti/web/controller/ai/AiCommonController.java +++ b/vetti-admin/src/main/java/com/vetti/web/controller/ai/AiCommonController.java @@ -5,6 +5,9 @@ import com.vetti.common.ai.gpt.ChatGPTClient; import com.vetti.common.ai.whisper.WhisperClient; import com.vetti.common.core.controller.BaseController; import com.vetti.common.core.domain.AjaxResult; +import com.vetti.common.core.domain.R; +import com.vetti.common.core.domain.dto.RealtimeClientSecretDto; +import com.vetti.web.service.ICommonService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -32,6 +35,9 @@ public class AiCommonController extends BaseController @Autowired private WhisperClient whisperClient; + @Autowired + private ICommonService commonService; + /** * 进行文本转语音处理 */ @@ -70,4 +76,16 @@ public class AiCommonController extends BaseController return success(); } + + /** + * 获取客户端临时Key + */ + @ApiOperation("获取客户端临时Key") + @GetMapping("/getRealtimeClientSecret") + public R handleRealtimeClientSecret() + { + RealtimeClientSecretDto dto = commonService.getRealtimeClientSecret(); + return R.ok(dto); + } + } diff --git a/vetti-admin/src/main/java/com/vetti/web/service/ICommonService.java b/vetti-admin/src/main/java/com/vetti/web/service/ICommonService.java new file mode 100644 index 0000000..ef14f3b --- /dev/null +++ b/vetti-admin/src/main/java/com/vetti/web/service/ICommonService.java @@ -0,0 +1,19 @@ +package com.vetti.web.service; + +import com.vetti.common.core.domain.dto.RealtimeClientSecretDto; + +/** + * 共同 信息 服务类 + * + * @author WangXiangShun + * @since 2025-08-27 + */ +public interface ICommonService { + + + /** + * 获取openAi客户端临时Key + * @return + */ + public RealtimeClientSecretDto getRealtimeClientSecret(); +} diff --git a/vetti-admin/src/main/java/com/vetti/web/service/impl/CommonServiceImpl.java b/vetti-admin/src/main/java/com/vetti/web/service/impl/CommonServiceImpl.java new file mode 100644 index 0000000..6c7e33b --- /dev/null +++ b/vetti-admin/src/main/java/com/vetti/web/service/impl/CommonServiceImpl.java @@ -0,0 +1,76 @@ +package com.vetti.web.service.impl; + +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.vetti.common.core.domain.dto.RealtimeClientSecretDto; +import com.vetti.web.service.ICommonService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.Map; +/** + * 共同 信息 服务实现类 + * + * @author WangXiangShun + * @since 2025-08-27 + */ +@Slf4j +@Service +public class CommonServiceImpl implements ICommonService { + + // OpenAI API密钥,需要替换为你自己的密钥 + @Value("${chatGpt.apiKey}") + private String apiKey; + // API端点URL + @Value("${chatGpt.apiClientTokenUrl}") + private String apiClientTokenUrl; + + /** + * 获取openAi客户端临时Key + * @return + */ + @Override + public RealtimeClientSecretDto getRealtimeClientSecret() { + RealtimeClientSecretDto dto = new RealtimeClientSecretDto(); + try { + // 1. 创建 HTTP 客户端 + HttpClient client = HttpClient.newBuilder() + .version(HttpClient.Version.HTTP_2) + .connectTimeout(Duration.ofSeconds(10)) + .build(); + + // 2. 构建请求体(空 JSON 对象) + ObjectMapper objectMapper = new ObjectMapper(); + String requestBody = ""; + // 3. 构建 HTTP 请求 + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(apiClientTokenUrl)) + .header("Content-Type", "application/json") + .header("Authorization", "Bearer " + apiKey) // 核心认证头 + .POST(HttpRequest.BodyPublishers.ofString(requestBody)) + .build(); + // 4. 发送请求并获取响应 + HttpResponse response = client.send( + request, + HttpResponse.BodyHandlers.ofString() + ); + // 5. 处理响应 + if (response.statusCode() == 200) { + // 解析响应为实体类 + System.out.println(JSONUtil.toJsonStr(response.body())); + Map entity = JSONUtil.toBean(response.body(), Map.class); + dto.setClientSecret(entity.get("value").toString()); + dto.setExpiresAt(Long.valueOf(entity.get("expires_at").toString())); + } + } catch (Exception e) { + e.printStackTrace(); + } + return dto; + } +} diff --git a/vetti-admin/src/main/resources/application-dev.yml b/vetti-admin/src/main/resources/application-dev.yml index 2711ee9..477e3ed 100644 --- a/vetti-admin/src/main/resources/application-dev.yml +++ b/vetti-admin/src/main/resources/application-dev.yml @@ -162,6 +162,7 @@ chatGpt: apiUrl: https://api.openai.com/v1/chat/completions model: gpt-3.5-turbo role: user + apiClientTokenUrl: https://api.openai.com/v1/realtime/client_secrets http: diff --git a/vetti-admin/src/main/resources/application-druid.yml b/vetti-admin/src/main/resources/application-druid.yml index aa11628..311e212 100644 --- a/vetti-admin/src/main/resources/application-druid.yml +++ b/vetti-admin/src/main/resources/application-druid.yml @@ -169,6 +169,7 @@ chatGpt: apiUrl: https://api.openai.com/v1/chat/completions model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CWKBNvE2 role: system + apiClientTokenUrl: https://api.openai.com/v1/realtime/client_secrets http: diff --git a/vetti-admin/target/classes/application-druid.yml b/vetti-admin/target/classes/application-druid.yml index 3df6826..aa11628 100644 --- a/vetti-admin/target/classes/application-druid.yml +++ b/vetti-admin/target/classes/application-druid.yml @@ -167,7 +167,7 @@ whisper: chatGpt: apiKey: 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 apiUrl: https://api.openai.com/v1/chat/completions - model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CTIvLD5n + model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CWKBNvE2 role: system diff --git a/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java b/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java new file mode 100644 index 0000000..4460fba --- /dev/null +++ b/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java @@ -0,0 +1,24 @@ +package com.vetti.common.core.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * openAi 客户端密钥返回结构 + * + * @author wangxiangshun + * @date 2025-10-29 + */ +@Data +@Accessors(chain = true) +public class RealtimeClientSecretDto { + + + @ApiModelProperty("生成的客户端密钥") + private String clientSecret; + + @ApiModelProperty("过期时间(Unix 时间戳,秒") + private long expiresAt; + +} diff --git a/vetti-system/target/classes/mapper/system/SysUserMapper.xml b/vetti-system/target/classes/mapper/system/SysUserMapper.xml index d6fb590..4f86fc6 100644 --- a/vetti-system/target/classes/mapper/system/SysUserMapper.xml +++ b/vetti-system/target/classes/mapper/system/SysUserMapper.xml @@ -35,6 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + From 9412368c1528de54aad4b778e5eb9c7de97a5440 Mon Sep 17 00:00:00 2001 From: wangxiangshun Date: Sat, 1 Nov 2025 15:10:28 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E4=B8=B4=E6=97=B6Key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vetti/common/core/domain/dto/RealtimeClientSecretDto.java | 1 + 1 file changed, 1 insertion(+) diff --git a/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java b/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java index 4460fba..431dfeb 100644 --- a/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java +++ b/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java @@ -15,6 +15,7 @@ import lombok.experimental.Accessors; public class RealtimeClientSecretDto { + @ApiModelProperty("生成的客户端密钥") private String clientSecret; From 6ef1117d95663f571c2317daeee79841028c562b Mon Sep 17 00:00:00 2001 From: wangxiangshun Date: Sat, 1 Nov 2025 16:06:41 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E4=B8=B4=E6=97=B6Key1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vetti-admin/target/classes/application-druid.yml | 1 + .../vetti/common/core/domain/dto/RealtimeClientSecretDto.java | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/vetti-admin/target/classes/application-druid.yml b/vetti-admin/target/classes/application-druid.yml index aa11628..311e212 100644 --- a/vetti-admin/target/classes/application-druid.yml +++ b/vetti-admin/target/classes/application-druid.yml @@ -169,6 +169,7 @@ chatGpt: apiUrl: https://api.openai.com/v1/chat/completions model: ft:gpt-3.5-turbo-0125:vetti:construction-labourer-test:CWKBNvE2 role: system + apiClientTokenUrl: https://api.openai.com/v1/realtime/client_secrets http: diff --git a/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java b/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java index 431dfeb..eb75f7f 100644 --- a/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java +++ b/vetti-common/src/main/java/com/vetti/common/core/domain/dto/RealtimeClientSecretDto.java @@ -14,8 +14,6 @@ import lombok.experimental.Accessors; @Accessors(chain = true) public class RealtimeClientSecretDto { - - @ApiModelProperty("生成的客户端密钥") private String clientSecret;