Files
2026-07-13 13:22:34 +08:00

113 lines
3.4 KiB
Python

import json
import logging
from typing import TYPE_CHECKING
from mlflow.types.chat import (
ChatTool,
Function,
FunctionParams,
FunctionToolDefinition,
ParamProperty,
ToolCall,
)
if TYPE_CHECKING:
from google import genai
_logger = logging.getLogger(__name__)
def convert_gemini_func_to_mlflow_chat_tool(
function_def: "genai.types.FunctionDeclaration",
) -> ChatTool:
"""
Convert Gemini function definition into MLflow's standard format (OpenAI compatible).
Ref: https://ai.google.dev/gemini-api/docs/function-calling
Args:
function_def: A genai.types.FunctionDeclaration or genai.protos.FunctionDeclaration object
representing a function definition.
Returns:
ChatTool: MLflow's standard tool definition object.
"""
return ChatTool(
type="function",
function=FunctionToolDefinition(
name=function_def.name,
description=function_def.description,
parameters=_convert_gemini_function_param_to_mlflow_function_param(
function_def.parameters
),
),
)
def convert_gemini_func_call_to_mlflow_tool_call(
func_call: "genai.types.FunctionCall",
) -> ToolCall:
"""
Convert Gemini function call into MLflow's standard format (OpenAI compatible).
Ref: https://ai.google.dev/gemini-api/docs/function-calling
Args:
func_call: A genai.types.FunctionCall or genai.protos.FunctionCall object
representing a single func call.
Returns:
ToolCall: MLflow's standard tool call object.
"""
# original args object is not json serializable
args = func_call.args or {}
return ToolCall(
# Gemini does not have func call id
id=func_call.name,
type="function",
function=Function(name=func_call.name, arguments=json.dumps(dict(args))),
)
def _convert_gemini_param_property_to_mlflow_param_property(param_property) -> ParamProperty:
"""
Convert Gemini parameter property definition into MLflow's standard format (OpenAI compatible).
Ref: https://ai.google.dev/gemini-api/docs/function-calling
Args:
param_property: A genai.types.Schema or genai.protos.Schema object
representing a parameter property.
Returns:
ParamProperty: MLflow's standard param property object.
"""
type_name = param_property.type
type_name = type_name.name.lower() if hasattr(type_name, "name") else type_name.lower()
return ParamProperty(
description=param_property.description,
enum=param_property.enum,
type=type_name,
)
def _convert_gemini_function_param_to_mlflow_function_param(
function_params: "genai.types.Schema",
) -> FunctionParams:
"""
Convert Gemini function parameter definition into MLflow's standard format (OpenAI compatible).
Ref: https://ai.google.dev/gemini-api/docs/function-calling
Args:
function_params: A genai.types.Schema or genai.protos.Schema object
representing function parameters.
Returns:
FunctionParams: MLflow's standard function parameter object.
"""
return FunctionParams(
properties={
k: _convert_gemini_param_property_to_mlflow_param_property(v)
for k, v in function_params.properties.items()
},
required=function_params.required,
)