{"data":[{"typeId":"chat/output","name":"Chat Output Node","category":"chat","description":"Receive message packets and render to chat interface, supports streaming display, virtualization and message export","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"ChatOutputNode 输入 直接接受 Agent 最终回复文本和执行轨迹，简化前端解析","properties":{"autoscroll":{"default":true,"description":"Auto scroll to latest message","title":"Auto Scroll","type":"boolean","x-control":"switch","x-i18n-key":"nodes.chat.output.inputs.autoscroll"},"context":{"additionalProperties":true,"description":"Agent final reply text or AgentContext (auto extracts text)","title":"Agent Reply","type":"object","x-i18n-key":"nodes.chat.output.inputs.context","x-port":true},"display_format":{"default":"standard","description":"Message display format","oneOf":[{"description":"紧凑模式","enum":["compact"],"type":"string"},{"description":"标准模式","enum":["standard"],"type":"string"},{"description":"详细模式","enum":["detailed"],"type":"string"}],"title":"Display Format","x-control":"select","x-i18n-key":"nodes.chat.output.inputs.display_format"},"keep_messages":{"default":1000,"description":"Maximum messages to keep in memory","format":"uint","maximum":10000.0,"minimum":10.0,"title":"Keep Messages","type":"integer","x-control":"number","x-i18n-key":"nodes.chat.output.inputs.keep_messages"},"show_timestamp":{"default":true,"description":"Show message timestamp","title":"Show Timestamp","type":"boolean","x-control":"switch","x-i18n-key":"nodes.chat.output.inputs.show_timestamp"},"theme":{"default":"system","description":"Display theme","enum":["light","dark","system"],"options":[{"label":"light","value":"light"},{"label":"dark","value":"dark"},{"label":"system","value":"system"}],"title":"Theme","type":"string","x-control":"select","x-i18n-key":"nodes.chat.output.inputs.theme"},"trace":{"default":null,"description":"Agent execution trace (thinking process)","title":"Trace","type":"string","x-i18n-key":"nodes.chat.output.inputs.trace","x-port":true},"virtualize_threshold":{"default":100,"description":"Enable virtualization when message count exceeds this value","format":"uint","maximum":1000.0,"minimum":10.0,"title":"Virtualize Threshold","type":"integer","x-control":"slider","x-i18n-key":"nodes.chat.output.inputs.virtualize_threshold"}},"required":["context"],"title":"ChatOutputNodeInput","type":"object","x-field-order":["context","trace","theme","autoscroll","keep_messages","virtualize_threshold","display_format","show_timestamp"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"AppendMode":{"description":"追加模式","oneOf":[{"description":"平滑追加（带动画）","enum":["smooth"],"type":"string"},{"description":"即时追加","enum":["instant"],"type":"string"}]},"ChatAppendPayload":{"description":"ChatAppend 事件载荷","properties":{"append_mode":{"allOf":[{"$ref":"#/definitions/AppendMode"}],"description":"追加模式"},"packets":{"description":"要追加的消息列表","items":{"$ref":"#/definitions/MessagePacket"},"type":"array"},"scroll_hint":{"allOf":[{"$ref":"#/definitions/ScrollHint"}],"description":"滚动提示"}},"required":["append_mode","packets","scroll_hint"],"type":"object"},"ChatMetaPayload":{"description":"ChatMeta 事件载荷","properties":{"action":{"allOf":[{"$ref":"#/definitions/MetaAction"}],"description":"元操作类型"},"data":{"description":"附加数据"}},"required":["action"],"type":"object"},"ChatPatchPayload":{"description":"ChatPatch 事件载荷","properties":{"message_id":{"description":"要更新的消息 ID","type":"string"},"patch":{"allOf":[{"$ref":"#/definitions/MessagePacket"}],"description":"更新内容"}},"required":["message_id","patch"],"type":"object"},"ChatUiEvent":{"description":"UI 事件类型","oneOf":[{"description":"追加消息","properties":{"payload":{"$ref":"#/definitions/ChatAppendPayload"},"type":{"enum":["ChatAppend"],"type":"string"}},"required":["payload","type"],"type":"object"},{"description":"局部更新（替换某条消息）","properties":{"payload":{"$ref":"#/definitions/ChatPatchPayload"},"type":{"enum":["ChatPatch"],"type":"string"}},"required":["payload","type"],"type":"object"},{"description":"元信息变更（滚动、主题、清屏、状态）","properties":{"payload":{"$ref":"#/definitions/ChatMetaPayload"},"type":{"enum":["ChatMeta"],"type":"string"}},"required":["payload","type"],"type":"object"}]},"MessagePacket":{"description":"消息包 - Chat 系统的核心数据结构","properties":{"hash":{"description":"Message hash (for deduplication and idempotency)","pattern":"^[0-9a-f]{32}$","title":"Hash","type":"string"},"id":{"description":"Unique message ID","title":"ID","type":"string"},"meta":{"additionalProperties":true,"description":"Message metadata","title":"Meta","type":"object"},"msg_type":{"allOf":[{"$ref":"#/definitions/MessageType"}],"description":"Message type (text/image/file/audio, etc.)","title":"Msg Type"},"payload":{"description":"Message content payload","title":"Payload"},"protocol_version":{"description":"Protocol version","title":"Protocol Version","type":"string"},"stream_hint":{"anyOf":[{"$ref":"#/definitions/StreamHint"},{"type":"null"}],"description":"Stream shard info","title":"Stream Hint"},"timestamp":{"description":"Message creation timestamp (Unix ms)","format":"int64","title":"Timestamp","type":"integer"}},"required":["hash","id","meta","msg_type","payload","protocol_version","timestamp"],"type":"object"},"MessageType":{"description":"消息类型","oneOf":[{"description":"纯文本","enum":["text"],"type":"string"},{"description":"图片","enum":["image"],"type":"string"},{"description":"文件","enum":["file"],"type":"string"},{"description":"音频","enum":["audio"],"type":"string"},{"description":"视频","enum":["video"],"type":"string"},{"description":"OCR 识别结果","enum":["ocr_text"],"type":"string"},{"description":"流式分片","enum":["stream"],"type":"string"},{"description":"控制消息（如清屏、状态变更）","enum":["control"],"type":"string"},{"description":"错误消息","enum":["error"],"type":"string"},{"description":"网页快照","enum":["web_snapshot"],"type":"string"},{"description":"系统消息","enum":["system"],"type":"string"}]},"MetaAction":{"description":"元操作类型","oneOf":[{"description":"清屏","enum":["clear"],"type":"string"},{"description":"滚动到底部","enum":["scroll_to_bottom"],"type":"string"},{"description":"滚动到顶部","enum":["scroll_to_top"],"type":"string"},{"additionalProperties":false,"description":"滚动到指定消息","properties":{"scroll_to_message":{"properties":{"message_id":{"type":"string"}},"required":["message_id"],"type":"object"}},"required":["scroll_to_message"],"type":"object"},{"additionalProperties":false,"description":"切换主题","properties":{"set_theme":{"properties":{"theme":{"type":"string"}},"required":["theme"],"type":"object"}},"required":["set_theme"],"type":"object"},{"description":"显示加载骨架","enum":["show_skeleton"],"type":"string"},{"description":"隐藏加载骨架","enum":["hide_skeleton"],"type":"string"},{"additionalProperties":false,"description":"节点状态变更","properties":{"status_change":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"}},"required":["status_change"],"type":"object"}]},"OutputStats":{"description":"输出统计","properties":{"displayed":{"format":"uint","minimum":0.0,"title":"Displayed","type":"integer"},"errors":{"format":"uint","minimum":0.0,"title":"Errors","type":"integer"},"migrated":{"format":"uint","minimum":0.0,"title":"Migrated","type":"integer"},"received":{"format":"uint","minimum":0.0,"title":"Received","type":"integer"}},"required":["displayed","errors","migrated","received"],"type":"object"},"ScrollHint":{"description":"滚动提示","oneOf":[{"description":"自动滚动到底部","enum":["auto"],"type":"string"},{"description":"锁定当前位置","enum":["lock"],"type":"string"}]},"StreamHint":{"description":"流式分片提示","properties":{"chunk_index":{"description":"分片索引（从 0 开始）","format":"uint32","minimum":0.0,"type":"integer"},"group_id":{"description":"所属消息组 ID","type":"string"},"is_final":{"description":"是否为最后一个分片","type":"boolean"}},"required":["chunk_index","group_id","is_final"],"type":"object"}},"description":"ChatOutputNode 输出","properties":{"message_count":{"description":"Current total messages retained","format":"uint","minimum":0.0,"title":"Message Count","type":"integer","x-i18n-key":"nodes.chat.output.outputs.message_count"},"reply":{"description":"Assistant final reply text content","title":"Reply","type":"string","x-i18n-key":"nodes.chat.output.outputs.reply"},"stats":{"allOf":[{"$ref":"#/definitions/OutputStats"}],"description":"Processing statistics","title":"Stats","x-i18n-key":"nodes.chat.output.outputs.stats"},"trace":{"description":"Agent execution trace (thinking process)","title":"Trace","type":["string","null"],"x-i18n-key":"nodes.chat.output.outputs.trace"},"ui_events":{"description":"UI events to send to frontend","items":{"$ref":"#/definitions/ChatUiEvent"},"title":"Ui Events","type":"array","x-i18n-key":"nodes.chat.output.outputs.ui_events"},"virtualized":{"description":"Whether virtualization rendering is enabled","title":"Virtualized","type":"boolean","x-i18n-key":"nodes.chat.output.outputs.virtualized"}},"required":["message_count","reply","stats","ui_events","virtualized"],"title":"ChatOutputNodeOutput","type":"object","x-collapsed-visible":["reply"],"x-field-order":["reply","trace","ui_events","message_count","virtualized","stats"]},"builtin":true,"i18nKeyPrefix":"nodes.chat.output"},{"typeId":"io/input_text","name":"Text Input","category":"io","description":"Multi-line text / JSON input, outputs text, JSON value and AgentContext","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"json_text":{"default":"","description":"JSON format content (ignored when empty)","maxLength":200000,"minLength":0,"title":"JSON","type":"string","x-control":"code-editor","x-i18n-key":"nodes.io.input_text.inputs.json_text","x-language":"json","x-rows":2},"text":{"default":"","description":"Plain text content (supports multi-line input)","maxLength":200000,"minLength":0,"title":"Text","type":"string","x-control":"textarea","x-i18n-key":"nodes.io.input_text.inputs.text"}},"title":"InputTextInput","type":"object","x-collapsed-visible":["text","json_text"],"x-field-order":["text","json_text"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"context":{"additionalProperties":true,"description":"AgentContext output (can connect directly to Agent / Output nodes)","type":"object","x-i18n-key":"nodes.io.input_text.outputs.context","x-port":true},"json_value":{"description":"Parsed result of json_text (null if JSON is invalid)","title":"JSON Value","x-i18n-key":"nodes.io.input_text.outputs.json_value"},"length":{"description":"Character length of the text field (Number)","format":"uint","minimum":0.0,"title":"Length","type":"integer","x-i18n-key":"nodes.io.input_text.outputs.length"},"text":{"description":"Raw content of the text field (String)","title":"Text","type":"string","x-i18n-key":"nodes.io.input_text.outputs.text"}},"required":["context","length","text"],"title":"InputTextOutput","type":"object","x-collapsed-visible":["text","context"],"x-field-order":["text","length","json_value","context"]},"builtin":true,"i18nKeyPrefix":"nodes.io.input_text"},{"typeId":"rag/chunker","name":"Document Chunker","category":"rag","description":"Split documents into parent and child chunks, supports structural/fixed/semantic/hybrid modes","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Chunker node input","properties":{"child_chunk_chars":{"default":null,"description":"Child chunk size in characters","title":"Child Chunk Size (chars)","type":"integer","x-allow-custom":true,"x-control":"select","x-default":384,"x-i18n-key":"nodes.rag.chunker.inputs.child_chunk_chars","x-options":[{"label":"128","value":128},{"label":"256","value":256},{"label":"384","value":384},{"label":"512","value":512}]},"content":{"description":"Document text content to chunk","title":"Document Content","type":"string","x-i18n-key":"nodes.rag.chunker.inputs.content"},"document_id":{"default":null,"description":"Document identifier (optional, auto-generated if not provided)","title":"Document ID","type":["string","null"],"x-i18n-key":"nodes.rag.chunker.inputs.document_id"},"max_embedding_chars":{"default":null,"description":"Maximum embedding chunk size - HARD SAFETY LIMIT","title":"Max Embedding Chars","type":"integer","x-allow-custom":true,"x-control":"select","x-default":512,"x-i18n-key":"nodes.rag.chunker.inputs.max_embedding_chars","x-options":[{"label":"512","value":512},{"label":"1024","value":1024},{"label":"2048","value":2048},{"label":"4096","value":4096},{"label":"8192","value":8192}]},"mode":{"default":null,"description":"Select document chunking method","title":"Chunking Mode","type":"string","x-control":"select","x-default":"structural","x-i18n-key":"nodes.rag.chunker.inputs.mode","x-options":[{"description":"Split by markdown headings","label":"Structural","value":"structural"},{"description":"Split by fixed token length","label":"Fixed Length","value":"fixed"},{"description":"Split by paragraph semantic boundaries","label":"Semantic","value":"semantic"},{"description":"Structural + semantic hybrid","label":"Hybrid","value":"hybrid"}]},"parent_chunk_chars":{"default":null,"description":"Parent chunk size in characters","title":"Parent Chunk Size (chars)","type":"integer","x-allow-custom":true,"x-control":"select","x-default":384,"x-i18n-key":"nodes.rag.chunker.inputs.parent_chunk_chars","x-options":[{"label":"256","value":256},{"label":"384","value":384},{"label":"512","value":512},{"label":"1024","value":1024}]}},"required":["content"],"title":"ChunkerInput","type":"object","x-field-order":["content","document_id","mode","parent_chunk_chars","child_chunk_chars","max_embedding_chars"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ChunkOutput":{"description":"Chunk output representation","properties":{"chunk_index":{"description":"Chunk index","format":"uint","minimum":0.0,"title":"Chunk Index","type":"integer"},"id":{"description":"Chunk ID","title":"ID","type":"string"},"is_parent":{"description":"Is parent chunk","title":"Is Parent","type":"boolean"},"parent_id":{"description":"Parent ID (for child chunks)","title":"Parent Id","type":["string","null"]},"text":{"description":"Chunk text content","title":"Text","type":"string"}},"required":["chunk_index","id","is_parent","text"],"type":"object"}},"description":"Chunker node output","properties":{"child_chunks":{"description":"List of child chunks","items":{"$ref":"#/definitions/ChunkOutput"},"title":"Child Chunks","type":"array","x-i18n-key":"nodes.rag.chunker.outputs.child_chunks"},"child_count":{"description":"Total child chunk count","format":"uint","minimum":0.0,"title":"Child Count","type":"integer","x-i18n-key":"nodes.rag.chunker.outputs.child_count"},"document_id":{"description":"Processed document ID","title":"Document ID","type":"string","x-i18n-key":"nodes.rag.chunker.outputs.document_id"},"mode":{"description":"Chunking mode used","title":"Mode","type":"string","x-i18n-key":"nodes.rag.chunker.outputs.mode"},"parent_chunks":{"description":"List of parent chunks","items":{"$ref":"#/definitions/ChunkOutput"},"title":"Parent Chunks","type":"array","x-i18n-key":"nodes.rag.chunker.outputs.parent_chunks"},"parent_count":{"description":"Total parent chunk count","format":"uint","minimum":0.0,"title":"Parent Count","type":"integer","x-i18n-key":"nodes.rag.chunker.outputs.parent_count"}},"required":["child_chunks","child_count","document_id","mode","parent_chunks","parent_count"],"title":"ChunkerOutput","type":"object","x-collapsed-visible":["parent_chunks","child_chunks"],"x-field-order":["document_id","parent_chunks","child_chunks","parent_count","child_count","mode"]},"builtin":true,"i18nKeyPrefix":"nodes.rag.chunker"},{"typeId":"utils/approver","name":"Approval Gate","category":"utils","description":"Pause execution and request user authorization before performing a high-risk action. Supports one-time, session-level, and skip decisions.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"action_name":{"description":"Name of the action requiring authorization","title":"Action Name","type":"string","x-i18n-key":"nodes.utils.approver.inputs.action_name"},"description":{"default":null,"description":"Human-readable explanation of what the action will do","title":"Description","type":["string","null"],"x-i18n-key":"nodes.utils.approver.inputs.description"},"extra_whitelist":{"default":null,"description":"Extra comma-separated action names to auto-approve in addition to session whitelist","title":"Extra Whitelist Rules","type":["string","null"],"x-i18n-key":"nodes.utils.approver.inputs.extra_whitelist"},"param_summary":{"default":null,"description":"JSON summary of action parameters shown in the approval card","title":"Parameter Summary","type":["string","null"],"x-i18n-key":"nodes.utils.approver.inputs.param_summary"},"risk_level":{"default":"medium","description":"Assessed risk of the action (low / medium / high / critical)","enum":["low","medium","high","critical"],"options":[{"label":"low","value":"low"},{"label":"medium","value":"medium"},{"label":"high","value":"high"},{"label":"critical","value":"critical"}],"title":"Risk Level","type":"string","x-control":"select","x-i18n-key":"nodes.utils.approver.inputs.risk_level"},"timeout_secs":{"default":300,"description":"Seconds to wait before auto-rejecting if no response (default 300)","format":"uint64","minimum":0.0,"title":"Approval Timeout (s)","type":"integer","x-i18n-key":"nodes.utils.approver.inputs.timeout_secs"}},"required":["action_name"],"title":"ApproverInput","type":"object","x-collapsed-visible":["action_name","risk_level"],"x-field-order":["action_name","risk_level","description","param_summary","extra_whitelist","timeout_secs"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ApprovalOutcome":{"description":"Outcome of the approval gate.","oneOf":[{"description":"User approved the action (or whitelist hit).","enum":["approved"],"type":"string"},{"description":"User rejected the action.","enum":["rejected"],"type":"string"},{"description":"User chose to skip this action and return feedback.","enum":["skipped"],"type":"string"},{"description":"No response was received within the timeout window.","enum":["timed_out"],"type":"string"}]}},"properties":{"approved":{"description":"True when the action is allowed to proceed","title":"Approved","type":"boolean","x-i18n-key":"nodes.utils.approver.outputs.approved"},"outcome":{"allOf":[{"$ref":"#/definitions/ApprovalOutcome"}],"description":"Detailed approval outcome","title":"Outcome","x-i18n-key":"nodes.utils.approver.outputs.outcome"},"reason":{"description":"User-provided reason or feedback","title":"Reason","type":["string","null"],"x-i18n-key":"nodes.utils.approver.outputs.reason"},"request_id":{"description":"UUID identifying this approval request","title":"Request ID","type":"string","x-i18n-key":"nodes.utils.approver.outputs.request_id"},"scope":{"description":"Scope granted by the user","title":"Approval Scope","type":["string","null"],"x-i18n-key":"nodes.utils.approver.outputs.scope"},"whitelist_hit":{"description":"True if action was auto-approved via whitelist","title":"Whitelist Hit","type":"boolean","x-i18n-key":"nodes.utils.approver.outputs.whitelist_hit"}},"required":["approved","outcome","request_id","whitelist_hit"],"title":"ApproverOutput","type":"object","x-collapsed-visible":["action_name","risk_level"],"x-field-order":["approved","outcome","whitelist_hit","scope","reason","request_id"]},"builtin":true,"i18nKeyPrefix":"nodes.utils.approver"},{"typeId":"io/read_file","name":"Read File","category":"io","description":"Read file content from disk as plain text, can connect to LLM system_prompt or user_message ports. Useful for injecting reference documents, config files, etc.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"file_path":{"description":"Absolute or relative path of the file to read","title":"File Path","type":"string","x-control":"file","x-i18n-key":"nodes.io.read_file.inputs.file_path"},"max_chars":{"default":100000,"description":"Maximum characters to read, excess is truncated with a notice appended. 0 means no limit. Default 100000.","format":"uint","minimum":0.0,"title":"Max Chars","type":"integer","x-i18n-key":"nodes.io.read_file.inputs.max_chars"},"prefix":{"default":null,"description":"Optional prefix prepended to file content, provides context description for LLM","title":"Prefix","type":["string","null"],"x-i18n-key":"nodes.io.read_file.inputs.prefix"},"suffix":{"default":null,"description":"Optional suffix appended after file content","title":"Suffix","type":["string","null"],"x-i18n-key":"nodes.io.read_file.inputs.suffix"}},"required":["file_path"],"title":"ReadFileInput","type":"object","x-field-order":["file_path","prefix","suffix","max_chars"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"content":{"description":"Plain text content of the file (with prefix/suffix), ready to use","title":"Content","type":"string","x-i18n-key":"nodes.io.read_file.outputs.content"},"error":{"description":"发生错误时的错误信息；成功时为 null","type":["string","null"],"x-i18n-key":"nodes.io.read_file.outputs.error"},"file_path":{"description":"Actual absolute path of the read file","title":"File Path","type":"string","x-i18n-key":"nodes.io.read_file.outputs.file_path"},"total_bytes":{"description":"文件总字节数","format":"uint64","minimum":0.0,"title":"Total Bytes","type":"integer","x-i18n-key":"nodes.io.read_file.outputs.total_bytes"},"truncated":{"description":"内容是否因 max_chars 被截断","type":"boolean","x-i18n-key":"nodes.io.read_file.outputs.truncated"}},"required":["content","file_path","total_bytes","truncated"],"title":"ReadFileOutput","type":"object","x-field-order":["content","file_path","total_bytes","truncated","error"]},"builtin":true,"i18nKeyPrefix":"nodes.io.read_file"},{"typeId":"utils/condition_router","name":"Condition Router","category":"utils","description":"Route by field conditions: supports operator comparison, dot nested path, Schema hint generation, enhanced fallback metadata","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"输入结构","properties":{"branch_fields":{"default":[],"description":"Branch field list (click + to add; each entry auto-generates a corresponding output port)","items":{"properties":{"condition_logic":{"default":"and","description":"Condition combination logic: And (all must match) / Or (any matches). Only used when conditions_json is provided.","enum":["and","or"],"type":"string","x-control":"select"},"conditions_json":{"description":"(Advanced) JSON array of extra conditions: [{\"field_name\":\"x\",\"operator\":\"equals\",\"match_value\":\"y\"},...]. Leave empty to use the single field_name/operator above.","type":"string"},"description":{"description":"Field description (used for Schema hint generation)","type":"string"},"field_name":{"description":"Field path (supports dot notation for nested fields, e.g. action.name)","type":"string"},"match_value":{"description":"Match value (required for Equals/NotEquals/Contains/GreaterThan/LessThan)","type":"string"},"operator":{"default":"truthy","description":"Match operator (default: Truthy)","enum":["truthy","exists","equals","not_equals","contains","greater_than","less_than"],"type":"string","x-control":"select"},"output_name":{"description":"Custom output port display name (e.g. 'Has Tools'). Leave empty for default branch_N naming.","type":"string"}},"type":"object"},"title":"Branch Fields","type":"array","x-dynamic-array":{"allowAdd":true,"allowRemove":true,"maxPorts":20,"minPorts":0,"portPrefix":"branch"},"x-i18n-key":"nodes.utils.condition_router.inputs.branch_fields"},"context":{"additionalProperties":true,"default":null,"description":"Input AgentContext (optional)","title":"Agent Context","type":"object","x-control":"code-editor","x-i18n-key":"nodes.utils.condition_router.inputs.context","x-language":"json","x-port":true,"x-rows":2},"custom_data":{"default":null,"description":"Custom JSON data","title":"Custom Data","type":"string","x-control":"code-editor","x-i18n-key":"nodes.utils.condition_router.inputs.custom_data","x-language":"json","x-rows":2},"fallback_mode":{"default":"fallback_output","description":"FallbackOutput: route to fallback_out (default). None: skip. Output0: route to first branch port.","oneOf":[{"description":"输出到 fallback_out 端口（默认）","enum":["fallback_output"],"type":"string"},{"description":"不输出，下游自动跳过","enum":["none"],"type":"string"},{"description":"输出到第一个分支端口","enum":["output0"],"type":"string"}],"title":"Fallback Mode","x-control":"select","x-i18n-key":"nodes.utils.condition_router.inputs.fallback_mode"},"generate_schema":{"default":false,"description":"Enable auto-generated JSON Schema hint output to schema_hint port (can connect to upstream LLM's system_prompt)","title":"Generate Schema","type":"boolean","x-i18n-key":"nodes.utils.condition_router.inputs.generate_schema"},"match_policy":{"default":"all","description":"First: stop at first match. All: output all matched branches (default)","oneOf":[{"description":"仅输出第一个命中的分支","enum":["first"],"type":"string"},{"description":"所有命中的分支都输出（默认）","enum":["all"],"type":"string"}],"title":"Match Policy","x-control":"select","x-i18n-key":"nodes.utils.condition_router.inputs.match_policy"},"mode":{"default":"advanced","description":"Simple (If: one rule, True/False) or Advanced (Switch: multi-rule, multi-output)","oneOf":[{"description":"If 模式：单条件，True / False 输出","enum":["simple"],"type":"string"},{"description":"Switch 模式：多规则多输出（默认，兼容旧行为）","enum":["advanced"],"type":"string"}],"title":"Mode","x-control":"select","x-i18n-key":"nodes.utils.condition_router.inputs.mode"},"payload_source":{"default":"response","description":"Select data extraction source","oneOf":[{"description":"从 response 字段解析 JSON","enum":["response"],"type":"string"},{"description":"从完整 context 序列化为 JSON","enum":["context"],"type":"string"},{"description":"从 custom_data 字段取值","enum":["custom"],"type":"string"}],"title":"Payload Source","x-control":"select","x-i18n-key":"nodes.utils.condition_router.inputs.payload_source"},"response":{"default":"","description":"LLM response text (JSON format)","maxLength":200000,"title":"Response","type":"string","x-control":"code-editor","x-i18n-key":"nodes.utils.condition_router.inputs.response","x-language":"json","x-rows":2},"strict_mode":{"default":false,"description":"Error on JSON parse failure (false routes error reason to fallback output)","title":"Strict Mode","type":"boolean","x-i18n-key":"nodes.utils.condition_router.inputs.strict_mode"}},"title":"ConditionRouterInput","type":"object","x-collapsed-visible":["response","branch_fields"],"x-field-order":["context","response","custom_data","payload_source","branch_fields","strict_mode","generate_schema","mode","match_policy","fallback_mode"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"AgentContext":{"description":"Agent execution context.\n\nContains agent-specific information such as conversation history, iteration count, session tracking, and custom metadata.\n\n# Metadata Conventions\n\nThe `session_id` field is a first-class field for session tracking: - **Initialization**: Should be set by the workflow engine or the first agent node - **Persistence**: Memory nodes (redis/postgres/window) use it for storage keys - **Logging**: LLM and memory nodes include it in tracing logs for debugging - **Propagation**: All nodes should preserve the session_id across the execution chain\n\nAdditional metadata can be stored in the `metadata` HashMap for custom use cases.\n\n# Examples\n\n``` use cheng_nodes::nodes::builtin::agent::base::context::AgentContext; use cheng_llm::types::ChatMessage;\n\nlet context = AgentContext::new() .with_session_id(\"user123_conversation_456\") .with_history(vec![ChatMessage::user(\"Hello\")]) .with_max_iterations(5); ```","properties":{"history":{"default":[],"description":"Conversation history (messages exchanged so far)","items":{"$ref":"#/definitions/ChatMessage"},"type":"array"},"iteration":{"default":0,"description":"Current iteration count (for ReAct loops, etc.)","format":"uint","minimum":0.0,"type":"integer"},"max_iterations":{"default":10,"description":"Maximum iterations allowed","format":"uint","minimum":0.0,"type":"integer"},"metadata":{"additionalProperties":true,"default":{},"description":"Custom metadata (for extensibility)\n\nUse this for additional context that doesn't fit into standard fields. Examples: user preferences, workflow-specific data, feature flags.","type":"object"},"preview_content":{"description":"预览内容（所有消息合并后的纯文本，供预览节点直接展示）\n\n由合并节点（ContextMergeNode）等聚合节点填写，优先于 history 展示。","type":["string","null"]},"session_id":{"default":"session_c92fd50a-0c24-4b5c-8137-0d48aa1a5056","description":"Session identifier for tracking conversations across nodes and storage\n\nThis should be a unique identifier for the conversation session. Format examples: \"user123_session456\", \"uuid-v4\", \"workflow_exec_789\"","type":"string"}},"type":"object"},"ChatContentPart":{"description":"A single rich content part in a message.\n\nOpenAI Chat Completions accepts either plain text or an array of content parts for user messages. This enum keeps the message model backward compatible while making image/audio/file inputs expressible.","oneOf":[{"description":"Plain text content.","properties":{"text":{"type":"string"},"type":{"enum":["text"],"type":"string"}},"required":["text","type"],"type":"object"},{"description":"Image input, either a normal URL or a base64 data URL.","properties":{"image_url":{"$ref":"#/definitions/ImageUrlContent"},"type":{"enum":["image_url"],"type":"string"}},"required":["image_url","type"],"type":"object"},{"description":"Audio input for speech recognition / audio reasoning.","properties":{"input_audio":{"$ref":"#/definitions/InputAudioContent"},"type":{"enum":["input_audio"],"type":"string"}},"required":["input_audio","type"],"type":"object"},{"description":"File input for supported document reasoning models.","properties":{"file":{"$ref":"#/definitions/FileContent"},"type":{"enum":["file"],"type":"string"}},"required":["file","type"],"type":"object"}]},"ChatMessage":{"description":"A single message in a conversation.\n\n# Examples\n\n``` use cheng_llm::types::ChatMessage;\n\nlet system_msg = ChatMessage::system(\"You are a helpful assistant.\"); let user_msg = ChatMessage::user(\"What is Rust?\"); let assistant_msg = ChatMessage::assistant(\"Rust is a systems programming language.\"); ```","properties":{"content":{"type":"string"},"parts":{"description":"Optional rich content parts for multimodal providers.\n\nWhen present, `content` is treated as the leading text prompt and the parts are serialized as the provider-specific content array.","items":{"$ref":"#/definitions/ChatContentPart"},"type":["array","null"]},"role":{"$ref":"#/definitions/Role"}},"required":["content","role"],"type":"object"},"FileContent":{"description":"File input payload for OpenAI-style chat content parts.","properties":{"file_data":{"type":["string","null"]},"file_id":{"type":["string","null"]},"filename":{"type":["string","null"]}},"type":"object"},"ImageUrlContent":{"description":"Image input payload for OpenAI-style chat content parts.","properties":{"detail":{"type":["string","null"]},"url":{"type":"string"}},"required":["url"],"type":"object"},"InputAudioContent":{"description":"Audio input payload for OpenAI-style chat content parts.","properties":{"data":{"type":"string"},"format":{"type":"string"}},"required":["data","format"],"type":"object"},"Role":{"description":"Message role in a conversation.","enum":["system","user","assistant"],"type":"string"}},"description":"输出结构","properties":{"branch_outputs":{"description":"Branch output list, corresponding 1:1 with branch_fields (AgentContext on match, null on miss)","title":"Branch Outputs","type":"array","x-i18n-key":"nodes.utils.condition_router.outputs.branch_outputs","x-port":true},"context_out":{"anyOf":[{"$ref":"#/definitions/AgentContext"},{"type":"null"}],"description":"Legacy fallback output (use fallback_out instead). Mirrors fallback_out for backward compatibility.","title":"Context Out (Legacy)","x-i18n-key":"nodes.utils.condition_router.outputs.context_out","x-runtime-conditional":true},"fallback_out":{"anyOf":[{"$ref":"#/definitions/AgentContext"},{"type":"null"}],"description":"Fallback output (acts as 'False' in Simple mode). Fires when no branch rule matches. Includes diagnostic metadata.","title":"Fallback Out","x-i18n-key":"nodes.utils.condition_router.outputs.fallback_out","x-runtime-conditional":true},"schema_hint":{"additionalProperties":true,"description":"Auto-generated structured output hint (can connect to upstream LLM node's system_prompt port)","title":"JSON Schema","type":"object","x-i18n-key":"nodes.utils.condition_router.outputs.schema_hint","x-port":true}},"required":["branch_outputs","context_out","fallback_out","schema_hint"],"title":"ConditionRouterOutput","type":"object","x-collapsed-visible":["fallback_out","context_out","branch_outputs"],"x-field-order":["branch_outputs","fallback_out","context_out","schema_hint"]},"builtin":true,"i18nKeyPrefix":"nodes.utils.condition_router"},{"typeId":"rag/retriever","name":"Knowledge Retriever","category":"rag","description":"Retrieve relevant documents from vector database (economy/power/ultimate modes)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Retriever node input","properties":{"document_filter":{"default":null,"description":"List of document IDs to limit retrieval scope (optional)","items":{"type":"string"},"title":"Document Filter","type":["array","null"],"x-i18n-key":"nodes.rag.retriever.inputs.document_filter"},"embedding_config":{"additionalProperties":true,"description":"Embedding configuration object from config node","title":"Embedding Config","type":"object","x-control":"text","x-i18n-key":"nodes.rag.retriever.inputs.embedding_config","x-port":true},"kb_id":{"description":"Target knowledge base (collection resolved from DB, workspace-validated)","title":"Knowledge Base","type":"string","x-api-endpoint":"/api/v1/workspaces/{workspace_id}/knowledge-bases?limit=200","x-control":"dynamic-select","x-depends-on":"workspace_id","x-i18n-key":"nodes.rag.retriever.inputs.kb_id"},"limit":{"default":null,"description":"Maximum number of results to return","format":"uint","minimum":0.0,"title":"Result Limit","type":["integer","null"],"x-i18n-key":"nodes.rag.retriever.inputs.limit"},"llm_config":{"additionalProperties":true,"default":null,"description":"LLM configuration object from config node (optional, for HyDE)","title":"LLM Config","type":"object","x-control":"text","x-i18n-key":"nodes.rag.retriever.inputs.llm_config","x-port":true},"qdrant_config":{"additionalProperties":true,"description":"Qdrant configuration object from config node","title":"Qdrant Config","type":"object","x-control":"text","x-i18n-key":"nodes.rag.retriever.inputs.qdrant_config","x-port":true},"query":{"description":"Query text for retrieval (accepts string or ChatContext)","title":"Query Text","type":"string","x-i18n-key":"nodes.rag.retriever.inputs.query"},"retrieval_mode":{"default":null,"description":"Select retrieval strategy","title":"Retrieval Mode","type":"string","x-control":"select","x-default":"economy","x-i18n-key":"nodes.rag.retriever.inputs.retrieval_mode","x-options":[{"description":"BM25 + child_vec (fast, low cost)","label":"Economy","value":"economy"},{"description":"Parent pre-filter + child_vec + BM25 + RRF (balanced)","label":"Power","value":"power"},{"description":"HyDE + Contextual + Reranker (best quality)","label":"Ultimate","value":"ultimate"}]},"workspace_id":{"description":"Target workspace (required for permission validation)","title":"Workspace ID","type":"string","x-api-endpoint":"/api/v1/workspaces?limit=200","x-cache-key":"static_select:/api/v1/workspaces?limit=200","x-control":"dynamic-select","x-i18n-key":"nodes.rag.retriever.inputs.workspace_id"}},"required":["embedding_config","kb_id","qdrant_config","query","workspace_id"],"title":"RetrieverInput","type":"object","x-collapsed-visible":["workspace_id","kb_id","qdrant_config","query","embedding_config","llm_config"],"x-field-order":["workspace_id","kb_id","qdrant_config","query","retrieval_mode","limit","embedding_config","llm_config","document_filter"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"AgentContext":{"description":"Agent execution context.\n\nContains agent-specific information such as conversation history, iteration count, session tracking, and custom metadata.\n\n# Metadata Conventions\n\nThe `session_id` field is a first-class field for session tracking: - **Initialization**: Should be set by the workflow engine or the first agent node - **Persistence**: Memory nodes (redis/postgres/window) use it for storage keys - **Logging**: LLM and memory nodes include it in tracing logs for debugging - **Propagation**: All nodes should preserve the session_id across the execution chain\n\nAdditional metadata can be stored in the `metadata` HashMap for custom use cases.\n\n# Examples\n\n``` use cheng_nodes::nodes::builtin::agent::base::context::AgentContext; use cheng_llm::types::ChatMessage;\n\nlet context = AgentContext::new() .with_session_id(\"user123_conversation_456\") .with_history(vec![ChatMessage::user(\"Hello\")]) .with_max_iterations(5); ```","properties":{"history":{"default":[],"description":"Conversation history (messages exchanged so far)","items":{"$ref":"#/definitions/ChatMessage"},"type":"array"},"iteration":{"default":0,"description":"Current iteration count (for ReAct loops, etc.)","format":"uint","minimum":0.0,"type":"integer"},"max_iterations":{"default":10,"description":"Maximum iterations allowed","format":"uint","minimum":0.0,"type":"integer"},"metadata":{"additionalProperties":true,"default":{},"description":"Custom metadata (for extensibility)\n\nUse this for additional context that doesn't fit into standard fields. Examples: user preferences, workflow-specific data, feature flags.","type":"object"},"preview_content":{"description":"预览内容（所有消息合并后的纯文本，供预览节点直接展示）\n\n由合并节点（ContextMergeNode）等聚合节点填写，优先于 history 展示。","type":["string","null"]},"session_id":{"default":"session_d7d6c9dc-1886-4bbb-9183-b4e51d15ebed","description":"Session identifier for tracking conversations across nodes and storage\n\nThis should be a unique identifier for the conversation session. Format examples: \"user123_session456\", \"uuid-v4\", \"workflow_exec_789\"","type":"string"}},"type":"object"},"ChatContentPart":{"description":"A single rich content part in a message.\n\nOpenAI Chat Completions accepts either plain text or an array of content parts for user messages. This enum keeps the message model backward compatible while making image/audio/file inputs expressible.","oneOf":[{"description":"Plain text content.","properties":{"text":{"type":"string"},"type":{"enum":["text"],"type":"string"}},"required":["text","type"],"type":"object"},{"description":"Image input, either a normal URL or a base64 data URL.","properties":{"image_url":{"$ref":"#/definitions/ImageUrlContent"},"type":{"enum":["image_url"],"type":"string"}},"required":["image_url","type"],"type":"object"},{"description":"Audio input for speech recognition / audio reasoning.","properties":{"input_audio":{"$ref":"#/definitions/InputAudioContent"},"type":{"enum":["input_audio"],"type":"string"}},"required":["input_audio","type"],"type":"object"},{"description":"File input for supported document reasoning models.","properties":{"file":{"$ref":"#/definitions/FileContent"},"type":{"enum":["file"],"type":"string"}},"required":["file","type"],"type":"object"}]},"ChatMessage":{"description":"A single message in a conversation.\n\n# Examples\n\n``` use cheng_llm::types::ChatMessage;\n\nlet system_msg = ChatMessage::system(\"You are a helpful assistant.\"); let user_msg = ChatMessage::user(\"What is Rust?\"); let assistant_msg = ChatMessage::assistant(\"Rust is a systems programming language.\"); ```","properties":{"content":{"type":"string"},"parts":{"description":"Optional rich content parts for multimodal providers.\n\nWhen present, `content` is treated as the leading text prompt and the parts are serialized as the provider-specific content array.","items":{"$ref":"#/definitions/ChatContentPart"},"type":["array","null"]},"role":{"$ref":"#/definitions/Role"}},"required":["content","role"],"type":"object"},"FileContent":{"description":"File input payload for OpenAI-style chat content parts.","properties":{"file_data":{"type":["string","null"]},"file_id":{"type":["string","null"]},"filename":{"type":["string","null"]}},"type":"object"},"ImageUrlContent":{"description":"Image input payload for OpenAI-style chat content parts.","properties":{"detail":{"type":["string","null"]},"url":{"type":"string"}},"required":["url"],"type":"object"},"InputAudioContent":{"description":"Audio input payload for OpenAI-style chat content parts.","properties":{"data":{"type":"string"},"format":{"type":"string"}},"required":["data","format"],"type":"object"},"RetrievedDocOutput":{"description":"Retrieved document in output","properties":{"chunk_index":{"description":"Chunk index","format":"int64","title":"Chunk Index","type":["integer","null"]},"context":{"description":"Context description (if available)","type":["string","null"]},"document_id":{"description":"Parent document ID","title":"Document Id","type":["string","null"]},"id":{"description":"Document chunk ID","type":"string"},"retrieval_method":{"description":"Retrieval method used","title":"Retrieval Method","type":["string","null"]},"score":{"description":"Relevance score","format":"float","type":"number"},"text":{"description":"Chunk text content","type":"string"}},"required":["id","score","text"],"type":"object"},"Role":{"description":"Message role in a conversation.","enum":["system","user","assistant"],"type":"string"},"TokenUsageOutput":{"description":"Token usage output","properties":{"embedding_tokens":{"description":"Embedding tokens","format":"uint32","minimum":0.0,"title":"Embedding Tokens","type":"integer"},"hyde_tokens":{"description":"HyDE tokens (if used)","format":"uint32","minimum":0.0,"title":"Hyde Tokens","type":"integer"},"reranker_tokens":{"description":"Reranker tokens (if used)","format":"uint32","minimum":0.0,"title":"Reranker Tokens","type":"integer"},"total_tokens":{"description":"Total tokens","format":"uint32","minimum":0.0,"title":"Total Tokens","type":"integer"}},"required":["embedding_tokens","hyde_tokens","reranker_tokens","total_tokens"],"type":"object"}},"description":"Retriever node output","properties":{"collection_name":{"description":"Collection name retrieved from","title":"Collection Name","type":"string","x-i18n-key":"nodes.rag.retriever.outputs.collection_name"},"count":{"description":"Number of results returned","format":"uint","minimum":0.0,"title":"Count","type":"integer","x-i18n-key":"nodes.rag.retriever.outputs.count"},"documents":{"description":"List of retrieved documents","items":{"$ref":"#/definitions/RetrievedDocOutput"},"title":"Documents","type":"array","x-i18n-key":"nodes.rag.retriever.outputs.documents"},"has_results":{"description":"True when at least one document was retrieved","title":"Has Results","type":"boolean","x-i18n-key":"nodes.rag.retriever.outputs.has_results"},"latency_ms":{"description":"Retrieval latency in milliseconds","format":"uint64","minimum":0.0,"title":"Latency Ms","type":"integer","x-i18n-key":"nodes.rag.retriever.outputs.latency_ms"},"query":{"description":"Query text used for retrieval","title":"Query","type":"string","x-i18n-key":"nodes.rag.retriever.outputs.query"},"retrieval_mode":{"description":"Retrieval mode used","title":"Retrieval Mode","type":"string","x-i18n-key":"nodes.rag.retriever.outputs.retrieval_mode"},"summary_input":{"anyOf":[{"$ref":"#/definitions/AgentContext"},{"type":"null"}],"description":"Lean AgentContext for downstream LLM summarization (conditional: absent when no results)","title":"Summary Input","x-i18n-key":"nodes.rag.retriever.outputs.summary_input","x-runtime-conditional":true},"token_usage":{"allOf":[{"$ref":"#/definitions/TokenUsageOutput"}],"description":"Estimated token usage","title":"Token Usage","x-i18n-key":"nodes.rag.retriever.outputs.token_usage"}},"required":["collection_name","count","documents","has_results","latency_ms","query","retrieval_mode","token_usage"],"title":"RetrieverOutput","type":"object","x-collapsed-visible":["query","documents","has_results","summary_input"],"x-field-order":["documents","count","retrieval_mode","query","latency_ms","collection_name","token_usage","has_results","summary_input"]},"builtin":true,"i18nKeyPrefix":"nodes.rag.retriever"},{"typeId":"workspace/knowledge_base","name":"Knowledge Base","category":"workspace","description":"Select, list, or create knowledge bases in a workspace","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"description":{"default":null,"description":"Knowledge base description (create mode, optional)","title":"Description","type":["string","null"],"x-i18n-key":"nodes.workspace.knowledge_base.inputs.description"},"embedding_model":{"default":null,"description":"Embedding model name (create mode, optional)","title":"Embedding Model","type":["string","null"],"x-i18n-key":"nodes.workspace.knowledge_base.inputs.embedding_model"},"kb_id":{"default":null,"description":"Knowledge base to select (select mode)","type":"string","x-api-endpoint":"/api/v1/workspaces/{workspace_id}/knowledge-bases?limit=200","x-control":"dynamic-select","x-depends-on":"workspace_id","x-i18n-key":"nodes.workspace.knowledge_base.inputs.kb_id"},"mode":{"default":"select","description":"select: Select existing KB; list: List all KBs in workspace; create: Create new KB","enum":["select","list","create"],"options":[{"label":"select","value":"select"},{"label":"list","value":"list"},{"label":"create","value":"create"}],"type":"string","x-control":"select","x-i18n-key":"nodes.workspace.knowledge_base.inputs.mode"},"name":{"default":null,"description":"New knowledge base name (create mode)","title":"Name","type":["string","null"],"x-i18n-key":"nodes.workspace.knowledge_base.inputs.name"},"workspace_id":{"description":"Target workspace","type":"string","x-api-endpoint":"/api/v1/workspaces?limit=200","x-cache-key":"static_select:/api/v1/workspaces?limit=200","x-control":"dynamic-select","x-i18n-key":"nodes.workspace.knowledge_base.inputs.workspace_id"}},"required":["workspace_id"],"title":"KnowledgeBaseNodeInput","type":"object","x-field-order":["mode","workspace_id","kb_id","name","description","embedding_model"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"KnowledgeBaseInfo":{"properties":{"collection_name":{"type":"string"},"document_count":{"format":"int64","type":"integer"},"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"workspace_id":{"type":"string"}},"required":["collection_name","document_count","id","name","status","workspace_id"],"type":"object"}},"properties":{"error":{"description":"Error message if the operation failed.","type":["string","null"],"x-i18n-key":"nodes.workspace.knowledge_base.outputs.error"},"kb_id":{"description":"Knowledge base ID (for direct connection)","title":"Knowledge Base ID","type":["string","null"],"x-i18n-key":"nodes.workspace.knowledge_base.outputs.kb_id"},"knowledge_base":{"anyOf":[{"$ref":"#/definitions/KnowledgeBaseInfo"},{"type":"null"}],"description":"Single knowledge base info (select/create modes).","title":"Knowledge Base","x-i18n-key":"nodes.workspace.knowledge_base.outputs.knowledge_base"},"knowledge_bases":{"description":"List of knowledge bases (list mode).","items":{"$ref":"#/definitions/KnowledgeBaseInfo"},"title":"Knowledge Bases","type":["array","null"],"x-i18n-key":"nodes.workspace.knowledge_base.outputs.knowledge_bases"},"success":{"description":"Whether the operation succeeded.","type":"boolean","x-i18n-key":"nodes.workspace.knowledge_base.outputs.success"},"workspace_id":{"description":"Workspace ID (for direct connection)","title":"Workspace ID","type":["string","null"],"x-i18n-key":"nodes.workspace.knowledge_base.outputs.workspace_id"}},"required":["success"],"title":"KnowledgeBaseNodeOutput","type":"object","x-collapsed-visible":["success","knowledge_base","error"],"x-field-order":["success","workspace_id","kb_id","knowledge_base","knowledge_bases","error"]},"builtin":true,"i18nKeyPrefix":"nodes.workspace.knowledge_base"},{"typeId":"io/speech_to_text","name":"Speech To Text","category":"io","description":"Transcribe audio files to text using OpenAI Whisper API, supports mp3/wav/m4a/ogg/flac/webm formats. Accepts local file path or Base64 content input.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"base64_content":{"default":null,"description":"Base64 encoded audio file content (mutually exclusive with file_path)","title":"Base64 Content","type":"string","x-control":"textarea","x-i18n-key":"nodes.io.speech_to_text.inputs.base64_content"},"file_path":{"default":null,"description":"Local absolute path of the audio file on server (mutually exclusive with base64_content)","title":"File Path","type":["string","null"],"x-i18n-key":"nodes.io.speech_to_text.inputs.file_path"},"filename":{"default":null,"description":"Filename, required when using base64_content (e.g. audio.mp3)","title":"Filename","type":["string","null"],"x-i18n-key":"nodes.io.speech_to_text.inputs.filename"},"language":{"default":null,"description":"Audio language (ISO-639-1, e.g. zh, en), leave empty for auto-detection","title":"Language","type":["string","null"],"x-i18n-key":"nodes.io.speech_to_text.inputs.language"},"llm_config":{"additionalProperties":true,"description":"LLM config (connect to LLM config node for API Key, Endpoint and model)","title":"LLM Config","type":"object","x-control":"text","x-i18n-key":"nodes.io.speech_to_text.inputs.llm_config","x-port":true},"prompt":{"default":null,"description":"Prompt (optional), helps model recognize specific terms or speaking style","title":"Prompt","type":"string","x-control":"textarea","x-i18n-key":"nodes.io.speech_to_text.inputs.prompt"},"response_format":{"default":"text","description":"Output format: text (plain text) / json / verbose_json / srt / vtt","oneOf":[{"description":"仅返回纯文本转录","enum":["text"],"type":"string"},{"description":"返回 JSON（含 segments、duration 等）","enum":["json"],"type":"string"},{"description":"返回带时间戳的详细 JSON","enum":["verbosejson"],"type":"string"},{"description":"SubRip 字幕格式","enum":["srt"],"type":"string"},{"description":"WebVTT 字幕格式","enum":["vtt"],"type":"string"}],"title":"Response Format","x-control":"select","x-i18n-key":"nodes.io.speech_to_text.inputs.response_format"},"temperature":{"default":0.0,"description":"Sampling temperature 0.0~1.0, 0 means most deterministic output","format":"float","title":"Temperature","type":"number","x-i18n-key":"nodes.io.speech_to_text.inputs.temperature"}},"required":["llm_config"],"title":"SpeechToTextInput","type":"object","x-collapsed-visible":["base64_content","filename"],"x-field-order":["llm_config","file_path","base64_content","filename","language","prompt","response_format","temperature"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"char_count":{"description":"Character count of the transcribed text","format":"uint","minimum":0.0,"title":"Char Count","type":"integer","x-i18n-key":"nodes.io.speech_to_text.outputs.char_count"},"detected_language":{"description":"Detected language code (only available in verbose_json format)","title":"Detected Language","type":["string","null"],"x-i18n-key":"nodes.io.speech_to_text.outputs.detected_language"},"duration_seconds":{"description":"Audio duration in seconds (only available in verbose_json format)","format":"double","title":"Duration Seconds","type":["number","null"],"x-i18n-key":"nodes.io.speech_to_text.outputs.duration_seconds"},"text":{"description":"Transcribed text content","title":"Text","type":"string","x-i18n-key":"nodes.io.speech_to_text.outputs.text"}},"required":["char_count","text"],"title":"SpeechToTextOutput","type":"object","x-collapsed-visible":["text"],"x-field-order":["text","detected_language","duration_seconds","char_count"]},"builtin":true,"i18nKeyPrefix":"nodes.io.speech_to_text"},{"typeId":"tools/view_file","name":"View File","category":"tools","description":"Read file content within specified line range. Always returns total_lines and eof marker to help LLM perceive file full picture and prevent hallucination. Max 500 lines per request.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"end_line":{"description":"End line number (inclusive), default min(start_line+499, total_lines)","format":"uint32","minimum":0.0,"title":"End Line","type":["integer","null"],"x-i18n-key":"nodes.tools.view_file.inputs.end_line"},"file_path":{"description":"Absolute file path to view","title":"File Path","type":"string","x-i18n-key":"nodes.tools.view_file.inputs.file_path"},"start_line":{"description":"Start line number (1-indexed), default 1","format":"uint32","minimum":0.0,"title":"Start Line","type":["integer","null"],"x-i18n-key":"nodes.tools.view_file.inputs.start_line"}},"required":["file_path"],"title":"ViewFileInput","type":"object"},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"content":{"description":"带行号前缀的文件内容（格式：\"  42\\t内容\"）","type":"string","x-i18n-key":"nodes.tools.view_file.outputs.content"},"encoding":{"description":"编码（固定 \"utf-8\"）","type":"string","x-i18n-key":"nodes.tools.view_file.outputs.encoding"},"end_line":{"description":"实际结束行","format":"uint32","minimum":0.0,"title":"End Line","type":"integer","x-i18n-key":"nodes.tools.view_file.outputs.end_line"},"eof":{"description":"是否已到达文件末尾","type":"boolean","x-i18n-key":"nodes.tools.view_file.outputs.eof"},"error":{"description":"错误信息（存在时其他字段为空/零值）","type":["string","null"],"x-i18n-key":"nodes.tools.view_file.outputs.error"},"file_path":{"description":"canonicalize 后的绝对路径","title":"File Path","type":"string","x-i18n-key":"nodes.tools.view_file.outputs.file_path"},"start_line":{"description":"实际起始行","format":"uint32","minimum":0.0,"title":"Start Line","type":"integer","x-i18n-key":"nodes.tools.view_file.outputs.start_line"},"total_bytes":{"description":"文件总字节数","format":"uint64","minimum":0.0,"title":"Total Bytes","type":"integer","x-i18n-key":"nodes.tools.view_file.outputs.total_bytes"},"total_lines":{"description":"文件总行数","format":"uint32","minimum":0.0,"title":"Total Lines","type":"integer","x-i18n-key":"nodes.tools.view_file.outputs.total_lines"},"truncated":{"description":"是否因超出 500 行上限而截断","type":"boolean","x-i18n-key":"nodes.tools.view_file.outputs.truncated"}},"required":["content","encoding","end_line","eof","file_path","start_line","total_bytes","total_lines","truncated"],"title":"ViewFileOutput","type":"object","x-collapsed-visible":["content"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.view_file"},{"typeId":"table/apply_record_ops","name":"Apply Table Operations","category":"table","description":"Batch apply table record insert, update, delete operations","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"CellValue":{"description":"Cell value - tagged enum for storing different data types in record cells.\n\nEach variant corresponds to a column type. Values are stored as JSONB with a discriminator tag for type safety.\n\n# JSON Format\n\n```json { \"type\": \"text\", \"value\": \"Hello World\" } { \"type\": \"number\", \"value\": 42.5 } { \"type\": \"checkbox\", \"value\": true } { \"type\": \"select\", \"value\": \"option_id\" } { \"type\": \"date\", \"value\": \"2026-01-06\" } { \"type\": \"null\" } ```","oneOf":[{"description":"Empty cell (universal clear).","properties":{"type":{"enum":["null"],"type":"string"}},"required":["type"],"type":"object"},{"description":"Text value.","properties":{"type":{"enum":["text"],"type":"string"},"value":{"type":"string"}},"required":["type","value"],"type":"object"},{"description":"Numeric value (validated: no NaN/Inf, max 10 decimals).","properties":{"type":{"enum":["number"],"type":"string"},"value":{"format":"double","type":"number"}},"required":["type","value"],"type":"object"},{"description":"Boolean checkbox value.","properties":{"type":{"enum":["checkbox"],"type":"string"},"value":{"type":"boolean"}},"required":["type","value"],"type":"object"},{"description":"Single-select option ID.","properties":{"type":{"enum":["select"],"type":"string"},"value":{"type":["string","null"]}},"required":["type"],"type":"object"},{"description":"Date value in YYYY-MM-DD format.","properties":{"type":{"enum":["date"],"type":"string"},"value":{"type":["string","null"]}},"required":["type"],"type":"object"}]},"InsertPosition":{"description":"Insert position for new records.","oneOf":[{"description":"Insert at the beginning of the table.","enum":["first"],"type":"string"},{"description":"Insert at the end of the table (default).","enum":["last"],"type":"string"},{"additionalProperties":false,"description":"Insert before a specific record.","properties":{"before":{"properties":{"reference_id":{"description":"Reference record ID to insert before.","type":"string"}},"required":["reference_id"],"type":"object"}},"required":["before"],"type":"object"},{"additionalProperties":false,"description":"Insert after a specific record.","properties":{"after":{"properties":{"reference_id":{"description":"Reference record ID to insert after.","type":"string"}},"required":["reference_id"],"type":"object"}},"required":["after"],"type":"object"}]},"RecordOperation":{"description":"A single record operation.","oneOf":[{"description":"Insert a new record.","properties":{"data":{"additionalProperties":{"$ref":"#/definitions/CellValue"},"description":"Record data as column_id -> CellValue.","type":"object"},"op":{"enum":["insert"],"type":"string"},"position":{"anyOf":[{"$ref":"#/definitions/InsertPosition"},{"type":"null"}],"default":null,"description":"Position to insert the record. Defaults to \"last\" (append)."}},"required":["data","op"],"type":"object"},{"description":"Update an existing record.","properties":{"data":{"additionalProperties":{"$ref":"#/definitions/CellValue"},"description":"Columns to update (PATCH semantics).","type":"object"},"id":{"description":"Record ID to update.","type":"string"},"op":{"enum":["update"],"type":"string"}},"required":["data","id","op"],"type":"object"},{"description":"Delete a record.","properties":{"id":{"description":"Record ID to delete.","type":"string"},"op":{"enum":["delete"],"type":"string"}},"required":["id","op"],"type":"object"}]}},"description":"Input for TableApplyRecordOpsNode","properties":{"operations":{"description":"List of operations to apply.","items":{"$ref":"#/definitions/RecordOperation"},"type":"array","x-i18n-key":"nodes.table.apply_record_ops.inputs.operations"},"summary":{"default":null,"description":"Optional summary of changes (for logging/audit).","type":["string","null"],"x-i18n-key":"nodes.table.apply_record_ops.inputs.summary"},"table_id":{"description":"Table ID to apply operations to.","title":"Table Id","type":"string","x-i18n-key":"nodes.table.apply_record_ops.inputs.table_id"}},"required":["operations","table_id"],"title":"TableApplyRecordOpsInput","type":"object","x-field-order":["table_id","operations","summary"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"RecordOpResult":{"description":"Result of a single record operation.","properties":{"error":{"description":"Error message if failed.","type":["string","null"]},"index":{"description":"Operation index (0-based).","format":"uint","minimum":0.0,"type":"integer"},"op_type":{"description":"Operation type.","type":"string"},"record_id":{"description":"Affected record ID (for insert, this is the new ID).","type":["string","null"]},"success":{"description":"Whether this operation succeeded.","type":"boolean"}},"required":["index","op_type","success"],"type":"object"}},"description":"Output from TableApplyRecordOpsNode","properties":{"error":{"description":"Error message if the overall operation failed.","type":["string","null"],"x-i18n-key":"nodes.table.apply_record_ops.outputs.error"},"records_affected":{"description":"Number of records affected.","format":"uint","minimum":0.0,"title":"Records Affected","type":"integer","x-i18n-key":"nodes.table.apply_record_ops.outputs.records_affected"},"records_deleted":{"description":"Number of records deleted.","format":"uint","minimum":0.0,"title":"Records Deleted","type":"integer","x-i18n-key":"nodes.table.apply_record_ops.outputs.records_deleted"},"records_inserted":{"description":"Number of records inserted.","format":"uint","minimum":0.0,"title":"Records Inserted","type":"integer","x-i18n-key":"nodes.table.apply_record_ops.outputs.records_inserted"},"records_updated":{"description":"Number of records updated.","format":"uint","minimum":0.0,"title":"Records Updated","type":"integer","x-i18n-key":"nodes.table.apply_record_ops.outputs.records_updated"},"results":{"description":"Results for each operation.","items":{"$ref":"#/definitions/RecordOpResult"},"type":"array","x-i18n-key":"nodes.table.apply_record_ops.outputs.results"},"success":{"description":"Whether all operations were successful.","type":"boolean","x-i18n-key":"nodes.table.apply_record_ops.outputs.success"},"summary":{"description":"Summary of changes.","type":["string","null"],"x-i18n-key":"nodes.table.apply_record_ops.outputs.summary"},"table_id":{"description":"Table ID.","title":"Table Id","type":"string","x-i18n-key":"nodes.table.apply_record_ops.outputs.table_id"}},"required":["records_affected","records_deleted","records_inserted","records_updated","results","success","table_id"],"title":"TableApplyRecordOpsOutput","type":"object","x-collapsed-visible":["summary"],"x-field-order":["success","results","summary","table_id","records_affected","records_inserted","records_updated","records_deleted","error"]},"builtin":true,"i18nKeyPrefix":"nodes.table.apply_record_ops"},{"typeId":"chat/memory","name":"Chat Memory Node","category":"chat","description":"Manage chat conversation history, supports window strategy and database persistence","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"PersistenceMode":{"description":"持久化模式\n\n控制聊天历史的存储方式： - Memory: 内存中管理（默认），历史由前端维护 - Database: 从数据库加载历史，支持持久化","oneOf":[{"description":"内存模式 - 历史由前端维护，不持久化","enum":["memory"],"type":"string"},{"description":"数据库模式 - 从 MessageRepository 加载历史，追加新消息","enum":["database"],"type":"string"}]},"WindowStrategy":{"description":"窗口记忆策略","oneOf":[{"description":"不应用窗口(保留所有消息)","enum":["none"],"type":"string"},{"description":"截断策略(保留最近 N 条)","enum":["truncate"],"type":"string"},{"description":"总结策略(总结旧消息,保留最近 N 条)","enum":["summarize"],"type":"string"}]}},"description":"Chat 记忆节点输入","properties":{"conversation_id":{"default":null,"description":"Conversation ID, in Database mode loads history from database","title":"Conversation ID","type":["string","null"],"x-i18n-key":"nodes.chat.memory.inputs.conversation_id"},"enabled":{"default":false,"description":"Enable window memory","title":"Enabled","type":"boolean","x-i18n-key":"nodes.chat.memory.inputs.enabled"},"persistence_mode":{"allOf":[{"$ref":"#/definitions/PersistenceMode"}],"default":"memory","description":"Persistence mode: memory or database","title":"Persistence Mode","x-i18n-key":"nodes.chat.memory.inputs.persistence_mode"},"strategy":{"allOf":[{"$ref":"#/definitions/WindowStrategy"}],"default":"none","description":"Window processing strategy","title":"Strategy","x-i18n-key":"nodes.chat.memory.inputs.strategy"},"user_message":{"description":"This turn's user input text (from chat/input.user_message)","title":"User Message","type":"string","x-i18n-key":"nodes.chat.memory.inputs.user_message","x-port":true},"user_message_rich":{"additionalProperties":true,"default":null,"description":"Structured user message with multimodal parts","title":"User Message Rich","type":"object","x-i18n-key":"nodes.chat.memory.inputs.user_message_rich","x-port":true},"window_size":{"default":50,"description":"Maximum messages to retain","format":"uint","minimum":0.0,"title":"Window Size","type":"integer","x-i18n-key":"nodes.chat.memory.inputs.window_size"},"workspace_id":{"default":null,"description":"Workspace ID (UUID string), required when creating new conversation","title":"Workspace ID","type":["string","null"],"x-i18n-key":"nodes.chat.memory.inputs.workspace_id"}},"required":["user_message"],"title":"ChatMemoryNodeInput","type":"object","x-field-order":["user_message","user_message_rich","window_size","strategy","enabled","persistence_mode","conversation_id","workspace_id"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ChatContentPart":{"description":"A single rich content part in a message.\n\nOpenAI Chat Completions accepts either plain text or an array of content parts for user messages. This enum keeps the message model backward compatible while making image/audio/file inputs expressible.","oneOf":[{"description":"Plain text content.","properties":{"text":{"type":"string"},"type":{"enum":["text"],"type":"string"}},"required":["text","type"],"type":"object"},{"description":"Image input, either a normal URL or a base64 data URL.","properties":{"image_url":{"$ref":"#/definitions/ImageUrlContent"},"type":{"enum":["image_url"],"type":"string"}},"required":["image_url","type"],"type":"object"},{"description":"Audio input for speech recognition / audio reasoning.","properties":{"input_audio":{"$ref":"#/definitions/InputAudioContent"},"type":{"enum":["input_audio"],"type":"string"}},"required":["input_audio","type"],"type":"object"},{"description":"File input for supported document reasoning models.","properties":{"file":{"$ref":"#/definitions/FileContent"},"type":{"enum":["file"],"type":"string"}},"required":["file","type"],"type":"object"}]},"ChatMessage":{"description":"A single message in a conversation.\n\n# Examples\n\n``` use cheng_llm::types::ChatMessage;\n\nlet system_msg = ChatMessage::system(\"You are a helpful assistant.\"); let user_msg = ChatMessage::user(\"What is Rust?\"); let assistant_msg = ChatMessage::assistant(\"Rust is a systems programming language.\"); ```","properties":{"content":{"type":"string"},"parts":{"description":"Optional rich content parts for multimodal providers.\n\nWhen present, `content` is treated as the leading text prompt and the parts are serialized as the provider-specific content array.","items":{"$ref":"#/definitions/ChatContentPart"},"type":["array","null"]},"role":{"$ref":"#/definitions/Role"}},"required":["content","role"],"type":"object"},"FileContent":{"description":"File input payload for OpenAI-style chat content parts.","properties":{"file_data":{"type":["string","null"]},"file_id":{"type":["string","null"]},"filename":{"type":["string","null"]}},"type":"object"},"ImageUrlContent":{"description":"Image input payload for OpenAI-style chat content parts.","properties":{"detail":{"type":["string","null"]},"url":{"type":"string"}},"required":["url"],"type":"object"},"InputAudioContent":{"description":"Audio input payload for OpenAI-style chat content parts.","properties":{"data":{"type":"string"},"format":{"type":"string"}},"required":["data","format"],"type":"object"},"MemoryStats":{"description":"记忆处理统计","properties":{"display_count":{"description":"显示消息总数","format":"uint","minimum":0.0,"title":"Display Count","type":"integer"},"history_count_after":{"description":"历史消息总数（处理后）","format":"uint","minimum":0.0,"title":"History Count After","type":"integer"},"history_count_before":{"description":"历史消息总数（处理前）","format":"uint","minimum":0.0,"title":"History Count Before","type":"integer"},"input_count":{"description":"输入消息总数","format":"uint","minimum":0.0,"title":"Input Count","type":"integer"},"truncated_count":{"description":"被截断的消息数","format":"uint","minimum":0.0,"title":"Truncated Count","type":"integer"},"window_applied":{"description":"是否应用了窗口策略","title":"Window Applied","type":"boolean"}},"required":["display_count","history_count_after","history_count_before","input_count","truncated_count","window_applied"],"type":"object"},"MessagePacket":{"description":"消息包 - Chat 系统的核心数据结构","properties":{"hash":{"description":"Message hash (for deduplication and idempotency)","pattern":"^[0-9a-f]{32}$","title":"Hash","type":"string"},"id":{"description":"Unique message ID","title":"ID","type":"string"},"meta":{"additionalProperties":true,"description":"Message metadata","title":"Meta","type":"object"},"msg_type":{"allOf":[{"$ref":"#/definitions/MessageType"}],"description":"Message type (text/image/file/audio, etc.)","title":"Msg Type"},"payload":{"description":"Message content payload","title":"Payload"},"protocol_version":{"description":"Protocol version","title":"Protocol Version","type":"string"},"stream_hint":{"anyOf":[{"$ref":"#/definitions/StreamHint"},{"type":"null"}],"description":"Stream shard info","title":"Stream Hint"},"timestamp":{"description":"Message creation timestamp (Unix ms)","format":"int64","title":"Timestamp","type":"integer"}},"required":["hash","id","meta","msg_type","payload","protocol_version","timestamp"],"type":"object"},"MessageType":{"description":"消息类型","oneOf":[{"description":"纯文本","enum":["text"],"type":"string"},{"description":"图片","enum":["image"],"type":"string"},{"description":"文件","enum":["file"],"type":"string"},{"description":"音频","enum":["audio"],"type":"string"},{"description":"视频","enum":["video"],"type":"string"},{"description":"OCR 识别结果","enum":["ocr_text"],"type":"string"},{"description":"流式分片","enum":["stream"],"type":"string"},{"description":"控制消息（如清屏、状态变更）","enum":["control"],"type":"string"},{"description":"错误消息","enum":["error"],"type":"string"},{"description":"网页快照","enum":["web_snapshot"],"type":"string"},{"description":"系统消息","enum":["system"],"type":"string"}]},"Role":{"description":"Message role in a conversation.","enum":["system","user","assistant"],"type":"string"},"StreamHint":{"description":"流式分片提示","properties":{"chunk_index":{"description":"分片索引（从 0 开始）","format":"uint32","minimum":0.0,"type":"integer"},"group_id":{"description":"所属消息组 ID","type":"string"},"is_final":{"description":"是否为最后一个分片","type":"boolean"}},"required":["chunk_index","group_id","is_final"],"type":"object"}},"description":"Chat 记忆节点输出","properties":{"agent_context":{"additionalProperties":true,"description":"AgentContext wrapper, connectable to agent/llm or agent/react context port","title":"Agent Context","type":"object","x-i18n-key":"nodes.chat.memory.outputs.agent_context","x-port":true},"clean_history_json":{"description":"Clean history before appending current user message (JSON format), for chat/save_reply","title":"Clean History JSON","type":"string","x-i18n-key":"nodes.chat.memory.outputs.clean_history_json","x-port":true},"conversation_id":{"description":"Current conversation ID (always present, downstream nodes only consume, never recreate)","title":"Conversation ID","type":"string","x-i18n-key":"nodes.chat.memory.outputs.conversation_id","x-port":true},"display_messages":{"description":"Processed message list (for frontend display)","items":{"$ref":"#/definitions/MessagePacket"},"title":"Display Messages","type":"array","x-i18n-key":"nodes.chat.memory.outputs.display_messages"},"stats":{"allOf":[{"$ref":"#/definitions/MemoryStats"}],"description":"Processing statistics","title":"Stats","x-i18n-key":"nodes.chat.memory.outputs.stats"},"updated_history":{"description":"Updated complete history messages","items":{"$ref":"#/definitions/ChatMessage"},"title":"Updated History","type":"array","x-i18n-key":"nodes.chat.memory.outputs.updated_history"},"user_message_rich":{"additionalProperties":true,"description":"Structured user message for downstream nodes","title":"User Message Rich","type":"object","x-i18n-key":"nodes.chat.memory.outputs.user_message_rich","x-port":true}},"required":["agent_context","clean_history_json","conversation_id","display_messages","stats","updated_history","user_message_rich"],"title":"ChatMemoryNodeOutput","type":"object","x-collapsed-visible":["agent_context"],"x-field-order":["display_messages","updated_history","user_message_rich","agent_context","conversation_id","clean_history_json","stats"]},"builtin":true,"i18nKeyPrefix":"nodes.chat.memory"},{"typeId":"io/document_to_text","name":"Document To Text","category":"io","description":"Parse PDF, Word, Excel, TXT and other files to plain text, can connect to LLM or RAG nodes. Supports local file path and Base64 content input.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"base64_content":{"default":null,"description":"Base64 encoded file content (mutually exclusive with file_path)","title":"Base64 Content","type":"string","x-control":"textarea","x-i18n-key":"nodes.io.document_to_text.inputs.base64_content"},"file_path":{"default":null,"description":"Local absolute file path on server (mutually exclusive with base64_content)","title":"File Path","type":["string","null"],"x-i18n-key":"nodes.io.document_to_text.inputs.file_path"},"filename":{"default":null,"description":"Filename used to infer format (required when using base64_content)","title":"Filename","type":["string","null"],"x-i18n-key":"nodes.io.document_to_text.inputs.filename"},"max_chars":{"default":0,"description":"Maximum characters to extract, 0 means no limit","format":"uint64","minimum":0.0,"title":"Max Chars","type":"integer","x-control":"number","x-i18n-key":"nodes.io.document_to_text.inputs.max_chars"}},"title":"DocumentToTextInput","type":"object","x-collapsed-visible":["base64_content","filename"],"x-field-order":["file_path","base64_content","filename","max_chars"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"char_count":{"description":"Number of characters extracted","format":"uint","minimum":0.0,"title":"Char Count","type":"integer","x-i18n-key":"nodes.io.document_to_text.outputs.char_count"},"format":{"description":"Detected file format (pdf / docx / xlsx / txt etc.)","title":"Format","type":"string","x-i18n-key":"nodes.io.document_to_text.outputs.format"},"text":{"description":"Extracted plain text content","title":"Text","type":"string","x-i18n-key":"nodes.io.document_to_text.outputs.text"},"truncated":{"description":"Whether content was truncated due to exceeding max_chars","title":"Truncated","type":"boolean","x-i18n-key":"nodes.io.document_to_text.outputs.truncated"}},"required":["char_count","format","text","truncated"],"title":"DocumentToTextOutput","type":"object","x-collapsed-visible":["text"],"x-field-order":["text","char_count","format","truncated"]},"builtin":true,"i18nKeyPrefix":"nodes.io.document_to_text"},{"typeId":"ai/context_merge","name":"Context Merge","category":"agent","description":"Merge AgentContext from multiple input sources, for passing to LLM or output nodes","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"输入结构","properties":{"custom_session_id":{"default":null,"description":"Custom session_id (optional)","maxLength":200,"title":"Custom Session ID","type":["string","null"],"x-i18n-key":"nodes.ai.context_merge.inputs.custom_session_id"},"extra_inputs":{"description":"Extra input sources (click + to add dynamically)","title":"Extra Inputs","type":"array","x-control":"text","x-dynamic-array":{"allowAdd":true,"allowRemove":true,"maxPorts":20,"minPorts":0,"portPrefix":"input"},"x-i18n-key":"nodes.ai.context_merge.inputs.extra_inputs"},"input1":{"additionalProperties":true,"description":"AgentContext input source (connect via port; use JSON format for manual input)","title":"Input 1","type":"object","x-control":"text","x-i18n-key":"nodes.ai.context_merge.inputs.input1","x-port":true},"input2":{"additionalProperties":true,"description":"AgentContext input source (connect via port; use JSON format for manual input)","title":"Input 2","type":"object","x-control":"text","x-i18n-key":"nodes.ai.context_merge.inputs.input2","x-port":true},"merge_strategy":{"default":"append","description":"Message merge strategy","oneOf":[{"description":"追加模式：按顺序追加所有消息","enum":["append"],"type":"string"},{"description":"去重模式：相同内容的消息只保留一条","enum":["deduplicate"],"type":"string"},{"description":"最新优先：只保留每个角色的最新消息","enum":["latest_only"],"type":"string"}],"title":"Merge Strategy","x-control":"select","x-i18n-key":"nodes.ai.context_merge.inputs.merge_strategy"},"system_message":{"default":null,"description":"Additional system message (optional)","maxLength":50000,"title":"System Message","type":"string","x-control":"textarea","x-i18n-key":"nodes.ai.context_merge.inputs.system_message"}},"title":"ContextMergeInput","type":"object","x-collapsed-visible":["input1","input2"],"x-field-order":["input1","input2","extra_inputs","merge_strategy","custom_session_id","system_message"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"MergeStats":{"description":"合并统计","properties":{"deduplicated":{"description":"去重移除的消息数","format":"uint","minimum":0.0,"type":"integer"},"input_count":{"description":"输入源数量","format":"uint","minimum":0.0,"type":"integer"},"metadata_keys":{"description":"合并的 metadata 键数量","format":"uint","minimum":0.0,"type":"integer"},"total_messages":{"description":"合并后的消息总数","format":"uint","minimum":0.0,"type":"integer"}},"required":["deduplicated","input_count","metadata_keys","total_messages"],"type":"object"}},"description":"输出结构","properties":{"context":{"additionalProperties":true,"description":"AgentContext output port (merged conversation history)","title":"Context","type":"object","x-i18n-key":"nodes.ai.context_merge.outputs.context","x-port":true},"formatted_content":{"description":"Plain text concatenation of all merged messages","title":"Formatted Content","type":"string","x-i18n-key":"nodes.ai.context_merge.outputs.formatted_content"},"stats":{"allOf":[{"$ref":"#/definitions/MergeStats"}],"description":"Merge statistics","title":"Stats","x-i18n-key":"nodes.ai.context_merge.outputs.stats"}},"required":["context","formatted_content","stats"],"title":"ContextMergeOutput","type":"object","x-collapsed-visible":["context","formatted_content"],"x-field-order":["context","formatted_content","stats"]},"builtin":true,"i18nKeyPrefix":"nodes.ai.context_merge"},{"typeId":"document/create","name":"Create Document","category":"document","description":"Create a new document in workspace, supports AgentContext pass-through","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for DocumentCreateNode","properties":{"block_type":{"default":"paragraph","description":"Block type for initial content (default: paragraph).","title":"Block Type","type":"string","x-i18n-key":"nodes.document.create.inputs.block_type"},"context":{"additionalProperties":true,"default":null,"description":"AgentContext port","title":"Context","type":"object","x-i18n-key":"nodes.document.create.inputs.context","x-port":true},"initial_content":{"default":null,"description":"Initial content for the first block (optional).","title":"Initial Content","type":["string","null"],"x-i18n-key":"nodes.document.create.inputs.initial_content"},"priority":{"default":"normal","description":"Initial block priority","enum":["low","normal","medium","high","critical"],"options":[{"label":"low","value":"low"},{"label":"normal","value":"normal"},{"label":"medium","value":"medium"},{"label":"high","value":"high"},{"label":"critical","value":"critical"}],"title":"Priority","type":"string","x-control":"select","x-i18n-key":"nodes.document.create.inputs.priority"},"tags":{"default":null,"description":"Initial block tags (comma-separated)","title":"Tags","type":["string","null"],"x-i18n-key":"nodes.document.create.inputs.tags"},"title":{"default":null,"description":"Optional title for the document.","type":["string","null"],"x-i18n-key":"nodes.document.create.inputs.title"},"workspace_id":{"description":"Select workspace to create document in","type":"string","x-api-endpoint":"/api/v1/workspaces?limit=200","x-cache-key":"static_select:/api/v1/workspaces?limit=200","x-control":"dynamic-select","x-i18n-key":"nodes.document.create.inputs.workspace_id"}},"required":["workspace_id"],"title":"DocumentCreateInput","type":"object","x-field-order":["context","workspace_id","title","initial_content","block_type","priority","tags"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Output from DocumentCreateNode","properties":{"context":{"additionalProperties":true,"description":"AgentContext port","title":"Context","type":"object","x-i18n-key":"nodes.document.create.outputs.context","x-port":true},"document_id":{"description":"ID of the created document.","title":"Document Id","type":"string","x-i18n-key":"nodes.document.create.outputs.document_id"},"error":{"description":"Error message if creation failed.","type":["string","null"],"x-i18n-key":"nodes.document.create.outputs.error"},"root_block_id":{"description":"ID of the root block.","title":"Root Block Id","type":"string","x-i18n-key":"nodes.document.create.outputs.root_block_id"},"string":{"description":"Formatted success message with title and document_id","type":"string","x-i18n-key":"nodes.document.create.outputs.string"},"success":{"description":"Whether creation was successful.","type":"boolean","x-i18n-key":"nodes.document.create.outputs.success"},"title":{"description":"Title of the created document.","type":["string","null"],"x-i18n-key":"nodes.document.create.outputs.title"}},"required":["context","document_id","root_block_id","string","success"],"title":"DocumentCreateOutput","type":"object","x-collapsed-visible":["context","string"],"x-field-order":["context","string","document_id","title","root_block_id","success","error"]},"builtin":true,"i18nKeyPrefix":"nodes.document.create"},{"typeId":"utils/delay","name":"Delay Node","category":"utils","description":"Add delay in workflow, for testing pause and stop functionality","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"delay_unit":{"default":"seconds","description":"Delay time unit: milliseconds or seconds","oneOf":[{"description":"毫秒","enum":["milliseconds"],"type":"string"},{"description":"秒","enum":["seconds"],"type":"string"}],"title":"Delay Unit","x-control":"select","x-i18n-key":"nodes.utils.delay.inputs.delay_unit"},"delay_value":{"default":5,"description":"Delay time value (used with unit)","format":"uint64","maximum":3600000.0,"minimum":0.0,"title":"Delay Value","type":"integer","x-control":"number","x-i18n-key":"nodes.utils.delay.inputs.delay_value"},"log_message":{"default":null,"description":"Log message: output before and after delay","title":"Log Message","type":["string","null"],"x-i18n-key":"nodes.utils.delay.inputs.log_message"},"passthrough":{"default":null,"description":"Passthrough data: forwarded as-is to output port","title":"Passthrough","x-i18n-key":"nodes.utils.delay.inputs.passthrough"}},"title":"DelayInput","type":"object","x-collapsed-visible":["delay_value","delay_unit","log_message","passthrough"],"x-field-order":["delay_value","delay_unit","log_message","passthrough"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"AgentContext":{"description":"Agent execution context.\n\nContains agent-specific information such as conversation history, iteration count, session tracking, and custom metadata.\n\n# Metadata Conventions\n\nThe `session_id` field is a first-class field for session tracking: - **Initialization**: Should be set by the workflow engine or the first agent node - **Persistence**: Memory nodes (redis/postgres/window) use it for storage keys - **Logging**: LLM and memory nodes include it in tracing logs for debugging - **Propagation**: All nodes should preserve the session_id across the execution chain\n\nAdditional metadata can be stored in the `metadata` HashMap for custom use cases.\n\n# Examples\n\n``` use cheng_nodes::nodes::builtin::agent::base::context::AgentContext; use cheng_llm::types::ChatMessage;\n\nlet context = AgentContext::new() .with_session_id(\"user123_conversation_456\") .with_history(vec![ChatMessage::user(\"Hello\")]) .with_max_iterations(5); ```","properties":{"history":{"default":[],"description":"Conversation history (messages exchanged so far)","items":{"$ref":"#/definitions/ChatMessage"},"type":"array"},"iteration":{"default":0,"description":"Current iteration count (for ReAct loops, etc.)","format":"uint","minimum":0.0,"type":"integer"},"max_iterations":{"default":10,"description":"Maximum iterations allowed","format":"uint","minimum":0.0,"type":"integer"},"metadata":{"additionalProperties":true,"default":{},"description":"Custom metadata (for extensibility)\n\nUse this for additional context that doesn't fit into standard fields. Examples: user preferences, workflow-specific data, feature flags.","type":"object"},"preview_content":{"description":"预览内容（所有消息合并后的纯文本，供预览节点直接展示）\n\n由合并节点（ContextMergeNode）等聚合节点填写，优先于 history 展示。","type":["string","null"]},"session_id":{"default":"session_f77d5856-3b8b-4539-a376-6457a6ab6c9c","description":"Session identifier for tracking conversations across nodes and storage\n\nThis should be a unique identifier for the conversation session. Format examples: \"user123_session456\", \"uuid-v4\", \"workflow_exec_789\"","type":"string"}},"type":"object"},"ChatContentPart":{"description":"A single rich content part in a message.\n\nOpenAI Chat Completions accepts either plain text or an array of content parts for user messages. This enum keeps the message model backward compatible while making image/audio/file inputs expressible.","oneOf":[{"description":"Plain text content.","properties":{"text":{"type":"string"},"type":{"enum":["text"],"type":"string"}},"required":["text","type"],"type":"object"},{"description":"Image input, either a normal URL or a base64 data URL.","properties":{"image_url":{"$ref":"#/definitions/ImageUrlContent"},"type":{"enum":["image_url"],"type":"string"}},"required":["image_url","type"],"type":"object"},{"description":"Audio input for speech recognition / audio reasoning.","properties":{"input_audio":{"$ref":"#/definitions/InputAudioContent"},"type":{"enum":["input_audio"],"type":"string"}},"required":["input_audio","type"],"type":"object"},{"description":"File input for supported document reasoning models.","properties":{"file":{"$ref":"#/definitions/FileContent"},"type":{"enum":["file"],"type":"string"}},"required":["file","type"],"type":"object"}]},"ChatMessage":{"description":"A single message in a conversation.\n\n# Examples\n\n``` use cheng_llm::types::ChatMessage;\n\nlet system_msg = ChatMessage::system(\"You are a helpful assistant.\"); let user_msg = ChatMessage::user(\"What is Rust?\"); let assistant_msg = ChatMessage::assistant(\"Rust is a systems programming language.\"); ```","properties":{"content":{"type":"string"},"parts":{"description":"Optional rich content parts for multimodal providers.\n\nWhen present, `content` is treated as the leading text prompt and the parts are serialized as the provider-specific content array.","items":{"$ref":"#/definitions/ChatContentPart"},"type":["array","null"]},"role":{"$ref":"#/definitions/Role"}},"required":["content","role"],"type":"object"},"DelayInfo":{"properties":{"end_timestamp_ms":{"description":"结束时间戳（Unix 毫秒）","format":"uint64","minimum":0.0,"type":"integer"},"log_message":{"description":"日志消息（如果有）","type":["string","null"]},"requested_unit":{"description":"请求的延迟时间单位","type":"string"},"requested_value":{"description":"请求的延迟时间值","format":"uint64","minimum":0.0,"type":"integer"},"start_timestamp_ms":{"description":"开始时间戳（Unix 毫秒）","format":"uint64","minimum":0.0,"type":"integer"}},"required":["end_timestamp_ms","requested_unit","requested_value","start_timestamp_ms"],"type":"object"},"FileContent":{"description":"File input payload for OpenAI-style chat content parts.","properties":{"file_data":{"type":["string","null"]},"file_id":{"type":["string","null"]},"filename":{"type":["string","null"]}},"type":"object"},"ImageUrlContent":{"description":"Image input payload for OpenAI-style chat content parts.","properties":{"detail":{"type":["string","null"]},"url":{"type":"string"}},"required":["url"],"type":"object"},"InputAudioContent":{"description":"Audio input payload for OpenAI-style chat content parts.","properties":{"data":{"type":"string"},"format":{"type":"string"}},"required":["data","format"],"type":"object"},"Role":{"description":"Message role in a conversation.","enum":["system","user","assistant"],"type":"string"}},"properties":{"actual_delay_ms":{"description":"Actual delay duration (milliseconds)","format":"uint64","minimum":0.0,"title":"Actual Delay Ms","type":"integer","x-i18n-key":"nodes.utils.delay.outputs.actual_delay_ms"},"completed":{"description":"Whether delay completed normally","title":"Completed","type":"boolean","x-i18n-key":"nodes.utils.delay.outputs.completed"},"context":{"allOf":[{"$ref":"#/definitions/AgentContext"}],"description":"AgentContext combining log_message and passthrough","title":"Context","x-i18n-key":"nodes.utils.delay.outputs.context"},"info":{"allOf":[{"$ref":"#/definitions/DelayInfo"}],"description":"Detailed delay execution info","title":"Info","x-i18n-key":"nodes.utils.delay.outputs.info"},"log_message":{"description":"Passthrough log message from input","title":"Log Message","type":["string","null"],"x-i18n-key":"nodes.utils.delay.outputs.log_message"},"passthrough":{"description":"Passthrough data from input","title":"Passthrough","x-i18n-key":"nodes.utils.delay.outputs.passthrough"}},"required":["actual_delay_ms","completed","context","info"],"title":"DelayOutput","type":"object","x-collapsed-visible":["log_message","context","passthrough"],"x-field-order":["completed","actual_delay_ms","passthrough","log_message","context","info"]},"builtin":true,"i18nKeyPrefix":"nodes.utils.delay"},{"typeId":"utils/credential","name":"Credential Injection","category":"utils","description":"Load saved credentials and expose them as env vars for downstream nodes. Supports provider auto-match, provider/name selection, and legacy UUID refs.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for the Credential Injection node.\n\nEach entry in `bindings` maps an environment variable name to a credential reference. See the module documentation for supported reference formats.","properties":{"bindings":{"additionalProperties":{"type":"string"},"description":"Map each env var name to a credential ref. Ref supports `provider` (auto-select), `provider/name` (pick one), or UUID (legacy). Example: {\"OPENAI_API_KEY\":\"openai\", \"GITHUB_TOKEN\":\"github/work\"}","title":"Bindings","type":"object","x-i18n-key":"nodes.utils.credential.inputs.bindings"},"context_name":{"default":null,"description":"Context label shown in log and error messages.","title":"Context Name","type":["string","null"],"x-i18n-key":"nodes.utils.credential.inputs.context_name"},"strict":{"default":true,"description":"When enabled, any missing credential stops the node. When disabled, returns resolved env vars and lists failed keys in `missing_bindings`.","title":"Strict Mode","type":"boolean","x-i18n-key":"nodes.utils.credential.inputs.strict"},"user_id":{"default":null,"description":"Optional user UUID override. Leave empty to use the current workflow caller.","title":"User Id","type":["string","null"],"x-i18n-key":"nodes.utils.credential.inputs.user_id"}},"required":["bindings"],"title":"CredentialInput","type":"object"},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Resolved environment variables ready for injection into downstream nodes.","properties":{"env_vars":{"additionalProperties":{"type":"string"},"description":"Resolved env var values for downstream nodes (sensitive).","title":"Env Vars","type":"object","x-i18n-key":"nodes.utils.credential.outputs.env_vars"},"missing_bindings":{"description":"Env var keys that could not be resolved (only populated when Strict Mode is off).","items":{"type":"string"},"title":"Missing Bindings","type":"array","x-i18n-key":"nodes.utils.credential.outputs.missing_bindings"},"resolved_count":{"description":"How many bindings were resolved successfully.","format":"uint","minimum":0.0,"title":"Resolved Count","type":"integer","x-i18n-key":"nodes.utils.credential.outputs.resolved_count"}},"required":["env_vars","missing_bindings","resolved_count"],"title":"CredentialOutput","type":"object"},"builtin":true,"i18nKeyPrefix":"nodes.utils.credential"},{"typeId":"io/video_extract_audio","name":"Video Extract Audio","category":"io","description":"Extract audio track from video file, outputs audio file path. Requires ffmpeg installed on system. Can connect to Speech To Text node for transcription.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"channels":{"default":1,"description":"Audio channels: 1=mono (recommended), 2=stereo","format":"uint32","minimum":0.0,"title":"Channels","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_audio.inputs.channels"},"duration_seconds":{"default":0,"description":"Duration of extracted audio (seconds), 0 means extract to the end","format":"uint32","minimum":0.0,"title":"Duration Seconds","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_audio.inputs.duration_seconds"},"file_path":{"description":"Local absolute path of the video file (mp4/avi/mov/mkv/webm etc.)","title":"File Path","type":"string","x-i18n-key":"nodes.io.video_extract_audio.inputs.file_path"},"output_dir":{"default":null,"description":"Output directory path, defaults to /tmp/ChengOS/audio/","title":"Output Dir","type":["string","null"],"x-i18n-key":"nodes.io.video_extract_audio.inputs.output_dir"},"output_format":{"default":"wav","description":"Output audio format: wav (recommended) / mp3 / ogg / flac","oneOf":[{"description":"WAV（无损，与 Whisper 兼容性最好）","enum":["wav"],"type":"string"},{"description":"MP3（有损压缩，体积小）","enum":["mp3"],"type":"string"},{"description":"OGG Vorbis","enum":["ogg"],"type":"string"},{"description":"FLAC（无损压缩）","enum":["flac"],"type":"string"}],"title":"Output Format","x-control":"select","x-i18n-key":"nodes.io.video_extract_audio.inputs.output_format"},"sample_rate":{"default":16000,"description":"Sample rate (Hz), 16000 recommended for Whisper","format":"uint32","minimum":0.0,"title":"Sample Rate","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_audio.inputs.sample_rate"},"start_seconds":{"default":0,"description":"Start extraction from this second (0 means from the beginning)","format":"uint32","minimum":0.0,"title":"Start Seconds","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_audio.inputs.start_seconds"}},"required":["file_path"],"title":"VideoExtractAudioInput","type":"object","x-field-order":["file_path","output_format","sample_rate","channels","output_dir","start_seconds","duration_seconds"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"audio_file_path":{"description":"Extracted audio file path, can connect directly to io/speech_to_text node","title":"Audio File Path","type":"string","x-i18n-key":"nodes.io.video_extract_audio.outputs.audio_file_path"},"ffmpeg_output":{"description":"ffmpeg stderr output, for debugging","title":"Ffmpeg Output","type":"string","x-i18n-key":"nodes.io.video_extract_audio.outputs.ffmpeg_output"},"file_size":{"description":"Size of the extracted audio file (bytes)","format":"uint64","minimum":0.0,"title":"File Size","type":"integer","x-i18n-key":"nodes.io.video_extract_audio.outputs.file_size"},"format":{"description":"Output audio format (wav / mp3 / ogg / flac)","title":"Format","type":"string","x-i18n-key":"nodes.io.video_extract_audio.outputs.format"}},"required":["audio_file_path","ffmpeg_output","file_size","format"],"title":"VideoExtractAudioOutput","type":"object","x-collapsed-visible":["audio_file_path"],"x-field-order":["audio_file_path","file_size","format","ffmpeg_output"]},"builtin":true,"i18nKeyPrefix":"nodes.io.video_extract_audio"},{"typeId":"ai/llm","name":"AI Chat","category":"agent","description":"Call large language model for dialogue generation","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for LLM node.","properties":{"context":{"additionalProperties":true,"default":null,"description":"AgentContext (optional, carries conversation history)","title":"Agent Context","type":"object","x-i18n-key":"nodes.ai.llm.inputs.context","x-port":true},"image_base64":{"default":null,"description":"Base64 image payload or data URL, connectable from io/file_upload.image_base64","title":"Image Base64","type":"string","x-i18n-key":"nodes.ai.llm.inputs.image_base64","x-port":true},"llm_config":{"additionalProperties":true,"description":"LLM configuration (JSON string or object)","title":"LLM Config","type":"object","x-control":"text","x-i18n-key":"nodes.ai.llm.inputs.llm_config","x-port":true},"system_prompt":{"default":"","description":"System prompt (optional)","maxLength":50000,"title":"System Prompt","type":"string","x-control":"textarea","x-i18n-key":"nodes.ai.llm.inputs.system_prompt"},"tools":{"default":null,"description":"Tool/function definitions (JSON array for function calling)","title":"Tools","x-i18n-key":"nodes.ai.llm.inputs.tools"},"user_message":{"default":"","description":"User message (can be empty if context.history already contains user messages)","maxLength":200000,"title":"User Message","type":"string","x-control":"textarea","x-i18n-key":"nodes.ai.llm.inputs.user_message"},"user_message_rich":{"additionalProperties":true,"default":null,"description":"Structured user message with multimodal parts","title":"User Message Rich","type":"object","x-i18n-key":"nodes.ai.llm.inputs.user_message_rich","x-port":true}},"required":["llm_config"],"title":"AiLlmInput","type":"object","x-collapsed-visible":["user_message","llm_config"],"x-field-order":["context","llm_config","system_prompt","user_message","user_message_rich","image_base64","tools"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"FunctionCall":{"description":"Function call details.","properties":{"arguments":{"type":"string"},"name":{"type":"string"}},"required":["arguments","name"],"type":"object"},"ToolCall":{"description":"Tool call made by the LLM.\n\n# Examples\n\n``` use cheng_llm::types::ToolCall;\n\nlet tool_call = ToolCall { id: \"call_123\".to_string(), function: cheng_llm::types::FunctionCall { name: \"get_weather\".to_string(), arguments: r#\"{\"location\": \"Tokyo\"}\"#.to_string(), }, index: None, }; ```","properties":{"function":{"$ref":"#/definitions/FunctionCall"},"id":{"type":"string"},"index":{"description":"Index in the tool calls array (used for streaming)","format":"uint32","minimum":0.0,"type":["integer","null"]}},"required":["function","id"],"type":"object"},"ToolExecutionResult":{"description":"Result of a single tool execution","properties":{"call_id":{"description":"Tool call ID (for matching with LLM request)","type":"string"},"duration_ms":{"description":"Execution duration in milliseconds","format":"uint64","minimum":0.0,"type":"integer"},"error":{"description":"Error message if failed","type":["string","null"]},"output":{"description":"Execution output","type":"string"},"success":{"description":"Whether execution succeeded","type":"boolean"},"tool_name":{"description":"Tool name","type":"string"}},"required":["call_id","duration_ms","output","success","tool_name"],"type":"object"}},"description":"Output from LLM node.","properties":{"completion_tokens":{"description":"Tokens used in completion","format":"uint32","minimum":0.0,"title":"Completion Tokens","type":"integer","x-i18n-key":"nodes.ai.llm.outputs.completion_tokens"},"context":{"additionalProperties":true,"description":"AgentContext output port (contains conversation history)","title":"Agent Context","type":"object","x-i18n-key":"nodes.ai.llm.outputs.context","x-port":true},"finish_reason":{"description":"Finish reason","title":"Finish Reason","type":"string","x-i18n-key":"nodes.ai.llm.outputs.finish_reason"},"llm_config":{"additionalProperties":true,"description":"LLM configuration used for this call (reusable by downstream nodes)","title":"LLM Config","type":"object","x-control":"text","x-i18n-key":"nodes.ai.llm.outputs.llm_config","x-port":true},"prompt_tokens":{"description":"Tokens used in prompt","format":"uint32","minimum":0.0,"title":"Prompt Tokens","type":"integer","x-i18n-key":"nodes.ai.llm.outputs.prompt_tokens"},"response":{"description":"Generated text response","title":"Response","type":"string","x-i18n-key":"nodes.ai.llm.outputs.response"},"tool_calls":{"description":"Tool calls made by the LLM (for function calling)","items":{"$ref":"#/definitions/ToolCall"},"title":"Tool Calls","type":["array","null"],"x-i18n-key":"nodes.ai.llm.outputs.tool_calls"},"tool_results":{"description":"Tool execution results (when tools are connected and auto-executed)","items":{"$ref":"#/definitions/ToolExecutionResult"},"title":"Tool Results","type":["array","null"],"x-i18n-key":"nodes.ai.llm.outputs.tool_results"},"total_tokens":{"description":"Total tokens used","format":"uint32","minimum":0.0,"title":"Total Tokens","type":"integer","x-i18n-key":"nodes.ai.llm.outputs.total_tokens"}},"required":["completion_tokens","context","finish_reason","llm_config","prompt_tokens","response","total_tokens"],"title":"AiLlmOutput","type":"object","x-collapsed-visible":["context","response"],"x-field-order":["context","response","prompt_tokens","completion_tokens","total_tokens","finish_reason","tool_calls","tool_results","llm_config"]},"builtin":true,"i18nKeyPrefix":"nodes.ai.llm"},{"typeId":"rag/formatter","name":"RAG Formatter","category":"rag","description":"Format retrieved documents and user query into LLM prompt","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"RetrievedDocOutput":{"description":"Retrieved document in output","properties":{"chunk_index":{"description":"Chunk index","format":"int64","title":"Chunk Index","type":["integer","null"]},"context":{"description":"Context description (if available)","type":["string","null"]},"document_id":{"description":"Parent document ID","title":"Document Id","type":["string","null"]},"id":{"description":"Document chunk ID","type":"string"},"retrieval_method":{"description":"Retrieval method used","title":"Retrieval Method","type":["string","null"]},"score":{"description":"Relevance score","format":"float","type":"number"},"text":{"description":"Chunk text content","type":"string"}},"required":["id","score","text"],"type":"object"}},"description":"Formatter node input","properties":{"custom_template":{"default":null,"description":"Custom prompt template. Available placeholders: {query}, {documents}, {count}","title":"Custom Template","type":"string","x-conditional":{"field":"template","values":["custom"]},"x-control":"textarea","x-i18n-key":"nodes.rag.formatter.inputs.custom_template"},"documents":{"description":"List of retrieved documents from retriever node output","items":{"$ref":"#/definitions/RetrievedDocOutput"},"title":"Retrieved Documents","type":"array","x-i18n-key":"nodes.rag.formatter.inputs.documents"},"include_scores":{"default":null,"description":"Include document relevance scores in formatted output","title":"Show Relevance Scores","type":["boolean","null"],"x-i18n-key":"nodes.rag.formatter.inputs.include_scores"},"include_sources":{"default":null,"description":"Include document IDs and source information in formatted output","title":"Show Document Sources","type":["boolean","null"],"x-i18n-key":"nodes.rag.formatter.inputs.include_sources"},"max_doc_chars":{"default":null,"description":"Maximum characters per document chunk (0 = unlimited)","format":"uint","minimum":0.0,"title":"Max Characters per Document","type":["integer","null"],"x-i18n-key":"nodes.rag.formatter.inputs.max_doc_chars"},"query":{"description":"User question from retriever node query output","title":"Query Text","type":"string","x-i18n-key":"nodes.rag.formatter.inputs.query"},"template":{"default":null,"description":"Select prompt template type","title":"Template Type","type":"string","x-control":"select","x-default":"qa","x-i18n-key":"nodes.rag.formatter.inputs.template","x-options":[{"description":"Standard question and answer template","label":"Q&A","value":"qa"},{"description":"Document summary generation template","label":"Summary","value":"summary"},{"description":"Use custom template","label":"Custom","value":"custom"}]}},"required":["documents","query"],"title":"FormatterInput","type":"object","x-field-order":["query","documents","template","custom_template","include_scores","include_sources","max_doc_chars"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Formatter node output","properties":{"document_count":{"description":"Number of documents included","format":"uint","minimum":0.0,"title":"Document Count","type":"integer","x-i18n-key":"nodes.rag.formatter.outputs.document_count"},"prompt":{"description":"Formatted prompt ready for LLM input","title":"Prompt","type":"string","x-i18n-key":"nodes.rag.formatter.outputs.prompt"},"query":{"description":"Original query text","title":"Query","type":"string","x-i18n-key":"nodes.rag.formatter.outputs.query"},"total_chars":{"description":"Total characters in formatted output","format":"uint","minimum":0.0,"title":"Total Chars","type":"integer","x-i18n-key":"nodes.rag.formatter.outputs.total_chars"}},"required":["document_count","prompt","query","total_chars"],"title":"FormatterOutput","type":"object","x-collapsed-visible":["prompt"],"x-field-order":["prompt","query","document_count","total_chars"]},"builtin":true,"i18nKeyPrefix":"nodes.rag.formatter"},{"typeId":"utils/preview","name":"Content Preview","category":"utils","description":"Display output results in preview window, supports multiple formats and statistics","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"context":{"description":"Context from Chat node","title":"Context","x-i18n-key":"nodes.utils.preview.inputs.context"},"currentPage":{"default":1,"description":"Current page number","format":"uint","minimum":1.0,"title":"Current Page","type":"integer","x-control":"number","x-i18n-key":"nodes.utils.preview.inputs.currentPage"},"data":{"description":"Data to preview","title":"Data","x-i18n-key":"nodes.utils.preview.inputs.data"},"displayFormat":{"default":"raw","description":"Select preview display format","oneOf":[{"description":"原始格式","enum":["raw"],"type":"string"},{"description":"JSON 格式化","enum":["json"],"type":"string"},{"description":"表格视图","enum":["table"],"type":"string"},{"description":"代码块格式","enum":["codeblock"],"type":"string"},{"description":"提取助手消息","enum":["assistantmessage"],"type":"string"}],"title":"Display Format","x-control":"select","x-i18n-key":"nodes.utils.preview.inputs.displayFormat"},"pageLength":{"default":1000,"description":"Characters per page; shorter content displays directly, longer content is paginated","format":"uint","maximum":10000.0,"minimum":100.0,"title":"Page Length","type":"integer","x-control":"number","x-i18n-key":"nodes.utils.preview.inputs.pageLength"},"showStats":{"default":true,"description":"Whether to show character count, line count and other statistics","title":"Show Stats","type":"boolean","x-control":"switch","x-i18n-key":"nodes.utils.preview.inputs.showStats"}},"title":"PreviewInput","type":"object","x-collapsed-visible":["context"],"x-field-order":["data","context","display_format","show_stats","page_length","current_page"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"original_data":{"description":"Original input data","title":"Original Data","x-i18n-key":"nodes.utils.preview.outputs.original_data"},"pagination":{"description":"Pagination info (provided when content needs pagination)","title":"Pagination","type":["string","null"],"x-i18n-key":"nodes.utils.preview.outputs.pagination"},"preview_content":{"description":"Formatted preview content","title":"Preview Content","type":"string","x-i18n-key":"nodes.utils.preview.outputs.preview_content"},"statistics":{"description":"Data statistics","title":"Statistics","type":"string","x-i18n-key":"nodes.utils.preview.outputs.statistics"}},"required":["original_data","preview_content","statistics"],"title":"PreviewOutput","type":"object","x-collapsed-visible":[],"x-field-order":["original_data","preview_content","statistics","pagination"]},"builtin":true,"i18nKeyPrefix":"nodes.utils.preview"},{"typeId":"tools/delete_file","name":"Delete File","category":"tools","description":"Delete file (high side-effect, irreversible). Only allows deleting files, not directories. Supports dry_run rehearsal mode.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"dry_run":{"default":false,"description":"Dry run mode (validate only, no actual deletion), default false","title":"Dry Run","type":"boolean","x-i18n-key":"nodes.tools.delete_file.inputs.dry_run"},"file_path":{"description":"Absolute file path to delete","title":"File Path","type":"string","x-i18n-key":"nodes.tools.delete_file.inputs.file_path"}},"required":["file_path"],"title":"DeleteFileInput","type":"object"},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"deleted":{"description":"true=成功删除（dry_run=true 时表示\"可以删除\"）","type":"boolean","x-i18n-key":"nodes.tools.delete_file.outputs.deleted"},"dry_run":{"description":"是否为演练模式","title":"Dry Run","type":"boolean","x-i18n-key":"nodes.tools.delete_file.outputs.dry_run"},"error":{"description":"错误信息","type":["string","null"],"x-i18n-key":"nodes.tools.delete_file.outputs.error"},"file_path":{"description":"操作的文件路径","title":"File Path","type":"string","x-i18n-key":"nodes.tools.delete_file.outputs.file_path"},"file_size_bytes":{"description":"被删除文件的大小（删除前记录）","format":"uint64","minimum":0.0,"title":"File Size Bytes","type":["integer","null"],"x-i18n-key":"nodes.tools.delete_file.outputs.file_size_bytes"}},"required":["deleted","dry_run","file_path"],"title":"DeleteFileOutput","type":"object","x-collapsed-visible":["deleted"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.delete_file"},{"typeId":"io/file_upload","name":"File Upload","category":"io","description":"Handle file uploads, supports images, documents and other formats, optional OCR and document parsing","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"文件上传节点输入","properties":{"allowed_category":{"default":"auto","description":"Restrict allowed file category","oneOf":[{"description":"自动检测","enum":["auto"],"type":"string"},{"description":"图片","enum":["image"],"type":"string"},{"description":"文档","enum":["document"],"type":"string"},{"description":"音频","enum":["audio"],"type":"string"},{"description":"视频","enum":["video"],"type":"string"},{"description":"其他","enum":["other"],"type":"string"}],"title":"Allowed Category","x-control":"select","x-i18n-key":"nodes.io.file_upload.inputs.allowed_category"},"enable_ocr":{"default":false,"description":"Enable OCR recognition for images","title":"Enable OCR","type":"boolean","x-control":"switch","x-i18n-key":"nodes.io.file_upload.inputs.enable_ocr"},"files_json":{"anyOf":[{"type":"array"},{"type":"object"},{"type":"string"},{"type":"null"}],"default":null,"description":"Upload files via picker or drag-and-drop; also accepts JSON from upstream","title":"Upload Files","x-control":"file-upload","x-i18n-key":"nodes.io.file_upload.inputs.files_json","x-multiple":true},"max_file_size_mb":{"default":50,"description":"Maximum size per file (MB)","format":"uint64","maximum":500.0,"minimum":1.0,"title":"Max File Size (MB)","type":"integer","x-control":"number","x-i18n-key":"nodes.io.file_upload.inputs.max_file_size_mb"},"parse_documents":{"default":false,"description":"Parse document content (PDF, Word, etc.)","title":"Parse Documents","type":"boolean","x-control":"switch","x-i18n-key":"nodes.io.file_upload.inputs.parse_documents"}},"title":"FileUploadInput","type":"object","x-field-order":["files_json","allowed_category","max_file_size_mb","enable_ocr","parse_documents"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"FileCategory":{"description":"文件类别","oneOf":[{"description":"自动检测","enum":["auto"],"type":"string"},{"description":"图片","enum":["image"],"type":"string"},{"description":"文档","enum":["document"],"type":"string"},{"description":"音频","enum":["audio"],"type":"string"},{"description":"视频","enum":["video"],"type":"string"},{"description":"其他","enum":["other"],"type":"string"}]},"FileInfo":{"description":"单个文件信息","properties":{"base64_content":{"description":"Base64 编码内容（小文件可直接内联）","type":["string","null"]},"category":{"allOf":[{"$ref":"#/definitions/FileCategory"}],"description":"文件类别"},"filename":{"description":"文件名","type":"string"},"id":{"description":"文件 ID（唯一标识符）","type":"string"},"metadata":{"default":null,"description":"附加元数据"},"mime_type":{"description":"MIME 类型","type":"string"},"size":{"description":"文件大小（字节）","format":"uint64","minimum":0.0,"type":"integer"},"url":{"description":"文件 URL（访问地址）","type":["string","null"]}},"required":["category","filename","id","mime_type","size"],"type":"object"}},"description":"文件上传节点输出","properties":{"audio_base64":{"description":"Base64 content of the first audio file, can connect directly to io/speech_to_text.base64_content","title":"Audio Base64","type":["string","null"],"x-i18n-key":"nodes.io.file_upload.outputs.audio_base64"},"audio_filename":{"description":"Filename of the first audio file, can connect directly to io/speech_to_text.filename","title":"Audio Filename","type":["string","null"],"x-i18n-key":"nodes.io.file_upload.outputs.audio_filename"},"chat_input_raw":{"description":"RawPayload[] JSON for direct connection to chat/input.raw_input","title":"Chat Input Raw","type":"string","x-i18n-key":"nodes.io.file_upload.outputs.chat_input_raw","x-port":true},"document_base64":{"description":"Base64 content of the first document file, can connect directly to io/document_to_text.base64_content","title":"Document Base64","type":["string","null"],"x-i18n-key":"nodes.io.file_upload.outputs.document_base64"},"document_filename":{"description":"Filename of the first document file, can connect directly to io/document_to_text.filename","title":"Document Filename","type":["string","null"],"x-i18n-key":"nodes.io.file_upload.outputs.document_filename"},"errors":{"description":"Error messages during processing","items":{"type":"string"},"title":"Errors","type":"array","x-i18n-key":"nodes.io.file_upload.outputs.errors"},"file_count":{"description":"Number of files successfully processed","format":"uint","minimum":0.0,"title":"File Count","type":"integer","x-i18n-key":"nodes.io.file_upload.outputs.file_count"},"files":{"description":"List of processed file information","items":{"$ref":"#/definitions/FileInfo"},"title":"Files","type":"array","x-i18n-key":"nodes.io.file_upload.outputs.files"},"image_base64":{"description":"Base64 content of the first image file, can connect directly to ai/llm.image_base64","title":"Image Base64","type":["string","null"],"x-i18n-key":"nodes.io.file_upload.outputs.image_base64"},"total_size":{"description":"Total size of all files (bytes)","format":"uint64","minimum":0.0,"title":"Total Size","type":"integer","x-i18n-key":"nodes.io.file_upload.outputs.total_size"},"user_message_rich":{"additionalProperties":true,"description":"Structured user message with multimodal parts","title":"User Message Rich","type":"object","x-i18n-key":"nodes.io.file_upload.outputs.user_message_rich","x-port":true},"video_file_path":{"description":"Local path of the first video file, can connect directly to io/video_extract_audio.file_path or io/video_extract_frames.file_path","title":"Video File Path","type":["string","null"],"x-i18n-key":"nodes.io.file_upload.outputs.video_file_path"}},"required":["chat_input_raw","errors","file_count","files","total_size","user_message_rich"],"title":"FileUploadOutput","type":"object","x-collapsed-visible":["document_base64","document_filename","audio_base64","audio_filename","video_file_path","image_base64","chat_input_raw","user_message_rich"],"x-field-order":["files","file_count","total_size","errors","document_base64","document_filename","audio_base64","audio_filename","video_file_path","image_base64","chat_input_raw","user_message_rich"]},"builtin":true,"i18nKeyPrefix":"nodes.io.file_upload"},{"typeId":"tools/code_python","name":"Python Executor","category":"tools","description":"Run Python 3 scripts (native python3, NO OS-level isolation — trusted environment only). FAIL-CLOSED: errors if python3 runtime is unavailable. Use for: algorithms, text processing, data transformation, scientific computing. Do NOT use for network requests (→ Shell) or simple JSON/string transforms (→ JS). Network access is disabled on this node by design. Example: {\"script\":\"result = sum(input['values'])\",\"input\":{\"values\":[1,2,3]}}","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"allow_filesystem":{"default":false,"description":"Whether to allow script to write files to workspace","title":"Allow Filesystem Write","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.code_python.inputs.allow_filesystem"},"allow_full_disk_readonly":{"default":false,"description":"Whether to allow read-only access to entire disk (for disk-wide search/file finding).","title":"Allow Full Disk Read","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.code_python.inputs.allow_full_disk_readonly"},"input":{"default":null,"description":"Input data (any JSON), accessible via `input` variable in script","title":"Input","x-i18n-key":"nodes.tools.code_python.inputs.input"},"memory_mb":{"default":128,"description":"Memory limit in MB. Soft constraint only, no OS-level enforcement. Default 128MB.","format":"uint64","maximum":1024.0,"minimum":16.0,"title":"Memory Limit (MB)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.code_python.inputs.memory_mb"},"script":{"default":null,"description":"[Required] Python 3 script. Example: result = sum(input['values'])","title":"Script","type":"string","x-control":"code-editor","x-i18n-key":"nodes.tools.code_python.inputs.script","x-rows":5},"timeout_ms":{"default":5000,"description":"Timeout in milliseconds. Default 5000ms, max 300000ms.","format":"uint64","maximum":300000.0,"minimum":100.0,"title":"Timeout (ms)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.code_python.inputs.timeout_ms"},"workspace_name":{"default":null,"description":"Workspace name (e.g. project-alpha), only allows letters/digits/-/_.","title":"Workspace Name","type":["string","null"],"x-i18n-key":"nodes.tools.code_python.inputs.workspace_name"}},"title":"CodePythonInput","type":"object","x-collapsed-visible":["script"],"x-field-order":["input","script","workspace_name","allow_filesystem","allow_full_disk_readonly","timeout_ms","memory_mb"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ExecutionMetrics":{"properties":{"duration_ms":{"format":"uint64","minimum":0.0,"type":"integer"},"input_size_bytes":{"format":"uint","minimum":0.0,"type":"integer"},"output_size_bytes":{"format":"uint","minimum":0.0,"type":"integer"},"peak_memory_bytes":{"format":"uint64","minimum":0.0,"type":"integer"},"runtime_type":{"type":"string"},"script_hash":{"type":["string","null"]}},"required":["duration_ms","input_size_bytes","output_size_bytes","peak_memory_bytes","runtime_type"],"type":"object"}},"properties":{"isolation_level":{"description":"Actual isolation level used: bubblewrap > quickjs > python","title":"Isolation Level","type":"string","x-i18n-key":"nodes.tools.code_python.outputs.isolation_level"},"metrics":{"allOf":[{"$ref":"#/definitions/ExecutionMetrics"}],"description":"Execution performance metrics","title":"Metrics","x-i18n-key":"nodes.tools.code_python.outputs.metrics"},"result":{"description":"Script execution result","title":"Result","x-i18n-key":"nodes.tools.code_python.outputs.result"},"stderr":{"description":"Standard error","title":"Stderr","type":"string","x-i18n-key":"nodes.tools.code_python.outputs.stderr"},"stdout":{"description":"Standard output","title":"Stdout","type":"string","x-i18n-key":"nodes.tools.code_python.outputs.stdout"},"warnings":{"description":"Script validation warnings","items":{"type":"string"},"title":"Warnings","type":"array","x-i18n-key":"nodes.tools.code_python.outputs.warnings"}},"required":["isolation_level","metrics","result","stderr","stdout","warnings"],"title":"CodeOutput","type":"object","x-collapsed-visible":["result"],"x-field-order":["result","isolation_level","metrics","stdout","stderr","warnings"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.code_python"},{"typeId":"tools/mail","name":"Mail Tool","category":"tools","description":"Operate real emails via IMAP/SMTP protocols: send, read, search, move, mark, reply, forward and more","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"EmailFormat":{"description":"邮件正文格式","oneOf":[{"description":"纯文本","enum":["text"],"type":"string"},{"description":"HTML 格式","enum":["html"],"type":"string"},{"description":"同时发送纯文本和 HTML（推荐，兼容性最好）","enum":["both"],"type":"string"}]}},"description":"邮件工具输入","properties":{"bcc":{"description":"BCC email address, multiple addresses separated by commas","title":"BCC","type":["string","null"],"x-i18n-key":"nodes.tools.mail.inputs.bcc"},"body":{"description":"Email body content","title":"Body","type":["string","null"],"x-i18n-key":"nodes.tools.mail.inputs.body"},"cc":{"description":"CC email address, multiple addresses separated by commas","title":"CC","type":["string","null"],"x-i18n-key":"nodes.tools.mail.inputs.cc"},"display_name":{"description":"Sender display name (e.g. John Doe), leave empty to show only email address","title":"Display Name","type":["string","null"],"x-i18n-key":"nodes.tools.mail.inputs.display_name"},"email_id":{"description":"Email unique identifier (obtained from id field in ListEmails/SearchEmails results)","title":"Email ID","type":["string","null"],"x-i18n-key":"nodes.tools.mail.inputs.email_id"},"folder":{"default":"INBOX","description":"Mail folder name (default INBOX, sent usually Sent or [Gmail]/Sent Mail)","title":"Folder","type":"string","x-i18n-key":"nodes.tools.mail.inputs.folder"},"format":{"allOf":[{"$ref":"#/definitions/EmailFormat"}],"description":"Body format: text (plain text), html (HTML), both (send both, recommended)","title":"Format","x-i18n-key":"nodes.tools.mail.inputs.format"},"imap_credential_id":{"default":null,"description":"IMAP credential for receiving operations (read, search, move, delete etc. - ListEmails/SearchEmails/GetEmail/MoveEmail etc.)","title":"IMAP Credential","type":"string","x-control":"credential-select","x-credential-providers":["imap"],"x-i18n-key":"nodes.tools.mail.inputs.imap_credential_id"},"operation":{"description":"Email operation type to execute","oneOf":[{"description":"发送邮件（需 SMTP 配置）","enum":["send_email"],"type":"string"},{"description":"获取邮件列表（需 IMAP 配置）","enum":["list_emails"],"type":"string"},{"description":"搜索邮件（需 IMAP 配置）","enum":["search_emails"],"type":"string"},{"description":"获取邮件详情及正文（需 IMAP 配置）","enum":["get_email"],"type":"string"},{"description":"移动邮件到指定文件夹","enum":["move_email"],"type":"string"},{"description":"复制邮件到指定文件夹","enum":["copy_email"],"type":"string"},{"description":"删除邮件","enum":["delete_email"],"type":"string"},{"description":"标记邮件为已读","enum":["mark_as_read"],"type":"string"},{"description":"标记邮件为未读","enum":["mark_as_unread"],"type":"string"},{"description":"列出所有邮件文件夹","enum":["list_folders"],"type":"string"},{"description":"回复邮件（需 IMAP + SMTP 配置）","enum":["reply_email"],"type":"string"},{"description":"转发邮件（需 IMAP + SMTP 配置）","enum":["forward_email"],"type":"string"}],"title":"Operation","x-control":"select","x-i18n-key":"nodes.tools.mail.inputs.operation"},"page":{"default":1,"description":"Page number starting from 1 (default 1, newest emails on page 1)","format":"uint32","minimum":0.0,"title":"Page","type":"integer","x-i18n-key":"nodes.tools.mail.inputs.page"},"page_size":{"default":20,"description":"Number of emails per page (default 20, max 50)","format":"uint32","minimum":0.0,"title":"Page Size","type":"integer","x-i18n-key":"nodes.tools.mail.inputs.page_size"},"query":{"description":"IMAP search syntax: FROM \"sender@example.com\", SUBJECT \"keyword\", UNSEEN (unread), SINCE \"1-Jan-2024\", can be combined","title":"Search Query","type":["string","null"],"x-i18n-key":"nodes.tools.mail.inputs.query"},"smtp_credential_id":{"default":null,"description":"SMTP credential for sending operations (SendEmail/ReplyEmail/ForwardEmail)","title":"SMTP Credential","type":"string","x-control":"credential-select","x-credential-providers":["smtp"],"x-i18n-key":"nodes.tools.mail.inputs.smtp_credential_id"},"subject":{"description":"Email subject","title":"Subject","type":["string","null"],"x-i18n-key":"nodes.tools.mail.inputs.subject"},"target_folder":{"description":"Target folder name for moving or copying emails (e.g. Archive, Trash, [Gmail]/All Mail)","title":"Target Folder","type":["string","null"],"x-i18n-key":"nodes.tools.mail.inputs.target_folder"},"to":{"description":"Recipient email address, multiple addresses separated by commas","title":"To","type":["string","null"],"x-i18n-key":"nodes.tools.mail.inputs.to"}},"title":"MailInput","type":"object","x-collapsed-visible":["imap_credential_id","smtp_credential_id","operation"],"x-field-order":["imap_credential_id","smtp_credential_id","operation","display_name","folder","page","page_size","to","cc","bcc","subject","body","format","query","email_id","target_folder"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"EmailAttachment":{"description":"邮件附件信息","properties":{"filename":{"description":"Attachment filename","title":"Filename","type":"string"},"mime_type":{"description":"Attachment MIME type (e.g. application/pdf, image/png)","title":"Mime Type","type":"string"},"size":{"description":"Attachment file size in bytes, some email servers don't provide this info","format":"uint64","minimum":0.0,"title":"Size","type":["integer","null"]}},"required":["filename","mime_type"],"type":"object"},"EmailInfo":{"description":"单封邮件信息","properties":{"attachments":{"description":"Email attachment list","items":{"$ref":"#/definitions/EmailAttachment"},"title":"Attachments","type":"array"},"body":{"description":"Email body content (plain text, only returned by GetEmail operation)","title":"Body","type":["string","null"]},"date":{"description":"Email sent time","title":"Date","type":"string"},"from":{"description":"Sender address","title":"From","type":"string"},"id":{"description":"Email unique identifier, can be passed to other operations","title":"ID","type":"string"},"is_read":{"description":"Whether email is read","title":"Is Read","type":"boolean"},"subject":{"description":"Email subject","title":"Subject","type":"string"},"to":{"description":"Recipient address list","items":{"type":"string"},"title":"To","type":"array"}},"required":["attachments","date","from","id","is_read","subject","to"],"type":"object"}},"description":"邮件工具输出","properties":{"count":{"description":"Number of emails returned this time","format":"uint32","minimum":0.0,"title":"Count","type":"integer","x-i18n-key":"nodes.tools.mail.outputs.count"},"emails":{"description":"Email list","items":{"$ref":"#/definitions/EmailInfo"},"title":"Emails","type":"array","x-i18n-key":"nodes.tools.mail.outputs.emails"},"folders":{"description":"Mail folder name list","items":{"type":"string"},"title":"Folders","type":"array","x-i18n-key":"nodes.tools.mail.outputs.folders"},"message":{"description":"Operation result description","title":"Message","type":"string","x-i18n-key":"nodes.tools.mail.outputs.message"},"page":{"description":"Current page number","format":"uint32","minimum":0.0,"title":"Page","type":"integer","x-i18n-key":"nodes.tools.mail.outputs.page"},"success":{"description":"Whether operation succeeded","title":"Success","type":"boolean","x-i18n-key":"nodes.tools.mail.outputs.success"},"total_count":{"description":"Total email count in folder (only provided by ListEmails)","format":"uint32","minimum":0.0,"title":"Total Count","type":["integer","null"],"x-i18n-key":"nodes.tools.mail.outputs.total_count"}},"required":["count","emails","folders","message","page","success"],"title":"MailOutput","type":"object","x-collapsed-visible":["imap_credential_id","smtp_credential_id","operation"],"x-field-order":["success","message","emails","folders","page","count","total_count"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.mail"},{"typeId":"document/format_for_llm","name":"Format Document (LLM)","category":"document","description":"Read and format document for LLM use, supports priority and tag filtering","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for DocumentFormatForLlmNode","properties":{"context":{"additionalProperties":true,"default":null,"description":"AgentContext port","title":"Context","type":"object","x-i18n-key":"nodes.document.format_for_llm.inputs.context","x-port":true},"document_id":{"description":"Select a document to read, searchable by name","type":"string","x-api-endpoint":"/api/v1/documents?limit=200","x-cache-key":"static_select:/api/v1/documents?limit=200","x-control":"dynamic-select","x-i18n-key":"nodes.document.format_for_llm.inputs.document_id"},"include_metadata":{"default":true,"description":"Whether to include block tags and priority info in output","title":"Include Metadata","type":"boolean","x-i18n-key":"nodes.document.format_for_llm.inputs.include_metadata"},"max_chars":{"default":0,"description":"Maximum character limit (0 means unlimited)","format":"uint","maximum":1000000.0,"minimum":0.0,"type":"integer","x-i18n-key":"nodes.document.format_for_llm.inputs.max_chars"},"output_format":{"default":"markdown","description":"Output format","oneOf":[{"description":"Markdown 格式","enum":["markdown"],"type":"string"},{"description":"纯文本","enum":["plain_text"],"type":"string"},{"description":"结构化（包含块信息）","enum":["structured"],"type":"string"}],"x-control":"select","x-i18n-key":"nodes.document.format_for_llm.inputs.output_format"},"priority_filter":{"default":"all","description":"Filter blocks by priority","oneOf":[{"description":"所有优先级","enum":["all"],"type":"string"},{"description":"仅高优先级（High + Critical）","enum":["high_only"],"type":"string"},{"description":"仅 Critical","enum":["critical_only"],"type":"string"},{"description":"Normal 及以上（Normal + High + Critical）","enum":["normal_and_above"],"type":"string"}],"x-control":"select","x-i18n-key":"nodes.document.format_for_llm.inputs.priority_filter"},"sort_order":{"default":"original","description":"Block sort order","oneOf":[{"description":"按文档原始顺序","enum":["original"],"type":"string"},{"description":"按优先级降序（Critical -> High -> Normal -> Low）","enum":["priority_desc"],"type":"string"},{"description":"按优先级升序（Low -> Normal -> High -> Critical）","enum":["priority_asc"],"type":"string"}],"x-control":"select","x-i18n-key":"nodes.document.format_for_llm.inputs.sort_order"},"system_prompt":{"default":null,"description":"Custom system prompt (optional)","maxLength":10000,"type":"string","x-control":"textarea","x-i18n-key":"nodes.document.format_for_llm.inputs.system_prompt"},"tag_filter":{"default":null,"description":"Filter by tags (comma-separated, e.g.: core concepts,API)","maxLength":500,"type":["string","null"],"x-i18n-key":"nodes.document.format_for_llm.inputs.tag_filter"}},"required":["document_id"],"title":"DocumentFormatForLlmInput","type":"object","x-field-order":["context","document_id","priority_filter","tag_filter","sort_order","output_format","include_metadata","system_prompt","max_chars"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"FormattedBlock":{"description":"格式化后的块信息","properties":{"block_type":{"description":"块类型","type":"string"},"content":{"description":"内容","type":"string"},"id":{"description":"块 ID","type":"string"},"priority":{"description":"优先级","type":"string"},"tags":{"description":"标签","items":{"type":"string"},"type":"array"}},"required":["block_type","content","id","priority","tags"],"type":"object"}},"description":"Output from DocumentFormatForLlmNode","properties":{"block_count":{"description":"处理的块数量","format":"uint","minimum":0.0,"title":"Block Count","type":"integer","x-i18n-key":"nodes.document.format_for_llm.outputs.block_count"},"blocks":{"description":"Structured block list","items":{"$ref":"#/definitions/FormattedBlock"},"title":"Blocks","type":"array","x-i18n-key":"nodes.document.format_for_llm.outputs.blocks"},"character_count":{"description":"总字符数","format":"uint","minimum":0.0,"title":"Character Count","type":"integer","x-i18n-key":"nodes.document.format_for_llm.outputs.character_count"},"context":{"additionalProperties":true,"description":"AgentContext port","title":"Context","type":"object","x-i18n-key":"nodes.document.format_for_llm.outputs.context","x-port":true},"error":{"description":"错误信息","type":["string","null"],"x-i18n-key":"nodes.document.format_for_llm.outputs.error"},"filtered_block_count":{"description":"过滤后的块数量","format":"uint","minimum":0.0,"title":"Filtered Block Count","type":"integer","x-i18n-key":"nodes.document.format_for_llm.outputs.filtered_block_count"},"formatted_content":{"description":"Formatted document content","title":"Formatted Content","type":"string","x-i18n-key":"nodes.document.format_for_llm.outputs.formatted_content"},"preview_content":{"description":"Preview-friendly document summary with title, character count, and content excerpt","type":"string","x-i18n-key":"nodes.document.format_for_llm.outputs.preview_content"},"success":{"description":"是否成功","type":"boolean","x-i18n-key":"nodes.document.format_for_llm.outputs.success"},"title":{"description":"文档标题","type":["string","null"],"x-i18n-key":"nodes.document.format_for_llm.outputs.title"},"truncated":{"description":"是否被截断","type":"boolean","x-i18n-key":"nodes.document.format_for_llm.outputs.truncated"}},"required":["block_count","blocks","character_count","context","filtered_block_count","formatted_content","preview_content","success","truncated"],"title":"DocumentFormatForLlmOutput","type":"object","x-collapsed-visible":["context","formatted_content"],"x-field-order":["context","formatted_content","preview_content","blocks","title","block_count","filtered_block_count","character_count","truncated","success","error"]},"builtin":true,"i18nKeyPrefix":"nodes.document.format_for_llm"},{"typeId":"utils/smart_var","name":"Smart Variable Node","category":"utils","description":"Auto-detect text variables, dynamically generate ports, support full output and picked variable extraction","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"extract_mode":{"default":"auto","description":"Extract mode: auto=auto-detect key names, manual={{var}} syntax only","enum":["auto","manual"],"options":[{"label":"auto","value":"auto"},{"label":"manual","value":"manual"}],"title":"Extract Mode","type":"string","x-control":"select","x-i18n-key":"nodes.utils.smart_var.inputs.extract_mode"},"output_vars":{"default":[],"description":"List of variables to include in output","items":{"type":"string"},"title":"Output Vars","type":"array","x-control":"multi-select","x-i18n-key":"nodes.utils.smart_var.inputs.output_vars","x-options-source":"ports"},"template":{"description":"Raw text (supports JSON/curl/YAML, etc.)","maxLength":50000,"minLength":1,"title":"Template","type":"string","x-control":"textarea","x-i18n-key":"nodes.utils.smart_var.inputs.template"}},"required":["template"],"title":"SmartVarInput","type":"object","x-field-order":["template","extract_mode","output_vars","dynamic_values"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"VarStatistics":{"description":"变量统计信息","properties":{"connected_variables":{"description":"Connected variables count","format":"uint","minimum":0.0,"title":"Connected Variables","type":"integer"},"default_variables":{"description":"Default-valued variables count","format":"uint","minimum":0.0,"title":"Default Variables","type":"integer"},"missing_variables":{"description":"Missing variables count","format":"uint","minimum":0.0,"title":"Missing Variables","type":"integer"},"output_size":{"description":"Output character count","format":"uint","minimum":0.0,"title":"Output Size","type":"integer"},"template_size":{"description":"Template character count","format":"uint","minimum":0.0,"title":"Template Size","type":"integer"},"total_variables":{"description":"Total extracted variables","format":"uint","minimum":0.0,"title":"Total Variables","type":"integer"}},"required":["connected_variables","default_variables","missing_variables","output_size","template_size","total_variables"],"type":"object"}},"properties":{"all_variables":{"description":"All extracted variable names","items":{"type":"string"},"title":"All Variables","type":"array","x-i18n-key":"nodes.utils.smart_var.outputs.all_variables"},"full_text":{"description":"Full text after variable substitution","title":"Full Text","type":"string","x-i18n-key":"nodes.utils.smart_var.outputs.full_text"},"preview_content":{"description":"Formatted preview content","title":"Preview Content","type":"string","x-i18n-key":"nodes.utils.smart_var.outputs.preview_content"},"selected_vars":{"additionalProperties":true,"description":"Picked variable key-value pairs","title":"Picked Vars","type":["object","null"],"x-i18n-key":"nodes.utils.smart_var.outputs.selected_vars"},"statistics":{"allOf":[{"$ref":"#/definitions/VarStatistics"}],"description":"Variable extraction statistics","title":"Statistics","x-i18n-key":"nodes.utils.smart_var.outputs.statistics"}},"required":["all_variables","full_text","preview_content","statistics"],"title":"SmartVarOutput","type":"object","x-collapsed-visible":["full_text"],"x-field-order":["full_text","selected_vars","all_variables","preview_content","statistics"]},"builtin":true,"i18nKeyPrefix":"nodes.utils.smart_var"},{"typeId":"utils/ui_controls_test","name":"UI Controls Test","category":"utils","description":"For testing frontend form control rendering (select/switch/number/textarea/code/rich_text/slider, etc.)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"UI 控件测试输入","properties":{"code_snippet":{"default":"","description":"Code editor (code_editor control)","type":"string","x-control":"code-editor","x-i18n-key":"nodes.utils.ui_controls_test.inputs.code_snippet"},"number_value":{"default":0,"description":"Number input (number control)","format":"int32","maximum":100.0,"minimum":0.0,"title":"Number Value","type":"integer","x-control":"number","x-i18n-key":"nodes.utils.ui_controls_test.inputs.number_value"},"rich_text":{"default":"","description":"Rich text editor (rich_text control)","type":"string","x-control":"rich-text","x-i18n-key":"nodes.utils.ui_controls_test.inputs.rich_text"},"select_enum":{"default":"option_a","description":"Dropdown enum select (select control)","enum":["option_a","option_b","option_c"],"options":[{"label":"option_a","value":"option_a"},{"label":"option_b","value":"option_b"},{"label":"option_c","value":"option_c"}],"type":"string","x-control":"select","x-i18n-key":"nodes.utils.ui_controls_test.inputs.select_enum"},"slider_value":{"default":0,"description":"Slider value (slider control)","format":"int32","maximum":100.0,"minimum":0.0,"type":"integer","x-control":"slider","x-i18n-key":"nodes.utils.ui_controls_test.inputs.slider_value"},"text":{"description":"Plain string input (basic text field)","title":"Text","type":"string","x-i18n-key":"nodes.utils.ui_controls_test.inputs.text"},"textarea_value":{"default":"","description":"Multiline text input (textarea control)","type":"string","x-control":"textarea","x-i18n-key":"nodes.utils.ui_controls_test.inputs.textarea_value"},"toggle":{"default":false,"description":"Boolean toggle (switch control)","type":"boolean","x-control":"switch","x-i18n-key":"nodes.utils.ui_controls_test.inputs.toggle"}},"required":["text"],"title":"UiControlsTestInput","type":"object","x-field-order":["text","select_enum","toggle","number_value","slider_value","textarea_value","code_snippet","rich_text"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"TestSelectEnum":{"description":"下拉枚举测试","enum":["option_a","option_b","option_c"],"type":"string"}},"description":"UI 控件测试输出","properties":{"numeric_sum":{"description":"Sum of number and slider values","format":"int32","title":"Numeric Sum","type":"integer","x-i18n-key":"nodes.utils.ui_controls_test.outputs.numeric_sum"},"selected_enum":{"allOf":[{"$ref":"#/definitions/TestSelectEnum"}],"description":"Currently selected enum value","title":"Selected Enum","x-i18n-key":"nodes.utils.ui_controls_test.outputs.selected_enum"},"summary":{"description":"Summary string generated from combined inputs","title":"Summary","type":"string","x-i18n-key":"nodes.utils.ui_controls_test.outputs.summary"},"toggle_on":{"description":"Boolean toggle state","title":"Toggle On","type":"boolean","x-i18n-key":"nodes.utils.ui_controls_test.outputs.toggle_on"}},"required":["numeric_sum","selected_enum","summary","toggle_on"],"title":"UiControlsTestOutput","type":"object","x-field-order":["summary","selected_enum","numeric_sum","toggle_on"]},"builtin":true,"i18nKeyPrefix":"nodes.utils.ui_controls_test"},{"typeId":"tools/subflow","name":"Sub Workflow Tool","category":"tools","description":"Call other workflows as sub-workflows (supports file path or workflow ID)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"async_execution":{"default":false,"description":"Whether to execute asynchronously; true returns immediately after start, false waits for completion","title":"Async Execution","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.subflow.inputs.async_execution"},"call_stack":{"default":null,"description":"Call stack for detecting recursive calls (internal use)","items":{"type":"string"},"title":"Call Stack","type":["array","null"],"x-i18n-key":"nodes.tools.subflow.inputs.call_stack"},"input_data":{"default":null,"description":"Input data passed to sub-workflow (optional)","title":"Input Data","x-i18n-key":"nodes.tools.subflow.inputs.input_data"},"max_parallelism":{"default":10,"description":"Maximum number of parallel nodes","format":"uint","minimum":0.0,"title":"Max Parallelism","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.subflow.inputs.max_parallelism"},"timeout_seconds":{"default":300,"description":"Timeout in seconds","format":"uint64","minimum":0.0,"title":"Timeout Seconds","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.subflow.inputs.timeout_seconds"},"workflow_path":{"description":"Workflow file path (JSON format) or workflow UUID","maxLength":4096,"minLength":1,"title":"Workflow Path","type":"string","x-i18n-key":"nodes.tools.subflow.inputs.workflow_path"}},"required":["workflow_path"],"title":"SubFlowInput","type":"object","x-field-order":["workflow_path","async_execution","input_data","call_stack","timeout_seconds","max_parallelism"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"elapsed_ms":{"description":"Execution time in milliseconds","format":"uint64","minimum":0.0,"title":"Elapsed Ms","type":"integer","x-i18n-key":"nodes.tools.subflow.outputs.elapsed_ms"},"error":{"description":"Error message (if execution failed)","title":"Error","type":["string","null"],"x-i18n-key":"nodes.tools.subflow.outputs.error"},"output_data":{"description":"Sub-workflow output data","title":"Output Data","x-i18n-key":"nodes.tools.subflow.outputs.output_data"},"status":{"description":"Sub-workflow execution status","title":"Status","type":"string","x-i18n-key":"nodes.tools.subflow.outputs.status"},"summary":{"description":"Execution result summary","title":"Summary","type":"string","x-i18n-key":"nodes.tools.subflow.outputs.summary"}},"required":["elapsed_ms","output_data","status","summary"],"title":"SubFlowOutput","type":"object","x-collapsed-visible":["status","summary"],"x-field-order":["status","output_data","elapsed_ms","error","summary"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.subflow"},{"typeId":"document/ops_hub","name":"Document Operations Hub","category":"document","description":"Document operations hub node: control Agent document capabilities with toggle switches","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"allow_create":{"default":false,"description":"Whether to allow creating new documents (medium side-effect)","type":"boolean","x-control":"switch","x-i18n-key":"nodes.document.ops_hub.inputs.allow_create"},"allow_format":{"default":true,"description":"Whether to allow formatting documents (read-only)","title":"Allow Format","type":"boolean","x-control":"switch","x-i18n-key":"nodes.document.ops_hub.inputs.allow_format"},"allow_query":{"default":true,"description":"Whether to allow querying documents (read-only)","title":"Allow Query","type":"boolean","x-control":"switch","x-i18n-key":"nodes.document.ops_hub.inputs.allow_query"},"allow_update":{"default":false,"description":"Whether to allow updating document blocks (medium side-effect)","type":"boolean","x-control":"switch","x-i18n-key":"nodes.document.ops_hub.inputs.allow_update"},"config":{"additionalProperties":true,"description":"Unified config object (can input JSON text directly)","title":"Config","type":"object","x-control":"text","x-i18n-key":"nodes.document.ops_hub.inputs.config","x-port":true},"document_id":{"description":"Document ID (common to most operations)","title":"Document Id","type":["string","null"],"x-i18n-key":"nodes.document.ops_hub.inputs.document_id"},"operation":{"default":"","description":"Operation type","type":"string","x-i18n-key":"nodes.document.ops_hub.inputs.operation"},"workspace_id":{"description":"Workspace ID (used by create operation, set by user on canvas)","title":"Workspace Id","type":["string","null"],"x-i18n-key":"nodes.document.ops_hub.inputs.workspace_id"}},"required":["allow_create","allow_format","allow_query","allow_update"],"title":"DocumentOpsHubInput","type":"object","x-collapsed-visible":["workspace_id"],"x-field-order":["operation","document_id","config","workspace_id","allow_query","allow_format","allow_update","allow_create"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"error":{"description":"Error message (operation prohibited or execution failed)","type":["string","null"],"x-i18n-key":"nodes.document.ops_hub.outputs.error"},"operation":{"description":"Actual operation type executed","type":"string","x-i18n-key":"nodes.document.ops_hub.outputs.operation"},"result":{"description":"Operation result (JSON-serialized sub-node output)","x-i18n-key":"nodes.document.ops_hub.outputs.result"}},"required":["operation","result"],"title":"DocumentOpsHubOutput","type":"object","x-collapsed-visible":["operation"],"x-field-order":["operation","error","result"]},"builtin":true,"i18nKeyPrefix":"nodes.document.ops_hub"},{"typeId":"chat/save_reply","name":"Save LLM Reply","category":"chat","description":"Persist LLM-output assistant messages and build clean next-round history via structured TurnRecord (idempotent)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Chat 回复持久化节点输入","properties":{"clean_history_json":{"default":"","description":"Clean history before appending current user message (JSON format), from chat/memory.clean_history_json","type":"string","x-i18n-key":"nodes.chat.save_reply.inputs.clean_history_json","x-port":true},"context":{"additionalProperties":true,"description":"Context output from agent/react (contains conversation history and this turn's reply)","title":"Agent Context","type":"object","x-control":"text","x-i18n-key":"nodes.chat.save_reply.inputs.context","x-port":true},"conversation_id":{"default":null,"description":"Current conversation ID (from chat/memory.conversation_id), skipped when None in Memory mode","type":"string","x-i18n-key":"nodes.chat.save_reply.inputs.conversation_id","x-port":true},"reply_id":{"default":null,"description":"Manually specified idempotent deduplication key (optional)","title":"Reply ID","type":["string","null"],"x-i18n-key":"nodes.chat.save_reply.inputs.reply_id"},"trace_key":{"default":null,"description":"Trace retrieval key, from chat/write_trace.trace_key (optional)","type":"string","x-i18n-key":"nodes.chat.save_reply.inputs.trace_key","x-port":true},"user_message":{"default":null,"description":"This turn's user input text (from chat/input.user_message), this value takes priority","type":"string","x-i18n-key":"nodes.chat.save_reply.inputs.user_message","x-port":true},"user_message_rich":{"additionalProperties":true,"default":null,"description":"Structured user message with multimodal parts","type":"object","x-i18n-key":"nodes.chat.save_reply.inputs.user_message_rich","x-port":true},"workspace_id":{"default":null,"description":"Workspace ID (optional), used to verify the conversation belongs to the expected workspace before writing","type":"string","x-i18n-key":"nodes.chat.save_reply.inputs.workspace_id","x-port":true}},"required":["context"],"title":"ChatSaveReplyInput","type":"object","x-field-order":["context","user_message","user_message_rich","clean_history_json","trace_key","conversation_id","workspace_id","reply_id"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Chat 回复持久化节点输出","properties":{"context":{"additionalProperties":true,"description":"AgentContext containing clean history, connectable directly to chat/output","title":"Agent Context","type":"object","x-i18n-key":"nodes.chat.save_reply.outputs.context","x-port":true},"db_persisted":{"description":"Whether assistant reply was successfully persisted to database (always false in Memory mode, does not affect TurnRecord memory preservation)","title":"Db Persisted","type":"boolean","x-i18n-key":"nodes.chat.save_reply.outputs.db_persisted"}},"required":["context","db_persisted"],"title":"ChatSaveReplyOutput","type":"object","x-collapsed-visible":[],"x-field-order":["context","db_persisted"]},"builtin":true,"i18nKeyPrefix":"nodes.chat.save_reply"},{"typeId":"ai/llm_config","name":"LLM Config","category":"agent","description":"Select connected LLM model, output complete configuration","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"LLM 配置节点输入","properties":{"frequency_penalty":{"default":0.0,"description":"Reduce likelihood of repeating the same line (-2.0 to 2.0)","format":"float","maximum":2.0,"minimum":-2.0,"step":"0.1","step-number":0.1,"title":"Frequency Penalty","type":"number","x-control":"slider","x-i18n-key":"nodes.ai.llm_config.inputs.frequency_penalty","x-step":"0.1"},"json_mode":{"default":false,"description":"Inject response_format: json_object (for weaker/open-source models, reduces non-JSON text; no system-level validation)","title":"JSON Output Mode","type":"boolean","x-i18n-key":"nodes.ai.llm_config.inputs.json_mode"},"max_tokens":{"default":5000,"description":"Maximum number of tokens to generate (default 5000)","format":"uint32","minimum":0.0,"title":"Max Tokens","type":["integer","null"],"x-i18n-key":"nodes.ai.llm_config.inputs.max_tokens"},"model":{"description":"Select a connected LLM model","title":"Model","type":"string","x-allow-custom":true,"x-control":"llm-model-select","x-i18n-key":"nodes.ai.llm_config.inputs.model","x-model-name-excludes":["embed","embedding","rerank","reranker"],"x-models-api":"/api/v1/llm/providers"},"model_override":{"default":null,"description":"Model override (format: credential_id::model_name, takes priority over model)","title":"Model Override","type":["string","null"],"x-i18n-key":"nodes.ai.llm_config.inputs.model_override"},"presence_penalty":{"default":0.0,"description":"Encourage the model to discuss new topics (-2.0 to 2.0)","format":"float","maximum":2.0,"minimum":-2.0,"step":"0.1","step-number":0.1,"title":"Presence Penalty","type":"number","x-control":"slider","x-i18n-key":"nodes.ai.llm_config.inputs.presence_penalty","x-step":"0.1"},"stream":{"default":true,"description":"Enable real-time streaming of results","title":"Streaming","type":"boolean","x-i18n-key":"nodes.ai.llm_config.inputs.stream"},"temperature":{"default":0.699999988079071,"description":"Controls randomness of generation, higher values are more random (0.0 - 2.0)","format":"float","maximum":2.0,"minimum":0.0,"step":"0.1","step-number":0.1,"title":"Temperature","type":"number","x-control":"slider","x-i18n-key":"nodes.ai.llm_config.inputs.temperature","x-step":"0.1"},"timeout_secs":{"default":60,"description":"API request timeout (1-600 seconds)","format":"uint32","maximum":600.0,"minimum":1.0,"title":"Timeout (seconds)","type":"integer","x-i18n-key":"nodes.ai.llm_config.inputs.timeout_secs"},"top_p":{"default":1.0,"description":"Nucleus sampling threshold (0.0 - 1.0)","format":"float","maximum":1.0,"minimum":0.0,"step":"0.1","step-number":0.1,"title":"Top P","type":"number","x-control":"slider","x-i18n-key":"nodes.ai.llm_config.inputs.top_p","x-step":"0.1"}},"required":["model"],"title":"LlmConfigInput","type":"object","x-field-order":["model","model_override","temperature","max_tokens","top_p","frequency_penalty","presence_penalty","stream","timeout_secs","json_mode"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"LLM 配置节点输出 - 只有一个完整配置对象","properties":{"llm_config":{"additionalProperties":true,"description":"Complete LLM configuration","title":"LLM Config","type":"object","x-i18n-key":"nodes.ai.llm_config.outputs.llm_config","x-port":true}},"required":["llm_config"],"title":"LlmConfigOutput","type":"object","x-field-order":["llm_config"]},"builtin":true,"i18nKeyPrefix":"nodes.ai.llm_config"},{"typeId":"table/build_llm_context","name":"Build Table LLM Context","category":"table","description":"Build context information for LLM table editing","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for TableBuildLlmContextNode","properties":{"format":{"default":"json","description":"Output format: \"json\", \"markdown\", or \"csv\".","type":"string","x-i18n-key":"nodes.table.build_llm_context.inputs.format"},"instruction":{"description":"User's editing instruction/request.","type":"string","x-i18n-key":"nodes.table.build_llm_context.inputs.instruction"},"max_records":{"default":100,"description":"Maximum records to include in context (0 = unlimited).","format":"uint","minimum":0.0,"title":"Max Records","type":"integer","x-i18n-key":"nodes.table.build_llm_context.inputs.max_records"},"selected_record_ids":{"default":null,"description":"Optional list of selected record IDs. If provided, only these records will be included in the context.","items":{"type":"string"},"title":"Selected Record Ids","type":["array","null"],"x-i18n-key":"nodes.table.build_llm_context.inputs.selected_record_ids"},"table_id":{"description":"Table ID to build context for.","title":"Table Id","type":"string","x-i18n-key":"nodes.table.build_llm_context.inputs.table_id"}},"required":["instruction","table_id"],"title":"TableBuildLlmContextInput","type":"object","x-field-order":["table_id","selected_record_ids","instruction","format","max_records"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Output from TableBuildLlmContextNode","properties":{"agent_context":{"additionalProperties":true,"description":"AgentContext port (can be directly connected to Agent node's context input)","title":"Agent Context","type":"object","x-i18n-key":"nodes.table.build_llm_context.outputs.agent_context","x-port":true},"column_count":{"description":"Number of columns.","format":"uint","minimum":0.0,"type":"integer","x-i18n-key":"nodes.table.build_llm_context.outputs.column_count"},"error":{"description":"Error message if building failed.","type":["string","null"],"x-i18n-key":"nodes.table.build_llm_context.outputs.error"},"llm_context":{"description":"Integrated LLM context as JSON string. Connect this to ReAct agent's `task` input.","title":"Llm Context","type":"string","x-i18n-key":"nodes.table.build_llm_context.outputs.llm_context"},"records_included":{"description":"Number of records included.","format":"uint","minimum":0.0,"type":"integer","x-i18n-key":"nodes.table.build_llm_context.outputs.records_included"},"success":{"description":"Whether context building was successful.","type":"boolean","x-i18n-key":"nodes.table.build_llm_context.outputs.success"},"system_prompt":{"description":"System prompt for LLM.","title":"System Prompt","type":"string","x-i18n-key":"nodes.table.build_llm_context.outputs.system_prompt"},"table_context":{"description":"Table context (formatted table data).","title":"Table Context","type":"string","x-i18n-key":"nodes.table.build_llm_context.outputs.table_context"},"table_id":{"description":"Table ID.","title":"Table Id","type":"string","x-i18n-key":"nodes.table.build_llm_context.outputs.table_id"},"table_name":{"description":"Table name.","title":"Table Name","type":["string","null"],"x-i18n-key":"nodes.table.build_llm_context.outputs.table_name"},"tools_json":{"description":"Tool definitions JSON for LLM function calling.","title":"Tools Json","type":"string","x-i18n-key":"nodes.table.build_llm_context.outputs.tools_json"},"user_prompt":{"description":"User instruction (formatted).","title":"User Prompt","type":"string","x-i18n-key":"nodes.table.build_llm_context.outputs.user_prompt"},"warnings":{"description":"Warnings generated during context building.","items":{"type":"string"},"type":"array","x-i18n-key":"nodes.table.build_llm_context.outputs.warnings"}},"required":["agent_context","column_count","llm_context","records_included","success","system_prompt","table_context","table_id","tools_json","user_prompt"],"title":"TableBuildLlmContextOutput","type":"object","x-collapsed-visible":["agent_context"],"x-field-order":["success","table_id","table_name","system_prompt","table_context","user_prompt","tools_json","llm_context","agent_context","records_included","column_count","error","warnings"]},"builtin":true,"i18nKeyPrefix":"nodes.table.build_llm_context"},{"typeId":"tools/file_info","name":"File Info","category":"tools","description":"Get file or directory metadata (size, line count, modification time, binary or not, etc.) without reading file content.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"path":{"description":"Absolute path of file or directory","title":"Path","type":"string","x-i18n-key":"nodes.tools.file_info.inputs.path"}},"required":["path"],"title":"FileInfoInput","type":"object"},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"EntryType":{"description":"条目类型","enum":["file","dir","symlink"],"type":"string"}},"properties":{"created":{"description":"创建时间（ISO 8601，部分 OS 不支持则为 None）","type":["string","null"],"x-i18n-key":"nodes.tools.file_info.outputs.created"},"entry_type":{"anyOf":[{"$ref":"#/definitions/EntryType"},{"type":"null"}],"description":"条目类型（File / Dir / Symlink）","title":"Entry Type","x-i18n-key":"nodes.tools.file_info.outputs.entry_type"},"error":{"description":"错误信息","type":["string","null"],"x-i18n-key":"nodes.tools.file_info.outputs.error"},"exists":{"description":"路径是否存在","type":"boolean","x-i18n-key":"nodes.tools.file_info.outputs.exists"},"is_binary":{"description":"是否为二进制文件","title":"Is Binary","type":"boolean","x-i18n-key":"nodes.tools.file_info.outputs.is_binary"},"is_readable":{"description":"当前进程是否有读取权限","title":"Is Readable","type":"boolean","x-i18n-key":"nodes.tools.file_info.outputs.is_readable"},"is_writable":{"description":"当前进程是否有写入权限","title":"Is Writable","type":"boolean","x-i18n-key":"nodes.tools.file_info.outputs.is_writable"},"metadata":{"description":"所有元信息的聚合摘要（适合直接传给 LLM / Preview 节点）","type":"string","x-i18n-key":"nodes.tools.file_info.outputs.metadata"},"mime_type":{"description":"MIME 类型推断（如 \"text/x-rust\", \"text/plain\"）","title":"Mime Type","type":["string","null"],"x-i18n-key":"nodes.tools.file_info.outputs.mime_type"},"modified":{"description":"修改时间（ISO 8601）","type":["string","null"],"x-i18n-key":"nodes.tools.file_info.outputs.modified"},"path":{"description":"规范化后的绝对路径","type":"string","x-i18n-key":"nodes.tools.file_info.outputs.path"},"size_bytes":{"description":"文件大小（字节）；目录为 None","format":"uint64","minimum":0.0,"title":"Size Bytes","type":["integer","null"],"x-i18n-key":"nodes.tools.file_info.outputs.size_bytes"},"total_lines":{"description":"文本文件总行数；二进制文件或目录为 None","format":"uint32","minimum":0.0,"title":"Total Lines","type":["integer","null"],"x-i18n-key":"nodes.tools.file_info.outputs.total_lines"}},"required":["exists","is_binary","is_readable","is_writable","metadata","path"],"title":"FileInfoOutput","type":"object","x-collapsed-visible":["metadata"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.file_info"},{"typeId":"ai/embedding_config","name":"Embedding Config","category":"agent","description":"Select connected Embedding model, output complete configuration","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Embedding 配置节点输入","properties":{"batch_size":{"default":null,"description":"批量处理大小","title":"Batch Size","type":"integer","x-allow-custom":true,"x-control":"select","x-i18n-key":"nodes.ai.embedding_config.inputs.batch_size","x-options":[{"label":"16","value":16},{"label":"32","value":32},{"label":"64","value":64},{"label":"128","value":128},{"label":"256","value":256}]},"dimension":{"default":1024,"description":"向量维度","title":"Vector Dimensions","type":"integer","x-allow-custom":true,"x-control":"select","x-default":1024,"x-i18n-key":"nodes.ai.embedding_config.inputs.dimension","x-options":[{"label":"384","value":384},{"label":"768","value":768},{"label":"1024","value":1024},{"label":"1536","value":1536},{"label":"3072","value":3072}]},"embedding_model":{"description":"Select a connected Embedding model. Supports credential_id::model_name or model_name (requires CHENG_DEFAULT_EMBEDDING_CREDENTIAL_ID)","title":"Embedding Model","type":"string","x-allow-custom":true,"x-control":"llm-model-select","x-i18n-key":"nodes.ai.embedding_config.inputs.embedding_model","x-model-name-includes":["embed","embedding"],"x-models-api":"/api/v1/llm/providers"},"reranker_model":{"default":null,"description":"Select a reranker model (optional, for post-processing optimization)","title":"Reranker Model","type":"string","x-allow-custom":true,"x-control":"llm-model-select","x-i18n-key":"nodes.ai.embedding_config.inputs.reranker_model","x-model-name-includes":["rerank","reranker"],"x-models-api":"/api/v1/llm/providers"},"reranker_top_k":{"default":null,"description":"Reranker Top K","title":"Reranker Top K","type":"integer","x-allow-custom":true,"x-control":"select","x-default":3,"x-i18n-key":"nodes.ai.embedding_config.inputs.reranker_top_k","x-options":[{"label":"3","value":3},{"label":"5","value":5},{"label":"10","value":10},{"label":"20","value":20}]}},"required":["embedding_model"],"title":"EmbeddingConfigInput","type":"object","x-field-order":["embedding_model","dimension","batch_size","reranker_model","reranker_top_k"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Embedding 配置节点输出","properties":{"embedding_config":{"additionalProperties":true,"description":"Complete Embedding configuration","title":"Embedding Config","type":"object","x-i18n-key":"nodes.ai.embedding_config.outputs.embedding_config","x-port":true},"reranker_config":{"additionalProperties":true,"description":"Reranker configuration (if a reranker model is configured)","title":"Reranker Config","type":"object","x-i18n-key":"nodes.ai.embedding_config.outputs.reranker_config","x-port":true}},"required":["embedding_config","reranker_config"],"title":"EmbeddingConfigOutput","type":"object","x-field-order":["embedding_config","reranker_config"]},"builtin":true,"i18nKeyPrefix":"nodes.ai.embedding_config"},{"typeId":"tools/ssh","name":"SSH Executor","category":"tools","description":"Execute commands on remote hosts via SSH with a built-in approval gate. Risk-classifies commands, enforces read-only policy, and surfaces 4 distinct rejection reasons (rejected/skipped/timed_out/policy_denied) so agents can replan correctly.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"approval_required_at_or_above":{"default":"medium","description":"Risk threshold for triggering the approval gate (medium by default)","enum":["low","medium","high","critical"],"options":[{"label":"low","value":"low"},{"label":"medium","value":"medium"},{"label":"high","value":"high"},{"label":"critical","value":"critical"}],"title":"Approval Required At Or Above","type":"string","x-control":"select","x-i18n-key":"nodes.tools.ssh.inputs.approval_required_at_or_above"},"approval_timeout_secs":{"default":300,"description":"Seconds to wait for the user's decision before timing out (default 300)","format":"uint64","maximum":86400.0,"minimum":5.0,"title":"Approval Timeout (s)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.ssh.inputs.approval_timeout_secs"},"command":{"default":"","description":"Command to execute on the remote host","maxLength":65536,"title":"Command","type":"string","x-control":"code-editor","x-i18n-key":"nodes.tools.ssh.inputs.command"},"credential_id":{"default":null,"description":"SSH credential — private key or password (resolved via CredentialRepository)","title":"Credential","type":"string","x-control":"credential-select","x-credential-providers":["ssh","ssh_password"],"x-i18n-key":"nodes.tools.ssh.inputs.credential_id"},"host":{"description":"Remote host (hostname or IP)","title":"Host","type":"string","x-i18n-key":"nodes.tools.ssh.inputs.host"},"port":{"default":22,"description":"Remote SSH port","format":"uint64","maximum":65535.0,"minimum":1.0,"title":"Port","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.ssh.inputs.port"},"read_only_mode":{"default":false,"description":"Hard policy: when enabled, any non-readonly command is denied without going through approval","title":"Read-only Mode (hard policy)","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.ssh.inputs.read_only_mode"},"strict_host_key_checking":{"default":true,"description":"TOFU: first-connect host key prompts user approval; subsequent connects use the trusted key. Disable only for ad-hoc testing.","title":"Strict Host Key Checking","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.ssh.inputs.strict_host_key_checking"},"timeout_ms":{"default":30000,"description":"Per-command execution timeout in milliseconds","format":"uint64","maximum":600000.0,"minimum":100.0,"title":"Timeout (ms)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.ssh.inputs.timeout_ms"},"username":{"default":null,"description":"SSH login username (defaults to root)","title":"Username","type":["string","null"],"x-i18n-key":"nodes.tools.ssh.inputs.username"},"working_dir":{"default":null,"description":"Optional cwd before executing the command","title":"Working Directory","type":["string","null"],"x-i18n-key":"nodes.tools.ssh.inputs.working_dir"}},"required":["host"],"title":"SshInput","type":"object","x-collapsed-visible":["host","command"],"x-field-order":["host","port","username","credential_id","command","working_dir","timeout_ms","strict_host_key_checking","read_only_mode","approval_required_at_or_above","approval_timeout_secs"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"approval_request_id":{"description":"UUID matching the approval bus event","title":"Approval Request Id","type":["string","null"],"x-i18n-key":"nodes.tools.ssh.outputs.approval_request_id"},"command":{"description":"Command echoed back for traceability","title":"Command","type":"string","x-i18n-key":"nodes.tools.ssh.outputs.command"},"duration_ms":{"description":"Wall-clock execution time","format":"uint64","minimum":0.0,"title":"Duration (ms)","type":"integer","x-i18n-key":"nodes.tools.ssh.outputs.duration_ms"},"exit_code":{"description":"Remote process exit code","format":"int32","title":"Exit Code","type":["integer","null"],"x-i18n-key":"nodes.tools.ssh.outputs.exit_code"},"host":{"description":"Target host echoed back for traceability","title":"Host","type":"string","x-i18n-key":"nodes.tools.ssh.outputs.host"},"observation":{"description":"Agent-facing observation text with [APPROVAL_*] prefixes","title":"Observation","type":"string","x-i18n-key":"nodes.tools.ssh.outputs.observation"},"reason":{"description":"Reason text from user or policy","title":"Reason","type":["string","null"],"x-i18n-key":"nodes.tools.ssh.outputs.reason"},"rejection_type":{"description":"Distinguishes execute / approval / policy outcomes","title":"Rejection Type","type":["string","null"],"x-i18n-key":"nodes.tools.ssh.outputs.rejection_type"},"risk_level":{"description":"Classified risk for this command","title":"Risk Level","type":"string","x-i18n-key":"nodes.tools.ssh.outputs.risk_level"},"stderr":{"description":"Captured stderr","title":"Stderr","type":"string","x-i18n-key":"nodes.tools.ssh.outputs.stderr"},"stdout":{"description":"Captured stdout","title":"Stdout","type":"string","x-i18n-key":"nodes.tools.ssh.outputs.stdout"},"success":{"description":"True iff the command executed and returned 0","title":"Success","type":"boolean","x-i18n-key":"nodes.tools.ssh.outputs.success"}},"required":["command","duration_ms","host","observation","risk_level","stderr","stdout","success"],"title":"SshOutput","type":"object","x-collapsed-visible":["observation"],"x-field-order":["success","exit_code","stdout","stderr","duration_ms","host","command","risk_level","rejection_type","reason","approval_request_id","observation"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.ssh"},{"typeId":"tools/write_file","name":"Write File","category":"tools","description":"Create new file or overwrite/append existing file. Uses atomic write (temp file + rename) to prevent file corruption from interrupted writes.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"append":{"default":false,"description":"Append mode (takes priority over overwrite), default false","title":"Append","type":"boolean","x-i18n-key":"nodes.tools.write_file.inputs.append"},"content":{"description":"File content to write (UTF-8)","title":"Content","type":"string","x-i18n-key":"nodes.tools.write_file.inputs.content"},"create_dirs":{"default":true,"description":"Whether to automatically create parent directories, default true","title":"Create Dirs","type":"boolean","x-i18n-key":"nodes.tools.write_file.inputs.create_dirs"},"file_path":{"description":"Absolute file path to write","title":"File Path","type":"string","x-i18n-key":"nodes.tools.write_file.inputs.file_path"},"overwrite":{"default":false,"description":"Whether to allow overwriting existing file, default false","title":"Overwrite","type":"boolean","x-i18n-key":"nodes.tools.write_file.inputs.overwrite"}},"required":["content","file_path"],"title":"WriteFileInput","type":"object"},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"bytes_written":{"description":"写入字节数","format":"uint64","minimum":0.0,"title":"Bytes Written","type":"integer","x-i18n-key":"nodes.tools.write_file.outputs.bytes_written"},"created":{"description":"true=新建文件，false=覆写或追加","type":"boolean","x-i18n-key":"nodes.tools.write_file.outputs.created"},"error":{"description":"错误信息","type":["string","null"],"x-i18n-key":"nodes.tools.write_file.outputs.error"},"file_path":{"description":"实际写入的规范路径","title":"File Path","type":"string","x-i18n-key":"nodes.tools.write_file.outputs.file_path"},"summary":{"description":"写入结果摘要（适合直接传给 LLM / Preview 节点）","type":"string","x-i18n-key":"nodes.tools.write_file.outputs.summary"}},"required":["bytes_written","created","file_path","summary"],"title":"WriteFileOutput","type":"object","x-collapsed-visible":["file_path","summary"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.write_file"},{"typeId":"table/query","name":"Query Table","category":"table","description":"Get table data, including column definitions and records","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for TableQueryNode","properties":{"include_schema":{"default":true,"description":"Whether to include column definitions (default: true).","title":"Include Schema","type":"boolean","x-i18n-key":"nodes.table.query.inputs.include_schema"},"page":{"default":1,"description":"Page number for pagination (1-based, default: 1).","format":"uint32","minimum":0.0,"type":"integer","x-i18n-key":"nodes.table.query.inputs.page"},"page_size":{"default":100,"description":"Number of records per page (default: 100, max: 1000).","format":"uint32","minimum":0.0,"title":"Page Size","type":"integer","x-i18n-key":"nodes.table.query.inputs.page_size"},"record_ids":{"default":null,"description":"Optional list of specific record IDs to fetch. If not provided, fetches all records (paginated).","items":{"type":"string"},"title":"Record Ids","type":["array","null"],"x-i18n-key":"nodes.table.query.inputs.record_ids"},"table_id":{"description":"ID of the table to query.","title":"Table Id","type":"string","x-i18n-key":"nodes.table.query.inputs.table_id"},"workspace_id":{"default":null,"description":"Select workspace to validate table belongs to","title":"Workspace Id","type":"string","x-api-endpoint":"/api/v1/workspaces?limit=200","x-cache-key":"static_select:/api/v1/workspaces?limit=200","x-control":"dynamic-select","x-i18n-key":"nodes.table.query.inputs.workspace_id"}},"required":["table_id"],"title":"TableQueryInput","type":"object","x-field-order":["workspace_id","table_id","record_ids","include_schema","page","page_size"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ColumnInfo":{"description":"Column information in output","properties":{"column_type":{"description":"Column type (text, number, select, date, checkbox).","type":"string"},"config":{"description":"Column configuration (e.g., select options)."},"id":{"description":"Column ID.","type":"string"},"name":{"description":"Column name.","type":"string"},"order_index":{"description":"Order index for display.","format":"double","type":"number"}},"required":["column_type","id","name","order_index"],"type":"object"},"RecordInfo":{"description":"Record information in output","properties":{"created_at":{"description":"Created timestamp.","type":"string"},"data":{"description":"Record data as key-value pairs (column_id -> cell_value)."},"id":{"description":"Record ID.","type":"string"},"order_index":{"description":"Order index for display.","format":"double","type":"number"},"updated_at":{"description":"Updated timestamp.","type":"string"}},"required":["created_at","data","id","order_index","updated_at"],"type":"object"},"TableInfo":{"description":"Table metadata in output","properties":{"created_at":{"description":"Created timestamp.","type":"string"},"description":{"description":"Table description.","type":["string","null"]},"id":{"description":"Table ID.","type":"string"},"name":{"description":"Table name.","type":"string"},"updated_at":{"description":"Updated timestamp.","type":"string"},"workspace_id":{"description":"Workspace ID.","type":"string"}},"required":["created_at","id","name","updated_at","workspace_id"],"type":"object"}},"description":"Output from TableQueryNode","properties":{"agent_context":{"additionalProperties":true,"description":"AgentContext port (can be directly connected to Agent node's context input)","title":"Agent Context","type":"object","x-i18n-key":"nodes.table.query.outputs.agent_context","x-port":true},"columns":{"description":"Column definitions (if include_schema=true).","items":{"$ref":"#/definitions/ColumnInfo"},"type":"array","x-i18n-key":"nodes.table.query.outputs.columns"},"error":{"description":"Error message if query failed.","type":["string","null"],"x-i18n-key":"nodes.table.query.outputs.error"},"found":{"description":"Whether the table was found.","type":"boolean","x-i18n-key":"nodes.table.query.outputs.found"},"markdown":{"description":"Markdown formatted table (columns + records), suitable for preview node.","type":"string","x-i18n-key":"nodes.table.query.outputs.markdown"},"page":{"description":"Current page number.","format":"uint32","minimum":0.0,"type":"integer","x-i18n-key":"nodes.table.query.outputs.page"},"records":{"description":"Records data.","items":{"$ref":"#/definitions/RecordInfo"},"type":"array","x-i18n-key":"nodes.table.query.outputs.records"},"success":{"description":"Whether the query was successful.","type":"boolean","x-i18n-key":"nodes.table.query.outputs.success"},"table":{"anyOf":[{"$ref":"#/definitions/TableInfo"},{"type":"null"}],"description":"Table metadata (if found).","x-i18n-key":"nodes.table.query.outputs.table"},"total_pages":{"description":"Total number of pages.","format":"uint32","minimum":0.0,"title":"Total Pages","type":"integer","x-i18n-key":"nodes.table.query.outputs.total_pages"},"total_records":{"description":"Total number of records in the table.","format":"uint64","minimum":0.0,"title":"Total Records","type":"integer","x-i18n-key":"nodes.table.query.outputs.total_records"}},"required":["agent_context","columns","found","markdown","page","records","success","total_pages","total_records"],"title":"TableQueryOutput","type":"object","x-collapsed-visible":["markdown","agent_context"],"x-field-order":["success","found","table","columns","records","total_records","page","total_pages","error","markdown","agent_context"]},"builtin":true,"i18nKeyPrefix":"nodes.table.query"},{"typeId":"rag/kb_manager","name":"Knowledge Base Manager","category":"rag","description":"Manage knowledge bases (list, delete, view details)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Knowledge Base Manager input","properties":{"kb_id":{"default":null,"description":"Target knowledge base (required for delete and info operations)","title":"Knowledge Base","type":"string","x-api-endpoint":"/api/v1/workspaces/{workspace_id}/knowledge-bases?limit=200","x-control":"dynamic-select","x-depends-on":"workspace_id","x-i18n-key":"nodes.rag.kb_manager.inputs.kb_id"},"operation":{"default":"list","description":"Operation to perform","title":"Operation","type":"string","x-control":"select","x-default":"list","x-i18n-key":"nodes.rag.kb_manager.inputs.operation","x-options":[{"description":"List all knowledge bases","label":"List All","value":"list"},{"description":"Delete specified knowledge base","label":"Delete","value":"delete"},{"description":"Get detailed knowledge base information","label":"View Info","value":"info"}]},"qdrant_config":{"additionalProperties":true,"description":"Qdrant configuration object from config node","title":"Qdrant Config","type":"object","x-control":"text","x-i18n-key":"nodes.rag.kb_manager.inputs.qdrant_config","x-port":true},"workspace_id":{"description":"Target workspace (required for all operations)","title":"Workspace ID","type":"string","x-api-endpoint":"/api/v1/workspaces?limit=200","x-cache-key":"static_select:/api/v1/workspaces?limit=200","x-control":"dynamic-select","x-i18n-key":"nodes.rag.kb_manager.inputs.workspace_id"}},"required":["qdrant_config","workspace_id"],"title":"KbManagerInput","type":"object","x-collapsed-visible":["workspace_id","qdrant_config","operation","kb_id"],"x-field-order":["workspace_id","qdrant_config","operation","kb_id"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"CollectionInfoOutput":{"description":"Collection info for output","properties":{"indexed_points_count":{"description":"Number of indexed document chunks","format":"uint64","minimum":0.0,"title":"Indexed Points Count","type":"integer"},"name":{"description":"Knowledge base name","title":"Name","type":"string"},"points_count":{"description":"Number of document chunks","format":"uint64","minimum":0.0,"title":"Points Count","type":"integer"},"status":{"description":"Collection status","title":"Status","type":"string"},"vectors":{"description":"Vector configurations","items":{"type":"string"},"title":"Vectors","type":"array"}},"required":["indexed_points_count","name","points_count","status","vectors"],"type":"object"}},"description":"Knowledge Base Manager output","properties":{"collection_info":{"anyOf":[{"$ref":"#/definitions/CollectionInfoOutput"},{"type":"null"}],"description":"Knowledge base details","title":"Collection Info","x-i18n-key":"nodes.rag.kb_manager.outputs.collection_info"},"collections":{"description":"List of knowledge bases","items":{"type":"string"},"title":"Collections","type":["array","null"],"x-i18n-key":"nodes.rag.kb_manager.outputs.collections"},"data":{"description":"Generic result data","title":"Data","x-i18n-key":"nodes.rag.kb_manager.outputs.data"},"error":{"description":"Error message if any","title":"Error","type":["string","null"],"x-i18n-key":"nodes.rag.kb_manager.outputs.error"},"message":{"description":"Operation message","title":"Message","type":["string","null"],"x-i18n-key":"nodes.rag.kb_manager.outputs.message"},"operation":{"description":"Operation performed","title":"Operation","type":"string","x-i18n-key":"nodes.rag.kb_manager.outputs.operation"},"success":{"description":"Whether operation succeeded","title":"Success","type":"boolean","x-i18n-key":"nodes.rag.kb_manager.outputs.success"}},"required":["operation","success"],"title":"KbManagerOutput","type":"object","x-collapsed-visible":["operation","data"],"x-field-order":["operation","success","collections","collection_info","message","error","data"]},"builtin":true,"i18nKeyPrefix":"nodes.rag.kb_manager"},{"typeId":"document/query","name":"Query Document","category":"document","description":"Get document content, optionally return as block structure or Markdown format","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for DocumentQueryNode","properties":{"as_markdown":{"default":false,"description":"Optional: return content as markdown instead of blocks.","title":"As Markdown","type":"boolean","x-i18n-key":"nodes.document.query.inputs.as_markdown"},"document_id":{"description":"ID of the document to query.","title":"Document Id","type":"string","x-i18n-key":"nodes.document.query.inputs.document_id"},"include_content":{"default":true,"description":"Whether to include full block content (default: true).","title":"Include Content","type":"boolean","x-i18n-key":"nodes.document.query.inputs.include_content"}},"required":["document_id"],"title":"DocumentQueryInput","type":"object","x-field-order":["document_id","include_content","as_markdown"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"BlockInfo":{"description":"Block information in output","properties":{"block_type":{"description":"Block type (paragraph, heading1, etc.).","type":"string"},"children":{"description":"Child block IDs.","items":{"type":"string"},"type":"array"},"content":{"description":"Text content of the block.","type":"string"},"id":{"description":"Block ID.","type":"string"}},"required":["block_type","children","content","id"],"type":"object"}},"description":"Output from DocumentQueryNode","properties":{"block_count":{"description":"Number of blocks.","format":"uint","minimum":0.0,"title":"Block Count","type":"integer","x-i18n-key":"nodes.document.query.outputs.block_count"},"blocks":{"description":"All blocks in the document.","items":{"$ref":"#/definitions/BlockInfo"},"type":"array","x-i18n-key":"nodes.document.query.outputs.blocks"},"character_count":{"description":"Total character count.","format":"uint","minimum":0.0,"type":"integer","x-i18n-key":"nodes.document.query.outputs.character_count"},"content_type":{"description":"Content type (richtext/markdown).","title":"Content Type","type":["string","null"],"x-i18n-key":"nodes.document.query.outputs.content_type"},"document_id":{"description":"Document ID (if found).","title":"Document Id","type":["string","null"],"x-i18n-key":"nodes.document.query.outputs.document_id"},"error":{"description":"Error message if query failed.","type":["string","null"],"x-i18n-key":"nodes.document.query.outputs.error"},"found":{"description":"Whether the document was found.","type":"boolean","x-i18n-key":"nodes.document.query.outputs.found"},"markdown":{"description":"Full document content as markdown (if as_markdown=true).","type":["string","null"],"x-i18n-key":"nodes.document.query.outputs.markdown"},"plain_text":{"description":"Plain text content.","title":"Plain Text","type":["string","null"],"x-i18n-key":"nodes.document.query.outputs.plain_text"},"root_block_id":{"description":"Root block ID.","title":"Root Block Id","type":["string","null"],"x-i18n-key":"nodes.document.query.outputs.root_block_id"},"success":{"description":"Whether the query was successful.","type":"boolean","x-i18n-key":"nodes.document.query.outputs.success"},"title":{"description":"Document title.","type":["string","null"],"x-i18n-key":"nodes.document.query.outputs.title"}},"required":["block_count","blocks","character_count","found","success"],"title":"DocumentQueryOutput","type":"object","x-collapsed-visible":["markdown","plain_text"],"x-field-order":["success","found","document_id","title","blocks","markdown","plain_text","block_count","character_count","error"]},"builtin":true,"i18nKeyPrefix":"nodes.document.query"},{"typeId":"tools/schedule","name":"Schedule Manager","category":"scheduler","description":"Directly list, create, update, pause, resume, cancel, and inspect scheduled tasks","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"action":{"default":"","description":"Action type: list_tasks / get_task / create_task / update_task / pause_task / resume_task / cancel_task","options":[{"label":"List Tasks","value":"list_tasks"},{"label":"Get Task","value":"get_task"},{"label":"Create Task","value":"create_task"},{"label":"Update Task","value":"update_task"},{"label":"Pause Task","value":"pause_task"},{"label":"Resume Task","value":"resume_task"},{"label":"Cancel Task","value":"cancel_task"}],"title":"Action","type":"string","x-control":"select","x-i18n-key":"nodes.tools.schedule.inputs.action"},"custom_cron":{"default":null,"description":"Custom cron expression","title":"Custom Cron","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.custom_cron"},"frequency":{"default":null,"description":"Frequency: once, every_minute, hourly, daily, weekly, monthly, custom","title":"Frequency","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.frequency"},"id":{"default":null,"description":"Numeric scheduled task ID","title":"Task ID","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.id"},"label":{"default":null,"description":"Human-readable task label","title":"Label","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.label"},"limit":{"default":50,"description":"Max return count (default 50, max 500)","format":"uint32","minimum":0.0,"title":"Limit","type":"integer","x-i18n-key":"nodes.tools.schedule.inputs.limit"},"max_retries":{"default":null,"description":"Maximum retries (default 3)","format":"int32","title":"Max Retries","type":["integer","null"],"x-i18n-key":"nodes.tools.schedule.inputs.max_retries"},"mode":{"default":"manual","description":"Execution mode: Manual=user fills parameters, Llm=LLM auto-fills parameters","enum":["manual","llm"],"options":[{"label":"manual","value":"manual"},{"label":"llm","value":"llm"}],"type":"string","x-control":"select","x-i18n-key":"nodes.tools.schedule.inputs.mode"},"offset":{"default":0,"description":"Pagination offset (default 0)","format":"uint32","minimum":0.0,"title":"Offset","type":"integer","x-i18n-key":"nodes.tools.schedule.inputs.offset"},"params":{"default":null,"description":"Explicit workflow params object","title":"Params","x-i18n-key":"nodes.tools.schedule.inputs.params"},"priority":{"default":null,"description":"Execution priority (default 0)","format":"int32","title":"Priority","type":["integer","null"],"x-i18n-key":"nodes.tools.schedule.inputs.priority"},"run_at":{"default":null,"description":"Local datetime string, e.g. 2026-04-10T09:30 or 2026-04-10T09:30:00","title":"Run At","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.run_at"},"status":{"default":null,"description":"Filter status for list_tasks: pending, running, completed, failed, cancelled, paused","title":"Status","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.status"},"target_node_id":{"default":null,"description":"Node ID for raw_input routing","title":"Target Node ID","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.target_node_id"},"task_text":{"default":null,"description":"Natural language task description","title":"Task Text","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.task_text"},"timezone":{"default":null,"description":"IANA timezone, default Asia/Shanghai","title":"Timezone","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.timezone"},"workflow_id":{"default":null,"description":"Workflow UUID","title":"Workflow ID","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.inputs.workflow_id"}},"title":"ScheduleToolInput","type":"object","x-collapsed-visible":["mode","action"],"x-field-order":["mode","action","id","workflow_id","status","limit","offset","run_at","frequency","custom_cron","timezone","task_text","target_node_id","params","priority","max_retries","label"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"count":{"description":"Current page result count","format":"uint","minimum":0.0,"title":"Count","type":["integer","null"],"x-i18n-key":"nodes.tools.schedule.outputs.count"},"data":{"description":"Query result or action result","title":"Data","x-i18n-key":"nodes.tools.schedule.outputs.data"},"error":{"description":"Error message","title":"Error","type":["string","null"],"x-i18n-key":"nodes.tools.schedule.outputs.error"},"status":{"description":"Operation status: ok / not_found / error / llm_config","title":"Status","type":"string","x-i18n-key":"nodes.tools.schedule.outputs.status"},"total":{"description":"Total count before pagination","format":"uint","minimum":0.0,"title":"Total","type":["integer","null"],"x-i18n-key":"nodes.tools.schedule.outputs.total"}},"required":["status"],"title":"ScheduleToolOutput","type":"object","x-collapsed-visible":["status","data"],"x-field-order":["status","data","count","total","error"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.schedule"},{"typeId":"tools/mcp_hub","name":"MCP Hub","category":"tools","description":"Connect one or more MCP servers in one place. Discover tools, manage visibility, and call tools with unified output.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"McpServerDefinition":{"properties":{"args_text":{"default":"","description":"One argument per line.","title":"Arguments","type":"string","x-control":"textarea"},"authorization":{"default":"","description":"Authorization header value, for example: Bearer <token>.","title":"Authorization","type":"string"},"command":{"default":"","description":"Command used for stdio transport, for example: uvx or npx.","title":"Command","type":"string"},"description":{"default":"","description":"Optional note to help identify this server.","title":"Description","type":"string","x-control":"textarea"},"editor_mode":{"default":"form","description":"Choose how to edit this server: form fields or raw JSON.","enum":["form","json"],"options":[{"label":"Form","value":"form"},{"label":"JSON","value":"json"}],"title":"Config Mode","type":"string","x-control":"select"},"enabled":{"default":true,"description":"Turn this MCP server on or off.","title":"Enabled","type":"boolean","x-control":"switch"},"env_text":{"default":"","description":"One env var per line in KEY=VALUE format.","title":"Environment Variables","type":"string","x-control":"textarea"},"headers_text":{"default":"","description":"One header per line in KEY=VALUE format.","title":"Headers","type":"string","x-control":"textarea"},"long_running":{"default":false,"description":"Keep a persistent session for slower servers or longer workflows.","title":"Long-Running Mode","type":"boolean","x-control":"switch"},"name":{"description":"Display name of this MCP server.","title":"Name","type":"string"},"raw_json":{"default":"","description":"Full server config in JSON (used when Config Mode is JSON).","title":"JSON Config","type":"string","x-control":"code-editor"},"timeout_secs":{"default":null,"description":"Per-server timeout in seconds. Leave empty to use the default.","title":"Timeout (Seconds)","type":["integer","null"],"x-control":"number"},"transport":{"default":"stdio","description":"How this MCP server is connected.","enum":["stdio","streamable_http"],"options":[{"label":"Stdio (stdin/stdout)","value":"stdio"},{"label":"Streamable HTTP","value":"streamable_http"}],"title":"Transport","type":"string","x-control":"select"},"url":{"default":"","description":"HTTP endpoint for this MCP server.","title":"URL","type":"string"}},"required":["name"],"type":"object"}},"properties":{"arguments":{"default":null,"description":"工具参数（JSON 对象，由用户或 LLM 提供）","title":"Arguments","type":["object","array","string","number","integer","boolean","null"],"x-advanced":true,"x-control":"code-editor","x-debug-field":true,"x-i18n-key":"nodes.tools.mcp_hub.inputs.arguments"},"discover_only":{"default":false,"description":"发现模式开关：开启后只列出所有服务器的可用工具，不执行工具调用","title":"Discover Only","type":"boolean","x-advanced":true,"x-control":"switch","x-debug-field":true,"x-i18n-key":"nodes.tools.mcp_hub.inputs.discover_only"},"env_vars":{"additionalProperties":{"type":"string"},"default":null,"description":"Env vars from the credential node. These values are used for ${env:KEY} placeholders in URL, authorization, headers, arguments, and env fields.","title":"Env Vars","type":["object","null"],"x-i18n-key":"nodes.tools.mcp_hub.inputs.env_vars"},"server_registry":{"default":[],"description":"结构化 MCP 服务器列表。前端可渲染为“列表 + 独立弹窗编辑器”。","items":{"$ref":"#/definitions/McpServerDefinition"},"type":"array","x-control":"mcp-server-manager","x-fallback-control":"code-editor","x-i18n-key":"nodes.tools.mcp_hub.inputs.server_registry","x-mcp-server-manager":{"itemIdentityKey":"name","statusField":"result","supportsFormMode":true,"supportsModalEditor":true,"supportsRawJsonMode":true,"writeBack":{"format":"array","targetField":"server_registry"}}},"timeout_ms":{"default":null,"description":"请求超时（毫秒，0 或留空表示不限时）","title":"Timeout (ms)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.mcp_hub.inputs.timeout_ms"},"tool_name":{"default":"","description":"要调用的工具名。格式 \"server_name:tool_name\"（多服务器时明确指定） 或直接 \"tool_name\"（单服务器时自动选择）。 discover_only 为 true 时忽略此字段。","title":"Tool Name","type":"string","x-advanced":true,"x-debug-field":true,"x-i18n-key":"nodes.tools.mcp_hub.inputs.tool_name"},"tool_visibility":{"default":null,"description":"工具可见性配置（JSON 字符串，可选） 格式：{\"server:tool\": {\"visible\": true, \"callable\": true}, \"*\": {...}}","title":"Tool Visibility","type":"string","x-advanced":true,"x-control":"textarea","x-deprecated":true,"x-i18n-key":"nodes.tools.mcp_hub.inputs.tool_visibility"},"visibility_config":{"additionalProperties":true,"default":null,"description":"结构化工具可见性配置（推荐）\n\n格式： { \"servers\": {\"server-a\": {\"visible\": true, \"callable\": true}, \"*\": {...}}, \"tools\": {\"server-a:search\": {\"visible\": true, \"callable\": true}, \"*\": {...}} }","properties":{"cache_config_key":true,"cache_tested_at":true,"cached_discovered_tools":true,"cached_upstream_servers":true,"servers":true,"tools":true},"title":"Visibility Config","type":"object","x-control":"mcp-visibility-editor","x-fallback-control":"code-editor","x-i18n-key":"nodes.tools.mcp_hub.inputs.visibility_config","x-mcp-visibility-editor":{"dataSource":{"discoveredToolsField":"discovered_tools","upstreamServersField":"upstream_servers"},"supportsBatchActions":true,"writeBack":{"format":"structured","targetField":"visibility_config"}}}},"title":"McpHubInput","type":"object","x-collapsed-visible":["server_registry"],"x-field-order":["server_registry","tool_name","arguments","tool_visibility","visibility_config","discover_only","timeout_ms","env_vars"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"result":{"description":"Unified result with summary, server status, discovered tools, and optional tool call output.","title":"Result","x-i18n-key":"nodes.tools.mcp_hub.outputs.result"}},"required":["result"],"title":"McpHubOutput","type":"object","x-collapsed-visible":["result"],"x-field-order":["result"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.mcp_hub"},{"typeId":"tools/http","name":"HTTP Tool","category":"tools","description":"Send HTTP requests to specified URL, supports manual mode and LLM mode","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"body":{"default":null,"description":"Request body (JSON string or form data)","maxLength":200000,"title":"Body","type":"string","x-control":"code-editor","x-i18n-key":"nodes.tools.http.inputs.body"},"credential_id":{"default":null,"description":"HTTP authentication credential ID (optional, for Bearer Token or Basic Auth)","title":"Credential","type":"string","x-control":"credential-select","x-credential-providers":["bearer","basic"],"x-i18n-key":"nodes.tools.http.inputs.credential_id"},"headers":{"additionalProperties":{"type":"string"},"default":null,"description":"Custom request headers (optional)","title":"Headers","type":["object","null"],"x-i18n-key":"nodes.tools.http.inputs.headers"},"method":{"default":"GET","description":"HTTP method","enum":["GET","POST","PUT","DELETE","PATCH"],"options":[{"label":"GET","value":"GET"},{"label":"POST","value":"POST"},{"label":"PUT","value":"PUT"},{"label":"DELETE","value":"DELETE"},{"label":"PATCH","value":"PATCH"}],"title":"Method","type":"string","x-control":"select","x-i18n-key":"nodes.tools.http.inputs.method"},"mode":{"default":"manual","description":"Execution mode: Manual=user fills all parameters, Llm=LLM auto-fills parameters","oneOf":[{"description":"手动模式：用户在前端填写所有参数","enum":["manual"],"type":"string"},{"description":"LLM 模式：LLM 通过 ReAct 调用时填充参数","enum":["llm"],"type":"string"}],"title":"Execution Mode","x-control":"select","x-i18n-key":"nodes.tools.http.inputs.mode"},"timeout_seconds":{"default":30,"description":"Timeout in seconds","format":"uint64","maximum":300.0,"minimum":1.0,"title":"Timeout (seconds)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.http.inputs.timeout_seconds"},"url":{"default":null,"description":"Target URL (filled by LLM in LLM mode, or by user in manual mode)","maxLength":2048,"title":"URL","type":["string","null"],"x-i18n-key":"nodes.tools.http.inputs.url"}},"title":"HttpInput","type":"object","x-collapsed-visible":["credential_id","mode","url"],"x-field-order":["credential_id","mode","url","method","headers","body","timeout_seconds"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"HTTP 工具执行输出","properties":{"body":{"description":"Response body content","title":"Body","type":["string","null"],"x-i18n-key":"nodes.tools.http.outputs.body"},"body_truncated":{"description":"Whether response body was truncated","title":"Body Truncated","type":"boolean","x-i18n-key":"nodes.tools.http.outputs.body_truncated"},"credential_used":{"description":"Whether credential authentication was used","title":"Credential Used","type":"boolean","x-i18n-key":"nodes.tools.http.outputs.credential_used"},"elapsed_ms":{"description":"Request elapsed time in milliseconds","format":"uint64","minimum":0.0,"title":"Elapsed Ms","type":["integer","null"],"x-i18n-key":"nodes.tools.http.outputs.elapsed_ms"},"headers":{"additionalProperties":{"type":"string"},"description":"Response headers","title":"Headers","type":["object","null"],"x-i18n-key":"nodes.tools.http.outputs.headers"},"mode":{"description":"Execution mode","title":"Mode","type":"string","x-i18n-key":"nodes.tools.http.outputs.mode"},"status_code":{"description":"HTTP response status code","format":"uint16","minimum":0.0,"title":"Status Code","type":["integer","null"],"x-i18n-key":"nodes.tools.http.outputs.status_code"},"timeout_seconds":{"description":"Timeout in seconds","format":"uint64","minimum":0.0,"title":"Timeout Seconds","type":"integer","x-i18n-key":"nodes.tools.http.outputs.timeout_seconds"}},"required":["body_truncated","credential_used","mode","timeout_seconds"],"title":"HttpOutput","type":"object","x-collapsed-visible":["credential_id","mode","url"],"x-field-order":["mode","timeout_seconds","status_code","body","body_truncated","headers","elapsed_ms","credential_used"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.http"},{"typeId":"tools/workflow_inspect","name":"Workflow Inspector","category":"tools","description":"Read-only query for workflow definitions, node schemas, and execution status. list_workflows=list workflows (name/tag filter, pagination), get_workflow=get workflow details (nodes/edges/tags), list_node_types=list all node types, get_node_schema=get node input/output schema, get_execution=query execution status and node outputs by execution_id, list_executions=list execution history for a workflow (requires workflow_id)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"action":{"default":"","description":"Operation type: list_workflows / get_workflow / list_node_types / get_node_schema","options":[{"label":"List Workflows","value":"list_workflows"},{"label":"Get Workflow","value":"get_workflow"},{"label":"List Node Types","value":"list_node_types"},{"label":"Get Node Schema","value":"get_node_schema"},{"label":"Get Execution","value":"get_execution"},{"label":"List Executions","value":"list_executions"}],"title":"Action","type":"string","x-control":"select","x-i18n-key":"nodes.tools.workflow_inspect.inputs.action"},"category_filter":{"default":null,"description":"Node category filter (optional for list_node_types)","title":"Category Filter","type":["string","null"],"x-i18n-key":"nodes.tools.workflow_inspect.inputs.category_filter"},"execution_id":{"default":null,"description":"Execution UUID (required for get_execution)","title":"Execution ID","type":["string","null"],"x-i18n-key":"nodes.tools.workflow_inspect.inputs.execution_id"},"limit":{"default":50,"description":"Max return count (default 50, max 200)","format":"uint32","minimum":0.0,"title":"Limit","type":"integer","x-i18n-key":"nodes.tools.workflow_inspect.inputs.limit"},"mode":{"default":"manual","description":"Execution mode: Manual=user fills parameters, Llm=LLM auto-fills parameters","enum":["manual","llm"],"options":[{"label":"manual","value":"manual"},{"label":"llm","value":"llm"}],"type":"string","x-control":"select","x-i18n-key":"nodes.tools.workflow_inspect.inputs.mode"},"name_filter":{"default":null,"description":"Workflow name filter (optional for list_workflows, fuzzy match)","title":"Name Filter","type":["string","null"],"x-i18n-key":"nodes.tools.workflow_inspect.inputs.name_filter"},"node_type":{"default":null,"description":"Node type ID (required for get_node_schema, e.g. agent/llm)","title":"Node Type","type":["string","null"],"x-i18n-key":"nodes.tools.workflow_inspect.inputs.node_type"},"offset":{"default":0,"description":"Pagination offset (default 0)","format":"uint32","minimum":0.0,"title":"Offset","type":"integer","x-i18n-key":"nodes.tools.workflow_inspect.inputs.offset"},"tag_filter":{"default":null,"description":"Workflow tag filter (optional for list_workflows, exact match)","title":"Tag Filter","type":["string","null"],"x-i18n-key":"nodes.tools.workflow_inspect.inputs.tag_filter"},"workflow_id":{"default":null,"description":"Workflow UUID (required for get_workflow)","title":"Workflow ID","type":["string","null"],"x-i18n-key":"nodes.tools.workflow_inspect.inputs.workflow_id"}},"title":"WorkflowInspectInput","type":"object","x-collapsed-visible":["mode"],"x-field-order":["mode","action","workflow_id","name_filter","tag_filter","limit","offset","node_type","category_filter","execution_id"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"count":{"description":"Current page result count","format":"uint","minimum":0.0,"title":"Count","type":["integer","null"],"x-i18n-key":"nodes.tools.workflow_inspect.outputs.count"},"data":{"description":"Query result (JSON format)","title":"Data","x-i18n-key":"nodes.tools.workflow_inspect.outputs.data"},"error":{"description":"Error message","title":"Error","type":["string","null"],"x-i18n-key":"nodes.tools.workflow_inspect.outputs.error"},"status":{"description":"Operation status: ok / not_found / error","title":"Status","type":"string","x-i18n-key":"nodes.tools.workflow_inspect.outputs.status"},"total":{"description":"Total count (after filtering, before pagination)","format":"uint","minimum":0.0,"title":"Total","type":["integer","null"],"x-i18n-key":"nodes.tools.workflow_inspect.outputs.total"}},"required":["status"],"title":"WorkflowInspectOutput","type":"object","x-collapsed-visible":["status","data"],"x-field-order":["status","data","count","total","error"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.workflow_inspect"},{"typeId":"rag/document_indexer","name":"Document Indexer","category":"rag","description":"Index documents into vector database (standard/enhanced modes)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Document Indexer input","properties":{"child_chunks":{"default":null,"description":"Child chunks from chunker node (optional)","items":true,"title":"Child Chunks","type":["array","null"],"x-i18n-key":"nodes.rag.document_indexer.inputs.child_chunks"},"content":{"default":null,"description":"Document text content to index (optional if chunks are provided from chunker)","title":"Document Content","type":["string","null"],"x-i18n-key":"nodes.rag.document_indexer.inputs.content"},"document_id":{"default":null,"description":"Document identifier (optional, auto-generated if not provided)","title":"Document ID","type":["string","null"],"x-i18n-key":"nodes.rag.document_indexer.inputs.document_id"},"document_title":{"default":null,"description":"Readable document title/source label (optional, falls back to workspace name)","title":"Document Title","type":["string","null"],"x-i18n-key":"nodes.rag.document_indexer.inputs.document_title"},"embedding_config":{"additionalProperties":true,"description":"Embedding configuration object from config node","title":"Embedding Config","type":"object","x-control":"text","x-i18n-key":"nodes.rag.document_indexer.inputs.embedding_config","x-port":true},"generate_context":{"default":null,"description":"Use LLM to generate context descriptions for each chunk (enhanced mode)","title":"Generate Context","type":["boolean","null"],"x-i18n-key":"nodes.rag.document_indexer.inputs.generate_context"},"index_mode":{"default":null,"description":"Standard or enhanced mode","title":"Index Mode","type":"string","x-control":"select","x-default":"standard","x-i18n-key":"nodes.rag.document_indexer.inputs.index_mode","x-options":[{"description":"Child vectors only (economy)","label":"Standard","value":"standard"},{"description":"Parent + child + context vectors (full-featured)","label":"Enhanced","value":"enhanced"}]},"kb_id":{"description":"Target knowledge base (collection resolved from DB, workspace-validated)","title":"Knowledge Base","type":"string","x-api-endpoint":"/api/v1/workspaces/{workspace_id}/knowledge-bases?limit=200","x-control":"dynamic-select","x-depends-on":"workspace_id","x-i18n-key":"nodes.rag.document_indexer.inputs.kb_id"},"llm_config":{"additionalProperties":true,"default":null,"description":"LLM configuration object from config node (optional, for context generation)","title":"LLM Config","type":"object","x-control":"text","x-i18n-key":"nodes.rag.document_indexer.inputs.llm_config","x-port":true},"parent_chunks":{"default":null,"description":"Parent chunks from chunker node (optional, if provided skips internal chunking)","items":true,"title":"Parent Chunks","type":["array","null"],"x-i18n-key":"nodes.rag.document_indexer.inputs.parent_chunks"},"qdrant_config":{"additionalProperties":true,"description":"Qdrant configuration object from config node","title":"Qdrant Config","type":"object","x-control":"text","x-i18n-key":"nodes.rag.document_indexer.inputs.qdrant_config","x-port":true},"version":{"default":null,"description":"Document version number (optional, for idempotency check)","format":"uint32","minimum":0.0,"title":"Document Version","type":["integer","null"],"x-i18n-key":"nodes.rag.document_indexer.inputs.version"},"workspace_id":{"description":"Target workspace (required for permission validation)","title":"Workspace ID","type":"string","x-api-endpoint":"/api/v1/workspaces?limit=200","x-cache-key":"static_select:/api/v1/workspaces?limit=200","x-control":"dynamic-select","x-i18n-key":"nodes.rag.document_indexer.inputs.workspace_id"}},"required":["embedding_config","kb_id","qdrant_config","workspace_id"],"title":"DocumentIndexerInput","type":"object","x-collapsed-visible":["qdrant_config","parent_chunks","child_chunks","embedding_config","llm_config"],"x-field-order":["workspace_id","kb_id","qdrant_config","content","document_id","document_title","version","parent_chunks","child_chunks","index_mode","embedding_config","generate_context","llm_config"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Document Indexer output","properties":{"child_chunks":{"description":"Number of child chunks created","format":"uint","minimum":0.0,"title":"Child Chunks","type":"integer","x-i18n-key":"nodes.rag.document_indexer.outputs.child_chunks"},"collection_name":{"description":"Target collection name","title":"Collection Name","type":"string","x-i18n-key":"nodes.rag.document_indexer.outputs.collection_name"},"context_generated":{"description":"Whether context descriptions were generated","title":"Context Generated","type":"boolean","x-i18n-key":"nodes.rag.document_indexer.outputs.context_generated"},"document_id":{"description":"Indexed document ID","title":"Document ID","type":"string","x-i18n-key":"nodes.rag.document_indexer.outputs.document_id"},"error":{"description":"Error message if any","title":"Error","type":["string","null"],"x-i18n-key":"nodes.rag.document_indexer.outputs.error"},"index_mode":{"description":"Index mode used","title":"Index Mode","type":"string","x-i18n-key":"nodes.rag.document_indexer.outputs.index_mode"},"parent_chunks":{"description":"Number of parent chunks created","format":"uint","minimum":0.0,"title":"Parent Chunks","type":"integer","x-i18n-key":"nodes.rag.document_indexer.outputs.parent_chunks"},"skipped":{"default":false,"description":"Whether skipped due to idempotency check","title":"Skipped","type":"boolean","x-i18n-key":"nodes.rag.document_indexer.outputs.skipped"},"success":{"description":"Whether indexing succeeded","title":"Success","type":"boolean","x-i18n-key":"nodes.rag.document_indexer.outputs.success"},"summary":{"description":"Execution result summary","title":"Summary","type":"string","x-i18n-key":"nodes.rag.document_indexer.outputs.summary"},"vectors_stored":{"description":"Total vectors stored","format":"uint","minimum":0.0,"title":"Vectors Stored","type":"integer","x-i18n-key":"nodes.rag.document_indexer.outputs.vectors_stored"}},"required":["child_chunks","collection_name","context_generated","document_id","index_mode","parent_chunks","success","summary","vectors_stored"],"title":"DocumentIndexerOutput","type":"object","x-collapsed-visible":["context_generated"],"x-field-order":["document_id","parent_chunks","child_chunks","vectors_stored","context_generated","index_mode","collection_name","skipped","success","summary","error"]},"builtin":true,"i18nKeyPrefix":"nodes.rag.document_indexer"},{"typeId":"workspace/settings","name":"Workspace Settings","category":"workspace","description":"Read or update workspace settings (theme, language, features, quotas)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"ai_chat_enabled":{"default":null,"description":"Enable AI chat features (update mode)","title":"AI Chat Enabled","type":["boolean","null"],"x-i18n-key":"nodes.workspace.settings.inputs.ai_chat_enabled"},"default_workflow_id":{"default":null,"description":"Default conversation workflow ID (update mode)","title":"Default Workflow ID","type":["string","null"],"x-i18n-key":"nodes.workspace.settings.inputs.default_workflow_id"},"knowledge_base_enabled":{"default":null,"description":"Enable knowledge base features (update mode)","title":"Knowledge Base Enabled","type":["boolean","null"],"x-i18n-key":"nodes.workspace.settings.inputs.knowledge_base_enabled"},"language":{"default":null,"description":"Default language code, e.g. zh-CN, en-US (update mode)","title":"Language","type":["string","null"],"x-i18n-key":"nodes.workspace.settings.inputs.language"},"mode":{"default":"get","description":"get: Read settings; update: Update settings","enum":["get","update"],"options":[{"label":"get","value":"get"},{"label":"update","value":"update"}],"type":"string","x-control":"select","x-i18n-key":"nodes.workspace.settings.inputs.mode"},"theme":{"default":null,"description":"Theme name (update mode)","title":"Theme","type":["string","null"],"x-i18n-key":"nodes.workspace.settings.inputs.theme"},"workspace_id":{"description":"Target workspace","type":"string","x-api-endpoint":"/api/v1/workspaces?limit=200","x-cache-key":"static_select:/api/v1/workspaces?limit=200","x-control":"dynamic-select","x-i18n-key":"nodes.workspace.settings.inputs.workspace_id"}},"required":["workspace_id"],"title":"WorkspaceSettingsNodeInput","type":"object","x-field-order":["mode","workspace_id","theme","language","default_workflow_id","ai_chat_enabled","knowledge_base_enabled"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"default_workflow_id":{"title":"Default Workflow Id","type":["string","null"],"x-i18n-key":"nodes.workspace.settings.outputs.default_workflow_id"},"error":{"type":["string","null"],"x-i18n-key":"nodes.workspace.settings.outputs.error"},"language":{"type":["string","null"],"x-i18n-key":"nodes.workspace.settings.outputs.language"},"settings_json":{"title":"Settings Json","type":"string","x-i18n-key":"nodes.workspace.settings.outputs.settings_json"},"success":{"type":"boolean","x-i18n-key":"nodes.workspace.settings.outputs.success"},"theme":{"type":["string","null"],"x-i18n-key":"nodes.workspace.settings.outputs.theme"},"workspace_id":{"title":"Workspace Id","type":"string","x-i18n-key":"nodes.workspace.settings.outputs.workspace_id"}},"required":["settings_json","success","workspace_id"],"title":"WorkspaceSettingsNodeOutput","type":"object","x-collapsed-visible":["success","theme","language","error"],"x-field-order":["success","workspace_id","default_workflow_id","theme","language","settings_json","error"]},"builtin":true,"i18nKeyPrefix":"nodes.workspace.settings"},{"typeId":"tools/list_directory","name":"List Directory","category":"tools","description":"List directory contents, return structured entry list. Supports glob filtering and recursive depth control, max 200 entries.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"directory_path":{"description":"Absolute directory path to list","title":"Directory Path","type":"string","x-i18n-key":"nodes.tools.list_directory.inputs.directory_path"},"max_depth":{"description":"Recursion depth (0=directory itself only, 1=direct children). Default 1, max 5.","format":"uint32","minimum":0.0,"title":"Max Depth","type":["integer","null"],"x-i18n-key":"nodes.tools.list_directory.inputs.max_depth"},"pattern":{"description":"Filename glob filter (e.g. \"*.rs\"), matches filename only, not full path","title":"Pattern","type":["string","null"],"x-i18n-key":"nodes.tools.list_directory.inputs.pattern"},"show_hidden":{"default":false,"description":"Whether to show hidden files/directories (starting with .), default false","title":"Show Hidden","type":"boolean","x-i18n-key":"nodes.tools.list_directory.inputs.show_hidden"}},"required":["directory_path"],"title":"ListDirectoryInput","type":"object"},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"DirEntry":{"description":"目录条目","properties":{"absolute_path":{"description":"绝对规范路径","type":"string"},"entry_type":{"allOf":[{"$ref":"#/definitions/EntryType"}],"description":"条目类型"},"is_binary":{"description":"是否为二进制文件（仅 File 有效，目录/链接为 None）","type":["boolean","null"]},"modified":{"description":"修改时间（ISO 8601）","type":["string","null"]},"name":{"description":"文件/目录名","type":"string"},"relative_path":{"description":"相对于 directory_path 的路径","type":"string"},"size_bytes":{"description":"文件大小（目录为 None）","format":"uint64","minimum":0.0,"type":["integer","null"]}},"required":["absolute_path","entry_type","name","relative_path"],"type":"object"},"EntryType":{"description":"条目类型","enum":["file","dir","symlink"],"type":"string"}},"properties":{"directory_path":{"description":"规范化后的目录路径","title":"Directory Path","type":"string","x-i18n-key":"nodes.tools.list_directory.outputs.directory_path"},"elapsed_ms":{"description":"操作耗时（毫秒）","format":"uint64","minimum":0.0,"title":"Elapsed Ms","type":"integer","x-i18n-key":"nodes.tools.list_directory.outputs.elapsed_ms"},"entries":{"description":"条目列表（按 name 字母序排列）","items":{"$ref":"#/definitions/DirEntry"},"type":"array","x-i18n-key":"nodes.tools.list_directory.outputs.entries"},"error":{"description":"错误信息","type":["string","null"],"x-i18n-key":"nodes.tools.list_directory.outputs.error"},"total_entries":{"description":"实际返回条目数","format":"uint32","minimum":0.0,"title":"Total Entries","type":"integer","x-i18n-key":"nodes.tools.list_directory.outputs.total_entries"},"truncated":{"description":"是否因超过 200 条而截断","type":"boolean","x-i18n-key":"nodes.tools.list_directory.outputs.truncated"}},"required":["directory_path","elapsed_ms","entries","total_entries","truncated"],"title":"ListDirectoryOutput","type":"object","x-collapsed-visible":["directory_path","entries"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.list_directory"},{"typeId":"tools/code_js","name":"JavaScript Executor","category":"tools","description":"Run JavaScript in QuickJS engine sandbox (NO syscalls, NO network, NO filesystem — fully isolated). FAIL-CLOSED: errors if QuickJS is unavailable. Use for: pure computation, JSON/object transformation, string manipulation, math. Do NOT use for network requests (→ Shell) or complex algorithms needing libraries (→ Python). Just provide script and input. Example: {\"script\":\"input.values.reduce((a,b)=>a+b,0)\",\"input\":{\"values\":[1,2,3]}}","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"input":{"default":null,"description":"Input data (any JSON), accessible via `input` variable in script","title":"Input","x-i18n-key":"nodes.tools.code_js.inputs.input"},"memory_mb":{"default":128,"description":"Memory limit in MB. QuickJS engine internal soft constraint. Default 128MB.","format":"uint64","maximum":1024.0,"minimum":16.0,"title":"Memory Limit (MB)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.code_js.inputs.memory_mb"},"script":{"default":null,"description":"[Required] JavaScript script, last expression value becomes result. Example: input.values.reduce((a,b)=>a+b,0)","title":"Script","type":"string","x-control":"code-editor","x-i18n-key":"nodes.tools.code_js.inputs.script","x-rows":5},"timeout_ms":{"default":5000,"description":"Timeout in milliseconds. Default 5000ms, max 300000ms.","format":"uint64","maximum":300000.0,"minimum":100.0,"title":"Timeout (ms)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.code_js.inputs.timeout_ms"}},"title":"CodeJsInput","type":"object","x-collapsed-visible":["script"],"x-field-order":["input","script","timeout_ms","memory_mb"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ExecutionMetrics":{"properties":{"duration_ms":{"format":"uint64","minimum":0.0,"type":"integer"},"input_size_bytes":{"format":"uint","minimum":0.0,"type":"integer"},"output_size_bytes":{"format":"uint","minimum":0.0,"type":"integer"},"peak_memory_bytes":{"format":"uint64","minimum":0.0,"type":"integer"},"runtime_type":{"type":"string"},"script_hash":{"type":["string","null"]}},"required":["duration_ms","input_size_bytes","output_size_bytes","peak_memory_bytes","runtime_type"],"type":"object"}},"properties":{"isolation_level":{"description":"Actual isolation level used: bubblewrap > quickjs > python","title":"Isolation Level","type":"string","x-i18n-key":"nodes.tools.code_js.outputs.isolation_level"},"metrics":{"allOf":[{"$ref":"#/definitions/ExecutionMetrics"}],"description":"Execution performance metrics","title":"Metrics","x-i18n-key":"nodes.tools.code_js.outputs.metrics"},"result":{"description":"Script execution result","title":"Result","x-i18n-key":"nodes.tools.code_js.outputs.result"},"stderr":{"description":"Standard error","title":"Stderr","type":"string","x-i18n-key":"nodes.tools.code_js.outputs.stderr"},"stdout":{"description":"Standard output","title":"Stdout","type":"string","x-i18n-key":"nodes.tools.code_js.outputs.stdout"},"warnings":{"description":"Script validation warnings","items":{"type":"string"},"title":"Warnings","type":"array","x-i18n-key":"nodes.tools.code_js.outputs.warnings"}},"required":["isolation_level","metrics","result","stderr","stdout","warnings"],"title":"CodeOutput","type":"object","x-collapsed-visible":["result"],"x-field-order":["result","isolation_level","metrics","stdout","stderr","warnings"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.code_js"},{"typeId":"ai/llm_branch","name":"LLM Field Branch","category":"agent","description":"Route by field conditions: supports operator comparison, dot nested path, Schema hint generation, enhanced fallback metadata","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"输入结构","properties":{"branch_fields":{"default":[],"description":"Branch field list (click + to add; each entry auto-generates a corresponding output port)","items":{"properties":{"description":{"description":"Field description (used for Schema hint generation)","type":"string"},"field_name":{"description":"Field path (supports dot notation for nested fields, e.g. action.name)","type":"string"},"match_value":{"description":"Match value (required for Equals/NotEquals/Contains/GreaterThan/LessThan)","type":"string"},"operator":{"default":"truthy","description":"Match operator (default: Truthy)","enum":["truthy","exists","equals","not_equals","contains","greater_than","less_than"],"type":"string","x-control":"select"}},"type":"object"},"title":"Branch Fields","type":"array","x-dynamic-array":{"allowAdd":true,"allowRemove":true,"maxPorts":20,"minPorts":0,"portPrefix":"branch"},"x-i18n-key":"nodes.ai.llm_branch.inputs.branch_fields"},"context":{"additionalProperties":true,"default":null,"description":"Input AgentContext (optional)","title":"Agent Context","type":"object","x-control":"code-editor","x-i18n-key":"nodes.ai.llm_branch.inputs.context","x-language":"json","x-port":true,"x-rows":2},"custom_data":{"default":null,"description":"Custom JSON data","title":"Custom Data","type":"string","x-control":"code-editor","x-i18n-key":"nodes.ai.llm_branch.inputs.custom_data","x-language":"json","x-rows":2},"generate_schema":{"default":false,"description":"Enable auto-generated JSON Schema hint output to schema_hint port (can connect to upstream LLM's system_prompt)","title":"Generate Schema","type":"boolean","x-i18n-key":"nodes.ai.llm_branch.inputs.generate_schema"},"payload_source":{"default":"response","description":"Select data extraction source","oneOf":[{"description":"从 response 字段解析 JSON","enum":["response"],"type":"string"},{"description":"从完整 context 序列化为 JSON","enum":["context"],"type":"string"},{"description":"从 custom_data 字段取值","enum":["custom"],"type":"string"}],"title":"Payload Source","x-control":"select","x-i18n-key":"nodes.ai.llm_branch.inputs.payload_source"},"response":{"default":"","description":"LLM response text (JSON format)","maxLength":200000,"title":"Response","type":"string","x-control":"code-editor","x-i18n-key":"nodes.ai.llm_branch.inputs.response","x-language":"json","x-rows":2},"strict_mode":{"default":false,"description":"Error on JSON parse failure (false routes error reason to context_out fallback)","title":"Strict Mode","type":"boolean","x-i18n-key":"nodes.ai.llm_branch.inputs.strict_mode"}},"title":"LlmBranchInput","type":"object","x-collapsed-visible":["response","branch_fields"],"x-field-order":["context","response","custom_data","payload_source","branch_fields","strict_mode","generate_schema"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"输出结构","properties":{"branch_outputs":{"description":"Branch output list, corresponding 1:1 with branch_fields (AgentContext on match, null on miss)","title":"Branch Outputs","type":"array","x-i18n-key":"nodes.ai.llm_branch.outputs.branch_outputs","x-port":true},"context_out":{"additionalProperties":true,"description":"Fallback output: outputs AgentContext from this port when no branch fields match (includes routing diagnostic metadata)","title":"Context Out","type":"object","x-i18n-key":"nodes.ai.llm_branch.outputs.context_out","x-port":true},"schema_hint":{"additionalProperties":true,"description":"Auto-generated structured output hint (can connect to upstream LLM node's system_prompt port)","title":"JSON Schema","type":"object","x-i18n-key":"nodes.ai.llm_branch.outputs.schema_hint","x-port":true}},"required":["branch_outputs","context_out","schema_hint"],"title":"LlmBranchOutput","type":"object","x-collapsed-visible":["context_out","branch_outputs"],"x-field-order":["branch_outputs","context_out","schema_hint"]},"builtin":true,"i18nKeyPrefix":"nodes.ai.llm_branch"},{"typeId":"ai/qdrant_config","name":"Qdrant Config","category":"agent","description":"Configure a Qdrant vector database connection (local/cloud/self-hosted)","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Qdrant 配置节点输入","properties":{"collection_name":{"default":null,"description":"Name of the Qdrant collection (optional, auto-derived from knowledge base if not set)","title":"Collection Name","type":["string","null"],"x-i18n-key":"nodes.ai.qdrant_config.inputs.collection_name"},"credential_id":{"default":null,"description":"Credential for Qdrant Cloud or an authenticated self-hosted server","title":"Credential","type":"string","x-conditional":{"field":"mode","values":["cloud","self_hosted"]},"x-control":"credential-select","x-credential-providers":["qdrant"],"x-i18n-key":"nodes.ai.qdrant_config.inputs.credential_id","x-optional-for":["local"]},"enable_fulltext":{"default":null,"description":"Whether to enable a BM25 full-text search index on the collection","title":"Enable Full-Text Search","type":["boolean","null"],"x-i18n-key":"nodes.ai.qdrant_config.inputs.enable_fulltext"},"mode":{"default":"local","description":"Select how Qdrant is deployed","title":"Deployment Mode","type":"string","x-control":"select","x-default":"local","x-i18n-key":"nodes.ai.qdrant_config.inputs.mode","x-options":[{"description":"Connect to a Qdrant instance running in local Docker (localhost:6334)","label":"Local Docker","value":"local"},{"description":"Connect to the hosted Qdrant Cloud service","label":"Qdrant Cloud","value":"cloud"},{"description":"Connect to a self-hosted Qdrant server","label":"Self-hosted Server","value":"self_hosted"}]},"url":{"default":null,"description":"Qdrant gRPC endpoint URL (default for local mode: http://localhost:6334)","title":"Connection URL","type":["string","null"],"x-i18n-key":"nodes.ai.qdrant_config.inputs.url"}},"title":"QdrantConfigInput","type":"object","x-field-order":["mode","url","credential_id","collection_name","enable_fulltext"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Qdrant 配置节点输出","properties":{"api_key":{"description":"API key (used in cloud/authenticated modes)","title":"API Key","type":["string","null"],"x-i18n-key":"nodes.ai.qdrant_config.outputs.api_key"},"collection_name":{"description":"Qdrant collection name","title":"Collection Name","type":["string","null"],"x-i18n-key":"nodes.ai.qdrant_config.outputs.collection_name"},"credential_id":{"description":"Credential ID used, if any","title":"Credential ID","type":["string","null"],"x-i18n-key":"nodes.ai.qdrant_config.outputs.credential_id"},"enable_fulltext":{"description":"Whether full-text search is enabled","title":"Enable Fulltext","type":"boolean","x-i18n-key":"nodes.ai.qdrant_config.outputs.enable_fulltext"},"mode":{"description":"Qdrant deployment mode","title":"Mode","type":"string","x-i18n-key":"nodes.ai.qdrant_config.outputs.mode"},"qdrant_config":{"additionalProperties":true,"description":"Complete Qdrant configuration (JSON object)","type":"object","x-i18n-key":"nodes.ai.qdrant_config.outputs.qdrant_config","x-port":true},"url":{"description":"Qdrant gRPC endpoint URL","title":"URL","type":"string","x-i18n-key":"nodes.ai.qdrant_config.outputs.url"}},"required":["enable_fulltext","mode","qdrant_config","url"],"title":"QdrantConfigOutput","type":"object","x-collapsed-visible":["collection_name","qdrant_config"],"x-field-order":["mode","url","api_key","collection_name","enable_fulltext","credential_id","qdrant_config"]},"builtin":true,"i18nKeyPrefix":"nodes.ai.qdrant_config"},{"typeId":"tools/get_execution_trace","name":"Get Execution Trace","category":"tools","description":"Read full execution trace from session_store by trace_key for LLM on-demand viewing","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"GetExecutionTrace 节点输入","properties":{"trace_key":{"description":"Trace retrieval key, obtained from conversation history summary (format: session_id:turn)","title":"Trace Key","type":"string","x-i18n-key":"nodes.tools.get_execution_trace.inputs.trace_key"}},"required":["trace_key"],"title":"GetTraceInput","type":"object","x-field-order":["trace_key"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"GetExecutionTrace 节点输出","properties":{"content":{"description":"Full execution trace content (empty string if not found)","title":"Content","type":"string","x-i18n-key":"nodes.tools.get_execution_trace.outputs.content"},"found":{"description":"Whether the corresponding trace record was found","title":"Found","type":"boolean","x-i18n-key":"nodes.tools.get_execution_trace.outputs.found"}},"required":["content","found"],"title":"GetTraceOutput","type":"object","x-field-order":["content","found"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.get_execution_trace"},{"typeId":"tools/edit_file","name":"Edit File","category":"tools","description":"Replace file content by exact content matching. Supports multiple replacement operations; writes back atomically only when all succeed; any failure keeps original file unchanged.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"Replacement":{"description":"单个替换操作","properties":{"end_line":{"description":"限制搜索范围的结束行（inclusive，可选）","format":"uint32","minimum":0.0,"type":["integer","null"]},"new_content":{"description":"替换后的内容（空字符串表示删除）","type":"string"},"old_content":{"description":"要被替换的精确内容（必须与文件完全一致，包括空白和换行符）","type":"string"},"start_line":{"description":"限制搜索范围的起始行（1-indexed，可选）","format":"uint32","minimum":0.0,"type":["integer","null"]}},"required":["new_content","old_content"],"type":"object"}},"properties":{"file_path":{"description":"Absolute file path to edit","title":"File Path","type":"string","x-i18n-key":"nodes.tools.edit_file.inputs.file_path"},"replacements":{"description":"List of replacement operations (executed in order)","items":{"$ref":"#/definitions/Replacement"},"title":"Replacements","type":"array","x-i18n-key":"nodes.tools.edit_file.inputs.replacements"}},"required":["file_path","replacements"],"title":"EditFileInput","type":"object"},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"applied_count":{"description":"成功应用的替换数","format":"uint32","minimum":0.0,"title":"Applied Count","type":"integer","x-i18n-key":"nodes.tools.edit_file.outputs.applied_count"},"error":{"description":"错误信息（一旦任意 replacement 失败即停止，文件保持原状）","type":["string","null"],"x-i18n-key":"nodes.tools.edit_file.outputs.error"},"file_path":{"description":"编辑的文件路径","title":"File Path","type":"string","x-i18n-key":"nodes.tools.edit_file.outputs.file_path"},"total_lines_after":{"description":"编辑后总行数","format":"uint32","minimum":0.0,"title":"Total Lines After","type":"integer","x-i18n-key":"nodes.tools.edit_file.outputs.total_lines_after"},"total_lines_before":{"description":"编辑前总行数","format":"uint32","minimum":0.0,"title":"Total Lines Before","type":"integer","x-i18n-key":"nodes.tools.edit_file.outputs.total_lines_before"}},"required":["applied_count","file_path","total_lines_after","total_lines_before"],"title":"EditFileOutput","type":"object","x-collapsed-visible":["applied_count"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.edit_file"},{"typeId":"tools/code_shell","name":"Shell Executor","category":"tools","description":"Run shell scripts in a bubblewrap sandbox (OS-namespace isolation: PID/IPC/UTS/network). FAIL-CLOSED: errors if bubblewrap is unavailable — no silent downgrade. Use for: curl, wget, system commands, file operations, pipeline processing, any external process. Do NOT use for pure computation (→ JS) or data transformation (→ Python). Requires allow_network=true for outbound HTTP. Example: {\"script\":\"curl -s 'wttr.in/Tokyo?format=3'\",\"allow_network\":true}","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"allow_filesystem":{"default":false,"description":"Whether to allow script to write files to workspace","title":"Allow Filesystem Write","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.code_shell.inputs.allow_filesystem"},"allow_full_disk_readonly":{"default":false,"description":"Whether to allow read-only access to entire disk (for disk-wide search/file finding). Writing still requires allow_filesystem.","title":"Allow Full Disk Read","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.code_shell.inputs.allow_full_disk_readonly"},"allow_network":{"default":false,"description":"Whether to allow network access (curl, HTTP requests etc. need to be true)","title":"Allow Network","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.code_shell.inputs.allow_network"},"input":{"default":null,"description":"Input data (any JSON), accessible via $INPUT environment variable in script","title":"Input","x-i18n-key":"nodes.tools.code_shell.inputs.input"},"memory_mb":{"default":128,"description":"Memory limit in MB. Enforced via prlimit under Bubblewrap. Default 128MB.","format":"uint64","maximum":1024.0,"minimum":16.0,"title":"Memory Limit (MB)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.code_shell.inputs.memory_mb"},"script":{"default":null,"description":"[Required] Shell script. Example: curl -s 'wttr.in/Tokyo?format=3'","title":"Script","type":"string","x-control":"code-editor","x-i18n-key":"nodes.tools.code_shell.inputs.script","x-rows":5},"timeout_ms":{"default":5000,"description":"Timeout in milliseconds. Default 5000ms, max 300000ms.","format":"uint64","maximum":300000.0,"minimum":100.0,"title":"Timeout (ms)","type":"integer","x-control":"number","x-i18n-key":"nodes.tools.code_shell.inputs.timeout_ms"},"workspace_name":{"default":null,"description":"Workspace name (e.g. project-alpha), only allows letters/digits/-/_.","title":"Workspace Name","type":["string","null"],"x-i18n-key":"nodes.tools.code_shell.inputs.workspace_name"}},"title":"CodeShellInput","type":"object","x-collapsed-visible":["script"],"x-field-order":["input","script","workspace_name","allow_filesystem","allow_full_disk_readonly","allow_network","timeout_ms","memory_mb"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"ExecutionMetrics":{"properties":{"duration_ms":{"format":"uint64","minimum":0.0,"type":"integer"},"input_size_bytes":{"format":"uint","minimum":0.0,"type":"integer"},"output_size_bytes":{"format":"uint","minimum":0.0,"type":"integer"},"peak_memory_bytes":{"format":"uint64","minimum":0.0,"type":"integer"},"runtime_type":{"type":"string"},"script_hash":{"type":["string","null"]}},"required":["duration_ms","input_size_bytes","output_size_bytes","peak_memory_bytes","runtime_type"],"type":"object"}},"properties":{"isolation_level":{"description":"Actual isolation level used: bubblewrap > quickjs > python","title":"Isolation Level","type":"string","x-i18n-key":"nodes.tools.code_shell.outputs.isolation_level"},"metrics":{"allOf":[{"$ref":"#/definitions/ExecutionMetrics"}],"description":"Execution performance metrics","title":"Metrics","x-i18n-key":"nodes.tools.code_shell.outputs.metrics"},"result":{"description":"Script execution result","title":"Result","x-i18n-key":"nodes.tools.code_shell.outputs.result"},"stderr":{"description":"Standard error","title":"Stderr","type":"string","x-i18n-key":"nodes.tools.code_shell.outputs.stderr"},"stdout":{"description":"Standard output","title":"Stdout","type":"string","x-i18n-key":"nodes.tools.code_shell.outputs.stdout"},"warnings":{"description":"Script validation warnings","items":{"type":"string"},"title":"Warnings","type":"array","x-i18n-key":"nodes.tools.code_shell.outputs.warnings"}},"required":["isolation_level","metrics","result","stderr","stdout","warnings"],"title":"CodeOutput","type":"object","x-collapsed-visible":["result"],"x-field-order":["result","isolation_level","metrics","stdout","stderr","warnings"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.code_shell"},{"typeId":"io/video_extract_frames","name":"Video Extract Frames","category":"io","description":"Extract key frames from video at time intervals, outputs Base64 JPEG image array. Can connect to vision-enabled LLM nodes (GPT-4o, Claude 3, etc.). Requires ffmpeg installed.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"end_seconds":{"default":0,"description":"Stop extracting at this second (0 means to the end of video)","format":"uint32","minimum":0.0,"title":"End Seconds","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_frames.inputs.end_seconds"},"file_path":{"description":"Local absolute path of the video file (mp4/avi/mov/mkv/webm etc.)","title":"File Path","type":"string","x-i18n-key":"nodes.io.video_extract_frames.inputs.file_path"},"height":{"default":0,"description":"Output image height (pixels), 0 scales proportionally","format":"uint32","minimum":0.0,"title":"Height","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_frames.inputs.height"},"include_timestamps":{"default":true,"description":"Whether to include timestamps in the frames array","title":"Include Timestamps","type":"boolean","x-control":"switch","x-i18n-key":"nodes.io.video_extract_frames.inputs.include_timestamps"},"interval_seconds":{"default":5,"description":"Extract one frame every N seconds, default 5","format":"uint32","minimum":0.0,"title":"Interval Seconds","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_frames.inputs.interval_seconds"},"jpeg_quality":{"default":85,"description":"JPEG compression quality 1-95, default 85","format":"uint32","minimum":0.0,"title":"JPEG Quality","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_frames.inputs.jpeg_quality"},"max_frames":{"default":20,"description":"Maximum number of frames to extract, default 20","format":"uint32","minimum":0.0,"title":"Max Frames","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_frames.inputs.max_frames"},"start_seconds":{"default":0,"description":"Start extracting from this second (0 means from the beginning)","format":"uint32","minimum":0.0,"title":"Start Seconds","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_frames.inputs.start_seconds"},"width":{"default":768,"description":"Output image width (pixels), 0 keeps original width","format":"uint32","minimum":0.0,"title":"Width","type":"integer","x-control":"number","x-i18n-key":"nodes.io.video_extract_frames.inputs.width"}},"required":["file_path"],"title":"VideoExtractFramesInput","type":"object","x-field-order":["file_path","interval_seconds","max_frames","width","height","jpeg_quality","include_timestamps","start_seconds","end_seconds"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"FrameInfo":{"description":"单帧信息","properties":{"base64_jpeg":{"description":"Base64 编码的 JPEG 图片（data URI 格式，可直接嵌入 LLM 消息）","type":"string"},"height":{"description":"图片高度（像素）","format":"uint32","minimum":0.0,"type":"integer"},"index":{"description":"帧索引（从 0 开始）","format":"uint","minimum":0.0,"type":"integer"},"timestamp_seconds":{"description":"对应视频时间戳（秒）","format":"double","type":"number"},"width":{"description":"图片宽度（像素）","format":"uint32","minimum":0.0,"type":"integer"}},"required":["base64_jpeg","height","index","timestamp_seconds","width"],"type":"object"}},"properties":{"frame_count":{"description":"Actual number of frames extracted","format":"uint","minimum":0.0,"title":"Frame Count","type":"integer","x-i18n-key":"nodes.io.video_extract_frames.outputs.frame_count"},"frames":{"description":"Extracted frame list, each frame contains timestamp and Base64 JPEG image","items":{"$ref":"#/definitions/FrameInfo"},"title":"Frames","type":"array","x-i18n-key":"nodes.io.video_extract_frames.outputs.frames"},"image_base64":{"description":"Base64 content of the first frame, can connect directly to vision-enabled LLM nodes","title":"Image Base64","type":["string","null"],"x-i18n-key":"nodes.io.video_extract_frames.outputs.image_base64"},"video_duration_seconds":{"description":"Total video duration (seconds)","format":"double","title":"Video Duration Seconds","type":["number","null"],"x-i18n-key":"nodes.io.video_extract_frames.outputs.video_duration_seconds"}},"required":["frame_count","frames"],"title":"VideoExtractFramesOutput","type":"object","x-collapsed-visible":["image_base64"],"x-field-order":["frames","frame_count","video_duration_seconds","image_base64"]},"builtin":true,"i18nKeyPrefix":"nodes.io.video_extract_frames"},{"typeId":"agent/react_agent","name":"ReAct Agent","category":"agent","description":"Intelligent decision agent that automatically plans, executes and evaluates tasks","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for ReactAgent node.","properties":{"context":{"additionalProperties":true,"default":null,"description":"Existing AgentContext (optional, for continuing historical conversation)","type":"object","x-control":"text","x-i18n-key":"nodes.agent.react_agent.inputs.context","x-port":true},"llm_config":{"additionalProperties":true,"description":"LLM configuration (JSON string or object)","type":"object","x-control":"text","x-i18n-key":"nodes.agent.react_agent.inputs.llm_config","x-port":true},"max_checkpoints":{"default":3,"description":"Max checkpoint count (LLM may request extension when iterations exhausted)","format":"uint","minimum":0.0,"type":"integer","x-control":"number","x-i18n-key":"nodes.agent.react_agent.inputs.max_checkpoints"},"max_iterations":{"default":3,"description":"Maximum number of iterations","format":"uint","minimum":0.0,"type":"integer","x-control":"number","x-i18n-key":"nodes.agent.react_agent.inputs.max_iterations"},"max_review_rounds":{"default":1,"description":"Max LLM review rounds","format":"uint","minimum":0.0,"type":"integer","x-control":"number","x-i18n-key":"nodes.agent.react_agent.inputs.max_review_rounds"},"min_tool_calls_for_skill":{"default":3,"description":"Min successful tool calls to emit skill summary (0 = disabled)","format":"uint","minimum":0.0,"type":"integer","x-control":"number","x-i18n-key":"nodes.agent.react_agent.inputs.min_tool_calls_for_skill"},"reviewer_llm_config":{"additionalProperties":true,"default":null,"description":"Reviewer LLM configuration (optional, falls back to main LLM config)","type":"object","x-control":"text","x-i18n-key":"nodes.agent.react_agent.inputs.reviewer_llm_config","x-port":true},"reviewer_prompt":{"default":null,"description":"Reviewer criteria / prompt (used when LLM evaluation is enabled)","type":"string","x-control":"textarea","x-i18n-key":"nodes.agent.react_agent.inputs.reviewer_prompt"},"system_prompt":{"default":null,"description":"Custom system prompt (overrides default system prompt)","type":"string","x-control":"textarea","x-i18n-key":"nodes.agent.react_agent.inputs.system_prompt"},"task":{"default":null,"description":"Task description to accomplish (optional, auto-extracted from context conversation history if empty)","type":"string","x-control":"textarea","x-i18n-key":"nodes.agent.react_agent.inputs.task"},"tools":{"default":[],"description":"Available tools (populated from connected tool nodes via tools port)","title":"Tools","type":"array","x-dynamic-array":{"allowAdd":true,"allowRemove":true,"maxPorts":20,"minPorts":0,"portPrefix":"tool"},"x-i18n-key":"nodes.agent.react_agent.inputs.tools","x-tool-options":[{"description":"Delete file (high side-effect, irreversible). Only allows deleting files, not directories. When dry_run=true, performs all checks but does not actually delete, used to verify deletability.","label":"Delete File","value":"tools/delete_file"},{"description":"Build context information for LLM document editing","label":"Build LLM Context","value":"document/build_llm_context"},{"description":"Batch apply table record insert, update, delete operations","label":"Apply Table Operations","value":"table/apply_record_ops"},{"description":"Unified document operation toolkit, select one of 4 operations via `operation` field.Operations not enabled in node config return errors immediately, no side effects.\n\n[query] Query document content (read-only).Required: document_id.Optional: as_markdown (return Markdown format, default false), include_content (include full block content, default true).Returns: document_id, title, blocks, markdown, plain_text, block_count, character_count.\n\n[format_for_llm] Format document for LLM use (read-only).Required: document_id.Optional: priority_filter (all/high_only/critical_only/normal_and_above),tag_filter (comma-separated), sort_order (original/priority_desc/priority_asc),output_format (markdown/plain_text/structured), include_metadata (default true),max_chars (0 for unlimited).Returns: formatted_content, title, block_count, filtered_block_count, character_count, truncated.\n\n[update_block] Update specific block content (medium side-effect, requires node enable).Required: document_id, block_id, content.Optional: block_type, language (code block language), priority, tags (comma-separated).Returns: block_id, block_type, document_version.\n\n[create] Create new document in workspace (medium side-effect, requires node enable).workspace_id from node static config, LLM doesn't need to fill.Optional: title (document title), content (initial content), block_type (default paragraph),priority (default normal), tags (comma-separated).Returns: document_id, title, root_block_id.","label":"Document Operations Hub","value":"document/ops_hub"},{"description":"Create new file or overwrite/append existing file. Uses atomic write (temp file + rename) to prevent file corruption from interrupted writes.","label":"Write File","value":"tools/write_file"},{"description":"Use this skill when the online UI chat assistant must guide a user through designing a ChengOS workflow and generate an importable workflow JSON file. The assistant uses Workflow API endpoints for templates, node schemas, and LLM model lists.","label":"Workflow Json Builder","value":"workflow-json-builder"},{"description":"Operate real emails via IMAP/SMTP protocols: send, read, search, move, mark, reply, forward and more","label":"Mail Tool","value":"tools/mail"},{"description":"Use this skill when the user has questions about building, debugging, or understanding ChengOS workflows — including node selection, port wiring, field configuration, error troubleshooting, and workflow pattern recommendations.","label":"Workflow Helper","value":"workflow-helper"},{"description":"Replace file content by exact content matching (old_content → new_content). Supports multiple replacement operations; writes back atomically only when all succeed; any failure keeps original file unchanged.","label":"Edit File","value":"tools/edit_file"},{"description":"Directly list, create, update, pause, resume, cancel, and inspect scheduled tasks","label":"Schedule Manager","value":"tools/schedule"},{"description":"Search text in files or directories. Supports literal/regex patterns, case-insensitive, filename glob filtering, exclude paths, result context lines. Max 100 results.","label":"Search Files","value":"tools/search_files"},{"description":"Execute commands on remote hosts via SSH with a built-in approval gate. Risk-classifies commands, enforces read-only policy, and surfaces 4 distinct rejection reasons (rejected/skipped/timed_out/policy_denied) so agents can replan correctly.","label":"SSH Executor","value":"tools/ssh"},{"description":"Batch apply document operations (insert/update/delete/move)","label":"Apply Document Operations","value":"document/apply_ops"},{"description":"Read-only query for workflow definitions, node schemas, and execution status. list_workflows=list workflows (name/tag filter, pagination), get_workflow=get workflow details (nodes/edges/tags), list_node_types=list all node types, get_node_schema=get node input/output schema, get_execution=query execution status and node outputs by execution_id, list_executions=list execution history for a workflow (requires workflow_id)","label":"Workflow Inspector","value":"tools/workflow_inspect"},{"description":"File operations aggregate node: only one node needed on canvas, control Agent's available file operation capabilities via toggle switches.","label":"File Operations Hub","value":"tools/file_ops_hub"},{"description":"Call other workflows as sub-workflows, supports file path or workflow ID, passes input parameters and waits for completion","label":"Sub Workflow Tool","value":"tools/subflow"},{"description":"Run JavaScript in QuickJS engine sandbox (NO syscalls, NO network, NO filesystem — fully isolated). FAIL-CLOSED: errors if QuickJS is unavailable. Use for: pure computation, JSON/object transformation, string manipulation, math. Do NOT use for network requests (→ Shell) or complex algorithms needing libraries (→ Python). Just provide script and input. Example: {\"script\":\"input.values.reduce((a,b)=>a+b,0)\",\"input\":{\"values\":[1,2,3]}}","label":"JavaScript Executor","value":"tools/code_js"},{"description":"Read file content within specified line range. Always returns total_lines and eof marker to help LLM perceive file full picture and prevent hallucination. Max 500 lines per request.","label":"View File","value":"tools/view_file"},{"description":"Run Python 3 scripts (native python3, NO OS-level isolation — trusted environment only). FAIL-CLOSED: errors if python3 runtime is unavailable. Use for: algorithms, text processing, data transformation, scientific computing. Do NOT use for network requests (→ Shell) or simple JSON/string transforms (→ JS). Network access is disabled on this node by design. Example: {\"script\":\"result = sum(input['values'])\",\"input\":{\"values\":[1,2,3]}}","label":"Python Executor","value":"tools/code_python"},{"description":"Connect one or more MCP servers in one place. Discover tools, manage visibility, and call tools with unified output.","label":"MCP Hub","value":"tools/mcp_hub"},{"description":"Send HTTP requests to specified URL, supports manual mode and LLM mode","label":"HTTP Tool","value":"tools/http"},{"description":"List directory contents, return structured entry list (filename, size, modification time, type, etc.). Supports glob filtering and recursive depth control, max 200 entries.","label":"List Directory","value":"tools/list_directory"},{"description":"Get file or directory metadata (size, line count, modification time, binary or not, etc.) without reading file content.","label":"File Info","value":"tools/file_info"},{"description":"Run shell scripts in a bubblewrap sandbox (OS-namespace isolation: PID/IPC/UTS/network). FAIL-CLOSED: errors if bubblewrap is unavailable — no silent downgrade. Use for: curl, wget, system commands, file operations, pipeline processing, any external process. Do NOT use for pure computation (→ JS) or data transformation (→ Python). Requires allow_network=true for outbound HTTP. Example: {\"script\":\"curl -s 'wttr.in/Tokyo?format=3'\",\"allow_network\":true}","label":"Shell Executor","value":"tools/code_shell"}]},"use_function_calling":{"default":true,"description":"Use native function calling mode","type":"boolean","x-control":"switch","x-i18n-key":"nodes.agent.react_agent.inputs.use_function_calling"},"use_llm_evaluation":{"default":false,"description":"Enable LLM evaluation","type":"boolean","x-control":"switch","x-i18n-key":"nodes.agent.react_agent.inputs.use_llm_evaluation"},"user_message":{"default":null,"description":"User additional instruction (prepended to task, e.g.: Before starting, read SKILLS_INDEX.md first)","type":"string","x-control":"textarea","x-i18n-key":"nodes.agent.react_agent.inputs.user_message"}},"required":["llm_config"],"title":"ReactAgentInput","type":"object","x-collapsed-visible":["context","system_prompt","llm_config","max_iterations","tools","tool_0","tool_1","tool_2","tool_3","tool_4","tool_5","tool_6","tool_7","tool_8","tool_9","use_function_calling"],"x-field-order":["context","task","llm_config","max_iterations","tools","use_function_calling","use_llm_evaluation","max_checkpoints","system_prompt","user_message","reviewer_prompt","reviewer_llm_config","max_review_rounds","min_tool_calls_for_skill"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"AgentContext":{"description":"Agent execution context.\n\nContains agent-specific information such as conversation history, iteration count, session tracking, and custom metadata.\n\n# Metadata Conventions\n\nThe `session_id` field is a first-class field for session tracking: - **Initialization**: Should be set by the workflow engine or the first agent node - **Persistence**: Memory nodes (redis/postgres/window) use it for storage keys - **Logging**: LLM and memory nodes include it in tracing logs for debugging - **Propagation**: All nodes should preserve the session_id across the execution chain\n\nAdditional metadata can be stored in the `metadata` HashMap for custom use cases.\n\n# Examples\n\n``` use cheng_nodes::nodes::builtin::agent::base::context::AgentContext; use cheng_llm::types::ChatMessage;\n\nlet context = AgentContext::new() .with_session_id(\"user123_conversation_456\") .with_history(vec![ChatMessage::user(\"Hello\")]) .with_max_iterations(5); ```","properties":{"history":{"default":[],"description":"Conversation history (messages exchanged so far)","items":{"$ref":"#/definitions/ChatMessage"},"type":"array"},"iteration":{"default":0,"description":"Current iteration count (for ReAct loops, etc.)","format":"uint","minimum":0.0,"type":"integer"},"max_iterations":{"default":10,"description":"Maximum iterations allowed","format":"uint","minimum":0.0,"type":"integer"},"metadata":{"additionalProperties":true,"default":{},"description":"Custom metadata (for extensibility)\n\nUse this for additional context that doesn't fit into standard fields. Examples: user preferences, workflow-specific data, feature flags.","type":"object"},"preview_content":{"description":"预览内容（所有消息合并后的纯文本，供预览节点直接展示）\n\n由合并节点（ContextMergeNode）等聚合节点填写，优先于 history 展示。","type":["string","null"]},"session_id":{"default":"session_b309195b-4884-45ee-b077-982697f6196b","description":"Session identifier for tracking conversations across nodes and storage\n\nThis should be a unique identifier for the conversation session. Format examples: \"user123_session456\", \"uuid-v4\", \"workflow_exec_789\"","type":"string"}},"type":"object"},"ChatContentPart":{"description":"A single rich content part in a message.\n\nOpenAI Chat Completions accepts either plain text or an array of content parts for user messages. This enum keeps the message model backward compatible while making image/audio/file inputs expressible.","oneOf":[{"description":"Plain text content.","properties":{"text":{"type":"string"},"type":{"enum":["text"],"type":"string"}},"required":["text","type"],"type":"object"},{"description":"Image input, either a normal URL or a base64 data URL.","properties":{"image_url":{"$ref":"#/definitions/ImageUrlContent"},"type":{"enum":["image_url"],"type":"string"}},"required":["image_url","type"],"type":"object"},{"description":"Audio input for speech recognition / audio reasoning.","properties":{"input_audio":{"$ref":"#/definitions/InputAudioContent"},"type":{"enum":["input_audio"],"type":"string"}},"required":["input_audio","type"],"type":"object"},{"description":"File input for supported document reasoning models.","properties":{"file":{"$ref":"#/definitions/FileContent"},"type":{"enum":["file"],"type":"string"}},"required":["file","type"],"type":"object"}]},"ChatMessage":{"description":"A single message in a conversation.\n\n# Examples\n\n``` use cheng_llm::types::ChatMessage;\n\nlet system_msg = ChatMessage::system(\"You are a helpful assistant.\"); let user_msg = ChatMessage::user(\"What is Rust?\"); let assistant_msg = ChatMessage::assistant(\"Rust is a systems programming language.\"); ```","properties":{"content":{"type":"string"},"parts":{"description":"Optional rich content parts for multimodal providers.\n\nWhen present, `content` is treated as the leading text prompt and the parts are serialized as the provider-specific content array.","items":{"$ref":"#/definitions/ChatContentPart"},"type":["array","null"]},"role":{"$ref":"#/definitions/Role"}},"required":["content","role"],"type":"object"},"FileContent":{"description":"File input payload for OpenAI-style chat content parts.","properties":{"file_data":{"type":["string","null"]},"file_id":{"type":["string","null"]},"filename":{"type":["string","null"]}},"type":"object"},"ImageUrlContent":{"description":"Image input payload for OpenAI-style chat content parts.","properties":{"detail":{"type":["string","null"]},"url":{"type":"string"}},"required":["url"],"type":"object"},"InputAudioContent":{"description":"Audio input payload for OpenAI-style chat content parts.","properties":{"data":{"type":"string"},"format":{"type":"string"}},"required":["data","format"],"type":"object"},"Role":{"description":"Message role in a conversation.","enum":["system","user","assistant"],"type":"string"}},"description":"Output from ReactAgent node.","properties":{"context":{"additionalProperties":true,"description":"Agent context (contains conversation history)","title":"Agent Context","type":"object","x-i18n-key":"nodes.agent.react_agent.outputs.context","x-port":true},"final_answer":{"description":"Final answer","title":"Final Answer","type":"string","x-i18n-key":"nodes.agent.react_agent.outputs.final_answer","x-port":true},"iterations_used":{"description":"Number of iterations executed","format":"uint","minimum":0.0,"title":"Iterations Used","type":"integer","x-i18n-key":"nodes.agent.react_agent.outputs.iterations_used"},"requires_review":{"description":"Whether human review is required","title":"Requires Review","type":"boolean","x-i18n-key":"nodes.agent.react_agent.outputs.requires_review"},"session_id":{"description":"Session ID (consistent with context.session_id, convenient for downstream direct connection)","title":"Session ID","type":"string","x-i18n-key":"nodes.agent.react_agent.outputs.session_id","x-port":true},"skill_summary":{"anyOf":[{"$ref":"#/definitions/AgentContext"},{"type":"null"}],"description":"Lean AgentContext for skill distillation (conditional: absent when not needed)","title":"Skill Summary","x-i18n-key":"nodes.agent.react_agent.outputs.skill_summary","x-runtime-conditional":true},"status":{"description":"Status message","title":"Status","type":"string","x-i18n-key":"nodes.agent.react_agent.outputs.status"},"success":{"description":"Whether task was completed successfully","title":"Success","type":"boolean","x-i18n-key":"nodes.agent.react_agent.outputs.success"},"total_tokens":{"description":"Cumulative token consumption","format":"uint32","minimum":0.0,"title":"Total Tokens","type":"integer","x-i18n-key":"nodes.agent.react_agent.outputs.total_tokens"},"trace":{"description":"Execution trace","title":"Trace","type":"string","x-i18n-key":"nodes.agent.react_agent.outputs.trace","x-port":true}},"required":["context","final_answer","iterations_used","requires_review","session_id","status","success","total_tokens","trace"],"title":"ReactAgentOutput","type":"object","x-collapsed-visible":["final_answer","context"],"x-field-order":["final_answer","context","session_id","trace","total_tokens","iterations_used","success","status","requires_review","skill_summary"]},"builtin":true,"i18nKeyPrefix":"nodes.agent.react_agent"},{"typeId":"document/update_block","name":"Update Document Block","category":"document","description":"Update content or type of a specific block in document, supports AgentContext pass-through","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for DocumentUpdateBlockNode","properties":{"block_id":{"description":"ID of the block to update.","title":"Block Id","type":"string","x-i18n-key":"nodes.document.update_block.inputs.block_id"},"block_type":{"default":null,"description":"New block type (optional, keeps existing if not provided).","title":"Block Type","type":["string","null"],"x-i18n-key":"nodes.document.update_block.inputs.block_type"},"content":{"description":"New content for the block.","type":"string","x-i18n-key":"nodes.document.update_block.inputs.content"},"context":{"additionalProperties":true,"default":null,"description":"AgentContext port","title":"Context","type":"object","x-i18n-key":"nodes.document.update_block.inputs.context","x-port":true},"document_id":{"description":"Select document to update","type":"string","x-api-endpoint":"/api/v1/documents?limit=200","x-cache-key":"static_select:/api/v1/documents?limit=200","x-control":"dynamic-select","x-i18n-key":"nodes.document.update_block.inputs.document_id"},"language":{"default":null,"description":"Language for code blocks (optional).","type":["string","null"],"x-i18n-key":"nodes.document.update_block.inputs.language"},"priority":{"default":null,"description":"Block priority","enum":["low","normal","medium","high","critical"],"options":[{"label":"low","value":"low"},{"label":"normal","value":"normal"},{"label":"medium","value":"medium"},{"label":"high","value":"high"},{"label":"critical","value":"critical"}],"title":"Priority","type":"string","x-control":"select","x-i18n-key":"nodes.document.update_block.inputs.priority"},"tags":{"default":null,"description":"Block tags (comma-separated)","title":"Tags","type":["string","null"],"x-i18n-key":"nodes.document.update_block.inputs.tags"}},"required":["block_id","content","document_id"],"title":"DocumentUpdateBlockInput","type":"object","x-field-order":["context","document_id","block_id","content","block_type","language","priority","tags"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Output from DocumentUpdateBlockNode","properties":{"block_id":{"description":"Updated block ID.","title":"Block Id","type":["string","null"],"x-i18n-key":"nodes.document.update_block.outputs.block_id"},"block_type":{"description":"Updated block type.","title":"Block Type","type":["string","null"],"x-i18n-key":"nodes.document.update_block.outputs.block_type"},"content":{"description":"Updated content.","type":["string","null"],"x-i18n-key":"nodes.document.update_block.outputs.content"},"context":{"additionalProperties":true,"description":"AgentContext port","title":"Context","type":"object","x-i18n-key":"nodes.document.update_block.outputs.context","x-port":true},"document_version":{"description":"New document version after update.","format":"uint32","minimum":0.0,"title":"Document Version","type":["integer","null"],"x-i18n-key":"nodes.document.update_block.outputs.document_version"},"error":{"description":"Error message if update failed.","type":["string","null"],"x-i18n-key":"nodes.document.update_block.outputs.error"},"string":{"description":"Formatted success message with document_id and block_id","type":"string","x-i18n-key":"nodes.document.update_block.outputs.string"},"success":{"description":"Whether the update was successful.","type":"boolean","x-i18n-key":"nodes.document.update_block.outputs.success"}},"required":["context","string","success"],"title":"DocumentUpdateBlockOutput","type":"object","x-collapsed-visible":["context","string"],"x-field-order":["context","string","success","block_id","block_type","content","document_version","error"]},"builtin":true,"i18nKeyPrefix":"nodes.document.update_block"},{"typeId":"tools/search_files","name":"Search Files","category":"tools","description":"Search text in files or directories, like grep, returns structured matching results. Supports regex, case-insensitive, glob filtering and context lines.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"case_insensitive":{"default":false,"description":"Whether to ignore case, default false","title":"Case Insensitive","type":"boolean","x-i18n-key":"nodes.tools.search_files.inputs.case_insensitive"},"context_lines":{"description":"Show N lines of context before/after each match (0-3), default 0","format":"uint32","minimum":0.0,"title":"Context Lines","type":["integer","null"],"x-i18n-key":"nodes.tools.search_files.inputs.context_lines"},"exclude_patterns":{"description":"Exclude filename glob list (e.g. [\"*.bak\", \"target/**\"])","items":{"type":"string"},"title":"Exclude Patterns","type":["array","null"],"x-i18n-key":"nodes.tools.search_files.inputs.exclude_patterns"},"include_patterns":{"description":"Filename glob filter list (e.g. [\"*.rs\", \"*.toml\"]), only search matching files","items":{"type":"string"},"title":"Include Patterns","type":["array","null"],"x-i18n-key":"nodes.tools.search_files.inputs.include_patterns"},"is_regex":{"default":false,"description":"Whether query is a regex pattern, default false","title":"Is Regex","type":"boolean","x-i18n-key":"nodes.tools.search_files.inputs.is_regex"},"max_results":{"description":"Maximum number of results, default 50, max 100","format":"uint32","minimum":0.0,"title":"Max Results","type":["integer","null"],"x-i18n-key":"nodes.tools.search_files.inputs.max_results"},"query":{"description":"Search keyword or regular expression","title":"Query","type":"string","x-i18n-key":"nodes.tools.search_files.inputs.query"},"search_path":{"description":"Starting path for search (file or directory absolute path)","title":"Search Path","type":"string","x-i18n-key":"nodes.tools.search_files.inputs.search_path"}},"required":["query","search_path"],"title":"SearchFilesInput","type":"object"},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"SearchMatch":{"description":"单个搜索匹配结果","properties":{"context_after":{"description":"后 N 行上下文（context_lines > 0 时）","items":{"type":"string"},"type":"array"},"context_before":{"description":"前 N 行上下文（context_lines > 0 时）","items":{"type":"string"},"type":"array"},"file_path":{"description":"匹配文件绝对路径","type":"string"},"line_content":{"description":"匹配行内容（去除尾部空白）","type":"string"},"line_number":{"description":"1-indexed 行号","format":"uint32","minimum":0.0,"type":"integer"}},"required":["context_after","context_before","file_path","line_content","line_number"],"type":"object"}},"properties":{"elapsed_ms":{"description":"操作耗时（毫秒）","format":"uint64","minimum":0.0,"title":"Elapsed Ms","type":"integer","x-i18n-key":"nodes.tools.search_files.outputs.elapsed_ms"},"error":{"description":"错误信息","type":["string","null"],"x-i18n-key":"nodes.tools.search_files.outputs.error"},"matches":{"description":"匹配结果列表（按文件路径 + 行号升序）","items":{"$ref":"#/definitions/SearchMatch"},"type":"array","x-i18n-key":"nodes.tools.search_files.outputs.matches"},"searched_files":{"description":"实际扫描的文件数","format":"uint32","minimum":0.0,"title":"Searched Files","type":"integer","x-i18n-key":"nodes.tools.search_files.outputs.searched_files"},"total_matches":{"description":"返回的匹配数","format":"uint32","minimum":0.0,"title":"Total Matches","type":"integer","x-i18n-key":"nodes.tools.search_files.outputs.total_matches"},"truncated":{"description":"是否因达到 max_results 上限而截断","type":"boolean","x-i18n-key":"nodes.tools.search_files.outputs.truncated"}},"required":["elapsed_ms","matches","searched_files","total_matches","truncated"],"title":"SearchFilesOutput","type":"object","x-collapsed-visible":["matches"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.search_files"},{"typeId":"workspace/hub","name":"Workspace Hub","category":"workspace","description":"Select existing workspace or create new one with optional directory tree","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Input for WorkspaceHubNode","properties":{"create_folders":{"default":true,"description":"Create directory tree (create mode, default: true)","title":"Create Folders","type":"boolean","x-conditional":{"field":"mode","values":["create"]},"x-i18n-key":"nodes.workspace.hub.inputs.create_folders"},"description":{"default":null,"description":"Workspace description (create mode, optional)","title":"Description","type":["string","null"],"x-conditional":{"field":"mode","values":["create"]},"x-i18n-key":"nodes.workspace.hub.inputs.description"},"mode":{"default":"select","description":"select: Select existing workspace; create: Create new workspace","enum":["select","create"],"options":[{"label":"select","value":"select"},{"label":"create","value":"create"}],"type":"string","x-control":"select","x-i18n-key":"nodes.workspace.hub.inputs.mode"},"name":{"default":null,"description":"New workspace name (create mode)","title":"Name","type":["string","null"],"x-conditional":{"field":"mode","values":["create"]},"x-i18n-key":"nodes.workspace.hub.inputs.name"},"workspace_id":{"default":null,"description":"Select existing workspace (select mode)","type":"string","x-api-endpoint":"/api/v1/workspaces?limit=200","x-cache-key":"static_select:/api/v1/workspaces?limit=200","x-conditional":{"field":"mode","values":["select"]},"x-control":"dynamic-select","x-i18n-key":"nodes.workspace.hub.inputs.workspace_id"}},"title":"WorkspaceHubInput","type":"object","x-field-order":["mode","workspace_id","name","description","create_folders"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"Output from WorkspaceHubNode","properties":{"created":{"description":"Whether this was a newly created workspace (true) or an existing one (false).","type":"boolean","x-i18n-key":"nodes.workspace.hub.outputs.created"},"error":{"description":"Error message if the operation failed.","type":["string","null"],"x-i18n-key":"nodes.workspace.hub.outputs.error"},"folders_created":{"description":"Whether the directory tree was created. Only meaningful when `created = true` and `create_folders` was enabled.","title":"Folders Created","type":"boolean","x-i18n-key":"nodes.workspace.hub.outputs.folders_created"},"success":{"description":"Whether the workspace operation (create or select) succeeded.","type":"boolean","x-i18n-key":"nodes.workspace.hub.outputs.success"},"warnings":{"description":"Warnings from bootstrap (non-fatal issues).","items":{"type":"string"},"type":"array","x-i18n-key":"nodes.workspace.hub.outputs.warnings"},"workspace_id":{"description":"ID of the selected or created workspace.","title":"Workspace Id","type":"string","x-i18n-key":"nodes.workspace.hub.outputs.workspace_id"},"workspace_name":{"description":"Name of the workspace.","title":"Workspace Name","type":"string","x-i18n-key":"nodes.workspace.hub.outputs.workspace_name"}},"required":["created","folders_created","success","warnings","workspace_id","workspace_name"],"title":"WorkspaceHubOutput","type":"object","x-collapsed-visible":["workspace_id","workspace_name","folders_created"],"x-field-order":["workspace_id","workspace_name","created","success","folders_created","warnings","error"]},"builtin":true,"i18nKeyPrefix":"nodes.workspace.hub"},{"typeId":"chat/input","name":"Chat Input Node","category":"chat","description":"Receive multi-modal input (text, images, files, etc.), process and send to downstream nodes","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","description":"ChatInputNode 输入","properties":{"conversation_id":{"default":null,"description":"Conversation ID (optional), generated at entry and passed through to all downstream nodes","title":"Conversation ID","type":"string","x-i18n-key":"nodes.chat.input.inputs.conversation_id","x-port":true},"enable_ocr":{"default":false,"description":"Enable OCR for images","title":"Enable OCR","type":"boolean","x-control":"switch","x-i18n-key":"nodes.chat.input.inputs.enable_ocr"},"max_file_size_mb":{"default":50,"description":"Maximum file size (MB)","format":"uint64","maximum":500.0,"minimum":1.0,"title":"Max File Size (MB)","type":"integer","x-control":"number","x-i18n-key":"nodes.chat.input.inputs.max_file_size_mb"},"merge_strategy":{"default":"per_file","description":"Multi-input merge strategy","oneOf":[{"description":"合并所有消息为一个包","enum":["merge_all"],"type":"string"},{"description":"每个文件单独一个包","enum":["per_file"],"type":"string"},{"description":"每行单独一个包","enum":["per_line"],"type":"string"}],"title":"Merge Strategy","x-control":"select","x-i18n-key":"nodes.chat.input.inputs.merge_strategy"},"model_override":{"default":null,"description":"Model override (format: credential_id::model_name)","title":"Model Override","type":["string","null"],"x-i18n-key":"nodes.chat.input.inputs.model_override"},"raw_input":{"description":"Raw input payload (JSON format)","title":"Raw Input","type":"string","x-control":"textarea","x-i18n-key":"nodes.chat.input.inputs.raw_input","x-port":true},"stream_mode":{"default":false,"description":"Enable streaming send","title":"Stream Mode","type":"boolean","x-control":"switch","x-i18n-key":"nodes.chat.input.inputs.stream_mode"},"user_message_rich":{"additionalProperties":true,"default":null,"description":"Optional rich user message from upstream nodes","title":"User Message Rich","type":"object","x-i18n-key":"nodes.chat.input.inputs.user_message_rich","x-port":true},"workspace_id":{"default":null,"description":"Workspace ID (optional), passed to chat/memory for per-workspace chat isolation","title":"Workspace ID","type":"string","x-i18n-key":"nodes.chat.input.inputs.workspace_id","x-port":true}},"required":["raw_input"],"title":"ChatInputNodeInput","type":"object","x-field-order":["raw_input","user_message_rich","conversation_id","workspace_id","stream_mode","enable_ocr","merge_strategy","max_file_size_mb","model_override"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"AppendMode":{"description":"追加模式","oneOf":[{"description":"平滑追加（带动画）","enum":["smooth"],"type":"string"},{"description":"即时追加","enum":["instant"],"type":"string"}]},"ChatAppendPayload":{"description":"ChatAppend 事件载荷","properties":{"append_mode":{"allOf":[{"$ref":"#/definitions/AppendMode"}],"description":"追加模式"},"packets":{"description":"要追加的消息列表","items":{"$ref":"#/definitions/MessagePacket"},"type":"array"},"scroll_hint":{"allOf":[{"$ref":"#/definitions/ScrollHint"}],"description":"滚动提示"}},"required":["append_mode","packets","scroll_hint"],"type":"object"},"ChatMetaPayload":{"description":"ChatMeta 事件载荷","properties":{"action":{"allOf":[{"$ref":"#/definitions/MetaAction"}],"description":"元操作类型"},"data":{"description":"附加数据"}},"required":["action"],"type":"object"},"ChatPatchPayload":{"description":"ChatPatch 事件载荷","properties":{"message_id":{"description":"要更新的消息 ID","type":"string"},"patch":{"allOf":[{"$ref":"#/definitions/MessagePacket"}],"description":"更新内容"}},"required":["message_id","patch"],"type":"object"},"ChatUiEvent":{"description":"UI 事件类型","oneOf":[{"description":"追加消息","properties":{"payload":{"$ref":"#/definitions/ChatAppendPayload"},"type":{"enum":["ChatAppend"],"type":"string"}},"required":["payload","type"],"type":"object"},{"description":"局部更新（替换某条消息）","properties":{"payload":{"$ref":"#/definitions/ChatPatchPayload"},"type":{"enum":["ChatPatch"],"type":"string"}},"required":["payload","type"],"type":"object"},{"description":"元信息变更（滚动、主题、清屏、状态）","properties":{"payload":{"$ref":"#/definitions/ChatMetaPayload"},"type":{"enum":["ChatMeta"],"type":"string"}},"required":["payload","type"],"type":"object"}]},"MessagePacket":{"description":"消息包 - Chat 系统的核心数据结构","properties":{"hash":{"description":"Message hash (for deduplication and idempotency)","pattern":"^[0-9a-f]{32}$","title":"Hash","type":"string"},"id":{"description":"Unique message ID","title":"ID","type":"string"},"meta":{"additionalProperties":true,"description":"Message metadata","title":"Meta","type":"object"},"msg_type":{"allOf":[{"$ref":"#/definitions/MessageType"}],"description":"Message type (text/image/file/audio, etc.)","title":"Msg Type"},"payload":{"description":"Message content payload","title":"Payload"},"protocol_version":{"description":"Protocol version","title":"Protocol Version","type":"string"},"stream_hint":{"anyOf":[{"$ref":"#/definitions/StreamHint"},{"type":"null"}],"description":"Stream shard info","title":"Stream Hint"},"timestamp":{"description":"Message creation timestamp (Unix ms)","format":"int64","title":"Timestamp","type":"integer"}},"required":["hash","id","meta","msg_type","payload","protocol_version","timestamp"],"type":"object"},"MessageType":{"description":"消息类型","oneOf":[{"description":"纯文本","enum":["text"],"type":"string"},{"description":"图片","enum":["image"],"type":"string"},{"description":"文件","enum":["file"],"type":"string"},{"description":"音频","enum":["audio"],"type":"string"},{"description":"视频","enum":["video"],"type":"string"},{"description":"OCR 识别结果","enum":["ocr_text"],"type":"string"},{"description":"流式分片","enum":["stream"],"type":"string"},{"description":"控制消息（如清屏、状态变更）","enum":["control"],"type":"string"},{"description":"错误消息","enum":["error"],"type":"string"},{"description":"网页快照","enum":["web_snapshot"],"type":"string"},{"description":"系统消息","enum":["system"],"type":"string"}]},"MetaAction":{"description":"元操作类型","oneOf":[{"description":"清屏","enum":["clear"],"type":"string"},{"description":"滚动到底部","enum":["scroll_to_bottom"],"type":"string"},{"description":"滚动到顶部","enum":["scroll_to_top"],"type":"string"},{"additionalProperties":false,"description":"滚动到指定消息","properties":{"scroll_to_message":{"properties":{"message_id":{"type":"string"}},"required":["message_id"],"type":"object"}},"required":["scroll_to_message"],"type":"object"},{"additionalProperties":false,"description":"切换主题","properties":{"set_theme":{"properties":{"theme":{"type":"string"}},"required":["theme"],"type":"object"}},"required":["set_theme"],"type":"object"},{"description":"显示加载骨架","enum":["show_skeleton"],"type":"string"},{"description":"隐藏加载骨架","enum":["hide_skeleton"],"type":"string"},{"additionalProperties":false,"description":"节点状态变更","properties":{"status_change":{"properties":{"status":{"type":"string"}},"required":["status"],"type":"object"}},"required":["status_change"],"type":"object"}]},"ProcessingStats":{"description":"处理统计","properties":{"duration_ms":{"format":"uint64","minimum":0.0,"title":"Duration MS","type":"integer"},"error_count":{"format":"uint","minimum":0.0,"title":"Error Count","type":"integer"},"skipped_count":{"format":"uint","minimum":0.0,"title":"Skipped Count","type":"integer"},"success_count":{"format":"uint","minimum":0.0,"title":"Success Count","type":"integer"},"total_input":{"format":"uint","minimum":0.0,"title":"Total Input","type":"integer"}},"required":["duration_ms","error_count","skipped_count","success_count","total_input"],"type":"object"},"ScrollHint":{"description":"滚动提示","oneOf":[{"description":"自动滚动到底部","enum":["auto"],"type":"string"},{"description":"锁定当前位置","enum":["lock"],"type":"string"}]},"StreamHint":{"description":"流式分片提示","properties":{"chunk_index":{"description":"分片索引（从 0 开始）","format":"uint32","minimum":0.0,"type":"integer"},"group_id":{"description":"所属消息组 ID","type":"string"},"is_final":{"description":"是否为最后一个分片","type":"boolean"}},"required":["chunk_index","group_id","is_final"],"type":"object"}},"description":"ChatInputNode 输出","properties":{"attachments_json":{"description":"Attachments JSON array, connectable directly to io/file_upload.files_json","title":"Attachments JSON","type":"string","x-i18n-key":"nodes.chat.input.outputs.attachments_json","x-port":true},"context":{"additionalProperties":true,"description":"AgentContext wrapper, connectable directly to agent/llm context port","title":"Agent Context","type":"object","x-i18n-key":"nodes.chat.input.outputs.context","x-port":true},"conversation_id":{"description":"Conversation ID (passed through to downstream nodes)","title":"Conversation ID","type":"string","x-i18n-key":"nodes.chat.input.outputs.conversation_id","x-port":true},"model_override":{"description":"Model override (format: credential_id::model_name)","title":"Model Override","type":["string","null"],"x-i18n-key":"nodes.chat.input.outputs.model_override"},"stats":{"allOf":[{"$ref":"#/definitions/ProcessingStats"}],"description":"Processing statistics","title":"Stats","x-i18n-key":"nodes.chat.input.outputs.stats"},"ui_event":{"anyOf":[{"$ref":"#/definitions/ChatUiEvent"},{"type":"null"}],"description":"UI event","title":"Ui Event","x-i18n-key":"nodes.chat.input.outputs.ui_event"},"user_message":{"description":"User message text","title":"User Message","type":"string","x-i18n-key":"nodes.chat.input.outputs.user_message","x-port":true},"user_message_rich":{"additionalProperties":true,"description":"Structured user message with multimodal parts","title":"User Message Rich","type":"object","x-i18n-key":"nodes.chat.input.outputs.user_message_rich","x-port":true},"workspace_id":{"description":"Workspace ID (passed through to chat/memory for per-workspace isolation)","title":"Workspace ID","type":"string","x-i18n-key":"nodes.chat.input.outputs.workspace_id","x-port":true}},"required":["attachments_json","context","conversation_id","stats","user_message","user_message_rich","workspace_id"],"title":"ChatInputNodeOutput","type":"object","x-collapsed-visible":["user_message"],"x-field-order":["context","user_message","user_message_rich","conversation_id","workspace_id","stats","ui_event","model_override","attachments_json"]},"builtin":true,"i18nKeyPrefix":"nodes.chat.input"},{"typeId":"tools/file_ops_hub","name":"File Operations Hub","category":"tools","description":"File operations aggregate node: only one node needed on canvas, control Agent's available file operation capabilities via toggle switches.","inputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"allow_delete":{"default":false,"description":"是否允许删除文件（高副作用，不可逆）","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.file_ops_hub.inputs.allow_delete"},"allow_edit":{"default":true,"description":"是否允许精确编辑文件（中副作用）","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.file_ops_hub.inputs.allow_edit"},"allow_list_directory":{"default":true,"description":"是否允许列出目录（只读）","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.file_ops_hub.inputs.allow_list_directory"},"allow_read_content":{"default":true,"description":"是否允许读取文件内容（只读）","title":"Allow Read Content","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.file_ops_hub.inputs.allow_read_content"},"allow_read_info":{"default":true,"description":"是否允许获取文件元信息（只读）","title":"Allow Read Info","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.file_ops_hub.inputs.allow_read_info"},"allow_search":{"default":true,"description":"是否允许搜索文件内容（只读）","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.file_ops_hub.inputs.allow_search"},"allow_write":{"default":true,"description":"是否允许写入/创建文件（中副作用）","type":"boolean","x-control":"switch","x-i18n-key":"nodes.tools.file_ops_hub.inputs.allow_write"},"config":{"additionalProperties":true,"description":"Unified configuration object (can fill JSON text directly)","title":"Config","type":"object","x-control":"text","x-i18n-key":"nodes.tools.file_ops_hub.inputs.config","x-port":true},"operation":{"default":"","description":"操作类型","type":"string","x-i18n-key":"nodes.tools.file_ops_hub.inputs.operation"},"path":{"description":"文件或目录路径（多数操作通用）","type":["string","null"],"x-i18n-key":"nodes.tools.file_ops_hub.inputs.path"},"sandbox_root":{"title":"Sandbox Root","type":["string","null"],"x-i18n-key":"nodes.tools.file_ops_hub.inputs.sandbox_root"}},"required":["allow_delete","allow_edit","allow_list_directory","allow_read_content","allow_read_info","allow_search","allow_write"],"title":"FileOpsHubInput","type":"object","x-collapsed-visible":["sandbox_root"],"x-field-order":["operation","path","sandbox_root","config","allow_read_info","allow_read_content","allow_list_directory","allow_search","allow_write","allow_edit","allow_delete"]},"outputSchema":{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"error":{"description":"错误信息（操作被禁止或执行失败）","type":["string","null"],"x-i18n-key":"nodes.tools.file_ops_hub.outputs.error"},"operation":{"description":"实际执行的操作类型","type":"string","x-i18n-key":"nodes.tools.file_ops_hub.outputs.operation"},"result":{"description":"操作结果（JSON 序列化的子工具输出）","x-i18n-key":"nodes.tools.file_ops_hub.outputs.result"}},"required":["operation","result"],"title":"FileOpsHubOutput","type":"object","x-collapsed-visible":["operation"],"x-field-order":["operation","error","result"]},"builtin":true,"i18nKeyPrefix":"nodes.tools.file_ops_hub"}],"timestamp":"2026-05-10T06:20:25.153572964+00:00"}