Skip to content

Commit 8188ea3

Browse files
authored
Merge pull request #42 from pattern-tech/feat/new-events
chore: support new streaming events
2 parents 48e79f2 + a8a28e6 commit 8188ea3

File tree

2 files changed

+49
-19
lines changed

2 files changed

+49
-19
lines changed

lib/ai/pattern-model.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ import type {
1313

1414
const textDecoder = new TextDecoder();
1515

16+
const SUPPORTED_EVENT_TYPES = [
17+
'token',
18+
'tool_start',
19+
'tool_end',
20+
'heartbeat',
21+
'agent_start',
22+
'agent_finish',
23+
'tool_selection_start',
24+
'tool_selection_end',
25+
] as const;
26+
1627
export class PatternModel implements LanguageModelV1 {
1728
readonly modelId = 'pattern-model';
1829
readonly provider = 'pattern';
@@ -61,7 +72,7 @@ export class PatternModel implements LanguageModelV1 {
6172
* @returns Reasoning text for a tool start event
6273
*/
6374
private getToolStartReasoningText(event: ToolStartEvent) {
64-
return `#### Tool call - ${event.tool}\n${Object.entries(event.tool_input ?? {}).map((entry) => `* **${entry[0]}**: ${entry[1]}\n`)}`;
75+
return `#### Tool call - ${event.tool_name}\n${Object.entries(JSON.parse(event.params)).map((entry) => `* **${entry[0]}**: ${entry[1]}\n`)}`;
6576
}
6677

6778
/**
@@ -89,20 +100,11 @@ export class PatternModel implements LanguageModelV1 {
89100
type: 'text-delta',
90101
textDelta: event.data,
91102
});
92-
} else if (event.type === 'tool_start') {
103+
} else if (SUPPORTED_EVENT_TYPES.includes(event.type)) {
93104
/**
94105
* TODO: Re-enable reasoning when backend supports it
95106
* https://github.com/pattern-tech/pattern-app/issues/27
96107
*/
97-
} else if (
98-
event.type === 'completion' ||
99-
event.type === 'heartbeat'
100-
) {
101-
/**
102-
* Ignore heartbeat and completion events. Completion event is
103-
* identified automatically when the stream is ended, and the
104-
* heartbeat event is only for keeping the connection alive
105-
*/
106108
} else {
107109
controller.enqueue({
108110
type: 'error',

lib/ai/types.ts

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,53 @@ export interface TokenEvent {
55

66
export interface ToolStartEvent {
77
type: 'tool_start';
8-
tool: string;
9-
tool_input: Record<string, string>;
8+
tool_name: string;
9+
params: string;
10+
timestamp: string;
1011
}
1112

12-
export interface CompletionEvent {
13-
type: 'completion';
14-
data: 'Stream completed';
13+
export interface ToolEndEvent {
14+
type: 'tool_end';
15+
tool_name: string;
16+
output: any;
17+
timestamp: string;
1518
}
1619

1720
export interface HeartbeatEvent {
1821
type: 'heartbeat';
19-
data: 'still_processing';
22+
data: 'processing_started' | 'still_processing';
23+
}
24+
25+
export interface AgentStartEvent {
26+
type: 'agent_start';
27+
timestamp: string;
28+
}
29+
30+
export interface AgentFinishEvent {
31+
type: 'agent_finish';
32+
timestamp: string;
33+
}
34+
35+
export interface ToolSelectionStartEvent {
36+
type: 'tool_selection_start';
37+
timestamp: string;
38+
}
39+
40+
export interface ToolSelectionEndEvent {
41+
type: 'tool_selection_end';
42+
selected_tools: string[];
43+
timestamp: string;
2044
}
2145

2246
export type PatternStreamingResponseEvent =
2347
| TokenEvent
2448
| ToolStartEvent
25-
| CompletionEvent
26-
| HeartbeatEvent;
49+
| ToolEndEvent
50+
| HeartbeatEvent
51+
| AgentStartEvent
52+
| AgentFinishEvent
53+
| ToolSelectionStartEvent
54+
| ToolSelectionEndEvent;
2755

2856
export interface PatternProviderMetadata {
2957
accessToken: string;

0 commit comments

Comments
 (0)