Skip to content

Commit 3f1d98f

Browse files
Support async onTriggeredRun callbacks in chat transport
Co-authored-by: Eric Allam <eric@trigger.dev>
1 parent df877ee commit 3f1d98f

File tree

6 files changed

+20
-4
lines changed

6 files changed

+20
-4
lines changed

packages/ai/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ class MemoryStore implements TriggerChatRunStore {
116116
}
117117
```
118118

119+
`onTriggeredRun` can also be async, which is useful for persisting run IDs before
120+
the chat stream is consumed.
121+
119122
## `ai.tool(...)` example
120123

121124
```ts

packages/ai/src/chatTransport.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,7 @@ describe("TriggerChatTransport", function () {
628628

629629
it("supports creating transport with factory function", async function () {
630630
let observedRunId: string | undefined;
631+
let callbackCompleted = false;
631632

632633
const server = await startServer(function (req, res) {
633634
if (req.method === "POST" && req.url === "/api/v1/tasks/chat-task/trigger") {
@@ -666,8 +667,10 @@ describe("TriggerChatTransport", function () {
666667
stream: "chat-stream",
667668
accessToken: "pk_trigger",
668669
baseURL: server.url,
669-
onTriggeredRun: function onTriggeredRun(state) {
670+
onTriggeredRun: async function onTriggeredRun(state) {
671+
await sleep(1);
670672
observedRunId = state.runId;
673+
callbackCompleted = true;
671674
},
672675
});
673676

@@ -682,6 +685,7 @@ describe("TriggerChatTransport", function () {
682685
const chunks = await readChunks(stream);
683686
expect(chunks).toHaveLength(2);
684687
expect(observedRunId).toBe("run_factory");
688+
expect(callbackCompleted).toBe(true);
685689
});
686690

687691
it("cleans run store state when stream completes", async function () {

packages/ai/src/chatTransport.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
UIMessageChunk,
1616
} from "ai";
1717
import type {
18+
TriggerChatOnTriggeredRun,
1819
TriggerChatPayloadMapper,
1920
TriggerChatRunState,
2021
TriggerChatRunStore,
@@ -75,7 +76,7 @@ type TriggerChatTransportCommonOptions<
7576
| TriggerOptions
7677
| TriggerChatTriggerOptionsResolver<UI_MESSAGE>;
7778
runStore?: TriggerChatRunStore;
78-
onTriggeredRun?: (state: TriggerChatRunState) => void;
79+
onTriggeredRun?: TriggerChatOnTriggeredRun;
7980
};
8081

8182
type TriggerChatTransportMapperRequirement<
@@ -129,7 +130,7 @@ export class TriggerChatTransport<
129130
private readonly baseURL: string;
130131
private readonly previewBranch: string | undefined;
131132
private readonly requestOptions: ApiRequestOptions | undefined;
132-
private readonly onTriggeredRun: ((state: TriggerChatRunState) => void) | undefined;
133+
private readonly onTriggeredRun: TriggerChatOnTriggeredRun | undefined;
133134

134135
constructor(options: TriggerChatTransportOptions<UI_MESSAGE, PAYLOAD>) {
135136
this.task = options.task;
@@ -179,7 +180,7 @@ export class TriggerChatTransport<
179180
await this.runStore.set(runState);
180181

181182
if (this.onTriggeredRun) {
182-
this.onTriggeredRun(runState);
183+
await this.onTriggeredRun(runState);
183184
}
184185

185186
const stream = await this.fetchRunStream(runState, options.abortSignal);

packages/ai/src/chatTransport.types.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ it("accepts async payload mappers and trigger option resolvers", function () {
8181
queue: `queue-${request.chatId}`,
8282
};
8383
},
84+
onTriggeredRun: async function onTriggeredRun(_state) {
85+
return;
86+
},
8487
};
8588

8689
expectTypeOf(options).toBeObject();

packages/ai/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export {
77
} from "./chatTransport.js";
88
export type {
99
TriggerChatPayloadMapper,
10+
TriggerChatOnTriggeredRun,
1011
TriggerChatRunState,
1112
TriggerChatRunStore,
1213
TriggerChatStream,

packages/ai/src/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ export type TriggerChatTriggerOptionsResolver<
6161
request: TriggerChatTransportRequest<UI_MESSAGE>
6262
) => MaybePromise<TriggerOptions | undefined>;
6363

64+
export type TriggerChatOnTriggeredRun = (
65+
state: TriggerChatRunState
66+
) => MaybePromise<void>;
67+
6468
export type TriggerChatStream<
6569
UI_MESSAGE extends UIMessage = UIMessage,
6670
> =

0 commit comments

Comments
 (0)