- Open an issue first for non-trivial changes.
- Base PRs on
main. - Run
make cibefore pushing. - Template-first: new providers/modalities must start by copying from
templates/.
Prerequisites: Python 3.12+, uv
uv sync --group dev
uv run pre-commit install
uv run pre-commit install --hook-type pre-pushPre-commit runs linting, formatting, type checking, and security scans. Pre-push additionally runs the full unit test suite with coverage.
make ci # Full pipeline: format, lint, typecheck, security, tests
make test # Unit tests only
make lint # Ruff linting
make format # Ruff formatting
make typecheck # mypy
make security # Bandit scanIntegration tests hit real provider APIs (costs money, requires keys):
cp .env.example .env # Fill in your API keys
make integration-testSmall fixes (typos, tests, minor bugfixes) — go ahead and open a PR directly.
For new providers, new modalities, new parameters, new models, constraint updates, or dependency additions — open an issue first.
Changes to parsing, streaming, or typing semantics require explicit maintainer approval before any work begins. These are core primitives that affect every provider and modality.
Always start by copying from the templates. Replace {provider_slug}, {api_slug} placeholders and strip the .template extension.
Provider API layer — copy from templates/providers/, place in src/celeste/providers/<provider>/:
- Add the provider to the
Providerenum insrc/celeste/core.py(if new). - Register auth via
register_auth()insrc/celeste/providers/<provider>/__init__.py. - Export the provider in
src/celeste/providers/__init__.py. - Fill in the scaffolded files:
config.py(endpoints),client.py(HTTP + parsing),parameters.py(mappers),streaming.py(SSE). - The template contract is enforced by
tests/unit_tests/test_provider_api_templates.py—make testwill catch missing or mismatched methods.
Modality wiring — copy from templates/modalities/, place in src/celeste/modalities/<modality>/providers/<provider>/:
- Define models in
models.py(model IDs, operations, parameter constraints). - Create parameter mappers in
parameters.py(inherit from provider API mappers, set modality-specificname). - Create the modality client + stream class in
client.py. - Register models in
src/celeste/modalities/<modality>/models.py. - Register the client in the
PROVIDERSdict insrc/celeste/modalities/<modality>/providers/__init__.py. - Add the provider's official API docs link to
src/celeste/providers/api_references.md.
Include:
- A short summary (what and why).
- A test plan (
make cioutput, plus any integration tests you ran). - If you touched provider behavior: provider, model ID, and endpoints tested.
- Bug reports: Celeste version, Python version, provider/model/operation, minimal repro, expected vs actual.
- Provider requests: official API docs link, auth method, required endpoints, streaming format, usage/finish semantics.
Do not open public issues for vulnerabilities. Email kamil@withceleste.ai or use GitHub's private vulnerability reporting.
Be kind, constructive, and respectful. Contact kamil@withceleste.ai for any concerns.
By contributing, you agree your contributions are licensed under the MIT license (see LICENSE).