FunctionGemma 270M
FunctionGemma 270M es un derivado de Gemma 3 afinado para llamadas estructuradas a herramientas y funciones. En lugar de texto libre, emite una gramática estricta <start_function_call>call:NAME{...}<end_function_call> que el SDK convierte en valores FunctionCall tipados. Con aproximadamente 283 MB en disco, es lo bastante pequeño para cargarse junto a un pipeline ASR + TTS en hardware de teléfono y actuar como el «enrutador» que transforma la frase del usuario en una invocación de herramienta.
FunctionGemma encaja en los agentes de voz allá donde, de otro modo, se llamaría a un LLM alojado para enrutar herramientas. La gramática es estricta por construcción, así que se obtienen objetos FunctionCall ya parseados directamente: sin reparación de JSON ni prompting en modo esquema.
Plataformas
| Plataforma | Formato | Tamaño | HuggingFace |
|---|---|---|---|
| Apple (macOS / iOS) | CoreML | ~283 MB | aufklarer/FunctionGemma-270M-CoreML |
| Android (y Linux / Windows mediante Speech Core) | LiteRT-LM | ~283 MB | soniqo/FunctionGemma-270M-LiteRT-LM |
Gramática
El modelo está entrenado para emitir una sola llamada (o una secuencia de llamadas) envuelta entre dos tokens centinela:
<start_function_call>call:set_timer{"minutes": 5, "label": "tea"}<end_function_call>
El SDK convierte cada llamada en un valor FunctionCall(name:, arguments:) tipado. Los argumentos se decodifican como JSON, de modo que se pueden mapear directamente a una clase Swift Codable o a una clase de datos Kotlin @Serializable.
Swift (Apple, CoreML)
En las plataformas Apple, FunctionGemma se expone a través de speech-swift como la clase FunctionGemma. Carga el modelo CoreML desde HuggingFace en el primer uso y se ejecuta en el Neural Engine.
import FunctionGemma
let model = try await FunctionGemma.fromPretrained()
let tools = """
- set_timer(minutes: Int, label: String)
- get_weather(city: String)
"""
let calls = try model.callFunctions(
tools: tools,
userMessage: "Set a 5 minute tea timer"
)
for call in calls {
print(call.name) // "set_timer"
print(call.arguments) // ["minutes": 5, "label": "tea"]
}
Kotlin (Android, LiteRT-LM)
En Android el modelo se expone a través de speech-android como audio.soniqo.speech.llm.FunctionGemma. Es un adaptador con runtime intercambiable: tú proporcionas una instancia de LiteRtLmRuntime (el SDK incluye una por defecto) y FunctionGemma se encarga de la plantilla del prompt y del parseo de la gramática.
import audio.soniqo.speech.llm.FunctionGemma
import audio.soniqo.speech.llm.LiteRtLmRuntime
val runtime = LiteRtLmRuntime.fromPretrained(context)
val model = FunctionGemma(runtime)
val tools = """
- set_timer(minutes: Int, label: String)
- get_weather(city: String)
""".trimIndent()
val calls = model.callFunctions(
tools = tools,
userMessage = "Set a 5 minute tea timer",
)
for (call in calls) {
println(call.name) // "set_timer"
println(call.arguments) // {"minutes": 5, "label": "tea"}
}
Lecturas adicionales
- Speech Core — motor C++ que aloja el runtime de LiteRT-LM y el bucle de llamada a funciones en Linux, Windows y Android.
- github.com/soniqo/speech-core — núcleo de orquestación y pegamento de LiteRT-LM, incluido el bucle de llamada a herramientas de
VoicePipeline. - github.com/soniqo/speech-swift — SDK de Apple con la clase Swift
FunctionGemma. - github.com/soniqo/speech-android — SDK de Android con
audio.soniqo.speech.llm.FunctionGemma. - google/gemma-3-270m — modelo base original Gemma 3 270M en HuggingFace.