Self-hosted platform for building, testing, and shipping LangChain/LangGraph agents. Deep-agent sub-agents on the canvas, a live tracing/observability timeline, auto-provisioned built-in tools with import/export, per-environment tool variables, streamed evaluations, and per-user auth token forwarding.
22 KiB
Forge - User Manual
Forge is a self‑hosted platform for building, testing, and shipping AI agents and workflows - visually, without writing framework code. You wire together nodes (agents, tools, knowledge, logic) on a canvas, ground them in your own data, connect them to your systems, and deploy them to email, an API, an MCP server, or an embeddable web widget. It runs on the open‑source LangChain/LangGraph engine; nothing is sent to a third‑party orchestration service.
This manual is written for everyone - you don't need to be a developer to follow it.
1. Getting started
Logging in
When you open Forge you'll see a login screen.
- Dev / first run: sign in with
you@forge.local/forge-admin, or click Create a workspace to register a fresh account. - Need teammates? Open Settings → Members & Roles to invite them (owner / admin / editor / viewer / connector roles).
Creating your first project
A project is a workspace for one assistant or automation - its workflows, tools, knowledge, and settings live together and are isolated from other projects.
- Click New project, give it a name.
- (Recommended) Open Settings → API Keys and paste an OpenAI / Anthropic / Google key under Model providers. Until you do, Forge uses an offline “fake” model so you can build and test the plumbing without spending anything - but answers won't be real.
- Pick a Default model under Settings → General (e.g.
openai:gpt-4.1-mini).
The left sidebar (hover any tab for a tooltip)
The nav is grouped into Build, Deploy, and Observe, with Overview at the top and Settings pinned at the bottom.
| Group | Tab | What it's for |
|---|---|---|
| — | Overview | Dashboard: usage, cost, recent activity. |
| Build | Playground | Chat with a workflow live to test it (with token + cost metering). |
| Workflows | The visual canvas - wire nodes into a graph. | |
| Agents | Reusable agent presets (model + prompt + tools + knowledge) to drop into workflows. | |
| Tools | Capabilities an agent can call: REST, GraphQL, Code, SQL, MCP, built‑ins - organized into tool sets. | |
| Components | Generative‑UI components an agent can render (tables, cards, forms). | |
| Knowledge | Documents + Q&A that ground answers (RAG). Add text, URLs, files, or crawl a site. | |
| Auth Providers | Reusable credential strategies (Bearer, API key, OAuth…) tools attach to. | |
| External MCP | Register outside MCP servers so their tools can be consumed here. | |
| Deploy | Channels | Deploy a workflow to an email surface. |
| Triggers | Event entry points - webhook URLs, schedules, pollers. | |
| Connect | Expose this project - as an MCP server, the run API, or an embeddable web widget. | |
| Observe | Traces | Per‑run waterfall: model calls, tokens, latency, cost. |
| Evaluations | Test datasets (input + expected) scored against a workflow. | |
| Agent inbox | Live conversations escalated to a human - reply to resume the run. | |
| — | Settings | Model keys & secrets, members & roles, guardrails & egress, budgets, versioning, and more. |
2. Core concepts
- Workflow - a graph of nodes wired
start → … → end. A user message (or a trigger event) flows through it. Built on the Workflows canvas. - Node - one step. Hover any node in the palette for a description + example.
- Agent - a model with a system prompt, tools, and optional knowledge that reasons → acts in a loop until it can answer (the workhorse).
- Tool - an external capability an agent (or a
tool_callnode) can invoke. - Knowledge - your documents + Q&A pairs, embedded for semantic search (RAG).
- Trigger - what starts a workflow (a person chatting, a webhook, a schedule…).
- Channel - where a workflow is deployed (email).
- State - the data carried through a run (always includes
messages; you can add keys).
3. Workflows & the node catalog
Open Workflows → New, then drag/click nodes from the palette and connect them. Click a node to configure it in the inspector (friendly forms - no JSON). Publish to make it live; Run (or the Playground) to test.
Flow
| Node | What it does | Key config |
|---|---|---|
| Start / End | Entry / exit markers. | - |
| Router | Branches on a state value (no model call). One case per value + an Else/Default. multi runs every matching branch in parallel. |
expression (state key), cases, default |
| Loop | Repeats a section until a condition is false or a max‑iteration cap. Writes _loop=continue/done - pair with a Router that loops the body back. |
max_iter, condition |
| Parallel Fanout | Maps over a list in state - runs a child node once per item, in parallel. | over (list key), child_node, item_key |
| Join | Where parallel branches converge before continuing (results aggregate via an add‑reducer key). | reducer |
| Subworkflow | Runs another workflow in this project as a reusable component. | workflow_id |
Agents & model
| Node | What it does |
|---|---|
| Agent | Model + prompt + tools, ReAct loop. Toggle knowledge (RAG / Q&A) right on the agent so it searches per sub‑question. |
| Deep Agent | Agent + optional planning / virtual filesystem / sub‑agents for long multi‑step tasks. Drag from its subagents handle (bottom of the node) to any specialist Agent node to make it a callable sub‑agent — the supervisor dispatches it via the task tool. Each sub‑agent keeps its own model, tools, and prompt; set the specialist's description so the supervisor knows when to call it. |
| LLM | One single model call (cheap rewriting/summarizing). |
| Classifier | One model call picks a label (e.g. intent) into state. multi_label writes all that apply. |
Tools, data & humans
| Node | What it does |
|---|---|
| Tool Call | Invokes one specific tool with fixed/mapped arguments (deterministic). |
| Transform | Reshapes state with a JMESPath expression (no model). |
| Retrieval | Pulls knowledge into context - documents (RAG) and/or curated Q&A pairs, each toggleable. Place before a grounded agent. |
| Human Input | Pauses the run for approve/reject in the Playground. |
| Human Handoff | Escalates to a person via the Agent inbox; their reply becomes the answer and is delivered over the channel. |
| Webhook Out | POSTs run data to an external URL. |
| Emit Event | Emits a custom event into the live run stream. |
Triggers (entry points)
| Node | Starts the workflow when… | Key config |
|---|---|---|
| Webhook | An external system POSTs to the workflow's hook URL (shown on Triggers after publish). | message_path, require_signature, secret_ref |
| Schedule | A recurring time (interval or cron) - sends a fixed message each run. | every_minutes or cron, message |
| Mail arrives in the connected mailbox (configure an Email channel). | mailbox, reply |
|
| App Event | Polling a URL returns a new item (deduped) - turns any feed into events. | poll_url, interval_minutes, items_path, dedupe_key |
Error fallback: set a workflow's
on_error.message(via the Forge Assistant) to send a graceful reply when a run fails instead of erroring silently.
4. Tools
Tools → New then pick a kind. Each tool has a description (what the model reads to decide when to use it) and is tested live on the right.
| Kind | Configure | Example |
|---|---|---|
| REST | method + URL (with {placeholders}), headers, input fields, optional response projection (JMESPath to trim the payload → fewer tokens). |
GET https://api.acme.dev/orders/{order_id} |
| GraphQL | endpoint + query + variables. | A query { order(id:$id){…} } |
| Code | Python def main(**kwargs): return … (sandboxed; pure‑stdlib imports) + an arguments JSON Schema. |
uppercase / reshape / compute |
| SQL | a connection secret (DB URL), a parameterized SELECT … :id, args schema, read‑only. |
look up a customer by id |
| MCP | pick a registered MCP server (Connect screen) + the remote tool name. | a tool from a GitHub/Slack MCP server |
| Built‑in | calculator, current_time, web_fetch, web_search, knowledge_search, remember / recall (long‑term memory). |
give an agent memory across chats |
Built‑ins are project defaults: every project is auto‑provisioned the built‑ins above; they sit pinned at the top of the Tools screen, can't be deleted (disable instead), and never travel in import/export bundles — so importing a project neither duplicates nor loses them.
Per‑environment endpoints ({{env.*}}): a REST URL / GraphQL endpoint (or an auth template)
can reference {{env.<key>}}, resolved from the FORGE_TOOL_VARS JSON map set per deploy — so the
same tool row points at your dev / qa / prod host without editing it. A referenced key that
isn't defined fails the call loudly (never a broken URL). ({{ctx.*}} per‑run values stay
lenient — a missing one renders empty.)
Response projection (cost lever): for REST/GraphQL, the Projection tab trims the raw response with JMESPath before it reaches the model - watch the Raw→Projected token meter shrink.
Reliability: REST tools support retry (with backoff), rate_limit.per_minute, and
cache.ttl_seconds (caches idempotent GETs).
Safety: every outbound call (tools, webhooks, fetch, crawl) is checked by the SSRF guard
- private/loopback/cloud‑metadata addresses are blocked. A project‑level egress policy (Settings → Guardrails & Egress) can further allow/deny hosts across every tool at once (§9).
Tool sets: group related tools into a tool set - a reusable, many‑to‑many folder. Sets organize the Tools screen (filter chips + a "Manage toolsets" drawer), can be granted to an agent in one click (instead of picking tools one by one), and can be published over the project's MCP server as a toolset (§10).
5. Auth Providers & OAuth
Auth Providers hold a reusable credential strategy that tools attach to. Secrets are
referenced (never pasted into config) as secret://proj/<name> - set the values in
Settings → Secrets.
| Strategy | Use for |
|---|---|
| Bearer | A static API token in Authorization: Bearer …. |
| API key | A key in a header or query param. |
| Basic | username/password. |
| OAuth2 client‑creds | Machine‑to‑machine token from a token URL. |
| OAuth2 (user login) | 3‑legged OAuth: click Connect, grant access in the popup; Forge stores + auto‑refreshes tokens. Use for Google/HubSpot/Notion‑style user auth. |
| CSRF + session | Log in, extract a CSRF/session token, inject it on each call. |
Per‑user connected credentials: an OAuth2 (user‑login) provider can key its token bundle per end user instead of sharing one account. Each end user then links their own downstream account on the Connect screen (§10, "Connect your accounts"), and Forge injects their credential when acting on their behalf over MCP or the run API - no token is ever passed through.
6. Knowledge (RAG)
Knowledge → Files to add sources; Q&A for curated question/answer pairs.
- Add a source: Paste text, a URL, Crawl site (same‑domain pages), or Upload file (.txt/.md/.csv/.json/.html/.pdf). Organize with folders.
- Re‑ingest (↻) a source to re‑fetch/re‑crawl or re‑embed under your current model.
- Health banner: if you switch embedding models, Forge flags sources that need re‑embedding (otherwise they'd silently vanish from search) - click Re‑embed all.
- Use it: add a Retrieval node before an agent (it grounds on documents and/or Q&A pairs, each toggleable), or enable knowledge directly on an Agent node so it searches per sub‑question.
7. Triggers & Channels (deploying)
Channels put a workflow in front of real users:
- Email - create an Email channel, enter SMTP (host/port/user/from + a password secret) for replies. Your provider (Mailgun/SendGrid/Postmark) posts inbound mail to the channel's inbound URL.
- Live handoff - add a Human Handoff node; escalated chats appear in the Agent inbox, and your reply is delivered back over the same channel.
Triggers lists each workflow's event entry points (webhook URLs, schedules) after you publish a workflow containing a trigger node.
8. Evaluations
Evaluations → New dataset: pick a workflow, a scoring mode (contains / exact /
regex / LLM‑judge), and add {input, expected} rows. Run to get a pass rate - use it
to catch regressions before publishing a change. The run streams live: every case appears
immediately and resolves as it finishes (a progress bar, a running/pass/fail pill, and per‑case
latency + tokens), so a big dataset shows progress instead of blocking. Each case runs on behalf
of you (the launching editor), so per‑user tool auth resolves your connected credential.
9. Observability & Settings
- Traces - every run as a collapsible span tree (model calls, tools, chains, sub‑agents)
with tokens, latency, and cost, nested by real parent/child and labeled with your canvas node
names. A deep‑agent dispatch shows as a named
subagent · <name>span; collapse/expand all. - Playground streams a live Agent activity timeline while a run is in flight — which sub‑agent (prominent) or tool (dimmed) is running, ticking to done/error as each finishes — and attributes the run to you (the signed‑in operator), so per‑user tool auth resolves your credential.
- OpenTelemetry - point
FORGE_OTEL_EXPORTER_OTLP_ENDPOINTat a collector or Langfuse to export run traces (also configurable under Settings → Observability & Retention).
Settings is a section sidebar:
| Section | What's inside |
|---|---|
| General | Project name/description, default model, workspace ID. |
| Members & Roles | Invite members; set roles (owner/admin/editor/viewer/connector). |
| API Keys | Model providers (LLM keys) and Secrets (write‑only, encrypted, referenced as secret://proj/<name>), plus scoped, revocable platform API keys. |
| Model Pricing | Per‑model $/token rates that drive the cost meter. |
| Budgets & Quotas | USD / token caps and allowed‑model enforcement per project. |
| Guardrails & Egress | One I/O policy enforced on every agent (see below). |
| Knowledge & Embeddings | Embedding model, chunking defaults, and re‑embed health. |
| Versioning | Retention limit for entity version history (view/restore on each entity). |
| Observability & Retention | OpenTelemetry export + scheduled data‑retention purge. |
| Advanced | Feature flags and a Danger zone (delete project). |
| History | A read‑only log of settings changes. |
Every successful mutation is also recorded to an audit log (who changed what, plus auth events), retained per your settings and exportable via the API.
Guardrails & Egress
A single, admin‑gated policy that applies to every agent in the project by default - no per‑agent wiring:
- Content guardrails - redact PII (email / card / IP / MAC / URL), add custom
Label = regexpatterns (phone, national ID…), and block terms, each with a redact / mask / hash / block / flag strategy, scanning input and/or output. - Network egress - block private/loopback hosts and set allow/deny domain lists across every
REST/GraphQL tool, webhook,
web_fetch, and SQL host at once. A project can only tighten the server's egress policy, never loosen it.
10. Connect - MCP server, run API & embed
The Connect screen (Deploy → Connect) is where you expose this project to the outside world. It covers the run API, an integration reference, the MCP server, and the Embed widget.
Expose an MCP server
Publish your project's tools to any MCP client (Claude Desktop, Cursor, VS Code). The endpoint is a
single URL - …/v1/mcp/<project_id> - and the surface is exactly the enabled tools of the tool
sets you toggle "Expose" (plus, optionally, run_workflow, search_knowledge_base, and
lookup_faq). Native clients connect directly over Streamable‑HTTP/SSE - no mcp-remote
bridge needed.
Choose how clients authenticate:
- Project API key - one shared key sent as
Authorization: Bearer <key>. Server‑to‑server, no per‑user identity. Generate it on the screen. - Personal access token (PAT) - a per‑user token (
forge_pat_…) each teammate generates (and revokes) for themselves; the server then acts as that user (entitlements,{{ctx.*}}). - OAuth 2.1 (optional, off by default) - when enabled, a standard MCP client discovers Forge
and the user logs in, with no pre‑shared key. Turn on with
FORGE_MCP_OAUTH_ENABLED(review the security notes first).
Connect your accounts: if the project has per‑user auth providers (§5), each signed‑in user links their own downstream account here so Forge can act on their behalf.
Connector role: invite integration users as connector (Settings → Members & Roles) - the least‑privileged role. They can authenticate, self‑serve an MCP token, and call tools, but see no projects or settings.
Consume external MCP servers
Under Build → External MCP, register an outside server (e.g. a GitHub or Slack MCP server), then create an MCP tool (§4) that calls one of its tools.
Run API & embed
The same screen also shows the run API (call a workflow server‑to‑server), a copy‑paste integration reference, and the Embed snippet - a floating chat bubble you drop onto any website, locked to the origins you allow. End users see only the conversation; steps, tokens, cost, and node names stay private in the dashboard.
11. Import & export (portability)
Move your build between projects - or share it - as portable JSON bundles. On the Tools,
Workflows, Agents, and Components screens, use Export (pick items → download a
forge.bundle/1 file) and Import (upload a bundle into the current project).
- What travels: the entity's full configuration. Secret values never leave - only
secret://…references do, so after importing you recreate those secrets (and any missing auth provider) in the target project; the importer tells you which. - Never overwrites: every import creates fresh items with new IDs, and a name clash is
auto‑renamed (
…_imported). References within a bundle (a workflow's subworkflows, an agent's tools/components) are rewritten to the new IDs. - Lands as a draft: imported workflows arrive unpublished - review, then publish.
- Permissions: importing requires the editor role.
12. Sample use cases (end‑to‑end)
A. Grounded support chatbot on your website
- Knowledge → add your help docs (URL/crawl/upload) + a few Q&A pairs.
- Workflows →
start → Retrieval (include Q&A) → Agent → end. Agent prompt: “Answer only from the knowledge base; if it's not there, say you don't know and offer a human.” - Publish, test in the Playground.
- Deploy via Connect (MCP) (point an MCP client at it) or call the run API from your own site's chat UI. Result: visitors chat with an assistant grounded in your docs, through your own front‑end.
B. Email support agent with human handoff
- Build
email_in trigger → Retrieval → Agent → Human Handoff → end. - Channels → Email channel with your SMTP settings (+ password secret); wire your inbound‑mail provider to the channel's inbound URL.
- When the agent is unsure, the chat lands in the Agent inbox; a teammate replies and the answer is emailed back.
C. Scheduled daily digest
schedule trigger (cron 0 9 * * 1-5, message "Summarize overnight tickets") → Tool Call (your tickets API) → Agent (summarize) → Webhook Out (post to your channel).- Publish - the in‑process scheduler fires it each weekday at 9am.
D. Multi‑intent router
start → Classifier (labels: billing, technical, sales) → Router (one case each, Else = general) → a specialist Agent per intent → end.- For two‑part questions, set Classifier
multi_label+ Routermulti, and converge on a synthesizer agent beforeend.
E. Tool‑using agent (e.g. order lookup)
- Tools → REST tool
get_orderwith a response projection; attach an Auth Provider. - Agents → an agent with that tool. Workflows →
start → Agent → end. - Ask “where's order A‑1007?” - the agent calls the tool and answers from the projected result.
13. Going to production
Forge runs locally with zero external infra (SQLite + embedded Chroma + in‑process scheduler). For production, set these and restart (the app refuses to boot if they're wrong):
FORGE_ENVIRONMENT=productionFORGE_JWT_SECRET=<strong random>·FORGE_AUTH_REQUIRED=trueFORGE_BOOTSTRAP_ADMIN_PASSWORD=<your own>(not the dev default)FORGE_DATABASE_URL=postgresql+psycopg://…(Postgres), thenalembic upgrade head(and optionally applyinfra/postgres_rls.sqlfor row‑level tenant isolation)FORGE_PUBLIC_BASE_URL=https://forge.yourco.com(OAuth redirects + webhook/channel URLs)- Optional:
FORGE_REDIS_URL(multi‑worker),FORGE_OTEL_*(tracing),FORGE_EGRESS_ALLOW_HOSTS,FORGE_MCP_OAUTH_ENABLED=true(delegated OAuth 2.1 for MCP clients).
See .env.example for the full, annotated list.
14. Glossary
- RAG - Retrieval‑Augmented Generation: search your docs, feed the best chunks to the model.
- ReAct - the agent loop: reason → call a tool → observe → repeat → answer.
- Projection - trimming a tool's response (JMESPath) so fewer tokens reach the model.
- MCP - Model Context Protocol: a standard way for AI clients to call tools/servers.
- Trigger / Channel - what starts a workflow vs. where it's deployed.
- State / reducer - the run's data and how parallel writes to a key are merged.
- Idempotency key - a header so a retried request doesn't run twice.