Chapi Assistant integrates AI capabilities powered by Microsoft.Extensions.AI to provide intelligent assistance throughout your development workflow. Get AI-generated commit messages, SQL queries, and conversational help.
AI features use the IChatClient interface from Microsoft.Extensions.AI, supporting multiple AI providers including Gemini.
Generate meaningful commit messages based on your code changes:
var result = await generateCommitMessageUseCase.ExecuteAsync( diffContent: gitDiffOutput);if (result.IsSuccess){ string message = result.Value; // Example: "Add customer validation and update repository interface"}
Basic Usage
With Validation
Custom Prompts
Generate a commit message from staged changes:
// 1. Get the diff of staged changesvar diff = await gitRepository.GetStagedDiffAsync(projectPath);// 2. Generate commit messagevar result = await generateCommitMessageUseCase.ExecuteAsync(diff);if (result.IsSuccess){ // 3. Use the generated message var commitRequest = new CommitRequest { ProjectPath = projectPath, Message = result.Value, Files = stagedFiles }; await commitChangesUseCase.ExecuteAsync(commitRequest);}
Handle edge cases and validation:
if (string.IsNullOrWhiteSpace(diffContent)){ // No changes to commit Console.WriteLine("No changes detected"); return;}var result = await generateCommitMessageUseCase.ExecuteAsync( diffContent);if (!result.IsSuccess){ // Possible errors: // - "No hay cambios para generar mensaje" // - "No se pudo generar el mensaje de commit" // - AI service errors Console.WriteLine($"Error: {result.Error}");}
The use case uses optimized prompts for commit messages:
// Internal implementation uses:var prompt = GetPrompt.GitCommit(diffContent);// The prompt analyzes:// - Added/modified/deleted files// - Code changes and their impact// - Semantic meaning of changes// - Conventional commit format
var result = await generateSqlQueryUseCase.ExecuteAsync( description: "Get all active customers who made purchases in the last 30 days", schema: customerSchema, netParams: "@Days int = 30");if (result.IsSuccess){ string sqlQuery = result.Value; // Generated SQL ready to use}
Basic Query
With Schema Context
With .NET Parameters
Complex Queries
Generate a simple query:
var result = await generateSqlQueryUseCase.ExecuteAsync( description: "Select all customers ordered by name");// Output:// SELECT * FROM Customers ORDER BY Name;
Provide database schema for better results:
var schema = @" Customers (Id, Name, Email, IsActive, CreatedDate) Orders (Id, CustomerId, OrderDate, TotalAmount) OrderItems (Id, OrderId, ProductId, Quantity, Price)";var result = await generateSqlQueryUseCase.ExecuteAsync( description: "Get customers with their total order count and sum", schema: schema);// Output: Contextually accurate JOIN query
Include .NET parameter definitions:
var result = await generateSqlQueryUseCase.ExecuteAsync( description: "Find customers by email pattern", schema: "Customers (Id, Name, Email)", netParams: "@EmailPattern varchar(255)");// Output: Query using @EmailPattern
Generate complex analytical queries:
var schema = @" Customers (Id, Name, Email, Region) Orders (Id, CustomerId, OrderDate, TotalAmount) Products (Id, Name, Category)";var result = await generateSqlQueryUseCase.ExecuteAsync( description: @"Show monthly revenue by region with year-over-year comparison for 2024", schema: schema);// Output: Complex query with window functions, CTEs, etc.
if (!result.IsSuccess){ switch (result.Error) { case "La descripción de la consulta no puede estar vacía": // Empty description break; case "No se pudo generar la consulta SQL": // AI generation failed break; default: // Other errors (network, AI service, etc.) Console.WriteLine($"Error: {result.Error}"); break; }}
Get contextual help and answers during development:
var result = await sendChatMessageUseCase.ExecuteAsync( userMessage: "How do I implement repository pattern in this project?", context: projectStructureInfo);if (result.IsSuccess){ string response = result.Value; Console.WriteLine(response);}
Simple Chat
With Context
Code Review
Troubleshooting
Ask questions without additional context:
var result = await sendChatMessageUseCase.ExecuteAsync( userMessage: "What is dependency injection?");if (result.IsSuccess){ Console.WriteLine(result.Value);}
Provide project-specific context:
var context = @" Current project: Clean Architecture WPF app Using: MVVM pattern, Entity Framework, Autofac Working on: Customer module implementation";var result = await sendChatMessageUseCase.ExecuteAsync( userMessage: "How should I structure my ViewModels?", context: context);// Response will be tailored to your stack and context
Get feedback on code snippets:
var codeSnippet = @" public class CustomerService { private readonly ICustomerRepository _repo; public CustomerService(ICustomerRepository repo) { _repo = repo; } }";var result = await sendChatMessageUseCase.ExecuteAsync( userMessage: "Review this code for best practices", context: $"Code:\n{codeSnippet}");
Debug errors and exceptions:
var errorContext = @" Error: NullReferenceException Location: CustomerViewModel.SaveCommand Stack trace: ...";var result = await sendChatMessageUseCase.ExecuteAsync( userMessage: "Why am I getting this error?", context: errorContext);
// Example: Configured in DI containerservices.AddSingleton<IChatClient>(sp => new GeminiChatClient(apiKey, modelName));// All AI use cases use the same abstractionservices.AddScoped<GenerateCommitMessageUseCase>();services.AddScoped<GenerateSqlQueryUseCase>();services.AddScoped<SendChatMessageUseCase>();
The implementation uses prompts from GetPrompt helper class for consistent, optimized results.
var result = await generateCommitMessageUseCase.ExecuteAsync(diff);if (!result.IsSuccess){ // "No hay cambios para generar mensaje" // "No se pudo generar el mensaje de commit" // "Error generando mensaje: {exception}" HandleError(result.Error);}