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
11 KiB
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.tscomo 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
- Reescrever
README.mdem português para refletir o produto atual, não o projeto original OpenCodeUI. - Apresentar PiAgentUI como interface moderna para o Pi Agent e base futura de app completo tipo Codex/Claude.
- Documentar capacidades existentes de forma honesta, separando implementado, em andamento e roadmap.
- Projetar um sistema de áudio/STT completo, com opção padrão forte e configuração externa flexível.
- 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:
-
Título e tagline
# PiAgentUI- “Interface web/desktop para Pi Agent — caminhando para um app completo estilo Codex/Claude.”
-
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.
-
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.
- Listar capacidades implementadas:
-
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.
-
Arquitetura
- Frontend React/Vite/Tauri;
- extensão Pi como bridge local;
- Pi runtime como estado autoritativo;
- APIs locais
/api/*; - SSE para eventos.
-
Desenvolvimento local
npm install;npm run dev;npm run build;npm run test:run;npm run typecheck;npm run typecheck:extensions.
-
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.
-
Áudio e transcrição — planejado
- Resumir o plano STT sem prometer que já está implementado.
-
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-transcribecomo opção de maior qualidade;gpt-4o-mini-transcribecomo opção de menor custo;whisper-1para 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:
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:
{
"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.tsxsrc/features/voice/VoiceTranscriptOverlay.tsxsrc/features/voice/useVoiceRecorder.tssrc/features/voice/useRealtimeTranscript.tssrc/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:
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/schemaPOST /api/stt/transcriptionsPOST /api/stt/realtime/sessionPOST /api/stt/realtime/:sessionId/chunkPOST /api/stt/realtime/:sessionId/commitDELETE /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:
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
baseUrle 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:
-
src/api/stt.test.ts- monta payloads corretos;
- trata deltas/finais;
- mascara erros.
-
src/store/sttSettingsStore.test.ts- defaults;
- persistência;
- atualização parcial;
- remoção de secret.
-
src/features/voice/*.test.tsx- estados do botão;
- permissão negada;
- parcial/final no composer;
- auto-send desligado por padrão.
-
extensions/piagentui-server.test.ts- endpoints STT;
- validação de config;
- proxy OpenAI-compatible;
- realtime session lifecycle com mocks.
Plano de implementação recomendado
- Atualizar
README.mdcom foco PiAgentUI atual. - Adicionar uma seção curta no README para STT planejado.
- Criar plano TDD específico para STT antes de escrever produção.
- Implementar configuração STT.
- Implementar transcrição por arquivo OpenAI-compatible.
- Implementar botão de gravação e inserção no composer.
- Implementar realtime OpenAI como provider padrão.
- Adicionar fallback de arquivo para provedores sem realtime.
- 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