Models
Kalle comes in four models. They are the same models that build apps in Appmake, and you choose one per request with the model field.
- Kalle Turbo
kalle-turboFast, everyday tasks - Kalle Design
kalle-designLayouts, styling and visual work - Kalle Turbo Max
kalle-turbo-maxFull features with solid reasoning - Kalle Turbo Ultra
kalle-turbo-ultraThe hardest problems
Choosing a model
| Model | Model ID | Best for |
|---|---|---|
| Kalle Turbo | kalle-turbo | Fast, everyday tasks |
| Kalle Design | kalle-design | Layouts, styling and visual work |
| Kalle Turbo Max | kalle-turbo-max | Full features with solid reasoning |
| Kalle Turbo Ultra | kalle-turbo-ultra | The hardest problems |
| Auto | auto | Let Kalle pick per request |
Start with Kalle Turbo. Move up when the answers need more reasoning, and use Kalle Design when the work is visual: layouts, colours, components and screenshots.
Auto
Set model to auto and Kalle reads the request and picks the model that fits it. Short questions go to a fast model, hard problems to a stronger one.
The model field in the response tells you which model answered, and you pay that model's price for the request.
Effort
The effort field sets how much Kalle thinks before it answers. It works with every model.
| Effort | When to use it |
|---|---|
auto | The default. Kalle decides how much thinking the request needs. |
low | Quick replies, classification and short rewrites. |
medium | Everyday writing and code. |
high | Plans, multi-step changes and careful reviews. |
extra | Hard problems where a wrong answer is expensive. |
max | The most thinking Kalle can do, for the hardest work. |
More effort means better answers on hard problems, but slower responses and more output tokens. The thinking is billed as output tokens and shown in usage.reasoning_tokens.
curl https://api.kalle.build/v1/messages \
-H "Authorization: Bearer $KALLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "auto",
"effort": "high",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Plan the database tables for a booking app with staff, services and opening hours."
}
]
}'const response = await fetch("https://api.kalle.build/v1/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KALLE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "auto",
effort: "high",
max_tokens: 4096,
messages: [
{
role: "user",
content: "Plan the database tables for a booking app with staff, services and opening hours."
}
]
}),
});
console.log(await response.json());import os
import requests
response = requests.post(
"https://api.kalle.build/v1/messages",
headers={"Authorization": f"Bearer {os.environ['KALLE_API_KEY']}"},
json={
"model": "auto",
"effort": "high",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Plan the database tables for a booking app with staff, services and opening hours."
}
]
},
)
response.raise_for_status()
print(response.json())package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
body := strings.NewReader(`{
"model": "auto",
"effort": "high",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Plan the database tables for a booking app with staff, services and opening hours."
}
]
}`)
req, _ := http.NewRequest("POST", "https://api.kalle.build/v1/messages", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KALLE_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(string(out))
}require "json"
require "net/http"
uri = URI("https://api.kalle.build/v1/messages")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("KALLE_API_KEY")}"
request["Content-Type"] = "application/json"
request.body = <<~JSON
{
"model": "auto",
"effort": "high",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Plan the database tables for a booking app with staff, services and opening hours."
}
]
}
JSON
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
puts JSON.pretty_generate(JSON.parse(response.body))<?php
$body = <<<'JSON'
{
"model": "auto",
"effort": "high",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Plan the database tables for a booking app with staff, services and opening hours."
}
]
}
JSON;
$ch = curl_init("https://api.kalle.build/v1/messages");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("KALLE_API_KEY"),
"Content-Type: application/json",
],
]);
echo curl_exec($ch);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class KalleExample {
public static void main(String[] args) throws Exception {
String body = """
{
"model": "auto",
"effort": "high",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Plan the database tables for a booking app with staff, services and opening hours."
}
]
}
""";
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.kalle.build/v1/messages"))
.header("Authorization", "Bearer " + System.getenv("KALLE_API_KEY"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}Listing models
GET /v1/models returns the models your key can use, with their IDs and display names. Use it to check a key, or to build a model picker that stays up to date.
curl https://api.kalle.build/v1/models \
-H "Authorization: Bearer $KALLE_API_KEY"const response = await fetch("https://api.kalle.build/v1/models", {
headers: { Authorization: `Bearer ${process.env.KALLE_API_KEY}` },
});
console.log(await response.json());import os
import requests
response = requests.get(
"https://api.kalle.build/v1/models",
headers={"Authorization": f"Bearer {os.environ['KALLE_API_KEY']}"},
)
response.raise_for_status()
print(response.json())package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("GET", "https://api.kalle.build/v1/models", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KALLE_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(string(out))
}require "json"
require "net/http"
uri = URI("https://api.kalle.build/v1/models")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer #{ENV.fetch("KALLE_API_KEY")}"
response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(request) }
puts JSON.pretty_generate(JSON.parse(response.body))<?php
$ch = curl_init("https://api.kalle.build/v1/models");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("KALLE_API_KEY"),
],
]);
echo curl_exec($ch);import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class KalleExample {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.kalle.build/v1/models"))
.header("Authorization", "Bearer " + System.getenv("KALLE_API_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}