FunctionGemma 270M
FunctionGemma 270M é um derivado do Gemma 3 ajustado para chamadas estruturadas de ferramentas e funções. Em vez de texto livre, ele emite uma gramática estrita <start_function_call>call:NAME{...}<end_function_call> que o SDK converte em valores FunctionCall tipados. Com cerca de 283 MB em disco, é pequeno o suficiente para ser carregado junto com um pipeline de ASR + TTS em hardware de classe smartphone e servir como o “roteador” que transforma a fala do usuário em uma invocação de ferramenta.
FunctionGemma se encaixa em agentes de voz em qualquer lugar onde você normalmente chamaria um LLM hospedado para roteamento de ferramentas. A gramática é estrita por construção, portanto você recebe de volta objetos FunctionCall já analisados — sem reparo de JSON, sem prompts de schema-mode.
Plataformas
| Plataforma | Formato | Tamanho | HuggingFace |
|---|---|---|---|
| Apple (macOS / iOS) | CoreML | ~283 MB | aufklarer/FunctionGemma-270M-CoreML |
| Android (e Linux / Windows via Speech Core) | LiteRT-LM | ~283 MB | soniqo/FunctionGemma-270M-LiteRT-LM |
Gramática
O modelo é treinado para emitir uma única chamada (ou uma sequência de chamadas) envolvida por dois tokens sentinela:
<start_function_call>call:set_timer{"minutes": 5, "label": "tea"}<end_function_call>
O SDK converte cada chamada em um valor FunctionCall(name:, arguments:) tipado. Os argumentos são decodificados como JSON, de modo que você pode mapeá-los diretamente para um Codable em Swift ou uma classe de dados @Serializable em Kotlin.
Swift (Apple, CoreML)
Nas plataformas Apple, o FunctionGemma é exposto através do speech-swift como a classe FunctionGemma. Ele carrega o modelo CoreML do HuggingFace no primeiro uso e roda no 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)
No Android, o modelo é exposto através do speech-android como audio.soniqo.speech.llm.FunctionGemma. É um adaptador bring-your-own-runtime: você fornece uma instância de LiteRtLmRuntime (o SDK fornece uma padrão), e o FunctionGemma cuida do template de prompt e da análise da 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"}
}
Leitura adicional
- Speech Core — motor C++ que hospeda o runtime LiteRT-LM e o loop de chamada de funções em Linux, Windows e Android.
- github.com/soniqo/speech-core — núcleo de orquestração e cola LiteRT-LM, incluindo o loop de chamada de ferramentas do
VoicePipeline. - github.com/soniqo/speech-swift — SDK Apple com a classe Swift
FunctionGemma. - github.com/soniqo/speech-android — SDK Android com
audio.soniqo.speech.llm.FunctionGemma. - google/gemma-3-270m — modelo base upstream Gemma 3 270M no HuggingFace.