feat: support llm temperature override

This commit is contained in:
jxxghp
2026-07-05 13:04:51 +08:00
parent 7f82a9ea4d
commit a71d3ea03f
2 changed files with 41 additions and 26 deletions
+26 -16
View File
@@ -952,6 +952,7 @@ class LLMHelper:
base_url: str | None = None, base_url: str | None = None,
base_url_preset: str | None = None, base_url_preset: str | None = None,
user_agent: str | None = None, user_agent: str | None = None,
temperature: Optional[float] = None,
use_proxy: bool | None = None, use_proxy: bool | None = None,
): ):
""" """
@@ -967,6 +968,7 @@ class LLMHelper:
:param base_url: API Base URL。未显式传入时使用当前配置项 LLM_BASE_URL。 :param base_url: API Base URL。未显式传入时使用当前配置项 LLM_BASE_URL。
:param base_url_preset: Base URL 预设。未显式传入时使用当前配置项 LLM_BASE_URL_PRESET。 :param base_url_preset: Base URL 预设。未显式传入时使用当前配置项 LLM_BASE_URL_PRESET。
:param user_agent: OpenAI兼容接口请求 User-Agent。未显式传入时使用配置项 LLM_USER_AGENT。 :param user_agent: OpenAI兼容接口请求 User-Agent。未显式传入时使用配置项 LLM_USER_AGENT。
:param temperature: LLM 温度参数。未显式传入时使用配置项 LLM_TEMPERATURE。
:param use_proxy: 是否为本次 LLM 调用使用系统代理。未显式传入时使用配置项 LLM_USE_PROXY。 :param use_proxy: 是否为本次 LLM 调用使用系统代理。未显式传入时使用配置项 LLM_USE_PROXY。
:return: LLM实例 :return: LLM实例
""" """
@@ -978,6 +980,7 @@ class LLMHelper:
base_url_preset if base_url_preset is not None else settings.LLM_BASE_URL_PRESET base_url_preset if base_url_preset is not None else settings.LLM_BASE_URL_PRESET
) )
user_agent_value = user_agent if user_agent is not None else settings.LLM_USER_AGENT user_agent_value = user_agent if user_agent is not None else settings.LLM_USER_AGENT
temperature_value = temperature if temperature is not None else settings.LLM_TEMPERATURE
normalized_thinking_level = cls._resolve_thinking_level( normalized_thinking_level = cls._resolve_thinking_level(
thinking_level=thinking_level, thinking_level=thinking_level,
) )
@@ -1034,7 +1037,7 @@ class LLMHelper:
model=model_name, model=model_name,
api_key=runtime["api_key"], api_key=runtime["api_key"],
retries=3, retries=3,
temperature=settings.LLM_TEMPERATURE, temperature=temperature_value,
streaming=streaming, streaming=streaming,
client_args=_build_google_client_args(llm_proxy), client_args=_build_google_client_args(llm_proxy),
**thinking_kwargs, **thinking_kwargs,
@@ -1048,7 +1051,7 @@ class LLMHelper:
api_key=runtime["api_key"], api_key=runtime["api_key"],
api_base=runtime["base_url"], api_base=runtime["base_url"],
max_retries=3, max_retries=3,
temperature=settings.LLM_TEMPERATURE, temperature=temperature_value,
streaming=streaming, streaming=streaming,
stream_usage=True, stream_usage=True,
http_client=_build_httpx_client(llm_proxy), http_client=_build_httpx_client(llm_proxy),
@@ -1063,7 +1066,7 @@ class LLMHelper:
api_key=runtime["api_key"], api_key=runtime["api_key"],
base_url=runtime["base_url"], base_url=runtime["base_url"],
max_retries=3, max_retries=3,
temperature=settings.LLM_TEMPERATURE, temperature=temperature_value,
streaming=streaming, streaming=streaming,
stream_usage=True, stream_usage=True,
anthropic_proxy=llm_proxy, anthropic_proxy=llm_proxy,
@@ -1084,7 +1087,7 @@ class LLMHelper:
api_key=runtime["api_key"], api_key=runtime["api_key"],
max_retries=3, max_retries=3,
base_url=runtime.get("base_url"), base_url=runtime.get("base_url"),
temperature=settings.LLM_TEMPERATURE, temperature=temperature_value,
streaming=streaming, streaming=streaming,
stream_usage=True, stream_usage=True,
openai_proxy=llm_proxy, openai_proxy=llm_proxy,
@@ -1178,25 +1181,32 @@ class LLMHelper:
base_url: str | None = None, base_url: str | None = None,
base_url_preset: str | None = None, base_url_preset: str | None = None,
user_agent: str | None = None, user_agent: str | None = None,
temperature: Optional[float] = None,
use_proxy: bool | None = None, use_proxy: bool | None = None,
) -> dict: ) -> dict:
""" """
使用当前已保存配置执行一次最小 LLM 调用。 使用当前配置或显式传入的临时配置执行一次最小 LLM 调用。
:param temperature: LLM 温度参数。未显式传入时沿用已保存配置。
""" """
provider_name = provider if provider is not None else settings.LLM_PROVIDER provider_name = provider if provider is not None else settings.LLM_PROVIDER
model_name = model if model is not None else settings.LLM_MODEL model_name = model if model is not None else settings.LLM_MODEL
start = time.perf_counter() start = time.perf_counter()
llm = await LLMHelper.get_llm( llm_kwargs = {
streaming=False, "streaming": False,
provider=provider_name, "provider": provider_name,
model=model_name, "model": model_name,
thinking_level=thinking_level, "thinking_level": thinking_level,
api_key=api_key, "api_key": api_key,
base_url=base_url, "base_url": base_url,
base_url_preset=base_url_preset, "base_url_preset": base_url_preset,
user_agent=user_agent, "user_agent": user_agent,
use_proxy=use_proxy, "use_proxy": use_proxy,
) }
if temperature is not None:
llm_kwargs["temperature"] = temperature
llm = await LLMHelper.get_llm(**llm_kwargs)
try: try:
response = await asyncio.wait_for(llm.ainvoke(prompt), timeout=timeout) response = await asyncio.wait_for(llm.ainvoke(prompt), timeout=timeout)
except TimeoutError as err: except TimeoutError as err:
+15 -10
View File
@@ -36,6 +36,7 @@ class LlmTestRequest(BaseModel):
base_url: Optional[str] = None base_url: Optional[str] = None
base_url_preset: Optional[str] = None base_url_preset: Optional[str] = None
user_agent: Optional[str] = None user_agent: Optional[str] = None
temperature: Optional[float] = None
use_proxy: Optional[bool] = None use_proxy: Optional[bool] = None
@@ -292,16 +293,20 @@ async def llm_test(
) )
try: try:
result = await LLMHelper.test_current_settings( test_kwargs = {
provider=payload.provider, "provider": payload.provider,
model=payload.model, "model": payload.model,
thinking_level=payload.thinking_level, "thinking_level": payload.thinking_level,
api_key=payload.api_key, "api_key": payload.api_key,
base_url=payload.base_url, "base_url": payload.base_url,
base_url_preset=payload.base_url_preset, "base_url_preset": payload.base_url_preset,
user_agent=payload.user_agent, "user_agent": payload.user_agent,
use_proxy=payload.use_proxy, "use_proxy": payload.use_proxy,
) }
if payload.temperature is not None:
test_kwargs["temperature"] = payload.temperature
result = await LLMHelper.test_current_settings(**test_kwargs)
if not result.get("reply_preview"): if not result.get("reply_preview"):
return schemas.Response( return schemas.Response(
success=False, success=False,