Instructions to use JuneoAI/Laplace-1-Vector with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use JuneoAI/Laplace-1-Vector with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="JuneoAI/Laplace-1-Vector", trust_remote_code=True) messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("JuneoAI/Laplace-1-Vector", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use JuneoAI/Laplace-1-Vector with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "JuneoAI/Laplace-1-Vector" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "JuneoAI/Laplace-1-Vector", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/JuneoAI/Laplace-1-Vector
- SGLang
How to use JuneoAI/Laplace-1-Vector with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "JuneoAI/Laplace-1-Vector" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "JuneoAI/Laplace-1-Vector", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "JuneoAI/Laplace-1-Vector" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "JuneoAI/Laplace-1-Vector", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use JuneoAI/Laplace-1-Vector with Docker Model Runner:
docker model run hf.co/JuneoAI/Laplace-1-Vector
Laplace-1-Vector
Judgment at the point of action.
A 4B causal-interventional decision model that lives where agents act, and keeps your data where it belongs.
Why Laplace · Evaluation · Decision Forge · Usage · Model details · Limitations
We ought then to regard the present state of the universe as the effect of its anterior state and as the cause of the one which is to follow.
— Pierre-Simon Laplace, A Philosophical Essay on Probabilities, 1814
Laplace-1-Vector is the edge member of Laplace-1, a family of causal-interventional decision models. Like a vector, every judgment it makes has a direction, the option it favors, and a magnitude, how strongly the evidence points there. At 4B parameters it runs beside the agent, on the organization's own hardware, so the judgment happens where the action happens and the data never leaves.
Highlights
- First on 7 of 8 decision benchmarks against models from Perplexity, IBM, Liquid AI, Together AI, TokenRhythm, and Shanghai AI Lab (ties counted).
- 89.6% on AgentDecisionBench L2 common and 88.1% on L2 shift, ahead of every model in this comparison.
- Flagship judgment at 15% of the size. On organizational decisions (COMPASS, OrgAccess) and Coherence, Vector stays within 0.5 points of the 27B Laplace-1-Atlas.
- Ahead of a model twice its size on every benchmark. Vector outscores IBM's Granite Switch 4.1 8B on all 8 benchmarks, by 2.3 to 26.1 points.
- A decision is one forward pass. Read a distribution over your candidates from the next-token logits, with no sampling and no parsing. That makes it cheap enough to put in front of every action.
- Open weights, Apache-2.0. Complete BF16 weights (8.2 GB) and tokenizer. No adapter, no gated access.
Why Laplace
Every leap in human cooperation, from tribes to the joint-stock company to the internet, was an expansion of trust among strangers. The next leap is already here: organizations of people and agents, where agents will soon outnumber people. Agents are wired into every tool through A2A and MCP, yet nothing tells them, or the people who delegate to them, what an action will do before it runs. Intelligence is no longer scarce. Trust is.
Trust begins with foresight. Language models learned from text, and world models are learning from video, but public data is observational: it never records what an action caused inside an organization. Laplace learns the interventional distribution
the next state of an organization $s$ after a candidate action $a$, under the chain of authority $C$ behind the agent. Foresight is what every act of delegation needs. Laplace turns it into the four decisions an organization makes whenever people and agents work together:
| Decision | The question | For example |
|---|---|---|
| Allocate work | Who should own this task? | Grade a new sales lead and recommend the three people best placed to follow it up |
| Share information | Who may see what, and how much? | Show a client's sensitive details only to the roles that need them |
| Act | Run it, adjust it, or ask first? | Dispatch a repair order on its own; send a contract above the limit to its owner |
| Evaluate outcomes | Does the result meet the standard? | Check a deliverable against its acceptance criteria before it is signed off |
The better an organization can foresee the consequence of each decision, the more of its work it can hand to agents.
The full story of Laplace will be told in our upcoming technical blog.
Meet Laplace-1
Laplace-1 is the first public release of the Laplace program, in two sizes:
| Model | Parameters | Role | Where it runs |
|---|---|---|---|
| Laplace-1-Atlas | 27.4B | Flagship. Carries the whole map of consequences. | Organization servers and private cloud |
| Laplace-1-Vector (this model) | 4.1B | Edge. Judgment at the point of action. | On-premises and on-device, data never leaves |
Both models expose two inference primitives:
- Candidate scoring. Give it a state, a question, and candidates. It returns a distribution over exactly those candidates in a single forward pass: routing, access decisions, escalation, and next-action selection.
- Outcome prediction. Give it explicit environment rules, context, and an action. It generates the next observation, so you see the consequence before the action happens.
Evaluation
| Benchmark | Laplace-1-Vector 4B · Juneo |
Decider Flash v1.2 4B · Perplexity |
Tev1-4B Together AI |
NeoHorse-Jev-4B TokenRhythm |
d1-3B Liquid AI |
Granite Switch 4.1 8B · IBM |
Intern-Decision-4B Shanghai AI Lab |
|---|---|---|---|---|---|---|---|
| JevBench | 89.0 | 89.0 | 83.2 | 78.5 | 84.3 | 82.2 | 88.5 |
| JEVal | 68.2 | 75.0 | 54.6 | 55.2 | 64.6 | 65.9 | 58.0 |
| When2Call | 83.1 | 76.8 | 62.0 | 58.0 | 80.4 | 57.1 | 69.5 |
| AgentDecisionBench L2 common | 89.6 | 85.8 | — | 63.9 | 54.8 | 67.9 | — |
| AgentDecisionBench L2 shift | 88.1 | 85.6 | — | 68.8 | 56.2 | 62.0 | — |
| Coherence | 85.2 | 83.2 | 75.2 | — | 74.3 | 72.6 | — |
| COMPASS | 84.9 | 83.1 | 81.7 | 80.4 | 68.8 | 78.9 | 77.0 |
| OrgAccess | 44.6 | 31.7 | 28.2 | 31.7 | 35.6 | 30.5 | 38.3 |
Scores in %. Bold marks the best score in each row, ties included. "—" means the score is not published or the model does not support the setting.
What the numbers say
- Small does not mean shallow. Vector leads every model here on agent decisions under both common and shifted distributions, by 3.8 and 2.5 points over the next-best model, including IBM's 8B Granite Switch 4.1.
- Knowing when to act. On When2Call, Vector scores 83.1%, 6.3 points above Decider Flash v1.2. Not acting is a decision too.
- Organizations are the frontier. Vector is first on both COMPASS and OrgAccess. On OrgAccess it leads the next-best model by 6.3 points and Decider Flash v1.2 by 12.9. Even so, OrgAccess remains unsolved for every model of every size, and that open frontier is exactly why Laplace learns inside organizations.
- Where we trail. JEVal is Vector's one gap (−6.8 against Decider Flash v1.2). We report it because a model card that hides its weaknesses is not one you should trust.
Vector and Atlas
| Benchmark | Laplace-1-Vector 4.1B | Laplace-1-Atlas 27.4B | Gap |
|---|---|---|---|
| COMPASS | 84.9 | 85.3 | −0.4 |
| OrgAccess | 44.6 | 44.8 | −0.2 |
| Coherence | 85.2 | 85.7 | −0.5 |
| AgentDecisionBench L2 common | 89.6 | 95.6 | −6.0 |
| When2Call | 83.1 | 89.9 | −6.8 |
On organizational decisions, Vector carries the flagship's judgment at 15% of its parameters. Use Atlas where the broadest reasoning matters; use Vector wherever latency, cost, or data residency means the judgment has to run next to the action.
The Decision Forge data protocol treats public test sets, including COMPASS and OrgAccess, as evaluation-only: their answers and any derivative examples are excluded from training data.
Where the judgment comes from: Decision Forge
The data Laplace needs does not exist on the public web. It lives inside organizations, in three forms:
| Ingredient | What it is | Where it lives |
|---|---|---|
| Decision context $x$ | The state, roles, permissions, and options at the moment an agent acts | Workflows, tickets, CRM records, tool outputs |
| Judgment standard $\ell$ | What this organization allows, forbids, or escalates | Handbooks, SOPs, approval rules, human sign-offs |
| Execution receipt $s'$ | What actually changed after the action | Approvals, outcomes, runtime logs |
The judgment standard is sovereign: two organizations can judge the same action in opposite ways, and both can be right. There is no universal "correct decision" to learn once and ship to everyone.
Decision Forge, our open-source data layer, compiles
an organization's own documents into verified decision training data. Every label traces back to a
rule, and every rule to a sentence in a source document. The core runs offline, inside the
organization's own walls, and every example belongs to one of the same four decisions Laplace makes. Its decision export uses the same candidate-readout contract as
Laplace-1's candidate scoring: single-token labels under the native chat template, read out at the
final prompt position. The data pipeline and the model speak the same language.
The more accurately Laplace judges, the more authority organizations delegate. More delegation produces more receipts, and more receipts teach Laplace the organization better.
Usage
Laplace supports two text inference modes:
- Candidate scoring: provide a state, a question, and candidate descriptions. The model returns a distribution over the supplied candidates using a single forward pass. Use this mode for classification, routing, access decisions, and next-action selection.
- Outcome prediction: provide explicit environment rules, context, and an action, then generate a textual prediction of the next observation.
Both repositories contain complete model weights and tokenizer files; no separate adapter is required. The examples below use PyTorch, Transformers, and Accelerate, with BF16 weights and automatic device placement. Atlas requires a Transformers version providing Qwen3_5ForConditionalGeneration. Vector uses the custom model implementation supplied with its repository through trust_remote_code=True.
Load the model and score candidates
The helper below uses the native chat template with thinking disabled. Candidate keys are stable application identifiers; temporary single-token labels are assigned internally and mapped back to those keys.
"""Text-only Laplace inference examples. Does not execute selected actions."""
import json
import string
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
def load_laplace(model_id="JuneoAI/Laplace-1-Vector"):
if model_id == "JuneoAI/Laplace-1-Atlas":
from transformers import Qwen3_5ForConditionalGeneration
model_class = Qwen3_5ForConditionalGeneration
kwargs = {"attn_implementation": "sdpa"}
elif model_id == "JuneoAI/Laplace-1-Vector":
model_class = AutoModelForCausalLM
kwargs = {"trust_remote_code": True, "attn_implementation": "eager"}
else:
raise ValueError("Choose Laplace-1-Atlas or Laplace-1-Vector.")
tokenizer = AutoTokenizer.from_pretrained(
model_id, trust_remote_code=model_id == "JuneoAI/Laplace-1-Vector"
)
model = model_class.from_pretrained(
model_id, dtype=torch.bfloat16, device_map="auto", **kwargs
).eval()
return tokenizer, model
def encode_messages(tokenizer, messages):
text = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True,
enable_thinking=False,
)
return tokenizer(text, add_special_tokens=False, return_tensors="pt")
def decision_messages(tokenizer, state, question, choices):
"""choices maps stable application keys to textual candidate descriptions."""
if not choices:
raise ValueError("Supply at least one candidate.")
keys = list(choices)
names = list(string.ascii_uppercase) + [
a + b for a in string.ascii_uppercase for b in string.ascii_uppercase
]
labels, token_ids, seen = [], [], set()
for name in names:
ids = tokenizer.encode(name, add_special_tokens=False)
if len(ids) == 1 and ids[0] not in seen:
labels.append(name)
token_ids.append(ids[0])
seen.add(ids[0])
if len(labels) == len(keys):
break
if len(labels) != len(keys):
raise ValueError("Not enough distinct single-token candidate labels.")
payload = {
"state": state,
"question": question,
"candidates": [
{"letter": label, "description": choices[key]}
for label, key in zip(labels, keys)
],
}
messages = [
{
"role": "system",
"content": "Choose the supported answer from the supplied candidates. "
"Output only its letter.\nReturn exactly one supplied candidate label.",
},
{"role": "user", "content": json.dumps(payload, ensure_ascii=False)},
]
return messages, keys, token_ids
@torch.inference_mode()
def score_candidates(tokenizer, model, state, question, choices):
messages, keys, candidate_ids = decision_messages(
tokenizer, state, question, choices
)
inputs = encode_messages(tokenizer, messages).to(
model.get_input_embeddings().weight.device
)
# One forward pass; read only the logits for the next token.
logits = model(**inputs, use_cache=False, logits_to_keep=1).logits[0, -1]
scores = logits[candidate_ids].float()
if not torch.isfinite(scores).all():
raise RuntimeError("Non-finite candidate logits.")
probabilities = scores.softmax(dim=-1).cpu().tolist()
return {
"choice": keys[max(range(len(keys)), key=lambda i: probabilities[i])],
"probabilities": dict(zip(keys, probabilities)),
}
@torch.inference_mode()
def predict_observation(tokenizer, model, rules, context, max_new_tokens=256):
messages = [
{"role": "system", "content": rules},
{"role": "user", "content": json.dumps(context, ensure_ascii=False)},
]
inputs = encode_messages(tokenizer, messages).to(
model.get_input_embeddings().weight.device
)
output = model.generate(
**inputs, max_new_tokens=max_new_tokens, do_sample=False,
pad_token_id=tokenizer.eos_token_id,
)
return tokenizer.decode(
output[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True
).strip()
tokenizer, model = load_laplace("JuneoAI/Laplace-1-Vector")
# For Atlas, use: load_laplace("JuneoAI/Laplace-1-Atlas")
result = score_candidates(
tokenizer,
model,
state={
"permissions": ["read_records"],
"request": "Delete a record.",
},
question="Which decision is supported by the supplied permissions?",
choices={
"allow": "Allow the request.",
"deny": "Deny the request.",
},
)
print(result["choice"])
print(result["probabilities"])
choice is the application key with the highest score. probabilities contains the softmax-normalized next-token logits restricted to the supplied candidate labels. These values are relative to this candidate set, not a calibrated guarantee of correctness. The model does not generate a probability JSON; the client constructs the result from logits. Include a reject, abstain, or request-more-information option when the task requires one.
Changing candidate order requires changing the label-to-key mapping consistently. Do not hard-code tokenizer IDs or score the tokens of full candidate descriptions with this method.
One interface, four decisions
Every decision Laplace makes has the same shape: a state, a question, and the candidates your application allows. Here the same helper allocates work: choosing who should own a new sales lead under the organization's own routing rules.
owner = score_candidates(
tokenizer,
model,
state={
"lead": {
"industry": "power utilities",
"region": "East",
"estimated_value_cny": 3200000,
"stage": "new",
},
"policy": [
"Leads above 1,000,000 CNY go to a senior account manager.",
"Account managers only take leads in their own region.",
"Prefer the manager with the most experience in the lead's industry.",
],
},
question="Who should own this lead?",
choices={
"li": "Li Wei: senior account manager, East region, 12 closed deals in power utilities.",
"zhang": "Zhang Min: account manager, East region, 2 closed deals in power utilities.",
"chen": "Chen Jie: senior account manager, South region, 9 closed deals in power utilities.",
},
)
print(owner["choice"], owner["probabilities"])
The other three decisions change only the question and the candidates:
| Decision | Question | Candidates you supply |
|---|---|---|
| Allocate work | Who should own this task? | The people or agents who could take it |
| Share information | What may this recipient receive? | Full record · summary only · nothing |
| Act | What should happen to this action before it runs? | Proceed · hand back to a person · block |
| Evaluate outcomes | Does this deliverable meet the acceptance criteria? | Accept · request changes · reject |
The model scores; it never executes. Your application decides what each choice means, including the probability below which a decision goes to a person.
Predict a next observation
Use generation when the desired output is a textual next-observation prediction rather than a candidate distribution. Supply the relevant rules explicitly. This example describes a small illustrative environment; it does not run a live action.
rules = (
"Predict the next environment observation after the supplied action. "
"Return only JSON. The state contains owner, open, and severity. "
"The resolve action sets open=false and preserves the other fields. "
'The observation format is {"state": {"owner": ..., '
'"open": ..., "severity": ...}}. Do not add fields.'
)
context = {
"state": {"owner": "operator", "open": True, "severity": "normal"},
"history": [],
"action": {"kind": "resolve"},
}
text = predict_observation(tokenizer, model, rules, context)
print(text)
A predicted observation is model-generated text, not confirmation that an external system performed an action. If consuming it as JSON, parse and validate its schema before use; generation alone does not enforce the schema.
The chat template is rendered first and then tokenized with add_special_tokens=False to avoid adding duplicate special tokens. See the Transformers chat-template documentation.
Model details
| Laplace-1-Vector | |
|---|---|
| Developer | Juneo Lab |
| Family | Laplace-1 (Atlas · Vector) |
| Base model | XHToken/Spark-X2.6-4B |
| Architecture | Spark2_5ForCausalLM (custom code, trust_remote_code=True): decoder interleaving sliding-window attention (window 512) and full attention at 3:1, with head-wise gated attention output |
| Parameters | 4.11B |
| Layers | 36 · hidden size 2,560 · 16 attention heads, 4 KV heads · head dim 256 · tied embeddings |
| Vocabulary | 131,072 tokens |
| Max position embeddings | 1,048,576 (configuration value) |
| Precision | BF16, 3 safetensors shards, 8.2 GB |
| Inference modes | Candidate scoring (one forward pass) · outcome prediction (generation) |
| Chat template | Native template; use enable_thinking=False for both modes shown above |
| Requirements | PyTorch, Accelerate, and Transformers with trust_remote_code=True (the weights were saved with Transformers 4.57.1). The examples use attn_implementation="eager". |
| Hardware | BF16 weights need about 8.2 GB of accelerator memory before activations, within reach of a single workstation GPU. |
| License | Apache-2.0. Upstream license notices are retained in this repository. |
Intended use and limitations
Built for: the four decisions organizations delegate to people and agents (allocating work, sharing information, acting, and evaluating outcomes) on the organization's own hardware, and predicting the next state of an explicitly described environment.
Laplace advises; your system decides.
- A judgment layer, not an enforcement layer. Laplace does not execute actions and does not replace access control, authentication, or audit logging. Keep deterministic permission checks in place. Laplace decides what to do within them.
- Probabilities are relative. Candidate probabilities are normalized over the candidates you supply. They are not a calibrated probability of being correct. Calibrate thresholds on your own held-out decisions before you automate on them, and always offer a hand-back or request-more-information option when the stakes call for one.
- Your standard is not universal. Laplace-1 is trained for general and organizational decision making. An organization's own standard ($\ell$) differs from every other's. Put the governing rules in the state, and evaluate on your own cases before deployment.
- Predictions are not receipts. A predicted observation is text, not evidence that anything happened. Validate structured outputs against a schema.
- Size has a cost. Vector trails Atlas by about 6 to 7 points on agent decisions and When2Call. Route the hardest or highest-stakes cases to Atlas or to a person.
- Hard frontiers remain. As OrgAccess shows, fine-grained organizational access reasoning is far from solved, for Laplace and for every model in this comparison.
- Custom code. Loading requires
trust_remote_code=True. Reviewmodeling_spark.pyandconfiguration_spark.pyand pin a revision for production.
Do not use Laplace-1 as the sole safeguard for irreversible, safety-critical, financial, medical, or legal actions. In those settings, a person keeps the final decision.
The world we are building
Humans keep the right to decide. Agents earn the right to act. An organization can then entrust its work to far more agents than it has people, because:
- every action is foreseen before it happens;
- every delegation narrows authority as work passes from hand to hand, and never widens it;
- every contribution is measured and credited once the work is done.
| Today | Let one organization trust its agents: every action passes through Laplace first. |
| Next | Make every organization AI-native, each with a Laplace of its own. |
| Endgame | Let any two agents work together safely, even strangers that have never met. |
Payment networks authorize every transaction before it clears. We are building the same layer for every agent action: a judgment made in real time, by the organization's own standard, before the action happens.
We are building the trust layer that lets human organizations keep pace with machine intelligence.
Citation
@misc{juneo2026laplace1,
title = {Laplace-1: Causal-Interventional Decision Models for Trustworthy Agent Delegation},
author = {{Juneo Lab}},
year = {2026},
howpublished = {\url{https://huggingface.co/JuneoAI/Laplace-1-Vector}},
note = {Model family: Laplace-1-Atlas (27B), Laplace-1-Vector (4B)}
}
License
Laplace-1-Vector is released under the Apache-2.0 License. It is built on XHToken/Spark-X2.6-4B; the upstream license notices are retained in this repository.
Contact
Partnerships, deployments, and research collaboration: business@juneo.ai
Building on Decision Forge? Open an issue or discussion at Juneo-Lab/decision-forge.
- Downloads last month
- 186