From cc37af815c97e1b1df018983b7863e79e49d99ea Mon Sep 17 00:00:00 2001 From: Guillaume Aquilina Date: Fri, 21 Mar 2025 15:37:07 -0400 Subject: [PATCH 1/5] feat: remove unused files --- bin/codegen/has-git-diff.ts | 26 -------------------------- configs/postcjs.ts | 3 --- configs/postesm.ts | 3 --- configs/tsconfig.build.json | 4 ---- configs/tsconfig.cjs.json | 9 --------- configs/tsconfig.esm.json | 10 ---------- configs/tsconfig.types.json | 8 -------- packages/react/package.json | 5 +++-- packages/workflowai/package.json | 8 +++----- packages/workflowai/rollup.config.js | 26 ++++++++++++++++++++++++++ packages/workflowai/tsconfig.json | 5 ++++- 11 files changed, 36 insertions(+), 71 deletions(-) delete mode 100644 bin/codegen/has-git-diff.ts delete mode 100644 configs/postcjs.ts delete mode 100644 configs/postesm.ts delete mode 100644 configs/tsconfig.build.json delete mode 100644 configs/tsconfig.cjs.json delete mode 100644 configs/tsconfig.esm.json delete mode 100644 configs/tsconfig.types.json create mode 100644 packages/workflowai/rollup.config.js diff --git a/bin/codegen/has-git-diff.ts b/bin/codegen/has-git-diff.ts deleted file mode 100644 index 94558b3..0000000 --- a/bin/codegen/has-git-diff.ts +++ /dev/null @@ -1,26 +0,0 @@ -import assert from 'node:assert' -import { spawnSync } from 'node:child_process' - -import * as core from '@actions/core' - -try { - // Check if there are any git diff pending - const gitDiffCmd = spawnSync('git', ['diff']) - assert(!gitDiffCmd.error, gitDiffCmd.error) - assert( - !gitDiffCmd.stderr.toString(), - `Failed to run git diff: ${gitDiffCmd.stderr.toString()}`, - ) - - const diffResult = gitDiffCmd.stdout.toString() - const hasDiff: boolean = diffResult.length > 0 - - if (hasDiff) { - console.log('Git changes are pending') - } else { - core.setFailed('No git changes') - } -} catch (error) { - console.error(error) - throw error -} diff --git a/configs/postcjs.ts b/configs/postcjs.ts deleted file mode 100644 index 73c1ba0..0000000 --- a/configs/postcjs.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { writeFileSync } from 'fs'; - -writeFileSync('./dist/cjs/package.json', '{"type":"commonjs"}', 'utf-8'); diff --git a/configs/postesm.ts b/configs/postesm.ts deleted file mode 100644 index 68ede50..0000000 --- a/configs/postesm.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { writeFileSync } from 'fs'; - -writeFileSync('./dist/esm/package.json', '{"type":"module"}', 'utf-8'); diff --git a/configs/tsconfig.build.json b/configs/tsconfig.build.json deleted file mode 100644 index a6817c3..0000000 --- a/configs/tsconfig.build.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../tsconfig.json", - "exclude": ["**/*.test.ts", "**/*.spec.ts"] -} diff --git a/configs/tsconfig.cjs.json b/configs/tsconfig.cjs.json deleted file mode 100644 index 12cd972..0000000 --- a/configs/tsconfig.cjs.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - "compilerOptions": { - "module": "commonjs", - "declaration": true, - "declarationMap": false, - "sourceMap": false - } -} diff --git a/configs/tsconfig.esm.json b/configs/tsconfig.esm.json deleted file mode 100644 index 621b2a7..0000000 --- a/configs/tsconfig.esm.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - "compilerOptions": { - "target": "es2020", - "module": "es2020", - "declaration": false, - "declarationMap": false, - "sourceMap": false - } -} diff --git a/configs/tsconfig.types.json b/configs/tsconfig.types.json deleted file mode 100644 index b87895d..0000000 --- a/configs/tsconfig.types.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - "compilerOptions": { - "declaration": true, - "declarationMap": true, - "emitDeclarationOnly": true - } -} diff --git a/packages/react/package.json b/packages/react/package.json index 4b5fafc..333cbf8 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -32,9 +32,10 @@ "@types/react-dom": "^18.2.0" }, "scripts": { - "prebuild": "tsx ../../configs/prebuild.ts", + "prebuild": "npm run clean && tsx ../../configs/prebuild.ts", "clean": "rm -rf dist/*", - "build": "npm run clean && rollup -c", + "build": "rollup -c", + "dry": "npm run build && npm pub --dry-run", "prepublishOnly": "npm run build" } } diff --git a/packages/workflowai/package.json b/packages/workflowai/package.json index 3f39599..f39cbe4 100644 --- a/packages/workflowai/package.json +++ b/packages/workflowai/package.json @@ -1,6 +1,7 @@ { "name": "@workflowai/workflowai", "version": "1.6.4", + "type": "module", "description": "WorkflowAI JS SDK", "author": "WorkflowAI", "homepage": "https://workflowai.com", @@ -50,11 +51,8 @@ "check-version": "tsx ./bin/check-version.ts", "-------- BUILD": "", "clean": "rm -rf dist/*", - "prebuild": "tsx ../../configs/prebuild.ts", - "build:types": "tsc -p ./tsconfig.json --declaration --declarationMap --emitDeclarationOnly --outDir ./dist/types", - "build:cjs": "tsc -p ./tsconfig.json --module commonjs --declaration --outDir ./dist/cjs && tsx ../../configs/postcjs.ts", - "build:esm": "tsc -p ./tsconfig.json --module es2020 --target es2020 --outDir ./dist/esm && tsx ../../configs/postesm.ts", - "build": "npm run clean && npm run prebuild && npm run build:types && npm run build:cjs && npm run build:esm", + "prebuild": "npm run clean && tsx ../../configs/prebuild.ts", + "build": "rollup -c", "dry": "npm run build && npm pub --dry-run", "prepublishOnly": "npm run build" } diff --git a/packages/workflowai/rollup.config.js b/packages/workflowai/rollup.config.js new file mode 100644 index 0000000..c4f3012 --- /dev/null +++ b/packages/workflowai/rollup.config.js @@ -0,0 +1,26 @@ +import commonjs from '@rollup/plugin-commonjs'; +import resolve from '@rollup/plugin-node-resolve'; +import peerDepsExternal from 'rollup-plugin-peer-deps-external'; +import typescript from 'rollup-plugin-typescript2'; + +export default { + input: 'src/index.ts', // entry point of your library + output: [ + { + file: 'dist/index.cjs.js', + format: 'cjs', + sourcemap: true, + }, + { + file: 'dist/index.esm.js', + format: 'esm', + sourcemap: true, + }, + ], + plugins: [ + peerDepsExternal(), // automatically externalize peerDependencies in package.json + resolve(), // resolves node_modules packages + commonjs(), // converts CommonJS modules to ES6 + typescript({ tsconfig: './tsconfig.json' }), + ], +}; diff --git a/packages/workflowai/tsconfig.json b/packages/workflowai/tsconfig.json index 5a5259b..f0e9c1b 100644 --- a/packages/workflowai/tsconfig.json +++ b/packages/workflowai/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "../../tsconfig.json", "include": ["src/**/*.ts", "src/**/*.tsx"], - "exclude": ["**/*.test.ts", "**/*.spec.ts"] + "exclude": ["**/*.test.ts", "**/*.spec.ts"], + "compilerOptions": { + "declaration": true + } } From 6c0d0ce0056021b15bd212682cb5a68da84ab2e9 Mon Sep 17 00:00:00 2001 From: Guillaume Aquilina Date: Fri, 21 Mar 2025 15:41:59 -0400 Subject: [PATCH 2/5] chore: add editor config --- .editorconfig | 11 +++++++++++ .github/workflows/branches.yml | 2 +- .prettierrc.json | 11 ++--------- tests/e2e/analyzeBookCharacter.test.ts | 14 +++++++++++--- tests/tsconfig.json | 3 ++- 5 files changed, 27 insertions(+), 14 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..354c468 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ + +root = true + +[{src,scripts}/**.{ts,json,js}] +end_of_line = crlf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 +max_line_length = 120 diff --git a/.github/workflows/branches.yml b/.github/workflows/branches.yml index d1661d2..a56d9f4 100644 --- a/.github/workflows/branches.yml +++ b/.github/workflows/branches.yml @@ -3,7 +3,7 @@ name: branches on: push: branches: - - "**" + - '**' permissions: contents: read diff --git a/.prettierrc.json b/.prettierrc.json index ffc2b53..17392dc 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -4,15 +4,8 @@ "tabWidth": 2, "singleQuote": true, "jsxSingleQuote": true, - "importOrder": [ - "^@/(.*)$", - "^../(.*)$", - "^./(.*)$", - "^[./]" - ], + "importOrder": ["^@/(.*)$", "^../(.*)$", "^./(.*)$", "^[./]"], "importOrderSeparation": false, "importOrderSortSpecifiers": true, - "plugins": [ - "@trivago/prettier-plugin-sort-imports" - ] + "plugins": ["@trivago/prettier-plugin-sort-imports"] } diff --git a/tests/e2e/analyzeBookCharacter.test.ts b/tests/e2e/analyzeBookCharacter.test.ts index cc994fc..e0daa4a 100644 --- a/tests/e2e/analyzeBookCharacter.test.ts +++ b/tests/e2e/analyzeBookCharacter.test.ts @@ -1,6 +1,12 @@ -import { TaskInput, TaskOutput, WorkflowAI, WorkflowAIError, z } from '@workflowai/workflowai'; +import { + TaskInput, + TaskOutput, + WorkflowAI, + WorkflowAIError, + z, +} from '@workflowai/workflowai'; +import { DeepPartial } from '@workflowai/workflowai/utils'; import 'dotenv/config'; -import { DeepPartial } from 'utils'; const workflowAI = new WorkflowAI(); @@ -196,7 +202,9 @@ describe('analyzeBookCharacter', () => { fail(`Expected an error to be thrown ${error}`); } expect(error.errorCode).toBe('version_not_found'); - expect(error.detail?.error.message).toContain('No version deployed to dev for agent \'analyze-book-characters\' and schema \'1\'.'); + expect(error.detail?.error.message).toContain( + "No version deployed to dev for agent 'analyze-book-characters' and schema '1'." + ); } }, 30000); diff --git a/tests/tsconfig.json b/tests/tsconfig.json index df1277e..46a9cc2 100644 --- a/tests/tsconfig.json +++ b/tests/tsconfig.json @@ -3,7 +3,8 @@ "include": ["**/*.test.ts", "**/*.spec.ts"], "compilerOptions": { "paths": { - "@workflowai/workflowai": ["../packages/workflowai/src"] + "@workflowai/workflowai": ["../packages/workflowai/src"], + "@workflowai/workflowai/*": ["../packages/workflowai/src/*"] } } } From 00b24244bcd3dddf450219077fb27a67a743b50f Mon Sep 17 00:00:00 2001 From: Guillaume Aquilina Date: Fri, 21 Mar 2025 16:12:25 -0400 Subject: [PATCH 3/5] feat: add feedback token --- packages/workflowai/package.json | 6 +- packages/workflowai/src/WorkflowAI.test.ts | 71 +++++++++++++++++++ packages/workflowai/src/WorkflowAI.ts | 46 +++++++++++- packages/workflowai/src/agent.ts | 2 + packages/workflowai/src/api/api.test.ts | 38 ---------- packages/workflowai/src/api/api.ts | 5 +- .../workflowai/src/api/generated/openapi.ts | 5 +- packages/workflowai/src/task.ts | 2 + tests/fixtures/run1.json | 3 +- tests/integration/agent.test.ts | 5 +- tests/integration/task_run.test.ts | 5 +- 11 files changed, 139 insertions(+), 49 deletions(-) diff --git a/packages/workflowai/package.json b/packages/workflowai/package.json index f39cbe4..1fddbe3 100644 --- a/packages/workflowai/package.json +++ b/packages/workflowai/package.json @@ -1,6 +1,6 @@ { "name": "@workflowai/workflowai", - "version": "1.6.4", + "version": "1.6.5-dev.1", "type": "module", "description": "WorkflowAI JS SDK", "author": "WorkflowAI", @@ -44,9 +44,9 @@ "lint:fix": "eslint --cache --fix --ext .ts ./src", "check": "npm run lint:check && npm run prettier:check", "fix": "npm run lint:fix && npm run prettier:fix", - "test": "jest", + "test": "npm run test:unit", "test:unit": "jest --projects ../../configs/jest.unit.config.ts", - "test:e2e": "jest tests/e2e", + "test:e2e": "jest --projects ../../configs/jest.e2e.config.ts", "lint-staged": "lint-staged", "check-version": "tsx ./bin/check-version.ts", "-------- BUILD": "", diff --git a/packages/workflowai/src/WorkflowAI.test.ts b/packages/workflowai/src/WorkflowAI.test.ts index 5d44a4b..b8451c2 100644 --- a/packages/workflowai/src/WorkflowAI.test.ts +++ b/packages/workflowai/src/WorkflowAI.test.ts @@ -1,3 +1,4 @@ +import fetchMock from 'jest-fetch-mock'; import { WorkflowAI } from './WorkflowAI.js'; import { z } from './schema/zod/zod.js'; @@ -48,3 +49,73 @@ describe('useTask', () => { expect(task).toBeDefined(); }); }); + +describe('sendFeedback', () => { + beforeEach(() => { + fetchMock.resetMocks(); + }); + + it('should successfully send feedback', async () => { + fetchMock.mockResponseOnce(JSON.stringify({})); + + await workflowAI.sendFeedback({ + feedbackToken: 'test-token', + outcome: 'positive', + comment: 'Great work!', + userID: 'user123', + }); + + expect(fetchMock).toHaveBeenCalledWith( + 'https://test.workflowai.com/v1/feedback', + { + method: 'POST', + body: JSON.stringify({ + feedback_token: 'test-token', + outcome: 'positive', + comment: 'Great work!', + user_id: 'user123', + }), + headers: { + 'Content-Type': 'application/json', + }, + } + ); + }); + + it('should handle negative feedback', async () => { + fetchMock.mockResponseOnce(JSON.stringify({})); + + await workflowAI.sendFeedback({ + feedbackToken: 'test-token', + outcome: 'negative', + comment: 'Needs improvement', + }); + + expect(fetchMock).toHaveBeenCalledWith( + 'https://test.workflowai.com/v1/feedback', + { + method: 'POST', + body: JSON.stringify({ + feedback_token: 'test-token', + outcome: 'negative', + comment: 'Needs improvement', + user_id: undefined, + }), + headers: { + 'Content-Type': 'application/json', + }, + } + ); + }); + + it('should throw error when feedback request fails', async () => { + fetchMock.mockResponseOnce('', { status: 400 }); + + await expect( + workflowAI.sendFeedback({ + feedbackToken: 'test-token', + outcome: 'positive', + }) + ).rejects.toThrow('Failed to send feedback'); + }); +}); diff --git a/packages/workflowai/src/WorkflowAI.ts b/packages/workflowai/src/WorkflowAI.ts index 969e5d9..aa6ad23 100644 --- a/packages/workflowai/src/WorkflowAI.ts +++ b/packages/workflowai/src/WorkflowAI.ts @@ -51,6 +51,7 @@ function optionsToRunRequest( export class WorkflowAI { protected api: WorkflowAIApi; + protected api_url: string; constructor(config?: WorkflowAIConfig | { api: WorkflowAIConfig }) { // Old constructors used to be { api: WorkflowAIConfig } @@ -58,6 +59,8 @@ export class WorkflowAI { this.api = initWorkflowAIApi({ ...(c ?? {}), }); + + this.api_url = this.api.url.replace('https://run.', 'https://api.'); } protected async runTask( @@ -102,7 +105,12 @@ export class WorkflowAI { data.task_output ); - return { data: data as RunResponse, response, output }; + return { + data: data as RunResponse, + response, + output, + feedbackToken: data.feedback_token, + }; } // Streaming response, we receive partial results @@ -133,6 +141,7 @@ export class WorkflowAI { data, output: parsed?.data, partialOutput: partialParsed?.data?.partial, + feedbackToken: data?.feedback_token as string, }; } ), @@ -229,7 +238,12 @@ export class WorkflowAI { const output = data.task_output as Output; - return { data: data as RunResponse, response, output }; + return { + data: data as RunResponse, + response, + output, + feedbackToken: data.feedback_token, + }; } // Streaming response, we receive partial results @@ -247,6 +261,7 @@ export class WorkflowAI { return { data, output: data?.task_output as DeepPartial, + feedbackToken: data?.feedback_token as string, }; } ), @@ -302,4 +317,31 @@ export class WorkflowAI { }; return run; } + + public async sendFeedback(req: { + feedbackToken: string; + outcome: 'positive' | 'negative'; + comment?: string; + userID?: string; + }) { + const { feedbackToken, outcome, comment, userID } = req; + const body = { + feedback_token: feedbackToken, + outcome, + comment, + user_id: userID, + }; + + const response = await fetch(`${this.api_url}/v1/feedback`, { + method: 'POST', + body: JSON.stringify(body), + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (!response.ok) { + throw new Error('Failed to send feedback'); + } + } } diff --git a/packages/workflowai/src/agent.ts b/packages/workflowai/src/agent.ts index 9bdd45c..ee11c86 100644 --- a/packages/workflowai/src/agent.ts +++ b/packages/workflowai/src/agent.ts @@ -15,6 +15,7 @@ export type RunResult = { data: RunResponse; response: Response; output: O; + feedbackToken: string; }; // Raw async iterator that the API client returns for streaming a task run @@ -28,6 +29,7 @@ export type RunStreamEvent = AsyncIteratorValue< RawRunStreamResult['stream'] > & { output: DeepPartial | undefined; + feedbackToken: string | undefined; }; export type RunStreamResult = Pick< diff --git a/packages/workflowai/src/api/api.test.ts b/packages/workflowai/src/api/api.test.ts index ce32d04..8c9486e 100644 --- a/packages/workflowai/src/api/api.test.ts +++ b/packages/workflowai/src/api/api.test.ts @@ -1,5 +1,4 @@ import { expect, test } from '@jest/globals'; -import { z } from 'zod'; import { initWorkflowAIApi } from './api.js'; import * as createClients from './http-clients.js'; import { @@ -19,16 +18,6 @@ afterEach(() => { jest.clearAllMocks(); }); -const apiMethod = z - .function() - .args(z.record(z.string(), z.any())) - .returns( - z.object({ - data: z.any(), - status: z.any(), - }) - ); - describe('WorkflowAIApi', () => { test('export api init function', () => { expect(initWorkflowAIApi).toBeInstanceOf(Function); @@ -38,33 +27,6 @@ describe('WorkflowAIApi', () => { expect(initWorkflowAIApi()).toBeTruthy(); }); - test('export api routes as functions', () => { - const outputSchema = z.record( - z.string(), - z.union([ - apiMethod, - z.record( - z.string(), - z.union([ - apiMethod, - z.record( - z.string(), - z.union([ - apiMethod, - z.record( - z.string(), - z.union([apiMethod, z.record(z.string(), apiMethod)]) - ), - ]) - ), - ]) - ), - ]) - ); - const api = initWorkflowAIApi(); - expect(outputSchema.parse(api)).toBeTruthy(); - }); - test('create clients is called with the correct arguments, no middlware', () => { const config = { key: 'api_key', url: 'https://api.example.com' }; initWorkflowAIApi(config); diff --git a/packages/workflowai/src/api/api.ts b/packages/workflowai/src/api/api.ts index bc96380..33c3ab6 100644 --- a/packages/workflowai/src/api/api.ts +++ b/packages/workflowai/src/api/api.ts @@ -45,14 +45,15 @@ export function initWorkflowAIApi( schemas: { run: withStream( json.POST( - '/v1/{tenant}/tasks/{task_id}/schemas/{task_schema_id}/run' + '/v1/{tenant}/agents/{task_id}/schemas/{task_schema_id}/run' ), stream.POST( - '/v1/{tenant}/tasks/{task_id}/schemas/{task_schema_id}/run' + '/v1/{tenant}/agents/{task_id}/schemas/{task_schema_id}/run' ) ), }, }, + url, }; } diff --git a/packages/workflowai/src/api/generated/openapi.ts b/packages/workflowai/src/api/generated/openapi.ts index af021d1..681acc8 100644 --- a/packages/workflowai/src/api/generated/openapi.ts +++ b/packages/workflowai/src/api/generated/openapi.ts @@ -4,7 +4,7 @@ */ export interface paths { - '/v1/{tenant}/tasks/{task_id}/schemas/{task_schema_id}/run': { + '/v1/{tenant}/agents/{task_id}/schemas/{task_schema_id}/run': { /** Run Task */ post: operations['run_task_v1__tenant__tasks__task_id__schemas__task_schema_id__run_post']; }; @@ -182,6 +182,7 @@ export interface operations { version: $defs['Version']; /** Duration Seconds */ duration_seconds: number | null; + feedback_token: string; /** Cost Usd */ cost_usd: number | null; $defs: { @@ -304,6 +305,7 @@ export interface operations { duration_seconds: number | null; /** Cost Usd */ cost_usd: number | null; + feedback_token: string; }; /** * RunResponseStreamChunk @@ -314,6 +316,7 @@ export interface operations { id: string; /** Task Output */ task_output: Record; + feedback_token?: string | null; }; /** * TaskGroupProperties diff --git a/packages/workflowai/src/task.ts b/packages/workflowai/src/task.ts index 22892fd..4b17dd4 100644 --- a/packages/workflowai/src/task.ts +++ b/packages/workflowai/src/task.ts @@ -22,6 +22,7 @@ export type TaskRunResult = { data: RunResponse; response: Response; output: TaskOutput; + feedbackToken: string; }; // Raw async iterator that the API client returns for streaming a task run @@ -36,6 +37,7 @@ export type TaskRunStreamEvent = AsyncIteratorValue< > & { output: TaskOutput | undefined; partialOutput: DeepPartial> | undefined; + feedbackToken: string | undefined; }; export type TaskRunStreamResult = Pick< diff --git a/tests/fixtures/run1.json b/tests/fixtures/run1.json index de661b0..0ccbd5a 100644 --- a/tests/fixtures/run1.json +++ b/tests/fixtures/run1.json @@ -23,5 +23,6 @@ "cost_usd": 0.0024200000000000003, "metadata": { "workflowai.runBy": "model|openai:gpt-4o-2024-08-06" - } + }, + "feedback_token": "b650f038-e54e-41cf-9934-f57713fb9402" } diff --git a/tests/integration/agent.test.ts b/tests/integration/agent.test.ts index d48cfc8..ecf4125 100644 --- a/tests/integration/agent.test.ts +++ b/tests/integration/agent.test.ts @@ -55,11 +55,14 @@ describe('run', () => { expect(result.data.version.properties.model).toEqual('gpt-4o-2024-08-06'); expect(result.data.cost_usd).toEqual(0.0024200000000000003); expect(result.data.duration_seconds).toEqual(1.311426); + expect(result.feedbackToken).toEqual( + 'b650f038-e54e-41cf-9934-f57713fb9402' + ); expect(mockFetch.mock.calls.length).toEqual(1); const req = mockFetch.mock.calls[0][0] as Request; expect(req.url).toEqual( - 'https://run.workflowai.com/v1/_/tasks/animal-classification/schemas/4/run' + 'https://run.workflowai.com/v1/_/agents/animal-classification/schemas/4/run' ); expect(req.method).toEqual('POST'); expect(req.headers.get('Authorization')).toEqual('Bearer hello'); diff --git a/tests/integration/task_run.test.ts b/tests/integration/task_run.test.ts index be6d960..d583adf 100644 --- a/tests/integration/task_run.test.ts +++ b/tests/integration/task_run.test.ts @@ -57,11 +57,14 @@ describe('run', () => { expect(result.data.version.properties.model).toEqual('gpt-4o-2024-08-06'); expect(result.data.cost_usd).toEqual(0.0024200000000000003); expect(result.data.duration_seconds).toEqual(1.311426); + expect(result.feedbackToken).toEqual( + 'b650f038-e54e-41cf-9934-f57713fb9402' + ); expect(mockFetch.mock.calls.length).toEqual(1); const req = mockFetch.mock.calls[0][0] as Request; expect(req.url).toEqual( - 'https://run.workflowai.com/v1/_/tasks/animal-classification/schemas/4/run' + 'https://run.workflowai.com/v1/_/agents/animal-classification/schemas/4/run' ); expect(req.method).toEqual('POST'); expect(req.headers.get('Authorization')).toEqual('Bearer hello'); From 6733ae0bbd5ad9122655b32f04683a730ac74cb1 Mon Sep 17 00:00:00 2001 From: Guillaume Aquilina Date: Fri, 21 Mar 2025 16:19:45 -0400 Subject: [PATCH 4/5] fix: exports package fields --- packages/workflowai/package.json | 12 ++++++------ packages/workflowai/src/version.ts | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/workflowai/package.json b/packages/workflowai/package.json index 1fddbe3..2e43f98 100644 --- a/packages/workflowai/package.json +++ b/packages/workflowai/package.json @@ -11,14 +11,14 @@ "llm", "agent" ], - "types": "./dist/types/index.d.ts", - "main": "./dist/cjs/index.js", - "module": "./dist/esm/index.js", + "types": "./dist/index.d.ts", + "main": "./dist/index.cjs.js", + "module": "./dist/index.esm.js", "exports": { ".": { - "types": "./dist/types/index.d.ts", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js" + "types": "./dist/index.d.ts", + "import": "./dist/index.esm.js", + "require": "./dist/index.cjs.js" } }, "files": [ diff --git a/packages/workflowai/src/version.ts b/packages/workflowai/src/version.ts index 8d89585..5452e53 100644 --- a/packages/workflowai/src/version.ts +++ b/packages/workflowai/src/version.ts @@ -1,2 +1,2 @@ // DO NOT EDIT: file is generated by build process -export const PACKAGE_VERSION = '1.6.4'; +export const PACKAGE_VERSION = '1.6.5-dev.1'; From 218d522c26347aacdd3622dd3e35ace63ea82d58 Mon Sep 17 00:00:00 2001 From: Guillaume Aquilina Date: Fri, 21 Mar 2025 16:38:43 -0400 Subject: [PATCH 5/5] fix: import in e2e jest config --- configs/jest.e2e.config.ts | 3 ++- tests/e2e/analyzeBookCharacter.test.ts | 18 ++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/configs/jest.e2e.config.ts b/configs/jest.e2e.config.ts index b079e81..306514a 100644 --- a/configs/jest.e2e.config.ts +++ b/configs/jest.e2e.config.ts @@ -13,7 +13,8 @@ const config: Config = { coverageReporters: ['json-summary', 'text', 'lcov'], automock: false, moduleNameMapper: { - '@workflowai/workflowai': '/src', + '@workflowai/workflowai': '/packages/workflowai/src', + '@workflowai/react': '/packages/react/src', '(.+)\\.js': '$1', }, }; diff --git a/tests/e2e/analyzeBookCharacter.test.ts b/tests/e2e/analyzeBookCharacter.test.ts index e0daa4a..4ffd310 100644 --- a/tests/e2e/analyzeBookCharacter.test.ts +++ b/tests/e2e/analyzeBookCharacter.test.ts @@ -1,11 +1,11 @@ import { + RunStreamEvent, TaskInput, TaskOutput, WorkflowAI, WorkflowAIError, z, } from '@workflowai/workflowai'; -import { DeepPartial } from '@workflowai/workflowai/utils'; import 'dotenv/config'; const workflowAI = new WorkflowAI(); @@ -64,18 +64,16 @@ describe('analyzeBookCharacter', () => { const input: BookCharacterTaskInput = { book_title: 'The Shadow of the Wind', }; - const { stream } = await analyzeBookCharacters(input, { - useCache: 'never', - }).stream(); + const { stream } = await analyzeBookCharacters(input).stream(); - const chunks: DeepPartial[] = []; + let lastChunk: RunStreamEvent | undefined; for await (const chunk of stream) { - if (chunk.output) { - chunks.push(chunk.output); - } + lastChunk = chunk; } - - expect(chunks.length).toBeGreaterThan(1); + console.log(lastChunk?.feedbackToken); + expect(lastChunk).toBeDefined(); + expect(lastChunk?.feedbackToken).toBeDefined(); + expect(lastChunk?.output).toBeDefined(); }, 30000); it('runs', async () => {