mirror of
https://github.com/OpenBMB/ChatDev.git
synced 2026-04-26 03:38:12 +00:00
230 lines
7.7 KiB
JavaScript
230 lines
7.7 KiB
JavaScript
export const helpContent = {
|
|
// Start Node Help
|
|
startNode: {
|
|
title: "Start Node",
|
|
description: "The entry point for your workflow. All nodes connected to the Start node will run in parallel when the workflow launches.",
|
|
examples: [
|
|
"Connect multiple nodes to start them simultaneously",
|
|
"The first nodes to execute receive your initial input"
|
|
],
|
|
learnMoreUrl: "/tutorial#2-create-nodes"
|
|
},
|
|
|
|
// Workflow Node Types
|
|
workflowNode: {
|
|
agent: {
|
|
title: "Agent Node",
|
|
description: "An AI agent that can reason, generate content, and use tools. Agents receive messages and produce responses based on their configuration.",
|
|
examples: [
|
|
"Content generation (writing, coding, analysis)",
|
|
"Decision making and routing",
|
|
"Tool usage (search, file operations, API calls)"
|
|
],
|
|
learnMoreUrl: "/tutorial#agent-node"
|
|
},
|
|
human: {
|
|
title: "Human Node",
|
|
description: "Pauses workflow execution and waits for human input. Use this to review content, make decisions, or provide feedback.",
|
|
examples: [
|
|
"Review and approve generated content",
|
|
"Provide additional instructions or corrections",
|
|
"Choose between workflow paths"
|
|
],
|
|
learnMoreUrl: "/tutorial#human-node"
|
|
},
|
|
python: {
|
|
title: "Python Node",
|
|
description: "Executes Python code in a sandboxed environment. The code runs in the workspace directory and can access uploaded files.",
|
|
examples: [
|
|
"Data processing and analysis",
|
|
"Running generated code",
|
|
"File manipulation"
|
|
],
|
|
learnMoreUrl: "/tutorial#python-node"
|
|
},
|
|
passthrough: {
|
|
title: "Passthrough Node",
|
|
description: "Passes messages to the next node without modification. Useful for workflow organization and filtering outputs in loops.",
|
|
examples: [
|
|
"Preserve initial context in loops",
|
|
"Filter redundant outputs",
|
|
"Organize workflow structure"
|
|
],
|
|
learnMoreUrl: "/tutorial#passthrough-node"
|
|
},
|
|
literal: {
|
|
title: "Literal Node",
|
|
description: "Outputs fixed text, ignoring all input. Use this to inject instructions or context at specific points in the workflow.",
|
|
examples: [
|
|
"Add fixed instructions before a node",
|
|
"Inject context or constraints",
|
|
"Provide test data"
|
|
],
|
|
learnMoreUrl: "/tutorial#literal-node"
|
|
},
|
|
loop_counter: {
|
|
title: "Loop Counter Node",
|
|
description: "Limits loop iterations. Only produces output when the maximum count is reached, helping control infinite loops.",
|
|
examples: [
|
|
"Prevent runaway loops",
|
|
"Set maximum revision cycles",
|
|
"Control iterative processes"
|
|
],
|
|
learnMoreUrl: "/tutorial#loop-counter-node"
|
|
},
|
|
subgraph: {
|
|
title: "Subgraph Node",
|
|
description: "Embeds another workflow as a reusable module. Enables modular design and workflow composition.",
|
|
examples: [
|
|
"Reuse common patterns across workflows",
|
|
"Break complex workflows into manageable pieces",
|
|
"Share workflows between teams"
|
|
],
|
|
learnMoreUrl: "/tutorial#subgraph-node"
|
|
},
|
|
unknown: {
|
|
title: "Workflow Node",
|
|
description: "A node in your workflow. Click to view and edit its configuration.",
|
|
learnMoreUrl: "/tutorial#2-create-nodes"
|
|
}
|
|
},
|
|
|
|
// Workflow Edge Help
|
|
edge: {
|
|
basic: {
|
|
title: "Connection",
|
|
description: "Connects two nodes to control information flow and execution order. The upstream node's output becomes the downstream node's input.",
|
|
examples: [
|
|
"Data flows from source to target",
|
|
"Target executes after source completes"
|
|
],
|
|
learnMoreUrl: "/tutorial#what-is-an-edge"
|
|
},
|
|
trigger: {
|
|
enabled: {
|
|
description: "This connection triggers the downstream node to execute.",
|
|
},
|
|
disabled: {
|
|
description: "This connection passes data but does NOT trigger execution. The downstream node only runs if triggered by another edge.",
|
|
}
|
|
},
|
|
condition: {
|
|
hasCondition: {
|
|
description: "This connection has a condition. It only activates when the condition evaluates to true.",
|
|
learnMoreUrl: "/tutorial#edge-condition"
|
|
}
|
|
}
|
|
},
|
|
|
|
// Context Menu Actions
|
|
contextMenu: {
|
|
createNode: {
|
|
description: "Create a new node in your workflow. Choose from Agent, Human, Python, and other node types.",
|
|
},
|
|
copyNode: {
|
|
description: "Duplicate this node with all its settings. The copy will have a blank ID that you must fill in.",
|
|
},
|
|
deleteNode: {
|
|
description: "Remove this node and all its connections from the workflow.",
|
|
},
|
|
deleteEdge: {
|
|
description: "Remove this connection between nodes.",
|
|
},
|
|
createNodeButton: {
|
|
description: "Open the node creation form. You can also right-click the canvas to create a node at a specific position.",
|
|
},
|
|
configureGraph: {
|
|
description: "Configure workflow-level settings like name, description, and global variables.",
|
|
},
|
|
launch: {
|
|
description: "Run your workflow with a task prompt. The workflow will execute and show you the results.",
|
|
},
|
|
createEdge: {
|
|
description: "Create a connection between nodes. You can also drag from a node's handle to create connections visually.",
|
|
},
|
|
manageVariables: {
|
|
description: "Define global variables (like API keys) that all nodes can access using ${VARIABLE_NAME} syntax.",
|
|
},
|
|
manageMemories: {
|
|
description: "Configure memory modules for long-term information storage and retrieval across workflow runs.",
|
|
},
|
|
renameWorkflow: {
|
|
description: "Change the name of this workflow file.",
|
|
},
|
|
copyWorkflow: {
|
|
description: "Create a duplicate of this entire workflow with a new name.",
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get help content by key path
|
|
* @param {string} key - Dot-separated path to content (e.g., 'workflowNode.agent')
|
|
* @returns {Object} Help content object or fallback
|
|
*/
|
|
export function getHelpContent(key) {
|
|
const keys = key.split('.')
|
|
let content = helpContent
|
|
|
|
for (const k of keys) {
|
|
if (content && typeof content === 'object' && k in content) {
|
|
content = content[k]
|
|
} else {
|
|
console.warn(`[HelpContent] Missing content for key: ${key}`)
|
|
return {
|
|
description: "Help content coming soon. Check the tutorial for more information.",
|
|
learnMoreUrl: "/tutorial"
|
|
}
|
|
}
|
|
}
|
|
|
|
// Ensure we return an object with at least a description
|
|
if (typeof content === 'string') {
|
|
return { description: content }
|
|
}
|
|
|
|
return content || { description: "Help content coming soon." }
|
|
}
|
|
|
|
/**
|
|
* Get node-specific help content based on node type
|
|
* @param {string} nodeType - The type of node (agent, human, python, etc.)
|
|
* @returns {Object} Help content for that node type
|
|
*/
|
|
export function getNodeHelp(nodeType) {
|
|
const type = (nodeType || 'unknown').toLowerCase()
|
|
return getHelpContent(`workflowNode.${type}`)
|
|
}
|
|
|
|
/**
|
|
* Get edge help content based on edge properties
|
|
* @param {Object} edgeData - The edge data object
|
|
* @returns {Object} Combined help content for the edge
|
|
*/
|
|
export function getEdgeHelp(edgeData) {
|
|
const base = { ...helpContent.edge.basic }
|
|
|
|
// Add trigger information
|
|
const trigger = edgeData?.trigger !== undefined ? edgeData.trigger : true
|
|
if (!trigger) {
|
|
base.description += " " + helpContent.edge.trigger.disabled.description
|
|
}
|
|
|
|
// Add condition information
|
|
if (edgeData?.condition) {
|
|
base.description += " " + helpContent.edge.condition.hasCondition.description
|
|
if (!base.learnMoreUrl) {
|
|
base.learnMoreUrl = helpContent.edge.condition.hasCondition.learnMoreUrl
|
|
}
|
|
}
|
|
|
|
return base
|
|
}
|
|
|
|
export default {
|
|
helpContent,
|
|
getHelpContent,
|
|
getNodeHelp,
|
|
getEdgeHelp
|
|
}
|