Skip to content

Commit

Permalink
feat: new package generate-object
Browse files Browse the repository at this point in the history
  • Loading branch information
kwaa committed Nov 25, 2024
1 parent c5d3e26 commit 53f277d
Show file tree
Hide file tree
Showing 14 changed files with 188 additions and 46 deletions.
2 changes: 1 addition & 1 deletion packages/embed/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@
"test:watch": "vitest"
},
"dependencies": {
"@xsai/shared": "workspace:^"
"@xsai/shared": "workspace:"
}
}
40 changes: 40 additions & 0 deletions packages/generate-object/package.json
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions packages/generate-object/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { generateObject, generateObject as default, type GenerateObjectOptions, type GenerateObjectResult } from './utils/generate-object'
43 changes: 43 additions & 0 deletions packages/generate-object/src/utils/generate-object.ts
Original file line number Diff line number Diff line change
@@ -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,
}))
28 changes: 28 additions & 0 deletions packages/generate-object/test/index.test.ts
Original file line number Diff line number Diff line change
@@ -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 changes: 4 additions & 0 deletions packages/generate-object/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"extends": "@importantimport/tsconfig/app.json",
"include": ["src"]
}
2 changes: 1 addition & 1 deletion packages/generate-text/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@
"test:watch": "vitest"
},
"dependencies": {
"@xsai/shared": "workspace:^"
"@xsai/shared": "workspace:"
}
}
2 changes: 1 addition & 1 deletion packages/shared/src/utils/clean.ts
Original file line number Diff line number Diff line change
@@ -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>>
4 changes: 2 additions & 2 deletions packages/stream-text/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"test:watch": "vitest"
},
"dependencies": {
"@xsai/generate-text": "workspace:^",
"@xsai/shared": "workspace:^"
"@xsai/generate-text": "workspace:",
"@xsai/shared": "workspace:"
}
}
12 changes: 6 additions & 6 deletions packages/tool/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
8 changes: 4 additions & 4 deletions packages/xsai/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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:"
}
}
81 changes: 50 additions & 31 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions pnpm-workspace.yaml
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -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" },
Expand Down

0 comments on commit 53f277d

Please sign in to comment.