// Copyright (c) Microsoft. All rights reserved. // This sample shows how to use File Search Tool with a ChatClientAgent. using Azure.AI.Projects; using Azure.Identity; using Microsoft.Agents.AI; using Microsoft.Extensions.AI; using OpenAI.Assistants; using OpenAI.Files; string endpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT") ?? throw new InvalidOperationException("AZURE_AI_PROJECT_ENDPOINT is not set."); string deploymentName = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-5.4-mini"; const string AgentInstructions = "You are a helpful assistant that can search through uploaded files to answer questions."; // We need the AIProjectClient to upload files and create vector stores. // WARNING: DefaultAzureCredential is convenient for development but requires careful consideration in production. // In production, consider using a specific credential (e.g., ManagedIdentityCredential) to avoid // latency issues, unintended credential probing, and potential security risks from fallback mechanisms. AIProjectClient aiProjectClient = new(new Uri(endpoint), new DefaultAzureCredential()); var projectOpenAIClient = aiProjectClient.GetProjectOpenAIClient(); var filesClient = projectOpenAIClient.GetProjectFilesClient(); var vectorStoresClient = projectOpenAIClient.GetProjectVectorStoresClient(); // 1. Create a temp file with test content and upload it. string searchFilePath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + "_lookup.txt"); File.WriteAllText( path: searchFilePath, contents: """ Employee Directory: - Alice Johnson, 28 years old, Software Engineer, Engineering Department - Bob Smith, 35 years old, Sales Manager, Sales Department - Carol Williams, 42 years old, HR Director, Human Resources Department - David Brown, 31 years old, Customer Support Lead, Support Department """ ); Console.WriteLine($"Uploading file: {searchFilePath}"); OpenAIFile uploadedFile = filesClient.UploadFile( filePath: searchFilePath, purpose: FileUploadPurpose.Assistants ); Console.WriteLine($"Uploaded file, file ID: {uploadedFile.Id}"); // 2. Create a vector store with the uploaded file. var vectorStoreResult = await vectorStoresClient.CreateVectorStoreAsync( options: new() { FileIds = { uploadedFile.Id }, Name = "EmployeeDirectory_VectorStore" } ); string vectorStoreId = vectorStoreResult.Value.Id; Console.WriteLine($"Created vector store, vector store ID: {vectorStoreId}"); // Create a AIAgent with HostedFileSearchTool. AIAgent agent = aiProjectClient.AsAIAgent(deploymentName, instructions: AgentInstructions, name: "FileSearchAgent-RAPI", tools: [new HostedFileSearchTool() { Inputs = [new HostedVectorStoreContent(vectorStoreId)] }]); // Run the agent Console.WriteLine("\n--- Running File Search Agent ---"); AgentResponse response = await agent.RunAsync("Who is the youngest employee?"); Console.WriteLine($"Response: {response}"); // Getting any file citation annotations generated by the tool foreach (AIAnnotation annotation in response.Messages.SelectMany(m => m.Contents).SelectMany(c => c.Annotations ?? [])) { if (annotation.RawRepresentation is TextAnnotationUpdate citationAnnotation) { Console.WriteLine($$""" File Citation: File Id: {{citationAnnotation.OutputFileId}} Text to Replace: {{citationAnnotation.TextToReplace}} """); } } // Cleanup file resources. Console.WriteLine("\n--- Cleanup ---"); await vectorStoresClient.DeleteVectorStoreAsync(vectorStoreId); await filesClient.DeleteFileAsync(uploadedFile.Id); File.Delete(searchFilePath); Console.WriteLine("Cleanup completed successfully.");