From a575a6ceec4805e46e9905891734f35ae2596507 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 20:11:27 +0000 Subject: [PATCH 01/14] Add codegen support for ChatMessageTrigger Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- ee/codegen/src/types/vellum.ts | 22 ++++++++++++++-------- ee/codegen/src/utils/triggers.ts | 27 ++++++++++++++++----------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/ee/codegen/src/types/vellum.ts b/ee/codegen/src/types/vellum.ts index f8a38d9afe..69175e5a5a 100644 --- a/ee/codegen/src/types/vellum.ts +++ b/ee/codegen/src/types/vellum.ts @@ -809,9 +809,10 @@ export interface WorkflowOutputValue { } export enum WorkflowTriggerType { + CHAT_MESSAGE = "CHAT_MESSAGE", + INTEGRATION = "INTEGRATION", MANUAL = "MANUAL", SCHEDULED = "SCHEDULED", - INTEGRATION = "INTEGRATION", } export enum IntegrationProvider { @@ -834,6 +835,15 @@ export interface BaseTrigger { displayData?: WorkflowTriggerDisplayData | null; } +export interface ChatMessageTrigger extends BaseTrigger { + type: WorkflowTriggerType.CHAT_MESSAGE; +} + +export interface IntegrationTrigger extends BaseTrigger { + type: WorkflowTriggerType.INTEGRATION; + execConfig: IntegrationTriggerExecConfig; +} + export interface ManualTrigger extends BaseTrigger { type: WorkflowTriggerType.MANUAL; } @@ -844,15 +854,11 @@ export interface ScheduledTrigger extends BaseTrigger { timezone: string; } -export interface IntegrationTrigger extends BaseTrigger { - type: WorkflowTriggerType.INTEGRATION; - execConfig: IntegrationTriggerExecConfig; -} - export type WorkflowTrigger = + | ChatMessageTrigger + | IntegrationTrigger | ManualTrigger - | ScheduledTrigger - | IntegrationTrigger; + | ScheduledTrigger; export interface WorkflowRawData { nodes: WorkflowNode[]; diff --git a/ee/codegen/src/utils/triggers.ts b/ee/codegen/src/utils/triggers.ts index 1d6ff8e18d..7ecd0a705c 100644 --- a/ee/codegen/src/utils/triggers.ts +++ b/ee/codegen/src/utils/triggers.ts @@ -26,6 +26,22 @@ export function getTriggerClassInfo( } switch (trigger.type) { + case WorkflowTriggerType.CHAT_MESSAGE: + return { + className: "ChatMessageTrigger", + modulePath: [...VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH, "chat_message"], + }; + case WorkflowTriggerType.INTEGRATION: + return { + className: createPythonClassName(trigger.execConfig.slug, { + force: true, + }), + modulePath: [ + ...workflowContext.modulePath.slice(0, -1), + GENERATED_TRIGGERS_MODULE_NAME, + toPythonSafeSnakeCase(trigger.execConfig.slug), + ], + }; case WorkflowTriggerType.MANUAL: return { className: "ManualTrigger", @@ -42,16 +58,5 @@ export function getTriggerClassInfo( ], }; } - case WorkflowTriggerType.INTEGRATION: - return { - className: createPythonClassName(trigger.execConfig.slug, { - force: true, - }), - modulePath: [ - ...workflowContext.modulePath.slice(0, -1), - GENERATED_TRIGGERS_MODULE_NAME, - toPythonSafeSnakeCase(trigger.execConfig.slug), - ], - }; } } From 2cea6c18cd6223884efa4bfeb6297cf583d24ff6 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 20:58:52 +0000 Subject: [PATCH 02/14] Fix trigger ordering and add CHAT_MESSAGE test Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../src/__test__/utils/triggers.test.ts | 15 +++++++++ ee/codegen/src/types/vellum.ts | 28 ++++++++-------- ee/codegen/src/utils/triggers.ts | 32 +++++++++---------- 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/ee/codegen/src/__test__/utils/triggers.test.ts b/ee/codegen/src/__test__/utils/triggers.test.ts index 927ab8230f..28b77f21db 100644 --- a/ee/codegen/src/__test__/utils/triggers.test.ts +++ b/ee/codegen/src/__test__/utils/triggers.test.ts @@ -69,4 +69,19 @@ describe("getTriggerClassInfo", () => { modulePath: ["tests", "fixtures", "triggers", "slack_new_message"], }); }); + + it("should return correct info for CHAT_MESSAGE trigger", () => { + const trigger: WorkflowTrigger = { + id: "chat-message-trigger-id", + type: WorkflowTriggerType.CHAT_MESSAGE, + attributes: [{ id: "attr-1", type: "JSON", key: "message" }], + }; + + const result = getTriggerClassInfo(trigger, workflowContextFactory()); + + expect(result).toEqual({ + className: "ChatMessageTrigger", + modulePath: ["vellum", "workflows", "triggers", "chat_message"], + }); + }); }); diff --git a/ee/codegen/src/types/vellum.ts b/ee/codegen/src/types/vellum.ts index 69175e5a5a..3e556d46cf 100644 --- a/ee/codegen/src/types/vellum.ts +++ b/ee/codegen/src/types/vellum.ts @@ -809,10 +809,10 @@ export interface WorkflowOutputValue { } export enum WorkflowTriggerType { - CHAT_MESSAGE = "CHAT_MESSAGE", - INTEGRATION = "INTEGRATION", MANUAL = "MANUAL", SCHEDULED = "SCHEDULED", + INTEGRATION = "INTEGRATION", + CHAT_MESSAGE = "CHAT_MESSAGE", } export enum IntegrationProvider { @@ -835,15 +835,6 @@ export interface BaseTrigger { displayData?: WorkflowTriggerDisplayData | null; } -export interface ChatMessageTrigger extends BaseTrigger { - type: WorkflowTriggerType.CHAT_MESSAGE; -} - -export interface IntegrationTrigger extends BaseTrigger { - type: WorkflowTriggerType.INTEGRATION; - execConfig: IntegrationTriggerExecConfig; -} - export interface ManualTrigger extends BaseTrigger { type: WorkflowTriggerType.MANUAL; } @@ -854,11 +845,20 @@ export interface ScheduledTrigger extends BaseTrigger { timezone: string; } +export interface IntegrationTrigger extends BaseTrigger { + type: WorkflowTriggerType.INTEGRATION; + execConfig: IntegrationTriggerExecConfig; +} + +export interface ChatMessageTrigger extends BaseTrigger { + type: WorkflowTriggerType.CHAT_MESSAGE; +} + export type WorkflowTrigger = - | ChatMessageTrigger - | IntegrationTrigger | ManualTrigger - | ScheduledTrigger; + | ScheduledTrigger + | IntegrationTrigger + | ChatMessageTrigger; export interface WorkflowRawData { nodes: WorkflowNode[]; diff --git a/ee/codegen/src/utils/triggers.ts b/ee/codegen/src/utils/triggers.ts index 7ecd0a705c..035588c267 100644 --- a/ee/codegen/src/utils/triggers.ts +++ b/ee/codegen/src/utils/triggers.ts @@ -26,22 +26,6 @@ export function getTriggerClassInfo( } switch (trigger.type) { - case WorkflowTriggerType.CHAT_MESSAGE: - return { - className: "ChatMessageTrigger", - modulePath: [...VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH, "chat_message"], - }; - case WorkflowTriggerType.INTEGRATION: - return { - className: createPythonClassName(trigger.execConfig.slug, { - force: true, - }), - modulePath: [ - ...workflowContext.modulePath.slice(0, -1), - GENERATED_TRIGGERS_MODULE_NAME, - toPythonSafeSnakeCase(trigger.execConfig.slug), - ], - }; case WorkflowTriggerType.MANUAL: return { className: "ManualTrigger", @@ -58,5 +42,21 @@ export function getTriggerClassInfo( ], }; } + case WorkflowTriggerType.INTEGRATION: + return { + className: createPythonClassName(trigger.execConfig.slug, { + force: true, + }), + modulePath: [ + ...workflowContext.modulePath.slice(0, -1), + GENERATED_TRIGGERS_MODULE_NAME, + toPythonSafeSnakeCase(trigger.execConfig.slug), + ], + }; + case WorkflowTriggerType.CHAT_MESSAGE: + return { + className: "ChatMessageTrigger", + modulePath: [...VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH, "chat_message"], + }; } } From 519fbc798e9cf53c69fc8eb3ea197300d24e1e7b Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:04:22 +0000 Subject: [PATCH 03/14] Add snapshot test for ChatMessageTrigger codegen Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../__snapshots__/generate-code.test.ts.snap | 16 +++ .../chat-message-trigger.ts | 114 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts diff --git a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap index d12dd2b0ef..f026766166 100644 --- a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap +++ b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap @@ -38,6 +38,22 @@ class UseApiWithSecret(FinalOutputNode[BaseState, Any]): " `; +exports[`generateCode > should generate code for %1 chat-message-trigger.ts > workflow.py 1`] = ` +"from vellum.workflows import BaseWorkflow +from vellum.workflows.triggers.chat_message import ChatMessageTrigger + +from .nodes.bottom_node import BottomNode +from .nodes.top_node import TopNode + + +class Workflow(BaseWorkflow): + graph = { + TopNode, + ChatMessageTrigger >> BottomNode, + } +" +`; + exports[`generateCode > should generate code for %1 code-execution-node-with-await-all.ts > nodes/code_execution_with_await_all/__init__.py 1`] = ` "from vellum.workflows.nodes.displayable import CodeExecutionNode from vellum.workflows.state import BaseState diff --git a/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts b/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts new file mode 100644 index 0000000000..972d8dea54 --- /dev/null +++ b/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts @@ -0,0 +1,114 @@ +export default { + workflow_raw_data: { + nodes: [ + { + id: "entrypoint-node", + type: "ENTRYPOINT", + data: { + label: "Entrypoint", + source_handle_id: "entrypoint-source", + }, + inputs: [], + }, + { + id: "top-node", + type: "GENERIC", + label: "Top Node", + display_data: null, + base: { + name: "BaseNode", + module: ["vellum", "workflows", "nodes", "bases", "base"], + }, + definition: { + name: "TopNode", + module: ["testing", "nodes", "top_node"], + }, + trigger: { + id: "top-target", + merge_behavior: "AWAIT_ATTRIBUTES", + }, + ports: [ + { + id: "top-default-port-id", + name: "default", + type: "DEFAULT", + }, + ], + outputs: [], + attributes: [], + }, + { + id: "bottom-node", + type: "GENERIC", + label: "Bottom Node", + display_data: null, + base: { + name: "BaseNode", + module: ["vellum", "workflows", "nodes", "bases", "base"], + }, + definition: { + name: "BottomNode", + module: ["testing", "nodes", "bottom_node"], + }, + trigger: { + id: "bottom-target", + merge_behavior: "AWAIT_ATTRIBUTES", + }, + ports: [ + { + id: "bottom-default-port-id", + name: "default", + type: "DEFAULT", + }, + ], + outputs: [], + attributes: [], + }, + ], + edges: [ + { + id: "edge-1", + source_node_id: "entrypoint-node", + source_handle_id: "entrypoint-source", + target_node_id: "top-node", + target_handle_id: "top-target", + type: "DEFAULT", + }, + { + id: "edge-2", + source_node_id: "chat-message-trigger", + source_handle_id: "chat-message-trigger", + target_node_id: "bottom-node", + target_handle_id: "bottom-target", + type: "DEFAULT", + }, + ], + output_values: [], + }, + input_variables: [], + output_variables: [], + triggers: [ + { + id: "chat-message-trigger", + type: "CHAT_MESSAGE", + attributes: [ + { + id: "message-attribute-id", + key: "message", + type: "JSON", + }, + ], + display_data: { + label: "Chat Message", + position: { + x: 100, + y: 200, + }, + z_index: 1, + icon: "vellum:icon:message", + color: "blue", + }, + }, + ], + assertions: ["workflow.py"], +}; From 54d173f1ad1e75ccca338df5087438b4a4d3ea69 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:18:16 +0000 Subject: [PATCH 04/14] Add ChatMessageTriggerSerializer to WorkflowTriggerSerializer union Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- ee/codegen/src/serializers/vellum.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/ee/codegen/src/serializers/vellum.ts b/ee/codegen/src/serializers/vellum.ts index 80a878c6c4..ca475b0401 100644 --- a/ee/codegen/src/serializers/vellum.ts +++ b/ee/codegen/src/serializers/vellum.ts @@ -2435,17 +2435,39 @@ export declare namespace IntegrationTriggerSerializer { } } +const ChatMessageTriggerSerializer = objectSchema({ + id: stringSchema(), + attributes: listSchema(VellumVariableSerializer), + definition: CodeResourceDefinitionSerializer.optional(), + displayData: propertySchema( + "display_data", + WorkflowTriggerDisplayDataSerializer.nullable().optional() + ), +}); + +export declare namespace ChatMessageTriggerSerializer { + interface Raw { + id: string; + type: "CHAT_MESSAGE"; + attributes: VellumVariableSerializer.Raw[]; + definition?: CodeResourceDefinitionSerializer.Raw | null; + display_data?: WorkflowTriggerDisplayDataSerializer.Raw | null; + } +} + export const WorkflowTriggerSerializer = unionSchema("type", { MANUAL: ManualTriggerSerializer, SCHEDULED: ScheduleTriggerSerializer, INTEGRATION: IntegrationTriggerSerializer, + CHAT_MESSAGE: ChatMessageTriggerSerializer, }) as unknown as Schema; export declare namespace WorkflowTriggerSerializer { type Raw = | ManualTriggerSerializer.Raw | ScheduleTriggerSerializer.Raw - | IntegrationTriggerSerializer.Raw; + | IntegrationTriggerSerializer.Raw + | ChatMessageTriggerSerializer.Raw; } export const WorkflowRawDataSerializer: ObjectSchema< From 490232daa51fbe717753bf0d81fe823bcc723997 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:25:31 +0000 Subject: [PATCH 05/14] Add serializer test for CHAT_MESSAGE trigger deserialization Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../src/__test__/serializers/vellum.test.ts | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/ee/codegen/src/__test__/serializers/vellum.test.ts b/ee/codegen/src/__test__/serializers/vellum.test.ts index 7e51fe9f85..390ba2f5fe 100644 --- a/ee/codegen/src/__test__/serializers/vellum.test.ts +++ b/ee/codegen/src/__test__/serializers/vellum.test.ts @@ -1,6 +1,35 @@ -import { WorkflowNodeSerializer } from "src/serializers/vellum"; +import { + WorkflowNodeSerializer, + WorkflowTriggerSerializer, +} from "src/serializers/vellum"; describe("vellum", () => { + describe("WorkflowTriggerSerializer", () => { + it("should parse CHAT_MESSAGE trigger", () => { + /** + * Tests that CHAT_MESSAGE triggers are properly deserialized. + * This test will fail if ChatMessageTriggerSerializer is not registered + * in the WorkflowTriggerSerializer union. + */ + + // GIVEN a raw CHAT_MESSAGE trigger from the API + const data = { + id: "chat-message-trigger-id", + type: "CHAT_MESSAGE", + attributes: [{ id: "attr-1", key: "message", type: "JSON" }], + }; + + // WHEN we parse it + const result = WorkflowTriggerSerializer.parse(data); + + // THEN it should succeed and have the correct type + expect(result.ok).toBe(true); + if (result.ok) { + expect(result.value.type).toBe("CHAT_MESSAGE"); + } + }); + }); + describe("PromptNodeSerializer", () => { it("should serialize legacy prompt nodes", () => { const data = { From 538a9658ec82419a4e4fb49b6bbd555490a5e600 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:33:47 +0000 Subject: [PATCH 06/14] Remove if statement from test assertion Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- ee/codegen/src/__test__/serializers/vellum.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ee/codegen/src/__test__/serializers/vellum.test.ts b/ee/codegen/src/__test__/serializers/vellum.test.ts index 390ba2f5fe..851b83198d 100644 --- a/ee/codegen/src/__test__/serializers/vellum.test.ts +++ b/ee/codegen/src/__test__/serializers/vellum.test.ts @@ -24,9 +24,9 @@ describe("vellum", () => { // THEN it should succeed and have the correct type expect(result.ok).toBe(true); - if (result.ok) { - expect(result.value.type).toBe("CHAT_MESSAGE"); - } + expect((result as { ok: true; value: { type: string } }).value.type).toBe( + "CHAT_MESSAGE" + ); }); }); From c3a539ef64b3765fbc847c76041248151ac57c45 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:38:56 +0000 Subject: [PATCH 07/14] Revert serializer test changes Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../src/__test__/serializers/vellum.test.ts | 31 +------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/ee/codegen/src/__test__/serializers/vellum.test.ts b/ee/codegen/src/__test__/serializers/vellum.test.ts index 851b83198d..7e51fe9f85 100644 --- a/ee/codegen/src/__test__/serializers/vellum.test.ts +++ b/ee/codegen/src/__test__/serializers/vellum.test.ts @@ -1,35 +1,6 @@ -import { - WorkflowNodeSerializer, - WorkflowTriggerSerializer, -} from "src/serializers/vellum"; +import { WorkflowNodeSerializer } from "src/serializers/vellum"; describe("vellum", () => { - describe("WorkflowTriggerSerializer", () => { - it("should parse CHAT_MESSAGE trigger", () => { - /** - * Tests that CHAT_MESSAGE triggers are properly deserialized. - * This test will fail if ChatMessageTriggerSerializer is not registered - * in the WorkflowTriggerSerializer union. - */ - - // GIVEN a raw CHAT_MESSAGE trigger from the API - const data = { - id: "chat-message-trigger-id", - type: "CHAT_MESSAGE", - attributes: [{ id: "attr-1", key: "message", type: "JSON" }], - }; - - // WHEN we parse it - const result = WorkflowTriggerSerializer.parse(data); - - // THEN it should succeed and have the correct type - expect(result.ok).toBe(true); - expect((result as { ok: true; value: { type: string } }).value.type).toBe( - "CHAT_MESSAGE" - ); - }); - }); - describe("PromptNodeSerializer", () => { it("should serialize legacy prompt nodes", () => { const data = { From 892b352396d382666fa3d2771bc98594d00831d3 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 23:22:57 +0000 Subject: [PATCH 08/14] Add ChatMessageTrigger codegen with exec_config.output support Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../__snapshots__/generate-code.test.ts.snap | 23 ++++ .../chat-message-trigger.ts | 17 ++- .../triggers/chat-message-trigger.ts | 116 ++++++++++++++++++ ee/codegen/src/project.ts | 7 ++ ee/codegen/src/serializers/vellum.ts | 15 +++ ee/codegen/src/types/vellum.ts | 5 + 6 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 ee/codegen/src/generators/triggers/chat-message-trigger.ts diff --git a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap index f026766166..49f18002bb 100644 --- a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap +++ b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap @@ -38,6 +38,29 @@ class UseApiWithSecret(FinalOutputNode[BaseState, Any]): " `; +exports[`generateCode > should generate code for %1 chat-message-trigger.ts > triggers/chat_message.py 1`] = ` +"from vellum.workflows.references import LazyReference +from vellum.workflows.triggers import ChatMessageTrigger + +from ..nodes.bottom_node import BottomNode + + +class ChatMessage(ChatMessageTrigger): + message: str + + class Config(ChatMessageTrigger.Config): + output = LazyReference(lambda: BottomNode.Outputs.result) + + class Display(ChatMessageTrigger.Display): + label = "Chat Message" + x = 100 + y = 200 + z_index = 1 + icon = "vellum:icon:message" + color = "blue" +" +`; + exports[`generateCode > should generate code for %1 chat-message-trigger.ts > workflow.py 1`] = ` "from vellum.workflows import BaseWorkflow from vellum.workflows.triggers.chat_message import ChatMessageTrigger diff --git a/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts b/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts index 972d8dea54..9d7af743aa 100644 --- a/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts +++ b/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts @@ -61,7 +61,13 @@ export default { type: "DEFAULT", }, ], - outputs: [], + outputs: [ + { + id: "bottom-output-id", + name: "result", + type: "STRING", + }, + ], attributes: [], }, ], @@ -98,6 +104,13 @@ export default { type: "JSON", }, ], + exec_config: { + output: { + type: "NODE_OUTPUT", + node_id: "bottom-node", + node_output_id: "bottom-output-id", + }, + }, display_data: { label: "Chat Message", position: { @@ -110,5 +123,5 @@ export default { }, }, ], - assertions: ["workflow.py"], + assertions: ["workflow.py", "triggers/chat_message.py"], }; diff --git a/ee/codegen/src/generators/triggers/chat-message-trigger.ts b/ee/codegen/src/generators/triggers/chat-message-trigger.ts new file mode 100644 index 0000000000..8126ec2264 --- /dev/null +++ b/ee/codegen/src/generators/triggers/chat-message-trigger.ts @@ -0,0 +1,116 @@ +import { python } from "@fern-api/python-ast"; + +import { OUTPUTS_CLASS_NAME, VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH } from "src/constants"; +import { AccessAttribute } from "src/generators/extensions/access-attribute"; +import { Class } from "src/generators/extensions/class"; +import { ClassInstantiation } from "src/generators/extensions/class-instantiation"; +import { Field } from "src/generators/extensions/field"; +import { MethodArgument } from "src/generators/extensions/method-argument"; +import { Reference } from "src/generators/extensions/reference"; +import { BaseTrigger } from "src/generators/triggers/base-trigger"; +import { createPythonClassName, toPythonSafeSnakeCase } from "src/utils/casing"; + +import type { AstNode } from "src/generators/extensions/ast-node"; +import type { ChatMessageTrigger as ChatMessageTriggerType } from "src/types/vellum"; + +export declare namespace ChatMessageTriggerGenerator { + interface Args { + workflowContext: BaseTrigger.Args["workflowContext"]; + trigger: ChatMessageTriggerType; + } +} + +export class ChatMessageTrigger extends BaseTrigger { + protected generateClassName(): string { + const label = this.trigger.displayData?.label || "ChatMessageTrigger"; + return createPythonClassName(label, { + force: true, + }); + } + + protected getModuleName(): string { + const label = this.trigger.displayData?.label || "chat_message"; + return toPythonSafeSnakeCase(label); + } + + protected getBaseTriggerClassName(): string { + return "ChatMessageTrigger"; + } + + protected getTriggerClassBody(): AstNode[] { + const body: AstNode[] = []; + + // Add attribute fields + body.push(...this.createAttributeFields()); + + // Create Config class if execConfig.output is present + const execConfig = this.trigger.execConfig; + if (execConfig?.output) { + body.push(this.createConfigClass(execConfig.output)); + } + + return body; + } + + private createConfigClass( + output: NonNullable["output"] + ): AstNode { + const configClass = new Class({ + name: "Config", + extends_: [ + new Reference({ + name: "ChatMessageTrigger", + modulePath: VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH, + attribute: ["Config"], + }), + ], + }); + + if (output && output.type === "NODE_OUTPUT") { + const nodeContext = this.workflowContext.findNodeContext(output.nodeId); + + if (nodeContext) { + const nodeOutputName = nodeContext.getNodeOutputNameById( + output.nodeOutputId + ); + + if (nodeOutputName) { + const lazyReferenceValue = new ClassInstantiation({ + classReference: new Reference({ + name: "LazyReference", + modulePath: [ + ...this.workflowContext.sdkModulePathNames.WORKFLOWS_MODULE_PATH, + "references", + ], + }), + arguments_: [ + new MethodArgument({ + value: python.lambda({ + body: new AccessAttribute({ + lhs: new Reference({ + name: nodeContext.nodeClassName, + modulePath: nodeContext.nodeModulePath, + }), + rhs: new Reference({ + name: `${OUTPUTS_CLASS_NAME}.${nodeOutputName}`, + modulePath: [], + }), + }), + }), + }), + ], + }); + + configClass.add( + new Field({ + name: "output", + initializer: lazyReferenceValue, + }) + ); + } + } + } + + return configClass; + } +} diff --git a/ee/codegen/src/project.ts b/ee/codegen/src/project.ts index 943569db22..a4e51b7c30 100644 --- a/ee/codegen/src/project.ts +++ b/ee/codegen/src/project.ts @@ -61,6 +61,7 @@ import { PromptDeploymentNode } from "src/generators/nodes/prompt-deployment-nod import { SearchNode } from "src/generators/nodes/search-node"; import { SubworkflowDeploymentNode } from "src/generators/nodes/subworkflow-deployment-node"; import { TemplatingNode } from "src/generators/nodes/templating-node"; +import { ChatMessageTrigger } from "src/generators/triggers/chat-message-trigger"; import { IntegrationTrigger } from "src/generators/triggers/integration-trigger"; import { ScheduledTrigger } from "src/generators/triggers/scheduled-trigger"; import { WorkflowSandboxFile } from "src/generators/workflow-sandbox-file"; @@ -926,6 +927,12 @@ ${errors.slice(0, 3).map((err) => { trigger, }); triggerPromises.push(scheduledTrigger.persist()); + } else if (trigger.type === "CHAT_MESSAGE" && trigger.execConfig) { + const chatMessageTrigger = new ChatMessageTrigger({ + workflowContext: this.workflowContext, + trigger, + }); + triggerPromises.push(chatMessageTrigger.persist()); } }); diff --git a/ee/codegen/src/serializers/vellum.ts b/ee/codegen/src/serializers/vellum.ts index ca475b0401..e59c9c4a9c 100644 --- a/ee/codegen/src/serializers/vellum.ts +++ b/ee/codegen/src/serializers/vellum.ts @@ -2435,6 +2435,16 @@ export declare namespace IntegrationTriggerSerializer { } } +const ChatMessageTriggerExecConfigSerializer = objectSchema({ + output: WorkflowValueDescriptorSerializer.optional(), +}); + +export declare namespace ChatMessageTriggerExecConfigSerializer { + interface Raw { + output?: WorkflowValueDescriptorSerializer.Raw | null; + } +} + const ChatMessageTriggerSerializer = objectSchema({ id: stringSchema(), attributes: listSchema(VellumVariableSerializer), @@ -2443,6 +2453,10 @@ const ChatMessageTriggerSerializer = objectSchema({ "display_data", WorkflowTriggerDisplayDataSerializer.nullable().optional() ), + execConfig: propertySchema( + "exec_config", + ChatMessageTriggerExecConfigSerializer.optional() + ), }); export declare namespace ChatMessageTriggerSerializer { @@ -2452,6 +2466,7 @@ export declare namespace ChatMessageTriggerSerializer { attributes: VellumVariableSerializer.Raw[]; definition?: CodeResourceDefinitionSerializer.Raw | null; display_data?: WorkflowTriggerDisplayDataSerializer.Raw | null; + exec_config?: ChatMessageTriggerExecConfigSerializer.Raw | null; } } diff --git a/ee/codegen/src/types/vellum.ts b/ee/codegen/src/types/vellum.ts index 3e556d46cf..bd1ead088d 100644 --- a/ee/codegen/src/types/vellum.ts +++ b/ee/codegen/src/types/vellum.ts @@ -850,8 +850,13 @@ export interface IntegrationTrigger extends BaseTrigger { execConfig: IntegrationTriggerExecConfig; } +export interface ChatMessageTriggerExecConfig { + output?: WorkflowValueDescriptor; +} + export interface ChatMessageTrigger extends BaseTrigger { type: WorkflowTriggerType.CHAT_MESSAGE; + execConfig?: ChatMessageTriggerExecConfig; } export type WorkflowTrigger = From be852768f3d19799f9762585ee974aeef02e8962 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 23:26:18 +0000 Subject: [PATCH 09/14] Fix Prettier formatting in chat-message-trigger.ts Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../src/generators/triggers/chat-message-trigger.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ee/codegen/src/generators/triggers/chat-message-trigger.ts b/ee/codegen/src/generators/triggers/chat-message-trigger.ts index 8126ec2264..5a5da99851 100644 --- a/ee/codegen/src/generators/triggers/chat-message-trigger.ts +++ b/ee/codegen/src/generators/triggers/chat-message-trigger.ts @@ -1,6 +1,9 @@ import { python } from "@fern-api/python-ast"; -import { OUTPUTS_CLASS_NAME, VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH } from "src/constants"; +import { + OUTPUTS_CLASS_NAME, + VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH, +} from "src/constants"; import { AccessAttribute } from "src/generators/extensions/access-attribute"; import { Class } from "src/generators/extensions/class"; import { ClassInstantiation } from "src/generators/extensions/class-instantiation"; @@ -79,7 +82,8 @@ export class ChatMessageTrigger extends BaseTrigger { classReference: new Reference({ name: "LazyReference", modulePath: [ - ...this.workflowContext.sdkModulePathNames.WORKFLOWS_MODULE_PATH, + ...this.workflowContext.sdkModulePathNames + .WORKFLOWS_MODULE_PATH, "references", ], }), From 8245f272350333732e294a293af674c5d4aa9f09 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Mon, 22 Dec 2025 23:54:18 +0000 Subject: [PATCH 10/14] Use generated ChatMessageTrigger subclass in workflow graph Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../__snapshots__/generate-code.test.ts.snap | 4 +- .../src/__test__/utils/triggers.test.ts | 2 +- .../trigger-context/chat-message-trigger.ts | 37 +++++++++++++++++++ .../trigger-context/create-trigger-context.ts | 10 +++++ .../src/context/trigger-context/index.ts | 1 + ee/codegen/src/utils/triggers.ts | 12 ++++-- 6 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 ee/codegen/src/context/trigger-context/chat-message-trigger.ts diff --git a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap index 49f18002bb..37d401cd63 100644 --- a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap +++ b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap @@ -63,16 +63,16 @@ class ChatMessage(ChatMessageTrigger): exports[`generateCode > should generate code for %1 chat-message-trigger.ts > workflow.py 1`] = ` "from vellum.workflows import BaseWorkflow -from vellum.workflows.triggers.chat_message import ChatMessageTrigger from .nodes.bottom_node import BottomNode from .nodes.top_node import TopNode +from .triggers.chat_message import ChatMessage class Workflow(BaseWorkflow): graph = { TopNode, - ChatMessageTrigger >> BottomNode, + ChatMessage >> BottomNode, } " `; diff --git a/ee/codegen/src/__test__/utils/triggers.test.ts b/ee/codegen/src/__test__/utils/triggers.test.ts index 28b77f21db..9ac7971e82 100644 --- a/ee/codegen/src/__test__/utils/triggers.test.ts +++ b/ee/codegen/src/__test__/utils/triggers.test.ts @@ -81,7 +81,7 @@ describe("getTriggerClassInfo", () => { expect(result).toEqual({ className: "ChatMessageTrigger", - modulePath: ["vellum", "workflows", "triggers", "chat_message"], + modulePath: ["code", "triggers", "chat_message"], }); }); }); diff --git a/ee/codegen/src/context/trigger-context/chat-message-trigger.ts b/ee/codegen/src/context/trigger-context/chat-message-trigger.ts new file mode 100644 index 0000000000..46ca6095a7 --- /dev/null +++ b/ee/codegen/src/context/trigger-context/chat-message-trigger.ts @@ -0,0 +1,37 @@ +import { GENERATED_TRIGGERS_MODULE_NAME } from "src/constants"; +import { BaseTriggerContext } from "src/context/trigger-context/base"; +import { ChatMessageTrigger } from "src/types/vellum"; +import { createPythonClassName, toPythonSafeSnakeCase } from "src/utils/casing"; + +export class ChatMessageTriggerContext extends BaseTriggerContext { + protected getTriggerModuleInfo(): { + moduleName: string; + className: string; + modulePath: string[]; + } { + const label = this.triggerData.displayData?.label || "chat_message"; + const rawModuleName = toPythonSafeSnakeCase(label); + let moduleName = rawModuleName; + let numRenameAttempts = 0; + while (this.workflowContext.isTriggerModuleNameUsed(moduleName)) { + moduleName = `${rawModuleName}_${numRenameAttempts + 1}`; + numRenameAttempts += 1; + } + const className = createPythonClassName( + this.triggerData.displayData?.label || "ChatMessageTrigger", + { force: true } + ); + + const modulePath = [ + ...this.workflowContext.modulePath.slice(0, -1), + GENERATED_TRIGGERS_MODULE_NAME, + moduleName, + ]; + + return { + moduleName, + className, + modulePath, + }; + } +} diff --git a/ee/codegen/src/context/trigger-context/create-trigger-context.ts b/ee/codegen/src/context/trigger-context/create-trigger-context.ts index ab56ea666d..93ad835256 100644 --- a/ee/codegen/src/context/trigger-context/create-trigger-context.ts +++ b/ee/codegen/src/context/trigger-context/create-trigger-context.ts @@ -1,7 +1,9 @@ import { WorkflowContext } from "src/context"; +import { ChatMessageTriggerContext } from "src/context/trigger-context/chat-message-trigger"; import { IntegrationTriggerContext } from "src/context/trigger-context/integration-trigger"; import { ScheduledTriggerContext } from "src/context/trigger-context/scheduled-trigger"; import { + ChatMessageTrigger, IntegrationTrigger, ScheduledTrigger, WorkflowTrigger, @@ -37,6 +39,14 @@ export function createTriggerContext({ workflowContext.addTriggerContext(triggerContext); break; } + case "CHAT_MESSAGE": { + const triggerContext = new ChatMessageTriggerContext({ + workflowContext, + triggerData: triggerData as ChatMessageTrigger, + }); + workflowContext.addTriggerContext(triggerContext); + break; + } case "MANUAL": // For now, we don't create contexts for MANUAL triggers // as they don't have associated files diff --git a/ee/codegen/src/context/trigger-context/index.ts b/ee/codegen/src/context/trigger-context/index.ts index d96b35ae28..2e5329f410 100644 --- a/ee/codegen/src/context/trigger-context/index.ts +++ b/ee/codegen/src/context/trigger-context/index.ts @@ -1,4 +1,5 @@ export { BaseTriggerContext } from "./base"; +export { ChatMessageTriggerContext } from "./chat-message-trigger"; export { createTriggerContext } from "./create-trigger-context"; export { IntegrationTriggerContext } from "./integration-trigger"; export { ScheduledTriggerContext } from "./scheduled-trigger"; diff --git a/ee/codegen/src/utils/triggers.ts b/ee/codegen/src/utils/triggers.ts index 035588c267..0382e30540 100644 --- a/ee/codegen/src/utils/triggers.ts +++ b/ee/codegen/src/utils/triggers.ts @@ -53,10 +53,16 @@ export function getTriggerClassInfo( toPythonSafeSnakeCase(trigger.execConfig.slug), ], }; - case WorkflowTriggerType.CHAT_MESSAGE: + case WorkflowTriggerType.CHAT_MESSAGE: { + const label = trigger.displayData?.label || "ChatMessageTrigger"; return { - className: "ChatMessageTrigger", - modulePath: [...VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH, "chat_message"], + className: createPythonClassName(label, { force: true }), + modulePath: [ + ...workflowContext.modulePath.slice(0, -1), + GENERATED_TRIGGERS_MODULE_NAME, + toPythonSafeSnakeCase(trigger.displayData?.label || "chat_message"), + ], }; + } } } From e6d843b738d6ec0003738119e298e4021d667db4 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 23 Dec 2025 00:22:20 +0000 Subject: [PATCH 11/14] Handle all WorkflowValueDescriptor types in ChatMessageTrigger and generate triggers without exec_config Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../triggers/chat-message-trigger.ts | 92 +++++++++---------- ee/codegen/src/project.ts | 2 +- 2 files changed, 44 insertions(+), 50 deletions(-) diff --git a/ee/codegen/src/generators/triggers/chat-message-trigger.ts b/ee/codegen/src/generators/triggers/chat-message-trigger.ts index 5a5da99851..d44eafed5e 100644 --- a/ee/codegen/src/generators/triggers/chat-message-trigger.ts +++ b/ee/codegen/src/generators/triggers/chat-message-trigger.ts @@ -1,20 +1,20 @@ import { python } from "@fern-api/python-ast"; -import { - OUTPUTS_CLASS_NAME, - VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH, -} from "src/constants"; -import { AccessAttribute } from "src/generators/extensions/access-attribute"; +import { VELLUM_WORKFLOW_TRIGGERS_MODULE_PATH } from "src/constants"; import { Class } from "src/generators/extensions/class"; import { ClassInstantiation } from "src/generators/extensions/class-instantiation"; import { Field } from "src/generators/extensions/field"; import { MethodArgument } from "src/generators/extensions/method-argument"; import { Reference } from "src/generators/extensions/reference"; import { BaseTrigger } from "src/generators/triggers/base-trigger"; +import { WorkflowValueDescriptor } from "src/generators/workflow-value-descriptor"; import { createPythonClassName, toPythonSafeSnakeCase } from "src/utils/casing"; import type { AstNode } from "src/generators/extensions/ast-node"; -import type { ChatMessageTrigger as ChatMessageTriggerType } from "src/types/vellum"; +import type { + ChatMessageTrigger as ChatMessageTriggerType, + WorkflowValueDescriptor as WorkflowValueDescriptorType, +} from "src/types/vellum"; export declare namespace ChatMessageTriggerGenerator { interface Args { @@ -69,52 +69,46 @@ export class ChatMessageTrigger extends BaseTrigger { ], }); - if (output && output.type === "NODE_OUTPUT") { - const nodeContext = this.workflowContext.findNodeContext(output.nodeId); - - if (nodeContext) { - const nodeOutputName = nodeContext.getNodeOutputNameById( - output.nodeOutputId - ); - - if (nodeOutputName) { - const lazyReferenceValue = new ClassInstantiation({ - classReference: new Reference({ - name: "LazyReference", - modulePath: [ - ...this.workflowContext.sdkModulePathNames - .WORKFLOWS_MODULE_PATH, - "references", - ], - }), - arguments_: [ - new MethodArgument({ - value: python.lambda({ - body: new AccessAttribute({ - lhs: new Reference({ - name: nodeContext.nodeClassName, - modulePath: nodeContext.nodeModulePath, - }), - rhs: new Reference({ - name: `${OUTPUTS_CLASS_NAME}.${nodeOutputName}`, - modulePath: [], - }), - }), - }), - }), - ], - }); - - configClass.add( - new Field({ - name: "output", - initializer: lazyReferenceValue, - }) - ); - } + if (output) { + const outputField = this.createOutputField(output); + if (outputField) { + configClass.add(outputField); } } return configClass; } + + private createOutputField( + output: WorkflowValueDescriptorType + ): AstNode | undefined { + const workflowValueDescriptor = new WorkflowValueDescriptor({ + workflowContext: this.workflowContext, + workflowValueDescriptor: output, + }); + + const lazyReferenceValue = new ClassInstantiation({ + classReference: new Reference({ + name: "LazyReference", + modulePath: [ + ...this.workflowContext.sdkModulePathNames.WORKFLOWS_MODULE_PATH, + "references", + ], + }), + arguments_: [ + new MethodArgument({ + value: python.lambda({ + body: workflowValueDescriptor, + }), + }), + ], + }); + + this.inheritReferences(lazyReferenceValue); + + return new Field({ + name: "output", + initializer: lazyReferenceValue, + }); + } } diff --git a/ee/codegen/src/project.ts b/ee/codegen/src/project.ts index a4e51b7c30..4d3374da3a 100644 --- a/ee/codegen/src/project.ts +++ b/ee/codegen/src/project.ts @@ -927,7 +927,7 @@ ${errors.slice(0, 3).map((err) => { trigger, }); triggerPromises.push(scheduledTrigger.persist()); - } else if (trigger.type === "CHAT_MESSAGE" && trigger.execConfig) { + } else if (trigger.type === "CHAT_MESSAGE") { const chatMessageTrigger = new ChatMessageTrigger({ workflowContext: this.workflowContext, trigger, From 09f191efb6988adaade04cf08917993abc3ad21b Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 23 Dec 2025 22:20:55 +0000 Subject: [PATCH 12/14] Remove entrypoint node from chat-message-trigger test fixture Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../chat-message-trigger.ts | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts b/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts index 9d7af743aa..b8ec80a1b3 100644 --- a/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts +++ b/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts @@ -1,15 +1,6 @@ export default { workflow_raw_data: { nodes: [ - { - id: "entrypoint-node", - type: "ENTRYPOINT", - data: { - label: "Entrypoint", - source_handle_id: "entrypoint-source", - }, - inputs: [], - }, { id: "top-node", type: "GENERIC", @@ -72,14 +63,6 @@ export default { }, ], edges: [ - { - id: "edge-1", - source_node_id: "entrypoint-node", - source_handle_id: "entrypoint-source", - target_node_id: "top-node", - target_handle_id: "top-target", - type: "DEFAULT", - }, { id: "edge-2", source_node_id: "chat-message-trigger", From a6f4e3ac443fec28d0fe49f0901064fce74adb03 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 23 Dec 2025 22:26:32 +0000 Subject: [PATCH 13/14] Update snapshot for chat-message-trigger test after removing entrypoint node Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../src/__test__/__snapshots__/generate-code.test.ts.snap | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap index 37d401cd63..21d08a1806 100644 --- a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap +++ b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap @@ -70,10 +70,8 @@ from .triggers.chat_message import ChatMessage class Workflow(BaseWorkflow): - graph = { - TopNode, - ChatMessage >> BottomNode, - } + graph = ChatMessage >> BottomNode + unused_graphs = {TopNode} " `; From 6b4fc2b248a74afbea1e413d9c84fc802572d976 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 23 Dec 2025 22:49:50 +0000 Subject: [PATCH 14/14] Remove top node and rename bottom node to some node in chat-message-trigger test Co-Authored-By: vincent@vellum.ai <0426vincent@gmail.com> --- .../__snapshots__/generate-code.test.ts.snap | 10 ++-- .../chat-message-trigger.ts | 49 +++++-------------- 2 files changed, 15 insertions(+), 44 deletions(-) diff --git a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap index 21d08a1806..4130126e51 100644 --- a/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap +++ b/ee/codegen/src/__test__/__snapshots__/generate-code.test.ts.snap @@ -42,14 +42,14 @@ exports[`generateCode > should generate code for %1 chat-message-trigger.ts > tr "from vellum.workflows.references import LazyReference from vellum.workflows.triggers import ChatMessageTrigger -from ..nodes.bottom_node import BottomNode +from ..nodes.some_node import SomeNode class ChatMessage(ChatMessageTrigger): message: str class Config(ChatMessageTrigger.Config): - output = LazyReference(lambda: BottomNode.Outputs.result) + output = LazyReference(lambda: SomeNode.Outputs.result) class Display(ChatMessageTrigger.Display): label = "Chat Message" @@ -64,14 +64,12 @@ class ChatMessage(ChatMessageTrigger): exports[`generateCode > should generate code for %1 chat-message-trigger.ts > workflow.py 1`] = ` "from vellum.workflows import BaseWorkflow -from .nodes.bottom_node import BottomNode -from .nodes.top_node import TopNode +from .nodes.some_node import SomeNode from .triggers.chat_message import ChatMessage class Workflow(BaseWorkflow): - graph = ChatMessage >> BottomNode - unused_graphs = {TopNode} + graph = ChatMessage >> SomeNode " `; diff --git a/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts b/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts index b8ec80a1b3..e30be59c88 100644 --- a/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts +++ b/ee/codegen/src/__test__/generate-code-fixtures/chat-message-trigger.ts @@ -2,59 +2,32 @@ export default { workflow_raw_data: { nodes: [ { - id: "top-node", + id: "some-node", type: "GENERIC", - label: "Top Node", + label: "Some Node", display_data: null, base: { name: "BaseNode", module: ["vellum", "workflows", "nodes", "bases", "base"], }, definition: { - name: "TopNode", - module: ["testing", "nodes", "top_node"], + name: "SomeNode", + module: ["testing", "nodes", "some_node"], }, trigger: { - id: "top-target", + id: "some-target", merge_behavior: "AWAIT_ATTRIBUTES", }, ports: [ { - id: "top-default-port-id", - name: "default", - type: "DEFAULT", - }, - ], - outputs: [], - attributes: [], - }, - { - id: "bottom-node", - type: "GENERIC", - label: "Bottom Node", - display_data: null, - base: { - name: "BaseNode", - module: ["vellum", "workflows", "nodes", "bases", "base"], - }, - definition: { - name: "BottomNode", - module: ["testing", "nodes", "bottom_node"], - }, - trigger: { - id: "bottom-target", - merge_behavior: "AWAIT_ATTRIBUTES", - }, - ports: [ - { - id: "bottom-default-port-id", + id: "some-default-port-id", name: "default", type: "DEFAULT", }, ], outputs: [ { - id: "bottom-output-id", + id: "some-output-id", name: "result", type: "STRING", }, @@ -67,8 +40,8 @@ export default { id: "edge-2", source_node_id: "chat-message-trigger", source_handle_id: "chat-message-trigger", - target_node_id: "bottom-node", - target_handle_id: "bottom-target", + target_node_id: "some-node", + target_handle_id: "some-target", type: "DEFAULT", }, ], @@ -90,8 +63,8 @@ export default { exec_config: { output: { type: "NODE_OUTPUT", - node_id: "bottom-node", - node_output_id: "bottom-output-id", + node_id: "some-node", + node_output_id: "some-output-id", }, }, display_data: {