Node types in prompt flow - Amazon Bedrock

Node types in prompt flow

Amazon Bedrock provides the following node types to build your prompt flow. When you configure a node, you need to provide the following fields:

  • Name – Enter a name for the node.

  • Type – In the console, you drag and drop the type of node to use. In the API, use the type field and the corresponding FlowNodeConfiguration in the configuration field.

  • Inputs – Provide a name and data type for each input. Some nodes have pre-defined names or types that you must use. To learn which ones have pre-defined names, see Logic node types. In the expression field, define the part of the whole input to use as the individual input. For more information, see Use expressions to define inputs by extracting the relevant part of a whole input.

  • Outputs – Provide a name and data type for each output. Some nodes have pre-defined names or types that you must use. To learn which ones have pre-defined names, see Logic node types.

  • Configuration – In the console, you define node-specific fields at the top of the node. In the API, use the appropriate FlowNodeConfiguration and fill in its fields.

Each node type is described below and its structure in the API is provided. Expand a section to learn more about that node type.

Nodes for controlling prompt flow logic

Use the following node types to control the logic of your prompt flow.

Every prompt flow contains only one flow input node and must begin with it. The flow input node takes the content from the InvokeFlow request, validates the data type, and sends it to the following node.

The following shows the general structure of an input FlowNode object in the API:

{ "name": "string", "type": "Input", "outputs": [ { "name": "document", "type": "String | Number | Boolean | Object | Array", } ], "configuration": { "input": CONTEXT-DEPENDENT } }

A flow output node extracts the input data from the previous node, based on the defined expression, and returns it. In the console, the output is the response returned after choosing Run in the test window. In the API, the output is returned in the content field of the flowOutputEvent in the InvokeFlow response. A prompt flow can have multiple flow output nodes.

A flow can have multiple flow output nodes if there are multiple branches in the flow.

The following shows the general structure of an output FlowNode object:

{ "name": "string", "type": "Output", "inputs": [ { "name": "document", "type": "String | Number | Boolean | Object | Array", "expression": "string" } ], "configuration": { "output": CONTEXT-DEPENDENT } }

A condition node sends data from the previous node to different nodes, depending on the conditions that are defined. A condition node can take multiple inputs.

To define a condition node
  1. Add as many inputs as you need to evaluate the conditions you plan to add.

  2. Enter a name for each input, specify the type to expect, and write an expression to extract the relevant part from the whole input.

  3. Connect each input to the relevant output from an upstream node.

  4. Add as many conditions as you need.

  5. For each condition:

    1. Enter a name for the condition.

    2. Use relational and logical operators to define a condition that compares inputs to other inputs or to a constant.

      Note

      Conditions are evaluated in order. If more than one condition is satisfied, the earlier condition takes precedence.

    3. Connect each condition to the downstream node to which you want to send the data if that condition is fulfilled.

Condition expressions

To define a condition, you refer to an input by its name and compare it to a value using any of the following relational operators:

Operator Meaning Supported data types Example usage Example meaning
== Equal to (the data type must also be equal) String, Number, Boolean A == B If A is equal to B
!= Not equal to String, Number, Boolean A != B If A isn't equal to B
> Greater than Number A > B If A is greater than B
>= Greater than or equal to Number A >= B If A is greater than or equal to B
< Less than Number A < B If A is less than B
<= Less than or equal to Number A <= B If A is less than or equal to B

You can compare inputs to other inputs or to a constant in a conditional expression. For example, if you have a numerical input called profit and another one called expenses, both profit > expenses or profit <= 1000 are valid expressions.

You can use the following logical operators to combine expressions for more complex conditions. We recommend that you use parentheses to resolve ambiguities in grouping of expressions:

Operator Meaning Example usage Example meaning
and Both expressions are true (A < B) and (C == 1) If both expressions are true:
  • A is less than B

  • C is equal to 1

or At least one expression is true (A != 2) or (B > C) If either expressions is true:
  • A isn't equal to B

  • B is greater than C

not The expression isn't true not (A > B) If A isn't greater than B (equivalent to A <= B)

