{"id":30144102,"url":"https://github.com/conductor-oss/javascript-sdk","last_synced_at":"2026-03-10T22:17:30.155Z","repository":{"id":39964310,"uuid":"472928457","full_name":"conductor-oss/javascript-sdk","owner":"conductor-oss","description":"Conductor OSS SDK for JavaScript/TypeScript","archived":false,"fork":false,"pushed_at":"2026-03-04T18:55:16.000Z","size":2184,"stargazers_count":47,"open_issues_count":22,"forks_count":15,"subscribers_count":9,"default_branch":"main","last_synced_at":"2026-03-05T00:56:08.926Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/conductor-oss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-03-22T20:32:36.000Z","updated_at":"2026-02-26T22:27:13.000Z","dependencies_parsed_at":"2025-12-16T23:00:55.028Z","dependency_job_id":null,"html_url":"https://github.com/conductor-oss/javascript-sdk","commit_stats":null,"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"purl":"pkg:github/conductor-oss/javascript-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fjavascript-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fjavascript-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fjavascript-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fjavascript-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/conductor-oss","download_url":"https://codeload.github.com/conductor-oss/javascript-sdk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conductor-oss%2Fjavascript-sdk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30357670,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"ssl_error","status_checked_at":"2026-03-10T21:40:59.357Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-11T07:37:33.116Z","updated_at":"2026-03-10T22:17:30.147Z","avatar_url":"https://github.com/conductor-oss.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# JavaScript/TypeScript SDK for Conductor\n\n[![Build Status](https://github.com/conductor-oss/javascript-sdk/actions/workflows/pull_request.yml/badge.svg)](https://github.com/conductor-oss/javascript-sdk/actions/workflows/pull_request.yml)\n[![npm](https://img.shields.io/npm/v/@io-orkes/conductor-javascript.svg)](https://www.npmjs.com/package/@io-orkes/conductor-javascript)\n[![License](https://img.shields.io/npm/l/@io-orkes/conductor-javascript.svg)](LICENSE)\n\nTypeScript/JavaScript SDK for [Conductor](https://www.conductor-oss.org/) (OSS and Orkes Conductor) — an orchestration platform for building distributed applications, AI agents, and workflow-driven microservices. Define workflows as code, run workers anywhere, and let Conductor handle retries, state management, and observability.\n\nIf you find [Conductor](https://github.com/conductor-oss/conductor) useful, please consider giving it a star on GitHub — it helps the project grow.\n\n[![GitHub stars](https://img.shields.io/github/stars/conductor-oss/conductor.svg?style=social\u0026label=Star\u0026maxAge=)](https://GitHub.com/conductor-oss/conductor/)\n\n\u003c!-- TOC --\u003e\n* [Start Conductor server](#start-conductor-server)\n* [Install the SDK](#install-the-sdk)\n* [60-Second Quickstart](#60-second-quickstart)\n* [What You Can Build](#what-you-can-build)\n* [Workers](#workers)\n* [Monitoring Workers](#monitoring-workers)\n* [Managing Workflow Executions](#managing-workflow-executions)\n* [Troubleshooting](#troubleshooting)\n* [Examples](#examples)\n* [API Journey Examples](#api-journey-examples)\n* [AI \u0026 LLM Workflows](#ai--llm-workflows)\n* [Documentation](#documentation)\n* [Support](#support)\n* [Frequently Asked Questions](#frequently-asked-questions)\n* [License](#license)\n\u003c!-- TOC --\u003e\n\n## Start Conductor server\n\nIf you don't already have a Conductor server running, pick one:\n\n**Docker (recommended, includes UI):**\n\n```shell\ndocker run -p 8080:8080 conductoross/conductor:latest\n```\n\nThe UI will be available at `http://localhost:8080` and the API at `http://localhost:8080/api`.\n\n**MacOS / Linux (one-liner):**\n\n```shell\ncurl -sSL https://raw.githubusercontent.com/conductor-oss/conductor/main/conductor_server.sh | sh\n```\n\n**Conductor CLI:**\n\n```shell\nnpm install -g @conductor-oss/conductor-cli\nconductor server start\n```\n\n## Install the SDK\n\n```shell\nnpm install @io-orkes/conductor-javascript\n```\n\n## 60-Second Quickstart\n\n**Step 1: Create a workflow**\n\nWorkflows are definitions that reference task types. We'll build a workflow called `greetings` that runs one worker task and returns its output.\n\n```typescript\nimport { ConductorWorkflow, simpleTask } from \"@io-orkes/conductor-javascript\";\n\nconst workflow = new ConductorWorkflow(executor, \"greetings\")\n  .add(simpleTask(\"greet_ref\", \"greet\", { name: \"${workflow.input.name}\" }))\n  .outputParameters({ result: \"${greet_ref.output.result}\" });\n\nawait workflow.register();\n```\n\n**Step 2: Write a worker**\n\nWorkers are TypeScript functions decorated with `@worker` that poll Conductor for tasks and execute them.\n\n```typescript\nimport { worker } from \"@io-orkes/conductor-javascript\";\n\n@worker({ taskDefName: \"greet\" })\nasync function greet(task: Task) {\n  return {\n    status: \"COMPLETED\",\n    outputData: { result: `Hello ${task.inputData.name}` },\n  };\n}\n```\n\n**Step 3: Run your first workflow app**\n\nCreate a `quickstart.ts` with the following:\n\n```typescript\nimport {\n  OrkesClients,\n  ConductorWorkflow,\n  TaskHandler,\n  worker,\n  simpleTask,\n} from \"@io-orkes/conductor-javascript\";\nimport type { Task } from \"@io-orkes/conductor-javascript\";\n\n// A worker is any TypeScript function.\n@worker({ taskDefName: \"greet\" })\nasync function greet(task: Task) {\n  return {\n    status: \"COMPLETED\" as const,\n    outputData: { result: `Hello ${task.inputData.name}` },\n  };\n}\n\nasync function main() {\n  // Configure the SDK (reads CONDUCTOR_SERVER_URL / CONDUCTOR_AUTH_* from env).\n  const clients = await OrkesClients.from();\n  const executor = clients.getWorkflowClient();\n\n  // Build a workflow with the fluent builder.\n  const workflow = new ConductorWorkflow(executor, \"greetings\")\n    .add(simpleTask(\"greet_ref\", \"greet\", { name: \"${workflow.input.name}\" }))\n    .outputParameters({ result: \"${greet_ref.output.result}\" });\n\n  await workflow.register();\n\n  // Start polling for tasks (auto-discovers @worker decorated functions).\n  const handler = new TaskHandler({\n    client: clients.getClient(),\n    scanForDecorated: true,\n  });\n  await handler.startWorkers();\n\n  // Run the workflow and get the result.\n  const run = await workflow.execute({ name: \"Conductor\" });\n  console.log(`result: ${run.output?.result}`);\n\n  await handler.stopWorkers();\n}\n\nmain();\n```\n\nRun it:\n\n```shell\nexport CONDUCTOR_SERVER_URL=http://localhost:8080\nnpx ts-node quickstart.ts\n```\n\n\u003e ### Using Orkes Conductor / Remote Server?\n\u003e Export your authentication credentials:\n\u003e\n\u003e ```shell\n\u003e export CONDUCTOR_SERVER_URL=\"https://your-cluster.orkesconductor.io/api\"\n\u003e export CONDUCTOR_AUTH_KEY=\"your-key\"\n\u003e export CONDUCTOR_AUTH_SECRET=\"your-secret\"\n\u003e ```\n\nThat's it — you defined a worker, built a workflow, and executed it. Open the Conductor UI (default: [http://localhost:8080](http://localhost:8080)) to see the execution.\n\n## What You Can Build\n\nThe SDK provides typed builders for common orchestration patterns. Here's a taste of what you can wire together:\n\n**HTTP calls from workflows** — call any API without writing a worker ([kitchensink.ts](examples/kitchensink.ts)):\n\n```typescript\nhttpTask(\"call_api\", {\n  uri: \"https://api.example.com/orders/${workflow.input.orderId}\",\n  method: \"POST\",\n  body: { items: \"${workflow.input.items}\" },\n  headers: { \"Authorization\": \"Bearer ${workflow.input.token}\" },\n})\n```\n\n**Wait between tasks** — pause a workflow for a duration or until a timestamp ([kitchensink.ts](examples/kitchensink.ts)):\n\n```typescript\n.add(simpleTask(\"step1_ref\", \"process_order\", {...}))\n.add(waitTaskDuration(\"cool_down\", \"10s\"))        // wait 10 seconds\n.add(simpleTask(\"step2_ref\", \"send_confirmation\", {...}))\n```\n\n**Parallel execution (fork/join)** — fan out to multiple branches and join ([fork-join.ts](examples/advanced/fork-join.ts)):\n\n```typescript\nworkflow.fork([\n  [simpleTask(\"email_ref\", \"send_email\", {})],\n  [simpleTask(\"sms_ref\", \"send_sms\", {})],\n  [simpleTask(\"push_ref\", \"send_push\", {})],\n])\n```\n\n**Conditional branching** — route based on input values ([kitchensink.ts](examples/kitchensink.ts)):\n\n```typescript\nswitchTask(\"route_ref\", \"${workflow.input.tier}\", {\n  premium: [simpleTask(\"fast_ref\", \"fast_track\", {})],\n  standard: [simpleTask(\"normal_ref\", \"standard_process\", {})],\n})\n```\n\n**Sub-workflows** — compose workflows from smaller workflows ([sub-workflows.ts](examples/advanced/sub-workflows.ts)):\n\n```typescript\nconst child = new ConductorWorkflow(executor, \"payment_flow\").add(...);\nconst parent = new ConductorWorkflow(executor, \"order_flow\")\n  .add(child.toSubWorkflowTask(\"pay_ref\"));\n```\n\nAll of these are type-safe, composable, and registered to the server as JSON — workers can be in any language.\n\n## Workers\n\nWorkers are TypeScript functions that execute Conductor tasks. Decorate any function with `@worker` to register it as a worker (auto-discovered by `TaskHandler`) and use it as a workflow task.\n\n```typescript\nimport { worker, TaskHandler } from \"@io-orkes/conductor-javascript\";\n\n@worker({ taskDefName: \"greet\", concurrency: 5, pollInterval: 100 })\nasync function greet(task: Task) {\n  return {\n    status: \"COMPLETED\",\n    outputData: { result: `Hello ${task.inputData.name}` },\n  };\n}\n\n@worker({ taskDefName: \"process_payment\", domain: \"payments\" })\nasync function processPayment(task: Task) {\n  const result = await paymentGateway.charge(task.inputData.customerId, task.inputData.amount);\n  return { status: \"COMPLETED\", outputData: { transactionId: result.id } };\n}\n\n// Auto-discover and start all decorated workers\nconst handler = new TaskHandler({ client, scanForDecorated: true });\nawait handler.startWorkers();\n\n// Graceful shutdown\nprocess.on(\"SIGTERM\", async () =\u003e {\n  await handler.stopWorkers();\n  process.exit(0);\n});\n```\n\n**Worker configuration:**\n\n```typescript\n@worker({\n  taskDefName: \"my_task\",    // Required: task name\n  concurrency: 5,             // Max concurrent tasks (default: 1)\n  pollInterval: 100,          // Polling interval in ms (default: 100)\n  domain: \"production\",       // Task domain for multi-tenancy\n  workerId: \"worker-123\",     // Unique worker identifier\n})\n```\n\n**Environment variable overrides** (no code changes needed):\n\n```shell\n# Global (all workers)\nexport CONDUCTOR_WORKER_ALL_POLL_INTERVAL=500\nexport CONDUCTOR_WORKER_ALL_CONCURRENCY=10\n\n# Per-worker override\nexport CONDUCTOR_WORKER_SEND_EMAIL_CONCURRENCY=20\nexport CONDUCTOR_WORKER_PROCESS_PAYMENT_DOMAIN=payments\n```\n\n**NonRetryableException** — mark failures as terminal to prevent retries:\n\n```typescript\nimport { NonRetryableException } from \"@io-orkes/conductor-javascript\";\n\n@worker({ taskDefName: \"validate_order\" })\nasync function validateOrder(task: Task) {\n  const order = await getOrder(task.inputData.orderId);\n  if (!order) {\n    throw new NonRetryableException(\"Order not found\"); // FAILED_WITH_TERMINAL_ERROR\n  }\n  return { status: \"COMPLETED\", outputData: { validated: true } };\n}\n```\n\n- `throw new Error()` → Task status: `FAILED` (will retry)\n- `throw new NonRetryableException()` → Task status: `FAILED_WITH_TERMINAL_ERROR` (no retry)\n\n**Long-running tasks with TaskContext** — return `IN_PROGRESS` to keep a task alive while an external process completes. Conductor will call back after the specified interval ([task-context.ts](examples/task-context.ts)):\n\n```typescript\nimport { worker, getTaskContext } from \"@io-orkes/conductor-javascript\";\n\n@worker({ taskDefName: \"process_video\" })\nasync function processVideo(task: Task) {\n  const ctx = getTaskContext();\n  ctx?.addLog(\"Starting video processing...\");\n\n  if (!isComplete(task.inputData)) {\n    ctx?.setCallbackAfter(30); // check again in 30 seconds\n    return { status: \"IN_PROGRESS\", callbackAfterSeconds: 30 };\n  }\n\n  return { status: \"COMPLETED\", outputData: { url: \"...\" } };\n}\n```\n\n`TaskContext` is also available for one-shot workers — use `ctx?.addLog()` to stream logs visible in the Conductor UI.\n\n**Event listeners** for observability:\n\n```typescript\nconst handler = new TaskHandler({\n  client,\n  scanForDecorated: true,\n  eventListeners: [{\n    onTaskExecutionCompleted(event) {\n      metrics.histogram(\"task_duration_ms\", event.durationMs, { task_type: event.taskType });\n    },\n    onTaskUpdateFailure(event) {\n      alertOps({ severity: \"CRITICAL\", message: `Task update failed`, taskId: event.taskId });\n    },\n  }],\n});\n```\n\n**Organize workers across files** with module imports:\n\n```typescript\nconst handler = await TaskHandler.create({\n  client,\n  importModules: [\"./workers/orderWorkers\", \"./workers/paymentWorkers\"],\n});\nawait handler.startWorkers();\n```\n\n**Legacy TaskManager API** continues to work with full backward compatibility. New projects should use `@worker` + `TaskHandler` above.\n\n## Monitoring Workers\n\nEnable Prometheus metrics with the built-in `MetricsCollector`:\n\n```typescript\nimport { MetricsCollector, MetricsServer, TaskHandler } from \"@io-orkes/conductor-javascript\";\n\nconst metrics = new MetricsCollector();\nconst server = new MetricsServer(metrics, 9090);\nawait server.start();\n\nconst handler = new TaskHandler({\n  client,\n  eventListeners: [metrics],\n  scanForDecorated: true,\n});\nawait handler.startWorkers();\n// GET http://localhost:9090/metrics — Prometheus text format\n// GET http://localhost:9090/health  — {\"status\":\"UP\"}\n```\n\nCollects 18 metric types: poll counts, execution durations, error rates, output sizes, and more — with p50/p75/p90/p95/p99 quantiles. See [METRICS.md](METRICS.md) for the full reference.\n\n## Managing Workflow Executions\n\nOnce a workflow is registered (see [What You Can Build](#what-you-can-build)), you can run and manage it through the full lifecycle:\n\n```typescript\nconst executor = clients.getWorkflowClient();\n\n// Start (async — returns immediately)\nconst workflowId = await executor.startWorkflow({\n  name: \"order_flow\",\n  input: { orderId: \"ORDER-123\" },\n});\n\n// Execute (sync — waits for completion)\nconst result = await workflow.execute({ orderId: \"123\" });\n\n// Lifecycle management\nawait executor.pause(workflowId);\nawait executor.resume(workflowId);\nawait executor.terminate(workflowId, \"cancelled by user\");\nawait executor.restart(workflowId);\nawait executor.retry(workflowId);\n\n// Signal a running WAIT task\nawait executor.signal(workflowId, TaskResultStatusEnum.COMPLETED, { approved: true });\n\n// Search workflows\nconst results = await executor.search(\"workflowType = 'order_flow' AND status = 'RUNNING'\");\n```\n\nSee [workflow-ops.ts](examples/workflow-ops.ts) for a runnable example covering all lifecycle operations.\n\n## Troubleshooting\n\n- **Worker stops polling or crashes:** `TaskHandler` monitors and restarts worker polling loops by default. Expose a health check using `handler.running` and `handler.runningWorkerCount`. If you enable metrics, alert on `worker_restart_total`.\n- **HTTP/2 connection errors:** The SDK uses Undici for HTTP/2 when available. If your environment has unstable long-lived connections, the SDK falls back to HTTP/1.1 automatically. You can also provide a custom fetch function: `orkesConductorClient(config, myFetch)`.\n- **Task stuck in SCHEDULED:** Ensure your worker is polling for the correct `taskDefName`. Workers must be started before the workflow is executed.\n\n## Examples\n\nSee the [Examples Guide](examples/README.md) for the full catalog. Key examples:\n\n| Example | Description | Run |\n|---------|-------------|-----|\n| [workers-e2e.ts](examples/workers-e2e.ts) | End-to-end: 3 chained workers with verification | `npx ts-node examples/workers-e2e.ts` |\n| [quickstart.ts](examples/quickstart.ts) | 60-second intro: @worker + workflow + execute | `npx ts-node examples/quickstart.ts` |\n| [kitchensink.ts](examples/kitchensink.ts) | All major task types in one workflow | `npx ts-node examples/kitchensink.ts` |\n| [workflow-ops.ts](examples/workflow-ops.ts) | Lifecycle: pause, resume, terminate, retry, search | `npx ts-node examples/workflow-ops.ts` |\n| [test-workflows.ts](examples/test-workflows.ts) | Unit testing with mock outputs (no workers) | `npx ts-node examples/test-workflows.ts` |\n| [metrics.ts](examples/metrics.ts) | Prometheus metrics + HTTP server on :9090 | `npx ts-node examples/metrics.ts` |\n| [express-worker-service.ts](examples/express-worker-service.ts) | Express.js + workers in one process | `npx ts-node examples/express-worker-service.ts` |\n| [function-calling.ts](examples/agentic-workflows/function-calling.ts) | LLM dynamically picks which worker to call | `npx ts-node examples/agentic-workflows/function-calling.ts` |\n| [fork-join.ts](examples/advanced/fork-join.ts) | Parallel branches with join synchronization | `npx ts-node examples/advanced/fork-join.ts` |\n| [sub-workflows.ts](examples/advanced/sub-workflows.ts) | Workflow composition with sub-workflows | `npx ts-node examples/advanced/sub-workflows.ts` |\n| [human-tasks.ts](examples/advanced/human-tasks.ts) | Human-in-the-loop: claim, update, complete | `npx ts-node examples/advanced/human-tasks.ts` |\n\n## API Journey Examples\n\nEnd-to-end examples covering all APIs for each domain:\n\n| Example | APIs | Run |\n|---------|------|-----|\n| [authorization.ts](examples/api-journeys/authorization.ts) | Authorization APIs (17 calls) | `npx ts-node examples/api-journeys/authorization.ts` |\n| [metadata.ts](examples/api-journeys/metadata.ts) | Metadata APIs (21 calls) | `npx ts-node examples/api-journeys/metadata.ts` |\n| [prompts.ts](examples/api-journeys/prompts.ts) | Prompt APIs (9 calls) | `npx ts-node examples/api-journeys/prompts.ts` |\n| [schedules.ts](examples/api-journeys/schedules.ts) | Schedule APIs (13 calls) | `npx ts-node examples/api-journeys/schedules.ts` |\n| [secrets.ts](examples/api-journeys/secrets.ts) | Secret APIs (12 calls) | `npx ts-node examples/api-journeys/secrets.ts` |\n| [integrations.ts](examples/api-journeys/integrations.ts) | Integration APIs (22 calls) | `npx ts-node examples/api-journeys/integrations.ts` |\n| [schemas.ts](examples/api-journeys/schemas.ts) | Schema APIs (10 calls) | `npx ts-node examples/api-journeys/schemas.ts` |\n| [applications.ts](examples/api-journeys/applications.ts) | Application APIs (20 calls) | `npx ts-node examples/api-journeys/applications.ts` |\n| [event-handlers.ts](examples/api-journeys/event-handlers.ts) | Event Handler APIs (18 calls) | `npx ts-node examples/api-journeys/event-handlers.ts` |\n\n## AI \u0026 LLM Workflows\n\nConductor supports AI-native workflows including agentic tool calling, RAG pipelines, and multi-agent orchestration. The SDK provides typed builders for all LLM task types:\n\n| Builder | Description |\n|---------|-------------|\n| `llmChatCompleteTask` | LLM chat completion (OpenAI, Anthropic, etc.) |\n| `llmTextCompleteTask` | Text completion |\n| `llmGenerateEmbeddingsTask` | Generate vector embeddings |\n| `llmIndexDocumentTask` | Index a document into a vector store |\n| `llmIndexTextTask` | Index text into a vector store |\n| `llmSearchIndexTask` | Search a vector index |\n| `llmSearchEmbeddingsTask` | Search by embedding similarity |\n| `llmStoreEmbeddingsTask` | Store pre-computed embeddings |\n| `llmQueryEmbeddingsTask` | Query embeddings |\n| `generateImageTask` | Generate images |\n| `generateAudioTask` | Generate audio |\n| `callMcpToolTask` | Call an MCP tool |\n| `listMcpToolsTask` | List available MCP tools |\n\n**Example: LLM chat workflow**\n\n```typescript\nimport { ConductorWorkflow, llmChatCompleteTask, Role } from \"@io-orkes/conductor-javascript\";\n\nconst workflow = new ConductorWorkflow(executor, \"ai_chat\")\n  .add(llmChatCompleteTask(\"chat_ref\", \"openai\", \"gpt-4o\", {\n    messages: [{ role: Role.USER, message: \"${workflow.input.question}\" }],\n    temperature: 0.7,\n    maxTokens: 500,\n  }))\n  .outputParameters({ answer: \"${chat_ref.output.result}\" });\n\nawait workflow.register();\nconst run = await workflow.execute({ question: \"What is Conductor?\" });\nconsole.log(run.output?.answer);\n```\n\n**Agentic Workflows**\n\nBuild AI agents where LLMs dynamically select and call TypeScript workers as tools.\nSee [examples/agentic-workflows/](examples/agentic-workflows/) for all examples.\n\n| Example | Description |\n|---------|-------------|\n| [llm-chat.ts](examples/agentic-workflows/llm-chat.ts) | Automated multi-turn conversation between two LLMs |\n| [llm-chat-human-in-loop.ts](examples/agentic-workflows/llm-chat-human-in-loop.ts) | Interactive chat with WAIT tasks for human input |\n| [function-calling.ts](examples/agentic-workflows/function-calling.ts) | LLM dynamically picks which worker function to call |\n| [mcp-weather-agent.ts](examples/agentic-workflows/mcp-weather-agent.ts) | MCP tool discovery and invocation for real-time data |\n| [multiagent-chat.ts](examples/agentic-workflows/multiagent-chat.ts) | Multi-agent debate: optimist vs skeptic with moderator |\n\n**RAG and Vector DB Workflows**\n\n| Example | Description |\n|---------|-------------|\n| [rag-workflow.ts](examples/advanced/rag-workflow.ts) | End-to-end RAG: document indexing → semantic search → LLM answer |\n| [vector-db.ts](examples/advanced/vector-db.ts) | Vector DB operations: embedding generation, storage, search |\n\n## Documentation\n\n| Document | Description |\n|----------|-------------|\n| [SDK Development Guide](SDK_DEVELOPMENT.md) | Architecture, patterns, pitfalls, testing |\n| [Metrics Reference](METRICS.md) | All 18 Prometheus metrics with descriptions |\n| [Breaking Changes](BREAKING_CHANGES.md) | v3.x migration guide |\n| [Workflow Management](docs/api-reference/workflow-executor.md) | Start, pause, resume, terminate, retry, search, signal |\n| [Task Management](docs/api-reference/task-client.md) | Task operations, logs, queue management |\n| [Metadata](docs/api-reference/metadata-client.md) | Task \u0026 workflow definitions, tags, rate limits |\n| [Scheduling](docs/api-reference/scheduler-client.md) | Workflow scheduling with CRON expressions |\n| [Authorization](docs/api-reference/authorization-client.md) | Users, groups, permissions |\n| [Applications](docs/api-reference/application-client.md) | Application management, access keys, roles |\n| [Events](docs/api-reference/event-client.md) | Event handlers, event-driven workflows |\n| [Human Tasks](docs/api-reference/human-executor.md) | Human-in-the-loop workflows, form templates |\n| [Service Registry](docs/api-reference/service-registry-client.md) | Service discovery, circuit breakers |\n| [Secrets](docs/api-reference/secret-client.md) | Secret storage and management |\n| [Prompts](docs/api-reference/prompt-client.md) | AI/LLM prompt templates |\n| [Integrations](docs/api-reference/integration-client.md) | AI/LLM provider integrations |\n| [Schemas](docs/api-reference/schema-client.md) | JSON/Avro/Protobuf schema management |\n\n## Support\n\n- [Open an issue (SDK)](https://github.com/conductor-oss/javascript-sdk/issues) for SDK bugs, questions, and feature requests\n- [Open an issue (Conductor server)](https://github.com/conductor-oss/conductor/issues) for Conductor OSS server issues\n- [Join the Conductor Slack](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2vdbx239s-Eacdyqya9giNLHfrCavfaA) for community discussion and help\n- [Orkes Community Forum](https://community.orkes.io/) for Q\u0026A\n\n## Frequently Asked Questions\n\n**Is this the same as Netflix Conductor?**\n\nYes. Conductor OSS is the continuation of the original [Netflix Conductor](https://github.com/Netflix/conductor) repository after Netflix contributed the project to the open-source foundation.\n\n**Is this project actively maintained?**\n\nYes. [Orkes](https://orkes.io) is the primary maintainer and offers an enterprise SaaS platform for Conductor across all major cloud providers.\n\n**Can Conductor scale to handle my workload?**\n\nConductor was built at Netflix to handle massive scale and has been battle-tested in production environments processing millions of workflows. It scales horizontally to meet virtually any demand.\n\n**What Node.js versions are supported?**\n\nNode.js 18 and above.\n\n**Should I use `@worker` decorator or the legacy `TaskManager`?**\n\nUse `@worker` + `TaskHandler` for all new projects. It provides auto-discovery, cleaner code, and better TypeScript integration. The legacy `TaskManager` API is maintained for backward compatibility.\n\n**Can I mix workers written in different languages?**\n\nYes. A single workflow can have workers written in TypeScript, Python, Java, Go, or any other supported language. Workers communicate through the Conductor server, not directly with each other.\n\n**How do I run workers in production?**\n\nWorkers are standard Node.js processes. Deploy them as you would any Node.js application — in containers, VMs, or serverless. Workers poll the Conductor server for tasks, so no inbound ports need to be opened.\n\n**How do I test workflows without running a full Conductor server?**\n\nThe SDK provides `testWorkflow()` on `WorkflowExecutor` that uses Conductor's `POST /api/workflow/test` endpoint to evaluate workflows with mock task outputs.\n\n**Does the SDK support HTTP/2?**\n\nYes. When the optional `undici` package is installed (`npm install undici`), the SDK automatically uses HTTP/2 with connection pooling for better performance.\n\n## License\n\nApache 2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconductor-oss%2Fjavascript-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconductor-oss%2Fjavascript-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconductor-oss%2Fjavascript-sdk/lists"}