KAT-Coder-Pro V2.5 vs Seed-2.0-Code
Both sit behind the same key and the same code on uttapen — the only thing that changes is the model string, so you can run each of them against your own workload without touching anything else.
| Feature | ||
|---|---|---|
| Provider | Kwaipilot | ByteDance Seed |
| Model id | kwaipilot/kat-coder-pro-v2.5 | bytedance-seed/seed-2.0-code |
| Context | 262,144 tokens | 262,144 tokens |
| Max output | 235,929 tokens | 131,072 tokens |
| Input / 1M tokens | 214,693 toman | 145,063 toman |
| Output / 1M tokens | 858,770 toman | 870,375 toman |
| ≈ one 1,000-word request | 1,396 toman | 1,320 toman |
| Input caching | 43,519 toman / 1M | No |
| Image input | No | Yes |
| File input | No | No |
| Tool calling | Yes | Yes |
| JSON output | Yes | Yes |
| Reasoning mode | No | Yes |
Which one for what?
KAT-Coder-Pro V2.5
- Whole documents or a codebase in a single request
- Agents that call your own APIs and database
1,396 toman per 1,000 words · Model page
Seed-2.0-Code
- Multi-step problems, maths, and tracking down a bug
- Whole documents or a codebase in a single request
- Reading screenshots, invoices, and scanned forms
- Agents that call your own APIs and database
1,320 toman per 1,000 words · Model page
Run both with the same code
Swap the model value between the two ids and send the same request twice; what each answer cost comes back in the X-Uttapen-Cost-Toman header.
curl https://api.uttapen.ir/v1/chat/completions \
-H "Authorization: Bearer sk-up-…" \
-H "Content-Type: application/json" \
-d '{
"model": "kwaipilot/kat-coder-pro-v2.5",
"messages": [{"role": "user", "content": "Introduce yourself in one sentence."}],
"stream": true
}'from openai import OpenAI
client = OpenAI(
base_url="https://api.uttapen.ir/v1",
api_key="sk-up-…",
)
stream = client.chat.completions.create(
model="kwaipilot/kat-coder-pro-v2.5",
messages=[{"role": "user", "content": "Introduce yourself in one sentence."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.uttapen.ir/v1",
apiKey: "sk-up-…",
});
const stream = await client.chat.completions.create({
model: "kwaipilot/kat-coder-pro-v2.5",
messages: [{ role: "user", content: "Introduce yourself in one sentence." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}<?php
// composer require openai-php/client guzzlehttp/guzzle
$client = OpenAI::factory()
->withBaseUri('https://api.uttapen.ir/v1')
->withApiKey('sk-up-…')
->make();
$result = $client->chat()->create([
'model' => 'kwaipilot/kat-coder-pro-v2.5',
'messages' => [['role' => 'user', 'content' => 'Introduce yourself in one sentence.']],
]);
echo $result->choices[0]->message->content;package main
import (
"context"
"fmt"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
)
func main() {
client := openai.NewClient(
option.WithBaseURL("https://api.uttapen.ir/v1"),
option.WithAPIKey("sk-up-…"),
)
resp, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{
Model: "kwaipilot/kat-coder-pro-v2.5",
Messages: []openai.ChatCompletionMessageParamUnion{openai.UserMessage("Introduce yourself in one sentence.")},
})
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
}model = "bytedance-seed/seed-2.0-code"
More comparisons: all pairs · model rankings · full catalogue
base_url = https://api.uttapen.ir/v1