Este repositório contém o servidor web da assistente Melissa e arquivos para execução via Docker/Compose.
Resumo: o servidor é uma API em .NET 9 que expõe endpoints REST e um hub SignalR (/melissa) para comunicação em tempo real. O projeto integra ferramentas locais (Whisper/Whisper.ggml para transcrição, EdgeTTS para síntese) e opcionalmente um modelo local via Ollama.
Onde estão os arquivos importantes:
- Compose:
src/Melissa/compose.yaml - Dockerfile:
src/Melissa/Dockerfile - Projeto do servidor:
src/Melissa/Melissa.WebServer
Portas usadas: por padrão o servidor escuta em 8080 (exposto pelo docker-compose).
Atenção: algumas funcionalidades (integração externa e disponibilidade da assistente) dependem de serviços e chaves externas (por exemplo Ollama e AllUNeed API). O comportamento sem essas dependências é tratado com warnings no log.
Licença / Créditos: ver arquivo LICENSE.
Conteúdo deste README: Visão Geral, Requisitos, Instalação Local, Execução com Docker/Compose, Manual do Usuário (uso dos endpoints) e Troubleshooting.
** Visão Geral
O servidor fornece:
- Um hub SignalR em
POST /melissa(rotas SignalR padrão) para conexões em tempo real. - Endpoint de áudio para enviar áudio bruto e receber retorno sintetizado:
POST /melissa/AskMelissaAudio. - Endpoints utilitários e de gerenciamento de tarefas (GET/POST) listados na seção de Uso.
** Requisitos
- Sistema: Linux, macOS ou Windows com suporte a .NET 9 e Docker (se optar por containers).
- .NET SDK: versão compatível com
net9.0(instale o SDK .NET 9). - Opcionais:
- Ollama (se desejar usar modelos locais via Ollama). Instale por: https://ollama.com/download
dockeredocker-compose(oudocker compose) se for executar por contêiner.
Variáveis e arquivos importantes
HolidaysCsvPath: caminho paraholidays_2025.csv(padrão emsrc/Melissa/Melissa.WebServer/Data/holidays_2025.csv).AllUNeedApiUrleAllUNeedApiKey: URL e chave da API externa (opcional). Sem a chave algumas funcionalidades podem não funcionar completamente.OLLAMA_URL: URL do serviço Ollama quando executado via container Compose.
** Instalação Local (desenvolvimento)
-
Instale o .NET 9 SDK a partir do site oficial: https://dotnet.microsoft.com/
-
Instale Ollama e prepare modelos locais conforme sua necessidade.
-
Restaurar e executar localmente (a partir da raiz do repositório):
cd src/Melissa
dotnet restore Melissa.WebServer/Melissa.WebServer.csproj
dotnet build Melissa.WebServer/Melissa.WebServer.csproj -c Debug
dotnet run --project Melissa.WebServer/Melissa.WebServer.csprojObservações:
- O servidor carrega um arquivo CSV de feriados (
HolidaysCsvPath) ao iniciar; se o arquivo não existir, o sistema emite um warning mas continua a execução. - Para desenvolvimento, ajuste
appsettings.Development.jsonou variáveis de ambiente para alterar configurações (por exemploAllUNeedApiKey).
** Execução com Docker / Docker Compose
O repositório inclui um Dockerfile e um compose.yaml em src/Melissa que definem dois serviços:
melissa.webserver: constrói a imagem do servidor e expõe a porta8080.ollama: puxa a imagem oficialollama/ollama:latest(opcional dependendo do uso de modelos locais).
Exemplos de comandos (a partir da raiz do repo):
# Subir com build (usa o compose em src/Melissa)
cd src/Melissa
docker compose -f compose.yaml up --build
# Para rodar em background
docker compose -f compose.yaml up -d --build
# Parar e remover containers
docker compose -f compose.yaml downVariáveis de ambiente no compose.yaml (padrões):
HolidaysCsvPath=/app/Data/holidays_2025.csvAllUNeedApiUrl=https://alluneed.com.br/api/AllUNeedApiKey=(deixe vazio para não usar)OLLAMA_URL=http://ollama:11434
Se quiser passar uma chave AllUNeedApiKey, defina no compose.yaml ou via variáveis de ambiente antes de subir os containers.
** Manual do Usuário — Endpoints e Exemplos
Observação: o servidor expõe endpoints HTTP conforme implementado em Program.cs e em AppEndpoints.cs.
- Health check
- GET
http://localhost:8080/health - Retorno:
200 OKcomOKquando a assistente está disponível;500com mensagem de status quando não. - Exemplo:
- GET
curl http://localhost:8080/health- Hub SignalR
- Caminho:
/melissa(SignalR Hub). Use o cliente SignalR para conectar e trocar mensagens em tempo real. - Exemplo com JavaScript (signalr client):
- Caminho:
import * as signalR from '@microsoft/signalr';
const connection = new signalR.HubConnectionBuilder()
.withUrl('http://localhost:8080/melissa')
.build();
await connection.start();- Audio — Enviar áudio e receber resposta sintetizada
- POST
http://localhost:8080/melissa/AskMelissaAudio - Corpo: áudio em PCM raw (16kHz, 16-bit, mono). O endpoint gera internamente um WAV, usa Whisper para transcrever e responde em
audio/mpegcom síntese TTS. - Exemplo (envia arquivo raw PCM):
- POST
curl --data-binary @audio.pcm \
-H "Content-Type: application/octet-stream" \
http://localhost:8080/melissa/AskMelissaAudio --output reply.mp3- Observação: o cliente desktop do projeto usa streaming SignalR para áudio em `MelissaHub` (veja `Melissa.DesktopClient` e `Melissa.DesktopAvaloniaClient`).
- Ferramentas e Tarefas (rotas úteis)
- GET
/melissa/GetCurrentTemperatureByLocation?location=<cidade>- Exemplo:
- GET
curl "http://localhost:8080/melissa/GetCurrentTemperatureByLocation?location=Sao%20Paulo"- **GET** `/melissa/ExportNationalHolidaysToTxt` — exporta feriados nacionais para `.txt` no servidor.
- **Tarefas (TaskList)**
- Adicionar nova tarefa:
- **POST** `/melissa/AddNewTask` — parâmetros: `taskTitle`, `taskDescription` (opcional).
- Exemplo (form-url-encoded):
curl -X POST http://localhost:8080/melissa/AddNewTask \
-d "taskTitle=Comprar%20leite&taskDescription=Supermercado" - Adicionar item a uma tarefa existente:
- **POST** `/melissa/AddNewItemTask` — parâmetros: `taskId` (int), `taskDescription`.
curl -X POST http://localhost:8080/melissa/AddNewItemTask -d "taskId=1&taskDescription=Leite%202L" - Cancelar item: **POST** `/melissa/CancelTaskItemById` (params: `taskItenId`, `taskId`).
- Listar tarefas: **GET** `/melissa/GetAllTasks`
- Listar itens por tarefa: **GET** `/melissa/GetAllItensByTaskId?taskId=1`
- Completar item: **POST** `/melissa/CompleteItemTask` (param: `taskItenId`)
- Enviar tarefa por e-mail: **POST** `/melissa/SendTaskByEmail` (params: `email`, `taskId`)
- Arquivar / desarquivar tarefa: **POST** `/melissa/ArchiveTaskById` / `/melissa/UnarchiveTaskById` (param: `taskId`)
- **Histórico de conversas por período**
- **POST** `/melissa/SendEmailConversationHistoryByPeriod` — parâmetros: `email`, `startPeriod`, `endPeriod` (formato ISO ou compatível com bind do .NET).
** Configuração e variáveis de ambiente
- Você pode configurar as opções pelo
appsettings.jsondo projetoMelissa.WebServerou por variáveis de ambiente com os mesmos nomes (HolidaysCsvPath,AllUNeedApiUrl,AllUNeedApiKey,OLLAMA_URL). - Quando executado em container, o
compose.yamljá define valores de exemplo. Ajuste o arquivosrc/Melissa/compose.yamlconforme necessário.
** Troubleshooting (problemas comuns)
- Erro: faltando
holidays_2025.csv— verifiquesrc/Melissa/Melissa.WebServer/Data/holidays_2025.csvou ajusteHolidaysCsvPath. - Erro: assistente indisponível — confira logs; se estiver usando Ollama via Compose, verifique se o serviço
ollamasubiu e seOLLAMA_URLestá correta. - Erro ao transcrever áudio / falta de modelo Whisper — a aplicação baixa automaticamente o modelo
ggml-medium.binse não existir, mas garanta conexão de rede ou providencie o arquivo no diretório de trabalho. - Problemas com TTS (EdgeTTS): verifique se as dependências e permissões do runtime permitem chamadas ao mecanismo Edge TTS.
** Desenvolvimento e testes
- Para executar testes ou rodar em modo debug, use o Visual Studio / Rider / CLI do .NET apontando para
src/Melissa/Melissa.WebServer/Melissa.WebServer.csproj.
** Ajuda adicional / Contribuição
- Para dúvidas específicas sobre integração com Ollama, consulte https://ollama.com/docs
- Para reportar bugs ou abrir PRs, use o sistema de issues/pull-requests do repositório no GitHub.