// Copyright (c) Microsoft. All rights reserved. // This sample shows how to use Code Interpreter Tool with AIProjectClient.AsAIAgent(...). using System.Text; using Azure.AI.Projects; using Azure.Identity; using Microsoft.Agents.AI; using Microsoft.Extensions.AI; using OpenAI.Assistants; const string AgentInstructions = "You are a personal math tutor. When asked a math question, write and run code using the python tool to answer the question."; const string AgentName = "CoderAgent-RAPI"; 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"; // 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()); AIAgent agent = aiProjectClient.AsAIAgent( deploymentName, instructions: AgentInstructions, name: AgentName, tools: [new HostedCodeInterpreterTool() { Inputs = [] }]); AgentResponse response = await agent.RunAsync("I need to solve the equation sin(x) + x^2 = 42"); // Get the CodeInterpreterToolCallContent CodeInterpreterToolCallContent? toolCallContent = response.Messages.SelectMany(m => m.Contents).OfType().FirstOrDefault(); if (toolCallContent?.Inputs is not null) { DataContent? codeInput = toolCallContent.Inputs.OfType().FirstOrDefault(); if (codeInput?.HasTopLevelMediaType("text") ?? false) { Console.WriteLine($"Code Input: {Encoding.UTF8.GetString(codeInput.Data.ToArray()) ?? "Not available"}"); } } // Get the CodeInterpreterToolResultContent CodeInterpreterToolResultContent? toolResultContent = response.Messages.SelectMany(m => m.Contents).OfType().FirstOrDefault(); if (toolResultContent?.Outputs is not null && toolResultContent.Outputs.OfType().FirstOrDefault() is { } resultOutput) { Console.WriteLine($"Code Tool Result: {resultOutput.Text}"); } // Getting any 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 Id: {{citationAnnotation.OutputFileId}} Text to Replace: {{citationAnnotation.TextToReplace}} Filename: {{Path.GetFileName(citationAnnotation.TextToReplace)}} """); } }