Views
No views yet
[!NOTE] For more details on how we trained this model, including our Model Factory approach, post-training recipe, async off-policy agent RL, and evaluations, check out our release blog post and technical report.
| Model | Parameters | SWE-bench Verified | SWE-bench Multilingual | SWE-bench Pro (Public Dataset) | Terminal-Bench 2.0 |
|---|---|---|---|---|---|
| Laguna M.1 | 225B-A23B | 74.6% | 63.1% | 49.2% | 45.8% |
| Devstral 2 | 123B dense | 72.2% | 61.3% | - | 32.6% |
| GLM-4.7 | 355B-A32B | 73.8% | 66.7% | - | 41.0% |
| DeepSeek-V4 Flash | 284B-A13B | 79.0% | 73.3% | 52.6% | 56.9% |
| Qwen3.5-397B-A17B | 397B-A17B | 76.2% | 69.3% | 50.9% | 52.5% |
| Claude Sonnet 4.6 | - | 79.6% | - | - | 59.1% |
[!NOTE] All benchmarking for Laguna M.1 was completed using our pool agent harness, with a maximum of 500 steps and sandboxed execution. The same sampling parameters were used for all Laguna M.1 benchmarking: temperature=1.0 and top_k=20, with thinking mode enabled and a context length of 256K tokens. All tasks were run in their own sandbox using 8 GB RAM/2 CPUs, with the exception of Terminal-Bench 2.0, which used 48 GB RAM/32 CPUs.Some base task images and verifiers were patched to fix infrastructure reliability issues inherent in task setup, such as rate limits on third-party dependencies in external registries used by the verifier. All four agentic benchmarks were run with patched images. We also ran a reward-hack judge post-hoc on Laguna M.1 evaluation runs and did not find significant reward hacking after joint judge review and manual review.
- SWE-bench Verified: mean pass@1 averaged over 4 runs
- SWE-bench Multilingual: mean pass@1 averaged over 4 runs
- SWE-Bench Pro: mean pass@1 averaged over 4 runs
- Terminal-Bench 2.0: mean pass@1 averaged over 4 runs; 48 GB RAM/32 CPUs
curl -fsSL https://downloads.poolside.ai/pool/install.sh | bashpoolpool acp setup --editor zed|jetbrains/feedback and read the full documentation on GitHub.[!NOTE] Laguna support landed in vLLM via vllm-project/vllm#41129 (shared with Laguna XS.2) and is available in vLLM 0.21.0 and later.
1pip install 'vllm>=0.21.0'
2
3vllm serve \
4 --model poolside/Laguna-M.1 \
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}'quantization_config, so the same command works with the model ID substituted.[!NOTE] Laguna support was added to SGLang in sgl-project/sglang#24204. The integration is shared with Laguna XS.2 and is currently available on SGLang main.
1# Laguna M.1 support is currently on SGLang main, so install from source
2git clone https://github.com/sgl-project/sglang.git
3cd sglang
4pip install -e "python[all]"
5
6sglang serve \
7 --trust-remote-code \
8 --model-path poolside/Laguna-M.1 \
9 --tool-call-parser poolside_v1 \
10 --reasoning-parser poolside_v1 \
11 --tp 8 \
12 --host 0.0.0.0quantization_config, so you can use the same launch command after replacing the model ID. For more SGLang-specific deployment details, see the SGLang Cookbook.v5.7.0 and later (huggingface/transformers#45673).[!NOTE] Laguna M.1 is a 225B-parameter model; loading the BF16 checkpoint in Transformers requires substantial multi-GPU memory (device_map="auto"shards across available devices). For single-node serving, vLLM or SGLang is recommended.
1import torch
2from transformers import AutoModelForCausalLM, AutoTokenizer
3
4model_id = "poolside/Laguna-M.1"
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(inputs, max_new_tokens=1024, do_sample=True, temperature=1.0, top_k=20)
26print(tokenizer.decode(outputs[0][inputs.shape[-1]:], skip_special_tokens=True))main that includes these PRs (or a release once they ship).1from tensorrt_llm import LLM, SamplingParams
2
3llm = LLM(model="poolside/Laguna-M.1", trust_remote_code=True)
4sampling = SamplingParams(max_tokens=1024, temperature=1.0, top_k=20)
5out = llm.generate(["Write a Python retry wrapper with exponential backoff."], sampling)
6print(out[0].outputs[0].text)[!NOTE] If your TensorRT-LLM build pinstransformers < 4.58,configuration_laguna.pyneeds a small compat shim; use thelaguna_minimal_overlay.shhelper from the support PR and load TRT-LLM against the overlay directory.
quantization_config, so the same recipe works for the FP8 and NVFP4 variants with no extra flags.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-m.1"
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-m.1",
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)