#Integração com PowerShell (Windows)

Para facilitar a interação com a CLI STT (Speech-to-Text), você pode adicionar uma função de atalho ao seu perfil do PowerShell. Isso permite que você simplesmente digite s "sua pergunta" em qualquer janela do PowerShell.

Aplica-se a: Windows PowerShell 5.1 e PowerShell 7+ (recomendado). O PowerShell 7 pode ser instalado a partir do Microsoft Store ou via winget install Microsoft.PowerShell.

Instruções de configuração

1. Permitir execução de script (configuração única)

O PowerShell bloqueia scripts por padrão. Abra o PowerShell como administrador e execute:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

2. Abra seu perfil do PowerShell

notepad $PROFILE

Se o arquivo ainda não existir, crie-o primeiro:

New-Item -ItemType File -Path $PROFILE -Force
notepad $PROFILE

3. Cole o seguinte bloco no final do arquivo

CODE_BLOCO_3

4. Recarregue seu perfil

# --- STT Project Path Resolution ---
function s {
    param(
        [Parameter(ValueFromRemainingArguments = $true)]
        [string[]]$Query
    )

    if ($Query.Count -eq 0) {
        Write-Host "question <your question>"
        return
    }

    $QueryString = $Query -join " "

    Update-GithubIp   # equivalent of update_github_ip

    $SHORT_TIMEOUT_SECONDS = 2
    $LONG_TIMEOUT_SECONDS  = 70

    # Path shortcuts
    $PY_EXEC   = "$env:SL5NET_AURA_PROJECT_ROOT\.venv\Scripts\python.exe"
    $CLI_SCRIPT = "$env:SL5NET_AURA_PROJECT_ROOT\scripts\py\cli_client.py"

    $TempFile = [System.IO.Path]::GetTempFileName()

    # --- 1. First try (short timeout) ---
    $proc = Start-Process -FilePath $PY_EXEC `
        -ArgumentList "-u", "`"$CLI_SCRIPT`"", "`"$QueryString`"", "--lang", "de-DE", "--unmasked" `
        -RedirectStandardOutput $TempFile `
        -RedirectStandardError  "$TempFile.err" `
        -NoNewWindow -PassThru

    $finished = $proc.WaitForExit($SHORT_TIMEOUT_SECONDS * 1000)
    $Output   = Get-Content $TempFile -Raw -ErrorAction SilentlyContinue

    if (-not $finished) {
        # Still running — this is the timeout case
        $ExitCode = 124
    } else {
        $ExitCode = $proc.ExitCode
    }

    Remove-Item $TempFile, "$TempFile.err" -ErrorAction SilentlyContinue

    # --- Service check ---
    $streamlitRunning = Get-Process -Name "streamlit" -ErrorAction SilentlyContinue
    if (($Output -match "Verbindungsfehler") -or (-not $streamlitRunning)) {
        Write-Host "Service-Check: Backend oder Frontend fehlt. Starte neu..."
        Start-Service-STT   # equivalent of start_service
        Write-Host "++++++++++++++++++++++++++++++++++++++++++++++++++"

        $KiwixScript = "$env:SL5NET_AURA_PROJECT_ROOT\config\maps\plugins\standard_actions\wikipedia_local\de-DE\kiwix-docker-start-if-not-running.sh"
        if (Test-Path $KiwixScript) {
            bash $KiwixScript
        }

        Write-Host "++++++++++++++++++++++++++++++++++++++++++++++++++"
        Write-Host "BITTE ERNEUT EINGEBEN: s $QueryString"
        return
    }

    # --- 2. Timeout OR immediate success ---
    if ($ExitCode -eq 124 -or $ExitCode -eq 0) {
        if ($ExitCode -eq 0) {
            Write-Host $Output
            return
        }

        Write-Host "answer > $SHORT_TIMEOUT_SECONDS sec. set Timeout= $LONG_TIMEOUT_SECONDS s..."

        $TempFile2 = [System.IO.Path]::GetTempFileName()
        $proc2 = Start-Process -FilePath $PY_EXEC `
            -ArgumentList "-u", "`"$CLI_SCRIPT`"", "`"$QueryString`"", "--lang", "de-DE", "--unmasked" `
            -RedirectStandardOutput $TempFile2 `
            -RedirectStandardError  "$TempFile2.err" `
            -NoNewWindow -PassThru

        $finished2 = $proc2.WaitForExit($LONG_TIMEOUT_SECONDS * 1000)
        $Output2   = Get-Content $TempFile2 -Raw -ErrorAction SilentlyContinue
        $ExitCode2 = if ($finished2) { $proc2.ExitCode } else { 124 }

        Remove-Item $TempFile2, "$TempFile2.err" -ErrorAction SilentlyContinue

        Write-Host $Output2

        if ($ExitCode2 -ne 0) {
            Write-Host "WARNUNG: Timeout > $LONG_TIMEOUT_SECONDS Sec."
        }
        return
    }

    # --- Unexpected error ---
    Write-Host "ERROR"
    Write-Host $Output
}

Notas específicas do Windows

  • Caminho Python: No Windows, o binário do ambiente virtual está em .venv\Scripts\python.exe em vez de .venv/bin/python3. Ajuste $PY_EXEC se sua configuração for diferente.

  • Variável de ambiente SL5NET_AURA_PROJECT_ROOT: Defina isso nas variáveis de ambiente do seu sistema ou adicione a seguinte linha acima da função em seu perfil: CODE_BLOCO_5

  • timeout / mktemp: Essas ferramentas Unix não estão disponíveis nativamente. O script acima usa equivalentes nativos do PowerShell (WaitForExit com tempo limite de milissegundos e GetTempFileName()).

  • pgrep: Substituído por Get-Process -Name "streamlit".

  • start_service / update_github_ip: Devem ser definidas como funções do PowerShell (Start-Service-STT, Update-GithubIp) no mesmo arquivo de perfil, antes da função s.

  • Script WSL Kiwix: Se bash estiver disponível (via WSL), o script auxiliar .sh será executado como está. Caso contrário, adapte-o para um equivalente .ps1 ou .bat.

  • Várias versões do PowerShell: $PROFILE aponta para arquivos diferentes para Windows PowerShell 5.1 e PowerShell 7. Para verificar qual arquivo de perfil está ativo, execute $PROFILE em cada versão.

Características

  • Caminhos Dinâmicos: Encontra automaticamente a raiz do projeto através da variável de ambiente SL5NET_AURA_PROJECT_ROOT.

  • Auto-Restart: Se o backend estiver inativo, ele tenta executar o Start-Service-STT e os serviços locais da Wikipedia.

  • Tempos limite inteligentes: primeiro tenta uma resposta rápida de 2 segundos e depois volta para um modo de processamento profundo de 70 segundos.