Model providers¶
geoagent.core.model
¶
Resolve Strands :class:~strands.models.model.Model instances from config.
get_default_model()
¶
Default model using environment-derived provider selection.
Source code in geoagent/core/model.py
def get_default_model() -> Any:
"""Default model using environment-derived provider selection."""
return resolve_model(GeoAgentConfig())
get_llm(**kwargs)
¶
Build a model (alias for :func:resolve_model with a fresh config).
Source code in geoagent/core/model.py
def get_llm(**kwargs: Any) -> Any:
"""Build a model (alias for :func:`resolve_model` with a fresh config)."""
if not kwargs:
return get_default_model()
return resolve_model(GeoAgentConfig.model_validate(kwargs))
resolve_model(config=None, **overrides)
¶
Build a Strands model from :class:GeoAgentConfig or kwargs overrides.
Exceptions:
| Type | Description |
|---|---|
ImportError |
When optional provider client libraries are missing. |
ValueError |
When configuration is inconsistent. |
Source code in geoagent/core/model.py
def resolve_model(config: GeoAgentConfig | None = None, **overrides: Any) -> Any:
"""Build a Strands model from :class:`GeoAgentConfig` or kwargs overrides.
Raises:
ImportError: When optional provider client libraries are missing.
ValueError: When configuration is inconsistent.
"""
cfg = (
config.model_copy(update=overrides)
if config is not None
else GeoAgentConfig(**overrides)
)
provider: ProviderName = cfg.provider
if provider == "bedrock":
from strands.models.bedrock import BedrockModel
model_id = cfg.model or os.environ.get(
"BEDROCK_MODEL", "us.anthropic.claude-sonnet-4-6"
)
params = {"temperature": cfg.temperature}
params.update(_token_param("max_tokens", cfg.max_tokens))
return BedrockModel(model_id=model_id, params=params)
if provider == "openai":
from strands.models.openai import OpenAIModel
model_id = cfg.model or os.environ.get("OPENAI_MODEL", "gpt-5.5")
client_args = dict(cfg.client_args)
params = {}
if not _model_uses_default_temperature_only(model_id):
params["temperature"] = cfg.temperature
params.update(_openai_token_params(model_id, cfg.max_tokens))
return OpenAIModel(
client_args=client_args or None,
model_id=model_id,
params=params,
)
if provider == "openai-codex":
from strands.models.openai_responses import OpenAIResponsesModel
model_id = cfg.model or os.environ.get("OPENAI_CODEX_MODEL", "gpt-5.5")
client_args = dict(cfg.client_args)
api_key = client_args.get("api_key") or os.environ.get(
"OPENAI_CODEX_ACCESS_TOKEN"
)
if not api_key:
try:
from geoagent.core.openai_codex import ensure_openai_codex_environment
ensure_openai_codex_environment()
api_key = os.environ.get("OPENAI_CODEX_ACCESS_TOKEN")
except RuntimeError:
api_key = ""
base_url = (
client_args.get("base_url")
or cfg.openai_codex_base_url
or os.environ.get("OPENAI_CODEX_BASE_URL")
or "https://chatgpt.com/backend-api/codex"
)
account_id = os.environ.get("OPENAI_CODEX_ACCOUNT_ID", "").strip()
if not api_key:
raise ValueError(
"OpenAI Codex provider requires a ChatGPT OAuth access token. "
"Run `geoagent codex login`, call `geoagent.login_openai_codex()`, "
"or set OPENAI_CODEX_ACCESS_TOKEN."
)
client_args["api_key"] = api_key
client_args["base_url"] = base_url
default_headers = dict(client_args.get("default_headers") or {})
default_headers.setdefault("User-Agent", "codex-cli")
if account_id:
default_headers["ChatGPT-Account-Id"] = account_id
client_args["default_headers"] = default_headers
return OpenAIResponsesModel(
client_args=client_args,
model_id=model_id,
params={},
)
if provider == "anthropic":
from strands.models.anthropic import AnthropicModel
model_id = cfg.model or os.environ.get("ANTHROPIC_MODEL", "claude-sonnet-4-6")
client_args = dict(cfg.client_args)
kwargs: dict[str, Any] = {}
if cfg.max_tokens is not None:
kwargs["max_tokens"] = int(cfg.max_tokens)
return AnthropicModel(
client_args=client_args or None,
model_id=model_id,
params={"temperature": cfg.temperature},
**kwargs,
)
if provider == "gemini":
from strands.models.gemini import GeminiModel
model_id = cfg.model or os.environ.get(
"GEMINI_MODEL",
os.environ.get("GOOGLE_MODEL", "gemini-3.1-pro-preview"),
)
client_args = dict(cfg.client_args)
api_key = os.environ.get("GEMINI_API_KEY") or os.environ.get("GOOGLE_API_KEY")
if api_key and "api_key" not in client_args:
client_args["api_key"] = api_key
params = {"temperature": cfg.temperature}
params.update(_token_param("max_output_tokens", cfg.max_tokens))
return GeminiModel(
client_args=client_args or None,
model_id=model_id,
params=params,
)
if provider == "ollama":
from strands.models.ollama import OllamaModel
host = cfg.ollama_host or os.environ.get(
"OLLAMA_HOST", "http://127.0.0.1:11434"
)
model_id = cfg.model or os.environ.get("OLLAMA_MODEL", "qwen3.5:4b")
kwargs = {}
if cfg.max_tokens is not None:
kwargs["max_tokens"] = int(cfg.max_tokens)
return OllamaModel(
host,
model_id=model_id,
temperature=cfg.temperature,
**kwargs,
)
if provider == "litellm":
from strands.models.litellm import LiteLLMModel
model_id = cfg.model or os.environ.get("LITELLM_MODEL", "openai/gpt-5.5")
client_args = dict(cfg.client_args)
api_key = os.environ.get("LITELLM_API_KEY")
if api_key and "api_key" not in client_args:
client_args["api_key"] = api_key
base_url = cfg.litellm_base_url or os.environ.get("LITELLM_BASE_URL")
if base_url and "base_url" not in client_args:
client_args["base_url"] = base_url
params = _token_param("max_tokens", cfg.max_tokens)
if not _model_uses_default_temperature_only(model_id):
params["temperature"] = cfg.temperature
return LiteLLMModel(
client_args=client_args or None,
model_id=model_id,
params=params,
)
if provider == "vllm":
from strands_vllm import VLLMModel
model_id = cfg.model or os.environ.get("VLLM_MODEL_ID")
if not model_id:
raise ValueError(
"vLLM provider requires a model id. Pass model=..., set "
"VLLM_MODEL_ID, or configure the model in OpenGeoAgent settings."
)
client_args = dict(cfg.client_args)
base_url = (
cfg.vllm_base_url
or client_args.pop("base_url", None)
or os.environ.get("VLLM_BASE_URL")
or "http://localhost:8000/v1"
)
api_key = client_args.pop("api_key", None) or os.environ.get(
"VLLM_API_KEY", "EMPTY"
)
params = {"temperature": cfg.temperature}
params.update(_token_param("max_tokens", cfg.max_tokens))
return VLLMModel(
base_url=base_url,
model_id=model_id,
api_key=api_key,
params=params,
**client_args,
)
raise ValueError(f"Unknown provider: {provider}")