Files
2026-08-20 12:52:15 -07:00

333 lines
14 KiB
HTML

{% extends "base.html" %}
{% block extrahead %}
<!-- Preconnect for faster font loading -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
{% set page_title = page.title ~ " — " ~ config.site_name if page and page.title else config.site_name ~ " — Durable Execution Engine" %}
{% set page_desc = page.meta.description if page and page.meta and page.meta.description else config.site_description %}
{% set redirect_target = page.meta.redirect_to if page and page.meta and page.meta.redirect_to else none %}
{% set page_url = config.site_url.rstrip('/') ~ '/' ~ redirect_target.lstrip('/') if redirect_target else (config.site_url ~ page.url if page and page.url else config.site_url) %}
{% if redirect_target %}
<meta http-equiv="refresh" content="0; url={{ page_url }}" />
{% endif %}
<!-- Open Graph -->
<meta property="og:type" content="website" />
<meta property="og:site_name" content="{{ config.site_name }}" />
<meta property="og:url" content="{{ page_url }}" />
<meta property="og:title" content="{{ page_title }}" />
<meta property="og:description" content="{{ page_desc }}" />
<meta property="og:image" content="{{ config.site_url }}img/og-conductor.png" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="{{ page_title }}" />
<meta name="twitter:description" content="{{ page_desc }}" />
<meta name="twitter:image" content="{{ config.site_url }}img/og-conductor.png" />
<!-- SEO -->
<meta name="description" content="{{ page_desc }}" />
<link rel="canonical" href="{{ page_url }}" />
<script>
document.addEventListener("DOMContentLoaded", function() {
document.querySelectorAll(".md-sidebar--primary .md-nav__link, .md-sidebar--primary .md-nav__title").forEach(function(title) {
if (title.textContent.trim() === "Reference") {
title.hidden = true;
title.style.display = "none";
}
});
});
</script>
{% if page and page.url == "quickstart/first-agent.html" %}
<script>
(function() {
function textOf(element) {
return element ? element.textContent.trim() : "";
}
function findTopTab(label) {
return Array.from(document.querySelectorAll(".md-tabs__item")).find(function(item) {
return textOf(item.querySelector(":scope > .md-tabs__link")) === label;
});
}
function findSidebarBranch(label) {
var primaryNavigation = document.querySelector(".md-sidebar--primary");
if (!primaryNavigation) return null;
return Array.from(primaryNavigation.querySelectorAll(".md-nav__item--nested")).find(function(item) {
return textOf(item.querySelector(":scope > .md-nav__link .md-ellipsis")) === label;
});
}
function findAgentLink(branch) {
return Array.from(branch.querySelectorAll("a.md-nav__link")).find(function(link) {
return textOf(link) === "Your First Agent";
});
}
function setBranchExpanded(branch, expanded) {
branch.classList.toggle("md-nav__item--active", expanded);
branch.classList.toggle("md-nav__item--section", expanded);
var toggle = branch.querySelector(":scope > input.md-nav__toggle");
if (toggle) {
toggle.checked = expanded;
toggle.indeterminate = false;
}
var navigation = branch.querySelector(":scope > nav.md-nav");
if (navigation) navigation.setAttribute("aria-expanded", String(expanded));
}
function setAgentLinkActive(branch, active) {
var link = findAgentLink(branch);
if (!link) return;
link.classList.toggle("md-nav__link--active", active);
var item = link.closest(".md-nav__item");
if (item) item.classList.toggle("md-nav__item--active", active);
var tocToggle = item && item.querySelector(":scope > label.md-nav__link");
if (tocToggle) tocToggle.classList.toggle("md-nav__link--active", active);
}
function applyFirstAgentNavigation() {
var navigationContext = new URLSearchParams(window.location.search).get("nav");
var selected = navigationContext === "agents-ai" ? "Agents" : "Getting Started";
var contexts = ["Getting Started", "Agents"];
document.querySelectorAll(".md-tabs__item").forEach(function(tab) {
tab.classList.remove("md-tabs__item--active");
});
contexts.forEach(function(label) {
var active = label === selected;
var tab = findTopTab(label);
if (tab) tab.classList.toggle("md-tabs__item--active", active);
var branch = findSidebarBranch(label);
if (!branch) return;
setBranchExpanded(branch, active);
setAgentLinkActive(branch, active);
});
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", applyFirstAgentNavigation);
} else {
applyFirstAgentNavigation();
}
window.addEventListener("pageshow", applyFirstAgentNavigation);
window.addEventListener("popstate", applyFirstAgentNavigation);
})();
</script>
{% endif %}
<!-- Structured Data: SoftwareApplication -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Conductor",
"alternateName": ["Conductor OSS", "Netflix Conductor"],
"applicationCategory": "DeveloperApplication",
"applicationSubCategory": "Workflow Engine",
"operatingSystem": "Cross-platform (Docker, JVM, Kubernetes)",
"description": "{{ config.site_description }}",
"url": "https://conductor-oss.github.io/conductor",
"downloadUrl": "https://github.com/conductor-oss/conductor/releases",
"license": "https://www.apache.org/licenses/LICENSE-2.0",
"isAccessibleForFree": true,
"codeRepository": "https://github.com/conductor-oss/conductor",
"programmingLanguage": ["Java", "Python", "Go", "JavaScript", "C#", "Ruby", "Rust"],
"keywords": ["workflow engine", "durable execution", "AI agent orchestration", "LLM orchestration", "microservice orchestration", "saga pattern", "MCP", "open source"],
"author": {
"@type": "Organization",
"name": "Conductor OSS",
"url": "https://github.com/conductor-oss"
},
"maintainer": {
"@type": "Organization",
"name": "Orkes",
"url": "https://orkes.io"
},
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
}
}
</script>
<!-- Structured Data: BreadcrumbList -->
{% if page and page.url %}
{% set parts = page.url.replace("index.html", "").rstrip("/").split("/") %}
{% if parts | length > 0 and parts[0] != "" %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "{{ config.site_url }}"
}{% for part in parts if part != "" %},
{
"@type": "ListItem",
"position": {{ loop.index + 1 }},
"name": "{{ part | replace('-', ' ') | replace('.html', '') | capitalize }}",
"item": "{{ config.site_url }}{{ parts[:loop.index] | join('/') }}/{{ part }}"
}{% endfor %}
]
}
</script>
{% endif %}
{% endif %}
<!-- Structured Data: FAQPage (homepage only) -->
{% if page and (page.url == "index.html" or page.url == "" or page.url == "/") %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How do I run Conductor with Docker?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Run 'docker run -p 8080:8080 conductoross/conductor:latest' to start Conductor with all dependencies included. The server will be available at http://localhost:8080. For production deployments with external persistence, see the production deployment guide."
}
},
{
"@type": "Question",
"name": "Is Conductor open source?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Conductor is a fully open source workflow engine, Apache 2.0 licensed. You can self-host it on your own infrastructure with no vendor lock-in. It supports 5 persistence backends, 6 message brokers, and runs anywhere Docker runs."
}
},
{
"@type": "Question",
"name": "Is this the same as Netflix Conductor?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Conductor OSS is the continuation of the original Netflix Conductor repository after Netflix contributed the project to the open-source foundation."
}
},
{
"@type": "Question",
"name": "Is this project actively maintained?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Orkes is the primary maintainer of this repository and offers an enterprise SaaS platform for Conductor across all major cloud providers."
}
},
{
"@type": "Question",
"name": "Can Conductor scale to handle my workload?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Conductor servers and workers scale independently. Use task domains, concurrency limits, persistence configuration, and metrics to match throughput and isolation to your environment."
}
},
{
"@type": "Question",
"name": "Does Conductor support durable execution?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Conductor persists workflow and task state, supports recovery after worker and infrastructure failure, and provides retries, timeouts, pause, resume, and termination controls."
}
},
{
"@type": "Question",
"name": "Can I replay a workflow after it completes or fails?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Conductor supports restart, rerun, and retry controls. Execution-history retention depends on configuration, and keepLastN can intentionally remove older loop iterations. Use the API or UI to inspect and manage an execution."
}
},
{
"@type": "Question",
"name": "Can Conductor orchestrate AI agents and LLMs?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Conductor provides native LLM tasks, MCP tool discovery and calls, human approval, and vector workflows for RAG. See the LLM orchestration guide for the maintained provider and capability matrix."
}
},
{
"@type": "Question",
"name": "Isn't JSON too limited for complex workflows?",
"acceptedAnswer": {
"@type": "Answer",
"text": "JSON keeps orchestration as machine-readable data while workers hold business logic. Use validated runtime definitions, dynamic tasks, and dynamic forks when the path is selected at runtime."
}
},
{
"@type": "Question",
"name": "What does Conductor provide for adaptive agents?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Conductor combines native AI and MCP tasks with durable loops, branches, fan-out, approval, retry, cancellation, and an inspectable execution history."
}
}
]
}
</script>
{% endif %}
<!-- Header social icons -->
<style>
.md-header__social {
display: flex;
align-items: center;
gap: 1rem;
margin-left: 1rem;
}
.md-header__social a {
display: flex;
align-items: center;
transition: opacity 0.2s;
opacity: 0.85;
}
.md-header__social a:hover {
opacity: 1;
}
.md-header__social svg {
width: 1.3rem;
height: 1.3rem;
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
var source = document.querySelector(".md-header__source");
if (!source) return;
var container = document.createElement("div");
container.className = "md-header__social";
container.innerHTML =
'<a href="https://join.slack.com/t/orkes-conductor/shared_invite/zt-3dpcskdyd-W895bJDm8psAV7viYG3jFA" target="_blank" rel="noopener" title="Join Slack" aria-label="Join Slack">' +
'<svg viewBox="0 0 448 512" role="img" aria-hidden="true">' +
'<path fill="#E01E5A" d="M94.12 315.1c0 25.9-21.16 47.06-47.06 47.06S0 341 0 315.1c0-25.9 21.16-47.06 47.06-47.06h47.06v47.06zm23.72 0c0-25.9 21.16-47.06 47.06-47.06s47.06 21.16 47.06 47.06v117.84c0 25.9-21.16 47.06-47.06 47.06s-47.06-21.16-47.06-47.06V315.1z"/>' +
'<path fill="#36C5F0" d="M164.9 126.12c-25.9 0-47.06-21.16-47.06-47.06S139 32 164.9 32s47.06 21.16 47.06 47.06v47.06H164.9zm0 23.72c25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06H47.06C21.16 244.96 0 223.8 0 197.9s21.16-47.06 47.06-47.06H164.9z"/>' +
'<path fill="#2EB67D" d="M353.88 197.9c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06s-21.16 47.06-47.06 47.06h-47.06V197.9zm-23.72 0c0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06V79.06c0-25.9 21.16-47.06 47.06-47.06 25.9 0 47.06 21.16 47.06 47.06V197.9z"/>' +
'<path fill="#ECB22E" d="M283.1 386.88c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06-25.9 0-47.06-21.16-47.06-47.06v-47.06h47.06zm0-23.72c-25.9 0-47.06-21.16-47.06-47.06 0-25.9 21.16-47.06 47.06-47.06h117.84c25.9 0 47.06 21.16 47.06 47.06 0 25.9-21.16 47.06-47.06 47.06H283.1z"/>' +
'</svg>' +
'</a>' +
'<a href="https://www.youtube.com/@orkesio" target="_blank" rel="noopener" title="YouTube" aria-label="YouTube">' +
'<svg viewBox="0 0 576 512" role="img" aria-hidden="true">' +
'<path fill="#FF0000" d="M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305z"/>' +
'<path fill="#FFFFFF" d="M232.145 337.591V175.185l142.739 81.205-142.739 81.201z"/>' +
'</svg>' +
'</a>';
source.parentNode.insertBefore(container, source.nextSibling);
});
</script>
{% endblock %}