From 53f277daa8a06dde18d91f7730352b69fd403de8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=97=8D+85CD?= <50108258+kwaa@users.noreply.github.com> Date: Mon, 25 Nov 2024 14:36:07 +0800 Subject: [PATCH] feat: new package `generate-object` --- packages/embed/package.json | 2 +- packages/generate-object/package.json | 40 +++++++++ packages/generate-object/src/index.ts | 1 + .../src/utils/generate-object.ts | 43 ++++++++++ packages/generate-object/test/index.test.ts | 28 +++++++ packages/generate-object/tsconfig.json | 4 + packages/generate-text/package.json | 2 +- packages/shared/src/utils/clean.ts | 2 +- packages/stream-text/package.json | 4 +- packages/tool/package.json | 12 +-- packages/xsai/package.json | 8 +- pnpm-lock.yaml | 81 ++++++++++++------- pnpm-workspace.yaml | 6 ++ tsconfig.json | 1 + 14 files changed, 188 insertions(+), 46 deletions(-) create mode 100644 packages/generate-object/package.json create mode 100644 packages/generate-object/src/index.ts create mode 100644 packages/generate-object/src/utils/generate-object.ts create mode 100644 packages/generate-object/test/index.test.ts create mode 100644 packages/generate-object/tsconfig.json diff --git a/packages/embed/package.json b/packages/embed/package.json index 9c475d2..5f96c75 100644 --- a/packages/embed/package.json +++ b/packages/embed/package.json @@ -29,6 +29,6 @@ "test:watch": "vitest" }, "dependencies": { - "@xsai/shared": "workspace:^" + "@xsai/shared": "workspace:" } } diff --git a/packages/generate-object/package.json b/packages/generate-object/package.json new file mode 100644 index 0000000..613d956 --- /dev/null +++ b/packages/generate-object/package.json @@ -0,0 +1,40 @@ +{ + "name": "@xsai/generate-object", + "version": "0.0.10", + "type": "module", + "author": "藍+85CD", + "license": "MIT", + "homepage": "https://github.com/moeru-ai/xsai", + "repository": { + "type": "git", + "url": "git+https://github.com/moeru-ai/xsai.git", + "directory": "packages/generate-object" + }, + "bugs": "https://github.com/moeru-ai/xsai/issues", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "pkgroll", + "build:watch": "pkgroll --watch", + "test": "vitest run", + "test:watch": "vitest" + }, + "dependencies": { + "@typeschema/main": "catalog:", + "@xsai/generate-text": "workspace:", + "@xsai/shared": "workspace:" + }, + "devDependencies": { + "@gcornut/valibot-json-schema": "catalog:", + "valibot": "catalog:" + } +} diff --git a/packages/generate-object/src/index.ts b/packages/generate-object/src/index.ts new file mode 100644 index 0000000..7cbf9e5 --- /dev/null +++ b/packages/generate-object/src/index.ts @@ -0,0 +1 @@ +export { generateObject, generateObject as default, type GenerateObjectOptions, type GenerateObjectResult } from './utils/generate-object' diff --git a/packages/generate-object/src/utils/generate-object.ts b/packages/generate-object/src/utils/generate-object.ts new file mode 100644 index 0000000..12d2894 --- /dev/null +++ b/packages/generate-object/src/utils/generate-object.ts @@ -0,0 +1,43 @@ +import { type Infer, type Schema, toJSONSchema } from '@typeschema/main' +import { generateText, type GenerateTextOptions, type GenerateTextResult } from '@xsai/generate-text' +import { clean } from '@xsai/shared' + +export interface GenerateObjectOptions extends GenerateTextOptions { + schema: T + schemaDescription?: string + schemaName?: string +} + +export interface GenerateObjectResult extends Omit { + object: Infer +} + +/** + * @experimental + * WIP, test failed + */ +export const generateObject = async (options: GenerateObjectOptions): Promise> => + await generateText(clean({ + ...options, + responseFormat: { + jsonSchema: { + description: options.schemaDescription, + name: options.schemaName ?? 'json_schema', + schema: await toJSONSchema(options.schema) + .then(json => clean({ + ...json, + $schema: undefined, + })), + strict: true, + }, + type: 'json_schema', + }, + schema: undefined, + schemaDescription: undefined, + schemaName: undefined, + })) + .then(({ finishReason, text, usage }) => ({ + finishReason, + object: JSON.parse(text), + usage, + })) diff --git a/packages/generate-object/test/index.test.ts b/packages/generate-object/test/index.test.ts new file mode 100644 index 0000000..1ae5ba8 --- /dev/null +++ b/packages/generate-object/test/index.test.ts @@ -0,0 +1,28 @@ +import { object as schemaObject, string } from 'valibot' +import { describe, expect, it } from 'vitest' + +import { generateObject } from '../src' + +describe('@xsai/generate-object', () => { + it('basic', async () => { + const { object } = await generateObject({ + messages: [ + { + content: 'You are a helpful assistant.', + role: 'system', + }, + { + content: 'This is a test, so please answer \'YES\' and nothing else.', + role: 'user', + }, + ], + model: 'llama3.2', + schema: schemaObject({ + anwser: string(), + }), + }) + + console.log('object:', object) + expect(object.anwser).toStrictEqual('YES') + }) +}) diff --git a/packages/generate-object/tsconfig.json b/packages/generate-object/tsconfig.json new file mode 100644 index 0000000..c22e8ff --- /dev/null +++ b/packages/generate-object/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "@importantimport/tsconfig/app.json", + "include": ["src"] +} diff --git a/packages/generate-text/package.json b/packages/generate-text/package.json index ce16216..12d4143 100644 --- a/packages/generate-text/package.json +++ b/packages/generate-text/package.json @@ -29,6 +29,6 @@ "test:watch": "vitest" }, "dependencies": { - "@xsai/shared": "workspace:^" + "@xsai/shared": "workspace:" } } diff --git a/packages/shared/src/utils/clean.ts b/packages/shared/src/utils/clean.ts index e895e3e..9ed8d40 100644 --- a/packages/shared/src/utils/clean.ts +++ b/packages/shared/src/utils/clean.ts @@ -1 +1 @@ -export const clean = (record: Record) => Object.fromEntries(Object.entries(record).filter(([, v]) => !!v)) +export const clean = = Record>(record: T) => Object.fromEntries(Object.entries(record).filter(([, v]) => !!v)) as Record> diff --git a/packages/stream-text/package.json b/packages/stream-text/package.json index 6af0d99..e1bfde4 100644 --- a/packages/stream-text/package.json +++ b/packages/stream-text/package.json @@ -29,7 +29,7 @@ "test:watch": "vitest" }, "dependencies": { - "@xsai/generate-text": "workspace:^", - "@xsai/shared": "workspace:^" + "@xsai/generate-text": "workspace:", + "@xsai/shared": "workspace:" } } diff --git a/packages/tool/package.json b/packages/tool/package.json index 73c5b69..96a4824 100644 --- a/packages/tool/package.json +++ b/packages/tool/package.json @@ -32,16 +32,16 @@ "test:watch": "vitest" }, "dependencies": { - "@typeschema/main": "^0.14.1", - "@xsai/shared": "workspace:^" + "@typeschema/main": "catalog:", + "@xsai/shared": "workspace:" }, "devDependencies": { - "@gcornut/valibot-json-schema": "^0.42.0", - "@xsai/generate-text": "workspace:^", - "valibot": "1.0.0-beta.8" + "@gcornut/valibot-json-schema": "catalog:", + "@xsai/generate-text": "workspace:", + "valibot": "catalog:" }, "peerDependencies": { - "@xsai/generate-text": "workspace:^" + "@xsai/generate-text": "workspace:" }, "peerDependenciesMeta": { "@xsai/generate-text": { diff --git a/packages/xsai/package.json b/packages/xsai/package.json index 2c71883..f2788a0 100644 --- a/packages/xsai/package.json +++ b/packages/xsai/package.json @@ -27,9 +27,9 @@ "build:watch": "pkgroll --watch" }, "dependencies": { - "@xsai/embed": "workspace:^", - "@xsai/generate-text": "workspace:^", - "@xsai/stream-text": "workspace:^", - "@xsai/tool": "workspace:^" + "@xsai/embed": "workspace:", + "@xsai/generate-text": "workspace:", + "@xsai/stream-text": "workspace:", + "@xsai/tool": "workspace:" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2093747..f14bbe6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,18 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + '@gcornut/valibot-json-schema': + specifier: ^0.42.0 + version: 0.42.0 + '@typeschema/main': + specifier: ^0.14.1 + version: 0.14.1 + valibot: + specifier: ^0.42.1 + version: 0.42.1 + importers: .: @@ -45,13 +57,32 @@ importers: packages/embed: dependencies: '@xsai/shared': - specifier: workspace:^ + specifier: 'workspace:' version: link:../shared + packages/generate-object: + dependencies: + '@typeschema/main': + specifier: 'catalog:' + version: 0.14.1(@types/json-schema@7.0.15)(@typeschema/valibot@0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.23.1)(typescript@5.6.3))(@types/json-schema@7.0.15)(valibot@0.42.1(typescript@5.6.3))) + '@xsai/generate-text': + specifier: 'workspace:' + version: link:../generate-text + '@xsai/shared': + specifier: 'workspace:' + version: link:../shared + devDependencies: + '@gcornut/valibot-json-schema': + specifier: 'catalog:' + version: 0.42.0(esbuild@0.23.1)(typescript@5.6.3) + valibot: + specifier: 'catalog:' + version: 0.42.1(typescript@5.6.3) + packages/generate-text: dependencies: '@xsai/shared': - specifier: workspace:^ + specifier: 'workspace:' version: link:../shared packages/shared: {} @@ -59,44 +90,44 @@ importers: packages/stream-text: dependencies: '@xsai/generate-text': - specifier: workspace:^ + specifier: 'workspace:' version: link:../generate-text '@xsai/shared': - specifier: workspace:^ + specifier: 'workspace:' version: link:../shared packages/tool: dependencies: '@typeschema/main': - specifier: ^0.14.1 - version: 0.14.1(@types/json-schema@7.0.15)(@typeschema/valibot@0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.23.1)(typescript@5.6.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.8(typescript@5.6.3))) + specifier: 'catalog:' + version: 0.14.1(@types/json-schema@7.0.15)(@typeschema/valibot@0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.23.1)(typescript@5.6.3))(@types/json-schema@7.0.15)(valibot@0.42.1(typescript@5.6.3))) '@xsai/shared': - specifier: workspace:^ + specifier: 'workspace:' version: link:../shared devDependencies: '@gcornut/valibot-json-schema': - specifier: ^0.42.0 + specifier: 'catalog:' version: 0.42.0(esbuild@0.23.1)(typescript@5.6.3) '@xsai/generate-text': - specifier: workspace:^ + specifier: 'workspace:' version: link:../generate-text valibot: - specifier: 1.0.0-beta.8 - version: 1.0.0-beta.8(typescript@5.6.3) + specifier: 'catalog:' + version: 0.42.1(typescript@5.6.3) packages/xsai: dependencies: '@xsai/embed': - specifier: workspace:^ + specifier: 'workspace:' version: link:../embed '@xsai/generate-text': - specifier: workspace:^ + specifier: 'workspace:' version: link:../generate-text '@xsai/stream-text': - specifier: workspace:^ + specifier: 'workspace:' version: link:../stream-text '@xsai/tool': - specifier: workspace:^ + specifier: 'workspace:' version: link:../tool packages: @@ -2678,14 +2709,6 @@ packages: typescript: optional: true - valibot@1.0.0-beta.8: - resolution: {integrity: sha512-OPAwJZtowb0j91b+bd77+ny7D1VVzsCzD7Jl9waLUlMprTsfI9Y3HHbW3hAQD7wKDKHsmGEesuiYWaYvcZL2wg==} - peerDependencies: - typescript: '>=5' - peerDependenciesMeta: - typescript: - optional: true - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -3504,20 +3527,20 @@ snapshots: optionalDependencies: '@types/json-schema': 7.0.15 - '@typeschema/main@0.14.1(@types/json-schema@7.0.15)(@typeschema/valibot@0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.23.1)(typescript@5.6.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.8(typescript@5.6.3)))': + '@typeschema/main@0.14.1(@types/json-schema@7.0.15)(@typeschema/valibot@0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.23.1)(typescript@5.6.3))(@types/json-schema@7.0.15)(valibot@0.42.1(typescript@5.6.3)))': dependencies: '@typeschema/core': 0.14.0(@types/json-schema@7.0.15) optionalDependencies: - '@typeschema/valibot': 0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.23.1)(typescript@5.6.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.8(typescript@5.6.3)) + '@typeschema/valibot': 0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.23.1)(typescript@5.6.3))(@types/json-schema@7.0.15)(valibot@0.42.1(typescript@5.6.3)) transitivePeerDependencies: - '@types/json-schema' - '@typeschema/valibot@0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.23.1)(typescript@5.6.3))(@types/json-schema@7.0.15)(valibot@1.0.0-beta.8(typescript@5.6.3))': + '@typeschema/valibot@0.14.0(@gcornut/valibot-json-schema@0.42.0(esbuild@0.23.1)(typescript@5.6.3))(@types/json-schema@7.0.15)(valibot@0.42.1(typescript@5.6.3))': dependencies: '@typeschema/core': 0.14.0(@types/json-schema@7.0.15) optionalDependencies: '@gcornut/valibot-json-schema': 0.42.0(esbuild@0.23.1)(typescript@5.6.3) - valibot: 1.0.0-beta.8(typescript@5.6.3) + valibot: 0.42.1(typescript@5.6.3) transitivePeerDependencies: - '@types/json-schema' optional: true @@ -5475,10 +5498,6 @@ snapshots: optionalDependencies: typescript: 5.6.3 - valibot@1.0.0-beta.8(typescript@5.6.3): - optionalDependencies: - typescript: 5.6.3 - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 196993a..448566a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,9 @@ packages: - docs - packages/* + +catalog: + '@typeschema/main': ^0.14.1 + + '@gcornut/valibot-json-schema': ^0.42.0 + valibot: ^0.42.1 diff --git a/tsconfig.json b/tsconfig.json index e97adc2..a183ce3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "references": [ { "path": "./packages/embed/tsconfig.json" }, + { "path": "./packages/generate-object/tsconfig.json" }, { "path": "./packages/generate-text/tsconfig.json" }, { "path": "./packages/shared/tsconfig.json" }, { "path": "./packages/stream-text/tsconfig.json" },