Views
No views yet
[!NOTE] For more details on how we trained this model, including on data automixing and async off-policy agent RL, check out our release blog post.
| Model | Size (total params.) | SWE-bench Verified | SWE-bench Multilingual | SWE-bench Pro (Public Dataset) | Terminal-Bench 2.0 |
|---|---|---|---|---|---|
| Laguna XS.2 | 33B | 68.2% | 62.4% | 44.5% | 30.1% |
| Devstral Small 2 | 24B dense | 68.0% | 55.7% | - | 22.5% |
| Gemma 4 31B IT | 31B dense | 52.0% | 51.7% | 35.7% | 42.9% |
| Qwen3.5-35B-A3B | 35B | 69.2% | 60.3% | 44.6% | 40.5% |
| Qwen3.6-35B-A3B | 35B | 73.4% | 67.2% | 49.5% | 51.5% |
| Claude Haiku 4.5 | - | 73.3% | - | 39.5% | 29.8% |
| GPT-5.4 Nano | - | - | - | 52.4% | 46.3% |
[!NOTE] We are providing free access for a limited time to Laguna XS.2, and our larger 225B model, Laguna M.1, on our API. You can create an API key on our Platform.
curl -fsSL https://downloads.poolside.ai/pool/install.sh | bashpoolpool acp setup --editor zed|jetbrains1ollama pull laguna-xs.2
2ollama launch pool --model laguna-xs.2/feedback and read the full documentation on GitHub.[!NOTE] Laguna XS.2 support has been merged into vLLM (vllm-project/vllm#41129) and will ship in the next release. Until then, install a nightly wheel:
1pip install vllm --pre --extra-index-url https://wheels.vllm.ai/nightly
2
3VLLM_USE_DEEP_GEMM=0 vllm serve \
4 --model poolside/Laguna-XS.2 \
5 --tool-call-parser poolside_v1 \
6 --reasoning-parser poolside_v1 \
7 --enable-auto-tool-choice \
8 --served-model-name laguna \
9 --default-chat-template-kwargs '{"enable_thinking": true}'[!NOTE] DFlash support landed in vLLM via vllm-project/vllm#41880 and is available in the nightly wheels above.VLLM_USE_DEEP_GEMM=0is required: DeepGEMM is currently incompatible with the DFlash draft path.
1VLLM_USE_DEEP_GEMM=0 vllm serve poolside/Laguna-XS.2 \
2 --trust-remote-code \
3 --enable-auto-tool-choice \
4 --tool-call-parser poolside_v1 \
5 --reasoning-parser poolside_v1 \
6 --speculative-config '{"model":"poolside/Laguna-XS.2-speculator.dflash","num_speculative_tokens":7,"method":"dflash"}'v5.7.0 and later (huggingface/transformers#45673).1import torch
2from transformers import AutoModelForCausalLM, AutoTokenizer
3
4model_id = "poolside/Laguna-XS.2"
5
6tokenizer = AutoTokenizer.from_pretrained(model_id)
7model = AutoModelForCausalLM.from_pretrained(
8 model_id,
9 dtype=torch.bfloat16,
10 device_map="auto",
11)
12
13messages = [
14 {"role": "user", "content": "Write a Python retry wrapper with exponential backoff."},
15]
16
17# Reasoning is on by default; pass enable_thinking=False to skip the <think> block.
18inputs = tokenizer.apply_chat_template(
19 messages,
20 add_generation_prompt=True,
21 return_tensors="pt",
22 enable_thinking=True,
23).to(model.device)
24
25outputs = model.generate(
26 inputs,
27 max_new_tokens=1024,
28 do_sample=True,
29 temperature=0.7,
30 top_k=20,
31)
32
33response = tokenizer.decode(outputs[0][inputs.shape[-1]:], skip_special_tokens=True)
34print(response)[!NOTE] Requires building TensorRT-LLM from the upstream PR that adds Laguna XS.2 support (NVIDIA/TensorRT-LLM#13559). Once that PR merges, the same code will work on a releasedtensorrt-llmwheel.
configuration_laguna.py imports a few transformers >= 4.58 symbols.
TRT-LLM currently pins transformers 4.57, so the PR ships a laguna_minimal_overlay.sh script that symlinks the checkpoint and patches only the config file with a compat shim. Load TRT-LLM against the overlay directory, not the original checkpoint.1# 1. Check out the PR branch and build TRT-LLM from source (see the TensorRT-LLM build docs).
2git clone https://github.com/NVIDIA/TensorRT-LLM.git && cd TensorRT-LLM
3git fetch origin pull/13559/head:laguna && git checkout laguna
4
5# 2. Download the checkpoint.
6huggingface-cli download poolside/Laguna-XS.2 --local-dir ~/models/Laguna-XS.2
7
8# 3. Build the transformers-4.57 compat overlay (echoes the overlay path).
9OVERLAY=$(bash laguna_minimal_overlay.sh ~/models/Laguna-XS.2)1from tensorrt_llm import LLM, SamplingParams
2
3llm = LLM(
4 model=OVERLAY, # overlay path, not the original checkpoint
5 trust_remote_code=True,
6 tensor_parallel_size=1,
7)
8
9sampling = SamplingParams(max_tokens=1024, temperature=0.7, top_k=20)
10out = llm.generate(["Write a Python retry wrapper with exponential backoff."], sampling)
11print(out[0].outputs[0].text)trtllm-serve "$OVERLAY" --port 8000 --trust-remote-codequantization_config, no extra flags required.reasoning content from prior assistant messages is preserved in the message history. This model will generally reason before calling tools and between tool calls.1import json
2from openai import OpenAI
3
4client = OpenAI(
5 base_url="https://inference.poolside.ai/v1",
6 api_key="...",
7)
8
9model = "poolside/laguna-xs.2"
10
11tools = [{"type": "function", "function": {
12 "name": "shell",
13 "description": "Execute a bash command and return the output.",
14 "parameters": {"type": "object", "properties": {"cmd": {"type": "string"}}, "required": ["cmd"]},
15}}]
16
17messages = [
18 {"role": "system", "content": "You are a coding agent with access to a shell tool."},
19 {"role": "user", "content": "Run uname -a"},
20]
21
22# Thinking is enabled by default when the server sets --default-chat-template-kwargs {"enable_thinking": True}
23# When using the Poolside API (https://inference.poolside.ai/v1), this flag is set by default
24response = client.chat.completions.create(
25 model=model,
26 messages=messages,
27 tools=tools,
28 stream=True,
29)
30
31reasoning, content, tool_calls = "", "", []
32for chunk in response:
33 delta = chunk.choices[0].delta
34 if hasattr(delta, "reasoning_content") and delta.reasoning_content:
35 reasoning += delta.reasoning_content
36 if hasattr(delta, "content") and delta.content:
37 content += delta.content
38 if hasattr(delta, "tool_calls") and delta.tool_calls:
39 for tc in delta.tool_calls:
40 if tc.index >= len(tool_calls):
41 tool_calls.append({"id": tc.id, "function": {"name": "", "arguments": ""}})
42 if tc.function.name:
43 tool_calls[tc.index]["function"]["name"] = tc.function.name
44 if tc.function.arguments:
45 tool_calls[tc.index]["function"]["arguments"] += tc.function.arguments
46
47print(f"Reasoning: {reasoning}\nContent: {content}\nTool calls: {tool_calls}\n")
48
49# Return reasoning in the next request for best performance
50messages.append({
51 "role": "assistant",
52 "content": content,
53 "reasoning_content": reasoning,
54 "tool_calls": [{"id": tc["id"], "type": "function", "function": tc["function"]} for tc in tool_calls]
55})
56
57messages.append({
58 "role": "tool",
59 "tool_call_id": tool_calls[0]["id"],
60 "content": json.dumps({"stdout": "Darwin arm64", "exit_code": "0"})
61})
62
63response = client.chat.completions.create(
64 model=model,
65 messages=messages,
66 tools=tools,
67 stream=True,
68)
69
70reasoning, content = "", ""
71for chunk in response:
72 delta = chunk.choices[0].delta
73 if hasattr(delta, "reasoning_content") and delta.reasoning_content:
74 reasoning += delta.reasoning_content
75 if hasattr(delta, "content") and delta.content:
76 content += delta.content
77
78print(f"Reasoning: {reasoning}\nContent: {content}")enable_thinking to False in a request or by not providing --default-chat-template-kwargs {"enable_thinking": True} or equivalent when starting the server.1from openai import OpenAI
2client = OpenAI()
3
4completion = client.chat.completions.create(
5 model="poolside/laguna-xs.2",
6 messages=[
7 {"role": "user", "content": "Write a retry wrapper with exponential backoff."}
8 ],
9 extra_body={
10 "chat_template_kwargs": { "enable_thinking": False },
11 },
12 stream=True
13)
14
15for chunk in completion:
16 print(chunk.choices[0].delta)