ai_api_unified 2.5.2__tar.gz → 2.5.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/PKG-INFO +1 -1
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/pyproject.toml +1 -1
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/__version__.py +1 -1
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/ai_google_gemini_videos.py +31 -4
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/LICENSE +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/README.md +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/__init__.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_base.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_bedrock_base.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_completions_exceptions.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_factory.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_google_base.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_openai_base.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_provider_exceptions.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_provider_loader.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_provider_registry.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/__init__.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/ai_bedrock_completions.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/ai_google_gemini_capabilities.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/ai_google_gemini_completions.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/ai_openai_completions.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/__init__.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/ai_google_gemini_embeddings.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/ai_openai_embeddings.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/ai_titan_embeddings.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/__init__.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/ai_bedrock_images.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/ai_google_gemini_images.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/ai_openai_images.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/__init__.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/__init__.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/_presidio_redactor.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/base_redactor.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/custom_recognizer_factory.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/middleware_extensibility_poc.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/noop_redactor.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/presidio_log_control.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/middleware.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/middleware_config.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/observability.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/observability_runtime.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/pii_redactor.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/redaction_exceptions.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/__init__.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/_lazy_pydub.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/env_settings.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/package_metadata_validation.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/utils.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/__init__.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/ai_bedrock_videos.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/ai_openai_videos.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/frame_helpers.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/__init__.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_azure.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_base.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_elevenlabs.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_factory.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_google.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_google_gemini_voices.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_openai.py +0 -0
- {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/audio_models.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: ai_api_unified
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.3
|
|
4
4
|
Summary: Unified access layer for AI completions (LLM), embedding (semantic), image, video, and voice services
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: llm,openai,bedrock,gemini,vertex,embeddings,completion,video,voice,api
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
[project]
|
|
37
37
|
name = "ai_api_unified"
|
|
38
38
|
|
|
39
|
-
version = "2.5.
|
|
39
|
+
version = "2.5.3" # keep in sync with src/ai_api_unified/__version__.py
|
|
40
40
|
description = "Unified access layer for AI completions (LLM), embedding (semantic), image, video, and voice services"
|
|
41
41
|
authors = [{ name = "Dave Thomas", email = "davidcthomas@gmail.com" }]
|
|
42
42
|
license = "MIT"
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/ai_google_gemini_videos.py
RENAMED
|
@@ -40,14 +40,18 @@ class AIGoogleGeminiVideoProperties(AIBaseVideoProperties):
|
|
|
40
40
|
last_frame_image: AIMediaReference | None = None
|
|
41
41
|
person_generation: str | None = None
|
|
42
42
|
generate_audio: bool | None = None
|
|
43
|
+
negative_prompt: str | None = None
|
|
44
|
+
enhance_prompt: bool | None = None
|
|
45
|
+
output_gcs_uri: str | None = None
|
|
46
|
+
compression_quality: str | None = None
|
|
43
47
|
|
|
44
48
|
_ALLOWED_ASPECT_RATIOS: ClassVar[set[str]] = {"16:9", "9:16"}
|
|
45
|
-
_ALLOWED_RESOLUTIONS: ClassVar[set[str]] = {"720p", "1080p"
|
|
49
|
+
_ALLOWED_RESOLUTIONS: ClassVar[set[str]] = {"720p", "1080p"}
|
|
46
50
|
_ALLOWED_PERSON_GENERATION: ClassVar[set[str]] = {
|
|
47
51
|
"dont_allow",
|
|
48
52
|
"allow_adult",
|
|
49
|
-
"allow_all",
|
|
50
53
|
}
|
|
54
|
+
_ALLOWED_COMPRESSION_QUALITY: ClassVar[set[str]] = {"OPTIMIZED", "LOSSLESS"}
|
|
51
55
|
|
|
52
56
|
@model_validator(mode="after")
|
|
53
57
|
def _validate_google_video_properties(self) -> "AIGoogleGeminiVideoProperties":
|
|
@@ -68,14 +72,27 @@ class AIGoogleGeminiVideoProperties(AIBaseVideoProperties):
|
|
|
68
72
|
and self.resolution not in self._ALLOWED_RESOLUTIONS
|
|
69
73
|
):
|
|
70
74
|
raise ValueError(
|
|
71
|
-
"Google Gemini video resolution must be one of 720p
|
|
75
|
+
"Google Gemini video resolution must be one of 720p or 1080p."
|
|
72
76
|
)
|
|
73
77
|
if (
|
|
74
78
|
self.person_generation is not None
|
|
75
79
|
and self.person_generation not in self._ALLOWED_PERSON_GENERATION
|
|
76
80
|
):
|
|
77
81
|
raise ValueError(
|
|
78
|
-
"Google Gemini person_generation must be one of dont_allow
|
|
82
|
+
"Google Gemini person_generation must be one of dont_allow or allow_adult."
|
|
83
|
+
)
|
|
84
|
+
if self.compression_quality is not None:
|
|
85
|
+
normalized: str = self.compression_quality.upper()
|
|
86
|
+
if normalized not in self._ALLOWED_COMPRESSION_QUALITY:
|
|
87
|
+
raise ValueError(
|
|
88
|
+
"Google Gemini compression_quality must be 'OPTIMIZED' or 'LOSSLESS'."
|
|
89
|
+
)
|
|
90
|
+
self.compression_quality = normalized
|
|
91
|
+
if self.output_gcs_uri is not None and not self.output_gcs_uri.startswith(
|
|
92
|
+
"gs://"
|
|
93
|
+
):
|
|
94
|
+
raise ValueError(
|
|
95
|
+
"Google Gemini output_gcs_uri must be a gs:// URI."
|
|
79
96
|
)
|
|
80
97
|
return self
|
|
81
98
|
|
|
@@ -372,6 +389,16 @@ class AIGoogleGeminiVideos(AIGoogleBase, AIBaseVideos):
|
|
|
372
389
|
config_kwargs["generate_audio"] = google_properties.generate_audio
|
|
373
390
|
if google_properties.person_generation is not None:
|
|
374
391
|
config_kwargs["person_generation"] = google_properties.person_generation
|
|
392
|
+
if google_properties.negative_prompt is not None:
|
|
393
|
+
config_kwargs["negative_prompt"] = google_properties.negative_prompt
|
|
394
|
+
if google_properties.enhance_prompt is not None:
|
|
395
|
+
config_kwargs["enhance_prompt"] = google_properties.enhance_prompt
|
|
396
|
+
if google_properties.output_gcs_uri is not None:
|
|
397
|
+
config_kwargs["output_gcs_uri"] = google_properties.output_gcs_uri
|
|
398
|
+
if google_properties.compression_quality is not None:
|
|
399
|
+
config_kwargs["compression_quality"] = types.VideoCompressionQuality(
|
|
400
|
+
google_properties.compression_quality
|
|
401
|
+
)
|
|
375
402
|
if google_properties.last_frame_image is not None:
|
|
376
403
|
config_kwargs["last_frame"] = self._to_google_image(
|
|
377
404
|
google_properties.last_frame_image
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_completions_exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/ai_openai_embeddings.py
RENAMED
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/ai_titan_embeddings.py
RENAMED
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/ai_bedrock_images.py
RENAMED
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/ai_google_gemini_images.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/base_redactor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/noop_redactor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/middleware_config.py
RENAMED
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/observability.py
RENAMED
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/observability_runtime.py
RENAMED
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/redaction_exceptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/package_metadata_validation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/ai_bedrock_videos.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_elevenlabs.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|