Files
ss-tools/agent/src/ss_tools/agent/_llm_params.py
busya f22b0cf41c chore: add GRACE semantic contracts across agent + backend + build scripts
- Add @RELATION/@RATIONALE/@REJECTED headers to agent modules
- Add GRACE contracts to backend services, models, schemas
- Update build.sh with single-image build commands (build:backend|frontend|agent)
- Update docker entrypoint: openssl rsa → openssl pkey (alg-agnostic)
- Add @RATIONALE to backend core modules (cot_logger, config_manager, ssl)
2026-07-08 11:10:59 +03:00

77 lines
2.6 KiB
Python

# agent/src/ss_tools/agent/_llm_params.py
# #region AgentChat.LlmParams [C:3] [TYPE Module] [SEMANTICS agent-chat,llm,openai,compatibility]
# @ingroup AgentChat
# @BRIEF Build provider-safe ChatOpenAI kwargs and raw OpenAI payloads.
# @POST Unsupported sampling parameters are omitted for reasoning/codex models.
from typing import Any
_TEMPERATURE_UNSUPPORTED_PREFIXES = (
"codex/",
"omni/codex/",
"gpt-5",
"o1",
"o3",
"o4",
)
# #region AgentChat.LlmParams.CanonicalModelName [C:1] [TYPE Function] [SEMANTICS agent-chat,llm,model,canonical]
# @ingroup AgentChat
# @BRIEF Strip provider prefix from model name for compatibility checks.
def _canonical_model_name(model: str | None) -> str:
name = (model or "").strip().lower()
if name.startswith(("codex/", "omni/codex/")):
return name
if "/" in name:
return name.rsplit("/", 1)[-1]
return name
# #endregion AgentChat.LlmParams.CanonicalModelName
# #region AgentChat.LlmParams.SupportsTemperature [C:1] [TYPE Function] [SEMANTICS agent-chat,llm,temperature,check]
# @ingroup AgentChat
# @BRIEF Check if a model supports temperature parameter (reasoning/codex models don't).
def supports_temperature(model: str | None) -> bool:
name = _canonical_model_name(model)
return not any(name.startswith(prefix) for prefix in _TEMPERATURE_UNSUPPORTED_PREFIXES)
# #endregion AgentChat.LlmParams.SupportsTemperature
# #region AgentChat.LlmParams.ChatOpenAIKwargs [C:2] [TYPE Function] [SEMANTICS agent-chat,llm,openai,kwargs]
# @ingroup AgentChat
# @BRIEF Build ChatOpenAI constructor kwargs with provider-safe parameters.
def chat_openai_kwargs(
*,
model: str,
base_url: str | None,
api_key: str,
max_tokens: int,
temperature: float = 0,
) -> dict[str, Any]:
kwargs: dict[str, Any] = {
"model": model,
"base_url": base_url,
"api_key": api_key,
"max_tokens": max_tokens,
}
if supports_temperature(model):
kwargs["temperature"] = temperature
return kwargs
# #endregion AgentChat.LlmParams.ChatOpenAIKwargs
# #region AgentChat.LlmParams.AddTemperature [C:2] [TYPE Function] [SEMANTICS agent-chat,llm,payload,temperature]
# @ingroup AgentChat
# @BRIEF Conditionally add temperature to raw OpenAI payload dict.
def add_temperature_if_supported(
payload: dict[str, Any],
*,
model: str | None,
temperature: float = 0,
) -> dict[str, Any]:
if supports_temperature(model):
payload["temperature"] = temperature
return payload
# #endregion AgentChat.LlmParams.AddTemperature
# #endregion AgentChat.LlmParams