Skip to content

Commit

Permalink
feat: AI nodes usability fixes + Summarization Chain V2 (#7949)
Browse files Browse the repository at this point in the history
Fixes:
- Refactor connection snapping when dragging and enable it also for
non-main connection types
- Fix propagation of errors from sub-nodes
- Fix chat scrolling when sending/receiving messages
- Prevent empty chat messages
- Fix sub-node selected styles
- Fix output names text overflow

Usability improvements:
- Auto-add manual chat trigger for agents & chain nodes
- Various labels and description updates
- Make the output parser input optional for Basic LLM Chain
- Summarization Chain V2 with a simplified document loader & text
chunking mode

#### How to test the change:
Example workflow showcasing different operation mode of the new
summarization chain:

[Summarization_V2.json](https://github.com/n8n-io/n8n/files/13599901/Summarization_V2.json)


## Issues fixed
Include links to Github issue or Community forum post or **Linear
ticket**:
> Important in order to close automatically and provide context to
reviewers
-
https://www.notion.so/n8n/David-Langchain-Posthog-notes-7a9294938420403095f4508f1a21d31d
- https://linear.app/n8n/issue/N8N-7070/ux-fixes-batch
- https://linear.app/n8n/issue/N8N-7071/ai-sub-node-bugs


## Review / Merge checklist
- [x] PR title and summary are descriptive. **Remember, the title
automatically goes into the changelog. Use `(no-changelog)` otherwise.**
([conventions](https://github.com/n8n-io/n8n/blob/master/.github/pull_request_title_conventions.md))
- [x] [Docs updated](https://github.com/n8n-io/n8n-docs) or follow-up
ticket created.
- [ ] Tests included.
> A bug is not considered fixed, unless a test is added to prevent it
from happening again. A feature is not complete without tests.
  >
> *(internal)* You can use Slack commands to trigger [e2e
tests](https://www.notion.so/n8n/How-to-use-Test-Instances-d65f49dfc51f441ea44367fb6f67eb0a?pvs=4#a39f9e5ba64a48b58a71d81c837e8227)
or [deploy test
instance](https://www.notion.so/n8n/How-to-use-Test-Instances-d65f49dfc51f441ea44367fb6f67eb0a?pvs=4#f6a177d32bde4b57ae2da0b8e454bfce)
or [deploy early access version on
Cloud](https://www.notion.so/n8n/Cloudbot-3dbe779836004972b7057bc989526998?pvs=4#fef2d36ab02247e1a0f65a74f6fb534e).

---------

Signed-off-by: Oleg Ivaniv <[email protected]>
Co-authored-by: Elias Meire <[email protected]>
  • Loading branch information
OlegIvaniv and elsmr authored Dec 8, 2023
1 parent dbd62a4 commit dcf1286
Show file tree
Hide file tree
Showing 32 changed files with 1,239 additions and 440 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export class OpenAiAssistant implements INodeType {
default: 'existing',
options: [
{
name: 'Create New Assistant',
name: 'Use New Assistant',
value: 'new',
},
{
Expand Down Expand Up @@ -94,7 +94,6 @@ export class OpenAiAssistant implements INodeType {
typeOptions: {
rows: 5,
},
required: true,
displayOptions: {
show: {
'/mode': ['new'],
Expand Down Expand Up @@ -237,11 +236,28 @@ export class OpenAiAssistant implements INodeType {
value: 'code_interpreter',
},
{
name: 'Retrieval',
name: 'Knowledge Retrieval',
value: 'retrieval',
},
],
},
{
displayName: 'Connect your own custom tools to this node on the canvas',
name: 'noticeTools',
type: 'notice',
default: '',
},
{
displayName:
'Upload files for retrieval using the <a href="https://platform.openai.com/playground" target="_blank">OpenAI website<a/>',
name: 'noticeTools',
type: 'notice',
typeOptions: {
noticeTheme: 'info',
},
displayOptions: { show: { '/nativeTools': ['retrieval'] } },
default: '',
},
{
displayName: 'Options',
name: 'options',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,13 +191,33 @@ async function getChain(
return Array.isArray(response) ? response : [response];
}

function getInputs(parameters: IDataObject) {
const hasOutputParser = parameters?.hasOutputParser;
const inputs = [
{ displayName: '', type: NodeConnectionType.Main },
{
displayName: 'Model',
maxConnections: 1,
type: NodeConnectionType.AiLanguageModel,
required: true,
},
];

// If `hasOutputParser` is undefined it must be version 1.1 or earlier so we
// always add the output parser input
if (hasOutputParser === undefined || hasOutputParser === true) {
inputs.push({ displayName: 'Output Parser', type: NodeConnectionType.AiOutputParser });
}
return inputs;
}

export class ChainLlm implements INodeType {
description: INodeTypeDescription = {
displayName: 'Basic LLM Chain',
name: 'chainLlm',
icon: 'fa:link',
group: ['transform'],
version: [1, 1.1],
version: [1, 1.1, 1.2],
description: 'A simple chain to prompt a large language model',
defaults: {
name: 'Basic LLM Chain',
Expand All @@ -217,25 +237,11 @@ export class ChainLlm implements INodeType {
],
},
},
// eslint-disable-next-line n8n-nodes-base/node-class-description-inputs-wrong-regular-node
inputs: [
NodeConnectionType.Main,
{
displayName: 'Model',
maxConnections: 1,
type: NodeConnectionType.AiLanguageModel,
required: true,
},
{
displayName: 'Output Parser',
type: NodeConnectionType.AiOutputParser,
required: false,
},
],
inputs: `={{ ((parameter) => { ${getInputs.toString()}; return getInputs(parameter) })($parameter) }}`,
outputs: [NodeConnectionType.Main],
credentials: [],
properties: [
getTemplateNoticeField(1951),
getTemplateNoticeField(1978),
{
displayName: 'Prompt',
name: 'prompt',
Expand All @@ -256,7 +262,7 @@ export class ChainLlm implements INodeType {
default: '={{ $json.chat_input }}',
displayOptions: {
show: {
'@version': [1.1],
'@version': [1.1, 1.2],
},
},
},
Expand Down Expand Up @@ -400,6 +406,28 @@ export class ChainLlm implements INodeType {
},
],
},
{
displayName: 'Require Specific Output Format',
name: 'hasOutputParser',
type: 'boolean',
default: false,
displayOptions: {
show: {
'@version': [1.2],
},
},
},
{
displayName: `Connect an <a data-action='openSelectiveNodeCreator' data-action-parameter-connectiontype='${NodeConnectionType.AiOutputParser}'>output parser</a> on the canvas to specify the output format you require`,
name: 'notice',
type: 'notice',
default: '',
displayOptions: {
show: {
hasOutputParser: [true],
},
},
},
],
};

Expand All @@ -413,10 +441,14 @@ export class ChainLlm implements INodeType {
0,
)) as BaseLanguageModel;

const outputParsers = (await this.getInputConnectionData(
NodeConnectionType.AiOutputParser,
0,
)) as BaseOutputParser[];
let outputParsers: BaseOutputParser[] = [];

if (this.getNodeParameter('hasOutputParser', 0, true) === true) {
outputParsers = (await this.getInputConnectionData(
NodeConnectionType.AiOutputParser,
0,
)) as BaseOutputParser[];
}

for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
const prompt = this.getNodeParameter('prompt', itemIndex) as string;
Expand Down
Loading

0 comments on commit dcf1286

Please sign in to comment.