Skip to content

Add pipeline flow builder UI for guardrail policies#21188

Merged
ishaan-jaff merged 40 commits intomainfrom
litellm_guardrail_pipelines_ui
Feb 14, 2026
Merged

Add pipeline flow builder UI for guardrail policies#21188
ishaan-jaff merged 40 commits intomainfrom
litellm_guardrail_pipelines_ui

Conversation

@ishaan-jaff
Copy link
Member

Summary

  • Add pipeline column to LiteLLM_PolicyTable Prisma schema for storing guardrail pipeline data
  • Add pipeline field to policy CRUD request/response types (create, update, DB response)
  • Wire pipeline through all policy registry DB methods (add, update, get, list, sync, resolve) with PrismaJson wrapping
  • Add Zapier-style visual flow builder UI component (pipeline_flow_builder.tsx) with trigger card, step cards, connector lines, and insert buttons
  • Integrate flow builder into policy form with Simple Mode / Flow Builder mode toggle
  • Add pipeline display section in policy info view
  • Add POST /policies/test-pipeline endpoint for testing pipelines with sample messages
  • Add test panel in flow builder UI with step-by-step results display
  • Fix pipeline executor to inject guardrail name into metadata so guardrails actually execute
Xnapper-2026-02-13-19 48 42

Test plan

  • Unit tests pass (test_resolver_types.py - 6 tests)
  • E2E: test-pipeline endpoint verified with OAI-moderation (block on profane, allow on clean)
  • E2E: chat completions with pipeline policy blocks profane content through pipeline
  • Manual UI: toggle to flow builder mode, add steps, save, verify in policy info view

PipelineStep, GuardrailPipeline, PipelineStepResult, PipelineExecutionResult
with validation for actions (allow/block/next/modify_response) and modes.
@vercel
Copy link

vercel bot commented Feb 14, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
litellm Error Error Feb 14, 2026 4:07am

Request Review

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Feb 14, 2026

Greptile Overview

Greptile Summary

This PR adds a pipeline execution system for guardrail policies, allowing ordered, conditional guardrail execution (as opposed to running all guardrails independently). It includes a new PipelineExecutor, Prisma schema changes, type definitions, policy CRUD wiring, a test endpoint, and a full visual flow builder UI.

  • Critical bug in pipeline_executor.py: _run_step mutates data["metadata"]["guardrails"] on a shallow-copied dict, corrupting the caller's metadata. After pipeline execution completes, the normal guardrail callback loop in pre_call_hook will see a corrupted guardrails list (containing only the last pipeline step's guardrail name), potentially causing guardrails to not run or run incorrectly.
  • Pipeline-managed guardrails are correctly excluded from independent execution via _pipeline_managed_guardrails set tracking in both litellm_pre_call_utils.py and utils.py.
  • Backend type system is well-structured with strict Pydantic validation (forbidden extras, action/mode validators).
  • Test coverage is solid with mock-only tests covering escalation, early-allow, data forwarding, and error scenarios.
  • The test-pipeline endpoint is missing the dependencies=[Depends(user_api_key_auth)] decorator that all other endpoints in the file use.
  • UI adds a polished Zapier-style flow builder with mode picker, step cards, connector lines, and a test panel.

Confidence Score: 3/5

  • This PR has a metadata mutation bug in the pipeline executor that can corrupt guardrail execution for non-pipeline guardrails; fix before merging.
  • The shallow copy bug in pipeline_executor.py is a real logic error that will corrupt data["metadata"]["guardrails"] for the subsequent normal guardrail callback loop. The types, validation, DB wiring, tests, and UI are all well-structured. Score of 3 reflects the one critical bug that needs to be fixed, with the rest of the PR being solid.
  • Pay close attention to litellm/proxy/policy_engine/pipeline_executor.py — the shallow copy on line 59 and metadata mutation on lines 150-154 corrupt shared state. Also review litellm/proxy/utils.py for the dead-code HTTPException guard.

Important Files Changed

