AssistantStream.mjs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558
  1. var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
  2. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
  3. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
  4. return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
  5. };
  6. var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
  7. if (kind === "m") throw new TypeError("Private method is not writable");
  8. if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
  9. if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
  10. return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
  11. };
  12. var _AssistantStream_instances, _AssistantStream_events, _AssistantStream_runStepSnapshots, _AssistantStream_messageSnapshots, _AssistantStream_messageSnapshot, _AssistantStream_finalRun, _AssistantStream_currentContentIndex, _AssistantStream_currentContent, _AssistantStream_currentToolCallIndex, _AssistantStream_currentToolCall, _AssistantStream_currentEvent, _AssistantStream_currentRunSnapshot, _AssistantStream_currentRunStepSnapshot, _AssistantStream_addEvent, _AssistantStream_endRequest, _AssistantStream_handleMessage, _AssistantStream_handleRunStep, _AssistantStream_handleEvent, _AssistantStream_accumulateRunStep, _AssistantStream_accumulateMessage, _AssistantStream_accumulateContent, _AssistantStream_handleRun;
  13. import * as Core from "../core.mjs";
  14. import { Stream } from "../streaming.mjs";
  15. import { APIUserAbortError, OpenAIError } from "../error.mjs";
  16. import { EventStream } from "./EventStream.mjs";
  17. export class AssistantStream extends EventStream {
  18. constructor() {
  19. super(...arguments);
  20. _AssistantStream_instances.add(this);
  21. //Track all events in a single list for reference
  22. _AssistantStream_events.set(this, []);
  23. //Used to accumulate deltas
  24. //We are accumulating many types so the value here is not strict
  25. _AssistantStream_runStepSnapshots.set(this, {});
  26. _AssistantStream_messageSnapshots.set(this, {});
  27. _AssistantStream_messageSnapshot.set(this, void 0);
  28. _AssistantStream_finalRun.set(this, void 0);
  29. _AssistantStream_currentContentIndex.set(this, void 0);
  30. _AssistantStream_currentContent.set(this, void 0);
  31. _AssistantStream_currentToolCallIndex.set(this, void 0);
  32. _AssistantStream_currentToolCall.set(this, void 0);
  33. //For current snapshot methods
  34. _AssistantStream_currentEvent.set(this, void 0);
  35. _AssistantStream_currentRunSnapshot.set(this, void 0);
  36. _AssistantStream_currentRunStepSnapshot.set(this, void 0);
  37. }
  38. [(_AssistantStream_events = new WeakMap(), _AssistantStream_runStepSnapshots = new WeakMap(), _AssistantStream_messageSnapshots = new WeakMap(), _AssistantStream_messageSnapshot = new WeakMap(), _AssistantStream_finalRun = new WeakMap(), _AssistantStream_currentContentIndex = new WeakMap(), _AssistantStream_currentContent = new WeakMap(), _AssistantStream_currentToolCallIndex = new WeakMap(), _AssistantStream_currentToolCall = new WeakMap(), _AssistantStream_currentEvent = new WeakMap(), _AssistantStream_currentRunSnapshot = new WeakMap(), _AssistantStream_currentRunStepSnapshot = new WeakMap(), _AssistantStream_instances = new WeakSet(), Symbol.asyncIterator)]() {
  39. const pushQueue = [];
  40. const readQueue = [];
  41. let done = false;
  42. //Catch all for passing along all events
  43. this.on('event', (event) => {
  44. const reader = readQueue.shift();
  45. if (reader) {
  46. reader.resolve(event);
  47. }
  48. else {
  49. pushQueue.push(event);
  50. }
  51. });
  52. this.on('end', () => {
  53. done = true;
  54. for (const reader of readQueue) {
  55. reader.resolve(undefined);
  56. }
  57. readQueue.length = 0;
  58. });
  59. this.on('abort', (err) => {
  60. done = true;
  61. for (const reader of readQueue) {
  62. reader.reject(err);
  63. }
  64. readQueue.length = 0;
  65. });
  66. this.on('error', (err) => {
  67. done = true;
  68. for (const reader of readQueue) {
  69. reader.reject(err);
  70. }
  71. readQueue.length = 0;
  72. });
  73. return {
  74. next: async () => {
  75. if (!pushQueue.length) {
  76. if (done) {
  77. return { value: undefined, done: true };
  78. }
  79. return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true }));
  80. }
  81. const chunk = pushQueue.shift();
  82. return { value: chunk, done: false };
  83. },
  84. return: async () => {
  85. this.abort();
  86. return { value: undefined, done: true };
  87. },
  88. };
  89. }
  90. static fromReadableStream(stream) {
  91. const runner = new AssistantStream();
  92. runner._run(() => runner._fromReadableStream(stream));
  93. return runner;
  94. }
  95. async _fromReadableStream(readableStream, options) {
  96. const signal = options?.signal;
  97. if (signal) {
  98. if (signal.aborted)
  99. this.controller.abort();
  100. signal.addEventListener('abort', () => this.controller.abort());
  101. }
  102. this._connected();
  103. const stream = Stream.fromReadableStream(readableStream, this.controller);
  104. for await (const event of stream) {
  105. __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event);
  106. }
  107. if (stream.controller.signal?.aborted) {
  108. throw new APIUserAbortError();
  109. }
  110. return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this));
  111. }
  112. toReadableStream() {
  113. const stream = new Stream(this[Symbol.asyncIterator].bind(this), this.controller);
  114. return stream.toReadableStream();
  115. }
  116. static createToolAssistantStream(threadId, runId, runs, params, options) {
  117. const runner = new AssistantStream();
  118. runner._run(() => runner._runToolAssistantStream(threadId, runId, runs, params, {
  119. ...options,
  120. headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },
  121. }));
  122. return runner;
  123. }
  124. async _createToolAssistantStream(run, threadId, runId, params, options) {
  125. const signal = options?.signal;
  126. if (signal) {
  127. if (signal.aborted)
  128. this.controller.abort();
  129. signal.addEventListener('abort', () => this.controller.abort());
  130. }
  131. const body = { ...params, stream: true };
  132. const stream = await run.submitToolOutputs(threadId, runId, body, {
  133. ...options,
  134. signal: this.controller.signal,
  135. });
  136. this._connected();
  137. for await (const event of stream) {
  138. __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event);
  139. }
  140. if (stream.controller.signal?.aborted) {
  141. throw new APIUserAbortError();
  142. }
  143. return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this));
  144. }
  145. static createThreadAssistantStream(params, thread, options) {
  146. const runner = new AssistantStream();
  147. runner._run(() => runner._threadAssistantStream(params, thread, {
  148. ...options,
  149. headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },
  150. }));
  151. return runner;
  152. }
  153. static createAssistantStream(threadId, runs, params, options) {
  154. const runner = new AssistantStream();
  155. runner._run(() => runner._runAssistantStream(threadId, runs, params, {
  156. ...options,
  157. headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' },
  158. }));
  159. return runner;
  160. }
  161. currentEvent() {
  162. return __classPrivateFieldGet(this, _AssistantStream_currentEvent, "f");
  163. }
  164. currentRun() {
  165. return __classPrivateFieldGet(this, _AssistantStream_currentRunSnapshot, "f");
  166. }
  167. currentMessageSnapshot() {
  168. return __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f");
  169. }
  170. currentRunStepSnapshot() {
  171. return __classPrivateFieldGet(this, _AssistantStream_currentRunStepSnapshot, "f");
  172. }
  173. async finalRunSteps() {
  174. await this.done();
  175. return Object.values(__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f"));
  176. }
  177. async finalMessages() {
  178. await this.done();
  179. return Object.values(__classPrivateFieldGet(this, _AssistantStream_messageSnapshots, "f"));
  180. }
  181. async finalRun() {
  182. await this.done();
  183. if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, "f"))
  184. throw Error('Final run was not received.');
  185. return __classPrivateFieldGet(this, _AssistantStream_finalRun, "f");
  186. }
  187. async _createThreadAssistantStream(thread, params, options) {
  188. const signal = options?.signal;
  189. if (signal) {
  190. if (signal.aborted)
  191. this.controller.abort();
  192. signal.addEventListener('abort', () => this.controller.abort());
  193. }
  194. const body = { ...params, stream: true };
  195. const stream = await thread.createAndRun(body, { ...options, signal: this.controller.signal });
  196. this._connected();
  197. for await (const event of stream) {
  198. __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event);
  199. }
  200. if (stream.controller.signal?.aborted) {
  201. throw new APIUserAbortError();
  202. }
  203. return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this));
  204. }
  205. async _createAssistantStream(run, threadId, params, options) {
  206. const signal = options?.signal;
  207. if (signal) {
  208. if (signal.aborted)
  209. this.controller.abort();
  210. signal.addEventListener('abort', () => this.controller.abort());
  211. }
  212. const body = { ...params, stream: true };
  213. const stream = await run.create(threadId, body, { ...options, signal: this.controller.signal });
  214. this._connected();
  215. for await (const event of stream) {
  216. __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event);
  217. }
  218. if (stream.controller.signal?.aborted) {
  219. throw new APIUserAbortError();
  220. }
  221. return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this));
  222. }
  223. static accumulateDelta(acc, delta) {
  224. for (const [key, deltaValue] of Object.entries(delta)) {
  225. if (!acc.hasOwnProperty(key)) {
  226. acc[key] = deltaValue;
  227. continue;
  228. }
  229. let accValue = acc[key];
  230. if (accValue === null || accValue === undefined) {
  231. acc[key] = deltaValue;
  232. continue;
  233. }
  234. // We don't accumulate these special properties
  235. if (key === 'index' || key === 'type') {
  236. acc[key] = deltaValue;
  237. continue;
  238. }
  239. // Type-specific accumulation logic
  240. if (typeof accValue === 'string' && typeof deltaValue === 'string') {
  241. accValue += deltaValue;
  242. }
  243. else if (typeof accValue === 'number' && typeof deltaValue === 'number') {
  244. accValue += deltaValue;
  245. }
  246. else if (Core.isObj(accValue) && Core.isObj(deltaValue)) {
  247. accValue = this.accumulateDelta(accValue, deltaValue);
  248. }
  249. else if (Array.isArray(accValue) && Array.isArray(deltaValue)) {
  250. if (accValue.every((x) => typeof x === 'string' || typeof x === 'number')) {
  251. accValue.push(...deltaValue); // Use spread syntax for efficient addition
  252. continue;
  253. }
  254. for (const deltaEntry of deltaValue) {
  255. if (!Core.isObj(deltaEntry)) {
  256. throw new Error(`Expected array delta entry to be an object but got: ${deltaEntry}`);
  257. }
  258. const index = deltaEntry['index'];
  259. if (index == null) {
  260. console.error(deltaEntry);
  261. throw new Error('Expected array delta entry to have an `index` property');
  262. }
  263. if (typeof index !== 'number') {
  264. throw new Error(`Expected array delta entry \`index\` property to be a number but got ${index}`);
  265. }
  266. const accEntry = accValue[index];
  267. if (accEntry == null) {
  268. accValue.push(deltaEntry);
  269. }
  270. else {
  271. accValue[index] = this.accumulateDelta(accEntry, deltaEntry);
  272. }
  273. }
  274. continue;
  275. }
  276. else {
  277. throw Error(`Unhandled record type: ${key}, deltaValue: ${deltaValue}, accValue: ${accValue}`);
  278. }
  279. acc[key] = accValue;
  280. }
  281. return acc;
  282. }
  283. _addRun(run) {
  284. return run;
  285. }
  286. async _threadAssistantStream(params, thread, options) {
  287. return await this._createThreadAssistantStream(thread, params, options);
  288. }
  289. async _runAssistantStream(threadId, runs, params, options) {
  290. return await this._createAssistantStream(runs, threadId, params, options);
  291. }
  292. async _runToolAssistantStream(threadId, runId, runs, params, options) {
  293. return await this._createToolAssistantStream(runs, threadId, runId, params, options);
  294. }
  295. }
  296. _AssistantStream_addEvent = function _AssistantStream_addEvent(event) {
  297. if (this.ended)
  298. return;
  299. __classPrivateFieldSet(this, _AssistantStream_currentEvent, event, "f");
  300. __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleEvent).call(this, event);
  301. switch (event.event) {
  302. case 'thread.created':
  303. //No action on this event.
  304. break;
  305. case 'thread.run.created':
  306. case 'thread.run.queued':
  307. case 'thread.run.in_progress':
  308. case 'thread.run.requires_action':
  309. case 'thread.run.completed':
  310. case 'thread.run.incomplete':
  311. case 'thread.run.failed':
  312. case 'thread.run.cancelling':
  313. case 'thread.run.cancelled':
  314. case 'thread.run.expired':
  315. __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleRun).call(this, event);
  316. break;
  317. case 'thread.run.step.created':
  318. case 'thread.run.step.in_progress':
  319. case 'thread.run.step.delta':
  320. case 'thread.run.step.completed':
  321. case 'thread.run.step.failed':
  322. case 'thread.run.step.cancelled':
  323. case 'thread.run.step.expired':
  324. __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleRunStep).call(this, event);
  325. break;
  326. case 'thread.message.created':
  327. case 'thread.message.in_progress':
  328. case 'thread.message.delta':
  329. case 'thread.message.completed':
  330. case 'thread.message.incomplete':
  331. __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleMessage).call(this, event);
  332. break;
  333. case 'error':
  334. //This is included for completeness, but errors are processed in the SSE event processing so this should not occur
  335. throw new Error('Encountered an error event in event processing - errors should be processed earlier');
  336. default:
  337. assertNever(event);
  338. }
  339. }, _AssistantStream_endRequest = function _AssistantStream_endRequest() {
  340. if (this.ended) {
  341. throw new OpenAIError(`stream has ended, this shouldn't happen`);
  342. }
  343. if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, "f"))
  344. throw Error('Final run has not been received');
  345. return __classPrivateFieldGet(this, _AssistantStream_finalRun, "f");
  346. }, _AssistantStream_handleMessage = function _AssistantStream_handleMessage(event) {
  347. const [accumulatedMessage, newContent] = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateMessage).call(this, event, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f"));
  348. __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, accumulatedMessage, "f");
  349. __classPrivateFieldGet(this, _AssistantStream_messageSnapshots, "f")[accumulatedMessage.id] = accumulatedMessage;
  350. for (const content of newContent) {
  351. const snapshotContent = accumulatedMessage.content[content.index];
  352. if (snapshotContent?.type == 'text') {
  353. this._emit('textCreated', snapshotContent.text);
  354. }
  355. }
  356. switch (event.event) {
  357. case 'thread.message.created':
  358. this._emit('messageCreated', event.data);
  359. break;
  360. case 'thread.message.in_progress':
  361. break;
  362. case 'thread.message.delta':
  363. this._emit('messageDelta', event.data.delta, accumulatedMessage);
  364. if (event.data.delta.content) {
  365. for (const content of event.data.delta.content) {
  366. //If it is text delta, emit a text delta event
  367. if (content.type == 'text' && content.text) {
  368. let textDelta = content.text;
  369. let snapshot = accumulatedMessage.content[content.index];
  370. if (snapshot && snapshot.type == 'text') {
  371. this._emit('textDelta', textDelta, snapshot.text);
  372. }
  373. else {
  374. throw Error('The snapshot associated with this text delta is not text or missing');
  375. }
  376. }
  377. if (content.index != __classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f")) {
  378. //See if we have in progress content
  379. if (__classPrivateFieldGet(this, _AssistantStream_currentContent, "f")) {
  380. switch (__classPrivateFieldGet(this, _AssistantStream_currentContent, "f").type) {
  381. case 'text':
  382. this._emit('textDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, "f").text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f"));
  383. break;
  384. case 'image_file':
  385. this._emit('imageFileDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, "f").image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f"));
  386. break;
  387. }
  388. }
  389. __classPrivateFieldSet(this, _AssistantStream_currentContentIndex, content.index, "f");
  390. }
  391. __classPrivateFieldSet(this, _AssistantStream_currentContent, accumulatedMessage.content[content.index], "f");
  392. }
  393. }
  394. break;
  395. case 'thread.message.completed':
  396. case 'thread.message.incomplete':
  397. //We emit the latest content we were working on on completion (including incomplete)
  398. if (__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f") !== undefined) {
  399. const currentContent = event.data.content[__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f")];
  400. if (currentContent) {
  401. switch (currentContent.type) {
  402. case 'image_file':
  403. this._emit('imageFileDone', currentContent.image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f"));
  404. break;
  405. case 'text':
  406. this._emit('textDone', currentContent.text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f"));
  407. break;
  408. }
  409. }
  410. }
  411. if (__classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")) {
  412. this._emit('messageDone', event.data);
  413. }
  414. __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, undefined, "f");
  415. }
  416. }, _AssistantStream_handleRunStep = function _AssistantStream_handleRunStep(event) {
  417. const accumulatedRunStep = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateRunStep).call(this, event);
  418. __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, accumulatedRunStep, "f");
  419. switch (event.event) {
  420. case 'thread.run.step.created':
  421. this._emit('runStepCreated', event.data);
  422. break;
  423. case 'thread.run.step.delta':
  424. const delta = event.data.delta;
  425. if (delta.step_details &&
  426. delta.step_details.type == 'tool_calls' &&
  427. delta.step_details.tool_calls &&
  428. accumulatedRunStep.step_details.type == 'tool_calls') {
  429. for (const toolCall of delta.step_details.tool_calls) {
  430. if (toolCall.index == __classPrivateFieldGet(this, _AssistantStream_currentToolCallIndex, "f")) {
  431. this._emit('toolCallDelta', toolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index]);
  432. }
  433. else {
  434. if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) {
  435. this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f"));
  436. }
  437. __classPrivateFieldSet(this, _AssistantStream_currentToolCallIndex, toolCall.index, "f");
  438. __classPrivateFieldSet(this, _AssistantStream_currentToolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index], "f");
  439. if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f"))
  440. this._emit('toolCallCreated', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f"));
  441. }
  442. }
  443. }
  444. this._emit('runStepDelta', event.data.delta, accumulatedRunStep);
  445. break;
  446. case 'thread.run.step.completed':
  447. case 'thread.run.step.failed':
  448. case 'thread.run.step.cancelled':
  449. case 'thread.run.step.expired':
  450. __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, undefined, "f");
  451. const details = event.data.step_details;
  452. if (details.type == 'tool_calls') {
  453. if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) {
  454. this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f"));
  455. __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, "f");
  456. }
  457. }
  458. this._emit('runStepDone', event.data, accumulatedRunStep);
  459. break;
  460. case 'thread.run.step.in_progress':
  461. break;
  462. }
  463. }, _AssistantStream_handleEvent = function _AssistantStream_handleEvent(event) {
  464. __classPrivateFieldGet(this, _AssistantStream_events, "f").push(event);
  465. this._emit('event', event);
  466. }, _AssistantStream_accumulateRunStep = function _AssistantStream_accumulateRunStep(event) {
  467. switch (event.event) {
  468. case 'thread.run.step.created':
  469. __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data;
  470. return event.data;
  471. case 'thread.run.step.delta':
  472. let snapshot = __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id];
  473. if (!snapshot) {
  474. throw Error('Received a RunStepDelta before creation of a snapshot');
  475. }
  476. let data = event.data;
  477. if (data.delta) {
  478. const accumulated = AssistantStream.accumulateDelta(snapshot, data.delta);
  479. __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = accumulated;
  480. }
  481. return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id];
  482. case 'thread.run.step.completed':
  483. case 'thread.run.step.failed':
  484. case 'thread.run.step.cancelled':
  485. case 'thread.run.step.expired':
  486. case 'thread.run.step.in_progress':
  487. __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data;
  488. break;
  489. }
  490. if (__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id])
  491. return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id];
  492. throw new Error('No snapshot available');
  493. }, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage(event, snapshot) {
  494. let newContent = [];
  495. switch (event.event) {
  496. case 'thread.message.created':
  497. //On creation the snapshot is just the initial message
  498. return [event.data, newContent];
  499. case 'thread.message.delta':
  500. if (!snapshot) {
  501. throw Error('Received a delta with no existing snapshot (there should be one from message creation)');
  502. }
  503. let data = event.data;
  504. //If this delta does not have content, nothing to process
  505. if (data.delta.content) {
  506. for (const contentElement of data.delta.content) {
  507. if (contentElement.index in snapshot.content) {
  508. let currentContent = snapshot.content[contentElement.index];
  509. snapshot.content[contentElement.index] = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateContent).call(this, contentElement, currentContent);
  510. }
  511. else {
  512. snapshot.content[contentElement.index] = contentElement;
  513. // This is a new element
  514. newContent.push(contentElement);
  515. }
  516. }
  517. }
  518. return [snapshot, newContent];
  519. case 'thread.message.in_progress':
  520. case 'thread.message.completed':
  521. case 'thread.message.incomplete':
  522. //No changes on other thread events
  523. if (snapshot) {
  524. return [snapshot, newContent];
  525. }
  526. else {
  527. throw Error('Received thread message event with no existing snapshot');
  528. }
  529. }
  530. throw Error('Tried to accumulate a non-message event');
  531. }, _AssistantStream_accumulateContent = function _AssistantStream_accumulateContent(contentElement, currentContent) {
  532. return AssistantStream.accumulateDelta(currentContent, contentElement);
  533. }, _AssistantStream_handleRun = function _AssistantStream_handleRun(event) {
  534. __classPrivateFieldSet(this, _AssistantStream_currentRunSnapshot, event.data, "f");
  535. switch (event.event) {
  536. case 'thread.run.created':
  537. break;
  538. case 'thread.run.queued':
  539. break;
  540. case 'thread.run.in_progress':
  541. break;
  542. case 'thread.run.requires_action':
  543. case 'thread.run.cancelled':
  544. case 'thread.run.failed':
  545. case 'thread.run.completed':
  546. case 'thread.run.expired':
  547. __classPrivateFieldSet(this, _AssistantStream_finalRun, event.data, "f");
  548. if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) {
  549. this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f"));
  550. __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, "f");
  551. }
  552. break;
  553. case 'thread.run.cancelling':
  554. break;
  555. }
  556. };
  557. function assertNever(_x) { }
  558. //# sourceMappingURL=AssistantStream.mjs.map