# DCT Orchestrate PHP

Projeto completo em PHP para orquestrar atendimento com Gemini + TTS + transcrição.

## O que mudou nesta versão

- a API agora controla `tentativas_basicas` por `ticket_id`
- a API guarda `cliente`, `rede`, `dados_coletados` e histórico curto no `storage/tickets.json`
- o Flowbuilder pode enviar só dados básicos do cliente + mensagem
- a Gemini recebe o estado consolidado do ticket e devolve `acao`, `intencao`, `proximo_passo`, `resolvido`, `consome_tentativa` e `resumo_chamado`
- quando o limite de tentativas é atingido e o problema persiste, a API pode converter a resposta em `ABRIR_CHAMADO`
- quando o TTS responde com binário, a API salva o arquivo e devolve `base64` e `url` pública
- quando o TTS responde com JSON contendo `base64`, a API também salva o arquivo e devolve `url` pública

## Estrutura

- `index.php`: interface futurista para testar texto ou áudio.
- `api/index.php`: endpoint principal.
- `config/orchestrator.json`: configuração central de Gemini, prompt, TTS, transcribe e defaults de ticket.
- `storage/uploads`: arquivos de áudio enviados pela interface.
- `storage/tts`: áudios sintetizados pelo TTS.
- `storage/tickets.json`: memória simples por ticket.

## Requisitos

- PHP 8.0+
- Extensão cURL habilitada
- Apache com `mod_rewrite` ou Nginx + PHP-FPM
- HTTPS no domínio final

## Rotas

- `GET /api/health`
- `POST /api`
- `POST /api/orchestrate`

## Payload mínimo em texto

```json
{
  "ticket_id": "15012",
  "cliente": {
    "cpf_cnpj": "04622603306",
    "cidade": "Fortaleza",
    "bairro": "Centro"
  },
  "rede": {
    "status_conexao": "Conectado"
  },
  "message": {
    "text": "estou sem internet"
  }
}
```

## Resposta esperada em texto

```json
{
  "ok": true,
  "decision": {
    "acao": "CONTINUAR",
    "intencao": "SEM_CONEXAO",
    "mensagem": "Entendi. A luz da ONU está apagada, vermelha ou verde? Isso acontece em todos os aparelhos ou só em um?",
    "motivo": "triagem básica inicial",
    "setor": "SUPORTE",
    "coleta": ["LUZ_ONU", "ESCOPO_DISPOSITIVOS"],
    "proximo_passo": "COLETAR_DADOS_BASICOS",
    "resolvido": false,
    "consome_tentativa": false,
    "resumo_chamado": ""
  }
}
```

## Resposta esperada em áudio

```json
{
  "reply": {
    "type": "audio",
    "text": "Entendi. Me diga a cor das luzes do modem para eu continuar te ajudando.",
    "audio": {
      "mime_type": "audio/ogg",
      "base64": "T2dnUwACAAAA...",
      "url": "https://orchestrate.dctsistemas.com.br/storage/tts/tts_20260416_171500_ab12cd34.ogg"
    }
  }
}
```

## Regras de tentativas

- perguntas cadastrais e coleta inicial não contam tentativa
- orientações práticas como reiniciar ONU/roteador, testar no cabo ou em outro aparelho contam tentativa
- o contador é salvo por `ticket_id`
- quando `max_tentativas_basicas` é atingido e o cliente ainda informa problema, a API pode converter a resposta em `ABRIR_CHAMADO`

## Configuração principal

Edite `config/orchestrator.json`:

- `gemini.api_key`
- `providers.transcribe.url`
- `providers.tts.url`
- `ticket_defaults.max_tentativas_basicas`
- `ticket_defaults.pode_abrir_chamado`
- `gemini.system_instruction`
- `gemini.schema`
- `storage.tts_dir`
- `storage.public_tts_path`

## Deploy rápido

1. Faça upload de todo o conteúdo do ZIP para a raiz do subdomínio `orchestrate.dctsistemas.com.br`.
2. Edite `config/orchestrator.json`.
3. Preencha a chave Gemini e os endpoints dos providers.
4. Garanta permissão de escrita em `storage/`.

## Observações

- a memória por ticket usa `storage/tickets.json`; para produção pesada, troque por Redis ou banco
- o TTS agora tenta devolver sempre `base64` e `url`
- o transcribe aceita resposta com `text`, `transcript`, `transcription`, `result` ou `message`
- a API também aceita override de `providers` e `gemini` no próprio body para testes via Postman
