ai_api_unified 2.5.2__tar.gz → 2.5.4__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.
Files changed (61) hide show
  1. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/PKG-INFO +1 -1
  2. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/pyproject.toml +1 -1
  3. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/__version__.py +1 -1
  4. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/videos/ai_google_gemini_videos.py +41 -7
  5. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/LICENSE +0 -0
  6. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/README.md +0 -0
  7. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/__init__.py +0 -0
  8. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/ai_base.py +0 -0
  9. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/ai_bedrock_base.py +0 -0
  10. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/ai_completions_exceptions.py +0 -0
  11. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/ai_factory.py +0 -0
  12. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/ai_google_base.py +0 -0
  13. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/ai_openai_base.py +0 -0
  14. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/ai_provider_exceptions.py +0 -0
  15. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/ai_provider_loader.py +0 -0
  16. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/ai_provider_registry.py +0 -0
  17. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/completions/__init__.py +0 -0
  18. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/completions/ai_bedrock_completions.py +0 -0
  19. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/completions/ai_google_gemini_capabilities.py +0 -0
  20. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/completions/ai_google_gemini_completions.py +0 -0
  21. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/completions/ai_openai_completions.py +0 -0
  22. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/embeddings/__init__.py +0 -0
  23. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/embeddings/ai_google_gemini_embeddings.py +0 -0
  24. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/embeddings/ai_openai_embeddings.py +0 -0
  25. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/embeddings/ai_titan_embeddings.py +0 -0
  26. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/images/__init__.py +0 -0
  27. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/images/ai_bedrock_images.py +0 -0
  28. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/images/ai_google_gemini_images.py +0 -0
  29. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/images/ai_openai_images.py +0 -0
  30. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/__init__.py +0 -0
  31. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/impl/__init__.py +0 -0
  32. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/impl/_presidio_redactor.py +0 -0
  33. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/impl/base_redactor.py +0 -0
  34. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/impl/custom_recognizer_factory.py +0 -0
  35. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/impl/middleware_extensibility_poc.py +0 -0
  36. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/impl/noop_redactor.py +0 -0
  37. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/impl/presidio_log_control.py +0 -0
  38. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/middleware.py +0 -0
  39. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/middleware_config.py +0 -0
  40. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/observability.py +0 -0
  41. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/observability_runtime.py +0 -0
  42. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/pii_redactor.py +0 -0
  43. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/middleware/redaction_exceptions.py +0 -0
  44. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/util/__init__.py +0 -0
  45. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/util/_lazy_pydub.py +0 -0
  46. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/util/env_settings.py +0 -0
  47. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/util/package_metadata_validation.py +0 -0
  48. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/util/utils.py +0 -0
  49. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/videos/__init__.py +0 -0
  50. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/videos/ai_bedrock_videos.py +0 -0
  51. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/videos/ai_openai_videos.py +0 -0
  52. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/videos/frame_helpers.py +0 -0
  53. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/voice/__init__.py +0 -0
  54. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/voice/ai_voice_azure.py +0 -0
  55. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/voice/ai_voice_base.py +0 -0
  56. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/voice/ai_voice_elevenlabs.py +0 -0
  57. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/voice/ai_voice_factory.py +0 -0
  58. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/voice/ai_voice_google.py +0 -0
  59. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/voice/ai_voice_google_gemini_voices.py +0 -0
  60. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/src/ai_api_unified/voice/ai_voice_openai.py +0 -0
  61. {ai_api_unified-2.5.2 → ai_api_unified-2.5.4}/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.2
3
+ Version: 2.5.4
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.2" # keep in sync with src/ai_api_unified/__version__.py
39
+ version = "2.5.4" # 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"
@@ -9,4 +9,4 @@ from __future__ import annotations
9
9
 
10
10
  __all__: list[str] = ["__version__"]
11
11
 
12
- __version__: str = "2.5.2"
12
+ __version__: str = "2.5.4"
@@ -40,42 +40,66 @@ 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", "4k"}
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":
54
58
  if self.fps is not None:
55
59
  raise ValueError(
56
- "Google Gemini (Veo) does not support the 'fps' parameter. "
57
- "Remove fps from your video properties for this provider."
60
+ f"Google Gemini (Veo) does not support the 'fps' parameter "
61
+ f"(received fps={self.fps!r}). Remove fps from your video "
62
+ f"properties for this provider."
58
63
  )
59
64
  if (
60
65
  self.aspect_ratio is not None
61
66
  and self.aspect_ratio not in self._ALLOWED_ASPECT_RATIOS
62
67
  ):
63
68
  raise ValueError(
64
- "Google Gemini video aspect_ratio must be '16:9' or '9:16'."
69
+ f"Google Gemini video aspect_ratio={self.aspect_ratio!r} is "
70
+ f"not supported. Must be one of '16:9' or '9:16'."
65
71
  )
66
72
  if (
67
73
  self.resolution is not None
68
74
  and self.resolution not in self._ALLOWED_RESOLUTIONS
69
75
  ):
70
76
  raise ValueError(
71
- "Google Gemini video resolution must be one of 720p, 1080p, or 4k."
77
+ f"Google Gemini video resolution={self.resolution!r} is not "
78
+ f"supported. Must be one of 720p or 1080p."
72
79
  )
73
80
  if (
74
81
  self.person_generation is not None
75
82
  and self.person_generation not in self._ALLOWED_PERSON_GENERATION
76
83
  ):
77
84
  raise ValueError(
78
- "Google Gemini person_generation must be one of dont_allow, allow_adult, or allow_all."
85
+ f"Google Gemini person_generation={self.person_generation!r} "
86
+ f"is not supported. Must be one of dont_allow or allow_adult."
87
+ )
88
+ if self.compression_quality is not None:
89
+ normalized: str = self.compression_quality.upper()
90
+ if normalized not in self._ALLOWED_COMPRESSION_QUALITY:
91
+ raise ValueError(
92
+ f"Google Gemini compression_quality="
93
+ f"{self.compression_quality!r} is not supported. "
94
+ f"Must be 'OPTIMIZED' or 'LOSSLESS'."
95
+ )
96
+ self.compression_quality = normalized
97
+ if self.output_gcs_uri is not None and not self.output_gcs_uri.startswith(
98
+ "gs://"
99
+ ):
100
+ raise ValueError(
101
+ f"Google Gemini output_gcs_uri={self.output_gcs_uri!r} is "
102
+ f"not supported. Must be a gs:// URI."
79
103
  )
80
104
  return self
81
105
 
@@ -372,6 +396,16 @@ class AIGoogleGeminiVideos(AIGoogleBase, AIBaseVideos):
372
396
  config_kwargs["generate_audio"] = google_properties.generate_audio
373
397
  if google_properties.person_generation is not None:
374
398
  config_kwargs["person_generation"] = google_properties.person_generation
399
+ if google_properties.negative_prompt is not None:
400
+ config_kwargs["negative_prompt"] = google_properties.negative_prompt
401
+ if google_properties.enhance_prompt is not None:
402
+ config_kwargs["enhance_prompt"] = google_properties.enhance_prompt
403
+ if google_properties.output_gcs_uri is not None:
404
+ config_kwargs["output_gcs_uri"] = google_properties.output_gcs_uri
405
+ if google_properties.compression_quality is not None:
406
+ config_kwargs["compression_quality"] = types.VideoCompressionQuality(
407
+ google_properties.compression_quality
408
+ )
375
409
  if google_properties.last_frame_image is not None:
376
410
  config_kwargs["last_frame"] = self._to_google_image(
377
411
  google_properties.last_frame_image
File without changes
File without changes