AssistantStream.mjs 27 KB

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