@ai-sdk/openai
Version:
The **[OpenAI provider](https://ai-sdk.dev/providers/ai-sdk-providers/openai)** for the [AI SDK](https://ai-sdk.dev/docs) contains language model support for the OpenAI chat and completion APIs and embedding model support for the OpenAI embeddings API.
146 lines (131 loc) • 3.65 kB
text/typescript
import {
createProviderToolFactoryWithOutputSchema,
lazySchema,
zodSchema,
} from '@ai-sdk/provider-utils';
import { z } from 'zod/v4';
import {
OpenAIResponsesFileSearchToolComparisonFilter,
OpenAIResponsesFileSearchToolCompoundFilter,
} from '../responses/openai-responses-api';
const comparisonFilterSchema = z.object({
key: z.string(),
type: z.enum(['eq', 'ne', 'gt', 'gte', 'lt', 'lte', 'in', 'nin']),
value: z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]),
});
const compoundFilterSchema: z.ZodType<any> = z.object({
type: z.enum(['and', 'or']),
filters: z.array(
z.union([comparisonFilterSchema, z.lazy(() => compoundFilterSchema)]),
),
});
export const fileSearchArgsSchema = lazySchema(() =>
zodSchema(
z.object({
vectorStoreIds: z.array(z.string()),
maxNumResults: z.number().optional(),
ranking: z
.object({
ranker: z.string().optional(),
scoreThreshold: z.number().optional(),
})
.optional(),
filters: z
.union([comparisonFilterSchema, compoundFilterSchema])
.optional(),
}),
),
);
export const fileSearchOutputSchema = lazySchema(() =>
zodSchema(
z.object({
queries: z.array(z.string()),
results: z
.array(
z.object({
attributes: z.record(z.string(), z.unknown()),
fileId: z.string(),
filename: z.string(),
score: z.number(),
text: z.string(),
}),
)
.nullable(),
}),
),
);
export const fileSearch = createProviderToolFactoryWithOutputSchema<
{},
{
/**
* The search query to execute.
*/
queries: string[];
/**
* The results of the file search tool call.
*/
results:
| null
| {
/**
* Set of 16 key-value pairs that can be attached to an object.
* This can be useful for storing additional information about the object
* in a structured format, and querying for objects via API or the dashboard.
* Keys are strings with a maximum length of 64 characters.
* Values are strings with a maximum length of 512 characters, booleans, or numbers.
*/
attributes: Record<string, unknown>;
/**
* The unique ID of the file.
*/
fileId: string;
/**
* The name of the file.
*/
filename: string;
/**
* The relevance score of the file - a value between 0 and 1.
*/
score: number;
/**
* The text that was retrieved from the file.
*/
text: string;
}[];
},
{
/**
* List of vector store IDs to search through.
*/
vectorStoreIds: string[];
/**
* Maximum number of search results to return. Defaults to 10.
*/
maxNumResults?: number;
/**
* Ranking options for the search.
*/
ranking?: {
/**
* The ranker to use for the file search.
*/
ranker?: string;
/**
* The score threshold for the file search, a number between 0 and 1.
* Numbers closer to 1 will attempt to return only the most relevant results,
* but may return fewer results.
*/
scoreThreshold?: number;
};
/**
* A filter to apply.
*/
filters?:
| OpenAIResponsesFileSearchToolComparisonFilter
| OpenAIResponsesFileSearchToolCompoundFilter;
}
>({
id: 'openai.file_search',
inputSchema: z.object({}),
outputSchema: fileSearchOutputSchema,
});