线上容器漏注入 DEEPSEEK_API_KEY 时,api-key 会落到 application.yml 里的中文 占位符,直到某个用户发起一次对话才以 HTTP 401 暴露: ResourceAccessException: I/O error on POST ... java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode 排查成本很高。 DeepSeekClient 增加 @PostConstruct 自检(可 grep [大模型]): - 为空 / 仍含"请替换"占位符 -> ERROR,并写明修法 - 不以 sk- 开头 -> WARN 提示格式可疑 - 正常 -> INFO 打长度 + host + model(不打印 key 本体) 修法提示:在 projman 的 /app/config/application-prod.yml 填真实 key, 或给容器注入环境变量 DEEPSEEK_API_KEY(勿写入 public 仓库中的 application.yml)。
This commit is contained in:
@@ -19,6 +19,7 @@ import org.springframework.http.ResponseEntity;
|
|||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
|
|
||||||
|
import javax.annotation.PostConstruct;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -51,6 +52,34 @@ public class DeepSeekClient implements LlmClient {
|
|||||||
this.settings = settings;
|
this.settings = settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动自检:把「大模型到底配好没有」这件事在启动日志里说清楚(可 grep {@code [大模型]})。
|
||||||
|
*
|
||||||
|
* <p>线上最容易被忽略的一类故障:容器没有注入 {@code DEEPSEEK_API_KEY},
|
||||||
|
* 于是 api-key 落到 application.yml 里的中文占位符,直到某个用户发起一次对话才以
|
||||||
|
* HTTP 401(表现为 {@code HttpRetryException: cannot retry due to server authentication,
|
||||||
|
* in streaming mode})暴露出来 —— 排查成本很高。这里改成启动时就 ERROR 出来。
|
||||||
|
*/
|
||||||
|
@PostConstruct
|
||||||
|
void checkLlmConfig() {
|
||||||
|
AgentSettings.Llm llm = settings.getLlm();
|
||||||
|
String key = llm.getApiKey();
|
||||||
|
if (StringUtils.isBlank(key)) {
|
||||||
|
log.error("[大模型] agent.llm.api-key 为空 —— 任何对话都会鉴权失败。"
|
||||||
|
+ "请在 application-prod.yml 填写真实 key,或给容器注入环境变量 DEEPSEEK_API_KEY。");
|
||||||
|
} else if (key.contains("请替换")) {
|
||||||
|
log.error("[大模型] agent.llm.api-key 仍是占位符(长度 {})—— 说明容器没有注入环境变量 "
|
||||||
|
+ "DEEPSEEK_API_KEY。任何对话都会 401:请在 application-prod.yml 写真实 key,"
|
||||||
|
+ "或给容器注入该环境变量后重启。", key.length());
|
||||||
|
} else if (!key.startsWith("sk-")) {
|
||||||
|
log.warn("[大模型] agent.llm.api-key 已配置,但格式可疑(不以 sk- 开头,长度 {}),请确认是否填错。",
|
||||||
|
key.length());
|
||||||
|
} else {
|
||||||
|
log.info("[大模型] api-key 已配置(长度 {}),host={} model={}",
|
||||||
|
key.length(), llm.getHost(), llm.getModel());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ChatResult chat(List<ChatMessage> messages, JSONArray tools) {
|
public ChatResult chat(List<ChatMessage> messages, JSONArray tools) {
|
||||||
AgentSettings.Llm llm = settings.getLlm();
|
AgentSettings.Llm llm = settings.getLlm();
|
||||||
|
|||||||
Reference in New Issue
Block a user