Source code for kavalai.workflow.clients
"""
Copyright 2026 OÜ KAVAL AI (registry code 17393877)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
from typing import Any, Optional
from kavalai.llm_clients.base_client import (
BaseLlmClient,
LlmClientParameters,
ModelStatsReceiver,
)
# Known LlmClientParameters fields that may be supplied via a node's llm_kwargs.
_PARAM_FIELDS = set(LlmClientParameters.model_fields.keys())
[docs]
def build_parameters(llm_kwargs: Optional[dict[str, Any]]) -> LlmClientParameters:
"""Build :class:`LlmClientParameters` from a node's ``llm_kwargs``.
Recognised keys (temperature, top_p, reasoning_effort, service_tier,
timeout_seconds) are mapped onto the parameters model; unknown keys are
ignored so authors can keep provider-specific extras without breaking.
"""
kwargs = llm_kwargs or {}
known = {k: v for k, v in kwargs.items() if k in _PARAM_FIELDS}
return LlmClientParameters(**known)
[docs]
def make_client(
model: str,
parameters: Optional[LlmClientParameters] = None,
stats_receiver: Optional[ModelStatsReceiver] = None,
) -> BaseLlmClient:
"""Construct a v2 LLM client from a ``provider/model`` string.
Supported providers: ``openai``, ``gemini``, ``ollama``, ``browser``.
The ``browser`` provider runs inference client-side via a WebLLM bridge
(Pyodide only) and needs no API key — see
:class:`~kavalai.llm_clients.browser_client.BrowserLLMClient`.
"""
if "/" not in model:
raise ValueError(f"Model must be in 'provider/model' form, got '{model}'.")
provider, model_name = model.split("/", maxsplit=1)
if provider == "openai":
from kavalai.llm_clients.openai_client import OpenAIClient
return OpenAIClient(
model_name,
llm_client_parameters=parameters,
model_stats_receiver=stats_receiver,
)
if provider == "gemini":
from kavalai.llm_clients.gemini_client import GeminiClient
return GeminiClient(
model_name,
llm_client_parameters=parameters,
model_stats_receiver=stats_receiver,
)
if provider == "ollama":
from kavalai.llm_clients.ollama_client import OllamaClient
return OllamaClient(
model_name,
llm_client_parameters=parameters,
model_stats_receiver=stats_receiver,
)
if provider == "browser":
from kavalai.llm_clients.browser_client import BrowserLLMClient
return BrowserLLMClient(
model_name,
llm_client_parameters=parameters,
model_stats_receiver=stats_receiver,
)
raise ValueError(f"Unsupported LLM provider: '{provider}'.")