Initial commit
This commit is contained in:
271
templates/file-search.ts
Normal file
271
templates/file-search.ts
Normal file
@@ -0,0 +1,271 @@
|
||||
/**
|
||||
* File Search Example
|
||||
*
|
||||
* Demonstrates RAG (Retrieval-Augmented Generation) without building
|
||||
* your own vector store. OpenAI handles embeddings and search automatically.
|
||||
*/
|
||||
|
||||
import OpenAI from 'openai';
|
||||
import fs from 'fs';
|
||||
|
||||
const openai = new OpenAI({
|
||||
apiKey: process.env.OPENAI_API_KEY,
|
||||
});
|
||||
|
||||
async function basicFileSearch() {
|
||||
console.log('=== Basic File Search ===\n');
|
||||
|
||||
// 1. Upload file (one-time setup)
|
||||
const file = await openai.files.create({
|
||||
file: fs.createReadStream('./knowledge-base.pdf'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
console.log('File uploaded:', file.id);
|
||||
|
||||
// 2. Search file for information
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'What does the document say about pricing?',
|
||||
tools: [
|
||||
{
|
||||
type: 'file_search',
|
||||
file_ids: [file.id],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
console.log('Answer:', response.output_text);
|
||||
|
||||
// 3. Inspect search results
|
||||
response.output.forEach((item) => {
|
||||
if (item.type === 'file_search_call') {
|
||||
console.log('\nSearch query:', item.query);
|
||||
console.log('Relevant chunks:', item.results.length);
|
||||
|
||||
item.results.forEach((result, idx) => {
|
||||
console.log(`\nChunk ${idx + 1}:`);
|
||||
console.log('Text:', result.text.substring(0, 200) + '...');
|
||||
console.log('Score:', result.score);
|
||||
console.log('File:', result.file_id);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function multipleFileSearch() {
|
||||
console.log('=== Multiple File Search ===\n');
|
||||
|
||||
// Upload multiple files
|
||||
const file1 = await openai.files.create({
|
||||
file: fs.createReadStream('./product-guide.pdf'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
const file2 = await openai.files.create({
|
||||
file: fs.createReadStream('./pricing-doc.pdf'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
const file3 = await openai.files.create({
|
||||
file: fs.createReadStream('./faq.pdf'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
// Search across all files
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'What are the key features and how much does the premium plan cost?',
|
||||
tools: [
|
||||
{
|
||||
type: 'file_search',
|
||||
file_ids: [file1.id, file2.id, file3.id], // ✅ Multiple files
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
console.log('Answer (synthesized from all files):', response.output_text);
|
||||
}
|
||||
|
||||
async function conversationalFileSearch() {
|
||||
console.log('=== Conversational File Search ===\n');
|
||||
|
||||
// Upload knowledge base
|
||||
const file = await openai.files.create({
|
||||
file: fs.createReadStream('./company-handbook.pdf'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
// Create conversation
|
||||
const conv = await openai.conversations.create();
|
||||
|
||||
// First question
|
||||
const response1 = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
conversation: conv.id,
|
||||
input: 'What is the PTO policy?',
|
||||
tools: [{ type: 'file_search', file_ids: [file.id] }],
|
||||
});
|
||||
|
||||
console.log('Q1:', response1.output_text);
|
||||
|
||||
// Follow-up question (model remembers previous answer)
|
||||
const response2 = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
conversation: conv.id,
|
||||
input: 'How do I request it?',
|
||||
tools: [{ type: 'file_search', file_ids: [file.id] }],
|
||||
});
|
||||
|
||||
console.log('Q2:', response2.output_text);
|
||||
// Model knows "it" refers to PTO from previous turn
|
||||
}
|
||||
|
||||
async function fileSearchWithCitations() {
|
||||
console.log('=== File Search with Citations ===\n');
|
||||
|
||||
const file = await openai.files.create({
|
||||
file: fs.createReadStream('./research-paper.pdf'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Summarize the key findings and provide citations',
|
||||
tools: [{ type: 'file_search', file_ids: [file.id] }],
|
||||
});
|
||||
|
||||
console.log('Summary:', response.output_text);
|
||||
|
||||
// Extract citations
|
||||
response.output.forEach((item) => {
|
||||
if (item.type === 'file_search_call') {
|
||||
console.log('\nCitations:');
|
||||
item.results.forEach((result, idx) => {
|
||||
console.log(`[${idx + 1}] File: ${result.file_id}, Page: ${result.page || 'N/A'}`);
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function filterSearchResults() {
|
||||
console.log('=== Filter Search Results by Relevance ===\n');
|
||||
|
||||
const file = await openai.files.create({
|
||||
file: fs.createReadStream('./large-document.pdf'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Find all mentions of "quarterly revenue" in the document',
|
||||
tools: [{ type: 'file_search', file_ids: [file.id] }],
|
||||
});
|
||||
|
||||
// Filter high-confidence results
|
||||
response.output.forEach((item) => {
|
||||
if (item.type === 'file_search_call') {
|
||||
const highConfidence = item.results.filter((r) => r.score > 0.7);
|
||||
|
||||
console.log(`Found ${highConfidence.length} high-confidence matches:`);
|
||||
highConfidence.forEach((result) => {
|
||||
console.log('Text:', result.text);
|
||||
console.log('Score:', result.score);
|
||||
console.log('---');
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function supportedFileTypes() {
|
||||
console.log('=== Supported File Types ===\n');
|
||||
|
||||
// Upload different file types
|
||||
const pdfFile = await openai.files.create({
|
||||
file: fs.createReadStream('./document.pdf'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
const textFile = await openai.files.create({
|
||||
file: fs.createReadStream('./notes.txt'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
const markdownFile = await openai.files.create({
|
||||
file: fs.createReadStream('./README.md'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
const codeFile = await openai.files.create({
|
||||
file: fs.createReadStream('./main.ts'),
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
// Search across different file types
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Find information about the authentication system',
|
||||
tools: [
|
||||
{
|
||||
type: 'file_search',
|
||||
file_ids: [pdfFile.id, textFile.id, markdownFile.id, codeFile.id],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
console.log('Answer:', response.output_text);
|
||||
}
|
||||
|
||||
async function handleFileSearchErrors() {
|
||||
console.log('=== Error Handling ===\n');
|
||||
|
||||
try {
|
||||
const response = await openai.responses.create({
|
||||
model: 'gpt-5',
|
||||
input: 'Search for information',
|
||||
tools: [
|
||||
{
|
||||
type: 'file_search',
|
||||
file_ids: ['file_invalid'], // ❌ Invalid file ID
|
||||
},
|
||||
],
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.type === 'invalid_request_error') {
|
||||
console.error('File not found. Upload file first.');
|
||||
} else {
|
||||
console.error('Error:', error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function listUploadedFiles() {
|
||||
console.log('=== List Uploaded Files ===\n');
|
||||
|
||||
const files = await openai.files.list({
|
||||
purpose: 'assistants',
|
||||
});
|
||||
|
||||
console.log(`Found ${files.data.length} files:`);
|
||||
files.data.forEach((file) => {
|
||||
console.log('ID:', file.id);
|
||||
console.log('Filename:', file.filename);
|
||||
console.log('Size:', file.bytes, 'bytes');
|
||||
console.log('Created:', new Date(file.created_at * 1000));
|
||||
console.log('---');
|
||||
});
|
||||
}
|
||||
|
||||
async function deleteFile(fileId: string) {
|
||||
// Delete file (cleanup)
|
||||
await openai.files.delete(fileId);
|
||||
console.log('File deleted:', fileId);
|
||||
}
|
||||
|
||||
// Run examples
|
||||
// basicFileSearch();
|
||||
// multipleFileSearch();
|
||||
// conversationalFileSearch();
|
||||
// fileSearchWithCitations();
|
||||
// filterSearchResults();
|
||||
// listUploadedFiles();
|
||||
Reference in New Issue
Block a user