Anthropic.of(modelName) and AnthropicCompatible.custom(configKey,
modelName) return AnthropicSpec, with a thinking sub-builder using
Anthropic's native budget/enabled terms.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
DeepSeek/Kimi/GLM/Minimax static entries with default baseUrls,
plus OpenAICompatible.custom() fallback for arbitrary vendors.
All read credentials from liteflow.agent.openai-compatible.<key>.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
OpenAI.of(modelName) returns an OpenAISpec exposing reasoningEffort,
frequencyPenalty, and presencePenalty in addition to the common
ModelSpec setters; resolve() reads liteflow.agent.openai credential.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Centralizes credential lookup with consistent AgentConfigException
messages that point at the relevant liteflow.agent.* config path.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
resolve() is the framework SPI: ReActAgentComponent (in a different
package) needs to call spec.resolve(cfg), which protected access
does not permit. The test's TestSpec override is widened in lockstep
since Java forbids narrowing visibility on override.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Vendor-neutral model descriptor with common fluent setters
(temperature/topP/topK/maxTokens/seed/stream/cacheControl) and an
abstract resolve(AgentConfig) SPI that provider modules implement.
The AgentConfig/SessionConfig/WorkspaceConfig POJOs belong in
liteflow-core, not liteflow-react-agent-core.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>