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.
Files changed (61) hide show
  1. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/PKG-INFO +1 -1
  2. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/pyproject.toml +1 -1
  3. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/__version__.py +1 -1
  4. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/ai_google_gemini_videos.py +31 -4
  5. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/LICENSE +0 -0
  6. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/README.md +0 -0
  7. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/__init__.py +0 -0
  8. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_base.py +0 -0
  9. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_bedrock_base.py +0 -0
  10. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_completions_exceptions.py +0 -0
  11. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_factory.py +0 -0
  12. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_google_base.py +0 -0
  13. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_openai_base.py +0 -0
  14. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_provider_exceptions.py +0 -0
  15. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_provider_loader.py +0 -0
  16. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/ai_provider_registry.py +0 -0
  17. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/__init__.py +0 -0
  18. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/ai_bedrock_completions.py +0 -0
  19. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/ai_google_gemini_capabilities.py +0 -0
  20. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/ai_google_gemini_completions.py +0 -0
  21. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/completions/ai_openai_completions.py +0 -0
  22. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/__init__.py +0 -0
  23. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/ai_google_gemini_embeddings.py +0 -0
  24. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/ai_openai_embeddings.py +0 -0
  25. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/embeddings/ai_titan_embeddings.py +0 -0
  26. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/__init__.py +0 -0
  27. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/ai_bedrock_images.py +0 -0
  28. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/ai_google_gemini_images.py +0 -0
  29. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/images/ai_openai_images.py +0 -0
  30. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/__init__.py +0 -0
  31. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/__init__.py +0 -0
  32. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/_presidio_redactor.py +0 -0
  33. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/base_redactor.py +0 -0
  34. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/custom_recognizer_factory.py +0 -0
  35. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/middleware_extensibility_poc.py +0 -0
  36. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/noop_redactor.py +0 -0
  37. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/impl/presidio_log_control.py +0 -0
  38. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/middleware.py +0 -0
  39. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/middleware_config.py +0 -0
  40. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/observability.py +0 -0
  41. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/observability_runtime.py +0 -0
  42. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/pii_redactor.py +0 -0
  43. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/middleware/redaction_exceptions.py +0 -0
  44. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/__init__.py +0 -0
  45. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/_lazy_pydub.py +0 -0
  46. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/env_settings.py +0 -0
  47. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/package_metadata_validation.py +0 -0
  48. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/util/utils.py +0 -0
  49. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/__init__.py +0 -0
  50. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/ai_bedrock_videos.py +0 -0
  51. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/ai_openai_videos.py +0 -0
  52. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/videos/frame_helpers.py +0 -0
  53. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/__init__.py +0 -0
  54. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_azure.py +0 -0
  55. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_base.py +0 -0
  56. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_elevenlabs.py +0 -0
  57. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_factory.py +0 -0
  58. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_google.py +0 -0
  59. {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
  60. {ai_api_unified-2.5.2 → ai_api_unified-2.5.3}/src/ai_api_unified/voice/ai_voice_openai.py +0 -0
  61. {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.2
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.2" # keep in sync with src/ai_api_unified/__version__.py
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"
@@ -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.3"
@@ -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", "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":
@@ -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, 1080p, or 4k."
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, allow_adult, or allow_all."
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