Tool Calling
staik stödjer OpenAI-kompatibel tool calling. Skicka tools och tool_choice i din request — modellen svarar med tool_calls i exakt samma format som OpenAI.
Definiera ett verktyg
curlRequest med verktyg
curl https://api.staik.se/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-st-your-key" \
-d '{
"model": "gemma4:31b",
"messages": [
{"role": "user", "content": "Vad är vädret i Stockholm?"}
],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Hämta aktuellt väder för en stad",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}
}],
"tool_choice": "auto"
}'Modellen svarar med tool_calls istället för text när den vill kalla ett verktyg:
JSONSvar
{
"id": "chatcmpl-...",
"object": "chat.completion",
"model": "gemma4:31b",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"Stockholm\", \"unit\": \"celsius\"}"
}
}]
},
"finish_reason": "tool_calls"
}]
}Komplett tool-loop (Python)
PythonOpenAI SDK
import json
from openai import OpenAI
client = OpenAI(
base_url="https://api.staik.se/v1",
api_key="sk-st-your-key",
)
def get_weather(city: str, unit: str = "celsius") -> dict:
# Anropa din riktiga väder-API här
return {"city": city, "temp": 4, "unit": unit, "conditions": "molnigt"}
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Hämta aktuellt väder för en stad",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["city"],
},
},
}]
messages = [{"role": "user", "content": "Vad är vädret i Stockholm?"}]
# 1. Modellen bestämmer att den vill kalla verktyget
response = client.chat.completions.create(
model="gemma4:31b",
messages=messages,
tools=tools,
)
msg = response.choices[0].message
messages.append(msg)
# 2. Kör varje tool call och skicka tillbaka resultatet
for tc in msg.tool_calls or []:
args = json.loads(tc.function.arguments)
result = get_weather(**args)
messages.append({
"role": "tool",
"tool_call_id": tc.id,
"content": json.dumps(result),
})
# 3. Modellen formulerar slutsvaret baserat på tool-resultatet
final = client.chat.completions.create(
model="gemma4:31b",
messages=messages,
)
print(final.choices[0].message.content)Tool calling (Node.js)
Node.jsOpenAI SDK
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.staik.se/v1",
apiKey: "sk-st-your-key",
});
const tools = [{
type: "function",
function: {
name: "get_weather",
description: "Hämta aktuellt väder för en stad",
parameters: {
type: "object",
properties: {
city: { type: "string" },
unit: { type: "string", enum: ["celsius", "fahrenheit"] },
},
required: ["city"],
},
},
}] as const;
const response = await client.chat.completions.create({
model: "gemma4:31b",
messages: [{ role: "user", content: "Vad är vädret i Stockholm?" }],
tools,
});
const toolCalls = response.choices[0].message.tool_calls;
if (toolCalls) {
for (const tc of toolCalls) {
const args = JSON.parse(tc.function.arguments);
console.log("Calling", tc.function.name, "with", args);
}
}Tips
- Sätt
tool_choice: "required"för att tvinga modellen att kalla ett verktyg, eller{type: "function", function: {name: "..."}}för ett specifikt verktyg. - Streaming (SSE) stöds — tool_calls kommer i delta-fältet med samma index-format som OpenAI.
- Verktygsbeskrivningar och parameternamn som är välbeskrivna (på engelska eller svenska) ger bättre tool calls. Använd
gemma4:31bellerqwen3.6:35b-a3bför bäst tool-following.