Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -158,3 +158,8 @@ uv.lock
# Security reports
bandit-report.json
mureka.md

# Temporary/audit files
CHANGELOG_SINCE_RELEASE.md
MIGRATION_AUDIT_REPORT.md
scripts/
2 changes: 1 addition & 1 deletion packages/capabilities/image-generation/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-image-generation"
version = "0.3.5"
version = "0.3.6"
description = "Image generation package for Celeste AI. Unified interface for all providers"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
readme = "README.md"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@


def register_package() -> None:
"""Register image generation package (client and models)."""
"""Register image generation package (client, models, and input)."""
from celeste.client import register_client
from celeste.core import Capability
from celeste.io import register_input
from celeste.models import register_models
from celeste_image_generation.io import ImageGenerationInput
from celeste_image_generation.models import MODELS
from celeste_image_generation.providers import PROVIDERS

for provider, client_class in PROVIDERS:
register_client(Capability.IMAGE_GENERATION, provider, client_class)

register_models(MODELS, capability=Capability.IMAGE_GENERATION)
register_input(Capability.IMAGE_GENERATION, ImageGenerationInput)


from celeste_image_generation.io import ( # noqa: E402
Expand Down
2 changes: 1 addition & 1 deletion packages/capabilities/speech-generation/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-speech-generation"
version = "0.3.3"
version = "0.3.6"
description = "Speech generation package for Celeste AI. Unified interface for all providers"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
readme = "README.md"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@


def register_package() -> None:
"""Register speech generation package (client and models)."""
"""Register speech generation package (client, models, and input)."""
from celeste.client import register_client
from celeste.core import Capability
from celeste.io import register_input
from celeste.models import register_models
from celeste_speech_generation.io import SpeechGenerationInput
from celeste_speech_generation.models import MODELS
from celeste_speech_generation.providers import PROVIDERS

for provider, client_class in PROVIDERS:
register_client(Capability.SPEECH_GENERATION, provider, client_class)

register_models(MODELS, capability=Capability.SPEECH_GENERATION)
register_input(Capability.SPEECH_GENERATION, SpeechGenerationInput)


from celeste_speech_generation.io import ( # noqa: E402
Expand Down
2 changes: 1 addition & 1 deletion packages/capabilities/text-generation/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-text-generation"
version = "0.3.4"
version = "0.3.6"
description = "Text generation package for Celeste AI. Unified interface for all providers"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
readme = "README.md"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@


def register_package() -> None:
"""Register text generation package (client and models)."""
"""Register text generation package (client, models, and input)."""
from celeste.client import register_client
from celeste.core import Capability
from celeste.io import register_input
from celeste.models import register_models
from celeste_text_generation.io import TextGenerationInput
from celeste_text_generation.models import MODELS
from celeste_text_generation.providers import PROVIDERS

for provider, client_class in PROVIDERS:
register_client(Capability.TEXT_GENERATION, provider, client_class)

register_models(MODELS, capability=Capability.TEXT_GENERATION)
register_input(Capability.TEXT_GENERATION, TextGenerationInput)


from celeste_text_generation.io import ( # noqa: E402
Expand Down
2 changes: 1 addition & 1 deletion packages/capabilities/video-generation/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-video-generation"
version = "0.3.3"
version = "0.3.6"
description = "Video generation package for Celeste AI. Unified interface for all providers"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
readme = "README.md"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@


def register_package() -> None:
"""Register video generation package (client and models)."""
"""Register video generation package (client, models, and input)."""
from celeste.client import register_client
from celeste.core import Capability
from celeste.io import register_input
from celeste.models import register_models
from celeste_video_generation.io import VideoGenerationInput
from celeste_video_generation.models import MODELS
from celeste_video_generation.providers import PROVIDERS

for provider, client_class in PROVIDERS:
register_client(Capability.VIDEO_GENERATION, provider, client_class)

register_models(MODELS, capability=Capability.VIDEO_GENERATION)
register_input(Capability.VIDEO_GENERATION, VideoGenerationInput)


from celeste_video_generation.io import ( # noqa: E402
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,20 @@
),
},
),
Model(
id="seedance-1-5-pro-251215",
provider=Provider.BYTEPLUS,
capabilities={Capability.VIDEO_GENERATION},
display_name="Seedance 1.5 Pro",
parameter_constraints={
VideoGenerationParameter.DURATION: Range(min=4, max=12),
VideoGenerationParameter.RESOLUTION: Choice(options=["480p", "720p"]),
VideoGenerationParameter.FIRST_FRAME: ImageConstraint(
supported_mime_types=BYTEPLUS_SUPPORTED_MIME_TYPES,
),
VideoGenerationParameter.LAST_FRAME: ImageConstraint(
supported_mime_types=BYTEPLUS_SUPPORTED_MIME_TYPES,
),
},
),
]
2 changes: 1 addition & 1 deletion packages/providers/anthropic/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-anthropic"
version = "0.3.3"
version = "0.3.6"
description = "Anthropic provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand Down
2 changes: 1 addition & 1 deletion packages/providers/bfl/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-bfl"
version = "0.3.3"
version = "0.3.6"
description = "BFL (Black Forest Labs) provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand Down
2 changes: 1 addition & 1 deletion packages/providers/byteplus/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-byteplus"
version = "0.3.3"
version = "0.3.6"
description = "BytePlus provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand Down
2 changes: 1 addition & 1 deletion packages/providers/cohere/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-cohere"
version = "0.3.3"
version = "0.3.6"
description = "Cohere provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand Down
2 changes: 1 addition & 1 deletion packages/providers/elevenlabs/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-elevenlabs"
version = "0.3.3"
version = "0.3.6"
description = "ElevenLabs provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand Down
8 changes: 4 additions & 4 deletions packages/providers/google/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-google"
version = "0.3.3"
version = "0.3.6"
description = "Google (Gemini API) provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand All @@ -10,12 +10,12 @@ dependencies = ["celeste-ai", "httpx", "google-auth", "requests"]
[tool.uv.sources]
celeste-ai = { workspace = true }

