English | 中文
Listed in the order of submission time.
model: kimi-k3
thinking effort: max
| Provider | OCRBench | MMMU Pro Vision | BEAM (1M) | DeepSWE |
|---|---|---|---|---|
| Moonshot | 0.89 | 0.82 | 0.31 | 0.675 |
| Fireworks | 0.89 | 0.82 | 0.3037 | 0.664 |
| Baseten | 0.889 | 0.804 | 0.3219 | 0.693 |
| Together | 0.897 | 0.820 | 0.3160 | 0.678 |
| DigitalOcean | 0.89 | 0.816 | TBD | TBD |
| Inferact (vLLM ref.) | 0.891 | 0.818 | 0.3188 | 0.695 |
| Nebius | 0.878 | 0.814 | 0.2913 | 0.673 |
| Modal | 0.887 | 0.817 | 0.322 | 0.658 |
| Type | Task | Description |
|---|---|---|
| Inspect-ai benchmark | OCRBench | OCR text recognition benchmark |
| Inspect-ai benchmark | MMMU Pro Vision | Multimodal understanding benchmark (visual QA) |
| Inspect-ai benchmark | AIME 2025 | Mathematical reasoning benchmark; no longer used for K3 |
| Standalone script | BEAM (1M) | Long-term memory benchmark over 1M-token conversations, see beam/ |
| Pytest verifier | tests/params/ |
API parameter constraint pre-flight validation |
| Pytest verifier | tests/tool_call_json_schema/ |
Tool-call argument validation for walle-valid MFJS schemas |
| Pytest verifier | tests/k3_features/ |
K3 feature contract validation, including dynamic tools, response_format, tool_choice, and thinking effort |
| Pytest verifier | tests/prompt_tokens/ |
Verifies vendor-reported usage.prompt_tokens against expected constants |
| Agent benchmark | DeepSWE | Multi-step tool-use and coding-agent evaluation, run on the Pier platform |
uv sync && uv pip install -e .export KIMI_API_KEY="your-api-key"
export KIMI_BASE_URL="your-base-url"Or copy .env.example to .env and fill in the configuration.
Before running benchmarks, complete the API parameter, tool-call schema, K3 feature, and prompt-token pre-flight checks.
Validate that the API correctly constrains immutable parameters such as temperature, top_p, presence_penalty, frequency_penalty, and n.
# Kimi official API
uv run pytest tests/params --smoke-model kimi/your-model-id --think-mode kimi -v
# Open-source deployment (vLLM/SGLang/KTransformers)
uv run pytest tests/params --smoke-model your-model-id --think-mode opensource -vRun formal benchmarks only after all tests pass.
Validate that the vendor can use walle-valid MFJS schemas as tool-call parameters and return tool_calls[].function.arguments that conform to the schema.
uv run pytest -n 4 tests/tool_call_json_schema \
--base-url "${KIMI_BASE_URL}" \
--api-key "${KIMI_API_KEY}" \
--smoke-model "${MODEL_NAME}" \
--think-mode "$THINK_MODE" \
--thinking \
--reruns 3 \
--reruns-delay 2 \
--tool-json-report=tool-call-schema-report.json \
-ra -vThis check runs walle valid.jsonl cases, sends each schema as tools[].function.parameters, forces a tool call, and uses jsonschema to validate the returned function.arguments locally. Each selected case is run once with stream=false and once with stream=true; streaming chunks are reassembled before validation. In GitLab CI, this check runs as the verify_tool_call_json_schema job; the same retry options are applied. In addition to the JUnit XML report, a JSON report (tool-call-schema-report.json) is produced containing the selected cases, per-case outcomes, and the same summary block (total / by_status / by_selection_reason / by_mode) that the original standalone script printed at the end of its log.
| Argument | Meaning | Default |
|---|---|---|
--smoke-model |
Vendor model name | MODEL_NAME env var |
--base-url |
API base URL | KIMI_BASE_URL env var, otherwise Moonshot API |
--api-key |
API key | KIMI_API_KEY env var |
--case-dir |
walle validator_cases directory |
testdata/walle_validator_cases/validator_cases |
--selection |
Case selection mode: all / explicit / object |
all |
--max-cases |
Maximum number of selected cases to run | No limit |
--thinking |
Enable thinking mode for the tool-call request | Off |
--think-mode |
Thinking parameter format: kimi, opensource, or none |
THINK_MODE env var, otherwise kimi |
--max-tokens |
Maximum output tokens for each tool-call response | 2048 |
--tool-json-report |
Path to the additional JSON report artifact | tool-call-schema-report.json |
Validate K3 API features such as dynamic tools, response_format, tool_choice, and thinking effort.
uv run pytest tests/k3_features \
--base-url "${KIMI_BASE_URL}" \
--api-key "${KIMI_API_KEY}" \
--smoke-model "${MODEL_NAME}" \
-ra -v| Argument | Meaning | Default |
|---|---|---|
--smoke-model |
Vendor model name | MODEL_NAME env var |
--base-url |
API base URL | KIMI_BASE_URL env var, otherwise Moonshot API |
--api-key |
API key | KIMI_API_KEY env var |
The CI job verify_k3_features runs the pytest suite and reports results from the test log.
Validate that vendor-reported usage.prompt_tokens is accurate. This check
sends the text cases in testdata/prompt_token_cases/cases.jsonl and vision
cases in testdata/prompt_token_cases/vision_cases.jsonl with stream=true,
then compares the stream-reported usage.prompt_tokens against the expected
constant stored in each case. See
testdata/prompt_token_cases/README.md
for the case format.
uv run pytest tests/prompt_tokens \
--base-url "${KIMI_BASE_URL}" \
--api-key "${KIMI_API_KEY}" \
--smoke-model "${MODEL_NAME}" \
-ra -vtests/k3_features/, tests/prompt_tokens/, and tests/tool_call_json_schema/ validate raw chat-completions API behavior, including non-standard messages[].tools dynamic-tool declarations, malformed requests that should return HTTP 400, the location of usage fields in streaming chunks, and raw tools[].function.parameters JSON schema handling. inspect-ai is better suited for scored benchmark evaluations and may normalize or reject these raw payloads before they reach the vendor endpoint, so these tests remain standalone pytest suites.
| Benchmark | Mode | Temperature | TopP | Max Tokens | Epochs |
|---|---|---|---|---|---|
| OCRBench | Non-Thinking | 0.6 | 0.95 | 16384 | 1 |
| OCRBench | Thinking | 1.0 | 0.95 | 16384 | 1 |
| MMMU | Non-Thinking | 0.6 | 0.95 | 65536 | 1 |
| MMMU | Thinking | 1.0 | 0.95 | 65536 | 1 |
| AIME 2025 | Non-Thinking | 0.6 | 0.95 | 98304 | 32 |
| AIME 2025 | Thinking | 1.0 | 0.95 | 98304 | 32 |
| Benchmark | Mode (thinking, preserve thinking) | Temperature | TopP | Max Tokens | Epochs |
|---|---|---|---|---|---|
| OCRBench | Thinking, Keep all | 1.0 | 0.95 | 16384 | 1 |
| MMMU | Thinking, Keep all | 1.0 | 0.95 | 65536 | 1 |
| AIME 2025 | Thinking, Keep all | 1.0 | 0.95 | 98304 | 32 |
K3 no longer uses AIME 2025 and adds the reasoning_effort parameter.
| Benchmark | Mode (thinking, preserve thinking, effort) | Temperature | TopP | Max Tokens | Epochs |
|---|---|---|---|---|---|
| OCRBench | Thinking, Keep all, low | 1.0 | 0.95 | 16384 | 1 |
| OCRBench | Thinking, Keep all, high | 1.0 | 0.95 | 16384 | 1 |
| OCRBench | Thinking, Keep all, max | 1.0 | 0.95 | 16384 | 1 |
| MMMU | Thinking, Keep all, low | 1.0 | 0.95 | 98304 | 1 |
| MMMU | Thinking, Keep all, high | 1.0 | 0.95 | 98304 | 1 |
| MMMU | Thinking, Keep all, max | 1.0 | 0.95 | 98304 | 1 |
uv run python eval.py ocrbench --model kimi/your-model-id \
--think-mode kimi --max-tokens 16384 --streamuv run python eval.py ocrbench --model kimi/your-model-id \
--thinking --think-mode kimi --max-tokens 16384 --streamuv run python eval.py ocrbench \
--model "${THINK_MODE}/${MODEL_NAME}" \
--max-tokens 16384 \
--thinking \
--think-mode "$THINK_MODE" \
--stream \
--max-connections 50 \
--temperature 1.0 \
--top-p 0.95 \
--thinking-effort highuv run python eval.py mmmu --model kimi/your-model-id \
--think-mode kimi --max-tokens 65536 --streamuv run python eval.py mmmu --model kimi/your-model-id \
--thinking --think-mode kimi --max-tokens 65536 --streamuv run python eval.py mmmu \
--model "$MODEL" \
--max-tokens 98304 \
--thinking \
--think-mode "$THINK_MODE" \
--stream \
--max-connections 50 \
--temperature 1.0 \
--top-p 0.95 \
--thinking-effort highuv run python eval.py aime2025 --model kimi/your-model-id \
--think-mode kimi --max-tokens 98304 --streamuv run python eval.py aime2025 --model kimi/your-model-id \
--thinking --think-mode kimi --max-tokens 98304 --streamRun OCRBench first as a quick deployment sanity check, then run the full MMMU and other benchmark evaluations.
To cover that capability, we also add an agent benchmark based on the open-source DeepSWE benchmark. DeepSWE contains 113 coding-agent tasks and is used here through the open-source Pier platform. The agent runtime uses Kimi-code 0.23.6 or later.
Before running the benchmark on Pier, register kimi-code on the Pier agent first. See the Kimi-code 0.23.6 setup reference: https://github.com/MoonshotAI/kimi-code/tree/%40moonshot-ai/kimi-code%400.23.6
| Parameter | Description | Default |
|---|---|---|
benchmark |
Evaluation task: ocrbench, mmmu, aime2025 |
ocrbench |
--model |
Model identifier, for example kimi/your-model-id |
Required |
--max-tokens |
Maximum output tokens, see recommended benchmark parameters | Required |
--thinking |
Enable thinking mode | Off |
--think-mode |
Thinking parameter format: none, kimi, or opensource |
none |
--temperature |
Sampling temperature | Optional; determined by server or model defaults if omitted |
--top-p |
Top-p sampling | Optional; determined by server or model defaults if omitted |
--stream |
Enable streaming, recommended for long reasoning requests | Off |
--max-connections |
Maximum concurrent connections | Per benchmark |
--epochs |
Number of sampling epochs | Per benchmark |
--client-timeout |
HTTP timeout in seconds | 86400 |
--thinking-effort |
K3 reasoning effort parameter: low, high, max |
None |
| Model Type | Parameter Combination | extra_body Sent |
|---|---|---|
| Kimi official + thinking off | --think-mode kimi |
{"thinking": {"type": "disabled"}} |
| Kimi official + thinking on | --thinking --think-mode kimi |
{"thinking": {"type": "enabled"}} |
| Kimi official + reasoning effort low | --thinking --think-mode kimi --thinking-effort low |
{"thinking": {"type": "enabled", "keep": "all", "effort": "low"}} |
| Kimi official + reasoning effort high | --thinking --think-mode kimi --thinking-effort high |
{"thinking": {"type": "enabled", "keep": "all", "effort": "high"}} |
| Kimi official + reasoning effort max | --thinking --think-mode kimi --thinking-effort max |
{"thinking": {"type": "enabled", "keep": "all", "effort": "max"}} |
| Open-source framework + thinking off | --think-mode opensource |
{"chat_template_kwargs": {"thinking": false}} |
| Open-source framework + thinking on | --thinking --think-mode opensource |
{"chat_template_kwargs": {"thinking": true}} |
| Open-source framework + reasoning effort low | --thinking --think-mode opensource --thinking-effort low |
{"chat_template_kwargs": {"thinking": true, "preserve_thinking": true, "thinking_effort": "low"}} |
| Open-source framework + reasoning effort high | --thinking --think-mode opensource --thinking-effort high |
{"chat_template_kwargs": {"thinking": true, "preserve_thinking": true, "thinking_effort": "high"}} |
| Open-source framework + reasoning effort max | --thinking --think-mode opensource --thinking-effort max |
{"chat_template_kwargs": {"thinking": true, "preserve_thinking": true, "thinking_effort": "max"}} |
# View logs with inspect view
uv run inspect view
# Logs are saved in the logs/ directoryuv run inspect eval-retry logs/<log-file>.evalAIME evaluation produces many output tokens; please note the following:
- Timeout settings: the client default is
--client-timeout 86400(24 hours), and the server, gateway, or proxy timeout should also be long enough. - Streaming: strongly recommended with
--stream; non-streaming requests are more prone to timeout in thinking mode. - Concurrency control: if you see many 429s or
RemoteProtocolErrors, lower--max-connections. - Quick validation: first run all samples with
--epochs 1, then run the full evaluation after configuration is confirmed.
# Step 1: Quick validation (30 samples x 1 epoch)
uv run python eval.py aime2025 --model kimi/your-model-id \
--thinking --think-mode kimi --max-tokens 98304 --stream --epochs 1
# Step 2: Full evaluation (30 samples x 32 epochs)
uv run python eval.py aime2025 --model kimi/your-model-id \
--thinking --think-mode kimi --max-tokens 98304 --streamThe following network-related errors are automatically retried with exponential backoff (1-60 seconds), no manual configuration needed:
| Error Type | Description |
|---|---|
RateLimitError / 429 |
Server-side rate limiting |
APIConnectionError |
Connection failure |
ReadError / RemoteProtocolError |
Network read error |
Non-network errors, such as model output format issues, are not retried and are logged directly for later analysis.
├── eval.py # Main evaluation CLI entrypoint
├── tests/params/ # Pre-flight parameter validation
├── tests/tool_call_json_schema/ # walle tool-call schema validation
├── tests/prompt_tokens/ # usage.prompt_tokens accuracy validation
├── tests/k3_features/ # K3 feature contract validation
├── kimi_model.py # Kimi Model API implementation
├── aime2025.py # AIME 2025 evaluation task
├── mmmu_pro_vision.py # MMMU Pro Vision evaluation task
├── ocr_bench.py # OCRBench evaluation task
├── testdata/ # JSON schema and prompt-token test data
├── beam/ # BEAM 1M context data and scripts, see the directory README
├── logs/ # Evaluation logs
└── pyproject.toml # Project configuration
If you have any questions or suggestions, please contact contact-kvv@kimi.com.
This project is licensed under the MIT License. See LICENSE for details.