> ## 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.

# Foldseek

> [Foldseek](https://github.com/steineggerlab/foldseek) is a structural search and alignment tool from the [Steinegger Lab](https://steineggerlab.com/) at Seoul National University. It encodes each residue of a protein structure as a discrete letter over a learned structural alphabet, then performs sensitive alignment over those letter sequences alongside the underlying amino acids. The result is structural homology search at sequence-search speed, together with complementary clustering, multimer-search, and reciprocal-best-hits operations.

<div class="page-hero"><img class="page-hero-banner" src="https://proto-bio.github.io/proto-assets/images/tool/foldseek/hero.png" alt="Foldseek" /><div class="tool-org-badges page-hero-badges"><a href="/docs/tools/organizations/steinegger-lab" class="tool-org-badge" style={{background: "#2E86C1"}} title="Steinegger Lab"><img src="https://mintcdn.com/bio-pro/UeudeF7pW-Dj-pIN/assets/images/cached/5e3c631c9751.png?fit=max&auto=format&n=UeudeF7pW-Dj-pIN&q=85&s=5b9aab8b7ad1af8d3310a125bc9e540c" alt="" class="tool-org-badge-logo" width="200" height="200" data-path="assets/images/cached/5e3c631c9751.png" /> Steinegger Lab</a></div></div>

<Note>
  **License:** Foldseek has a GPL-3.0 license. Please refer to [the license](https://github.com/steineggerlab/foldseek/blob/master/LICENSE.md) for full terms.
</Note>

<p class="entity-disclaimer">Proto is not affiliated with the Steinegger Lab. This toolkit is open source and builds on the implementation produced by this organization. Product names, logos, and trademarks are the property of their respective owners.</p>

<hr class="entity-rule" />

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

<input type="radio" name="tab-foldseek" id="github-foldseek" class="tab-radio-input" defaultChecked />

<input type="radio" name="tab-foldseek" id="website-foldseek" class="tab-radio-input" />

<input type="radio" name="tab-foldseek" id="paper-foldseek" class="tab-radio-input" />

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

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

<input type="radio" name="tab-foldseek" id="notebook-foldseek" class="tab-radio-input" />

<input type="radio" name="tab-foldseek" id="proto-foldseek" class="tab-radio-input" />

<div class="tool-tab-bar">
  <span class="tool-tab-wrap"><label for="github-foldseek" class="tool-tab tab-open badge-github"><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> GitHub</label><label for="none-foldseek" class="tool-tab tab-close badge-github"><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> GitHub</label></span> <span class="tool-tab-wrap"><label for="website-foldseek" class="tool-tab tab-open badge-website"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" /></svg> Website</label><label for="none-foldseek" class="tool-tab tab-close badge-website"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10" /><path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" /></svg> Website</label></span> <span class="tool-tab-wrap"><label for="paper-foldseek" class="tool-tab tab-open badge-paper"><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="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" /><polyline points="14 2 14 8 20 8" /><line x1="16" y1="13" x2="8" y2="13" /><line x1="16" y1="17" x2="8" y2="17" /><polyline points="10 9 9 9 8 9" /></svg> Publication</label><label for="none-foldseek" class="tool-tab tab-close badge-paper"><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="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" /><polyline points="14 2 14 8 20 8" /><line x1="16" y1="13" x2="8" y2="13" /><line x1="16" y1="17" x2="8" y2="17" /><polyline points="10 9 9 9 8 9" /></svg> Publication</label></span> <span class="tool-tab-wrap"><label for="cite-foldseek" 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-foldseek" 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> <span class="tool-tab-wrap"><label for="source-foldseek" 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> Tool Source</label><label for="none-foldseek" 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> Tool Source</label></span> <span class="tool-tab-wrap"><label for="notebook-foldseek" class="tool-tab tab-open badge-notebook"><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="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" /><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" /></svg> Open as Notebook</label><label for="none-foldseek" class="tool-tab tab-close badge-notebook"><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="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" /><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" /></svg> Open as Notebook</label></span> <span class="tool-tab-wrap"><label for="proto-foldseek" class="tool-tab tab-open badge-local"><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="4 17 10 11 4 5" /><line x1="12" y1="19" x2="20" y2="19" /></svg> Run Locally</label><label for="none-foldseek" class="tool-tab tab-close badge-local"><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="4 17 10 11 4 5" /><line x1="12" y1="19" x2="20" y2="19" /></svg> Run Locally</label></span>
</div>

<a href="https://github.com/steineggerlab/foldseek" target="_blank" class="tab-panel github-panel" data-tab="github-foldseek">
  <div class="gh-card-wrap">
    <img src="https://opengraph.githubassets.com/1/steineggerlab/foldseek" class="gh-card-img img-fallback" alt="steineggerlab/foldseek" />

    <div class="gh-card-fallback">
      <div class="gh-fallback-org"><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> steineggerlab/foldseek</div>
    </div>
  </div>

  <span class="panel-goto-btn gh-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 repo</span></span>
</a>

<a href="https://search.foldseek.com" target="_blank" class="tab-panel website-panel" data-tab="website-foldseek">
  <div class="website-info">
    <img src="https://www.google.com/s2/favicons?domain=search.foldseek.com&sz=32" class="website-favicon" width="24" height="24" />

    <span class="website-url">search.foldseek.com</span>
  </div>

  <span class="panel-goto-btn website-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"><circle cx="12" cy="12" r="10" /><path d="M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" /></svg> Visit website</span></span>
</a>

<a href="https://doi.org/10.1038/s41587-023-01773-0" target="_blank" class="tab-panel paper-panel" data-tab="paper-foldseek">
  <div class="paper-info">
    <div class="paper-title">Fast and accurate protein structure search with Foldseek</div>
    <div class="paper-meta">Michel van Kempen, Stephanie S. Kim, ... Martin Steinegger</div>
    <div class="paper-meta paper-venue">Nature Biotechnology (2024)</div>
  </div>

  <span class="panel-goto-btn pub-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="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" /><polyline points="14 2 14 8 20 8" /><line x1="16" y1="13" x2="8" y2="13" /><line x1="16" y1="17" x2="8" y2="17" /><polyline points="10 9 9 9 8 9" /></svg> Read paper</span></span>
</a>

<div class="tab-panel cite-panel" data-tab="cite-foldseek">
  <div class="cite-code-wrap">
    ```bibtex theme={null}
    @article{vanKempen2023foldseek,
      title={Fast and accurate protein structure search with {F}oldseek},
      author={van Kempen, Michel and Kim, Stephanie S. and Tumescheit, Charlotte and Mirdita, Milot and Lee, Jeongjae and Gilchrist, Cameron L. M. and S{\"o}ding, Johannes and Steinegger, Martin},
      journal={Nature Biotechnology},
      volume={42},
      pages={243--246},
      year={2024},
      publisher={Nature Publishing Group},
      doi={10.1038/s41587-023-01773-0}
    }

    @article{kim2025foldseekmultimer,
      title={Rapid and sensitive protein complex alignment with {F}oldseek-{M}ultimer},
      author={Kim, Woosub and Mirdita, Milot and Levy Karin, Eli and Gilchrist, Cameron L. M. and Schweke, Hugo and S{\"o}ding, Johannes and Levy, Emmanuel D. and Steinegger, Martin},
      journal={Nature Methods},
      volume={22},
      pages={469--472},
      year={2025},
      publisher={Nature Publishing Group},
      doi={10.1038/s41592-025-02593-7}
    }
    ```
  </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>

<a href="https://github.com/evo-design/proto-tools/tree/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek" target="_blank" class="tab-panel source-panel" data-tab="source-foldseek">
  <div class="source-info">
    <img src="https://github.com/evo-design.png?size=40" class="source-avatar" width="36" height="36" />

    <span class="source-path">evo-design/proto-tools<span class="source-subpath">/proto\_tools/tools/structure\_alignment/foldseek</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>

<a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/examples/example.ipynb" target="_blank" class="tab-panel notebook-panel" data-tab="notebook-foldseek">
  <div class="notebook-info">
    <span class="notebook-icon">
      <svg width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
        <path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" />

        <path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" />
      </svg>
    </span>

    <span class="notebook-label">Open Notebook</span>
  </div>

  <span class="panel-goto-btn notebook-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="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z" /><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z" /></svg> Open notebook</span></span>
</a>

<div class="tab-panel proto-panel run-local-panel" data-tab="proto-foldseek">
  <a href="https://github.com/evo-design/proto-tools" target="_blank" class="run-local-preview">
    <img noZoom src="https://opengraph.githubassets.com/1/evo-design/proto-tools" alt="proto-tools on GitHub" />
  </a>

  <div class="run-local-install">
    <span class="run-local-label">Run locally with proto-tools</span>

    <div class="run-local-code">
      ```bash theme={null}
      pip install git+https://github.com/evo-design/proto-tools.git
      ```
    </div>
  </div>
</div>

<div class="entity-contributors"><span class="entity-contributors-label">Toolkit contributors</span><span class="entity-contributors-people"><a class="entity-contributor" href="https://github.com/bviggiano" target="_blank" rel="noopener" title="bviggiano: 14 commits"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/21143637?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">bviggiano</span></a><a class="entity-contributor" href="https://github.com/dguo8412" target="_blank" rel="noopener" title="dguo8412: 13 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><a class="entity-contributor" href="https://github.com/leba01" target="_blank" rel="noopener" title="leba01: 1 commit"><img noZoom class="entity-contributor-avatar" src="https://avatars.githubusercontent.com/u/124846286?v=4&s=64" alt="" loading="lazy" /><span class="entity-contributor-login">leba01</span></a></span></div>

| Function                         | Description                                                                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| -------------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `run_foldseek_cluster()`         | Cluster a set of protein structures by structural similarity using Foldseek easy-cluster             | <a href="#api-run-foldseek-cluster" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_cluster.py#L258" target="_blank" class="func-table-btn func-source-btn"><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>                 |
| `run_foldseek_multimer_search()` | Search Foldseek multimer (complex) structural homology — remote (server) or local (CLI)              | <a href="#api-run-foldseek-multimer-search" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_multimer_search.py#L290" target="_blank" class="func-table-btn func-source-btn"><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> |
| `run_foldseek_multimercluster()` | Cluster a set of protein complexes by multimer-level structural similarity using Foldseek easy-mu... | <a href="#api-run-foldseek-multimercluster" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_multimercluster.py#L232" target="_blank" class="func-table-btn func-source-btn"><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> |
| `run_foldseek_rbh()`             | Find reciprocal best-hit structural alignments between a query and a target DB using Foldseek eas... | <a href="#api-run-foldseek-rbh" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_rbh.py#L219" target="_blank" class="func-table-btn func-source-btn"><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>                         |
| `run_foldseek_search()`          | Search Foldseek structural homology against PDB100/AlphaFold DB (remote) or a local DB (local)       | <a href="#api-run-foldseek-search" class="func-table-btn func-api-btn"><svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H19a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1H6.5a1 1 0 0 1 0-5H20" /></svg> Docs</a> <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_search.py#L357" target="_blank" class="func-table-btn func-source-btn"><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>                   |

## Background

Foldseek ([van Kempen et al., 2024](https://doi.org/10.1038/s41587-023-01773-0)) performs structural homology search, identifying distant evolutionary relatives of a query protein by structural similarity rather than sequence similarity. Each residue of a protein structure is represented as a discrete letter over a learned structural alphabet (the 3Di alphabet) that captures the tertiary interactions between that residue and its spatial neighbours. Pairs of structures are then aligned by running MMseqs2-style sensitive sequence alignment over the 3Di strings together with the underlying amino-acid sequences. The original publication reports that this approach decreases computation times by four to five orders of magnitude relative to the established structural aligners Dali, TM-align, and CE. Foldseek can also accept amino-acid sequences directly, in which case the bundled [ProstT5](https://github.com/mheinzinger/ProstT5) language model predicts a 3Di sequence before alignment.

Foldseek-Multimer ([Kim et al., 2025](https://doi.org/10.1038/s41592-025-02593-7)) extends the same machinery to multi-chain complexes. It computes pairwise chain-to-chain alignments and then clusters their superposition vectors to identify mutually compatible chain pairs. The multimer publication reports speedups of three to four orders of magnitude over the gold-standard multimer aligner while producing comparable alignments, and demonstrates that the method aligns billions of complex pairs within 11 hours of compute. The Foldseek codebase is released as open source by the [Steinegger Lab](https://steineggerlab.com/) at [steineggerlab/foldseek](https://github.com/steineggerlab/foldseek), and the same group operates a public web service at [search.foldseek.com](https://search.foldseek.com) that the remote execution modes of this toolkit target.

### Learning Resources

* [steineggerlab/foldseek](https://github.com/steineggerlab/foldseek) (Steinegger Lab, Seoul National University). Official repository and command-line interface for `easy-search`, `easy-cluster`, `easy-multimersearch`, `easy-multimercluster`, and `easy-rbh`.
* [search.foldseek.com](https://search.foldseek.com) (Steinegger Lab). The public web service that the remote execution mode targets.

## Tools

<a name="api-run-foldseek-search" />

<div class="tool-section-card tool-section-card--search">
  ### Foldseek Search (`foldseek-search`)

  Aligns a single-chain query structure against one or more reference databases and returns a ranked list of structural hits. The remote execution mode submits the query to the Steinegger Lab web service and downloads the result archive. The local execution mode runs `foldseek easy-search` against a user-supplied target database.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_search.py#L128" 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>

    <Accordion title="Input: FoldseekSearchInput">
      <ParamField path="structure" type="Structure" required>
        Query structure. Accepts a `Structure` object, a file path, or raw PDB/CIF content; normalised internally.

        <Expandable title="Structure">
          <ParamField path="structure" type="string" required>
            Raw structure content in PDB or CIF format.
          </ParamField>

          <ParamField path="structure_format" type="string">
            Format of the content string (auto-detected if omitted).
          </ParamField>

          <ParamField path="b_factor_type" type="BFactorType" default="unspecified">
            What the B-factor column represents.
          </ParamField>

          <ParamField path="source" type="string">
            Optional source identifier (filepath or tool name).
          </ParamField>

          <ParamField path="metrics" type="Metrics">
            Associated metrics (e.g., pLDDT, pTM scores, per-chain lists, pairwise matrices). None values are stripped at construction.
          </ParamField>
        </Expandable>
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_search.py#L142" 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>

    <Accordion title="Config: FoldseekSearchConfig">
      <ParamField path="search_mode" type="enum" default="remote">
        'remote' (default) hits the public Foldseek server; 'local' runs the Foldseek CLI against a local DB.

        Available options: `remote`, `local`
      </ParamField>

      <ParamField path="databases" type="List[string]">
        Remote-only — server-hosted databases to search.
      </ParamField>

      <ParamField path="mode" type="enum" default="3diaa">
        Remote-only — alignment mode; '3diaa' (default) is fast 3Di+AA local; 'tmalign' is global; 'lolalign' is local LoL.

        Available options: `3diaa`, `tmalign`, `lolalign`
      </ParamField>

      <ParamField path="poll_interval_seconds" type="number" default="5.0">
        Remote-only — delay between status polls.
      </ParamField>

      <ParamField path="timeout_seconds" type="number" default="600.0">
        Remote-only — max wall-clock time for the search.
      </ParamField>

      <ParamField path="local_db" type="string">
        Local-only (required) — path to a local Foldseek DB.
      </ParamField>

      <ParamField path="evalue" type="number" default="10.0">
        Local-only — E-value cutoff (lower = stricter).
      </ParamField>

      <ParamField path="sensitivity" type="number" default="9.5">
        Local-only — prefilter sensitivity (1.0-9.5; higher = slower + more sensitive).
      </ParamField>

      <ParamField path="max_seqs" type="integer" default="1000">
        Local-only — max prefilter targets per query.
      </ParamField>

      <ParamField path="alignment_type" type="enum" default="2">
        Local-only — alignment scoring method (0=3Di, 1=TMalign, 2=3Di+AA, 3=LoL).

        Available options: `0`, `1`, `2`, `3`
      </ParamField>

      <ParamField path="tmscore_threshold" type="number" default="0.0">
        Local-only — keep alignments with TM-score above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="lddt_threshold" type="number" default="0.0">
        Local-only — keep alignments with LDDT above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="num_threads" type="integer" default="4">
        Local-only — CPU threads.
      </ParamField>

      <ParamField path="use_gpu" type="boolean" default="False">
        Local-only — run with --gpu 1 on a Linux x86\_64 NVIDIA GPU host.
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_search.py#L289" 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>

    <Accordion title="Output: FoldseekSearchOutput">
      <ResponseField name="ticket_id" type="string" required>
        Remote job ticket ID (re-fetchable for \~24h); empty in local mode.
      </ResponseField>

      <ResponseField name="hits" type="List[FoldseekHit]">
        All alignment hits across the queried databases, in the order Foldseek returned them.

        <Expandable title="FoldseekHit">
          <ResponseField name="database" type="string" required>
            Source database the hit came from (e.g. 'pdb100').
          </ResponseField>

          <ResponseField name="target_id" type="string" required>
            Database-specific target identifier (e.g. '1tup\_A', 'AF-P04637-F1').
          </ResponseField>

          <ResponseField name="sequence_identity" type="number" required>
            Sequence identity over the aligned region, as a fraction in \[0, 1].
          </ResponseField>

          <ResponseField name="alignment_length" type="integer" required>
            Length of the aligned region in residues.
          </ResponseField>

          <ResponseField name="mismatches" type="integer" required>
            Number of mismatched columns.
          </ResponseField>

          <ResponseField name="gap_openings" type="integer" required>
            Number of gap-opening events.
          </ResponseField>

          <ResponseField name="query_start" type="integer" required>
            1-indexed start position in the query.
          </ResponseField>

          <ResponseField name="query_end" type="integer" required>
            1-indexed end position in the query.
          </ResponseField>

          <ResponseField name="target_start" type="integer" required>
            1-indexed start position in the target.
          </ResponseField>

          <ResponseField name="target_end" type="integer" required>
            1-indexed end position in the target.
          </ResponseField>

          <ResponseField name="evalue" type="number" required>
            Expectation value.
          </ResponseField>

          <ResponseField name="bit_score" type="number" required>
            Bit score.
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="num_hits" type="integer" required>
        `len(hits)`.
      </ResponseField>

      <ResponseField name="databases_queried" type="List[string]" required>
        Databases included in this search; in local mode contains the single local DB path.
      </ResponseField>

      <ResponseField name="result_url" type="string" required>
        Remote result-archive URL; empty in local mode.
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  This tool is the structural analogue of BLAST. It is the appropriate first step for detecting distant homologues that fall below the sequence-similarity twilight zone (commonly cited as below 30 percent pairwise identity), for finding structural templates against the [AlphaFold Database](https://alphafold.ebi.ac.uk/) when no experimental structures are available for a target, and for assessing whether a designed protein recapitulates a known fold or represents a novel topology.

  #### Usage Tips

  * **The remote service is the default execution mode and provides a hosted set of reference databases.** Selectable databases are `pdb100`, `afdb50`, `afdb-swissprot`, `afdb-proteome`, `mgnify_esm30`, `gmgcl_id`, `BFVD`, `cath50`, and `bfmd`. The remote default queries `pdb100` and `afdb50`. Override the selection through the `databases` configuration field.
  * **The alignment algorithm is selected by `mode` in remote execution and by `alignment_type` in local execution.** For `mode`, the default `3diaa` performs 3Di-plus-amino-acid local alignment, `tmalign` runs the global TM-align, and `lolalign` runs the LoL-aligner local alignment. The local-mode equivalent `alignment_type` takes the integer values `0` (3Di), `1` (TM-align), `2` (3Di+AA, the default), and `3` (LoL).
  * **Local execution requires a target database.** Provide either a prebuilt Foldseek database or a directory of PDB files via the `local_db` configuration field. Foldseek constructs a temporary database from a directory of files at runtime, but a prebuilt database from `foldseek createdb` is more efficient for repeated queries.
  * **`sensitivity` controls the prefilter stage during local execution.** Higher values recover more distant homologues at the cost of additional runtime. The wrapper default of 9.5 matches the upstream `--sensitivity` default.
  * **Local execution can be GPU-accelerated.** Set `use_gpu=True` to run with `--gpu 1` on a compatible NVIDIA GPU host (see Toolkit Notes for requirements).

  <a name="api-run-foldseek-cluster" />
</div>

<div class="tool-section-card tool-section-card--cluster">
  ### Foldseek Cluster (`foldseek-cluster`)

  Groups a set of structures into clusters by 3Di structural similarity using `foldseek easy-cluster`. Inputs can be structure text (PDB or mmCIF) or amino-acid sequences (FASTA). The latter are routed through the bundled ProstT5 language model, which predicts a 3Di sequence per input before clustering proceeds.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_cluster.py#L66" 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>

    <Accordion title="Input: FoldseekClusterInput">
      <ParamField path="structures" type="List[Structure | string] | string | Path">
        Items to cluster (≥2) — a list of Structure objects / file paths / PDB·mmCIF·FASTA text, or a directory path (filename stems become `structure_ids`).
      </ParamField>

      <ParamField path="structure_ids" type="array">
        Optional IDs for the list form (default `structure_0`, ...); derived from filename stems for a directory.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_cluster.py#L105" 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>

    <Accordion title="Config: FoldseekClusterConfig">
      <ParamField path="min_seq_id" type="number" default="0.0">
        Sequence-identity threshold (0-1). Default 0.0 because Foldseek clusters by 3Di structural similarity, not seq id.
      </ParamField>

      <ParamField path="cov" type="number" default="0.8">
        Coverage threshold (0-1) for the alignment.
      </ParamField>

      <ParamField path="cov_mode" type="enum" default="0">
        Foldseek coverage mode (0: bidirectional,

        Available options: `0`, `1`, `2`
      </ParamField>

      <ParamField path="evalue" type="number" default="0.01">
        E-value cutoff for cluster-membership alignments (lower = stricter; default 0.01 matches the foldseek cluster workflow's runtime default).
      </ParamField>

      <ParamField path="alignment_type" type="enum" default="2">
        Alignment scoring method (0=3Di, 1=TMalign, 2=3Di+AA, 3=LoL).

        Available options: `0`, `1`, `2`, `3`
      </ParamField>

      <ParamField path="tmscore_threshold" type="number" default="0.0">
        Keep cluster-membership alignments with TM-score above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="lddt_threshold" type="number" default="0.0">
        Keep cluster-membership alignments with LDDT above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="prostt5_weights_dir" type="string">
        Path to ProstT5 model weights for FASTA inputs. If None, weights are auto-provisioned under `resolve_weights_dir("foldseek")/prostt5/weights` on first FASTA call (honors `PROTO_FOLDSEEK_WEIGHTS_DIR` / `PROTO_MODEL_CACHE`).
      </ParamField>

      <ParamField path="num_threads" type="integer" default="4">
        CPU threads.
      </ParamField>

      <ParamField path="use_gpu" type="boolean" default="False">
        Run with --gpu 1 on a Linux x86\_64 NVIDIA GPU host (driver >= 525.60.13).
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_cluster.py#L198" 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>

    <Accordion title="Output: FoldseekClusterOutput">
      <ResponseField name="clusters" type="List[FoldseekCluster]">
        One entry per cluster, each holding a representative and its members.

        <Expandable title="FoldseekCluster">
          <ResponseField name="representative_id" type="string" required>
            ID of the cluster representative.
          </ResponseField>

          <ResponseField name="member_ids" type="List[string]" required>
            IDs of all members (includes the representative).
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="num_clusters" type="integer" required>
        `len(clusters)`.
      </ResponseField>

      <ResponseField name="num_structures" type="integer" required>
        Total number of input structures clustered.
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  This tool is appropriate for deduplicating a set of designed structures before downstream analysis, for surveying fold families across a screened library, and for partitioning a large structure collection into representative groups for further inspection. Clusters with a single member identify structurally isolated entries that share no near-neighbour in the input set.

  #### Usage Tips

  * **`structures` accepts either a list or a directory path.** Provide an in-memory list of structure or FASTA text strings (Structure objects and file paths are also accepted per item), or a single path to a directory of supported files, in which case filename stems become the structure identifiers.
  * **A single call must use one input format.** Mixing FASTA inputs with PDB or mmCIF inputs is rejected by input validation. Format is auto-detected per input entry.
  * **`min_seq_id=0.0` is intentional and lets 3Di structural similarity dominate cluster assignment.** Raising it adds a sequence-identity floor to cluster membership. Use a non-zero value only when a sequence-similarity constraint is desired alongside structural similarity.
  * **There is no parameter that requests an exact cluster count.** Foldseek clusters by similarity threshold, not by a target count. To approximate a target number of clusters, sweep the `cov` field and select the run whose cluster count is closest to the target.

  <a name="api-run-foldseek-multimer-search" />
</div>

<div class="tool-section-card tool-section-card--search">
  ### Foldseek Multimer Search (`foldseek-multimer-search`)

  Aligns a multi-chain query complex against multimer-aware reference databases using the same execution-mode pattern as `foldseek-search`. The remote service hosts the multimer endpoint, and the local execution mode runs `foldseek easy-multimersearch` against a user-supplied target database.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_multimer_search.py#L60" 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>

    <Accordion title="Input: FoldseekMultimerSearchInput">
      <ParamField path="structure" type="Structure" required>
        Multi-chain query complex. Accepts a `Structure` object, a file path, or raw PDB/CIF content.

        <Expandable title="Structure">
          <ParamField path="structure" type="string" required>
            Raw structure content in PDB or CIF format.
          </ParamField>

          <ParamField path="structure_format" type="string">
            Format of the content string (auto-detected if omitted).
          </ParamField>

          <ParamField path="b_factor_type" type="BFactorType" default="unspecified">
            What the B-factor column represents.
          </ParamField>

          <ParamField path="source" type="string">
            Optional source identifier (filepath or tool name).
          </ParamField>

          <ParamField path="metrics" type="Metrics">
            Associated metrics (e.g., pLDDT, pTM scores, per-chain lists, pairwise matrices). None values are stripped at construction.
          </ParamField>
        </Expandable>
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_multimer_search.py#L74" 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>

    <Accordion title="Config: FoldseekMultimerSearchConfig">
      <ParamField path="search_mode" type="enum" default="remote">
        'remote' (default; hits the public Foldseek-Multimer endpoint at `search.foldseek.com/foldmulti`) or 'local' (runs `foldseek easy-multimersearch` locally).

        Available options: `remote`, `local`
      </ParamField>

      <ParamField path="databases" type="List[string]">
        Remote-only — server-hosted multimer-aware databases. Default \['pdb100'].
      </ParamField>

      <ParamField path="mode" type="enum" default="3diaa">
        Remote-only — alignment mode. Wire-level the mode is prefixed `complex-` automatically.

        Available options: `3diaa`, `tmalign`, `lolalign`
      </ParamField>

      <ParamField path="poll_interval_seconds" type="number" default="5.0">
        Remote-only — delay between status polls.
      </ParamField>

      <ParamField path="timeout_seconds" type="number" default="600.0">
        Remote-only — max wall-clock time.
      </ParamField>

      <ParamField path="local_db" type="string">
        Local-only (required) — path to a local multimer-aware Foldseek DB.
      </ParamField>

      <ParamField path="evalue" type="number" default="10.0">
        Local-only — E-value cutoff (lower = stricter).
      </ParamField>

      <ParamField path="sensitivity" type="number" default="4.0">
        Local-only — prefilter sensitivity (1.0-9.5; higher = slower + more sensitive).
      </ParamField>

      <ParamField path="max_seqs" type="integer" default="300">
        Local-only — max prefilter targets per query.
      </ParamField>

      <ParamField path="alignment_type" type="enum" default="2">
        Local-only — alignment scoring method (0=3Di, 1=TMalign, 2=3Di+AA, 3=LoL).

        Available options: `0`, `1`, `2`, `3`
      </ParamField>

      <ParamField path="tmscore_threshold" type="number" default="0.0">
        Local-only — keep alignments with TM-score above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="lddt_threshold" type="number" default="0.0">
        Local-only — keep alignments with LDDT above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="num_threads" type="integer" default="4">
        Local-only — CPU threads.
      </ParamField>

      <ParamField path="use_gpu" type="boolean" default="False">
        Local-only — run with --gpu 1 on a Linux x86\_64 NVIDIA GPU host.
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_multimer_search.py#L223" 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>

    <Accordion title="Output: FoldseekMultimerSearchOutput">
      <ResponseField name="ticket_id" type="string" required>
        Remote job ticket ID; empty in local mode.
      </ResponseField>

      <ResponseField name="hits" type="List[FoldseekHit]">
        Multimer alignment hits.

        <Expandable title="FoldseekHit">
          <ResponseField name="database" type="string" required>
            Source database the hit came from (e.g. 'pdb100').
          </ResponseField>

          <ResponseField name="target_id" type="string" required>
            Database-specific target identifier (e.g. '1tup\_A', 'AF-P04637-F1').
          </ResponseField>

          <ResponseField name="sequence_identity" type="number" required>
            Sequence identity over the aligned region, as a fraction in \[0, 1].
          </ResponseField>

          <ResponseField name="alignment_length" type="integer" required>
            Length of the aligned region in residues.
          </ResponseField>

          <ResponseField name="mismatches" type="integer" required>
            Number of mismatched columns.
          </ResponseField>

          <ResponseField name="gap_openings" type="integer" required>
            Number of gap-opening events.
          </ResponseField>

          <ResponseField name="query_start" type="integer" required>
            1-indexed start position in the query.
          </ResponseField>

          <ResponseField name="query_end" type="integer" required>
            1-indexed end position in the query.
          </ResponseField>

          <ResponseField name="target_start" type="integer" required>
            1-indexed start position in the target.
          </ResponseField>

          <ResponseField name="target_end" type="integer" required>
            1-indexed end position in the target.
          </ResponseField>

          <ResponseField name="evalue" type="number" required>
            Expectation value.
          </ResponseField>

          <ResponseField name="bit_score" type="number" required>
            Bit score.
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="num_hits" type="integer" required>
        `len(hits)`.
      </ResponseField>

      <ResponseField name="databases_queried" type="List[string]" required>
        Databases included in this search; in local mode contains the single local DB path.
      </ResponseField>

      <ResponseField name="result_url" type="string" required>
        Remote result-archive URL; empty in local mode.
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  This tool ranks reference complexes by structural similarity to a query complex. It is appropriate for finding natural complexes that resemble a designed binder-target pose, for identifying multi-chain assemblies that share interface architecture with a query, and for mining experimentally determined complexes that match a hypothesised binding mode. Sequence-only methods cannot perform the equivalent search because chain compatibility is governed by tertiary contacts rather than sequence similarity.

  #### Usage Tips

  * **The default remote database is `pdb100`.** Override through the `databases` configuration field with any of the values in the database list documented under `foldseek-search`.
  * **The `mode` value is sent to the remote endpoint with a `complex-` prefix internally.** Configure the field as plain `3diaa`, `tmalign`, or `lolalign`. The toolkit applies the multimer wire-format prefix during submission.
  * **Local execution requires a target database via `local_db`.** As with single-chain search, either a prebuilt Foldseek database or a directory of multimer files is accepted.

  <a name="api-run-foldseek-multimercluster" />
</div>

<div class="tool-section-card tool-section-card--cluster">
  ### Foldseek Multimer Cluster (`foldseek-multimercluster`)

  Groups a set of multi-chain assemblies into clusters using `foldseek easy-multimercluster`, which combines per-chain TM-score and interface lDDT into a multimer-level similarity score. Inputs are multi-chain PDB or mmCIF text.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_multimercluster.py#L43" 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>

    <Accordion title="Input: FoldseekMultimerClusterInput">
      <ParamField path="structures" type="List[Structure | string] | string | Path">
        Multi-chain items to cluster (≥2) — a list of Structure objects / file paths / PDB·mmCIF text, or a directory path (filename stems become `structure_ids`).
      </ParamField>

      <ParamField path="structure_ids" type="array">
        Optional IDs for the list form (default `multimer-0`, ...); derived from filename stems for a directory. No `_`.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_multimercluster.py#L87" 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>

    <Accordion title="Config: FoldseekMultimerClusterConfig">
      <ParamField path="multimer_tm_threshold" type="number" default="0.65">
        Maps to `--multimer-tm-threshold`. Multimer-level TM-score (0-1) above which two multimers cluster together.
      </ParamField>

      <ParamField path="chain_tm_threshold" type="number" default="0.001">
        Maps to `--chain-tm-threshold`. Per-chain TM-score (0-1) used to filter chain-pair alignments before assembling the multimer score.
      </ParamField>

      <ParamField path="interface_lddt_threshold" type="number" default="0.5">
        Maps to `--interface-lddt-threshold`. Interface lDDT (0-1) for chain-pair alignments.
      </ParamField>

      <ParamField path="alignment_type" type="enum" default="2">
        Alignment scoring method (0=3Di, 1=TMalign, 2=3Di+AA, 3=LoL).

        Available options: `0`, `1`, `2`, `3`
      </ParamField>

      <ParamField path="tmscore_threshold" type="number" default="0.0">
        Keep chain-pair alignments with TM-score above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="lddt_threshold" type="number" default="0.0">
        Keep chain-pair alignments with LDDT above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="num_threads" type="integer" default="4">
        CPU threads.
      </ParamField>

      <ParamField path="use_gpu" type="boolean" default="False">
        Run with --gpu 1 on a Linux x86\_64 NVIDIA GPU host (driver >= 525.60.13).
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_multimercluster.py#L168" 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>

    <Accordion title="Output: FoldseekMultimerClusterOutput">
      <ResponseField name="clusters" type="List[FoldseekCluster]">
        One entry per cluster, each holding a representative multimer and its members. Member IDs may include `{multimer_id}_{chain}` suffixes per Foldseek's chain-aware schema.

        <Expandable title="FoldseekCluster">
          <ResponseField name="representative_id" type="string" required>
            ID of the cluster representative.
          </ResponseField>

          <ResponseField name="member_ids" type="List[string]" required>
            IDs of all members (includes the representative).
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="num_clusters" type="integer" required>
        `len(clusters)`.
      </ResponseField>

      <ResponseField name="num_multimers" type="integer" required>
        Total number of input multimers clustered.
      </ResponseField>

      <ResponseField name="rep_seq_fasta" type="string" required>
        Representative-multimer FASTA produced by Foldseek (with `#multimer_id` group separators between chains).
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  This tool is appropriate for partitioning a candidate set of designed complexes by overall complex geometry, for selecting structurally diverse representatives from a larger pool of binder-target poses, and for analysing the structural diversity of an experimentally determined complex collection.

  #### Usage Tips

  * **Structure identifiers must not contain an underscore.** Foldseek emits cluster member identifiers as `{multimer_id}_{chain}`, so an underscore in the multimer identifier would silently corrupt downstream parsing. Both user-supplied and filename-derived identifiers are validated and rejected if they contain an underscore.
  * **Three thresholds control cluster membership.** `multimer_tm_threshold` (default `0.65`) sets the multimer-level TM-score required for inclusion. `chain_tm_threshold` (default `0.001`) governs the per-chain TM-score required during chain-pair filtering. `interface_lddt_threshold` (default `0.5`) sets the interface quality required for a chain-pair alignment to contribute to the multimer score.

  <a name="api-run-foldseek-rbh" />
</div>

<div class="tool-section-card">
  ### Foldseek Reciprocal Best Hits (`foldseek-rbh`)

  Performs a reciprocal-best-hits structural search between a single-chain query and a target database using `foldseek easy-rbh`. Only mutual best matches are returned, in contrast to the all-hit output of `foldseek-search`.

  #### API Reference

  <div class="api-model-section api-input-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_rbh.py#L42" 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>

    <Accordion title="Input: FoldseekRBHInput">
      <ParamField path="structure" type="Structure" required>
        Single-chain query structure. Accepts a `Structure` object, a file path, or raw PDB/CIF content.

        <Expandable title="Structure">
          <ParamField path="structure" type="string" required>
            Raw structure content in PDB or CIF format.
          </ParamField>

          <ParamField path="structure_format" type="string">
            Format of the content string (auto-detected if omitted).
          </ParamField>

          <ParamField path="b_factor_type" type="BFactorType" default="unspecified">
            What the B-factor column represents.
          </ParamField>

          <ParamField path="source" type="string">
            Optional source identifier (filepath or tool name).
          </ParamField>

          <ParamField path="metrics" type="Metrics">
            Associated metrics (e.g., pLDDT, pTM scores, per-chain lists, pairwise matrices). None values are stripped at construction.
          </ParamField>
        </Expandable>
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-config-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_rbh.py#L56" 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>

    <Accordion title="Config: FoldseekRBHConfig">
      <ParamField path="local_db" type="string">
        Path to the target — either a prebuilt Foldseek DB (e.g. `/data/pdb100`) or a directory of PDB files (Foldseek auto-builds a temporary DB). Required.
      </ParamField>

      <ParamField path="evalue" type="number" default="10.0">
        E-value cutoff (lower = stricter).
      </ParamField>

      <ParamField path="sensitivity" type="number" default="4.0">
        Prefilter sensitivity (1.0-9.5; higher = slower + more sensitive). Default 4.0 matches foldseek's `setStructureRbhDefaults` (which, unlike the search workflow, does not bump sensitivity to 9.5).
      </ParamField>

      <ParamField path="max_seqs" type="integer" default="1000">
        Max prefilter targets per query.
      </ParamField>

      <ParamField path="alignment_type" type="enum" default="2">
        Alignment scoring method (0=3Di, 1=TMalign, 2=3Di+AA, 3=LoL). Note: foldseek's RBH workflow only branches on TMalign (1) and 3Di+AA (2); 0 falls through to the same alignment branch as 2.

        Available options: `0`, `1`, `2`, `3`
      </ParamField>

      <ParamField path="cov" type="number" default="0.0">
        Minimum aligned-residue coverage for an RBH pair (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="cov_mode" type="enum" default="0">
        How `cov` is measured: 0=bidirectional, 1=target-only, 2=query-only.

        Available options: `0`, `1`, `2`
      </ParamField>

      <ParamField path="tmscore_threshold" type="number" default="0.0">
        Keep RBH pairs with TM-score above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="lddt_threshold" type="number" default="0.0">
        Keep RBH pairs with LDDT above this (0-1). 0.0 keeps all.
      </ParamField>

      <ParamField path="num_threads" type="integer" default="4">
        CPU threads.
      </ParamField>

      <ParamField path="use_gpu" type="boolean" default="False">
        Run with --gpu 1 on a Linux x86\_64 NVIDIA GPU host (driver >= 525.60.13).
      </ParamField>

      <ParamField path="verbose" type="integer" default="0">
        Verbosity level (0=quiet, 1=info, 2=debug, 3=raw subprocess stderr). `True` is coerced to `1` and `False` to `0`.
      </ParamField>

      <ParamField path="device" type="string" default="cpu">
        Device to run the tool on.
      </ParamField>

      <ParamField path="timeout" type="integer" default="3600">
        Maximum execution time in seconds. `None` waits indefinitely.
      </ParamField>

      <ParamField path="seed" type="integer">
        Random seed. When set, tools run reproducibly up to small GPU float noise (see `BaseToolOutput.approx_equal`), and the seed participates in cache keys. When None, cacheable seed-sensitive tools skip cache until seeded.
      </ParamField>
    </Accordion>
  </div>

  <div class="api-model-section api-output-section">
    <a href="https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/foldseek_rbh.py#L160" 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>

    <Accordion title="Output: FoldseekRBHOutput">
      <ResponseField name="hits" type="List[FoldseekHit]">
        Mutual best-hit alignments. Each hit is a standard 12-column M8 row, identical schema to `foldseek-search`.

        <Expandable title="FoldseekHit">
          <ResponseField name="database" type="string" required>
            Source database the hit came from (e.g. 'pdb100').
          </ResponseField>

          <ResponseField name="target_id" type="string" required>
            Database-specific target identifier (e.g. '1tup\_A', 'AF-P04637-F1').
          </ResponseField>

          <ResponseField name="sequence_identity" type="number" required>
            Sequence identity over the aligned region, as a fraction in \[0, 1].
          </ResponseField>

          <ResponseField name="alignment_length" type="integer" required>
            Length of the aligned region in residues.
          </ResponseField>

          <ResponseField name="mismatches" type="integer" required>
            Number of mismatched columns.
          </ResponseField>

          <ResponseField name="gap_openings" type="integer" required>
            Number of gap-opening events.
          </ResponseField>

          <ResponseField name="query_start" type="integer" required>
            1-indexed start position in the query.
          </ResponseField>

          <ResponseField name="query_end" type="integer" required>
            1-indexed end position in the query.
          </ResponseField>

          <ResponseField name="target_start" type="integer" required>
            1-indexed start position in the target.
          </ResponseField>

          <ResponseField name="target_end" type="integer" required>
            1-indexed end position in the target.
          </ResponseField>

          <ResponseField name="evalue" type="number" required>
            Expectation value.
          </ResponseField>

          <ResponseField name="bit_score" type="number" required>
            Bit score.
          </ResponseField>
        </Expandable>
      </ResponseField>

      <ResponseField name="num_hits" type="integer" required>
        `len(hits)`.
      </ResponseField>

      <ResponseField name="target_db" type="string" required>
        The target DB path that was queried.
      </ResponseField>
    </Accordion>
  </div>

  #### Applications

  This tool produces conservative one-to-one structural correspondences. It is appropriate for structural orthology calls between species, for mapping designed proteins to their closest natural counterpart in a curated reference set, and for any analysis in which the absence of a reciprocal best match should be interpreted as no confident correspondence.

  #### Usage Tips

  * **This tool runs only in local execution mode.** No remote endpoint exists for reciprocal best hits, and a `local_db` value pointing at a prebuilt database or a directory of PDB files is required.
  * **The output is sparse by construction.** Most queries return zero or one hit, and the absence of a reciprocal best match indicates that no target in the database satisfies the reciprocity criterion.
</div>

## Toolkit Notes

These apply to every Foldseek tool in this toolkit (`foldseek-search`, `foldseek-cluster`, `foldseek-multimer-search`, `foldseek-multimercluster`, `foldseek-rbh`).

* **Local memory consumption scales linearly with database size.** The upstream documentation gives a per-residue cost of `(6 + 1 + 1) bytes × num_residues` for Cα coordinates, 3Di letters, and amino-acid letters, and reports that the 54 million entries in AFDB50 require approximately 151 GB of RAM under default settings.
* **Hits use a 12-column M8 tabular schema with `sequence_identity` normalised to the range 0 to 1.** Filtering structural hits by sequence identity defeats the purpose of structural search, since distant homologues commonly share fold without sharing sequence. `evalue` and `bit_score` are the appropriate ranking criteria.
* **Accepted input formats differ by tool.** `foldseek-search`, `foldseek-multimer-search`, and `foldseek-rbh` accept a single query as a `Structure` object, file path, or raw PDB/mmCIF text (normalised to PDB before submission), `foldseek-cluster` accepts PDB, mmCIF, or FASTA, and `foldseek-multimercluster` accepts PDB or mmCIF.
* **Local execution requires a user-supplied target.** Either a prebuilt Foldseek database or a directory of structure files must be provided through the `local_db` field. No reference database is bundled with the toolkit.
* **A directory passed to `structures` caches by file content, not directory path.** Modifying files in place between calls correctly invalidates the cache, so structure-set updates do not produce stale results.
* **Local search can use an NVIDIA GPU.** Set `use_gpu=True` on any local-mode tool; the GPU build auto-installs on Linux x86\_64 hosts with a compatible NVIDIA driver (`>= 525.60.13`).

<Tip>
  **Example notebook:** See the [full working example](https://github.com/evo-design/proto-tools/blob/47e34afa5ea240a3b406e323dc38aa5dc85f223e/proto_tools/tools/structure_alignment/foldseek/examples/example.ipynb) for a copy-paste-ready walkthrough.
</Tip>

## Infrastructure Guides

The following guides cover how to run tools efficiently and at scale.

<CardGroup cols={2}>
  <Card title="Tool Persistence" icon="repeat" href="/docs/tools/guides/tool-persistence">Keep a tool's model warm across calls instead of reloading it every invocation.</Card>
  <Card title="Device Management" icon="cpu" href="/docs/tools/guides/device-management">How GPUs are allocated to tools and how to target specific devices.</Card>
  <Card title="Parallel Execution" icon="layers" href="/docs/tools/guides/parallel-execution">Fan a batch of inputs out across multiple GPUs.</Card>
</CardGroup>
