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_responsewith temperature, tool calling, and response metadata. Providers: OpenAI, DeepSeek, Gemini, Mistral, Ollama. - Routing — explicit
providerargument, or automatic model-name prefix routing with OpenAI fallback. Connectors self-register their name, model-name prefixes, and default model withProviderRegistry. - Tool calling — bounded tool loop; tools own
name(),tool_def(),result_schema(), andexecute(). - 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)
Only non-Ollama providers need an API key. galet resolves a key in this order:
- The provider's own environment variable (
OPENAI_API_KEY,DEEPSEEK_API_KEY,GEMINI_API_KEY,MISTRAL_API_KEY). - A credential file in the directory named by
--credential-path, or theGALET_CREDENTIAL_PATHenvironment variable when no flag is given.
Credential file names:
| 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 |
Example credential file (oaicred.json):
{"openai_api_key": "sk-..."}
python samples/send_request.py --credential-path /path/to/credentials --provider openai "hi"
GALET_CREDENTIAL_PATH=/path/to/credentials python samples/send_request.py --provider openai "hi"
Ollama base URL
Ollama needs no API key, but galet must know where the Ollama server is. galet resolves the address in this order:
--ollama-base-url(command-line flag)OLLAMA_BASE_URL(environment variable)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.
Release files for galet 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| galet-0.1.1.tar.gz | 46.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| galet-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 90.5 kB
Release files / galet-0.1.1.tar.gz
| Download URL | galet-0.1.1.tar.gz |
|---|---|
| Size | 46.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6a74a9d2c611edd926e7d2446ef799ee37399dcd38d9a6d8ba0da6829413dbc7
|
|
BLAKE2b-256 checksum How to use checksums |
75884e2f08fe504755233568dacfcb1baa723e0050a5e3ead6795cc34bd509c8
|
| 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.1-py3-none-any.whl
| Download URL | galet-0.1.1-py3-none-any.whl |
|---|---|
| Size | 43.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a2f7355b8f8010c0e178829fdd1b4a38e215cd024a3541548f0a4060b03ea8cb
|
|
BLAKE2b-256 checksum How to use checksums |
cff2537b4fa43965ac57a327efa950d63a4cf30cceb256bd98df908e180e9b92
|
| 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}
|