feat: new package generate-object

This commit is contained in:
藍+85CD committed 2024-11-25 14:36:07 +08:00
1 parent c5d3e2639b
commit 53f277daa8
14 files changed
+188 -46

No files matched your search

+1 -1
View File
@@ -29,6 +29,6 @@
"test:watch": "vitest"
},
"dependencies": {
"@xsai/shared": "workspace:^"
"@xsai/shared": "workspace:"
}
}
+40
View File
@@ -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:"
}
}
+1
View File
@@ -0,0 +1 @@
export { generateObject, generateObject as default, type GenerateObjectOptions, type GenerateObjectResult } from './utils/generate-object'
@@ -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<T extends Schema> extends GenerateTextOptions {
schema: T
schemaDescription?: string
schemaName?: string
}
export interface GenerateObjectResult<T extends Schema> extends Omit<GenerateTextResult, 'text'> {
object: Infer<T>
}
/**
* @experimental
* WIP, test failed
*/
export const generateObject = async <T extends Schema>(options: GenerateObjectOptions<T>): Promise<GenerateObjectResult<T>> =>
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,
}))
@@ -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')
})
})
+4
View File
@@ -0,0 +1,4 @@
{
"extends": "@importantimport/tsconfig/app.json",
"include": ["src"]
}
+1 -1
View File
@@ -29,6 +29,6 @@
"test:watch": "vitest"
},
"dependencies": {
"@xsai/shared": "workspace:^"
"@xsai/shared": "workspace:"
}
}
+1 -1
View File
@@ -1 +1 @@
export const clean = (record: Record<string, undefined | unknown>) => Object.fromEntries(Object.entries(record).filter(([, v]) => !!v))
export const clean = <T extends Record<string, undefined | unknown> = Record<string, undefined | unknown>>(record: T) => Object.fromEntries(Object.entries(record).filter(([, v]) => !!v)) as Record<keyof T, Exclude<T[keyof T], unknown>>
+2 -2
View File
@@ -29,7 +29,7 @@
"test:watch": "vitest"
},
"dependencies": {
"@xsai/generate-text": "workspace:^",
"@xsai/shared": "workspace:^"
"@xsai/generate-text": "workspace:",
"@xsai/shared": "workspace:"
}
}
+6 -6
View File
@@ -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": {
+4 -4
View File
@@ -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:"
}
}
+50 -31
View File
@@ -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
+6
View File
@@ -1,3 +1,9 @@
packages:
- docs
- packages/*
catalog:
'@typeschema/main': ^0.14.1
'@gcornut/valibot-json-schema': ^0.42.0
valibot: ^0.42.1
+1
View File
@@ -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" },