Files
infra-docker-configs/servers/tools-pve/litellm/personal_transcription.py
T

50 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Add native vocabulary only to explicitly opted-in Gemini transcription calls."""
import json
from pathlib import Path
VOCABULARY = Path('/etc/litellm/personal-vocabulary.json')
def vocabulary(path=VOCABULARY):
words = json.loads(path.read_text())
if not isinstance(words, list) or not 1 <= len(words) <= 100:
raise ValueError('Personal vocabulary must contain 1–100 terms')
if any(not isinstance(word, str) or not word.strip() or len(word) > 100 for word in words):
raise ValueError('Invalid personal vocabulary term')
return list(dict.fromkeys(words))
def install():
from litellm.llms.gemini.audio_transcription.transformation import GeminiAudioTranscriptionConfig
original = GeminiAudioTranscriptionConfig.transform_audio_transcription_request
if getattr(original, '_personal_vocabulary_patch', False):
return
def transform(self, model, audio_file, optional_params, litellm_params):
enabled = optional_params.get('personal_vocabulary') is True
if not enabled:
return original(self, model, audio_file, optional_params, litellm_params)
if model.removeprefix('gemini/') != 'gemini-3.5-transcribe':
raise ValueError('Personal vocabulary is restricted to Gemini 3.5 Transcribe')
if optional_params.get('timestamp_granularities') or optional_params.get('response_format') not in (None, 'json', 'text'):
raise ValueError('Personal dictation does not support timestamps or diarization')
clean = {key: value for key, value in optional_params.items() if key != 'personal_vocabulary'}
result = original(self, model, audio_file, clean, litellm_params)
config = result.data.setdefault('generation_config', {}).setdefault('transcription_config', {})
# Fail closed if a future LiteLLM version enables conflicting features by default.
if config.get('mode'):
raise ValueError('Unexpected Gemini transcription mode')
config['custom_vocabulary'] = vocabulary()
return result
transform._personal_vocabulary_patch = True
GeminiAudioTranscriptionConfig.transform_audio_transcription_request = transform
if __name__ == '__main__':
import sys
from litellm import run_server
install()
sys.argv[0] = 'litellm'
sys.exit(run_server())