In the API, you define the following in the definition field when you send a CreateFlow or UpdateFlow request:

  1. A condition FlowNode object in the nodes array. The general format is as follows (note that condition nodes don't have outputs):

    { "name": "string", "type": "Condition", "inputs": [ { "name": "string", "type": "String | Number | Boolean | Object | Array", "expression": "string" } ], "configuration": { "conditions": [ { "name": "string", "expression": "string" }, ... ] } }
  2. For each input into the condition node, a FlowConnection object in the connections array. Include a FlowDataConnectionConfiguration object in the configuration field of the FlowConnection object. The general format of theFlowConnection object is as follows:

    { "name": "string", "source": "string", "target": "string", "type": "Data", "configuration": { "data": { "sourceOutput": "string", "expression": "string" } } }
  3. For each condition (including the default condition) in the condition node, a FlowConnection object in the connections array. Include a FlowConditionalConnectionConfiguration object in the configuration field of the FlowConnection object. The general format of the FlowConnection object is as follows:

    { "name": "string", "source": "string", "target": "string", "type": "Data", "configuration": { "condition": "default", "condition": "string" ... } }

    Use relational and logical operators to define the condition that connects this condition source node to a target node downstream. For the default condition, specify the condition as default.

An iterator node takes an array and iteratively returns its items as output to the downstream node. The flow output node returns the final result for each input in a different response. You can use also use a collector node downstream from the iterator node to collect the iterated responses and return them as an array, in addition to the size of the array.

The following shows the general structure of an iterator FlowNode object:

{ "name": "string", "type": "Iterator", "inputs": [ { "name": "array", "type": "String | Number | Boolean | Object | Array", "expression": "string" } ], "outputs": [ { "name": "arrayItem", "type": "String | Number | Boolean | Object | Array", }, { "name": "arraySize", "type": "Number" } ], "configuration": { "iterator": CONTEXT-DEPENDENT } }

A collector node takes an iterated input, in addition to the size that the array will be, and returns them as an array. You can use a collector node downstream from an iterator node to collect the iterated items after sending them through some nodes.

The following shows the general structure of a collector FlowNode object:

{ "name": "string", "type": "Collector", "inputs": [ { "name": "arrayItem", "type": "String | Number | Boolean | Object | Array", "expression": "string" }, { "name": "arraySize", "type": "Number" } ], "outputs": [ { "name": "collectedArray", "type": "Array" }, ], "configuration": { "collector": CONTEXT-DEPENDENT } }

Nodes for handling data in the prompt flow

Use the following node types to handle data in your prompt flow:

A prompt node defines a prompt to use in the flow. You can use a prompt from Prompt management or define one inline in the node. For more information, see Prompt management in Amazon Bedrock.

The inputs to the prompt node are values to fill in the variables. The output is the generated response from the model.

The following shows the general structure of a prompt FlowNode object:

{ "name": "string", "type": "prompt", "inputs": [ { "name": "content", "type": "String | Number | Boolean | Object | Array", "expression": "string" }, ... ], "outputs": [ { "name": "modelCompletion", "type": "String" } ], "configuration": { "prompt": { "sourceConfiguration": PromptFlowNodeSourceConfiguration object (see below) } } }

The PromptFlowNodeSourceConfiguration object depends on if you use a prompt from Prompt management or if you define it inline:

  • If you use a prompt from Prompt management, the object should be in the following general structure:

    { "resource": { "promptArn": "string" } }
  • If you define a prompt inline, follow the guidance for defining a variant in the API tab of Create a prompt using Prompt management (note that there is no name field in this object, however). The object you use should be in the following general structure:

    { "inline": { "modelId": "string", "templateType": "TEXT", "templateConfiguration": { "text": { "text": "string", "inputVariables": [ { "name": "string" }, ... ] } }, "inferenceConfiguration": { "text": { "maxTokens": int, "stopSequences": ["string", ...], "temperature": float, "topK": int, "topP": float } } } }

An agent node lets you send a prompt to an agent, which orchestrates between FMs and associated resources to identify and carry out actions for an end-user. For more information, see Agents for Amazon Bedrock.

In the configuration, specify the Amazon Resource Name (ARN) of the alias of the agent to use. The inputs into the node are the prompt for the agent and any associated prompt or session attributes. The node returns the agent's response as an output.

Note

Currently, the agent doesn't support multi-turn invocations. You can't configure return of control for the agent in a flow.

The following shows the general structure of an agent FlowNode object:

{ "name": "string", "type": "Agent", "inputs": [ { "name": "agentInputText" "type": "String | Number | Boolean | Object | Array", "expression": "string" }, { "name": "promptAttributes" "type": "Object", "expression": "string" }, { "name": "sessionAttributes" "type": "Object", "expression": "string" } ], "outputs": [ { "name": "agentResponse", "type": "String" } ], "configuration": { "agent": { "agentAliasArn": "string" } } }

A knowledge base node lets you send a query to a knowledge base. For more information, see Knowledge bases for Amazon Bedrock.

In the configuration, provide the knowledge base ID and a model ID to use if you want to generate a response based on the retrieved results. To return the retrieved results as an array, omit the model ID. The input into the node is the query to the knowledge base. The output is either the model response, as a string, or an array of the retrieved results.

The following shows the general structure of a knowledge base FlowNode object:

{ "name": "string", "type": "KnowledgeBase", "inputs": [ { "name": "retrievalQuery", "type": "String", "expression": "string" } ], "outputs": [ { "name": "retrievalResults", "type": "Array | String" } ], "configuration": { "knowledgeBase": { "knowledgeBaseId": "string", "modelId": "string" } } }

An S3 storage node lets you store data in the flow to an Amazon S3 location. In the configuration, you specify the S3 bucket to use for data storage. The inputs into the node are the content to store and the object key. The node returns the URI of the S3 location as its output.

The following shows the general structure of an S3 storage FlowNode object:

{ "name": "string", "type": "Storage", "inputs": [ { "name": "content", "type": "String | Number | Boolean | Object | Array", "expression": "string" }, { "name": "objectKey", "type": "String", "expression": "string" } ], "outputs": [ { "name": "storageS3Uri", "type": "String" } ], "configuration": { "retrieval": { "serviceConfiguration": { "s3": { "bucketName": "string" } } } } }

An S3 retrieval node lets you retrieve data from an Amazon S3 location to introduce to the flow. In the configuration, you specify the S3 bucket from which to retrieve data. The input into the node is the object key. The node returns the content in the S3 location as the output.

Note

Currently, the data in the S3 location must be a UTF-8 encoded string.

The following shows the general structure of an S3 retrieval FlowNode object:

{ "name": "string", "type": "Retrieval", "inputs": [ { "name": "retrievalObjectKey" "type": "String", "expression": "string" } ], "outputs": [ { "name": "retrievalNodeContent", "type": "String" } ], "configuration": { "retrieval": { "serviceConfiguration": { "s3": { "bucketName": "string" } } } } }

A Lambda function node lets you call a Lambda function in which you can define code to carry out business logic. For more information, see the AWS Lambda Developer Guide.

In the configuration, specify the Amazon Resource Name (ARN) of the Lambda function. Define inputs to send in the Lambda input event. You can write code based on these inputs and define what the function returns. The function response is returned as the output.

The following shows the general structure of a Λ function FlowNode object:

{ "name": "string", "type": "LambdaFunction", "inputs": [ { "name": "string", "type": "String | Number | Boolean | Object | Array", "expression": "string" }, ... ], "outputs": [ { "name": "functionResponse", "type": "String | Number | Boolean | Object | Array" } ], "configuration": { "lambdaFunction": { "lambdaArn": "string" } } }

A Lex node lets you call a Amazon Lex bot to process an utterance using natural language processing and to identify an intent, based on the bot definition. For more information, see Amazon Lex Developer Guide.

In the configuration, specify the Amazon Resource Name (ARN) of the alias of the bot to use and the locale to use. The inputs into the node are the utterance and any accompanying request attributes or session attributes. The node returns the identified intent as the output.

Note

Currently, the Lex node doesn't support multi-turn conversations. One Lex node can only process one utterance.

The following shows the general structure of a Lex FlowNode object:

{ "name": "string", "type": "Lex", "inputs": [ { "name": "inputText", "type": "String | Number | Boolean | Object | Array", "expression": "string" }, { "name": "requestAttributes", "type": "Object", "expression": "string" }, { "name": "sessionAttributes", "type": "Object", "expression": "string" } ], "outputs": [ { "name": "predictedIntent", "type": "String" } ], "configuration": { "lex": { "botAliasArn": "string", "localeId": "string" } } }

Summary tables for node types

The following tables summarize the inputs and outputs that are allowed for each node type. Note the following:

  • If a name is marked as Any, you can provide any string as the name. Otherwise, you must use the value specified in the table.

  • If a type is marked as Any, you can specify any of the following data types: String, Number, Boolean, Object, Array. Otherwise, you must use the type specified in the table.

  • Currently, only the Condition, Prompt, and Lambda function nodes allow multiple inputs that you can define yourself.

Logic node types
Input info Output info
Node type Input Name Type Output Name Type
Input N/A N/A N/A The content field in the InvokeFlow request. document Any
Output Data to return in the InvokeFlow response. document Any N/A N/A N/A
Condition

Data to send based on a condition.

(multiple inputs allowed)

Any Any

Data to send based on a condition.

(specify conditions for different paths)

Any Any
Iterator An array for which you want to apply the following node(s) iteratively to each member. array Array Each item from the array arrayItem Any
The size of the input array arraySize Number
Collector An iteration that you want to consolidate into an array. arrayItem Any An array with all the outputs from the previous node appended. collectedArray Array
The size of the output array arraySize Number
Data processing node types
Input info Output info
Node type Input Name Type Output Name Type
Prompt

A value to fill in a variable in the prompt.

(multiple inputs allowed)

${variable-name} Any The response returned by the model. modelCompletion String
S3 storage Data to store in an S3 bucket. content Any The URI of the S3 location. storageS3Uri String
The object key to use for the S3 object. objectKey String
S3 retrieval The object key for the S3 object retrievalObjectKey String The data to retrieve from an S3 bucket. retrievalNodeContent Any
Agent The prompt to send to the agent. agentInputText String The response returned from the agent. agentResponse String
Any prompt attributes to send alongside the prompt. promptAttributes Object
Any session attributes to send alongside the prompt. sessionAttributes Object
Knowledge base The query to send to the knowledge base. retrievalQuery String The returned results or generated response from the knowledge base. retrievalResults Array
Lambda function

Data to send to the function.

(multiple inputs allowed)

Any The response returned from the function. functionResponse Any
Lex The utterance to send to the bot. inputText String The intent that the bot predicts for the utterance. predictedIntent String
Any request attributes to send alongside the utterance. requestAttributes Object
Any session attributes to send alongside the utterance. sessionAttributes Object