API Summit 2026 · Pathology Informatics

Agentic AI for Integrated Pathology Reporting

A 45-minute hands-on workshop. You'll run three LangFlow workflows that progressively show what an agentic workflow does that a chatbot can't. Everything you need — login info, PDFs, user prompts, and system prompts — is in this one page.

VM: pi-2026-workshop.javadilab.org Length: 45 min Flows: Chatbot → Agentic → Build-your-own

How to read this handbook

Three types of paste-able blocks appear throughout the handbook, each with a distinct color so you can scan and know what kind of thing you're looking at without reading every line. Most long blocks are collapsed by default — click the row to expand. Each block also has a Copy button (top right) that puts its contents on your clipboard.

Amber — system prompt

Instructions to the LLM that already live inside a node's System Prompt field. You'd open the textarea in the node's right-side panel and replace it (or edit it) to change the model's behaviour.

Blue — user prompt

What you type into Playground. The chat directive that runs the flow. Just copy-paste the contents into the chat input and press send.

Violet — code / alternative

Python or alternative prompt content you'd paste into a node's Code tab or System Prompt field to replace the default. Useful for experiments — paste, re-run, see what changes.

▸ Collapsible row

Anything longer than ten lines is closed by default to keep the handbook scannable. Click the row to expand, read or copy the content, click again to collapse.

Quick start

1. Log in

Open https://pi-2026-workshop.javadilab.org in any browser. Your facilitator will hand out usernames in the form pi-user-NNN and a shared password.

2. Open a flow

After login you'll see "Starter Project." Six flows are pre-loaded for you:

Click any name to open the flow's canvas.

3. Use Playground

Click the Playground button at the top-right of the canvas. A chat panel opens. Type your prompt in the input, press send, watch the flow run. Edits to any node's right-side detail panel apply on the next run — no save button needed.

Part 1 · ~7 minutes

General Chatbot

The workshop's warm-up baseline. Three nodes: Chat Input → General Chatbot → Chat Output. A single LLM call with file attachments. This is the before we compare Part 2 against.

The four AML PDFs

Download these to your machine. You'll attach them via the paperclip in Playground.

#FileModalityWhat it carries
101_bone_marrow_morphology.pdfBone marrow morphologyManual blast count, cytochemistry, hedges on lineage
202_flow_cytometry.pdfFlow cytometryGated blast %, immunophenotype, resolves the morphology hedge
303_cytogenetics_fish.pdfCytogenetics + FISHKaryotype, AML panel — normal here
404_molecular_ngs.pdfMolecular NGS (54-gene)NPM1, FLT3-ITD, DNMT3A, other variants

One fictional patient: adult male, 58y · leukocytosis, anemia, thrombocytopenia · 41% peripheral blasts.

The prompt to type

After attaching all four PDFs, paste this into the chat input.

User promptProduce an integrated diagnostic report for this patient using all four reports. Include patient identifiers, per-modality summaries, an integrated interpretation, the final diagnosis, and prognostic notes.

This is the same task Part 2 (Scenario D) tackles. Identical input, identical ask, very different output.

How to run, what to notice

  1. Open chatbot from "Starter Project."
  2. Click Playground.
  3. Click the paperclip icon and attach all four PDFs.
  4. Paste the prompt above. Press send.
  5. Wait 10–30 seconds.

Four things to notice in the reply. These are the gaps the agentic workflow will close.

Write down what you see. We revisit these answers in the side-by-side at the end of the workshop.

Variants if you finish early

Tighter format

User prompt — tighter formatProduce an integrated diagnostic report for this patient using all four PDFs. Reply in five sections with these exact headings: 1. Patient and specimen 2. Per-modality summary (one paragraph per PDF) 3. Discordances and resolutions 4. Final integrated diagnosis (one sentence, in WHO 5e language) 5. Prognostic notes

Ask for an evidence trace

User prompt — evidence traceProduce an integrated diagnostic report for this patient using all four PDFs. For EVERY sentence in your final diagnosis and interpretation, name which attached filename supports it. If a sentence has no support, mark it UNSUPPORTED.

