AssistantStream.js 30 KB

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