All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
Evaluation harness (
backend/evals/): scores the agent on answer quality and human-in-the-loop behaviour. Deterministic evaluators —paused_for_approval(did it interrupt for approval before running its tool?),completed, andno_pii_leak— run offline with the mock model; an LLM-as-judgecorrectnessmetric runs with a real model. Prints a scored table locally or logs a tracked experiment to LangSmith (python -m evals.run_evals [--langsmith]). Docs indocs/EVALUATION.md. -
Deep Agent engine (
backend/deep_agent.py): a third selectable engine built ondeepagentsthat plans (awrite_todosto-do list), delegates toresearcher+criticsubagents via atasktool, and uses a virtual filesystem for scratch space — with the sameweb_searchhuman approval as the other engines. Added/deep/start+/deep/decideSSE endpoints and a third option in the UI's engine toggle (Workflow / Agent / Deep Agent). Thedeepagentsimport is optional: the app still boots (engine disabled) without it. Registered thedeep_agentgraph inlanggraph.json. -
Middleware power-pack (
backend/middleware_pack.py): the agent composes a curated set of prebuilt LangChain middleware alongside the custom guardrail and HITL middleware —SummarizationMiddleware(context-overflow protection on long threads),ModelCallLimitMiddleware/ToolCallLimitMiddleware(runaway & cost guards),ModelRetryMiddleware(transient-error backoff), and opt-inTodoListMiddleware(awrite_todosplanning tool) /ModelFallbackMiddleware. All env-configurable with defaults that never trigger in a short chat. -
Resilient workflow (LangGraph 1.2): LLM-backed graph nodes now carry a
retry_policy, an optional per-nodetimeout, anderror_handlercompensation — if analysis or final generation fails, the run degrades to a graceful fallback (Saga pattern) instead of erroring. Configurable viaRETRY_MAX_ATTEMPTS/NODE_TIMEOUT_SECONDS. -
/capabilitiesnow reports the activemiddlewarestack andresiliencesettings, shown as new badges in the header status strip. -
Feature status in the UI: a new
/capabilitiesendpoint reports which optional features are active, and the chat header shows a status strip (model, guardrails, semantic memory, structured output, and an MCP tools count/line). The agent stream also surfaces live guardrail signals (a "redacted N PII item(s)" / "blocked" chip) and a structured summary card. -
Guardrail middleware (
backend/guardrails.py): a customAgentMiddlewarethat redacts PII (emails, phone numbers, card/SSN-like numbers) before the model sees it viawrap_model_call, and can refuse blocklisted input without calling the model. Stacks withHumanInTheLoopMiddlewarein the agent engine — a demonstration of composable middleware. Configurable viaGUARDRAILS_*env vars; on by default with no extra dependencies. -
MCP tool integration (
backend/mcp_tools.py): optionally load tools from any Model Context Protocol server vialangchain-mcp-adaptersand expose them to the agent, gated by the same human approval asweb_search. Configure withMCP_SERVERS(inline JSON or a file path); a no-op when unset. -
Structured output (opt-in): with
AGENT_STRUCTURED_OUTPUT=true, the agent returns a validatedResearchSummary(summary,key_findings,sources,confidence) instate["structured_response"], surfaced on the agent SSE stream. -
Semantic long-term memory:
memory.build_store()builds an embeddings- indexedStorewhenEMBEDDINGS_MODELis set, sorecall_memoryreturns the memories most relevant to the current question (with graceful fallback to recency-based recall offline). -
Deployment guide (
docs/DEPLOYMENT.md) covering Docker Compose, LangGraph Platform, and self-hosting with a durable checkpointer + Postgres store. -
Second backend engine: an agentic research assistant (
backend/agent.py) built withcreate_agent+HumanInTheLoopMiddleware, selectable via a live Workflow ↔ Agent toggle in the UI. The model drives the loop and pauses for approve / edit / reject / respond before running a tool. Shares the same provider-agnostic LLM,web_searchtool, andStorememory. New/agent/startand/agent/decideSSE endpoints. -
The offline mock model now drives a tool-calling loop, so the agent engine — including human-in-the-loop tool approval — works with zero configuration.
-
Parallel research with the
SendAPI (map-reduce): a planner decomposes the question and fans out concurrent sub-researchers viaCommand(goto=[Send(...)]), aggregated through a reset-aware reducer. Live progress streams to the UI viaget_stream_writer/stream_mode="custom". -
Cross-thread long-term memory (
backend/memory.py) backed by a LangGraphStore: the assistant remembers a user's topics/preferences across sessions (newuser_idfield on/startand/continue). -
Time travel —
/history/{thread_id}lists checkpoints and/forkrewinds to a past interrupt and resumes down a different path, preserving the original run. A "History / Rewind" panel in the UI drives it. -
Unified streaming resume:
/streamnow emits progress, tokens, and a closing state event for every step (one SSE path in the frontend). -
Approve / edit / reject workflow (
backend/approval_workflow.py): the AI drafts content, a human approves it, edits it, or rejects with feedback to trigger a redraft (capped byMAX_REVISIONS). New/approval/startand/approval/decideendpoints and tests. -
Approval UI at
/approval(frontend/app/approval/page.tsx) with inline Approve / Edit / Reject actions, plus a header link from the research assistant. -
GitHub Codespaces / dev container (
.devcontainer/devcontainer.json) and an "Open in Codespaces" badge — one-click, fully provisioned environment. -
Registered the
approvalgraph inlanggraph.jsonfor LangGraph Studio.
Major modernization to the LangGraph v1 / LangChain v1 agent stack.
- Provider-agnostic LLM layer (
backend/llm.py) via LangChaininit_chat_model— OpenAI, Anthropic, Google, Groq, Mistral, IBM watsonx, Ollama, and more. - Zero-config offline mode: a streaming-capable
MockChatModelruns the full app (including SSE streaming) with no API keys. - Modern agent example (
backend/agent.py) usingcreate_agent+HumanInTheLoopMiddleware(replaces deprecatedcreate_react_agent). - Durable execution: optional
AsyncSqliteSavercheckpointer viaCHECKPOINT_DB, wired through a FastAPI lifespan. - Example
web_searchtool (backend/tools.py) with Tavily support and an offline fallback. - LangGraph Studio support via
langgraph.json(research+agentgraphs). - GitHub Actions CI for backend (pytest, Python 3.11/3.12) and frontend build.
/healthendpoint and configurableCORS_ORIGINS,PORT,LOG_LEVEL.- Configurable frontend API base URL via
NEXT_PUBLIC_API_URL.
- Upgraded LangGraph 0.2 → 1.2, LangChain 0.2 → 1.x, FastAPI, Pydantic, uvicorn.
- Upgraded frontend to Next.js 15 + React 19.
graph.pyrefactored to abuild_research_graph(checkpointer)factory and async state APIs; replacedprintdebugging with structured logging.- Docker split into separate backend and frontend images;
docker-composenow runs both services with a durable checkpoint volume. - Rewrote README and
.env.examplearound the provider-agnostic, zero-config workflow.
- Dead/duplicate frontend files (
page_backup.tsx,page_fixed.tsx). - Hardcoded IBM-Watson-only configuration as the sole option.
- Removed a hardcoded LangSmith API key that was committed in
backend/main.py. Configure all secrets via environment variables. (Rotate any previously exposed key.)
- Complete LangGraph interrupt workflow template
- Production-ready starter kit for human-in-the-loop AI applications
- Real-time web interface for interrupt handling
- State preservation across interrupts
- Resume functionality with user choices
- FastAPI backend with RESTful endpoints
- Next.js frontend with TypeScript
- Responsive design with Tailwind CSS
- Progress bar with step visualization
- Example workflow: Research assistant with multiple interrupt patterns
- Markdown rendering for rich responses
- Error handling and debugging support
- Template infrastructure: Docker, testing, CI/CD ready
- Comprehensive README and documentation
- MIT License and contribution guidelines
- Security policy and issue templates
- Modular interrupt system - Easy to extend for different use cases
- LLM provider abstraction - Simple to swap between providers
- UI component library - Reusable interrupt interface components
- State management patterns - Robust conversation and workflow state handling
- Development workflow - Testing, linting, and deployment configurations
- LangGraph integration with
interrupt()function - IBM Watson ChatWatsonx LLM support
- Memory-based state persistence
- Thread-based conversation management
- ReactMarkdown for rich text rendering
- Modern UI with animations and glassmorphism effects
Use this template for future releases:
## [X.Y.Z] - YYYY-MM-DD
### Added
- New features
### Changed
- Changes in existing functionality
### Deprecated
- Soon-to-be removed features
### Removed
- Removed features
### Fixed
- Bug fixes
### Security
- Security improvements