Lane discipline stress test

User prompt — lane disciplineProduce an integrated diagnostic report. Be especially careful about DNMT3A — explain exactly which section mentions it and why.

Single-source classifying

User prompt — single-sourceLooking only at the four attached PDFs, identify any classifying finding that appears in just ONE of them, and explain how the diagnosis would be wrong without that PDF.

Expected answer for the last one: NPM1 + FLT3-ITD live only in 04_molecular_ngs.pdf. Sometimes the chatbot catches this, sometimes it doesn't.

Behind the scenes The chatbot's own system prompt is intentionally generic — six sentences telling the model to "read attached files carefully and don't invent facts." That's all the structure it has, by design. The component source is at langflow_flows/components/api_scenario_zero/general_chatbot.py in the repo.
Part 2 · ~25 minutes

Agentic workflow — Pathology Report Integration

The workshop's headline case study. Nine custom components plus a stock Text Input holding WHO 5e classification rules. Reads the same four AML PDFs as Part 1 but emits a structured 11-section integrated report, a per-sentence evidence trace, and a QA-flag section. Case design and the original Stage 1 / Stage 2 prompts: Omar Baba, MD (see Authors at the bottom of this page).

The pipeline

[ChatInput] → [PipelineConfig] → [PDF Intake] ──┬─► [Morphology Parser]   ─┐
                                  (5 outputs)    ├─► [Flow Parser]          ─┤
                                                 ├─► [Cytogenetics Parser]  ─┼─► [WHO Classifier] → [QA Reviewer] → [Report Formatter] → [ChatOutput]
                                                 ├─► [Molecular Parser]     ─┤
                                                 └─► (cross-report Data)    ─┤
                                                                              │
                                                 [WHO Instructions] ────────┘
                                                 (Text Input, prefilled)

PDF Intake (Stage 1) runs five LLM calls: four per-source extractions (one per modality — morphology, flow, cytogenetics, molecular) plus one cross-report analysis that compares the four extractions for concordances, discordances, and single-source findings. Five outputs feed four dedicated parser nodes plus one direct line to the WHO Classifier.

WHO Classifier (Stage 2) takes six inputs: the four modality syntheses, the cross-report data, and the WHO 5e Instructions text. It produces the 11-section report plus the Part B evidence trace.

There are three editable system prompts across the pipeline (per-source extraction, cross-report analysis, WHO Classifier integration), plus the WHO Instructions text attendees can edit directly in the canvas without modifying any prompt.

Directives to type

You don't upload PDFs here. The four AML files are pre-registered in the case manifest — typing a directive loads them automatically.

Start here

Directive — start hererun the aml case

This is the workshop's standard exercise. Loads the four AML PDFs, runs both LLM stages, emits the full integrated report + Part B trace + QA flags in markdown.

Output format variations

Directive — HTML outputrun the aml case as html
Directive — JSON outputrun the aml case as json
Directive — narrativerun the aml case as narrative
Directive — hide QArun the aml case, hide the qa flags

HTML renders styled output. JSON returns only the machine-readable form — what a downstream LIS would parse. Narrative collapses 11 sections into one short paragraph. Hide the qa flags suppresses the QA section in the rendered output (the QA Reviewer still runs).

Other cases the same workflow handles

Directive — glioma caserun the glioma case
Directive — medulloblastoma caserun the medulloblastoma case
Directive — breast caserun the breast case

The pipeline isn't AML-specific. Same nine components, different PDFs. The AML case is the one with all four planted pedagogical features, so focus on it during the workshop. Save the others for after.

What good AML output looks like

A passing run satisfies all of these:

If something's missing, that's a learning opportunity — keep reading.

Edit a prompt and re-run

This is the workshop's "your turn" moment for Part 2. Each LLM stage carries an editable system prompt. Edit one, re-run, watch the output change.