Filename Overview
litellm/proxy/policy_engine/pipeline_executor.py New pipeline executor with a shallow copy bug that corrupts the caller's metadata guardrails list, breaking subsequent guardrail execution in the normal callback loop.
litellm/proxy/utils.py Integrates pipeline execution into the pre_call_hook flow. Logic is sound for pipeline-managed guardrail skipping, but contains a dead-code branch for HTTPException null check.
litellm/proxy/policy_engine/policy_endpoints.py Adds test-pipeline endpoint with proper validation. Minor inconsistency: missing dependencies decorator compared to other endpoints.
litellm/proxy/policy_engine/policy_registry.py Adds pipeline field to all CRUD and sync paths with proper PrismaJson wrapping. Consistent and well-structured changes.
litellm/proxy/policy_engine/policy_resolver.py Adds pipeline resolution and managed-guardrail tracking. Clean implementation following existing resolver patterns.
litellm/proxy/litellm_pre_call_utils.py Integrates pipeline resolution into pre-call setup. Correctly excludes pipeline-managed guardrails from the flat guardrail list to prevent double execution.
litellm/types/proxy/policy_engine/pipeline_types.py Well-defined Pydantic models with proper validation for pipeline steps, actions, and modes. Extra fields are forbidden.
ui/litellm-dashboard/src/components/policies/pipeline_flow_builder.tsx New 999-line Zapier-style visual flow builder with trigger cards, step cards, connectors, test panel, and full-screen builder page. Well structured with proper validation.
ui/litellm-dashboard/src/components/policies/add_policy_form.tsx Adds mode picker (Simple vs Flow Builder) and flow builder integration. Logic to redirect to flow builder for pipeline policies is handled correctly.

Sequence Diagram

sequenceDiagram
    participant Client
    participant PreCallUtils as litellm_pre_call_utils
    participant PolicyResolver
    participant PreCallHook as ProxyLogging.pre_call_hook
    participant PipelineExec as PipelineExecutor
    participant Guardrail as CustomGuardrail Callbacks

    Client->>PreCallUtils: add_guardrails_from_policy_engine(data)
    PreCallUtils->>PolicyResolver: resolve_guardrails_for_context(context)
    PolicyResolver-->>PreCallUtils: resolved guardrails list
    PreCallUtils->>PolicyResolver: resolve_pipelines_for_context(context)
    PolicyResolver-->>PreCallUtils: [(policy_name, pipeline)]
    PreCallUtils->>PolicyResolver: get_pipeline_managed_guardrails(pipelines)
    PolicyResolver-->>PreCallUtils: managed guardrail names set
    Note over PreCallUtils: Store pipelines + managed set in metadata<br/>Remove managed guardrails from flat list

    Client->>PreCallHook: pre_call_hook(data)
    PreCallHook->>PipelineExec: _maybe_execute_pipelines(data)
    loop For each pipeline
        loop For each step in pipeline
            PipelineExec->>Guardrail: async_pre_call_hook(data)
            alt Guardrail passes
                Guardrail-->>PipelineExec: pass (optional modified data)
                Note over PipelineExec: Use step.on_pass action
            else Guardrail rejects (HTTPException 400)
                Guardrail-->>PipelineExec: fail
                Note over PipelineExec: Use step.on_fail action
            end
            alt Action = allow/block/modify_response
                PipelineExec-->>PreCallHook: Terminal result
            else Action = next
                Note over PipelineExec: Continue to next step
            end
        end
    end
    PipelineExec-->>PreCallHook: PipelineExecutionResult

    loop Normal callback loop
        Note over PreCallHook: Skip pipeline-managed guardrails
        PreCallHook->>Guardrail: process remaining guardrails
    end
    PreCallHook-->>Client: data (or raise on block)
Loading

Last reviewed commit: 7269d9a

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

26 files reviewed, 5 comments

Edit Code Review Agent Settings | Greptile


duration = time.perf_counter() - start_time

action = step.on_pass if outcome == "pass" else step.on_fail
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error outcomes use on_fail but "error" is a distinct condition from "fail"

When a guardrail is not found or throws an unexpected exception, _run_step returns "error" as the outcome. But here, any non-"pass" outcome (including "error") uses step.on_fail. This means a misconfigured guardrail name (typo) with on_fail: "next" would silently continue instead of surfacing the configuration error. Consider handling "error" outcomes separately to make misconfiguration more visible.

