---
title: "Tool calling"
description: "Serve Neutrino-8B to an agent framework using OpenAI tool schemas and standard tool-call responses."
canonical: "https://www.fermionresearch.com/docs/tool-calling/"
source: "Fermion Research"
---

Docs / Guides

# Tool calling

Serve Neutrino-8B to an agent framework using OpenAI tool schemas and standard tool-call responses.

## Send tools

```text
{
  "model": "neutrino",
  "messages": [{"role": "user", "content": "What is the weather in Paris?"}],
  "tools": [{
    "type": "function",
    "function": {
      "name": "get_weather",
      "description": "Get current weather for a city",
      "parameters": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
        "required": ["city"]
      }
    }
  }],
  "tool_choice": "auto"
}
```

Neutrino emits Hermes-format tool markers internally. The server parses them into OpenAI `message.tool_calls` entries and returns `finish_reason: "tool_calls"`. Only Neutrino-8B reliably produces tool calls. The 0.6B models generally answer in prose.

## Tool choice behavior

| Value | Behavior |
| --- | --- |
| auto or omitted | Render every declared tool and parse calls when the model emits them. |
| none | Render no tools and return a normal assistant response. |
| required | Best effort. No grammar constraint forces a call. |
| named function | Render only that function. The model may still answer in prose. |

## Parser and name matching

The parser supports one or several calls, JSON arrays and wrapper objects, missing closing tags, trailing commas, single-quoted arguments, and balanced JSON inside surrounding reasoning. Arguments always leave the server as a strict JSON string.

When a model emits a short function name for a uniquely matching namespaced tool, the server rewrites the call to the registered name and logs the mapping. Ambiguous names are never guessed.

## Loop protection and tool profiles

The serve-only stuck detector watches the conversation history supplied by the client. It can detect repeated identical calls, strict A-B alternation, and repeated identical tool errors. Polling tools are automatically exempt unless you disable that behavior.

| Mode | Behavior |
| --- | --- |
| enforce | Default. On a detected loop, produce a diagnosis and a final answer without exposing tools. |
| observe | Log and count signals without changing output. |
| off | Disable analysis. |

Affected responses include a top-level `fermion_stuck` object. Counters and configuration are available on `/health`.

| Profile | Temperature | Top p | Repetition penalty |
| --- | --- | --- | --- |
| graded | 0.01 | 1.0 | 1.05 / 256 |
| vendor | 0.7 | 0.8 | 1.10 / 256 |
| vendor-thinking | 0.6 | 0.95 | 1.10 / 256 |
| antiloop | 0.7 | 0.8 | 1.15 / 512 |

Source: [https://www.fermionresearch.com/docs/tool-calling/](https://www.fermionresearch.com/docs/tool-calling/)