The cleanest one-line exercise:

  1. Run the baseline once with run the aml case. Note which sentence in section 8 talks about the blast count.
  2. Click the WHO Classifier (Integrator) node on the canvas. Open the System Prompt field on the right.
  3. Add this sentence somewhere in the rules section:
    Suggested edit — reconcile blast counts in section 8Always begin section 8 with a one-sentence reconciliation of the morphologic blast count vs the flow blast count, naming both numbers explicitly.
  4. Re-run with run the aml case. Section 8 should now lead with the numeric comparison; the Part B trace updates to match.

That single edit ripples through the whole pipeline. No saving, no rebuild — changes apply on the next run.

Stage 1 — PDF Intake has TWO editable prompts

The PDF Intake node fires five LLM calls internally: four per-source extractions plus one cross-report analysis. Each kind of call has its own editable prompt in the right-side detail panel.

System prompts How the two PDF Intake prompts work + how to edit them (click to expand)

Per-Source Extraction Prompt — applies to all four per-source LLM calls. Tells the model how to read ONE component report (morphology, flow, cytogenetics, or molecular) and emit a structured JSON of that source's findings. The model adapts based on the source_id header in each call. Rules cover: extract-not-interpret, verbatim_support on every finding, classifying=true/false on every variant.

Cross-Report Analysis Prompt — runs after the four per-source extractions finish. Reads the four per-source JSONs and emits concordances, discordances (with resolution + basis), and single-source findings.

Full text of both prompts lives in langflow_flows/components/api_scenario_d/d2_pdf_intake.py (see DEFAULT_PER_SOURCE_PROMPT and DEFAULT_CROSS_REPORT_PROMPT) and is visible in the PDF Intake node's right-side panel.

To edit: click the PDF Intake node → right-side panel → either System Prompt textarea → paste your edited version → run. Edits to the per-source prompt change what gets extracted from every PDF; edits to the cross-report prompt change how concordances, discordances, and single-source findings are derived.

Stage 2 — WHO Classifier system prompt

The WHO Classifier takes six inputs (four parser outputs + cross-report data + WHO Instructions text) and emits the integrated report + Part B evidence trace. To edit: click the WHO Classifier (Integrator) node → System Prompt textarea.

System prompt The seven rules the WHO Classifier prompt enforces (click to expand)

Full text lives in langflow_flows/components/api_scenario_d/d2_who_classifier.py (see DEFAULT_SYSTEM_PROMPT). Paraphrased:

  1. Use only what you were given. Every clinical claim in interpretation/diagnosis must trace to a parser input, the cross-report data, or a classification rule from the WHO Instructions block.
  2. Resolve discordances out loud. Each discordance is named, with both numbers + the resolution + why it holds.
  3. Name single-source findings. Findings the cross-report marks as single-source are flagged plainly in the interpretation.
  4. Lane discipline. A variant in prognostic_variants belongs in molecular summary + prognostic notes, NEVER in the final diagnosis line.
  5. Diagnosis in classification terms. Apply the WHO Instructions block to translate combined findings into formal WHO/ICC language.
  6. Carry limitations forward. Stated limitations from any modality go in limitations_pending.
  7. Evidence trace integrity. Every sentence in interpretation + diagnosis has a trace row; any UNSUPPORTED row is a pipeline failure caught by the QA Reviewer.

Note that the WHO 5e classification rules themselves are NOT in this prompt — they're in the separate WHO Instructions Text Input node. Edit those rules directly in that node without touching this prompt.

When the output looks wrong

SymptomFirst place to look
UNSUPPORTED rows in Part BStage 2 wrote a sentence Stage 1's extraction didn't support. Tighten Rule 1 in the WHO Classifier prompt, or click the PDF Intake node after a run to inspect its output JSON for missing findings.
DNMT3A in the diagnosis lineLane discipline slipped. Tighten Rule 4 in the WHO Classifier prompt.
Blast discordance not addressedStage 2 silently picked a number. Tighten Rule 2 in the WHO Classifier prompt.
Sections 1–7 look thinStage 1 didn't extract enough. Click the PDF Intake node after a run — its output is JSON you can read directly.
Click any node after a run Every node's intermediate output is browsable from the right-side panel. This is the closest thing the workshop has to a debugger — see what each component produced before the next one consumed it.
Part 3 · ~10 minutes

