134 lines
3.2 KiB
Markdown
134 lines
3.2 KiB
Markdown
# Motor de Recomendações e IA
|
|
|
|
## Estado atual
|
|
|
|
O DayMaker usa uma abordagem baseada em **IA de linguagem com contexto do inventário**.
|
|
|
|
Não existe atualmente um motor de regras local como fonte principal das recomendações. A recomendação é gerada pelo serviço `AiRecommendationService`, que chama uma API Ollama remota.
|
|
|
|
---
|
|
|
|
## Serviço principal
|
|
|
|
Ficheiro:
|
|
|
|
```text
|
|
lib/services/ai_recommendation_service.dart
|
|
```
|
|
|
|
Responsabilidades:
|
|
|
|
- Buscar itens do utilizador no Supabase.
|
|
- Construir contexto textual do inventário.
|
|
- Enviar mensagens para a API Ollama.
|
|
- Manter histórico simples de conversa.
|
|
- Suportar `silent: true` para sugestões estruturadas.
|
|
- Buscar itens com imagens para a home.
|
|
|
|
---
|
|
|
|
## Endpoint e modelo
|
|
|
|
| Campo | Valor |
|
|
|-------|-------|
|
|
| Endpoint | `https://apichat.epvc.pt/api/chat` |
|
|
| Modelo | `llama3.2:3b` |
|
|
| Stream | `false` |
|
|
| Formato | Ollama `/api/chat` |
|
|
|
|
Payload base:
|
|
|
|
```json
|
|
{
|
|
"model": "llama3.2:3b",
|
|
"messages": [
|
|
{"role": "system", "content": "..."},
|
|
{"role": "user", "content": "..."}
|
|
],
|
|
"stream": false
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Prompt de sistema
|
|
|
|
A IA é instruída a:
|
|
|
|
- Ajudar a montar outfits e escolher o que levar.
|
|
- Usar linguagem simples e curta.
|
|
- Não usar emojis.
|
|
- Basear-se nas tags e notas dos itens.
|
|
- Responder sempre em português.
|
|
|
|
---
|
|
|
|
## Contexto enviado à IA
|
|
|
|
O contexto inclui os itens do utilizador:
|
|
|
|
```text
|
|
Itens disponiveis no inventario do utilizador:
|
|
- Bota verde (categoria: Roupa) [tags: casual, outdoor]
|
|
- Switch (categoria: Eletrónica) [tags: gaming, casual]
|
|
```
|
|
|
|
Esse contexto é anexado à mensagem de sistema.
|
|
|
|
---
|
|
|
|
## Chat IA
|
|
|
|
No ecrã `AiChatScreen`:
|
|
|
|
- O utilizador escreve livremente.
|
|
- Existem sugestões rápidas no topo.
|
|
- A resposta é apresentada como conversa.
|
|
- O histórico fica em memória no serviço enquanto a instância existir.
|
|
|
|
---
|
|
|
|
## Sugestão IA na Home
|
|
|
|
Fluxo:
|
|
|
|
1. Utilizador toca em `Pedir sugestão à IA`.
|
|
2. App abre um diálogo e pede a ocasião.
|
|
3. O utilizador pode escrever algo como `piquenique no parque` ou escolher chip rápido.
|
|
4. A app envia a ocasião em modo `silent`.
|
|
5. A IA deve devolver apenas nomes exatos dos itens, um por linha.
|
|
6. A app cruza esses nomes com os itens reais do Supabase.
|
|
7. A app mostra cards com imagem, nome e categoria.
|
|
8. O utilizador pode exportar os itens para um dia da semana.
|
|
|
|
---
|
|
|
|
## Modo silencioso
|
|
|
|
Quando `silent: true`, a instrução acrescentada ao pedido é:
|
|
|
|
```text
|
|
responde APENAS com os nomes exatos dos itens do meu inventario que sugeres, um por linha, sem numeracao, sem explicacao, sem comentarios.
|
|
```
|
|
|
|
Isto permite transformar a resposta da IA numa lista de itens reais.
|
|
|
|
---
|
|
|
|
## Limitações conhecidas
|
|
|
|
- A correspondência depende da IA devolver nomes próximos aos nomes reais.
|
|
- Se a IA devolver texto extra, a app tenta limpar linhas, mas pode falhar correspondência.
|
|
- A IA não vê imagens, apenas nomes, categorias, tags e notas.
|
|
- Não há ranking local por clima, cor ou histórico de uso.
|
|
|
|
---
|
|
|
|
## Melhorias futuras
|
|
|
|
- Resposta em JSON em vez de texto simples.
|
|
- Validação local mais robusta por ID de item.
|
|
- Sugestões com clima e duração.
|
|
- Preferências aprendidas por histórico.
|
|
- Integração com calendário.
|