tudo sobre a memoria da ia, formatação, memória e conhecimento de pdfs, junto da inserção de pdfs

This commit is contained in:
2026-05-14 00:13:29 +01:00
parent ad400a9c37
commit 55ec2521cf
14 changed files with 1483 additions and 97 deletions

View File

@@ -327,13 +327,19 @@ class _TutorChatPageState extends State<TutorChatPage>
void _addWelcomeMessage() {
final welcomeMessage = {
'content': '''Olá! Sou seu assistente educacional AI. Posso ajudar você a:
'content': '''**Olá! Sou o GOAT, o teu Assistente IA oficial do Teach it.** 🐐
📚 **Explicar conceitos** de forma detalhada
🤔 **Fazer perguntas socráticas** para guiar seu aprendizado
🔍 **Explorar tópicos** de forma interativa
Estou aqui para te ajudar a aprender de forma confiante e motivadora!
Escolha um modo de tutoria e faça sua pergunta sobre o conteúdo disponível!''',
**O que posso fazer por ti:**
📚 **Explicar conceitos** usando o material do teu professor
🤔 **Fazer perguntas socráticas** para guiar tua aprendizagem
🔍 **Explorar tópicos** de forma interativa com os PDFs disponibilizados
🎯 **Adaptar-me** ao método de ensino do teu professor
Escolhe um modo de tutoria e envia a tua pergunta sobre qualquer assunto educacional!
**Estou pronto quando tu estiveres!** 💪''',
'isUser': false,
'timestamp': DateTime.now(),
'sources': <SourceCitation>[],

View File

@@ -1,10 +1,11 @@
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:go_router/go_router.dart';
import 'package:http/http.dart' as http;
import '../../../../core/services/auth_service.dart';
import '../../../../core/services/rag_ai_service.dart';
import '../../../../core/utils/logger.dart';
/// Simple AI Tutor chat interface page (for testing)
class TutorChatPageSimple extends StatefulWidget {
@@ -193,19 +194,43 @@ class _TutorChatPageSimpleState extends State<TutorChatPageSimple>
),
],
),
child: Text(
content,
style: TextStyle(
color: isUser
? Colors.white
: const Color(0xFF2D3748),
fontSize: 16,
height: 1.4,
fontWeight: isUser
? FontWeight.w500
: FontWeight.normal,
),
),
child: isUser
? Text(
content,
style: TextStyle(
color: Colors.white,
fontSize: 16,
height: 1.4,
fontWeight: FontWeight.w500,
),
)
: MarkdownBody(
data: content,
styleSheet: MarkdownStyleSheet(
p: TextStyle(
color: const Color(0xFF2D3748),
fontSize: 16,
height: 1.4,
),
strong: TextStyle(
color: const Color(0xFF2D3748),
fontSize: 16,
fontWeight: FontWeight.bold,
height: 1.4,
),
em: TextStyle(
color: const Color(0xFF2D3748),
fontSize: 16,
fontStyle: FontStyle.italic,
height: 1.4,
),
listBullet: TextStyle(
color: const Color(0xFF2D3748),
fontSize: 16,
height: 1.4,
),
),
),
),
),
if (isUser) ...[
@@ -373,20 +398,20 @@ class _TutorChatPageSimpleState extends State<TutorChatPageSimple>
void _addWelcomeMessage() {
final welcomeMessage = {
'content': '''Olá! Sou seu assistente educacional AI.
'content': '''**Olá! Sou o GOAT, o teu Assistente IA oficial do Teach it.** 🐐
Bem-vindo ao TeachIT AI Tutor!
Estou aqui para te ajudar a aprender de forma confiante e motivadora!
Funcionalidades disponíveis:
📚 Respostas baseadas em conteúdo educacional
🔍 Busca vetorial semântica
🤖 Integração com Ollama API
📖 Citações de fontes relevantes
🎯 Modo de aprendizado adaptativo
**O que posso fazer por ti:**
📚 Responder com base no material do teu professor
🔍 Usar os PDFs e documentos disponibilizados
<EFBFBD> Explicar conceitos de forma clara e organizada
🎯 Adaptar-me ao método de ensino do teu professor
O sistema usa RAG (Retrieval-Augmented Generation) para fornecer respostas baseadas apenas no conteúdo educacional disponível.
**Como funciona:**
Envia-me a tua pergunta sobre qualquer assunto educacional e vou usar o material disponível para te dar a melhor resposta possível.
Faça sua pergunta sobre qualquer assunto educacional!''',
**Estou pronto quando tu estiveres!** 💪''',
'isUser': false,
'timestamp': DateTime.now(),
};
@@ -419,53 +444,28 @@ Faça sua pergunta sobre qualquer assunto educacional!''',
_scrollToBottom();
try {
// Direct call to Ollama API based on working example
print('Processing query: $userMessage');
// Use RAGAIService with memory, PDFs, and O GOAT identity
Logger.info('USING RAG AI SERVICE');
final url = Uri.parse('http://89.114.196.110:11434/api/chat');
final replyText = await RAGAIService.ask(userMessage);
final response = await http
.post(
url,
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'model': 'qwen3-coder:30b',
'messages': [
{'role': 'user', 'content': userMessage},
],
'stream': false,
}),
)
.timeout(const Duration(seconds: 60));
final preview = replyText.length > 50
? replyText.substring(0, 50)
: replyText;
Logger.info('Ollama response received: $preview...');
print('API response status: ${response.statusCode}');
print('API response body: ${response.body}');
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
final replyText = data['message']?['content'] ?? 'Sem resposta.';
final preview = replyText.length > 50
? replyText.substring(0, 50)
: replyText;
print('Ollama response received: $preview...');
setState(() {
_messages.add({
'content': replyText,
'isUser': false,
'timestamp': DateTime.now(),
});
_isLoading = false;
setState(() {
_messages.add({
'content': replyText,
'isUser': false,
'timestamp': DateTime.now(),
});
} else {
throw Exception('Erro HTTP ${response.statusCode}');
}
_isLoading = false;
});
} catch (e) {
// Fallback to mock response if API fails
print('Ollama API error: $e');
print('Stack trace: ${StackTrace.current}');
final aiResponse = _generateMockResponse(userMessage);
// Fallback to error message if API fails
Logger.error('RAG AI Service error: $e');
final aiResponse = 'Desculpe, ocorreu um erro ao processar a pergunta. Tente novamente.';
setState(() {
_messages.add({

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import '../../../../core/services/rag_service.dart';
/// Widget for displaying chat messages with source citations
@@ -139,15 +140,43 @@ class MessageBubble extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
content,
style: TextStyle(
color: isUser ? Colors.white : const Color(0xFF2D3748),
fontSize: 16,
height: 1.4,
fontWeight: isUser ? FontWeight.w500 : FontWeight.normal,
),
),
isUser
? Text(
content,
style: TextStyle(
color: Colors.white,
fontSize: 16,
height: 1.4,
fontWeight: FontWeight.w500,
),
)
: MarkdownBody(
data: content,
styleSheet: MarkdownStyleSheet(
p: TextStyle(
color: const Color(0xFF2D3748),
fontSize: 16,
height: 1.4,
),
strong: TextStyle(
color: const Color(0xFF2D3748),
fontSize: 16,
fontWeight: FontWeight.bold,
height: 1.4,
),
em: TextStyle(
color: const Color(0xFF2D3748),
fontSize: 16,
fontStyle: FontStyle.italic,
height: 1.4,
),
listBullet: TextStyle(
color: const Color(0xFF2D3748),
fontSize: 16,
height: 1.4,
),
),
),
],
),
);