Build the agentic workflow yourself

You've just run pathology_report_integration end-to-end in Part 2. Now build the same flow from a blank canvas, six steps. The nine custom components are already in your sidebar; the WHO Instructions text is a stock Text Input. About ten minutes of drag-and-wire — no Python required.

Stuck? Open the completed pathology_report_integration from "Starter Project" side-by-side and compare your wiring.

[Chat Input] → [Pipeline Config] → [PDF Intake] ──┬─► [Morphology Parser]   ─┐
                                    (5 outputs)    ├─► [Flow Parser]          ─┤
                                                   ├─► [Cytogenetics Parser]  ─┼─► [WHO Classifier] → [QA Reviewer] → [Report Formatter] → [Chat Output]
                                                   ├─► [Molecular Parser]     ─┤
                                                   └─► (cross-report data)    ─┤
                                                                                │
                                                   [WHO Instructions] ────────┘
                                                   (Text Input)

Build it from scratch — six steps

Each step adds one or two components, wires them, and ends with a small diagram showing what your canvas looks like so far. Drag-then-wire-then-drag, not all-drag-then-all-wire.

Step 1 — Start a blank flow and add the inputs

From the dashboard ("Starter Project"), click + New flow and pick the blank template.

Drag: from Input / Output, drag in Chat Input. From api_scenario_d on the left sidebar, drag in Pipeline Config.

Wire: Chat Input's message output → Pipeline Config's user_message input.

Chat Input Pipeline Config

Step 2 — Add PDF Intake (Stage 1)

Drag: from api_scenario_d, drag in PDF Intake to the right of Pipeline Config.

Wire: Pipeline Config's run_config output → PDF Intake's run_config input.

Click the PDF Intake node — you'll see five output handles on its right edge: morphology_data, flow_data, cytogenetics_data, molecular_data, and cross_report_data. We wire them in the next step.

Chat Input Pipeline Config PDF Intake

Step 3 — Add the four parallel parsers (the fan-out)

Drag: from api_scenario_d, drag in four parsers — Morphology Parser, Flow Parser, Cytogenetics Parser, and Molecular Parser. Stack them vertically to the right of PDF Intake.

Wire four edges: PDF Intake's morphology_data → Morphology Parser's morphology_data input. Then flow_data → Flow Parser, cytogenetics_data → Cytogenetics Parser, molecular_data → Molecular Parser.

This is the most visually striking part of the canvas: four wires emerging from a single PDF Intake node, each going to a dedicated parser. LangFlow only allows compatible types to connect, so any wrong wiring is visually rejected.

PDF Intake Morphology Parser Flow Parser Cytogenetics Parser Molecular Parser

Step 4 — Add WHO Classifier (the fan-in)

Drag: from api_scenario_d, drag in WHO Classifier (Integrator) to the right of the four parsers.

Wire five edges: each of the four parsers' outputs into its matching input on WHO Classifier (morphology_synthesis, flow_synthesis, cytogenetics_synthesis, molecular), plus PDF Intake's cross_report_data output → WHO Classifier's cross_report input.

PDF Intake cross-report direct to WHO Classifier Morphology Parser Flow Parser Cytogenetics Parser Molecular Parser WHO Classifier

Step 5 — Add the WHO Instructions Text Input

Drag: from Input / Output, drag in a Text Input. Place it below the parsers.

Paste: open the Text Input node's right-side panel, find its Text field, and paste the WHO Instructions content from the collapsible block in the next subsection.

Wire: Text Input's text output → WHO Classifier's who_instructions input.

The Text Input is a separate node — not a system-prompt field on another node. Its content is the third editable knob in the pipeline (alongside PDF Intake's two prompts and WHO Classifier's system prompt).

PDF Intake Morphology Parser Flow Parser Cytogenetics Parser Molecular Parser WHO Classifier Text Input (WHO Instructions)

