Skip to main content

galet

Provider-agnostic LLM, embedding, and image generation stack.

Lineage

This package is extracted from the Lucy monorepo (src/llm) as described in the Lucy design doc software/ai/lucy/design/llm-module-extraction.md.

It is a fresh repository with no shared git history. The extracted module's behaviour, public interface, optional-SDK import fallbacks, and no-fail-on-missing-credential semantics are preserved as-is; the only intentional change is the configuration boundary (see settings.py).

Features

  • Chat / completions — provider-agnostic create_response with temperature, tool calling, and response metadata. Providers: OpenAI, DeepSeek, Gemini, Mistral, Ollama.
  • Routing — explicit provider argument, or automatic model-name prefix routing with OpenAI fallback. Source names, model-name prefixes, class paths, and default models are declarative; provider implementations load only when selected.
  • Model catalog — inspect source/model metadata and resolve a model from a profile, required capabilities, and optional model/source preferences.
  • Tool calling — bounded tool loop; tools own name(), tool_def(), result_schema(), and execute().
  • Image generation — OpenAI (dall-e-*, gpt-image-*) and Gemini (gemini-*, imagen-*) backends behind a common interface.
  • Image description — vision-capable models describe images sent inline (base64, no upload).
  • Embeddings — OpenAI and Mistral embedding adapters.
  • Optional SDKs — imports degrade gracefully when a provider SDK is not installed; missing credentials never raise at import or call time.

Quick start

python -m venv .venv
.venv/bin/pip install -e .

Runnable examples live in samples/:

Script What it shows
samples/send_request.py Simple chat request (defaults to local Ollama)
samples/tool_handlers.py Tool-calling loop with a stubbed execute_command tool
samples/generate_image.py Image generation via OpenAI or Gemini
samples/describe_image.py Describe an image file with a vision model
samples/list_sources.py List providers and model-prefix routing

See samples/README.md for each script's full usage.

Configuration

galet needs two pieces of configuration, and both can be set with an environment variable or a command-line flag.

Credentials (API keys)

Galet owns provider credential resolution. Applications and delegated tasks should refer to a named profile rather than handle an API key.

A named profile selects exactly one source. Galet does not silently fall back to an environment variable or another file when that profile is selected.

from galet.settings import Settings

settings = Settings(
    credential_profiles={
        "openai-service": {
            "provider": "openai",
            "source": "file",
            "path": "/etc/galet/credentials/oaicred.json",
        }
    },
    credential_profile="openai-service",
)

key = settings.api_key("openai")

Supported profile sources:

Source Required field Behaviour
file path Reads the existing provider JSON credential format
environment variable Reads only that named environment variable
systemd credential Reads that file beneath CREDENTIALS_DIRECTORY

Systemd credentials may contain the existing JSON object or the raw API key:

[Service]
User=lucy
LoadCredential=openai:/etc/galet/credentials/oaicred.json
settings = Settings(
    credential_profiles={
        "openai-service": {
            "provider": "openai",
            "source": "systemd",
            "credential": "openai",
        }
    },
    credential_profile="openai-service",
)

For ordinary protected files, keep credentials outside the repository, make the directory accessible only to the service account, and make each credential file readable only by that account. The GALET_CREDENTIAL_PATH environment variable contains only a directory name and is not itself a secret.

For backward compatibility, when no named profile is selected Galet retains the original lookup order:

  1. The provider environment variable (OPENAI_API_KEY, DEEPSEEK_API_KEY, GEMINI_API_KEY, or MISTRAL_API_KEY).
  2. The provider file in credential_path or GALET_CREDENTIAL_PATH.

Credential file names and JSON keys:

Provider File Key(s) in the file
openai oaicred.json openai_api_key
deepseek deepseek_cred.json deepseek_api_key
gemini gemini_cred.json gemini_api_key, api_key
mistral mistral_cred.json mistral_api_key

Ollama base URL

Ollama needs no API key, but galet must know where the Ollama server is. galet resolves the address in this order:

  1. --ollama-base-url (command-line flag)
  2. OLLAMA_BASE_URL (environment variable)
  3. http://localhost:11434/v1 (default, Ollama's OpenAI-compatible endpoint)
# Default local Ollama
python samples/send_request.py --provider ollama "hi"

# Explicit URL
python samples/send_request.py --provider ollama --ollama-base-url http://localhost:11434/v1 "hi"

# Environment variable
OLLAMA_BASE_URL=http://192.168.87.40:11434/v1 python samples/send_request.py --provider ollama "hi"

Note the /v1 suffix: galet talks to Ollama's OpenAI-compatible endpoint, not the native Ollama API.

Model information and capability resolution

ProviderRegistry continues to route explicit model names to their source. Source and model metadata can be inspected without importing provider implementations, making an API call, or reading credentials. ModelCatalog adds deterministic capability-based selection.

from galet import ModelRequirements, default_model_catalog

for source in default_model_catalog.sources():
    print(source.name, source.default_model)

for model in default_model_catalog.models(source="openai"):
    print(model.name, sorted(model.profiles), sorted(model.capabilities))

resolved = default_model_catalog.resolve(
    ModelRequirements.create(
        profile="focused-development",
        required_capabilities=("tool-calling", "code-generation"),
        preferred_model="gpt-5-mini",
    )
)
print(resolved.source, resolved.model)

Model preferences are not agent identities. A caller may request a capability profile and allow Galet to select an eligible fallback. Credential lookup remains inside Galet's provider settings and is not exposed by the catalog.

Release files for galet 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for galet 0.1.2
File Size Uploaded
galet-0.1.2.tar.gz 55.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for galet 0.1.2
File Interpreter ABI Platform
galet-0.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 103.2 kB

Release files / galet-0.1.2.tar.gz

Download URL galet-0.1.2.tar.gz
Size 55.4 kB
Tags Source
SHA-256 checksum
How to use checksums
39065d1c5cd1d11678f47274bbfe65e203a800413363a4f397d9a5a0bb27a780
BLAKE2b-256 checksum
How to use checksums
490c900aac5ad9c31edf621a5aa20a4988b23c0fd8f31288850f8c894a3b2488
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.16 {"installer":{"name":"uv","version":"0.12.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / galet-0.1.2-py3-none-any.whl

Download URL galet-0.1.2-py3-none-any.whl
Size 47.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5ea8edc84f1a05a36ec1a293553a7be8109c924d268210986bcda4016c5de1ba
BLAKE2b-256 checksum
How to use checksums
0b56f339bdff85e2af611369e80848fbe455e35a4431ad3d6e0022b06784c80b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.16 {"installer":{"name":"uv","version":"0.12.16","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

0.1.3

2 release files

This release

0.1.2 This release

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page