task-168: LLM 客户端配置接入(LlmHttpConfigResolver 从 aiimage.http-client.* 读取超时/重试,默认值同现状、钳制、可覆盖)+ 8 条测试
This commit is contained in:
@@ -0,0 +1,38 @@
|
|||||||
|
package com.nanri.aiimage.config;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LLM 客户端统一配置解析(task-168,Coze 已改直连 LLM)。
|
||||||
|
*
|
||||||
|
* 从 aiimage.http-client.* 命名空间读取 LLM 客户端超时/重试,默认值与现状一致
|
||||||
|
* (connect 10s / read 60s / call 90s / retry 3);非法值钳制。模块级显式配置
|
||||||
|
* (SimilarAsinProperties.llm*)优先级高于命名空间(行为不变)。
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class LlmHttpConfigResolver {
|
||||||
|
|
||||||
|
private final HttpClientProperties httpClientProperties;
|
||||||
|
|
||||||
|
public long connectTimeoutMillis() {
|
||||||
|
return httpClientProperties.effectiveConnectTimeoutMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long readTimeoutMillis() {
|
||||||
|
return httpClientProperties.effectiveReadTimeoutMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long callTimeoutMillis() {
|
||||||
|
return httpClientProperties.effectiveCallTimeoutMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int maxRetries() {
|
||||||
|
return httpClientProperties.effectiveMaxRetries();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long baseRetryDelayMillis() {
|
||||||
|
return httpClientProperties.getBaseRetryDelayMillis();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package com.nanri.aiimage.config;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* task-168:LLM 客户端配置接入契约(plan 10)。
|
||||||
|
* 从 aiimage.http-client.* 读取超时/重试;默认值与现状一致;覆盖生效;
|
||||||
|
* 非法值钳制。
|
||||||
|
*/
|
||||||
|
class LlmHttpConfigResolverTest {
|
||||||
|
|
||||||
|
private HttpClientProperties properties;
|
||||||
|
private LlmHttpConfigResolver resolver;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
properties = new HttpClientProperties();
|
||||||
|
resolver = new LlmHttpConfigResolver(properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void timeoutFromConfigApplied() {
|
||||||
|
assertEquals(10_000L, resolver.connectTimeoutMillis());
|
||||||
|
assertEquals(60_000L, resolver.readTimeoutMillis());
|
||||||
|
assertEquals(90_000L, resolver.callTimeoutMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void defaultValuesKept() {
|
||||||
|
// 命名空间默认 = 现状基线(connect 10s / read 60s / call 90s / retry 3)
|
||||||
|
assertEquals(10_000L, resolver.connectTimeoutMillis());
|
||||||
|
assertEquals(60_000L, resolver.readTimeoutMillis());
|
||||||
|
assertEquals(3, resolver.maxRetries());
|
||||||
|
assertEquals(500L, resolver.baseRetryDelayMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void overrideTakesEffect() {
|
||||||
|
properties.setConnectTimeoutMillis(30_000);
|
||||||
|
properties.setReadTimeoutMillis(120_000);
|
||||||
|
properties.setMaxRetries(5);
|
||||||
|
|
||||||
|
assertEquals(30_000L, resolver.connectTimeoutMillis());
|
||||||
|
assertEquals(120_000L, resolver.readTimeoutMillis());
|
||||||
|
assertEquals(5, resolver.maxRetries());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void callTimeoutReflectsTotal() {
|
||||||
|
properties.setCallTimeoutMillis(180_000);
|
||||||
|
assertEquals(180_000L, resolver.callTimeoutMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void retryConfigReflected() {
|
||||||
|
properties.setMaxRetries(0);
|
||||||
|
assertEquals(0, resolver.maxRetries());
|
||||||
|
properties.setMaxRetries(99);
|
||||||
|
assertEquals(10, resolver.maxRetries(), "重试钳制到 10");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void invalidTimeoutsClamped() {
|
||||||
|
properties.setConnectTimeoutMillis(-1);
|
||||||
|
assertEquals(1_000L, resolver.connectTimeoutMillis());
|
||||||
|
properties.setReadTimeoutMillis(999_999_999L);
|
||||||
|
assertEquals(3_600_000L, resolver.readTimeoutMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void resolverBindingWired() {
|
||||||
|
assertTrue(resolver.connectTimeoutMillis() > 0);
|
||||||
|
assertTrue(resolver.maxRetries() >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void behaviorSameAsCurrentBaseline() {
|
||||||
|
// 与 SimilarAsinProperties.llm 现状对比:connect 一致(10s)、重试一致(3)
|
||||||
|
assertEquals(10_000L, resolver.connectTimeoutMillis());
|
||||||
|
assertEquals(3, resolver.maxRetries());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user