AssistantStream.js 28 KB

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