Skip to content

Commit 7d27d28

Browse files
feat(assistants): add support for streaming (#714)
See the reference docs for more information: https://platform.openai.com/docs/api-reference/assistants-streaming We've also improved some of the names for the types in the assistants beta, non exhaustive list: - `CodeToolCall` -> `CodeInterpreterToolCall` - `MessageContentImageFile` -> `ImageFileContentBlock` - `MessageContentText` -> `TextContentBlock` - `ThreadMessage` -> `Message` - `ThreadMessageDeleted` -> `MessageDeleted`
1 parent beea0c7 commit 7d27d28

File tree

25 files changed

+3155
-279
lines changed

25 files changed

+3155
-279
lines changed

api.md

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
Types:
44

5+
- <code><a href="./src/resources/shared.ts">ErrorObject</a></code>
56
- <code><a href="./src/resources/shared.ts">FunctionDefinition</a></code>
67
- <code><a href="./src/resources/shared.ts">FunctionParameters</a></code>
78

@@ -177,6 +178,15 @@ Types:
177178

178179
- <code><a href="./src/resources/beta/assistants/assistants.ts">Assistant</a></code>
179180
- <code><a href="./src/resources/beta/assistants/assistants.ts">AssistantDeleted</a></code>
181+
- <code><a href="./src/resources/beta/assistants/assistants.ts">AssistantStreamEvent</a></code>
182+
- <code><a href="./src/resources/beta/assistants/assistants.ts">AssistantTool</a></code>
183+
- <code><a href="./src/resources/beta/assistants/assistants.ts">CodeInterpreterTool</a></code>
184+
- <code><a href="./src/resources/beta/assistants/assistants.ts">FunctionTool</a></code>
185+
- <code><a href="./src/resources/beta/assistants/assistants.ts">MessageStreamEvent</a></code>
186+
- <code><a href="./src/resources/beta/assistants/assistants.ts">RetrievalTool</a></code>
187+
- <code><a href="./src/resources/beta/assistants/assistants.ts">RunStepStreamEvent</a></code>
188+
- <code><a href="./src/resources/beta/assistants/assistants.ts">RunStreamEvent</a></code>
189+
- <code><a href="./src/resources/beta/assistants/assistants.ts">ThreadStreamEvent</a></code>
180190

181191
Methods:
182192

@@ -214,6 +224,7 @@ Methods:
214224
- <code title="post /threads/{thread_id}">client.beta.threads.<a href="./src/resources/beta/threads/threads.ts">update</a>(threadId, { ...params }) -> Thread</code>
215225
- <code title="delete /threads/{thread_id}">client.beta.threads.<a href="./src/resources/beta/threads/threads.ts">del</a>(threadId) -> ThreadDeleted</code>
216226
- <code title="post /threads/runs">client.beta.threads.<a href="./src/resources/beta/threads/threads.ts">createAndRun</a>({ ...params }) -> Run</code>
227+
- <code>client.beta.threads.<a href="./src/resources/beta/threads/threads.ts">createAndRunStream</a>(body, options?) -> AssistantStream</code>
217228

218229
### Runs
219230

@@ -231,16 +242,29 @@ Methods:
231242
- <code title="get /threads/{thread_id}/runs">client.beta.threads.runs.<a href="./src/resources/beta/threads/runs/runs.ts">list</a>(threadId, { ...params }) -> RunsPage</code>
232243
- <code title="post /threads/{thread_id}/runs/{run_id}/cancel">client.beta.threads.runs.<a href="./src/resources/beta/threads/runs/runs.ts">cancel</a>(threadId, runId) -> Run</code>
233244
- <code title="post /threads/{thread_id}/runs/{run_id}/submit_tool_outputs">client.beta.threads.runs.<a href="./src/resources/beta/threads/runs/runs.ts">submitToolOutputs</a>(threadId, runId, { ...params }) -> Run</code>
245+
- <code>client.beta.threads.runs.<a href="./src/resources/beta/threads/runs/runs.ts">createAndStream</a>(threadId, body, options?) -> AssistantStream</code>
246+
- <code>client.beta.threads.runs.<a href="./src/resources/beta/threads/runs/runs.ts">submitToolOutputsStream</a>(threadId, runId, body, options?) -> AssistantStream</code>
234247

235248
#### Steps
236249

237250
Types:
238251

239-
- <code><a href="./src/resources/beta/threads/runs/steps.ts">CodeToolCall</a></code>
252+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">CodeInterpreterLogs</a></code>
253+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">CodeInterpreterOutputImage</a></code>
254+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">CodeInterpreterToolCall</a></code>
255+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">CodeInterpreterToolCallDelta</a></code>
240256
- <code><a href="./src/resources/beta/threads/runs/steps.ts">FunctionToolCall</a></code>
257+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">FunctionToolCallDelta</a></code>
241258
- <code><a href="./src/resources/beta/threads/runs/steps.ts">MessageCreationStepDetails</a></code>
242259
- <code><a href="./src/resources/beta/threads/runs/steps.ts">RetrievalToolCall</a></code>
260+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">RetrievalToolCallDelta</a></code>
243261
- <code><a href="./src/resources/beta/threads/runs/steps.ts">RunStep</a></code>
262+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">RunStepDelta</a></code>
263+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">RunStepDeltaEvent</a></code>
264+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">RunStepDeltaMessageDelta</a></code>
265+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">ToolCall</a></code>
266+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">ToolCallDelta</a></code>
267+
- <code><a href="./src/resources/beta/threads/runs/steps.ts">ToolCallDeltaObject</a></code>
244268
- <code><a href="./src/resources/beta/threads/runs/steps.ts">ToolCallsStepDetails</a></code>
245269

246270
Methods:
@@ -252,17 +276,33 @@ Methods:
252276

253277
Types:
254278

255-
- <code><a href="./src/resources/beta/threads/messages/messages.ts">MessageContentImageFile</a></code>
256-
- <code><a href="./src/resources/beta/threads/messages/messages.ts">MessageContentText</a></code>
257-
- <code><a href="./src/resources/beta/threads/messages/messages.ts">ThreadMessage</a></code>
258-
- <code><a href="./src/resources/beta/threads/messages/messages.ts">ThreadMessageDeleted</a></code>
279+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">Annotation</a></code>
280+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">AnnotationDelta</a></code>
281+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">FileCitationAnnotation</a></code>
282+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">FileCitationDeltaAnnotation</a></code>
283+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">FilePathAnnotation</a></code>
284+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">FilePathDeltaAnnotation</a></code>
285+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">ImageFile</a></code>
286+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">ImageFileContentBlock</a></code>
287+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">ImageFileDelta</a></code>
288+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">ImageFileDeltaBlock</a></code>
289+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">Message</a></code>
290+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">MessageContent</a></code>
291+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">MessageContentDelta</a></code>
292+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">MessageDeleted</a></code>
293+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">MessageDelta</a></code>
294+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">MessageDeltaEvent</a></code>
295+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">Text</a></code>
296+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">TextContentBlock</a></code>
297+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">TextDelta</a></code>
298+
- <code><a href="./src/resources/beta/threads/messages/messages.ts">TextDeltaBlock</a></code>
259299

260300
Methods:
261301

262-
- <code title="post /threads/{thread_id}/messages">client.beta.threads.messages.<a href="./src/resources/beta/threads/messages/messages.ts">create</a>(threadId, { ...params }) -> ThreadMessage</code>
263-
- <code title="get /threads/{thread_id}/messages/{message_id}">client.beta.threads.messages.<a href="./src/resources/beta/threads/messages/messages.ts">retrieve</a>(threadId, messageId) -> ThreadMessage</code>
264-
- <code title="post /threads/{thread_id}/messages/{message_id}">client.beta.threads.messages.<a href="./src/resources/beta/threads/messages/messages.ts">update</a>(threadId, messageId, { ...params }) -> ThreadMessage</code>
265-
- <code title="get /threads/{thread_id}/messages">client.beta.threads.messages.<a href="./src/resources/beta/threads/messages/messages.ts">list</a>(threadId, { ...params }) -> ThreadMessagesPage</code>
302+
- <code title="post /threads/{thread_id}/messages">client.beta.threads.messages.<a href="./src/resources/beta/threads/messages/messages.ts">create</a>(threadId, { ...params }) -> Message</code>
303+
- <code title="get /threads/{thread_id}/messages/{message_id}">client.beta.threads.messages.<a href="./src/resources/beta/threads/messages/messages.ts">retrieve</a>(threadId, messageId) -> Message</code>
304+
- <code title="post /threads/{thread_id}/messages/{message_id}">client.beta.threads.messages.<a href="./src/resources/beta/threads/messages/messages.ts">update</a>(threadId, messageId, { ...params }) -> Message</code>
305+
- <code title="get /threads/{thread_id}/messages">client.beta.threads.messages.<a href="./src/resources/beta/threads/messages/messages.ts">list</a>(threadId, { ...params }) -> MessagesPage</code>
266306

267307
#### Files
268308

examples/assistant-stream-raw.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import OpenAI from 'openai';
2+
3+
const openai = new OpenAI();
4+
5+
async function main() {
6+
const assistant = await openai.beta.assistants.create({
7+
model: 'gpt-4-1106-preview',
8+
name: 'Math Tutor',
9+
instructions: 'You are a personal math tutor. Write and run code to answer math questions.',
10+
});
11+
12+
const thread = await openai.beta.threads.create({
13+
messages: [
14+
{
15+
role: 'user',
16+
content: '"I need to solve the equation `3x + 11 = 14`. Can you help me?"',
17+
},
18+
],
19+
});
20+
21+
const stream = await openai.beta.threads.runs.create(thread.id, {
22+
assistant_id: assistant.id,
23+
additional_instructions: 'Please address the user as Jane Doe. The user has a premium account.',
24+
stream: true,
25+
});
26+
27+
for await (const event of stream) {
28+
if (event.event === 'thread.message.delta') {
29+
const chunk = event.data.delta.content?.[0];
30+
if (chunk && 'text' in chunk) {
31+
process.stdout.write(chunk.text.value);
32+
}
33+
}
34+
}
35+
36+
console.log();
37+
}
38+
39+
main();

examples/assistant-stream.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/usr/bin/env -S npm run tsn -T
2+
3+
import OpenAI from 'openai';
4+
5+
/**
6+
* Example of streaming a response from an assistant
7+
*/
8+
9+
const openai = new OpenAI();
10+
11+
async function main() {
12+
const assistant = await openai.beta.assistants.create({
13+
model: 'gpt-4-1106-preview',
14+
name: 'Math Tutor',
15+
instructions: 'You are a personal math tutor. Write and run code to answer math questions.',
16+
});
17+
18+
let assistantId = assistant.id;
19+
console.log('Created Assistant with Id: ' + assistantId);
20+
21+
const thread = await openai.beta.threads.create({
22+
messages: [
23+
{
24+
role: 'user',
25+
content: '"I need to solve the equation `3x + 11 = 14`. Can you help me?"',
26+
},
27+
],
28+
});
29+
30+
let threadId = thread.id;
31+
console.log('Created thread with Id: ' + threadId);
32+
33+
const run = openai.beta.threads.runs
34+
.createAndStream(threadId, {
35+
assistant_id: assistantId,
36+
})
37+
//Subscribe to streaming events and log them
38+
.on('event', (event) => console.log(event))
39+
.on('textDelta', (delta, snapshot) => console.log(snapshot))
40+
.on('messageDelta', (delta, snapshot) => console.log(snapshot))
41+
.on('run', (run) => console.log(run))
42+
.on('messageDelta', (delta, snapshot) => console.log(snapshot))
43+
.on('connect', () => console.log());
44+
const result = await run.finalRun();
45+
console.log('Run Result' + result);
46+
}
47+
48+
main();

examples/assistants.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#!/usr/bin/env -S npm run tsn -T
2+
3+
import OpenAI from 'openai';
4+
import { sleep } from 'openai/core';
5+
6+
/**
7+
* Example of polling for a complete response from an assistant
8+
*/
9+
10+
const openai = new OpenAI();
11+
12+
async function main() {
13+
const assistant = await openai.beta.assistants.create({
14+
model: 'gpt-4-1106-preview',
15+
name: 'Math Tutor',
16+
instructions: 'You are a personal math tutor. Write and run code to answer math questions.',
17+
// tools = [],
18+
});
19+
20+
let assistantId = assistant.id;
21+
console.log('Created Assistant with Id: ' + assistantId);
22+
23+
const thread = await openai.beta.threads.create({
24+
messages: [
25+
{
26+
role: 'user',
27+
content: '"I need to solve the equation `3x + 11 = 14`. Can you help me?"',
28+
},
29+
],
30+
});
31+
32+
let threadId = thread.id;
33+
console.log('Created thread with Id: ' + threadId);
34+
35+
const run = await openai.beta.threads.runs.create(thread.id, {
36+
assistant_id: assistantId,
37+
additional_instructions: 'Please address the user as Jane Doe. The user has a premium account.',
38+
});
39+
40+
console.log('Created run with Id: ' + run.id);
41+
42+
while (true) {
43+
const result = await openai.beta.threads.runs.retrieve(thread.id, run.id);
44+
if (result.status == 'completed') {
45+
const messages = await openai.beta.threads.messages.list(thread.id);
46+
for (const message of messages.getPaginatedItems()) {
47+
console.log(message);
48+
}
49+
break;
50+
} else {
51+
console.log('Waiting for completion. Current status: ' + result.status);
52+
await sleep(5000);
53+
}
54+
}
55+
}
56+
57+
main();

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ export namespace OpenAI {
285285

286286
export import Beta = API.Beta;
287287

288+
export import ErrorObject = API.ErrorObject;
288289
export import FunctionDefinition = API.FunctionDefinition;
289290
export import FunctionParameters = API.FunctionParameters;
290291
}

0 commit comments

Comments
 (0)