adding new mindforge applications
All checks were successful
Mindforge API Build and Deploy / Build Mindforge API Image (push) Successful in 1m8s
Mindforge Cronjob Build and Deploy / Build Mindforge Cronjob Image (push) Successful in 1m19s
Mindforge API Build and Deploy / Deploy Mindforge API (internal) (push) Successful in 11s
Mindforge Cronjob Build and Deploy / Deploy Mindforge Cronjob (internal) (push) Successful in 10s
Mindforge Web Build and Deploy (internal) / Build Mindforge Web Image (push) Successful in 2m25s
Mindforge Web Build and Deploy (internal) / Deploy Mindforge Web (internal) (push) Successful in 12s
All checks were successful
Mindforge API Build and Deploy / Build Mindforge API Image (push) Successful in 1m8s
Mindforge Cronjob Build and Deploy / Build Mindforge Cronjob Image (push) Successful in 1m19s
Mindforge API Build and Deploy / Deploy Mindforge API (internal) (push) Successful in 11s
Mindforge Cronjob Build and Deploy / Deploy Mindforge Cronjob (internal) (push) Successful in 10s
Mindforge Web Build and Deploy (internal) / Build Mindforge Web Image (push) Successful in 2m25s
Mindforge Web Build and Deploy (internal) / Deploy Mindforge Web (internal) (push) Successful in 12s
This commit is contained in:
48
Mindforge.API/Services/AgentService.cs
Normal file
48
Mindforge.API/Services/AgentService.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Mindforge.API.Models.Enums;
|
||||
using Mindforge.API.Providers;
|
||||
using Mindforge.API.Services.Interfaces;
|
||||
|
||||
namespace Mindforge.API.Services
|
||||
{
|
||||
public class AgentService : IAgentService
|
||||
{
|
||||
private readonly IEnumerable<ILlmApiProvider> _providers;
|
||||
|
||||
public AgentService(IEnumerable<ILlmApiProvider> providers)
|
||||
{
|
||||
_providers = providers;
|
||||
}
|
||||
|
||||
public Task<string> ProcessRequestAsync(LlmProvider providerEnum, string systemPrompt, string userPrompt, string model)
|
||||
{
|
||||
ILlmApiProvider provider = providerEnum switch
|
||||
{
|
||||
LlmProvider.OpenAI => _providers.OfType<OpenAIApiProvider>().FirstOrDefault()
|
||||
?? throw new Exception("OpenAI provider not registered"),
|
||||
LlmProvider.Gemini => _providers.OfType<GeminiApiProvider>().FirstOrDefault()
|
||||
?? throw new Exception("Gemini provider not registered"),
|
||||
_ => throw new Exception("Unknown provider")
|
||||
};
|
||||
|
||||
return provider.SendRequestAsync(systemPrompt, userPrompt, model);
|
||||
}
|
||||
|
||||
public Task<string> ProcessRequestBatchAsync(LlmProvider providerEnum, string systemPrompt, string userPrompt, string model)
|
||||
{
|
||||
ILlmApiProvider provider = providerEnum switch
|
||||
{
|
||||
LlmProvider.OpenAI => _providers.OfType<OpenAIApiProvider>().FirstOrDefault()
|
||||
?? throw new Exception("OpenAI provider not registered"),
|
||||
LlmProvider.Gemini => _providers.OfType<GeminiApiProvider>().FirstOrDefault()
|
||||
?? throw new Exception("Gemini provider not registered"),
|
||||
_ => throw new Exception("Unknown provider")
|
||||
};
|
||||
|
||||
return provider.SendRequestBatchAsync(systemPrompt, userPrompt, model);
|
||||
}
|
||||
}
|
||||
}
|
||||
61
Mindforge.API/Services/FileService.cs
Normal file
61
Mindforge.API/Services/FileService.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Mindforge.API.Models.Enums;
|
||||
using Mindforge.API.Models.Requests;
|
||||
using Mindforge.API.Services.Interfaces;
|
||||
using Mindforge.API.Exceptions;
|
||||
|
||||
namespace Mindforge.API.Services
|
||||
{
|
||||
public class FileService : IFileService
|
||||
{
|
||||
private readonly IAgentService _agentService;
|
||||
|
||||
private const LlmProvider DefaultProvider = LlmProvider.OpenAI;
|
||||
private const string DefaultModel = "gpt-5-mini";
|
||||
|
||||
public FileService(IAgentService agentService)
|
||||
{
|
||||
_agentService = agentService;
|
||||
}
|
||||
|
||||
public async Task<string> CheckFileAsync(FileCheckRequest request)
|
||||
{
|
||||
string systemPrompt;
|
||||
|
||||
if (request.CheckType.ToLower() == "language")
|
||||
{
|
||||
systemPrompt = $@"Você é um revisor de textos sênior e especialista em língua portuguesa do Brasil.
|
||||
Sua tarefa é analisar o texto fornecido e corrigir rigorosamente todos os erros gramaticais, de concordância, pontuação, garantindo clareza, coesão e fluidez.
|
||||
Por favor, siga esta estrutura:
|
||||
1. Retorne o texto completamente revisado e polido.
|
||||
2. Não adicione nenhum texto adicional, apenas o texto revisado.
|
||||
3. Não altere o sentido do texto, mantenha a mesma ideia. Apenas corrija os erros gramaticais, de concordância e pontuação.
|
||||
Responda única e exclusivamente em português do Brasil.
|
||||
Foque em textos de concursos públicos, principalmente para a banca Cebraspe.";
|
||||
}
|
||||
else if (request.CheckType.ToLower() == "content")
|
||||
{
|
||||
systemPrompt = $@"Você é um analista de conteúdo experiente, especializado em revisão crítica e verificação de fatos.
|
||||
Sua tarefa é realizar uma análise rigorosa do texto fornecido, identificando erros lógicos, imprecisões de conteúdo, contradições internas e inconsistências argumentativas.
|
||||
Por favor, siga esta estrutura:
|
||||
1. Destaque cada problema encontrado no texto original.
|
||||
2. Explique detalhadamente por que é um erro ou inconsistência.
|
||||
3. Apresente sugestões claras e embasadas para reescrever ou corrigir os trechos problemáticos, melhorando a coerência e a lógica e a clareza do conteúdo.
|
||||
Responda única e exclusivamente em português do Brasil e mantenha um tom analítico e construtivo.
|
||||
|
||||
Responda em tópicos para ser apresentados ao usuário, sendo sucinto e não extremamente detalhado.
|
||||
Os resumos serão utilizados para concursos públicos, principalmente para a banca Cebraspe.
|
||||
";
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new UserException("Tipo de verificação inválido. Use 'language' ou 'content'.");
|
||||
}
|
||||
|
||||
string userPrompt = $"Arquivo: {request.FileName}\nConteúdo:\n{request.FileContent}";
|
||||
|
||||
return await _agentService.ProcessRequestAsync(DefaultProvider, systemPrompt, userPrompt, DefaultModel);
|
||||
}
|
||||
}
|
||||
}
|
||||
83
Mindforge.API/Services/FlashcardService.cs
Normal file
83
Mindforge.API/Services/FlashcardService.cs
Normal file
@@ -0,0 +1,83 @@
|
||||
using System.Threading.Tasks;
|
||||
using Mindforge.API.Models.Enums;
|
||||
using Mindforge.API.Models.Requests;
|
||||
using Mindforge.API.Services.Interfaces;
|
||||
|
||||
namespace Mindforge.API.Services
|
||||
{
|
||||
public class FlashcardService : IFlashcardService
|
||||
{
|
||||
private readonly IAgentService _agentService;
|
||||
private readonly ILogger<FlashcardService> _logger;
|
||||
|
||||
private const LlmProvider DefaultProvider = LlmProvider.Gemini;
|
||||
private string DefaultModel = "gemini-3.1-flash-image-preview";
|
||||
|
||||
public FlashcardService(IAgentService agentService, ILogger<FlashcardService> logger)
|
||||
{
|
||||
_agentService = agentService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<string> GenerateFlashcardsAsync(FlashcardGenerateRequest request)
|
||||
{
|
||||
var extraPrompt = "";
|
||||
|
||||
switch (request.Mode)
|
||||
{
|
||||
case FlashcardMode.Basic:
|
||||
DefaultModel = "gemini-3.1-flash-lite-preview";
|
||||
break;
|
||||
case FlashcardMode.Simple:
|
||||
DefaultModel = "gemini-3.1-flash-image-preview";
|
||||
break;
|
||||
case FlashcardMode.Detailed:
|
||||
DefaultModel = "gemini-3.1-flash-image-preview";
|
||||
extraPrompt = "Crie flashcards mais detalhados.";
|
||||
break;
|
||||
case FlashcardMode.Hyper:
|
||||
DefaultModel = "gemini-3.1-pro-preview";
|
||||
extraPrompt = "Adicione também pequenas questões para fixação, para que o usuário possa testar seus conhecimentos. As questões devem ser curtas e objetivas, como se fosse cobradas em prova mesmo.";
|
||||
break;
|
||||
}
|
||||
|
||||
string systemPrompt = $@"Você é um assistente educacional especializado em criar flashcards para o Anki.
|
||||
Baseado no texto fornecido, crie exatamente {request.Amount} flashcards que focam nos conceitos mais importantes e difíceis.
|
||||
A resposta FINAL deve ser APENAS no formato CSV, pronto para importação no Anki, sem nenhum texto adicional antes ou depois.
|
||||
O formato CSV deve ter duas colunas: a frente da carta (pergunta/conceito) e o verso (resposta/explicação). Use ponto e vírgula (;) como separador. Não adicione o cabeçalho.
|
||||
As perguntas e respostas devem estar estritamente em Português do Brasil.
|
||||
|
||||
Exemplo de saída:
|
||||
""Qual é a capital do Brasil?"";""Brasília""
|
||||
""Qual é a maior cidade do Brasil?"";""São Paulo""
|
||||
|
||||
Com base no arquivo fornecido, crie exatamente {request.Amount} flashcards que focam nos conceitos mais importantes e difíceis.
|
||||
{extraPrompt}
|
||||
";
|
||||
|
||||
string userPrompt = $"Arquivo: {request.FileName}\nConteúdo:\n{request.FileContent}";
|
||||
|
||||
//var result = await _agentService.ProcessRequestAsync(DefaultProvider, systemPrompt, userPrompt, DefaultModel);
|
||||
var result = await _agentService.ProcessRequestBatchAsync(DefaultProvider, systemPrompt, userPrompt, DefaultModel);
|
||||
|
||||
var lines = result.Split('\n');
|
||||
|
||||
if (lines.Length == 0)
|
||||
{
|
||||
throw new Exception("Nenhum flashcard gerado.");
|
||||
}
|
||||
|
||||
if (lines.Length > request.Amount)
|
||||
{
|
||||
_logger.LogWarning("Quantidade de flashcards excede o limite.");
|
||||
}
|
||||
|
||||
if (lines.Length < request.Amount)
|
||||
{
|
||||
_logger.LogWarning("Quantidade de flashcards abaixo do limite.");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Mindforge.API/Services/Interfaces/IAgentService.cs
Normal file
11
Mindforge.API/Services/Interfaces/IAgentService.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
using System.Threading.Tasks;
|
||||
using Mindforge.API.Models.Enums;
|
||||
|
||||
namespace Mindforge.API.Services.Interfaces
|
||||
{
|
||||
public interface IAgentService
|
||||
{
|
||||
Task<string> ProcessRequestAsync(LlmProvider provider, string systemPrompt, string userPrompt, string model);
|
||||
Task<string> ProcessRequestBatchAsync(LlmProvider provider, string systemPrompt, string userPrompt, string model);
|
||||
}
|
||||
}
|
||||
10
Mindforge.API/Services/Interfaces/IFileService.cs
Normal file
10
Mindforge.API/Services/Interfaces/IFileService.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using System.Threading.Tasks;
|
||||
using Mindforge.API.Models.Requests;
|
||||
|
||||
namespace Mindforge.API.Services.Interfaces
|
||||
{
|
||||
public interface IFileService
|
||||
{
|
||||
Task<string> CheckFileAsync(FileCheckRequest request);
|
||||
}
|
||||
}
|
||||
10
Mindforge.API/Services/Interfaces/IFlashcardService.cs
Normal file
10
Mindforge.API/Services/Interfaces/IFlashcardService.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using System.Threading.Tasks;
|
||||
using Mindforge.API.Models.Requests;
|
||||
|
||||
namespace Mindforge.API.Services.Interfaces
|
||||
{
|
||||
public interface IFlashcardService
|
||||
{
|
||||
Task<string> GenerateFlashcardsAsync(FlashcardGenerateRequest request);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user