aidial_adapter_vertexai/chat/gemini/finish_reason.py (72 lines of code) (raw):

from typing import assert_never import vertexai.preview.generative_models as generative_models from aidial_sdk.chat_completion import FinishReason from google.genai.types import FinishReason as GenAIFinishReason from aidial_adapter_vertexai.chat.gemini.error import FinishReasonOtherError GenFinishReason = generative_models.FinishReason _EARLY_TERMINATION_ERROR = "The model terminated generation unexpectedly" _INVALID_FUNCTION_CALL_ERROR = ( "The function call generated by the model is invalid" ) def to_openai_finish_reason( finish_reason: GenFinishReason, retriable: bool ) -> FinishReason | None: match finish_reason: case GenFinishReason.FINISH_REASON_UNSPECIFIED: return None case GenFinishReason.MAX_TOKENS: return FinishReason.LENGTH case GenFinishReason.STOP: return FinishReason.STOP case ( GenFinishReason.SAFETY | GenFinishReason.RECITATION | GenFinishReason.BLOCKLIST | GenFinishReason.PROHIBITED_CONTENT | GenFinishReason.SPII ): return FinishReason.CONTENT_FILTER # The following finish reasons could be usually fixed with a retry case GenFinishReason.OTHER: raise FinishReasonOtherError( msg=_EARLY_TERMINATION_ERROR, retriable=retriable, ) case GenFinishReason.MALFORMED_FUNCTION_CALL: raise FinishReasonOtherError( msg=_INVALID_FUNCTION_CALL_ERROR, retriable=retriable, ) case _: assert_never(finish_reason) def genai_to_openai_finish_reason( finish_reason: GenAIFinishReason | None, retriable: bool ) -> FinishReason | None: if not finish_reason: return None match finish_reason: case "FINISH_REASON_UNSPECIFIED": return None case "MAX_TOKENS": return FinishReason.LENGTH case "STOP": return FinishReason.STOP case ( "SAFETY" | "RECITATION" | "BLOCKLIST" | "PROHIBITED_CONTENT" | "SPII" ): return FinishReason.CONTENT_FILTER case "OTHER": raise FinishReasonOtherError( msg=_EARLY_TERMINATION_ERROR, retriable=retriable, ) case "MALFORMED_FUNCTION_CALL": raise FinishReasonOtherError( msg=_INVALID_FUNCTION_CALL_ERROR, retriable=retriable, ) case _: assert_never(finish_reason)