Step 6 — Add the tail and run

Drag: from api_scenario_d, drag in QA Reviewer and Report Formatter. From Input / Output, drag in Chat Output.

Wire three edges: WHO Classifier's integrated output → QA Reviewer's integrated input. QA Reviewer's reviewed output → Report Formatter's reviewed input. Report Formatter's report output → Chat Output's input_value input.

Run: click Playground. Type run the aml case. Press send. Wait 60–90 seconds.

Stage 1 (PDF Intake) runs 5 LLM calls. The three LLM-backed parsers run a fourth, fifth, and sixth. The WHO Classifier runs a seventh. The QA Reviewer's deterministic checks run last. The full integrated report + Part B evidence trace + QA flags arrives in the chat panel.

WHO Classifier QA Reviewer Report Formatter Chat Output After Step 6 your canvas has 12 nodes total: 9 custom + Chat Input + Chat Output + Text Input.

WHO Instructions — the text to paste in Step 5

This is the AML excerpt of WHO 5e classification rules. Copy-paste into the Text Input node's Text field. The full version with glioma / medulloblastoma / breast covered too is at docs/who5e_instructions.md in the workshop repo.

Paste content WHO Instructions — AML excerpt (~35 lines) (click to expand and copy)
WHO Instructions — AML excerpt (workshop-friendly)WHO 5e Myeloid neoplasms (2022) — AML classification rules: Two parallel paths to a defined entity. A case is classified by EITHER a defining genetic abnormality OR — if no defining abnormality is present — by differentiation per the AML-NOS scheme. AML with defining genetic abnormalities (entity is named by the genetic finding REGARDLESS of blast count for most): - APL with PML::RARA - AML with NPM1 mutation - AML with CEBPA mutation - AML with RUNX1::RUNX1T1 - AML with CBFB::MYH11 - AML with KMT2A rearrangement - AML with MECOM rearrangement - AML with NUP98 rearrangement - AML with mutated TP53 (>=20% blasts required) - AML, myelodysplasia-related (MDS-related cytogenetics or somatic mutations + >=20% blasts) AML defined by differentiation (AML-NOS): requires >=20% blasts. Named by lineage/maturation pattern. Lane discipline (NOT classifying for AML): - FLT3-ITD — prognostic (adverse risk; therapeutic target) - DNMT3A — prognostic (especially with NPM1 + FLT3-ITD) - TET2, ASXL1, IDH1/2 — prognostic - NRAS / KRAS / PTPN11 — secondary Required inputs for any AML case: - Specimen + morphology assessment (manual blast count) - Flow cytometric blast % and lineage assignment - Cytogenetics result (karyotype + FISH probes) - Molecular result (which genes were tested + findings) Final diagnosis format (when a defining genetic abnormality is present): "Acute myeloid leukemia with [genetic abnormality] [optional differentiation phrase]." Place prognostic variants in the prognostic notes section, NEVER in the diagnosis line.

Test it

Directive — start hererun the aml case

Wait ~60–90 seconds. The full integrated report + Part B trace + QA flags arrive in the chat panel.

Edits worth trying once it runs

Each edit changes one editable text block, then you re-run run the aml case and watch what shifts in the output. Edits don't modify Python — they live in the System Prompt or Text Input fields you can see in each node's right-side panel.

Add a new tumor family to WHO Instructions

