Skip to content
Merged
3 changes: 1 addition & 2 deletions package.json
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,13 +38,12 @@
"@modelcontextprotocol/sdk": "catalog:prod",
"@orama/orama": "catalog:prod",
"defu": "catalog:prod",
"json-schema": "catalog:prod",
"zod": "catalog:dev"
},
"devDependencies": {
"@ai-sdk/provider": "catalog:dev",
"@ai-sdk/provider-utils": "catalog:dev",
"@hono/mcp": "catalog:dev",
"@types/json-schema": "catalog:dev",
"@types/node": "catalog:dev",
"@typescript/native-preview": "catalog:dev",
"@vitest/coverage-v8": "catalog:dev",
Expand Down
76 changes: 31 additions & 45 deletions pnpm-lock.yaml

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

5 changes: 2 additions & 3 deletions pnpm-workspace.yaml
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,10 +7,10 @@ catalogMode: strict
catalogs:
dev:
'@ai-sdk/openai': ^2.0.80
'@clack/prompts': ^0.11.0
'@ai-sdk/provider': ^2.0.0
'@ai-sdk/provider-utils': ^3.0.18
'@clack/prompts': ^0.11.0
'@hono/mcp': ^0.1.4
'@types/json-schema': ^7.0.15
'@types/node': ^22.13.5
'@typescript/native-preview': ^7.0.0-dev.20251209.1
'@vitest/coverage-v8': ^4.0.15
Expand All@@ -35,7 +35,6 @@ catalogs:
'@modelcontextprotocol/sdk': ^1.24.3
'@orama/orama': ^3.1.11
defu: ^6.1.4
json-schema: ^0.4.0

enablePrePostScripts: true

Expand Down
21 changes: 12 additions & 9 deletions src/tool.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
import { jsonSchema } from 'ai';
import type { JSONSchema7 } from 'json-schema';
import { BaseTool, type MetaToolSearchResult, StackOneTool, Tools } from './tool';
import { type ExecuteConfig, ParameterLocation, type ToolParameters } from './types';
import {
type ExecuteConfig,
type JSONSchema,
ParameterLocation,
type ToolParameters,
} from './types';
import { StackOneAPIError } from './utils/errors';

// Create a mock tool for testing
Expand DownExpand Up@@ -1107,11 +1111,10 @@ describe('Schema Validation', () => {
);

const parameters = tool.toOpenAI().function.parameters;
expect(parameters).toBeDefined();
const properties = parameters?.properties as Record<string, JSONSchema7>;
const properties = parameters?.properties as Record<string, JSONSchema>;

expect(properties.arrayWithItems.items).toBeDefined();
expect((properties.arrayWithItems.items as JSONSchema7).type).toBe('number');
expect((properties.arrayWithItems.items as JSONSchema).type).toBe('number');
});

it('should handle nested object structure', () => {
Expand DownExpand Up@@ -1144,7 +1147,7 @@ describe('Schema Validation', () => {

const parameters = tool.toOpenAI().function.parameters;
expect(parameters).toBeDefined();
const properties = parameters?.properties as Record<string, JSONSchema7>;
const properties = parameters?.properties as Record<string, JSONSchema>;
const nestedObject = properties.nestedObject;

expect(nestedObject.type).toBe('object');
Expand DownExpand Up@@ -1185,7 +1188,7 @@ describe('Schema Validation', () => {
// @ts-ignore - jsonSchema is available on Schema wrapper from ai sdk
const arrayWithItems = toolObj.inputSchema.jsonSchema.properties?.arrayWithItems;
expect(arrayWithItems?.type).toBe('array');
expect((arrayWithItems?.items as JSONSchema7)?.type).toBe('string');
expect((arrayWithItems?.items as JSONSchema)?.type).toBe('string');
});

it('should handle nested filter object for AI SDK', async () => {
Expand DownExpand Up@@ -1220,14 +1223,14 @@ describe('Schema Validation', () => {

const parameters = tool.toOpenAI().function.parameters;
expect(parameters).toBeDefined();
const aiSchema = jsonSchema(parameters as JSONSchema7);
const aiSchema = jsonSchema(parameters as JSONSchema);
expect(aiSchema).toBeDefined();

const aiSdkTool = await tool.toAISDK();
// TODO: Remove ts-ignore once AISDKToolDefinition properly types inputSchema.jsonSchema
// @ts-ignore - jsonSchema is available on Schema wrapper from ai sdk
const filterProp = aiSdkTool[tool.name].inputSchema.jsonSchema.properties?.filter as
| (JSONSchema7 & { properties: Record<string, JSONSchema7> })
| (JSONSchema & { properties: Record<string, JSONSchema> })
| undefined;

expect(filterProp?.type).toBe('object');
Expand Down
Loading
Loading