From a34bee2d404e9b17b75c129dfc407efd7d3bcec4 Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Tue, 20 Jan 2026 13:27:13 +0100 Subject: [PATCH] update readme for v1 public beta launch --- README.md | 122 ++++++++++++++---------------------------------------- 1 file changed, 31 insertions(+), 91 deletions(-) diff --git a/README.md b/README.md index 8e9cf692..51291465 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ All modalities. All providers. One interface. Primitives, not frameworks. + + [![Python](https://img.shields.io/badge/Python-3.12+-blue?style=for-the-badge)](https://www.python.org/) [![License](https://img.shields.io/badge/License-MIT-yellow?style=for-the-badge)](LICENSE) [![PyPI](https://img.shields.io/pypi/v/celeste-ai?style=for-the-badge)](https://pypi.org/project/celeste-ai/) @@ -45,54 +47,14 @@ Type-safe, modality/provider-agnostic primitives. ```python import celeste -# "We need a catchy slogan for our new eco-friendly sneaker." -slogan = await celeste.text.generate( - "Write a slogan for an eco-friendly sneaker.", - model="gpt-5", -) -print(slogan.content) -``` - - -## ๐ŸŽจ Multimodal example -```python -import celeste -from pydantic import BaseModel, Field - -class ProductCampaign(BaseModel): - visual_prompt: str - audio_script: str - -# 2. Extract Campaign Assets (Anthropic) -# ----------------------------------------------------- -campaign_output = await celeste.text.generate( - f"Create campaign assets for slogan: {slogan.content}", - model="claude-opus-4-1", - output_schema=ProductCampaign, -) -campaign = campaign_output.content - -# 3. Generate Ad Visual (Flux) -# ----------------------------------------------------- -image_output = await celeste.images.generate( - campaign.visual_prompt, - model="flux-2-flex", - aspect_ratio="1:1" -) -image = image_output.content - -# 4. Generate Radio Spot (ElevenLabs) -# ----------------------------------------------------- -speech_output = await celeste.audio.speak( - campaign.audio_script, - model="eleven_v3", - voice="adam" -) -speech = speech_output.content +# One SDK. Every modality. Any provider. +text = await celeste.text.generate("Explain quantum computing", model="claude-opus-4-5") +image = await celeste.images.generate("A serene mountain lake at dawn", model="flux-2-pro") +speech = await celeste.audio.speak("Welcome to the future", model="eleven_v3") +video = await celeste.videos.analyze(video_file, prompt="Summarize this clip", model="gemini-3-pro") +embeddings = await celeste.text.embed(["lorep ipsum", "dolor sit amet"], model="gemini-embedding-001") ``` -No special cases. No separate libraries. **One consistent interface.** - --- @@ -129,8 +91,23 @@ No special cases. No separate libraries. **One consistent interface.** --- -## ๐Ÿ”„ Switch providers in one line +## Operations by Domain + +| Action | Text | Images | Audio | Video | +| :--- | :---: | :---: | :---: | :---: | +| **Generate** | โœ“ | โœ“ | โ—‹ | โœ“ | +| **Edit** | โ€” | โœ“ | โ€” | โ€” | +| **Analyze** | โ€” | โœ“ | โœ“ | โœ“ | +| **Upscale** | โ€” | โ—‹ | โ€” | โ—‹ | +| **Speak** | โ€” | โ€” | โœ“ | โ€” | +| **Transcribe** | โ€” | โ€” | โœ“ | โ€” | +| **Embed** | โœ“ | โ—‹ | โ€” | โ—‹ | + +โœ“ Available ยท โ—‹ Planned + + +## ๐Ÿ”„ Switch providers in one line ```python from pydantic import BaseModel @@ -193,46 +170,18 @@ response = await celeste.text.generate( user = response.content # Already parsed as User instance ``` ---- -## ๐Ÿงญ Namespace API (recommended) -Namespaces are domain-first: start from the resource you want to work with (e.g., videos) even if the input is text. Under the hood, Celeste maps (domain, operation) to the output modality (e.g., `celeste.images.analyze(...)` routes to the text modality because analysis returns text). -```python -import celeste - -# Async (default) -result = await celeste.images.analyze( - image=img, - prompt="Describe this image", - model="gpt-4o" -) - -# Sync -result = celeste.images.sync.analyze( - image=img, - prompt="Describe this image", - model="gpt-4o" -) - -# Async streaming -async for chunk in celeste.text.stream.generate("Hello", model="gpt-4o"): - print(chunk.content, end="") - -# Sync streaming -for chunk in celeste.text.sync.stream.generate("Hello", model="gpt-4o"): - print(chunk.content, end="") -``` ---- -## โš™๏ธ Advanced: create_client +## โš™๏ธ Advanced: Create Client For explicit configuration or client reuse, use `create_client` with modality + operation. This is modality-first: you choose the output type and operation explicitly. ```python -from celeste import create_client, Modality, Operation +from celeste import create_client, Modality, Operation, Provider client = create_client( modality=Modality.TEXT, operation=Operation.GENERATE, - model=google_model_id, + provider=Provider.OLLAMA, + model="llama3.2", ) response = await client.generate("Extract user info: John is 30", output_schema=User) ``` @@ -242,19 +191,10 @@ response = await client.generate("Extract user info: John is 30", output_schema= --- ## ๐Ÿชถ Install ```bash -pip install celeste-ai -# or uv add celeste-ai +# or +pip install celeste-ai ``` ---- -## ๐Ÿ” Behavior changes since v0.3.9 -- Capabilities โ†’ modalities + operations. -- Namespace API is now the default entry point. -- `create_client` now uses `modality` + `operation`; `capability` is deprecated. -- `analyze` for image/audio/video routes through the text modality. -- Namespaces are domain-first (resource you work with); `create_client` is modality-first (output type). Domain + operation maps to modality. -- `extra_body` allows provider-specific parameters without first-class mapping. -- Single-package install (no extras). --- ## ๐Ÿ”ง Type-Safe by Design @@ -293,7 +233,7 @@ We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md). MIT license โ€“ see [LICENSE](LICENSE) for details. ---- +