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:
@@ -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>[],
|
||||
|
||||
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user