ishaan-jaff and others added 5 commits February 13, 2026 20:04
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
@ishaan-jaff ishaan-jaff merged commit 96802e1 into main Feb 14, 2026
7 of 21 checks passed
krrishdholakia pushed a commit that referenced this pull request Feb 14, 2026
…ctions (#21192)

* Access groups UI

* new badge changes

* adding tests

* fix: add custom_body parameter to endpoint_func in create_pass_through_route (#20849)

* fix: add custom_body parameter to endpoint_func in create_pass_through_route

The bedrock_proxy_route calls `endpoint_func(custom_body=data)` to
pass a pre-parsed, SigV4-signed request body. However, the
`endpoint_func` closure created by `create_pass_through_route` does
not accept a `custom_body` keyword argument, causing:

    TypeError: endpoint_func() got an unexpected keyword argument 'custom_body'

Add `custom_body: Optional[dict] = None` to both `endpoint_func`
definitions (adapter-based and URL-based). In the URL-based path,
when `custom_body` is provided by the caller, use it instead of
re-parsing the body from the raw request.

Fixes #16999

* Add tests for custom_body handling in create_pass_through_route

Address reviewer feedback on PR #20849:

- Document why the adapter-based endpoint_func accepts custom_body
  for signature compatibility but does not forward it (the underlying
  chat_completion_pass_through_endpoint does not support it).
- Add test_create_pass_through_route_custom_body_url_target: verifies
  that when a caller (e.g. bedrock_proxy_route) supplies custom_body,
  it takes precedence over the body parsed from the raw request.
- Add test_create_pass_through_route_no_custom_body_falls_back:
  verifies that the default path (no custom_body) correctly uses the
  request-parsed body, preserving existing behavior.

Both tests are fully mocked following the project's CONTRIBUTING.md
guidelines and the patterns established in the existing test file.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: themavik <themavik@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* change to model name for backwards compat

* addressing comments

* allow editing of access group names

* fix: populate identity fields in proxy admin JWT early-return path (#21169)

* fix: populate identity fields in proxy admin JWT early-return path

When is_proxy_admin is True, the UserAPIKeyAuth early-return now includes
user_id, team_id, team_alias, team_metadata, org_id, and end_user_id
resolved from the JWT. Previously only user_role and parent_otel_span
were set, causing blank Team Name and Internal User in Request Logs UI.

* test: add unit tests for proxy admin JWT identity fields

* bump: version 0.4.36 → 0.4.37

* migration + build files

* Add pyroscope for observability (#21167)

* Pyroscope: require PYROSCOPE_APP_NAME and PYROSCOPE_SERVER_ADDRESS, add UTF-8 locale hint

- No defaults for PYROSCOPE_APP_NAME or PYROSCOPE_SERVER_ADDRESS; fail at startup if unset when Pyroscope is enabled
- Set LANG/LC_ALL to C.UTF-8 when unset to reduce malformed_profile (invalid UTF-8) rejections
- Startup message suggests PYTHONUTF8=1 if server rejects profiles
- Simplify LITELLM_ENABLE_PYROSCOPE in config_settings; document Pyroscope env vars as required with no default
- Add pyroscope_profiling to sidebar (Alerting & Monitoring)
- pyproject.toml: pyroscope-io as required dep on non-Windows (marker), in proxy extra

* proxy: add PYROSCOPE_SAMPLE_RATE env, use verbose logging, fix int type

- Add optional PYROSCOPE_SAMPLE_RATE env (integer, no default)
- Pass sample_rate to pyroscope.configure() as int for pyroscope-io
- Replace print with verbose_proxy_logger (info/warning)
- Document PYROSCOPE_SAMPLE_RATE in config_settings.md

* Address Greptile PR feedback: Pyroscope optional, docs, tests, docstring

- pyproject.toml: mark pyroscope-io as optional=true (proxy extra only)
- Add docs/my-website/docs/proxy/pyroscope_profiling.md (fix broken sidebar link)
- Add tests/test_litellm/proxy/test_pyroscope.py for _init_pyroscope()
- proxy_server: fix _init_pyroscope docstring (required server/app name, sample rate as int)

* Update litellm/proxy/proxy_server.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* fix(model_info): Add missing tpm/rpm for Gemini models (#21175)

Several Gemini models (TTS, native-audio, robotics, gemma) were missing
tpm/rpm values, causing test_get_model_info_gemini to fail.

Added conservative default values (tpm=250000, rpm=10) for preview models.
gemini-2.5-flash-preview-tts gets tpm=4000000, rpm=10.

Co-authored-by: OpenClaw <openclaw@users.noreply.github.com>

* fix(ci): Fix ruff lint error - unused import in vertex_ai_ingestion (#21178)

Co-authored-by: shin-bot-litellm <shin-bot-litellm@users.noreply.github.com>

* fix(ci): Fix mypy type errors across 6 files (#21179)

- vertex_ai/gemini: fix TypedDict assignment via explicit dict cast
- mcp_server: convert MutableMapping scope to dict for type safety
- pass_through_endpoints: simplify custom_body logic to fix type narrowing
- vector_store_endpoints: add Any annotation for dynamic hook return
- responses transformation: use dict() for Reasoning and setattr for dynamic field
- zscaler_ai_guard: add assert for api_base None check

Co-authored-by: shin-bot-litellm <shin-bot-litellm@users.noreply.github.com>

* fix(ci): Fix E2E login button selector - use exact match (#21176)

* fix(ci): Fix ruff lint error - unused import

Remove unused 'cast' import in vertex_ai_ingestion.py (ruff F401)

* fix(ci): Fix E2E login button selector - use exact match

Login button selector now matches both 'Login' and 'Login with SSO',
causing strict mode violation. Use { exact: true } to match only 'Login'.

---------

Co-authored-by: OpenClaw <openclaw@users.noreply.github.com>

* fix(mypy): Fix type errors across multiple files (#21180)

- vertex_ai/gemini/transformation.py: Fix TypedDict assignment via dict alias
- mcp_server/server.py: Convert ASGI scope to dict for type compatibility
- pass_through_endpoints.py: Add explicit Optional[dict] type annotation
- vector_store_endpoints/endpoints.py: Add Any type for dynamic proxy hook
- responses transformation.py: Use dict(Reasoning()) and setattr for compatibility
- zscaler_ai_guard.py: Add assert for api_base nullability

Co-authored-by: OpenClaw <openclaw@users.noreply.github.com>

* [Guardrails] Add guardrail pipeline support for conditional sequential execution (#21177)

* Add pipeline type definitions for guardrail pipelines

PipelineStep, GuardrailPipeline, PipelineStepResult, PipelineExecutionResult
with validation for actions (allow/block/next/modify_response) and modes.

* Export pipeline types from policy_engine types package

* Add optional pipeline field to Policy model

* Add pipeline executor for sequential guardrail execution

* Parse pipeline config in policy registry

* Add pipeline validation in policy validator

* Add pipeline resolution and managed guardrail tracking

* Resolve pipelines and exclude managed guardrails in pre-call

* Integrate pipeline execution into proxy pre_call_hook

* Add test guardrails for pipeline E2E testing

* Add example pipeline config YAML

* Add unit tests for pipeline type definitions

* Add unit tests for pipeline executor

* Update litellm/proxy/policy_engine/pipeline_executor.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update litellm/proxy/utils.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Add pipeline flow builder UI for guardrail policies (#21188)

* Add pipeline type definitions for guardrail pipelines

PipelineStep, GuardrailPipeline, PipelineStepResult, PipelineExecutionResult
with validation for actions (allow/block/next/modify_response) and modes.

* Export pipeline types from policy_engine types package

* Add optional pipeline field to Policy model

* Add pipeline executor for sequential guardrail execution

* Parse pipeline config in policy registry

* Add pipeline validation in policy validator

* Add pipeline resolution and managed guardrail tracking

* Resolve pipelines and exclude managed guardrails in pre-call

* Integrate pipeline execution into proxy pre_call_hook

* Add test guardrails for pipeline E2E testing

* Add example pipeline config YAML

* Add unit tests for pipeline type definitions

* Add unit tests for pipeline executor

* Add pipeline column to LiteLLM_PolicyTable schema

* Add pipeline field to policy CRUD request/response types

* Add pipeline support to policy DB CRUD operations

* Add PipelineStep and GuardrailPipeline TypeScript types

* Add Zapier-style pipeline flow builder UI component

* Integrate pipeline flow builder with mode toggle in policy form

* Add pipeline display section to policy info view

* Add unit tests for pipeline in policy CRUD types

* Refactor policy form to show mode picker first with icon cards

* Add full-screen FlowBuilderPage component for pipeline editing

* Wire up full-screen flow builder in PoliciesPanel with edit routing

* Restyle flow builder to match dev-tool UI aesthetic

* Restyle flow builder cards to match reference design

* Update step card to expanded layout with stacked ON PASS / ON FAIL sections

* Add end card to flow builder showing return to normal control flow

* Add PipelineTestRequest type for test-pipeline endpoint

* Export PipelineTestRequest from policy_engine types

* Add POST /policies/test-pipeline endpoint

* Add testPipelineCall networking function

* Add PipelineStepResult and PipelineTestResult types

* Add test pipeline panel to flow builder with run button and results display

* Fix pipeline executor: inject guardrail name into metadata so should_run_guardrail allows execution

* Update litellm/proxy/policy_engine/pipeline_executor.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update litellm/proxy/utils.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update litellm/proxy/policy_engine/policy_endpoints.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update litellm/proxy/policy_engine/pipeline_executor.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* fix(responses-bridge): extract list-format system content into instructions

When system message content is a list of content blocks
(e.g. [{"type": "text", "text": "..."}]) instead of a plain string,
the responses API bridge was passing it through as a role: system
message in the input items. APIs like ChatGPT Codex reject this
with "System messages are not allowed".

This happens when requests come through the Anthropic /v1/messages
adapter, which converts system prompts into list-format content blocks
in the OpenAI chat completions format.

Fix: extract text from list content blocks and concatenate into the
instructions parameter, matching the existing behavior for string
system content.

* test: add tests for system message extraction in responses bridge

Add three tests for convert_chat_completion_messages_to_responses_api:
- String system content → instructions
- List-format content blocks → instructions (the bug this PR fixes)
- Multiple system messages (mixed string and list) concatenated

* fix: add warning log for unexpected system content types

Address review feedback: add an else clause that logs a warning
for any system content that is neither str nor list, rather than
silently dropping it.

---------

Co-authored-by: yuneng-jiang <yuneng.jiang@gmail.com>
Co-authored-by: The Mavik <179817126+themavik@users.noreply.github.com>
Co-authored-by: themavik <themavik@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Ishaan Jaff <ishaanjaffer0324@gmail.com>
Co-authored-by: Alexsander Hamir <alexsanderhamirgomesbaptista@gmail.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: shin-bot-litellm <shin-bot-litellm@berri.ai>
Co-authored-by: OpenClaw <openclaw@users.noreply.github.com>
Co-authored-by: shin-bot-litellm <shin-bot-litellm@users.noreply.github.com>
sameetn pushed a commit to sameetn/litellm that referenced this pull request Feb 16, 2026
* Add pipeline type definitions for guardrail pipelines

PipelineStep, GuardrailPipeline, PipelineStepResult, PipelineExecutionResult
with validation for actions (allow/block/next/modify_response) and modes.

* Export pipeline types from policy_engine types package

* Add optional pipeline field to Policy model

* Add pipeline executor for sequential guardrail execution

* Parse pipeline config in policy registry

* Add pipeline validation in policy validator

* Add pipeline resolution and managed guardrail tracking

* Resolve pipelines and exclude managed guardrails in pre-call

* Integrate pipeline execution into proxy pre_call_hook

* Add test guardrails for pipeline E2E testing

* Add example pipeline config YAML

* Add unit tests for pipeline type definitions

* Add unit tests for pipeline executor

* Add pipeline column to LiteLLM_PolicyTable schema

* Add pipeline field to policy CRUD request/response types

* Add pipeline support to policy DB CRUD operations

* Add PipelineStep and GuardrailPipeline TypeScript types

* Add Zapier-style pipeline flow builder UI component

* Integrate pipeline flow builder with mode toggle in policy form

* Add pipeline display section to policy info view

* Add unit tests for pipeline in policy CRUD types

* Refactor policy form to show mode picker first with icon cards

* Add full-screen FlowBuilderPage component for pipeline editing

* Wire up full-screen flow builder in PoliciesPanel with edit routing

* Restyle flow builder to match dev-tool UI aesthetic

* Restyle flow builder cards to match reference design

* Update step card to expanded layout with stacked ON PASS / ON FAIL sections

* Add end card to flow builder showing return to normal control flow

* Add PipelineTestRequest type for test-pipeline endpoint

* Export PipelineTestRequest from policy_engine types

* Add POST /policies/test-pipeline endpoint

* Add testPipelineCall networking function

* Add PipelineStepResult and PipelineTestResult types

* Add test pipeline panel to flow builder with run button and results display

* Fix pipeline executor: inject guardrail name into metadata so should_run_guardrail allows execution

* Update litellm/proxy/policy_engine/pipeline_executor.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update litellm/proxy/utils.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update litellm/proxy/policy_engine/policy_endpoints.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

* Update litellm/proxy/policy_engine/pipeline_executor.py

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>

---------

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant