From 50316f3f5c179d76cff9ae662f13c56dcc4e7ab6 Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Mon, 5 Jan 2026 11:36:51 +0100 Subject: [PATCH 1/5] docs: standardize docstrings across provider packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - client.py: "...API client with shared implementation." → "...API client mixin." - config.py: "Endpoints for X API." → "Endpoints for Provider X API." - parameters.py: Minor naming consistency --- .../anthropic/src/celeste_anthropic/messages/client.py | 2 +- .../anthropic/src/celeste_anthropic/messages/config.py | 2 +- packages/providers/bfl/src/celeste_bfl/images/client.py | 2 +- packages/providers/bfl/src/celeste_bfl/images/config.py | 2 +- .../providers/byteplus/src/celeste_byteplus/images/client.py | 2 +- .../providers/byteplus/src/celeste_byteplus/images/config.py | 2 +- .../providers/byteplus/src/celeste_byteplus/videos/client.py | 2 +- .../providers/byteplus/src/celeste_byteplus/videos/config.py | 2 +- packages/providers/cohere/src/celeste_cohere/chat/client.py | 2 +- packages/providers/cohere/src/celeste_cohere/chat/config.py | 2 +- .../elevenlabs/src/celeste_elevenlabs/text_to_speech/client.py | 2 +- .../elevenlabs/src/celeste_elevenlabs/text_to_speech/config.py | 2 +- .../src/celeste_elevenlabs/text_to_speech/parameters.py | 2 +- .../providers/google/src/celeste_google/cloud_tts/config.py | 2 +- packages/providers/google/src/celeste_google/imagen/client.py | 2 +- packages/providers/google/src/celeste_google/imagen/config.py | 2 +- packages/providers/google/src/celeste_google/veo/client.py | 2 +- packages/providers/google/src/celeste_google/veo/config.py | 2 +- .../gradium/src/celeste_gradium/text_to_speech/client.py | 2 +- .../gradium/src/celeste_gradium/text_to_speech/config.py | 2 +- .../gradium/src/celeste_gradium/text_to_speech/parameters.py | 2 +- packages/providers/mistral/src/celeste_mistral/chat/client.py | 2 +- packages/providers/mistral/src/celeste_mistral/chat/config.py | 2 +- packages/providers/openai/src/celeste_openai/audio/client.py | 2 +- packages/providers/openai/src/celeste_openai/audio/config.py | 2 +- packages/providers/openai/src/celeste_openai/images/config.py | 2 +- .../providers/openai/src/celeste_openai/responses/client.py | 2 +- .../providers/openai/src/celeste_openai/responses/config.py | 2 +- packages/providers/openai/src/celeste_openai/videos/config.py | 2 +- packages/providers/xai/src/celeste_xai/responses/client.py | 2 +- packages/providers/xai/src/celeste_xai/responses/config.py | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/packages/providers/anthropic/src/celeste_anthropic/messages/client.py b/packages/providers/anthropic/src/celeste_anthropic/messages/client.py index cab5b1b7..8b72f4bc 100644 --- a/packages/providers/anthropic/src/celeste_anthropic/messages/client.py +++ b/packages/providers/anthropic/src/celeste_anthropic/messages/client.py @@ -1,4 +1,4 @@ -"""Anthropic Messages API client with shared implementation.""" +"""Anthropic Messages API client mixin.""" from collections.abc import AsyncIterator from typing import Any diff --git a/packages/providers/anthropic/src/celeste_anthropic/messages/config.py b/packages/providers/anthropic/src/celeste_anthropic/messages/config.py index de7ed7e9..3199bed8 100644 --- a/packages/providers/anthropic/src/celeste_anthropic/messages/config.py +++ b/packages/providers/anthropic/src/celeste_anthropic/messages/config.py @@ -4,7 +4,7 @@ class AnthropicMessagesEndpoint(StrEnum): - """Endpoints for Messages API.""" + """Endpoints for Anthropic Messages API.""" CREATE_MESSAGE = "/v1/messages" COUNT_MESSAGE_TOKENS = "/v1/messages/count_tokens" diff --git a/packages/providers/bfl/src/celeste_bfl/images/client.py b/packages/providers/bfl/src/celeste_bfl/images/client.py index c9bff5cf..d2a917a5 100644 --- a/packages/providers/bfl/src/celeste_bfl/images/client.py +++ b/packages/providers/bfl/src/celeste_bfl/images/client.py @@ -1,4 +1,4 @@ -"""BFL Images API client with shared implementation.""" +"""BFL Images API client mixin.""" import asyncio import time diff --git a/packages/providers/bfl/src/celeste_bfl/images/config.py b/packages/providers/bfl/src/celeste_bfl/images/config.py index b9f55cdc..37fe91d5 100644 --- a/packages/providers/bfl/src/celeste_bfl/images/config.py +++ b/packages/providers/bfl/src/celeste_bfl/images/config.py @@ -4,7 +4,7 @@ class BFLImagesEndpoint(StrEnum): - """Endpoints for Images API.""" + """Endpoints for BFL Images API.""" CREATE_IMAGE = "/v1/{model_id}" diff --git a/packages/providers/byteplus/src/celeste_byteplus/images/client.py b/packages/providers/byteplus/src/celeste_byteplus/images/client.py index 164e42e0..e21a5c3e 100644 --- a/packages/providers/byteplus/src/celeste_byteplus/images/client.py +++ b/packages/providers/byteplus/src/celeste_byteplus/images/client.py @@ -1,4 +1,4 @@ -"""BytePlus Images API client with shared implementation.""" +"""BytePlus Images API client mixin.""" from collections.abc import AsyncIterator from typing import Any diff --git a/packages/providers/byteplus/src/celeste_byteplus/images/config.py b/packages/providers/byteplus/src/celeste_byteplus/images/config.py index 62411e9f..719204e3 100644 --- a/packages/providers/byteplus/src/celeste_byteplus/images/config.py +++ b/packages/providers/byteplus/src/celeste_byteplus/images/config.py @@ -4,7 +4,7 @@ class BytePlusImagesEndpoint(StrEnum): - """Endpoints for Images API.""" + """Endpoints for BytePlus Images API.""" CREATE_IMAGE = "/api/v3/images/generations" diff --git a/packages/providers/byteplus/src/celeste_byteplus/videos/client.py b/packages/providers/byteplus/src/celeste_byteplus/videos/client.py index 3cf12b9d..d79f56fe 100644 --- a/packages/providers/byteplus/src/celeste_byteplus/videos/client.py +++ b/packages/providers/byteplus/src/celeste_byteplus/videos/client.py @@ -1,4 +1,4 @@ -"""BytePlus Videos API client with shared implementation.""" +"""BytePlus Videos API client mixin.""" import asyncio import logging diff --git a/packages/providers/byteplus/src/celeste_byteplus/videos/config.py b/packages/providers/byteplus/src/celeste_byteplus/videos/config.py index 607acd05..ffcf686f 100644 --- a/packages/providers/byteplus/src/celeste_byteplus/videos/config.py +++ b/packages/providers/byteplus/src/celeste_byteplus/videos/config.py @@ -4,7 +4,7 @@ class BytePlusVideosEndpoint(StrEnum): - """Endpoints for Videos API.""" + """Endpoints for BytePlus Videos API.""" CREATE_VIDEO = "/api/v3/contents/generations/tasks" GET_VIDEO_STATUS = "/api/v3/contents/generations/tasks/{task_id}" diff --git a/packages/providers/cohere/src/celeste_cohere/chat/client.py b/packages/providers/cohere/src/celeste_cohere/chat/client.py index e3e4a3da..6db81ace 100644 --- a/packages/providers/cohere/src/celeste_cohere/chat/client.py +++ b/packages/providers/cohere/src/celeste_cohere/chat/client.py @@ -1,4 +1,4 @@ -"""Cohere Chat API client with shared implementation.""" +"""Cohere Chat API client mixin.""" from collections.abc import AsyncIterator from typing import Any diff --git a/packages/providers/cohere/src/celeste_cohere/chat/config.py b/packages/providers/cohere/src/celeste_cohere/chat/config.py index fc6e2c92..bc0a3720 100644 --- a/packages/providers/cohere/src/celeste_cohere/chat/config.py +++ b/packages/providers/cohere/src/celeste_cohere/chat/config.py @@ -4,7 +4,7 @@ class CohereChatEndpoint(StrEnum): - """Endpoints for Chat API.""" + """Endpoints for Cohere Chat API.""" CREATE_CHAT = "/v2/chat" LIST_MODELS = "/v2/models" diff --git a/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/client.py b/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/client.py index e9d1e62f..2b2fb3c3 100644 --- a/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/client.py +++ b/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/client.py @@ -1,4 +1,4 @@ -"""ElevenLabs Text-to-Speech API client with shared implementation.""" +"""ElevenLabs TextToSpeech API client mixin.""" from collections.abc import AsyncIterator from typing import Any diff --git a/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/config.py b/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/config.py index 5b0a989d..92454111 100644 --- a/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/config.py +++ b/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/config.py @@ -4,7 +4,7 @@ class ElevenLabsTextToSpeechEndpoint(StrEnum): - """Endpoints for Text-to-Speech API.""" + """Endpoints for ElevenLabs Text-to-Speech API.""" CREATE_SPEECH = "/v1/text-to-speech/{voice_id}" STREAM_SPEECH = "/v1/text-to-speech/{voice_id}/stream" diff --git a/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/parameters.py b/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/parameters.py index 22d691e2..d478fb7a 100644 --- a/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/parameters.py +++ b/packages/providers/elevenlabs/src/celeste_elevenlabs/text_to_speech/parameters.py @@ -1,4 +1,4 @@ -"""ElevenLabs Text To Speech API parameter mappers.""" +"""ElevenLabs TextToSpeech API parameter mappers.""" from typing import Any diff --git a/packages/providers/google/src/celeste_google/cloud_tts/config.py b/packages/providers/google/src/celeste_google/cloud_tts/config.py index 5ba43d34..18f0ff31 100644 --- a/packages/providers/google/src/celeste_google/cloud_tts/config.py +++ b/packages/providers/google/src/celeste_google/cloud_tts/config.py @@ -4,7 +4,7 @@ class GoogleCloudTTSEndpoint(StrEnum): - """Endpoints for CloudTTS API.""" + """Endpoints for Google CloudTTS API.""" CREATE_SPEECH = "/v1/text:synthesize" LIST_VOICES = "/v1/voices" diff --git a/packages/providers/google/src/celeste_google/imagen/client.py b/packages/providers/google/src/celeste_google/imagen/client.py index ae91eb2d..4ef9251c 100644 --- a/packages/providers/google/src/celeste_google/imagen/client.py +++ b/packages/providers/google/src/celeste_google/imagen/client.py @@ -1,4 +1,4 @@ -"""Google Imagen API client with shared implementation.""" +"""Google Imagen API client mixin.""" from typing import Any diff --git a/packages/providers/google/src/celeste_google/imagen/config.py b/packages/providers/google/src/celeste_google/imagen/config.py index f447051f..f2d16c48 100644 --- a/packages/providers/google/src/celeste_google/imagen/config.py +++ b/packages/providers/google/src/celeste_google/imagen/config.py @@ -4,7 +4,7 @@ class GoogleImagenEndpoint(StrEnum): - """Endpoints for Imagen API.""" + """Endpoints for Google Imagen API.""" CREATE_IMAGE = "/v1beta/models/{model_id}:predict" diff --git a/packages/providers/google/src/celeste_google/veo/client.py b/packages/providers/google/src/celeste_google/veo/client.py index a48d590c..8797ecbb 100644 --- a/packages/providers/google/src/celeste_google/veo/client.py +++ b/packages/providers/google/src/celeste_google/veo/client.py @@ -1,4 +1,4 @@ -"""Google Veo API client with shared implementation.""" +"""Google Veo API client mixin.""" import asyncio import json diff --git a/packages/providers/google/src/celeste_google/veo/config.py b/packages/providers/google/src/celeste_google/veo/config.py index 41405db0..4c773fea 100644 --- a/packages/providers/google/src/celeste_google/veo/config.py +++ b/packages/providers/google/src/celeste_google/veo/config.py @@ -4,7 +4,7 @@ class GoogleVeoEndpoint(StrEnum): - """Endpoints for Veo API.""" + """Endpoints for Google Veo API.""" CREATE_VIDEO = "/v1beta/models/{model_id}:predictLongRunning" GET_OPERATION = "/v1beta/{operation_name}" diff --git a/packages/providers/gradium/src/celeste_gradium/text_to_speech/client.py b/packages/providers/gradium/src/celeste_gradium/text_to_speech/client.py index 49fe03a4..471edadc 100644 --- a/packages/providers/gradium/src/celeste_gradium/text_to_speech/client.py +++ b/packages/providers/gradium/src/celeste_gradium/text_to_speech/client.py @@ -1,4 +1,4 @@ -"""Gradium Text-to-Speech API client with shared implementation.""" +"""Gradium TextToSpeech API client mixin.""" import base64 import json diff --git a/packages/providers/gradium/src/celeste_gradium/text_to_speech/config.py b/packages/providers/gradium/src/celeste_gradium/text_to_speech/config.py index 7db027f6..0cd72f1e 100644 --- a/packages/providers/gradium/src/celeste_gradium/text_to_speech/config.py +++ b/packages/providers/gradium/src/celeste_gradium/text_to_speech/config.py @@ -4,7 +4,7 @@ class GradiumTextToSpeechEndpoint(StrEnum): - """Endpoints for Text-to-Speech API.""" + """Endpoints for Gradium Text-to-Speech API.""" CREATE_SPEECH = "/speech/tts" diff --git a/packages/providers/gradium/src/celeste_gradium/text_to_speech/parameters.py b/packages/providers/gradium/src/celeste_gradium/text_to_speech/parameters.py index 71f79dec..0c4b5588 100644 --- a/packages/providers/gradium/src/celeste_gradium/text_to_speech/parameters.py +++ b/packages/providers/gradium/src/celeste_gradium/text_to_speech/parameters.py @@ -1,4 +1,4 @@ -"""Gradium TTS API parameter mappers.""" +"""Gradium TextToSpeech API parameter mappers.""" from typing import Any diff --git a/packages/providers/mistral/src/celeste_mistral/chat/client.py b/packages/providers/mistral/src/celeste_mistral/chat/client.py index 6cc026cc..f8fb8cb5 100644 --- a/packages/providers/mistral/src/celeste_mistral/chat/client.py +++ b/packages/providers/mistral/src/celeste_mistral/chat/client.py @@ -1,4 +1,4 @@ -"""Mistral Chat API client with shared implementation.""" +"""Mistral Chat API client mixin.""" from collections.abc import AsyncIterator from typing import Any diff --git a/packages/providers/mistral/src/celeste_mistral/chat/config.py b/packages/providers/mistral/src/celeste_mistral/chat/config.py index 27f3af68..4b32ff4a 100644 --- a/packages/providers/mistral/src/celeste_mistral/chat/config.py +++ b/packages/providers/mistral/src/celeste_mistral/chat/config.py @@ -4,7 +4,7 @@ class MistralChatEndpoint(StrEnum): - """Endpoints for Chat API.""" + """Endpoints for Mistral Chat API.""" CREATE_CHAT_COMPLETION = "/v1/chat/completions" CREATE_FIM_COMPLETION = "/v1/fim/completions" diff --git a/packages/providers/openai/src/celeste_openai/audio/client.py b/packages/providers/openai/src/celeste_openai/audio/client.py index 01519d83..3a78a6d2 100644 --- a/packages/providers/openai/src/celeste_openai/audio/client.py +++ b/packages/providers/openai/src/celeste_openai/audio/client.py @@ -1,4 +1,4 @@ -"""OpenAI Audio API client with shared implementation.""" +"""OpenAI Audio API client mixin.""" from typing import Any diff --git a/packages/providers/openai/src/celeste_openai/audio/config.py b/packages/providers/openai/src/celeste_openai/audio/config.py index 79369497..9f7b8b29 100644 --- a/packages/providers/openai/src/celeste_openai/audio/config.py +++ b/packages/providers/openai/src/celeste_openai/audio/config.py @@ -4,7 +4,7 @@ class OpenAIAudioEndpoint(StrEnum): - """Endpoints for Audio API.""" + """Endpoints for OpenAI Audio API.""" CREATE_SPEECH = "/v1/audio/speech" CREATE_TRANSCRIPTION = "/v1/audio/transcriptions" diff --git a/packages/providers/openai/src/celeste_openai/images/config.py b/packages/providers/openai/src/celeste_openai/images/config.py index 93f558b6..74e74ea4 100644 --- a/packages/providers/openai/src/celeste_openai/images/config.py +++ b/packages/providers/openai/src/celeste_openai/images/config.py @@ -4,7 +4,7 @@ class OpenAIImagesEndpoint(StrEnum): - """Endpoints for Images API.""" + """Endpoints for OpenAI Images API.""" CREATE_IMAGE = "/v1/images/generations" CREATE_EDIT = "/v1/images/edits" diff --git a/packages/providers/openai/src/celeste_openai/responses/client.py b/packages/providers/openai/src/celeste_openai/responses/client.py index 9cf296d9..f4a7332f 100644 --- a/packages/providers/openai/src/celeste_openai/responses/client.py +++ b/packages/providers/openai/src/celeste_openai/responses/client.py @@ -1,4 +1,4 @@ -"""OpenAI Responses API client with shared implementation.""" +"""OpenAI Responses API client mixin.""" from collections.abc import AsyncIterator from typing import Any diff --git a/packages/providers/openai/src/celeste_openai/responses/config.py b/packages/providers/openai/src/celeste_openai/responses/config.py index 0aec0e53..b448d7a6 100644 --- a/packages/providers/openai/src/celeste_openai/responses/config.py +++ b/packages/providers/openai/src/celeste_openai/responses/config.py @@ -4,7 +4,7 @@ class OpenAIResponsesEndpoint(StrEnum): - """Endpoints for Responses API.""" + """Endpoints for OpenAI Responses API.""" CREATE_RESPONSE = "/v1/responses" LIST_MODELS = "/v1/models" diff --git a/packages/providers/openai/src/celeste_openai/videos/config.py b/packages/providers/openai/src/celeste_openai/videos/config.py index ea2172a4..479ae997 100644 --- a/packages/providers/openai/src/celeste_openai/videos/config.py +++ b/packages/providers/openai/src/celeste_openai/videos/config.py @@ -4,7 +4,7 @@ class OpenAIVideosEndpoint(StrEnum): - """Endpoints for Videos API.""" + """Endpoints for OpenAI Videos API.""" CREATE_VIDEO = "/v1/videos" diff --git a/packages/providers/xai/src/celeste_xai/responses/client.py b/packages/providers/xai/src/celeste_xai/responses/client.py index 254b7c63..28d96a38 100644 --- a/packages/providers/xai/src/celeste_xai/responses/client.py +++ b/packages/providers/xai/src/celeste_xai/responses/client.py @@ -1,4 +1,4 @@ -"""XAI Responses API client with shared implementation.""" +"""xAI Responses API client mixin.""" from collections.abc import AsyncIterator from typing import Any diff --git a/packages/providers/xai/src/celeste_xai/responses/config.py b/packages/providers/xai/src/celeste_xai/responses/config.py index d640927d..d38c6ac2 100644 --- a/packages/providers/xai/src/celeste_xai/responses/config.py +++ b/packages/providers/xai/src/celeste_xai/responses/config.py @@ -4,7 +4,7 @@ class XAIResponsesEndpoint(StrEnum): - """Endpoints for Responses API.""" + """Endpoints for XAI Responses API.""" CREATE_RESPONSE = "/v1/responses" LIST_MODELS = "/v1/models" From 8aa40557b0ad86af1e375d34444d7dd573461f1e Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Mon, 5 Jan 2026 11:37:37 +0100 Subject: [PATCH 2/5] feat(text-generation): add web_search, x_search, and code_execution parameters MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add WEB_SEARCH, X_SEARCH, CODE_EXECUTION to TextGenerationParameter - Google: web_search support - OpenAI: web_search support - xAI: web_search, x_search, code_execution support - Fix THINKING_LEVEL → THINKING_BUDGET for grok-3-mini model --- .../src/celeste_text_generation/parameters.py | 6 +++++ .../providers/google/models.py | 7 +++++- .../providers/google/parameters.py | 8 +++++++ .../providers/openai/models.py | 13 +++++++++- .../providers/openai/parameters.py | 8 +++++++ .../providers/xai/models.py | 22 +++++++++++++++-- .../providers/xai/parameters.py | 24 +++++++++++++++++++ 7 files changed, 84 insertions(+), 4 deletions(-) diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/parameters.py b/packages/capabilities/text-generation/src/celeste_text_generation/parameters.py index b8b25a34..84d4109b 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/parameters.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/parameters.py @@ -14,6 +14,9 @@ class TextGenerationParameter(StrEnum): THINKING_LEVEL = "thinking_level" OUTPUT_SCHEMA = "output_schema" VERBOSITY = "verbosity" + WEB_SEARCH = "web_search" + X_SEARCH = "x_search" + CODE_EXECUTION = "code_execution" class TextGenerationParameters(Parameters): @@ -25,3 +28,6 @@ class TextGenerationParameters(Parameters): thinking_level: str | None verbosity: str | None output_schema: type[BaseModel] | None + web_search: bool | None + x_search: bool | None + code_execution: bool | None diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/google/models.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/google/models.py index a18c0910..c4a9c149 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/google/models.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/google/models.py @@ -1,7 +1,7 @@ """Google models for text generation.""" from celeste import Model, Provider -from celeste.constraints import Choice, Range, Schema +from celeste.constraints import Bool, Choice, Range, Schema from celeste.core import Parameter from celeste_text_generation.parameters import TextGenerationParameter @@ -17,6 +17,7 @@ # Flash: allows -1 (dynamic), 0 (disable), or >= 0 TextGenerationParameter.THINKING_BUDGET: Range(min=-1, max=24576), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -32,6 +33,7 @@ min=512, max=24576, special_values=[-1, 0] ), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -47,6 +49,7 @@ min=128, max=32768, special_values=[-1] ), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -59,6 +62,7 @@ Parameter.MAX_TOKENS: Range(min=1, max=65536), TextGenerationParameter.THINKING_LEVEL: Choice(options=["low", "high"]), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -71,6 +75,7 @@ Parameter.MAX_TOKENS: Range(min=1, max=65536), TextGenerationParameter.THINKING_LEVEL: Choice(options=["low", "high"]), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), ] diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/google/parameters.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/google/parameters.py index afe79fcf..0dd3fe4a 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/google/parameters.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/google/parameters.py @@ -15,6 +15,9 @@ from celeste_google.generate_content.parameters import ( ThinkingLevelMapper as _ThinkingLevelMapper, ) +from celeste_google.generate_content.parameters import ( + WebSearchMapper as _WebSearchMapper, +) from celeste.core import Parameter from celeste.parameters import ParameterMapper @@ -41,12 +44,17 @@ class OutputSchemaMapper(_OutputSchemaMapper): name = TextGenerationParameter.OUTPUT_SCHEMA +class WebSearchMapper(_WebSearchMapper): + name = TextGenerationParameter.WEB_SEARCH + + GOOGLE_PARAMETER_MAPPERS: list[ParameterMapper] = [ TemperatureMapper(), MaxTokensMapper(), ThinkingBudgetMapper(), ThinkingLevelMapper(), OutputSchemaMapper(), + WebSearchMapper(), ] __all__ = ["GOOGLE_PARAMETER_MAPPERS"] diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/openai/models.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/openai/models.py index 8dd2fb3b..d11106d8 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/openai/models.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/openai/models.py @@ -1,7 +1,7 @@ """OpenAI models for text generation.""" from celeste import Model, Provider -from celeste.constraints import Choice, Range, Schema +from celeste.constraints import Bool, Choice, Range, Schema from celeste.core import Parameter from celeste_text_generation.parameters import TextGenerationParameter @@ -15,6 +15,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=16384), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -25,6 +26,7 @@ parameter_constraints={ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=16384), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -69,6 +71,7 @@ options=["minimal", "low", "medium", "high"] ), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -82,6 +85,7 @@ options=["minimal", "low", "medium", "high", "xhigh"] ), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -98,6 +102,7 @@ options=["low", "medium", "high"] ), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -108,6 +113,7 @@ parameter_constraints={ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=128000), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -124,6 +130,7 @@ options=["low", "medium", "high"] ), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -140,6 +147,7 @@ options=["low", "medium", "high"] ), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -153,6 +161,7 @@ options=["minimal", "low", "medium", "high"] ), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -166,6 +175,7 @@ options=["minimal", "low", "medium", "high"] ), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -177,6 +187,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=32768), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), ] diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/openai/parameters.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/openai/parameters.py index b86a0068..1d4cad21 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/openai/parameters.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/openai/parameters.py @@ -15,6 +15,9 @@ from celeste_openai.responses.parameters import ( VerbosityMapper as _VerbosityMapper, ) +from celeste_openai.responses.parameters import ( + WebSearchMapper as _WebSearchMapper, +) from celeste.core import Parameter from celeste.parameters import ParameterMapper @@ -41,12 +44,17 @@ class OutputSchemaMapper(_OutputSchemaMapper): name = TextGenerationParameter.OUTPUT_SCHEMA +class WebSearchMapper(_WebSearchMapper): + name = TextGenerationParameter.WEB_SEARCH + + OPENAI_PARAMETER_MAPPERS: list[ParameterMapper] = [ TemperatureMapper(), MaxTokensMapper(), ThinkingBudgetMapper(), VerbosityMapper(), OutputSchemaMapper(), + WebSearchMapper(), ] __all__ = ["OPENAI_PARAMETER_MAPPERS"] diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/xai/models.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/xai/models.py index 449e66e6..21fbd374 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/xai/models.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/xai/models.py @@ -1,7 +1,7 @@ """XAI models for text generation.""" from celeste import Model, Provider -from celeste.constraints import Choice, Range, Schema +from celeste.constraints import Bool, Choice, Range, Schema from celeste.core import Parameter from celeste_text_generation.parameters import TextGenerationParameter @@ -15,6 +15,9 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=30000), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), + TextGenerationParameter.X_SEARCH: Bool(), + TextGenerationParameter.CODE_EXECUTION: Bool(), }, ), Model( @@ -26,6 +29,9 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=30000), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), + TextGenerationParameter.X_SEARCH: Bool(), + TextGenerationParameter.CODE_EXECUTION: Bool(), }, ), Model( @@ -37,6 +43,9 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=30000), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), + TextGenerationParameter.X_SEARCH: Bool(), + TextGenerationParameter.CODE_EXECUTION: Bool(), }, ), Model( @@ -48,6 +57,9 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=30000), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), + TextGenerationParameter.X_SEARCH: Bool(), + TextGenerationParameter.CODE_EXECUTION: Bool(), }, ), Model( @@ -59,6 +71,9 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=64000), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), + TextGenerationParameter.X_SEARCH: Bool(), + TextGenerationParameter.CODE_EXECUTION: Bool(), }, ), Model( @@ -69,8 +84,11 @@ parameter_constraints={ Parameter.TEMPERATURE: Range(min=0.0, max=2.0), Parameter.MAX_TOKENS: Range(min=1, max=16000), - TextGenerationParameter.THINKING_LEVEL: Choice(options=["low", "high"]), + TextGenerationParameter.THINKING_BUDGET: Choice(options=["low", "high"]), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), + TextGenerationParameter.X_SEARCH: Bool(), + TextGenerationParameter.CODE_EXECUTION: Bool(), }, ), ] diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/xai/parameters.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/xai/parameters.py index 7bf92a96..e9f0afc8 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/xai/parameters.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/xai/parameters.py @@ -1,5 +1,8 @@ """XAI Responses parameter mappers for text generation.""" +from celeste_xai.responses.parameters import ( + CodeExecutionMapper as _CodeExecutionMapper, +) from celeste_xai.responses.parameters import ( MaxTokensMapper as _MaxTokensMapper, ) @@ -12,6 +15,12 @@ from celeste_xai.responses.parameters import ( TemperatureMapper as _TemperatureMapper, ) +from celeste_xai.responses.parameters import ( + WebSearchMapper as _WebSearchMapper, +) +from celeste_xai.responses.parameters import ( + XSearchMapper as _XSearchMapper, +) from celeste.core import Parameter from celeste.parameters import ParameterMapper @@ -34,11 +43,26 @@ class OutputSchemaMapper(_OutputSchemaMapper): name = TextGenerationParameter.OUTPUT_SCHEMA +class WebSearchMapper(_WebSearchMapper): + name = TextGenerationParameter.WEB_SEARCH + + +class XSearchMapper(_XSearchMapper): + name = TextGenerationParameter.X_SEARCH + + +class CodeExecutionMapper(_CodeExecutionMapper): + name = TextGenerationParameter.CODE_EXECUTION + + XAI_PARAMETER_MAPPERS: list[ParameterMapper] = [ TemperatureMapper(), MaxTokensMapper(), ThinkingBudgetMapper(), OutputSchemaMapper(), + WebSearchMapper(), + XSearchMapper(), + CodeExecutionMapper(), ] __all__ = ["XAI_PARAMETER_MAPPERS"] From 86471c00590546b4ca0f654d7bf8aaadc6a281d1 Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Mon, 5 Jan 2026 12:13:27 +0100 Subject: [PATCH 3/5] feat(text-generation): add web_search parameter for Anthropic - Add WEB_SEARCH constraint to all Claude models - Implement WebSearchMapper using web_search_20250305 tool type --- .../providers/anthropic/models.py | 8 ++++++- .../providers/anthropic/parameters.py | 8 +++++++ .../celeste_anthropic/messages/parameters.py | 22 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/anthropic/models.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/anthropic/models.py index 517d97b9..53c3a1d3 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/anthropic/models.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/anthropic/models.py @@ -1,7 +1,7 @@ """Anthropic models for text generation.""" from celeste import Model, Provider -from celeste.constraints import Range, Schema +from celeste.constraints import Bool, Range, Schema from celeste.core import Parameter from celeste_text_generation.parameters import TextGenerationParameter @@ -15,6 +15,7 @@ Parameter.MAX_TOKENS: Range(min=1, max=64000), TextGenerationParameter.THINKING_BUDGET: Range(min=-1, max=64000), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -25,6 +26,7 @@ parameter_constraints={ Parameter.MAX_TOKENS: Range(min=1, max=64000), TextGenerationParameter.THINKING_BUDGET: Range(min=-1, max=32000), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -36,6 +38,7 @@ Parameter.MAX_TOKENS: Range(min=1, max=32000), TextGenerationParameter.THINKING_BUDGET: Range(min=-1, max=32000), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -47,6 +50,7 @@ Parameter.MAX_TOKENS: Range(min=1, max=64000), TextGenerationParameter.THINKING_BUDGET: Range(min=-1, max=32000), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -57,6 +61,7 @@ parameter_constraints={ Parameter.MAX_TOKENS: Range(min=1, max=64000), TextGenerationParameter.THINKING_BUDGET: Range(min=-1, max=64000), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -67,6 +72,7 @@ parameter_constraints={ Parameter.MAX_TOKENS: Range(min=1, max=32000), TextGenerationParameter.THINKING_BUDGET: Range(min=-1, max=32000), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), ] diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/anthropic/parameters.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/anthropic/parameters.py index 4cd0ee9c..9dc71e4b 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/anthropic/parameters.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/anthropic/parameters.py @@ -14,6 +14,9 @@ from celeste_anthropic.messages.parameters import ( ThinkingMapper as _ThinkingMapper, ) +from celeste_anthropic.messages.parameters import ( + WebSearchMapper as _WebSearchMapper, +) from celeste.core import Parameter from celeste.models import Model @@ -58,11 +61,16 @@ class OutputSchemaMapper(_OutputSchemaMapper): name = TextGenerationParameter.OUTPUT_SCHEMA +class WebSearchMapper(_WebSearchMapper): + name = TextGenerationParameter.WEB_SEARCH + + ANTHROPIC_PARAMETER_MAPPERS: list[ParameterMapper] = [ TemperatureMapper(), MaxTokensMapper(), ThinkingBudgetMapper(), OutputSchemaMapper(), + WebSearchMapper(), ] __all__ = ["ANTHROPIC_PARAMETER_MAPPERS"] diff --git a/packages/providers/anthropic/src/celeste_anthropic/messages/parameters.py b/packages/providers/anthropic/src/celeste_anthropic/messages/parameters.py index e948254f..f32dfd63 100644 --- a/packages/providers/anthropic/src/celeste_anthropic/messages/parameters.py +++ b/packages/providers/anthropic/src/celeste_anthropic/messages/parameters.py @@ -127,6 +127,27 @@ def map( return request +class WebSearchMapper(ParameterMapper): + """Map web_search to Anthropic tools field.""" + + def map( + self, + request: dict[str, Any], + value: object, + model: Model, + ) -> dict[str, Any]: + """Transform web_search into provider request.""" + validated_value = self._validate_value(value, model) + if not validated_value: + return request + + request.setdefault("tools", []).append({ + "type": "web_search_20250305", + "name": "web_search", + }) + return request + + class OutputSchemaMapper(ParameterMapper): """Map output_schema to Anthropic native structured outputs (output_format). @@ -202,4 +223,5 @@ def parse_output( "ThinkingMapper", "TopKMapper", "TopPMapper", + "WebSearchMapper", ] From 62e225aee856a0c1a0933801d30fc9fd41f02d63 Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Mon, 5 Jan 2026 12:29:03 +0100 Subject: [PATCH 4/5] feat(text-generation): add web_search parameter for Mistral - Add WEB_SEARCH constraint to all Mistral models - Implement WebSearchMapper using brave_web_search connector - Fix Google generate_content docstrings for consistency --- .../providers/mistral/models.py | 18 ++++++++++++++++- .../providers/mistral/parameters.py | 8 ++++++++ .../celeste_google/generate_content/client.py | 2 +- .../celeste_google/generate_content/config.py | 2 +- .../generate_content/parameters.py | 2 +- .../src/celeste_mistral/chat/parameters.py | 20 ++++++++++++++++++- 6 files changed, 47 insertions(+), 5 deletions(-) diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/mistral/models.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/mistral/models.py index 91b557d9..c1478d4c 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/mistral/models.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/mistral/models.py @@ -1,7 +1,7 @@ """Mistral models for text generation.""" from celeste import Model, Provider -from celeste.constraints import Range, Schema +from celeste.constraints import Bool, Range, Schema from celeste.core import Parameter from celeste_text_generation.parameters import TextGenerationParameter @@ -15,6 +15,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -26,6 +27,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -37,6 +39,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -48,6 +51,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -59,6 +63,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -70,6 +75,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -81,6 +87,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -92,6 +99,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -103,6 +111,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -114,6 +123,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -125,6 +135,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -136,6 +147,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -147,6 +159,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -158,6 +171,7 @@ Parameter.TEMPERATURE: Range(min=0.0, max=2.0, step=0.01), Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -170,6 +184,7 @@ Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.THINKING_BUDGET: Range(min=-1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), Model( @@ -182,6 +197,7 @@ Parameter.MAX_TOKENS: Range(min=1, max=32768, step=1), TextGenerationParameter.THINKING_BUDGET: Range(min=-1, max=32768, step=1), TextGenerationParameter.OUTPUT_SCHEMA: Schema(), + TextGenerationParameter.WEB_SEARCH: Bool(), }, ), ] diff --git a/packages/capabilities/text-generation/src/celeste_text_generation/providers/mistral/parameters.py b/packages/capabilities/text-generation/src/celeste_text_generation/providers/mistral/parameters.py index 79776f3c..ec684a6c 100644 --- a/packages/capabilities/text-generation/src/celeste_text_generation/providers/mistral/parameters.py +++ b/packages/capabilities/text-generation/src/celeste_text_generation/providers/mistral/parameters.py @@ -11,6 +11,9 @@ from celeste_mistral.chat.parameters import ( TemperatureMapper as _TemperatureMapper, ) +from celeste_mistral.chat.parameters import ( + WebSearchMapper as _WebSearchMapper, +) from celeste.core import Parameter from celeste.models import Model @@ -62,11 +65,16 @@ class OutputSchemaMapper(_OutputSchemaMapper): name = TextGenerationParameter.OUTPUT_SCHEMA +class WebSearchMapper(_WebSearchMapper): + name = TextGenerationParameter.WEB_SEARCH + + MISTRAL_PARAMETER_MAPPERS: list[ParameterMapper] = [ TemperatureMapper(), MaxTokensMapper(), ThinkingBudgetMapper(), OutputSchemaMapper(), + WebSearchMapper(), ] __all__ = ["MISTRAL_PARAMETER_MAPPERS"] diff --git a/packages/providers/google/src/celeste_google/generate_content/client.py b/packages/providers/google/src/celeste_google/generate_content/client.py index 0ac3426f..232574e6 100644 --- a/packages/providers/google/src/celeste_google/generate_content/client.py +++ b/packages/providers/google/src/celeste_google/generate_content/client.py @@ -1,4 +1,4 @@ -"""Google GenerateContent API client with shared implementation.""" +"""Google GenerateContent API client mixin.""" from collections.abc import AsyncIterator from typing import Any diff --git a/packages/providers/google/src/celeste_google/generate_content/config.py b/packages/providers/google/src/celeste_google/generate_content/config.py index 1075ea7a..9787afc2 100644 --- a/packages/providers/google/src/celeste_google/generate_content/config.py +++ b/packages/providers/google/src/celeste_google/generate_content/config.py @@ -4,7 +4,7 @@ class GoogleGenerateContentEndpoint(StrEnum): - """Endpoints for GenerateContent API.""" + """Endpoints for Google GenerateContent API.""" GENERATE_CONTENT = "/v1beta/models/{model_id}:generateContent" STREAM_GENERATE_CONTENT = "/v1beta/models/{model_id}:streamGenerateContent?alt=sse" diff --git a/packages/providers/google/src/celeste_google/generate_content/parameters.py b/packages/providers/google/src/celeste_google/generate_content/parameters.py index 831cf883..d8003c2d 100644 --- a/packages/providers/google/src/celeste_google/generate_content/parameters.py +++ b/packages/providers/google/src/celeste_google/generate_content/parameters.py @@ -1,4 +1,4 @@ -"""Google Gemini API parameter mappers.""" +"""Google GenerateContent API parameter mappers.""" import base64 import json diff --git a/packages/providers/mistral/src/celeste_mistral/chat/parameters.py b/packages/providers/mistral/src/celeste_mistral/chat/parameters.py index ead366f1..433ee272 100644 --- a/packages/providers/mistral/src/celeste_mistral/chat/parameters.py +++ b/packages/providers/mistral/src/celeste_mistral/chat/parameters.py @@ -47,6 +47,24 @@ def map( return request +class WebSearchMapper(ParameterMapper): + """Map web_search to Mistral tools field.""" + + def map( + self, + request: dict[str, Any], + value: object, + model: Model, + ) -> dict[str, Any]: + """Transform web_search into provider request.""" + validated_value = self._validate_value(value, model) + if not validated_value: + return request + + request.setdefault("tools", []).append({"type": "web_search"}) + return request + + class OutputSchemaMapper(ParameterMapper): """Map output_schema to Mistral structured outputs format. @@ -111,4 +129,4 @@ def parse_output( return TypeAdapter(value).validate_python(parsed) -__all__ = ["MaxTokensMapper", "OutputSchemaMapper", "TemperatureMapper"] +__all__ = ["MaxTokensMapper", "OutputSchemaMapper", "TemperatureMapper", "WebSearchMapper"] From b0b297c67711a9a97fcc997408c43cbc8e56bed8 Mon Sep 17 00:00:00 2001 From: kamilbenkirane Date: Wed, 14 Jan 2026 14:17:35 +0100 Subject: [PATCH 5/5] feat: add 4k support and artifact base64 serialization --- .../providers/google/models.py | 4 ++-- src/celeste/artifacts.py | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/capabilities/video-generation/src/celeste_video_generation/providers/google/models.py b/packages/capabilities/video-generation/src/celeste_video_generation/providers/google/models.py index 857ebb2d..b542be83 100644 --- a/packages/capabilities/video-generation/src/celeste_video_generation/providers/google/models.py +++ b/packages/capabilities/video-generation/src/celeste_video_generation/providers/google/models.py @@ -45,7 +45,7 @@ display_name="Veo 3.1 (Preview)", parameter_constraints={ VideoGenerationParameter.ASPECT_RATIO: Choice(options=["16:9", "9:16"]), - VideoGenerationParameter.RESOLUTION: Choice(options=["720p", "1080p"]), + VideoGenerationParameter.RESOLUTION: Choice(options=["720p", "1080p", "4k"]), VideoGenerationParameter.DURATION: Choice(options=[4, 6, 8]), VideoGenerationParameter.REFERENCE_IMAGES: ImagesConstraint( supported_mime_types=VEO_SUPPORTED_MIME_TYPES, @@ -65,7 +65,7 @@ display_name="Veo 3.1 Fast (Preview)", parameter_constraints={ VideoGenerationParameter.ASPECT_RATIO: Choice(options=["16:9", "9:16"]), - VideoGenerationParameter.RESOLUTION: Choice(options=["720p", "1080p"]), + VideoGenerationParameter.RESOLUTION: Choice(options=["720p", "1080p", "4k"]), VideoGenerationParameter.DURATION: Choice(options=[4, 6, 8]), VideoGenerationParameter.FIRST_FRAME: ImageConstraint( supported_mime_types=VEO_SUPPORTED_MIME_TYPES, diff --git a/src/celeste/artifacts.py b/src/celeste/artifacts.py index 113fa1b4..55802c79 100644 --- a/src/celeste/artifacts.py +++ b/src/celeste/artifacts.py @@ -1,8 +1,9 @@ """Unified artifact types for Celeste.""" +import base64 from typing import Any -from pydantic import BaseModel, Field +from pydantic import BaseModel, Field, field_serializer from celeste.mime_types import AudioMimeType, ImageMimeType, MimeType, VideoMimeType @@ -24,6 +25,13 @@ class Artifact(BaseModel): mime_type: MimeType | None = None metadata: dict[str, Any] = Field(default_factory=dict) + @field_serializer("data") + def serialize_data(self, value: bytes | None) -> str | None: + """Serialize bytes as base64 string for JSON compatibility.""" + if value is None: + return None + return base64.b64encode(value).decode("ascii") + @property def has_content(self) -> bool: """Check if artifact has any content."""