[project.entry-points."celeste.providers"]
google = "celeste_google:register_provider"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["src/celeste_google"]

[project.entry-points."celeste.providers"]
google = "celeste_google:register_provider"
2 changes: 1 addition & 1 deletion packages/providers/gradium/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-gradium"
version = "0.3.3"
version = "0.3.6"
description = "Gradium provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand Down
1 change: 0 additions & 1 deletion packages/providers/gradium/src/celeste_gradium/py.typed
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@
""
2 changes: 1 addition & 1 deletion packages/providers/mistral/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-mistral"
version = "0.3.3"
version = "0.3.6"
description = "Mistral provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand Down
2 changes: 1 addition & 1 deletion packages/providers/openai/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-openai"
version = "0.3.3"
version = "0.3.6"
description = "OpenAI provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand Down
2 changes: 1 addition & 1 deletion packages/providers/xai/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-xai"
version = "0.3.3"
version = "0.3.6"
description = "xAI provider package for Celeste AI"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
license = {text = "Apache-2.0"}
Expand Down
18 changes: 9 additions & 9 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "celeste-ai"
version = "0.3.5"
version = "0.3.6"
description = "Open source, type-safe primitives for multi-modal AI. All capabilities, all providers, one interface"
authors = [{name = "Kamilbenkirane", email = "kamil@withceleste.ai"}]
readme = "README.md"
Expand Down Expand Up @@ -34,15 +34,15 @@ Repository = "https://github.com/withceleste/celeste-python"
Issues = "https://github.com/withceleste/celeste-python/issues"

[project.optional-dependencies]
text-generation = ["celeste-text-generation>=0.3.3"]
image-generation = ["celeste-image-generation>=0.3.3"]
video-generation = ["celeste-video-generation>=0.3.3"]
speech-generation = ["celeste-speech-generation>=0.3.3"]
text-generation = ["celeste-text-generation>=0.3.6"]
image-generation = ["celeste-image-generation>=0.3.6"]
video-generation = ["celeste-video-generation>=0.3.6"]
speech-generation = ["celeste-speech-generation>=0.3.6"]
all = [
"celeste-text-generation>=0.3.3",
"celeste-image-generation>=0.3.3",
"celeste-video-generation>=0.3.3",
"celeste-speech-generation>=0.3.3",
"celeste-text-generation>=0.3.6",
"celeste-image-generation>=0.3.6",
"celeste-video-generation>=0.3.6",
"celeste-speech-generation>=0.3.6",
]

[dependency-groups]
Expand Down
26 changes: 24 additions & 2 deletions src/celeste/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import warnings

from pydantic import SecretStr

Expand All @@ -21,7 +22,7 @@
ValidationError,
)
from celeste.http import HTTPClient, close_all_http_clients
from celeste.io import Input, Output, Usage
from celeste.io import Input, Output, Usage, get_input_class, register_input
from celeste.models import Model, get_model, list_models, register_models
from celeste.parameters import Parameters
from celeste.registry import _load_from_entry_points
Expand Down Expand Up @@ -71,7 +72,26 @@ def _resolve_model(
if isinstance(model, str):
found = get_model(model, provider)
if not found:
raise ModelNotFoundError(model_id=model, provider=provider)
if provider is None:
raise ModelNotFoundError(model_id=model, provider=provider)
if capability is None:
msg = (
f"Model '{model}' not registered. Specify 'capability' explicitly."
)
raise ValueError(msg)
warnings.warn(
f"Model '{model}' not registered in Celeste for provider {provider.value}. "
"Parameter validation disabled.",
UserWarning,
stacklevel=3,
)
return Model(
id=model,
provider=provider,
display_name=model,
capabilities={capability},
streaming=True,
)
return found

return model
Expand Down Expand Up @@ -169,9 +189,11 @@ def create_client(
"close_all_ws_clients",
"create_client",
"get_client_class",
"get_input_class",
"get_model",
"image_to_data_uri",
"list_models",
"register_client",
"register_input",
"register_models",
]
28 changes: 27 additions & 1 deletion src/celeste/io.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

from pydantic import BaseModel, Field

from celeste.core import Capability


class Input(BaseModel):
"""Base class for capability-specific input types."""
Expand Down Expand Up @@ -41,4 +43,28 @@ class Chunk[Content](BaseModel):
metadata: dict[str, Any] = Field(default_factory=dict)


__all__ = ["Chunk", "FinishReason", "Input", "Output", "Usage"]
_inputs: dict[Capability, type[Input]] = {}


def register_input(capability: Capability, input_class: type[Input]) -> None:
"""Register an Input class for a capability."""
_inputs[capability] = input_class


def get_input_class(capability: Capability) -> type[Input]:
"""Get the registered Input class for a capability."""
if capability not in _inputs:
msg = f"No Input class registered for capability: {capability}"
raise KeyError(msg)
return _inputs[capability]


__all__ = [
"Chunk",
"FinishReason",
"Input",
"Output",
"Usage",
"get_input_class",
"register_input",
]
Loading
Loading