Open the Text Input node. Add a new section for a tumor family not currently covered (e.g., lymphoma or sarcoma). The integrator will use whatever rules are in the Text Input. (Loading PDFs from a new family also needs an entry in tools/scenario_d/pdf_io.py's case manifest, but the classifier prompt change itself is just editing the Text Input.)

Tighten lane discipline

In the WHO Classifier's system prompt, find Rule 4 (lane discipline). Add the sentence below. Re-run and see if non-classifying variants now stay out of the per-modality summaries too, not just the diagnosis line.

Suggested edit — tighten lane disciplinePlace EVERY non-classifying variant in prognostic notes. Do not include them in any morphology, flow, or cytogenetics summary.

Change a per-source extraction prompt

Click PDF Intake → Per-Source Extraction Prompt. Add the sentence below. Re-run and watch the Molecular Parser's downstream output carry VAF numbers consistently across all variants.

Suggested edit — surface VAFFor molecular sources, always include variant allele frequency (VAF) when reported, as a numeric field named "vaf" alongside each variant.

Alternative code to try

Each block below is a paste-able alternative that replaces a specific prompt or Python file. Try one at a time, re-run, and see what changes. None of these are required — they're invitations to experiment.

Alt A · System prompt Cytogenetics Parser — refuse to interpret, ISCN only (click to expand)

Replace the default Cytogenetics Parser system prompt with the block below. The parser will quote karyotypes verbatim and stop hedging or summarizing in clinical language.

Paste into: Cytogenetics Parser → System Prompt textarea.

What changes: when you re-run the AML case, the cytogenetics_summary in section 6 of the integrated report becomes terser and more nomenclature-faithful (e.g., it'll say "46,XY[20]" verbatim instead of "normal male karyotype with 20 metaphases analyzed").

Alt A — paste into Cytogenetics Parser System PromptYou are a cytogenetics quoter, not a synthesizer. You receive a structured extraction of one cytogenetics / FISH / methylation report. Emit ONE short paragraph (2-3 sentences) that: 1. Quotes the karyotype VERBATIM in ISCN nomenclature. 2. Lists each FISH probe tested + its result, as written. 3. States plainly if no classifying chromosomal abnormality is present. Do NOT translate ISCN into prose. Do NOT add clinical interpretation. If the source text uses a particular nomenclature, preserve it.
Alt B · System prompt Morphology Parser — 2-sentence summary instead of 4–7 (click to expand)

The default Morphology Parser writes a 4–7 sentence paragraph. This variant collapses it to two sentences.

Paste into: Morphology Parser → System Prompt textarea.

What changes: section 4 (Morphology summary) of the integrated report becomes a tight two-sentence summary. The lane-discipline and Part B evidence trace are unaffected — they live in the WHO Classifier, not here.

Alt B — paste into Morphology Parser System PromptYou are a morphology summarizer. You receive ONE morphology / surgical-pathology component. Emit EXACTLY two sentences: Sentence 1 — the specimen + headline morphologic finding (one number if cited). Sentence 2 — the most diagnosis-relevant IHC or immunophenotype observation. No hedging, no enumerations, no preamble. If the report itself hedges on lineage, end with "(lineage hedge per source)".
Alt C · System prompt PDF Intake — add a third "VUS" bucket to molecular classification (click to expand)

The default per-source extraction marks each molecular variant as classifying=true|false — binary. This alternative adds a third state: classifying="vus" for variants of uncertain significance the WHO doesn't yet classify either way.

Paste into: PDF Intake → Per-Source Extraction Prompt textarea (this is the variant of Rule 4 only; the rest of the default prompt stays).

What changes: the Molecular Parser will now create a third array vus_variants alongside classifying_variants and prognostic_variants. The WHO Classifier ignores VUS by default — but you can tell it to add a "VUS observed" sentence to the prognostic notes by editing Rule 4 of the WHO Classifier prompt accordingly.

Caveat: the Molecular Parser's Python (which does the split) only knows about true|false today. To actually surface the VUS bucket downstream, you'd also need to edit d2_molecular_parser.py — see Alt D below.

Alt C — replace Rule 4 in the Per-Source Extraction Prompt4. THE classifying FIELD ON VARIANTS (molecular sources). Set classifying to one of three string values: - "true" — disease-defining for the WHO/ICC entity (e.g. NPM1 in AML, IDH1/2 in glioma) - "false" — prognostic / risk-stratifying but NOT entity-defining (DNMT3A, FLT3-ITD, TET2) - "vus" — variant of uncertain significance: reported, real, but the literature does not yet support classifying-vs-prognostic placement Always set prognostic_note when classifying is "false" or "vus".
Alt D · Python code Molecular Parser — handle the new "vus" bucket from Alt C (click to expand)

If you applied Alt C above, the Molecular Parser's existing Python only recognizes true|false and lumps any "vus" variant into the prognostic bucket. This alternative changes the parser to surface a third vus_variants array.

Paste into: Molecular Parser → Code tab (advanced). The Code tab shows the underlying Python; replace the body of run_split with the snippet below.

What changes: the Molecular Parser's output Data now carries a vus_variants field. The WHO Classifier doesn't read it yet — you'd need to extend the Classifier prompt and inputs to do something with it.

Alt D — replace the body of Molecular Parser's run_split()def run_split(self) -> Data: d = self.molecular_data.data if self.molecular_data else {} extracted = d.get("extracted", {}) or {} variants = extracted.get("molecular_variants", []) or [] classifying: list[dict] = [] prognostic: list[dict] = [] vus: list[dict] = [] for v in variants: if not isinstance(v, dict): continue flag = str(v.get("classifying", "")).lower() if flag in ("true", "1", "yes"): classifying.append(v) elif flag == "vus": vus.append(v) else: prognostic.append(v) return Data(data={ "case_id": d.get("case_id", ""), "tumor_family": d.get("tumor_family", ""), "extracted": extracted, "source_id": extracted.get("source_id", ""), "display_name": extracted.get("display_name", ""), "summary": extracted.get("summary", ""), "key_findings": extracted.get("key_findings", []), "classifying_variants": classifying, "prognostic_variants": prognostic, "vus_variants": vus, "n_variants_total": len(variants), "run_config": d.get("run_config", {}), })

Bonus reference — Scenarios A, B, C

These three scenarios are in your account as bonus material. They're not part of the live talk but the patterns are worth seeing if you want to explore after the workshop.

ScenarioWhat it doesThe pattern it shows
A — Variant TournamentRanks germline variants against rubric criteria using an LLM "tournament judge."LLM-as-judge with a structured rubric; parallel evidence fetches (ClinVar, gnomAD, PubMed).
B — Longitudinal GhostFinds contradictions in a 14-note patient timeline. The "ghost": a 2022 note documenting tamoxifen use that the current request contradicts.Temporal synthesis + rule-based contradiction detection. Includes an HITL gate.
C — Digital ThreadRoutes 30 pending cases to 8 subspecialty pathologists. The "trap": two pathologists are over-loaded by design.LLM-decides-then-deterministic-rule-clamps. Workshop-relevant fatigue-cap edit.

Open any of them from "Starter Project" and click Playground. Each scenario's prompts and editable levers are documented in the repo at langflow_flows/components/api_scenario_{a,b,c}/.

Troubleshooting

SymptomLikely cause / fix
"No model selected"Click the Agent node → Language Model dropdown → pick OpenAI + openai/gpt-4.1-mini.
Node turns red with a "!" badgeClick the badge for the error. Most common is a rate-limit timeout — wait 60 seconds and retry. The proxy caps each attendee at 30K tokens/min.
"401 Unauthorized" or auth errorCheck the Agent's API Key field is blank. Pasting a key overrides the KeyBroker auth.
Connection dropped from a tool to the AgentCheck Tool Mode is ON on the tool node. The toggle is in the node header. Without it the tool exposes JSON, not the Tool handle.
Flow runs but the output looks empty / truncatedClick each node after the run and inspect its output panel. You'll find which stage produced nothing — usually that's where to investigate.
Edited a prompt and the result got worseClick the node's Reset button (top of its detail panel) to restore the default prompt.
Last resortWave at the facilitator. They have a reset-attendee script that rebuilds your flows from scratch in ~10 seconds.

Authors + repo

Workshop infrastructure: LangFlow 1.9.2 · OpenRouter via in-house KeyBroker proxy · Phoenix (currently disabled) · pre-provisioned attendee accounts on pi-2026-workshop.javadilab.org.

Repository: github.com/hesamhakim/agentic-pathology-workshop