From f322b2850b014122493ecab74adc154f33ca2b31 Mon Sep 17 00:00:00 2001 From: msaaddev Date: Tue, 4 Feb 2025 18:36:21 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=93=A6=20NEW:=20Helper=20functions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/langbase/package.json | 2 +- packages/langbase/src/index.ts | 9 +- packages/langbase/src/lib/browser/stream.ts | 5 - packages/langbase/src/lib/helpers/index.ts | 123 ++++++++++++++++++++ 4 files changed, 125 insertions(+), 14 deletions(-) delete mode 100644 packages/langbase/src/lib/browser/stream.ts create mode 100644 packages/langbase/src/lib/helpers/index.ts diff --git a/packages/langbase/package.json b/packages/langbase/package.json index a44c891..6ce0b5c 100644 --- a/packages/langbase/package.json +++ b/packages/langbase/package.json @@ -31,7 +31,7 @@ "dependencies": { "@baseai/core": "0.9.42", "dotenv": "^16.4.5", - "openai": "^4.53.0", + "openai": "^4.82.0", "zod": "^3.23.8", "zod-validation-error": "^3.3.0" }, diff --git a/packages/langbase/src/index.ts b/packages/langbase/src/index.ts index 6d84533..a0b85d3 100644 --- a/packages/langbase/src/index.ts +++ b/packages/langbase/src/index.ts @@ -1,10 +1,3 @@ -export {fromReadableStream} from './lib/browser/stream'; export * from './langbase/langbase'; export * from './pipes/pipes'; -export * from '@baseai/core/helpers'; -export type { - RunOptions, - RunOptionsStream, - RunResponse, - RunResponseStream, -} from '@baseai/core'; +export * from './lib/helpers' diff --git a/packages/langbase/src/lib/browser/stream.ts b/packages/langbase/src/lib/browser/stream.ts deleted file mode 100644 index 212ad33..0000000 --- a/packages/langbase/src/lib/browser/stream.ts +++ /dev/null @@ -1,5 +0,0 @@ -import {ChatCompletionStream} from 'openai/lib/ChatCompletionStream'; - -export const fromReadableStream = (readableStream: ReadableStream) => { - return ChatCompletionStream.fromReadableStream(readableStream); -}; diff --git a/packages/langbase/src/lib/helpers/index.ts b/packages/langbase/src/lib/helpers/index.ts new file mode 100644 index 0000000..6d8f0f1 --- /dev/null +++ b/packages/langbase/src/lib/helpers/index.ts @@ -0,0 +1,123 @@ +import {ChatCompletionStream} from 'openai/lib/ChatCompletionStream'; +import {Stream} from 'openai/streaming'; +import {ChatCompletionMessageToolCall} from 'openai/resources/chat/completions'; + +export interface Runner extends ChatCompletionStream {} + +export interface ToolCallResult extends ChatCompletionMessageToolCall {} + +export type MessageRole = 'function' | 'assistant' | 'system' | 'user' | 'tool'; + +interface Delta { + role?: MessageRole; + content?: string; + tool_calls?: ToolCallResult[]; +} + +interface ChoiceStream { + index: number; + delta: Delta; + logprobs: boolean | null; + finish_reason: string; +} + +export interface ChunkStream { + id: string; + object: string; + created: number; + model: string; + choices: ChoiceStream[]; +} + +/** + * Converts a ReadableStream into a Runner. + * + * @param readableStream - The ReadableStream to convert. + * @returns The converted Runner. + */ +export const fromReadableStream = (readableStream: ReadableStream): Runner => { + return ChatCompletionStream.fromReadableStream(readableStream); +}; + +/** + * Returns a runner for the given readable stream. + * + * @param readableStream - The readable stream to create a runner for. + * @returns A runner for the given readable stream. + */ +export const getRunner = (readableStream: ReadableStream) => { + return fromReadableStream(readableStream); +}; + +/** + * Retrieves the text part from a given ChunkStream. + * + * @param chunk - The ChunkStream object. + * @returns The text content of the first choice's delta, or an empty string if it doesn't exist. + */ +export const getTextPart = (chunk: ChunkStream) => { + return chunk.choices[0]?.delta?.content || ''; +}; + +/** + * Handles the response stream from a given `Response` object. + * + * @param {Object} params - The parameters for handling the response stream. + * @param {Response} params.response - The API response to handle. + * @param {boolean} params.rawResponse - Optional flag to include raw response headers. + * + * @returns {Object} An object containing the processed stream, thread ID, and optionally raw response headers. + * @returns {ReadableStream} return.stream - The readable stream created from the response. + * @returns {string | null} return.threadId - The thread ID extracted from the response headers. + * @returns {Object} [return.rawResponse] - Optional raw response headers. + * @returns {Record} return.rawResponse.headers - The headers from the raw response. + */ +export function handleResponseStream({ + response, + rawResponse, +}: { + response: Response; + rawResponse?: boolean; +}): { + stream: any; + threadId: string | null; + rawResponse?: { + headers: Record; + }; +} { + const controller = new AbortController(); + const streamSSE = Stream.fromSSEResponse(response, controller); + const stream = streamSSE.toReadableStream(); + + const result: { + stream: ReadableStream; + threadId: string | null; + rawResponse?: { + headers: Record; + }; + } = { + stream, + threadId: response.headers.get('lb-thread-id'), + }; + if (rawResponse) { + result.rawResponse = { + headers: Object.fromEntries(response.headers.entries()), + }; + } + return result; +} + +/** + * Retrieves tool calls from a given readable stream. + * + * @param stream - The readable stream from which to extract tool calls. + * @returns A promise that resolves to an array of `ToolCall` objects. + */ +export async function getToolsFromStream( + stream: ReadableStream, +): Promise { + let run = getRunner(stream); + const {choices} = await run.finalChatCompletion(); + const tools = choices[0].message.tool_calls; + return tools ?? []; +} From 2154a8a2dd1f92ba3bac1413c72a4939b1d3af2c Mon Sep 17 00:00:00 2001 From: msaaddev Date: Tue, 4 Feb 2025 18:40:29 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=93=A6=20NEW:=20Remove=20baseai=20dep?= =?UTF-8?q?endency?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/langbase/package.json | 1 - pnpm-lock.yaml | 34 +++++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/packages/langbase/package.json b/packages/langbase/package.json index 6ce0b5c..6f0be5f 100644 --- a/packages/langbase/package.json +++ b/packages/langbase/package.json @@ -29,7 +29,6 @@ "test:ui:react:watch": "vitest --config vitest.ui.react.config.js" }, "dependencies": { - "@baseai/core": "0.9.42", "dotenv": "^16.4.5", "openai": "^4.82.0", "zod": "^3.23.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b6faf9..06e7b22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -117,15 +117,12 @@ importers: packages/langbase: dependencies: - '@baseai/core': - specifier: 0.9.42 - version: 0.9.42(react@18.3.1)(zod@3.23.8) dotenv: specifier: ^16.4.5 version: 16.4.5 openai: - specifier: ^4.53.0 - version: 4.53.0 + specifier: ^4.82.0 + version: 4.82.0(ws@8.18.0)(zod@3.23.8) zod: specifier: ^3.23.8 version: 3.23.8 @@ -2976,6 +2973,18 @@ packages: zod: optional: true + openai@4.82.0: + resolution: {integrity: sha512-1bTxOVGZuVGsKKUWbh3BEwX1QxIXUftJv+9COhhGGVDTFwiaOd4gWsMynF2ewj1mg6by3/O+U8+EEHpWRdPaJg==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -7287,6 +7296,21 @@ snapshots: transitivePeerDependencies: - encoding + openai@4.82.0(ws@8.18.0)(zod@3.23.8): + dependencies: + '@types/node': 18.19.42 + '@types/node-fetch': 2.6.11 + abort-controller: 3.0.0 + agentkeepalive: 4.5.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0 + optionalDependencies: + ws: 8.18.0 + zod: 3.23.8 + transitivePeerDependencies: + - encoding + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6