Start building with Muse Ember, our smallest, most efficient model

Muse Ember is here.
Meta blue bg
Built for high-volume execution and multimodal inputs, Muse Ember handles coding subtasks, tool calls and document summarization and extraction efficiently.
By Young Han, Sidhartha Reddy Potu, Varun Vontimitta, Josh Walters

Today we're introducing Muse Ember in Muse Code and on Meta Model API. Built for fast, agentic execution at scale, Muse Ember handles coding tasks, tool calls, and document analysis, with support for text, image, audio, and video inputs.

Muse Ember is now available in all Muse Code subscription plans, and optimized for low price-per-task at $0.10 input / $0.50 output per million tokens. Use it for repeated, bounded work, and pair it with Muse Wonder or Muse Spark for agentic workflows requiring deeper planning, reasoning and orchestration.

Install Muse Code today to start building:

curl -fsSL https://dev.meta.ai/install.sh | bash

Below, we'll look at two ways to use Muse Ember in conjunction with Muse Wonder, a parallel code migration and a batch photo-organization workflow. For more details on the models and their research foundations, check out the Muse Ember post on the Meta AI Research blog.

TL;DR

  • Multiple models, one workflow: Use Muse Ember for everyday tasks, or combine Muse Ember’s high-volume execution with the deep planning, reasoning and orchestration capabilities of larger models for end-to-end agentic workflows.
  • Efficient, everyday execution: Muse Ember handles repeated coding subtasks, tool calls, routing and document processing. A lightweight model built for high-volume work, Muse Ember brings fast, efficient execution to everyday coding and agentic workflows.
  • Multimodality at scale: Work with text, image, audio and video inputs using Muse Ember, bringing multimodal understanding to high-volume agent workflows.
  • Recipes covered in this blog

Muse Ember: An execution model for everyday workflows

Use Muse Ember for repeated, bounded work and pair it with Muse Spark or Muse Wonder when a workflow needs deeper planning and reasoning – Muse Wonder tackles the hardest problems, while Muse Ember handles everyday agent workloads, helping make those capabilities practical at scale.

Muse Ember scores 36 on the Artificial Analysis Intelligence Index, and at max reasoning effort, its estimated model cost is about $0.13 per Intelligence Index task.

Intelligence vs. Cost Per Task

Muse Ember is competitive in its class across multimodal, agentic, and coding tasks, and outperforms similar-class models on AutomationBench-AA and Terminal-Bench 4.0:

Muse Ember (max)

Claude Haiku 5.5 (max)

GPT-6 Luna (max)

Agents

AutomationBench-AA

E2E business workflows

37.8

13.9

20.2

Agents' Last Exam

End-to-end agent tasks

61.6

57.0

57.1

Personal Superintelligence Index

Internal composite index of personal and knowledge work

46.8

36.1

37.0

Coding

Terminal-Bench 4.0

Agentic terminal coding, best published harness

40.9

39.2

16.4

Coding Agent Index-AA

Coding in real agent harnesses

46

37

31

FrontierCode 2.0-AA

Real engineering tasks judged on mergeability

27.2

34.9

25.2

Multimodal

GDP.pdf-AA

Professional work over long documents

22.8

20.8

22.8

OSWorld 2.1

Computer use across desktop apps

69.5

(partial)

33.8

(binary)

68.9

(partial)

27.8

(binary)

50.5

(partial)

17.0

(binary)

PerceptionBench (w/ tools)

Fine-grained visual perception

80.6

78.6

62.8

General

Artificial Analysis Index

36

36

28

Natively multimodal

Muse Ember supports text, image, audio and video inputs, so agents can read screenshots, charts and scanned documents, or work from voice memos and meeting recordings without a separate model. You can ask it to interpret a screenshot alongside a bug report, extract information from a scanned document, summarize action items from meeting audio, or describe the sequence of actions shown in a video clip.

When working with Muse Ember, keep the task specific and provide the relevant source material. For example, for an invoice image with a supplied page label:

none
Extract the invoice number, issue date, and total. For each field, return the value, source-page label, and a status of present, missing, or unreadable. Use null when the value is unavailable.

Multiple models, one workflow

When workflows require pairing high-volume execution with deep planning and reasoning, pair Muse Ember with Muse Wonder or Muse Spark to match task complexity to model capability. One way to structure a coding workflow:

Workflow step
Suggested model role
Plan a change across a repository, including dependencies and acceptance criteria.
Muse Wonder or Muse Spark
Work on a bounded subtask using the relevant files, constraints and tests.
Muse Ember
Review the combined changes and reason through unresolved issues.
Muse Wonder or Muse Spark, alongside developer review

Define the handoff: the task, relevant context, files the worker can change, acceptance checks and the result to return. Your application or agent harness chooses the model for each call and carries that context between steps. When a worker finds a broader dependency or an unclear requirement, send the finding back to the planner before continuing.

Muse Code provides the tools to edit files, run checks and coordinate agents. A direct API call returns model output; your application runs any requested tools and returns their results. The examples below use Muse Code and task-specific scripts to carry out the work.

BOX

“On the Box AI Complex Work Eval, Muse Ember delivers impressive accuracy, speed and token efficiency. It can score a contract against a company's negotiation playbook clause by clause and land on the right overall risk rating, or screen candidates against a detailed brief and flag the borderline ones who still qualify as alternates. Muse Ember is a fast, efficient foundation for agents doing real work on enterprise content.”

YASHODHA BHAVNANI

VP of AI Products

Box

Slide 1 of 5

Example: Convert Python Codebase to Rust with Parallel Agents

Muse Code can run one large model and many small agents in a single session. To show how they work together, we used them on a real code migration: porting 16 language lexers in Pygments, the Python syntax highlighter, from Python to Rust without breaking functionality.

Muse Wonder plans and supervises. The cookbook's starter kit supplies the shared Rust engine every lexer runs on, so the run starts with the checker. Muse Wonder never opens the source itself: one agent reads the Python lexers, the engine and the checker and returns a map of how each lexer fits, and Muse Wonder turns that map into a brief for each agent: which file it owns, which engine interfaces it needs and how to check the result. The map showed that some Python lexers rewrite their token stream after lexing, which the engine couldn't express. Muse Wonder had a worker add a shared post-filter to the engine while the Python example was being ported, before any porter started, and the C, C++, Lua and Swift ports used it. When one worker ran git in the main checkout by mistake, Muse Wonder had two workers clean it up and the run carried on.

Muse Ember does the work in parallel. Sixteen agents each take one lexer in their own copy of the repo. Each agent reads the Python, writes the Rust, checks its port token for token and for speed, fixes failures and commits. Other agents build the checker, write extra test inputs and merge the result. The 16 porters finished within about 6 minutes of each other.

The plan affects every port, so it goes to the larger model. The ports are bounded, file-owned work, so they go to many small agents running at once.

Get started

Copy the starter kit from the cookbook and clone the Python reference:

shell
git clone --depth 1 https://github.com/meta-models/meta-model-cookbook.git
cp -r meta-model-cookbook/08_muse_ember/01_python_to_rust/starter-kit pygments-port
cd pygments-port
git clone https://github.com/pygments/pygments.git && git -C pygments checkout --detach a43b45dc
git init -q && git add -A && git commit -q -m "Starter kit"
(cd pygments-rs && cargo test --release)

Start Muse Code with Muse Wonder as the main model:

shell
muse --model muse-wonder-1.0 \
--reasoning-effort high \
--agents "$(cat ../meta-model-cookbook/08_muse_ember/01_python_to_rust/agents/agents.json)" \
-c agents.execution_capacity=17 \
--parallel-tool-calls \
--sandbox-network restricted \
--trust-workspace \
--approval-mode never

The --agents flag loads the worker definition from the cookbook's agents/agents.json:

none
{
"port-worker": {
"description": "Does one well-scoped coding task given in full in its input. Edits only the files the input names, runs the checks the input gives, and commits.",
"model": "muse-ember-1.0",
"effort": "max",
"prompt": "Your input is a complete task brief from the planner. It names the files you own, what to do, and the commands that check your work, each with one exact expected last line. Do the task editing only your owned files. Search and read only inside your workspace or worktree and the pinned pygments/ clone; never search the filesystem root, your home directory or other checkouts. Never run find, locate, grep -r, du or any other recursive scan outside this checkout and its worktrees: scans outside the checkout can hang. Up to 16 workers build on this machine at once: keep build parallelism modest and never override CARGO_BUILD_JOBS from the environment. Run each check once after your last edit. When every check's last line matches its expected line, commit only your owned files in your worktree with a message that starts with the step id, then delete your own worktree's target/ directory (never the main checkout's) and report; never re-run a passing check. If an edit fails with \"no exact match\", re-read that exact file before editing it again. If the same edit, command or failure repeats 3 times, stop, commit what you have with the prefix \"wip:\", and report BLOCKED with the last failing line. Never edit a file the brief does not give you; if the task needs one, stop and report the exact change and why. Before your final answer, stop every command and background process you started. The first line of your final answer is always STATUS: COMMITTED <hash> or STATUS: BLOCKED <reason>; never end without it. Then at most 10 lines: the step id, files changed and the last output line of each check. Never claim a result you did not run.",
"maxTurns": 120
}
}

The file also defines general-purpose with the same settings, so any agent Muse Wonder starts without naming a type still runs on Muse Ember.

Then paste the three prompts in order:

  • Prompt 1: A worker builds the checker, another worker reviews it, and Muse Wonder runs the checks.
  • Prompt 2: Muse Wonder plans the handoffs and supervises the 16 parallel ports.
  • Prompt 3: The agents score 62 held-out files they never saw.

Prompts 1 and 3 are in the cookbook. Prompt 2 is where Muse Wonder plans, hands off and supervises. Here are its key lines (the full prompt is in the cookbook):

none
Port these 16 lexers: java, c, cpp, csharp, go, rust, javascript, lua, swift,
kotlin, scala, perl, css, haskell, sql, r. Use Muse Ember port-workers for the
coding work; you own the plan, shared engine readiness, handoffs and supervision.
​
… Workers do every source read, diff, merge and long check; you never open source
files or diffs.
​
Before deciding the plan, have one worker read the Python reference
implementations, the Rust engine and its tests, and the checker, and return a map
of at most 60 lines: how each lexer maps onto the engine, what shared capabilities
are missing, the gotchas, and what context each worker needs. Write the plan from
it and include concrete source paths, ownership, relevant engine interfaces and
validation commands in each handoff, so workers don't rediscover the gotchas.
​
Have a worker port Python as the example, and start the input writers at the same
time. … Brief a worker for each shared engine gap while the example runs. …
​
… Each porter works in its own git worktree, one per language, and owns only its
lexer file. … It commits only when Rust is no slower than Python and otherwise
reports BLOCKED. …
​
While the porters run, act on STATUS lines. When a worker reports a blocker
outside its files, start the shared fix before waiting on anyone else. … Never
weaken the checker, drop test inputs, or treat partial results as success.
​
One merge worker owns all merging … After the merge you run each benchmark once on
the merged tree. …
​
… Once provided, score heldout/<alias> for each language without code changes in
response. … Stop with the report: no extra languages, PRs or pushes.

When the run finishes, check any language yourself:

shell
python3 pygments-rs/tools/diff.py --lexer go # SCORE line should show fail=0
python3 pygments-rs/tools/bench.py --lexer go # checks the tokens match, then times Python and Rust

All 16 lexers matched Python on every one of 383 test inputs and on 62 of 62 real files from 18 public repositories, supplied only after the code was frozen. The Rust commands ran 3.0 to 7.3 times faster than Python on about 1 MB of input. Muse Ember handled 158M input tokens to Muse Wonder's 4.4M, and the run cost about $3.96 at pay-as-you-go prices: $2.12 for Muse Wonder and $1.84 for Muse Ember. Results vary from run to run.

The full recipe, with all three prompts and the starter kit, is in the Meta Model Cookbook.

Example: Scale multimodal work with one planner and many small agents

Many agent jobs are one small decision repeated thousands of times. To show how Muse Wonder and Muse Ember split that kind of job, we gave Muse Code a folder of 10,000 photos, with no instructions or scripts, and a one-line prompt: caption, rename and sort every photo into albums.

Muse Wonder makes the decisions that shape the job. It captions a small sample to choose the albums, writes and tests one pipeline script, and starts 16 agents in one step, each with a shard of photos. When they finish, it checks that every photo is filed.

