mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-08-21 16:02:28 +00:00
97ac1be036
* draft mcp client * testing * fix * cleaning * mcp resource in inputtransforms * cleaning * big cleaning * cleaning * no arc * add utils file * refactor tools * add mcp actions * draft frontend * send arguments from backend * better frontend * cleaning * use token for auth * add logo * rm * fix * fix * chore: refactor mcp for ai agents (#6829) * Add Tool enum for AIAgent with backward compatibility - Created Tool enum that can be either Windmill (FlowModule) or Mcp (resource reference) - Created McpToolRef struct to hold MCP resource path - Implemented custom Deserialize for Tool with backward compatibility: - New format: {type: 'windmill'|'mcp', ...} - Old format: FlowModule objects (automatically wrapped in Tool::Windmill) - Updated AIAgent to use Vec<Tool> instead of Vec<FlowModule> - Updated FlowValue::traverse_leafs to handle Tool enum - Backward compatible: old flows with Vec<FlowModule> will deserialize correctly * Refactor AI executor to process Tool enum instead of extracting MCP from input_transforms - Separate Windmill tools and MCP resource paths from tools list - Process Windmill FlowModules into Tool definitions - Load MCP tools from resource paths in Tool::Mcp variants - Remove old logic that extracted mcp_resources from input_transforms - Import FlowModule, remove unused InputTransform - Fix type issues: use .as_str() for path and handle Option<bool> properly * handle in args * mcp as flowmodule * frontend * config for mcp * simplify logic * fix ai executor logic * cleaning * clean frontend * fix * better resource picker * fix and styling * add endpoint to fetch tools * apply tool filtering * fix name validation * better ui * use cache * fix * fix merge * refactor: Separate MCP tools from FlowModule in AIAgent - Add new AgentTool, ToolValue, and McpToolValue types - Update AIAgent to use Vec<AgentTool> instead of Vec<FlowModule> - Implement From traits for clean conversion between AgentTool and FlowModule - Add backward compatibility via custom deserializer for AgentTool - Simplify resolve_module logic by reusing existing resolve_modules function - Update traverse_leafs to handle AgentTool structure This refactoring separates MCP tools from FlowModule tools, making the type system clearer and eliminating the need to treat MCP servers as a special case of FlowModule. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * refactor: Update ai_executor and worker_lockfiles for AgentTool - Update ai_executor.rs to handle new AgentTool structure - Separate MCP tools from FlowModule tools using ToolValue enum - Convert AgentTool to FlowModule for backward compatibility - Add imports for AgentTool and ToolValue types - Update worker_lockfiles.rs for lazy loading optimization - Convert AgentTool <-> FlowModule in insert_flow_modules - Preserve lazy loading for FlowModule tools via modules_node - Keep MCP tools inline (lightweight, no need for lazy loading) - Maintain backward compatibility with existing flows This enables the lazy loading optimization for FlowModule tools while keeping MCP tools inline, balancing performance and simplicity. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * cleaning * adapt frontend * cleaning * cleaning * type fix * cleaning * fix back comp * move mcp button position * nit * cleaning * fix nested removal * cleaning * opti * fix chat markdown display * fix chat messages layout * fix back comp frontend * fix deserializer * nit * simpler serializer * use if else --------- Co-authored-by: Claude <noreply@anthropic.com>
735 lines
17 KiB
YAML
735 lines
17 KiB
YAML
openapi: "3.0.3"
|
|
|
|
info:
|
|
version: 1.563.4
|
|
title: OpenFlow Spec
|
|
contact:
|
|
name: Ruben Fiszel
|
|
email: ruben@windmill.dev
|
|
url: https://windmill.dev
|
|
|
|
license:
|
|
name: Apache 2.0
|
|
url: https://www.apache.org/licenses/LICENSE-2.0.html
|
|
|
|
paths: {}
|
|
|
|
externalDocs:
|
|
description: documentation portal
|
|
url: https://windmill.dev
|
|
|
|
components:
|
|
schemas:
|
|
OpenFlow:
|
|
type: object
|
|
properties:
|
|
summary:
|
|
type: string
|
|
description:
|
|
type: string
|
|
value:
|
|
$ref: "#/components/schemas/FlowValue"
|
|
schema:
|
|
type: object
|
|
required:
|
|
- summary
|
|
- value
|
|
|
|
FlowValue:
|
|
type: object
|
|
properties:
|
|
modules:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/FlowModule"
|
|
failure_module:
|
|
$ref: "#/components/schemas/FlowModule"
|
|
preprocessor_module:
|
|
$ref: "#/components/schemas/FlowModule"
|
|
same_worker:
|
|
type: boolean
|
|
concurrent_limit:
|
|
type: number
|
|
concurrency_key:
|
|
type: string
|
|
concurrency_time_window_s:
|
|
type: number
|
|
skip_expr:
|
|
type: string
|
|
cache_ttl:
|
|
type: number
|
|
priority:
|
|
type: number
|
|
early_return:
|
|
type: string
|
|
chat_input_enabled:
|
|
type: boolean
|
|
description: Whether this flow accepts chat-style input
|
|
required:
|
|
- modules
|
|
|
|
Retry:
|
|
type: object
|
|
properties:
|
|
constant:
|
|
type: object
|
|
properties:
|
|
attempts:
|
|
type: integer
|
|
seconds:
|
|
type: integer
|
|
exponential:
|
|
type: object
|
|
properties:
|
|
attempts:
|
|
type: integer
|
|
multiplier:
|
|
type: integer
|
|
seconds:
|
|
type: integer
|
|
random_factor:
|
|
type: integer
|
|
minimum: 0
|
|
maximum: 100
|
|
retry_if:
|
|
$ref: "#/components/schemas/RetryIf"
|
|
|
|
RetryIf:
|
|
type: object
|
|
properties:
|
|
expr:
|
|
type: string
|
|
required:
|
|
- expr
|
|
|
|
StopAfterIf:
|
|
type: object
|
|
properties:
|
|
skip_if_stopped:
|
|
type: boolean
|
|
expr:
|
|
type: string
|
|
error_message:
|
|
type: string
|
|
required:
|
|
- expr
|
|
|
|
FlowModule:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
value:
|
|
$ref: "#/components/schemas/FlowModuleValue"
|
|
stop_after_if:
|
|
$ref: "#/components/schemas/StopAfterIf"
|
|
stop_after_all_iters_if:
|
|
$ref: "#/components/schemas/StopAfterIf"
|
|
skip_if:
|
|
type: object
|
|
properties:
|
|
expr:
|
|
type: string
|
|
required:
|
|
- expr
|
|
sleep:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
cache_ttl:
|
|
type: number
|
|
timeout:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
delete_after_use:
|
|
type: boolean
|
|
summary:
|
|
type: string
|
|
mock:
|
|
type: object
|
|
properties:
|
|
enabled:
|
|
type: boolean
|
|
return_value: {}
|
|
suspend:
|
|
type: object
|
|
properties:
|
|
required_events:
|
|
type: integer
|
|
timeout:
|
|
type: integer
|
|
resume_form:
|
|
type: object
|
|
properties:
|
|
schema:
|
|
type: object
|
|
user_auth_required:
|
|
type: boolean
|
|
user_groups_required:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
self_approval_disabled:
|
|
type: boolean
|
|
hide_cancel:
|
|
type: boolean
|
|
continue_on_disapprove_timeout:
|
|
type: boolean
|
|
priority:
|
|
type: number
|
|
continue_on_error:
|
|
type: boolean
|
|
retry:
|
|
$ref: "#/components/schemas/Retry"
|
|
required:
|
|
- value
|
|
- id
|
|
|
|
InputTransform:
|
|
oneOf:
|
|
- $ref: "#/components/schemas/StaticTransform"
|
|
- $ref: "#/components/schemas/JavascriptTransform"
|
|
discriminator:
|
|
propertyName: type
|
|
mapping:
|
|
static: "#/components/schemas/StaticTransform"
|
|
javascript: "#/components/schemas/JavascriptTransform"
|
|
|
|
StaticTransform:
|
|
type: object
|
|
properties:
|
|
value: {}
|
|
type:
|
|
type: string
|
|
enum:
|
|
- static
|
|
required:
|
|
- value
|
|
- type
|
|
|
|
JavascriptTransform:
|
|
type: object
|
|
properties:
|
|
expr:
|
|
type: string
|
|
type:
|
|
type: string
|
|
enum:
|
|
- javascript
|
|
required:
|
|
- expr
|
|
- type
|
|
|
|
FlowModuleValue:
|
|
oneOf:
|
|
- $ref: "#/components/schemas/RawScript"
|
|
- $ref: "#/components/schemas/PathScript"
|
|
- $ref: "#/components/schemas/PathFlow"
|
|
- $ref: "#/components/schemas/ForloopFlow"
|
|
- $ref: "#/components/schemas/WhileloopFlow"
|
|
- $ref: "#/components/schemas/BranchOne"
|
|
- $ref: "#/components/schemas/BranchAll"
|
|
- $ref: "#/components/schemas/Identity"
|
|
- $ref: "#/components/schemas/AiAgent"
|
|
discriminator:
|
|
propertyName: type
|
|
mapping:
|
|
rawscript: "#/components/schemas/RawScript"
|
|
script: "#/components/schemas/PathScript"
|
|
flow: "#/components/schemas/PathFlow"
|
|
forloopflow: "#/components/schemas/ForloopFlow"
|
|
whileloopflow: "#/components/schemas/WhileloopFlow"
|
|
branchone: "#/components/schemas/BranchOne"
|
|
branchall: "#/components/schemas/BranchAll"
|
|
identity: "#/components/schemas/Identity"
|
|
aiagent: "#/components/schemas/AiAgent"
|
|
|
|
RawScript:
|
|
type: object
|
|
properties:
|
|
# to be made required once migration is over
|
|
input_transforms:
|
|
type: object
|
|
additionalProperties:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
content:
|
|
type: string
|
|
language:
|
|
type: string
|
|
enum:
|
|
- deno
|
|
- bun
|
|
- python3
|
|
- go
|
|
- bash
|
|
- powershell
|
|
- postgresql
|
|
- mysql
|
|
- bigquery
|
|
- snowflake
|
|
- mssql
|
|
- oracledb
|
|
- graphql
|
|
- nativets
|
|
- php
|
|
path:
|
|
type: string
|
|
lock:
|
|
type: string
|
|
type:
|
|
type: string
|
|
enum:
|
|
- rawscript
|
|
tag:
|
|
type: string
|
|
concurrent_limit:
|
|
type: number
|
|
concurrency_time_window_s:
|
|
type: number
|
|
custom_concurrency_key:
|
|
type: string
|
|
is_trigger:
|
|
type: boolean
|
|
assets:
|
|
type: array
|
|
items:
|
|
type: object
|
|
required:
|
|
- path
|
|
- kind
|
|
properties:
|
|
path:
|
|
type: string
|
|
kind:
|
|
type: string
|
|
enum:
|
|
- s3object
|
|
- resource
|
|
- ducklake
|
|
access_type:
|
|
type: string
|
|
enum: [r, w, rw]
|
|
alt_access_type:
|
|
type: string
|
|
enum: [r, w, rw]
|
|
required:
|
|
- type
|
|
- content
|
|
- language
|
|
- input_transforms
|
|
|
|
PathScript:
|
|
type: object
|
|
properties:
|
|
input_transforms:
|
|
type: object
|
|
additionalProperties:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
path:
|
|
type: string
|
|
hash:
|
|
type: string
|
|
type:
|
|
type: string
|
|
enum:
|
|
- script
|
|
tag_override:
|
|
type: string
|
|
is_trigger:
|
|
type: boolean
|
|
required:
|
|
- type
|
|
- path
|
|
- input_transforms
|
|
|
|
PathFlow:
|
|
type: object
|
|
properties:
|
|
input_transforms:
|
|
type: object
|
|
additionalProperties:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
path:
|
|
type: string
|
|
type:
|
|
type: string
|
|
enum:
|
|
- flow
|
|
required:
|
|
- type
|
|
- path
|
|
- input_transforms
|
|
|
|
ForloopFlow:
|
|
type: object
|
|
properties:
|
|
modules:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/FlowModule"
|
|
iterator:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
skip_failures:
|
|
type: boolean
|
|
type:
|
|
type: string
|
|
enum:
|
|
- forloopflow
|
|
parallel:
|
|
type: boolean
|
|
parallelism:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
required:
|
|
- modules
|
|
- iterator
|
|
- skip_failures
|
|
- type
|
|
|
|
WhileloopFlow:
|
|
type: object
|
|
properties:
|
|
modules:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/FlowModule"
|
|
skip_failures:
|
|
type: boolean
|
|
type:
|
|
type: string
|
|
enum:
|
|
- whileloopflow
|
|
parallel:
|
|
type: boolean
|
|
parallelism:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
required:
|
|
- modules
|
|
- skip_failures
|
|
- type
|
|
|
|
BranchOne:
|
|
type: object
|
|
properties:
|
|
branches:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
summary:
|
|
type: string
|
|
expr:
|
|
type: string
|
|
modules:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/FlowModule"
|
|
required:
|
|
- modules
|
|
- expr
|
|
default:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/FlowModule"
|
|
required: [modules]
|
|
type:
|
|
type: string
|
|
enum:
|
|
- branchone
|
|
required:
|
|
- branches
|
|
- default
|
|
- type
|
|
|
|
BranchAll:
|
|
type: object
|
|
properties:
|
|
branches:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
summary:
|
|
type: string
|
|
skip_failure:
|
|
type: boolean
|
|
modules:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/FlowModule"
|
|
required:
|
|
- modules
|
|
type:
|
|
type: string
|
|
enum:
|
|
- branchall
|
|
parallel:
|
|
type: boolean
|
|
required:
|
|
- branches
|
|
- type
|
|
|
|
AgentTool:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
summary:
|
|
type: string
|
|
value:
|
|
$ref: "#/components/schemas/ToolValue"
|
|
required:
|
|
- id
|
|
- value
|
|
|
|
ToolValue:
|
|
oneOf:
|
|
- $ref: "#/components/schemas/FlowModuleTool"
|
|
- $ref: "#/components/schemas/McpToolValue"
|
|
discriminator:
|
|
propertyName: tool_type
|
|
mapping:
|
|
flowmodule: "#/components/schemas/FlowModuleTool"
|
|
mcp: "#/components/schemas/McpToolValue"
|
|
|
|
FlowModuleTool:
|
|
allOf:
|
|
- type: object
|
|
properties:
|
|
tool_type:
|
|
type: string
|
|
enum:
|
|
- flowmodule
|
|
required:
|
|
- tool_type
|
|
- $ref: "#/components/schemas/FlowModuleValue"
|
|
|
|
McpToolValue:
|
|
type: object
|
|
properties:
|
|
tool_type:
|
|
type: string
|
|
enum:
|
|
- mcp
|
|
resource_path:
|
|
type: string
|
|
include_tools:
|
|
type: array
|
|
items:
|
|
type: string
|
|
exclude_tools:
|
|
type: array
|
|
items:
|
|
type: string
|
|
required:
|
|
- tool_type
|
|
- resource_path
|
|
|
|
AiAgent:
|
|
type: object
|
|
properties:
|
|
input_transforms:
|
|
type: object
|
|
additionalProperties:
|
|
$ref: "#/components/schemas/InputTransform"
|
|
tools:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/AgentTool"
|
|
type:
|
|
type: string
|
|
enum:
|
|
- aiagent
|
|
parallel:
|
|
type: boolean
|
|
required:
|
|
- tools
|
|
- type
|
|
- input_transforms
|
|
|
|
Identity:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
enum:
|
|
- identity
|
|
flow:
|
|
type: boolean
|
|
|
|
required:
|
|
- type
|
|
|
|
FlowStatus:
|
|
type: object
|
|
properties:
|
|
step:
|
|
type: integer
|
|
modules:
|
|
type: array
|
|
items:
|
|
$ref: "#/components/schemas/FlowStatusModule"
|
|
user_states:
|
|
additionalProperties: true
|
|
preprocessor_module:
|
|
allOf:
|
|
- $ref: "#/components/schemas/FlowStatusModule"
|
|
failure_module:
|
|
allOf:
|
|
- $ref: "#/components/schemas/FlowStatusModule"
|
|
- type: object
|
|
properties:
|
|
parent_module:
|
|
type: string
|
|
retry:
|
|
type: object
|
|
properties:
|
|
fail_count:
|
|
type: integer
|
|
failed_jobs:
|
|
type: array
|
|
items:
|
|
type: string
|
|
format: uuid
|
|
required:
|
|
- step
|
|
- modules
|
|
- failure_module
|
|
|
|
FlowStatusModule:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
enum:
|
|
- WaitingForPriorSteps
|
|
- WaitingForEvents
|
|
- WaitingForExecutor
|
|
- InProgress
|
|
- Success
|
|
- Failure
|
|
id:
|
|
type: string
|
|
job:
|
|
type: string
|
|
format: uuid
|
|
count:
|
|
type: integer
|
|
progress:
|
|
type: integer
|
|
iterator:
|
|
type: object
|
|
properties:
|
|
index:
|
|
type: integer
|
|
itered:
|
|
type: array
|
|
items: {}
|
|
args: {}
|
|
flow_jobs:
|
|
type: array
|
|
items:
|
|
type: string
|
|
flow_jobs_success:
|
|
type: array
|
|
items:
|
|
type: boolean
|
|
flow_jobs_duration:
|
|
type: object
|
|
properties:
|
|
started_at:
|
|
type: array
|
|
items:
|
|
type: string
|
|
duration_ms:
|
|
type: array
|
|
items:
|
|
type: integer
|
|
branch_chosen:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
enum: [branch, default]
|
|
branch:
|
|
type: integer
|
|
required:
|
|
- type
|
|
branchall:
|
|
type: object
|
|
properties:
|
|
branch:
|
|
type: integer
|
|
len:
|
|
type: integer
|
|
required:
|
|
- branch
|
|
- len
|
|
approvers:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
resume_id:
|
|
type: integer
|
|
approver:
|
|
type: string
|
|
required:
|
|
- resume_id
|
|
- approver
|
|
failed_retries:
|
|
type: array
|
|
items:
|
|
type: string
|
|
format: uuid
|
|
skipped:
|
|
type: boolean
|
|
agent_actions:
|
|
type: array
|
|
items:
|
|
type: object
|
|
oneOf:
|
|
- type: object
|
|
properties:
|
|
job_id:
|
|
type: string
|
|
format: uuid
|
|
function_name:
|
|
type: string
|
|
type:
|
|
type: string
|
|
enum: [tool_call]
|
|
module_id:
|
|
type: string
|
|
required:
|
|
- job_id
|
|
- function_name
|
|
- type
|
|
- module_id
|
|
- type: object
|
|
properties:
|
|
call_id:
|
|
type: string
|
|
format: uuid
|
|
function_name:
|
|
type: string
|
|
resource_path:
|
|
type: string
|
|
type:
|
|
type: string
|
|
enum: [mcp_tool_call]
|
|
arguments:
|
|
type: object
|
|
required:
|
|
- call_id
|
|
- function_name
|
|
- resource_path
|
|
- type
|
|
- type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
enum: [message]
|
|
required:
|
|
- content
|
|
- type
|
|
agent_actions_success:
|
|
type: array
|
|
items:
|
|
type: boolean
|
|
required: [type]
|