Build & Push Frontend Docker Image / build-and-push (push) Canceled after 0s
Build Validation / validate (push) Canceled after 6s
Build & Push Backend Docker Image / build-and-push (push) Failing after 10m10s
Build & Push Gateway Docker Image / build-and-push (push) Failing after 10m9s
A professional workspace for AI coding agents with: - Real-time streaming chat with SSE - Session management (fork, clone, tree navigation) - MCP tools browser & metadata panel - Skills browser (global, project, package sources) - Voice input & STT provider configuration - Integrated terminal & file explorer - Model selector with capability metadata - Keyboard-first UI with command palette - 8 languages (en, pt-BR, es, ja, zh-CN, ar, bn, hi) - Tauri 2 desktop app - React 19 + TypeScript + Vite 8 + Tailwind CSS 4 - Pi Agent extension runtime Originally forked from OpenCodeUI, now an independent project. License: GPL-3.0-only
327 lines
11 KiB
Markdown
327 lines
11 KiB
Markdown
# Design — README atual do PiAgentUI e sistema de áudio/STT
|
|
|
|
**Data:** 2026-05-30
|
|
**Status:** aprovado conceitualmente pelo usuário; aguardando revisão do arquivo antes da implementação
|
|
**Escopo:** reescrever o `README.md` do projeto atual e preparar a arquitetura completa para envio de áudio e transcrição em tempo real no app.
|
|
|
|
## Contexto
|
|
|
|
O projeto começou como uma adaptação do OpenCodeUI, mas atualmente está evoluindo para o **PiAgentUI**: uma interface web/desktop para o Pi Agent, com ambição explícita de se tornar um app inteiro no estilo Codex ou Claude Desktop.
|
|
|
|
O estado atual já inclui:
|
|
|
|
- frontend React 19 + TypeScript + Vite;
|
|
- app desktop via Tauri 2;
|
|
- extensão Pi local em `extensions/piagentui-server.ts` como backend/runtime bridge;
|
|
- chat com streaming/SSE;
|
|
- sessões reais do Pi, histórico e roteamento de sessão;
|
|
- tool calls e tool results renderizados em cards;
|
|
- contexto real do runtime via endpoint `/api/sessions/:sessionId/context`;
|
|
- enriquecimento de metadados de modelo via catálogo OpenRouter local em `src/assets/models.json`;
|
|
- lista real de Skills agrupadas por origem;
|
|
- metadados reais de MCP configurado;
|
|
- slash commands reais do Pi expostos por `/api/commands/list`;
|
|
- anexos de arquivos, incluindo áudio como arquivo quando o modelo selecionado declara suporte a áudio.
|
|
|
|
Ainda não existe:
|
|
|
|
- gravação de microfone no composer;
|
|
- transcrição parcial em tempo real;
|
|
- endpoint backend para STT;
|
|
- configurações STT;
|
|
- provedor STT customizável OpenAI-compatible;
|
|
- pipeline de áudio integrado ao envio de mensagens.
|
|
|
|
## Objetivos
|
|
|
|
1. Reescrever `README.md` em português para refletir o produto atual, não o projeto original OpenCodeUI.
|
|
2. Apresentar PiAgentUI como interface moderna para o Pi Agent e base futura de app completo tipo Codex/Claude.
|
|
3. Documentar capacidades existentes de forma honesta, separando **implementado**, **em andamento** e **roadmap**.
|
|
4. Projetar um sistema de áudio/STT completo, com opção padrão forte e configuração externa flexível.
|
|
5. Implementar o sistema em fases testáveis, com TDD para lógica, API, stores e componentes.
|
|
|
|
## Não objetivos
|
|
|
|
- Não renomear pacote npm, bundle, app Tauri ou metadados de release nesta primeira etapa, salvo menção no README como débito de branding.
|
|
- Não implementar agente de voz falante/TTS nesta fase; o foco é entrada por voz e transcrição para texto.
|
|
- Não substituir o fluxo normal de texto; áudio será uma camada opcional sobre o composer.
|
|
- Não acoplar PiAgentUI ao OpenRouter para STT. OpenRouter continua sendo catálogo/metadados quando útil; STT usa provedores próprios.
|
|
|
|
## README.md proposto
|
|
|
|
O novo README deve ser escrito em português e deve substituir integralmente o conteúdo herdado. Estrutura recomendada:
|
|
|
|
1. **Título e tagline**
|
|
- `# PiAgentUI`
|
|
- “Interface web/desktop para Pi Agent — caminhando para um app completo estilo Codex/Claude.”
|
|
|
|
2. **Visão geral**
|
|
- Explicar que o PiAgentUI é uma UI local para operar o Pi Agent com sessões, ferramentas, MCP, Skills, comandos e contexto real.
|
|
- Deixar claro que o runtime Pi é a fonte de verdade.
|
|
|
|
3. **Estado atual**
|
|
- Listar capacidades implementadas:
|
|
- chat streaming;
|
|
- sessões reais;
|
|
- tool cards;
|
|
- context usage;
|
|
- models metadata;
|
|
- skills;
|
|
- MCP metadata;
|
|
- slash commands;
|
|
- anexos multimodais;
|
|
- terminal/file explorer/Tauri quando aplicável.
|
|
|
|
4. **Roadmap do produto**
|
|
- Ações visuais para comandos Pi;
|
|
- áudio/STT em tempo real;
|
|
- experiência voice-first;
|
|
- MCP actions/connect/auth;
|
|
- app completo tipo Codex/Claude.
|
|
|
|
5. **Arquitetura**
|
|
- Frontend React/Vite/Tauri;
|
|
- extensão Pi como bridge local;
|
|
- Pi runtime como estado autoritativo;
|
|
- APIs locais `/api/*`;
|
|
- SSE para eventos.
|
|
|
|
6. **Desenvolvimento local**
|
|
- `npm install`;
|
|
- `npm run dev`;
|
|
- `npm run build`;
|
|
- `npm run test:run`;
|
|
- `npm run typecheck`;
|
|
- `npm run typecheck:extensions`.
|
|
|
|
7. **Notas de runtime**
|
|
- Algumas mudanças exigem reiniciar/recarregar o Pi/extension server.
|
|
- O arquivo de descoberta local fica em `~/.pi/agent/piagentui-port.json`.
|
|
|
|
8. **Áudio e transcrição — planejado**
|
|
- Resumir o plano STT sem prometer que já está implementado.
|
|
|
|
9. **Licença e origem**
|
|
- Manter licença atual se aplicável.
|
|
- Mencionar que o projeto deriva de uma base OpenCodeUI, mas agora segue direção própria para PiAgentUI.
|
|
|
|
## Sistema de áudio/STT — abordagem recomendada
|
|
|
|
### Opção padrão
|
|
|
|
Usar **OpenAI Realtime Transcription** com `gpt-realtime-whisper` como padrão para transcrição ao vivo.
|
|
|
|
Razões:
|
|
|
|
- foi projetado para live speech-to-text;
|
|
- entrega deltas parciais;
|
|
- tem latência baixa;
|
|
- usa sessão dedicada de transcrição, sem resposta falada do modelo;
|
|
- combina com um composer por voz onde o texto aparece enquanto o usuário fala.
|
|
|
|
### Fallback padrão
|
|
|
|
Usar **OpenAI Audio Transcriptions** para áudio fechado/arquivo:
|
|
|
|
- `gpt-4o-transcribe` como opção de maior qualidade;
|
|
- `gpt-4o-mini-transcribe` como opção de menor custo;
|
|
- `whisper-1` para compatibilidade com integrações antigas.
|
|
|
|
Esse fallback deve ser usado quando:
|
|
|
|
- o navegador/ambiente não suportar streaming confiável;
|
|
- o usuário enviar um arquivo de áudio;
|
|
- o provedor configurado só oferecer endpoint `/audio/transcriptions`;
|
|
- a conexão realtime falhar e houver áudio gravado em buffer.
|
|
|
|
### Provedor OpenAI-compatible externo
|
|
|
|
O usuário deve poder configurar qualquer API compatível com o endpoint de transcrição da OpenAI.
|
|
|
|
Configuração proposta:
|
|
|
|
```ts
|
|
interface SttProviderConfig {
|
|
id: string
|
|
label: string
|
|
kind: 'openai' | 'openai-compatible'
|
|
mode: 'realtime' | 'file' | 'both'
|
|
baseUrl: string
|
|
apiKey: string
|
|
realtimeModel?: string
|
|
transcriptionModel: string
|
|
transcriptionEndpoint?: string
|
|
language?: string
|
|
prompt?: string
|
|
responseFormat?: 'json' | 'text' | 'verbose_json'
|
|
}
|
|
```
|
|
|
|
Exemplo para Together AI:
|
|
|
|
```json
|
|
{
|
|
"kind": "openai-compatible",
|
|
"mode": "file",
|
|
"baseUrl": "https://api.together.xyz/v1",
|
|
"transcriptionEndpoint": "/audio/transcriptions",
|
|
"transcriptionModel": "openai/whisper-large-v3"
|
|
}
|
|
```
|
|
|
|
Observação: APIs “OpenAI-compatible” costumam ser compatíveis no endpoint HTTP de arquivo, mas realtime/WebSocket varia por provedor. Por isso, realtime deve ser capability separada, não assumida automaticamente.
|
|
|
|
## Arquitetura proposta do STT
|
|
|
|
### Frontend
|
|
|
|
Criar uma feature dedicada:
|
|
|
|
- `src/features/voice/VoiceRecorderButton.tsx`
|
|
- `src/features/voice/VoiceTranscriptOverlay.tsx`
|
|
- `src/features/voice/useVoiceRecorder.ts`
|
|
- `src/features/voice/useRealtimeTranscript.ts`
|
|
- `src/features/voice/audioEncoding.ts`
|
|
|
|
Responsabilidades:
|
|
|
|
- pedir permissão de microfone;
|
|
- mostrar estados: idle, requesting_permission, recording, connecting, transcribing, error;
|
|
- capturar áudio;
|
|
- enviar chunks para o backend;
|
|
- renderizar transcrição parcial e final;
|
|
- inserir texto final no composer;
|
|
- opcionalmente enviar automaticamente após confirmação do usuário.
|
|
|
|
### Store/configuração
|
|
|
|
Criar configuração local de STT:
|
|
|
|
- `src/store/sttSettingsStore.ts`
|
|
- persistência em localStorage inicialmente;
|
|
- campos para provider padrão, base URL, modelo, idioma, prompt, modo e preferências de UX.
|
|
|
|
Preferências de UX:
|
|
|
|
```ts
|
|
interface VoiceInputPreferences {
|
|
insertMode: 'append' | 'replace-selection'
|
|
autoSend: boolean
|
|
showPartialTranscript: boolean
|
|
pushToComposerWhileSpeaking: boolean
|
|
silenceAutoStopMs: number
|
|
}
|
|
```
|
|
|
|
### API frontend
|
|
|
|
Criar cliente dedicado:
|
|
|
|
- `src/api/stt.ts`
|
|
|
|
Endpoints planejados:
|
|
|
|
- `GET /api/stt/config/schema`
|
|
- `POST /api/stt/transcriptions`
|
|
- `POST /api/stt/realtime/session`
|
|
- `POST /api/stt/realtime/:sessionId/chunk`
|
|
- `POST /api/stt/realtime/:sessionId/commit`
|
|
- `DELETE /api/stt/realtime/:sessionId`
|
|
|
|
### Backend/extensão Pi
|
|
|
|
Adicionar ao `extensions/piagentui-server.ts` ou extrair para módulo dedicado se o arquivo ficar grande:
|
|
|
|
- parser seguro de multipart/audio para transcrição por arquivo;
|
|
- proxy para `/v1/audio/transcriptions`;
|
|
- gerenciador de sessão realtime;
|
|
- normalização de eventos para o frontend.
|
|
|
|
Formato de eventos para o frontend:
|
|
|
|
```ts
|
|
type SttEvent =
|
|
| { type: 'stt.session.started'; sessionId: string }
|
|
| { type: 'stt.transcript.delta'; sessionId: string; text: string; itemId?: string }
|
|
| { type: 'stt.transcript.completed'; sessionId: string; text: string; itemId?: string }
|
|
| { type: 'stt.error'; sessionId?: string; message: string; recoverable: boolean }
|
|
| { type: 'stt.session.closed'; sessionId: string }
|
|
```
|
|
|
|
### Segurança
|
|
|
|
- API keys não devem aparecer em logs.
|
|
- Configurações secretas devem ser mascaradas na UI.
|
|
- O backend deve limitar tamanho/duração de áudio.
|
|
- O backend deve validar `baseUrl` e impedir esquemas não HTTP(S).
|
|
- Erros do provedor devem ser normalizados, sem vazar headers.
|
|
- O usuário deve confirmar antes de habilitar auto-send de transcrição.
|
|
|
|
### Testes
|
|
|
|
Seguir TDD:
|
|
|
|
1. `src/api/stt.test.ts`
|
|
- monta payloads corretos;
|
|
- trata deltas/finais;
|
|
- mascara erros.
|
|
|
|
2. `src/store/sttSettingsStore.test.ts`
|
|
- defaults;
|
|
- persistência;
|
|
- atualização parcial;
|
|
- remoção de secret.
|
|
|
|
3. `src/features/voice/*.test.tsx`
|
|
- estados do botão;
|
|
- permissão negada;
|
|
- parcial/final no composer;
|
|
- auto-send desligado por padrão.
|
|
|
|
4. `extensions/piagentui-server.test.ts`
|
|
- endpoints STT;
|
|
- validação de config;
|
|
- proxy OpenAI-compatible;
|
|
- realtime session lifecycle com mocks.
|
|
|
|
## Plano de implementação recomendado
|
|
|
|
1. Atualizar `README.md` com foco PiAgentUI atual.
|
|
2. Adicionar uma seção curta no README para STT planejado.
|
|
3. Criar plano TDD específico para STT antes de escrever produção.
|
|
4. Implementar configuração STT.
|
|
5. Implementar transcrição por arquivo OpenAI-compatible.
|
|
6. Implementar botão de gravação e inserção no composer.
|
|
7. Implementar realtime OpenAI como provider padrão.
|
|
8. Adicionar fallback de arquivo para provedores sem realtime.
|
|
9. Fazer verificação manual no browser/Tauri.
|
|
|
|
## Critérios de aceite
|
|
|
|
### README
|
|
|
|
- Não deve mais vender o projeto como OpenCodeUI.
|
|
- Deve explicar claramente que o projeto atual é PiAgentUI.
|
|
- Deve listar funcionalidades reais já implementadas.
|
|
- Deve separar roadmap de funcionalidades existentes.
|
|
- Deve incluir comandos de desenvolvimento corretos.
|
|
|
|
### STT
|
|
|
|
- Usuário consegue configurar provider padrão OpenAI.
|
|
- Usuário consegue configurar provider externo OpenAI-compatible para `/audio/transcriptions`.
|
|
- Usuário consegue gravar áudio pelo microfone.
|
|
- Usuário vê transcrição parcial quando o provider realtime suporta.
|
|
- Usuário recebe texto final no composer.
|
|
- Auto-send fica desligado por padrão.
|
|
- Falhas de permissão, rede e provider são visíveis e recuperáveis.
|
|
- Testes cobrem API, store e UI principal.
|
|
|
|
## Fontes consultadas
|
|
|
|
- OpenAI Realtime transcription: https://developers.openai.com/api/docs/guides/realtime-transcription
|
|
- OpenAI GPT-4o Transcribe: https://developers.openai.com/api/docs/models/gpt-4o-transcribe
|
|
- OpenAI speech transcription methods cookbook: https://developers.openai.com/cookbook/examples/speech_transcription_methods
|
|
- Together AI transcription docs: https://docs.together.ai/docs/inference/transcription/overview
|
|
- Together AI Whisper Large v3: https://www.together.ai/models/openai-whisper-large-v3
|