> ## Documentation Index
> Fetch the complete documentation index at: https://proto.evodesign.org/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# ESM3 Protein Language Model

> ESM-3 open masked protein language model for local sequence mutation/refinement

<div class="page-hero">
  <img class="page-hero-banner" src="https://proto-bio.github.io/proto-assets/images/generator/esm3/hero.png" alt="ESM3 Protein Language Model" />
</div>

<Note>
  **License:** ESM3 is open source and free for academic and commercial use under an MIT license. Please refer to [the license](https://github.com/Biohub/esm/blob/main/LICENSE.md) for full terms.
</Note>

<p class="entity-disclaimer">This generator is open source. Any third-party models, product names, or trademarks referenced are the property of their respective owners, and Proto is not affiliated with them.</p>

<hr class="entity-rule" />

<input type="radio" name="tab-generator-esm3" id="none-generator-esm3" class="tab-radio-input" />

<input type="radio" name="tab-generator-esm3" id="tools-generator-esm3" class="tab-radio-input" defaultChecked />

<input type="radio" name="tab-generator-esm3" id="source-generator-esm3" class="tab-radio-input" />

<input type="radio" name="tab-generator-esm3" id="cite-generator-esm3" class="tab-radio-input" />

<div class="tool-tab-bar"><span class="tool-tab-wrap"><label for="tools-generator-esm3" class="tool-tab tab-open badge-tools"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="7" x="3" y="3" rx="1" /><rect width="7" height="7" x="14" y="3" rx="1" /><rect width="7" height="7" x="14" y="14" rx="1" /><rect width="7" height="7" x="3" y="14" rx="1" /></svg> Tools Used</label><label for="none-generator-esm3" class="tool-tab tab-close badge-tools"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="7" x="3" y="3" rx="1" /><rect width="7" height="7" x="14" y="3" rx="1" /><rect width="7" height="7" x="14" y="14" rx="1" /><rect width="7" height="7" x="3" y="14" rx="1" /></svg> Tools Used</label></span> <span class="tool-tab-wrap"><label for="source-generator-esm3" class="tool-tab tab-open badge-source"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</label><label for="none-generator-esm3" class="tool-tab tab-close badge-source"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</label></span> <span class="tool-tab-wrap"><label for="cite-generator-esm3" class="tool-tab tab-open badge-cite"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z" /><path d="M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z" /></svg> Cite</label><label for="none-generator-esm3" class="tool-tab tab-close badge-cite"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z" /><path d="M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z" /></svg> Cite</label></span></div>

<a href="/docs/tools/masked-models/esm3" class="tab-panel tools-panel tools-panel-single" data-tab="tools-generator-esm3">
  <div class="tools-single-card">
    <img noZoom src="https://proto-bio.github.io/proto-assets/images/tool/esm3/social.png" alt="" loading="lazy" />
  </div>

  <span class="panel-goto-btn tools-goto-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14" /><path d="m12 5 7 7-7 7" /></svg> Go to Tool Page</span></span>
</a>

<a href="https://github.com/evo-design/proto-language/blob/d3b7822f74ea64747cc751a3b2ab1aa6b799ac47/proto_language/generator/esm3_generator.py#L165" target="_blank" class="tab-panel source-panel" data-tab="source-generator-esm3">
  <div class="source-info">
    <img noZoom src="https://github.com/evo-design.png?size=40" class="source-avatar" width="36" height="36" />

    <span class="source-path">evo-design/proto-language<span class="source-subpath">/proto\_language/generator/esm3\_generator.py</span></span>
  </div>

  <span class="panel-goto-btn source-goto-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" /></svg> View source</span></span>
</a>

<div class="tab-panel cite-panel" data-tab="cite-generator-esm3">
  <div class="cite-code-wrap">
    ```bibtex theme={null}
    @article{hayes2025esm3,
      title={Simulating 500 million years of evolution with a language model},
      author={Hayes, Thomas and Rao, Roshan and Akin, Halil and Sofroniew, Nicholas J. and Oktay, Deniz and Lin, Zeming and Verkuil, Robert and Tran, Vincent Q. and Deaton, Jonathan and Wiggert, Marius and Badkundri, Rohil and Shafkat, Irhum and Gong, Jun and Derry, Alexander and Molina, Raul S. and Thomas, Neil and Khan, Yousuf A. and Mishra, Chetan and Kim, Carolyn and Bartie, Liam J. and Nemeth, Matthew and Hsu, Patrick D. and Sercu, Tom and Candido, Salvatore and Rives, Alexander},
      journal={Science},
      volume={387},
      number={6736},
      pages={850--858},
      year={2025},
      publisher={American Association for the Advancement of Science},
      doi={10.1126/science.ads0018}
    }

    @software{evolutionaryscale_2024,
      author={{EvolutionaryScale Team}},
      title={evolutionaryscale/esm},
      year={2024},
      publisher={Zenodo},
      doi={10.5281/zenodo.14219303},
      url={https://doi.org/10.5281/zenodo.14219303}
    }
    ```
  </div>

  <span class="panel-goto-btn cite-copy-btn"><span><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z" /><path d="M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z" /></svg> Copy citation</span></span>
</div>

<div class="entity-contributors"><span class="entity-contributors-label">Generator contributors</span><span class="entity-contributors-people"><a class="entity-contributor" href="https://github.com/dguo8412" target="_blank" rel="noopener" title="dguo8412: 4 commits"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/46211285?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">dguo8412</span></a></span></div>
Protein sequence mutation/refinement generator using ESM3 open language model.

This generator uses the open-source ESM3 protein language model to refine
existing protein sequences through iterative mutation. It masks positions
according to the configured masking strategy and samples biologically
plausible amino acids at those positions.

The generator category is `"mutation"`, indicating it refines proposal
sequences through targeted mutations.

## API Reference

<div class="api-model-section api-model-static api-config-section">
  <div class="api-model-header"><span class="api-model-badge api-config-badge">Config</span><span class="api-model-name">ESM3GeneratorConfig</span><a href="https://github.com/evo-design/proto-language/blob/d3b7822f74ea64747cc751a3b2ab1aa6b799ac47/proto_language/generator/esm3_generator.py#L16" target="_blank" class="func-table-btn func-source-btn api-model-source"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6" /><polyline points="8 6 2 12 8 18" /></svg> Source</a></div>

  Configuration object for ESM3Generator.

  This class defines configuration parameters for the ESM3 generator, which uses
  the open-source ESM3 protein language model to refine existing protein
  sequences through iterative mutation of masked positions. In Proto Language,
  ESM3 is registered as a mutation-category generator that edits the supplied
  starting sequence; the segment must carry a sequence (directly or from a
  prior optimizer stage).

  <Note>
    ESM3 is the open-source version of EvolutionaryScale's protein language model.
  </Note>

  <ParamField path="model_checkpoint" type="string" default="esm3_sm_open_v1">
    ESM-3 model variant to load.
  </ParamField>

  <ParamField path="masking_strategy" type="MaskingStrategy">
    Controls which positions to mask for sampling. Default: random 30%.
  </ParamField>

  <ParamField path="sampling_method" type="enum" default="single_pass">
    'single\_pass' fills all masks in one forward; 'iterative\_refinement' uses ESM-3 batch generation.

    Options: `single_pass`, `iterative_refinement`
  </ParamField>

  <ParamField path="temperature" type="number" default="1.0">
    Scales the randomness of sampling by adjusting probability distribution sharpness.
  </ParamField>

  <ParamField path="top_p" type="number" default="1.0">
    Nucleus sampling threshold; 1.0 disables
  </ParamField>

  <ParamField path="num_steps" type="integer" default="20">
    Iterative-refinement decoding steps; diminishing returns above 20
  </ParamField>

  <ParamField path="schedule" type="enum" default="cosine">
    Unmask schedule across rounds; 'cosine' fronts more commits late

    Options: `cosine`, `linear`
  </ParamField>

  <ParamField path="strategy" type="enum" default="random">
    Position-selection per round; 'entropy' commits the most-confident first

    Options: `random`, `entropy`
  </ParamField>

  <ParamField path="temperature_annealing" type="boolean" default="True">
    Anneal temperature toward 0 across rounds
  </ParamField>

  <ParamField path="device" type="string" default="cuda">
    GPU device to run ESM3 on (e.g. 'cuda' or 'cuda:0').
  </ParamField>

  <ParamField path="batch_size" type="integer" default="1">
    Number of sequences to process simultaneously on GPU
  </ParamField>
</div>

## Usage

```python python icon="python" theme={null}
>>> from proto_language.generator import ESM3Generator, ESM3GeneratorConfig
>>> from proto_language.core import Segment
>>> from proto_tools.transforms.masking import MaskingStrategy
>>> config = ESM3GeneratorConfig(
...     temperature=1.0,
...     masking_strategy=MaskingStrategy(num_mutations=5),
... )
>>> gen = ESM3Generator(config)
>>> segment = Segment(sequence="M" * 100, sequence_type="protein")
>>> gen.assign(segment)
>>> gen.sample()  # Re-samples 5 randomly masked positions
```

## Metadata

| Property                 | Value               |
| ------------------------ | ------------------- |
| Key                      | `esm3`              |
| Class                    | `ESM3Generator`     |
| Category                 | `mutation`          |
| Input Type               | `starting_sequence` |
| Uses GPU                 | `True`              |
| Supported Sequence Types | `protein`           |
| Allows Empty Start       | `False`             |