Muse Ember does the volume. Each agent runs the script on its shard. The script sends eight photos per request to Muse Ember, which returns a caption and an album for each, so IMG_00126.jpg becomes Food-and-Drink/a-pile-of-fresh-green-beans-fills-the-frame_IMG_00126.jpg.

All 10,000 photos were captioned, renamed and sorted into albums for $1.59 in total, and only $0.50 of that was Muse Ember.

Try it

Get the cookbook and a small set of photos, set your key, and start the run:

shell
git clone --depth 1 https://github.com/meta-models/meta-model-cookbook.git
cd meta-model-cookbook/08_muse_ember/02_organizing_images_with_subagents
pip install -r requirements.txt
python3 prepare/fetch_photos.py --limit=160 # drop --limit for all 10,000 photos
​
export MODEL_API_KEY="LLM|..."
export META_API_KEY="$MODEL_API_KEY" # Muse Code (or run muse login)
export EMBER_MODEL="muse-ember"
./run.sh

run.sh starts Muse Code inside workspace/, so Muse Wonder sees only the photos. Simplified, it runs:

shell
muse --model muse-wonder-1.0 --reasoning-effort low \
--agents "$AGENTS" -c agents.execution_capacity=17 \
-c 'run.workflow_trigger_mode="off"' \
--parallel-tool-calls --yolo \
"$PROMPT"

--yolo approves the agents' shell commands without asking and the agents can read MODEL_API_KEY because the pipeline they write needs it. Run it only in the sample folder, with a key you're comfortable giving to an agent. The --agents flag passes a generic worker that runs on Muse Ember and knows nothing about photos. Muse Wonder writes its task:

none
{
"ember-worker": {
"description": "A muse-ember worker for one bounded, fully specified task. Give it the complete task: the files it owns, the commands to run, and what to report.",
"model": "muse-ember",
"effort": "low",
"maxTurns": 20,
"prompt": "Do exactly the task in your input. Edit only the files it names, run the commands it gives, fix your own files if a command fails, and report the result in one short line. Never claim a result you did not run."
}
}

The prompt is one line:

none
Caption, rename and sort all the photos in Photos/Inbox into albums. First caption a small sample to choose the albums, then write one pipeline script in the workspace that sends 8 photos per muse-ember request at 512 px with minimal reasoning effort, and have 16 muse-ember subagents run it in parallel on their shards. The Model API is OpenAI-compatible: base URL in $MODEL_API_BASE, key in $MODEL_API_KEY, model id in $EMBER_MODEL.

All 10,000 photos were captioned, renamed and sorted into 8 albums with no failed requests. Mapped to the closest categories in the dataset's own labels, the albums agreed for about 86% of photos. The whole job cost $1.33: $0.81 for Muse Wonder and $0.52 for Muse Ember. At the Muse Wonder prices, the same photo requests would have cost about $20.

The full recipe, with the launcher, a photo downloader and the pipeline Muse Wonder wrote in our run, is in the Meta Model Cookbook.

Start building today

Already have an existing project built around the OpenAI SDK? You’re just one base_url change away from generating your first API call with Muse Ember. Generate an API key at dev.meta.ai, point your existing OpenAI-compatible client at Model API, keep your code and set the model to muse-ember-1.0.

If this is your first time building with Muse models, the Meta Model Cookbook walks you through the basics and best practices, so you can get started quickly.

Whether you’re starting a new build with Muse Ember or just getting started with Meta Model API, we can’t wait to see what you build.

Start building with Muse Ember | Read the API quickstart | Get started with Muse Code

Appendix/Modules

Install the dependencies and set your key:

shell
pip install openai requests
export MODEL_API_KEY="LLM|..."

The endpoints mirror the OpenAI Images API, so if you already have an OpenAI client, point base_url at Meta Model API and keep the code you have:

python
import base64
import os
​
from openai import OpenAI
​
# The OpenAI SDK does not auto-read MODEL_API_KEY, so pass it explicitly.
client = OpenAI(
base_url="https://api.meta.ai/v1",
api_key=os.environ["MODEL_API_KEY"],
)
def save_image(b64: str, path: str) -> None:
"""Decode a base64 image from the API and write it to disk."""
with open(path, "wb") as f:
f.write(base64.b64decode(b64))
print(f"saved {path}")
Meta
Products
Models
Documentation
Resources
Community
Terms & policies