Ubuntu TechHive

Notes on my Pi setup

Notes on my Pi setup

As ferramentas principais do Pi são =read=, =bash=, =edit= e =write=. Arquivos de projeto =AGENTS.md= fornecem restrições específicas para o repositório.

Notas sobre minha configuração do Pi

Como uso o Pi

Eu uso o Pi como um assistente de codificação de terminal personalizável para inspecionar repositórios, fazer alterações focadas e executar verificações. Habilidades capturam fluxos de trabalho reutilizáveis; extensões adicionam delegação, pesquisa, retrocesso (rewind) e metas persistentes.

Minha CLI instalada é o Pi 1.5.2. Em ~/.pi/agent/settings.json, meu padrão é openai-codex/gpt-6.1-sol com raciocínio xhigh, tema escuro e blocos de raciocínio ocultos. Ocultar esses blocos altera a apresentação, não o esforço de raciocínio. Estas são seleções de modelos configuradas, não garantias de disponibilidade do provedor.

cd /path/to/project
pi
# Dentro do Pi: /login, /model, /reload

As ferramentas principais do Pi são read, bash, edit e write. Arquivos AGENTS.md do projeto fornecem restrições específicas do repositório. Extensões executam integrações; habilidades fornecem instruções específicas de tarefas carregadas quando relevantes.

Extensões instaladas

Esses pacotes são declarados nas minhas configurações de usuário e instalados em ~/.pi/agent/npm/node_modules/. As versões abaixo descrevem a configuração inspecionada, não fixações permanentes: minhas declarações de pacotes usam fontes npm: sem versão.

Pacote Instalado Meu uso
pi-subagents 0.88.1 Trabalhadores focados, revisores independentes, consultores e auditoria de escopo.
pi-web-access 0.47.0 Pesquisa na web, verificação de fontes, extração de página/PDF, pesquisa de repositório e vídeo.
pi-rewind-hook 1.8.8 Pontos de verificação de arquivos baseados em Git associados ao histórico da sessão; restauração via /tree ou /fork.
pi-goal-x 0.34.1 Metas persistentes explícitas, progresso de tarefas, pausa/retomada e auditoria de conclusão opcional.

Minha configuração extensions contém "-builtin:mcp": a integração MCP nativa do Pi está desativada. Os recursos abaixo vêm da documentação das extensões instaladas; eles não implicam que todos os recursos opcionais estejam habilitados nas minhas configurações.

pi-subagents: trabalho focado e julgamento independente

A delegação requer minha solicitação ou instruções aplicáveis, não apenas complexidade. subagents_enable expõe as ferramentas de delegação quando necessário. Um filho em primeiro plano executa como uma sessão dentro do processo pai; um filho em segundo plano usa um executor desanexado. Cada um recebe sua própria tarefa, contexto, ferramentas e seleção de modelo.

Eu separo o trabalhador de implementação da revisão/aconselhamento somente leitura e da auditoria de escopo (veja a tabela de funções abaixo). Revisões independentes podem ser executadas em paralelo; a implementação mantém um escritor por árvore de trabalho. contact_supervisor leva decisões de ponto de verificação e atualizações significativas de volta ao coordenador. /subagents-fleet inspeciona o trabalho em execução; /subagents-doctor diagnostica a configuração.

Exemplos de solicitações — não atividade automática em segundo plano:

Use o revisor para verificar esta alteração em relação aos meus requisitos sem editar.
Peça ao oráculo para desafiar este plano antes da implementação.

pi-web-access: pesquisa com evidências inspecionáveis

web_enable carrega as ferramentas de pesquisa sob demanda:

  • web_search: pesquisa ou consultas relacionadas em lote; workflow: "none" retorna resultados sem uma chamada separada de geração de resumo ou navegador curador.
  • fetch_content: recupera páginas, PDFs, repositórios ou conteúdo de vídeo suportado. O processamento em modo de resposta é uma interação de modelo opcional e separada.
  • get_search_content: navega pelos resultados armazenados ou encontra passagens exatas usando um responseId, em vez de buscar repetidamente o mesmo material.
  • source_check: coleta passagens e metadados de origem para revisão manual de alegações; a recuperação por si só não estabelece que uma alegação é verdadeira.

Pesquisas/buscas podem enviar dados para serviços externos. Mantenho credenciais, fontes privadas e detalhes de projetos não relacionados fora das consultas de pesquisa e exemplos.

pi-rewind-hook: arquivos e conversas podem ser restaurados separadamente

Através de /fork, posso manter arquivos enquanto crio uma ramificação da conversa, restaurar ambos, ou restaurar código enquanto mantenho a conversa. /tree oferece restauração exata de arquivos onde existe um ponto de verificação, além de desfazer quando disponível.

Os pontos de verificação pertencem aos limites de prompt/turno do assistente, não a cada chamada de ferramenta. O registro da sessão os grava; o Git mantém objetos de snapshot acessíveis através de refs/pi-rewind/store. A cobertura inclui arquivos rastreados e não rastreados não ignorados, não arquivos ignorados ou diretórios vazios. Isso complementa os commits normais. Não tenho substituição de rewind.retention: o padrão documentado é sem expiração automática, portanto, o armazenamento de snapshots pode crescer.

pi-goal-x: trabalho explícito e persistente

/goal discute um resultado e confirma um plano antes da execução; /sisyphus segue etapas ordenadas. Metas, tarefas e progresso persistem entre sessões. /goal-direct ignora o rascunho apenas quando eu escolho explicitamente.

/goal-status mostra o progresso, /goal-pause interrompe a continuação automática, /goal-resume continua e /goal-tweak revisa o objetivo ou plano. A auditoria de conclusão opcional usa um agente separado para verificar requisitos e evidências; sua disponibilidade não é uma alegação de que eu a habilitei. Tarefas comuns não se tornam metas implicitamente.

Minhas habilidades

Apenas commit-msg reside em ~/.pi/agent/skills/. O Pi também descobre o diretório compartilhado ~/.agents/skills/, onde vivem minhas outras habilidades pessoais/instaladas por ferramentas.

Local / habilidade Propósito
~/.pi/agent/skills/commit-msg Mensagens de commit no passado, multilinha, no estilo develop do repositório, baseadas apenas em alterações inspecionadas; sem mutações no Git.
~/.agents/skills/implementation-steps Cursos de reconstrução prática em scratch/implementation_steps/, com código de trabalho cumulativo e verificação.
~/.agents/skills/lightpanda Extração de DOM com reconhecimento de JavaScript e automação funcional de navegador; não é evidência de fidelidade de layout visual.
~/.agents/skills/rex Controla sessões, abas, painéis, comandos e saída de terminal do Rex através de sua CLI.
~/.agents/skills/ui-sdk Constrói e testa interfaces acessíveis baseadas em comportamento usando @ui-sdk/*.
~/.agents/skills/ui-ux-a11y Aplica as regras agrupadas de UI/UX, WCAG 2.2 AA, acessibilidade, contraste e validação.

O pacote de subagentes também fornece pi-subagents para orquestração e council-mode para debate de consultores limitado e somente leitura; essas são habilidades empacotadas.

Exemplo de invocação dentro do Pi:

/skill:commit-msg staged files

Trechos de habilidades incorporadas

Estes são trechos literais dos meus seis arquivos SKILL.md pessoais/instalados por ferramentas, não definições de habilidades substitutas. Arquivos de suporte e caminhos relativos ainda pertencem a cada diretório de habilidade original. A entrada curta do Rex está incluída na íntegra; habilidades mais longas são extraídas para manter estas notas legíveis.

commit-msg: evidência antes da redação

Fonte: ~/.pi/agent/skills/commit-msg/SKILL.md, “Core Contract”.

A mensagem de commit gerada DEVE:

1. Corresponder ao estilo e formato dos commits recentes da branch `develop`.
2. Usar tempo passado.
3. Ser multilinha.
4. Ser baseada exclusivamente em alterações de arquivos inspecionadas a partir da entrada solicitada.
5. Evitar alegações que não sejam suportadas pelos dados de diff/stat/name-status.
6. Evitar reutilizar um assunto de espaço reservado como `WIP` do(s) commit(s) de destino.
7. Evitar mutar o estado do git; esta habilidade é somente leitura.

implementation-steps: código de trabalho e ensinabilidade

Fonte: ~/.agents/skills/implementation-steps/SKILL.md, contrato de abertura.

Produza um curso de implementação prática para o alvo selecionado. Cada etapa
numerada inclui código-fonte de trabalho real e seu próprio README detalhado. Um aluno que
segue as etapas documentadas deve entender o que está escrevendo e por que, e
alcançar o código de destino capturado exatamente. Correção técnica, igualdade exata de
fonte e ensinabilidade são requisitos separados; nenhum substitui o outro.

Este fluxo de trabalho é independente de linguagem e framework. Inspecione o alvo em vez
de impor um runtime, arquitetura, número fixo de etapas ou escolhas de implementação de
tarefas anteriores. Crie os artefatos de aprendizado; deixe o alvo inalterado.

lightpanda: extração limitada, evidência apropriada

Fonte: ~/.agents/skills/lightpanda/SKILL.md, “CLI and persistent automation”.

Para uma URL autorizada conhecida, comece com uma extração limitada:

```zsh
lightpanda fetch --dump markdown --dump-max-bytes 12000 --fail-on-http-error 'http://127.0.0.1:PORT/PATH'
```

Substitua a URL por uma URL de aplicação observada. Use `--dump html` para marcação ou `--dump semantic_tree_text` para uma árvore semântica compacta. Inspecione o status e os erros do comando; um dump por si só não é prova de navegação ou interação bem-sucedida.

rex: carregar orientação da CLI instalada

Fonte: ~/.agents/skills/rex/SKILL.md, arquivo completo.

---
name: rex
description: Use a CLI rex para gerenciar sessões Rex, abrir abas, organizar painéis, executar comandos, inspecionar saída de terminal e controlar apps Rex conectados.
metadata:
  rex-stub: "2"
---


Execute `rex __internal skill` e siga o guia que ele imprime. O guia vem da
CLI Rex instalada, portanto, descreve os comandos disponíveis nessa versão.

Se o comando falhar, a versão do Rex instalada é anterior ao guia. Comece com
`rex whoami --json`, depois use `rex --help` e `rex COMANDO --help`.

ui-sdk: use documentação com versão correspondente

Fonte: ~/.agents/skills/ui-sdk/SKILL.md, “Read first”.

A documentação da versão instalada é enviada em cada pacote, como Markdown:

- `node_modules/@ui-sdk//docs/llms.txt` é o índice. Leia-o primeiro. `` é `react`, `vue`, `svelte`, `solid` ou `web`.
- Depois, leia apenas as páginas que sua tarefa precisa, como `docs/components/select.md`. Não leia a pasta `docs/` inteira; ela é grande.
- Uma interface construída a partir de nossos componentes não precisa de `docs/core.md`. Apenas o caminho 2 abaixo precisa, e mesmo assim você pesquisa por cabeçalho: tem mais de 300 KB. `docs/rendering.md` fica ao lado dela na mesma pasta `docs/`.
- Não leia JavaScript compilado em `dist/*.js`, nem para depurar. A documentação e os tipos `.d.ts` são a API; quando eles não responderem, escreva um pequeno teste que tente.

Aqui, “caminho 2” significa construir um componente/comportamento ausente a partir de @ui-sdk/core, em vez de compor componentes existentes.

ui-ux-a11y: preservar autoridade e escopo

Fonte: ~/.agents/skills/ui-ux-a11y/SKILL.md, “Scope and authority gate”.

Antes de editar ou aprovar trabalho:

1. Identifique o escopo de implementação autorizado pelo usuário, instruções do repositório e qualquer plano ou critério de aceitação aplicável no projeto atual.
2. Descubra e inspecione as fontes de verdade reais do projeto atual: comportamento do produto existente, referência fornecida pelo usuário, contrato de design, sistema de design, fonte de token e comportamento implantado quando a tarefa exigir. Não presuma nenhum nome de arquivo ou caminho.
3. Identifique cada ID de regra `UX-*`, `A11Y-*`, `CC-*` e `VAL-*` aplicável para as rotas, estados, locais, viewports, temas e interações afetados.
4. Registre a linha de base autoritativa exigida por `VAL-01` antes da implementação. Use uma linha de base de referência apenas quando a tarefa ou projeto atual definir uma.
5. Pare se uma fonte de verdade necessária estiver ausente ou se a conformidade exigir uma rota, recurso, redesign, fluxo de trabalho, dependência, conteúdo, permissão ou mudança de escopo de produto não aprovada.

Sua pasta de regras ui_ux_a11y/ completa permanece autoritativa; este trecho não substitui suas verificações de acessibilidade, contraste e experiência renderizada.

Delegação controlada

Meu subagents.agentOverrides separa a implementação do julgamento. Todas as quatro funções herdam o contexto do projeto e usam como padrão um contexto de conversa novo (substituições explícitas para funções somente leitura; o padrão agrupado para o trabalhador).

Função Modelo configurado Raciocínio Responsabilidade / ferramentas
worker openai-codex/gpt-6.1-sol médio Implementar pontos de verificação atribuídos; ler/pesquisar, bash, edit, write, contato com supervisor.
reviewer openai-codex/gpt-6.1-sol alto Revisão de correção e evidência somente leitura; apenas ler/pesquisar e contato com supervisor.
oracle openai-codex/gpt-6-astra médio Aconselhamento arquitetural e verificação de suposições somente leitura.
scopeCreepPatrol openai-codex/gpt-6-astra médio Rastreabilidade de requisitos e detecção de escopo não autorizado somente leitura.

scopeCreepPatrol tem sua definição de agente em ~/.agents/scopecreeppatrol.md; o modelo e outras substituições vêm das minhas configurações do Pi.

Para implementação delegada, o coordenador roteia o trabalho, toma decisões e mantém o registro — não código. O trabalhador verifica o código fornecido pelo consultor em relação aos arquivos atuais e requisitos aprovados, relata evidências de validação e solicita uma decisão de ponto de verificação antes da próxima unidade. Funções somente leitura retornam conclusões/código corretivo em linha, não arquivos. Recomendações não são aprovação do usuário.

O auditor de escopo verifica referências de requisitos, uma coluna literal 1 a N, origem do requisito e os status exatos no-started / in-progress / deferred / completed / not-applicable; ele não deve inventar o significado dessa coluna. Perguntas de bloqueio usam contact_supervisor com need_decision; atualizações não bloqueantes usam progress_update, sem conversa de rotina.

flowchart TD
    U["Requisitos e aprovações do usuário"] --> C["Coordenador: rotear e rastrear"]
    C --> W["Trabalhador: implementar um ponto de verificação"]
    W --> E["Arquivos alterados e evidência de validação"]
    E --> R["Revisor: correção"]
    E --> S["Patrulha de escopo: rastreabilidade"]
    C --> O["Oráculo: aconselhamento limitado"]
    R --> D["Coordenador: decisão de ponto de verificação"]
    S --> D
    O --> D
    D -->|Próxima unidade aprovada| W
    D -->|Requisitos atendidos| F["Relatório final"]

Minha configuração de subagentes

A seção subagents completa de ~/.pi/agent/settings.json está incorporada abaixo, incluindo todas as quatro substituições de função e seus prompts inalterados. O objeto JSON externo mostra onde ele pertence nas configurações; configurações não relacionadas são omitidas.

{
  "subagents": {
    "agentOverrides": {
      "worker": {
        "model": "openai-codex/gpt-6.1-sol",
        "thinking": "medium",
        "inheritProjectContext": true,
        "tools": [
          "read",
          "grep",
          "find",
          "ls",
          "bash",
          "edit",
          "write",
          "contact_supervisor"
        ],
        "systemPrompt": "Você é o trabalhador de implementação. Implemente apenas o trabalho atribuído rastreável aos requisitos reais do usuário. Nunca expanda o escopo sem aprovação prévia explícita do USUÁRIO. Recomendações do agente não são aprovação. O coordenador coordena, mantém o registro de progresso e retransmite o código criado pelo agente; ele não deve criar ou revisar código. Aplique o código fornecido pelo consultor apenas após verificar sua aplicabilidade aos arquivos atuais e requisitos aprovados. Em cada ponto de verificação de implementação atribuído, relate referências de requisitos, arquivos alterados, evidências de validação, trabalho restante e atualizações de registro necessárias; solicite a decisão do coordenador antes de iniciar a próxima unidade de implementação. Use contact_supervisor com o motivo need_decision para perguntas de bloqueio e decisões de ponto de verificação, ou progress_update para alterações materiais que exijam atenção do coordenador. Não envie narração de rotina ou mensagens de conclusão duplicadas. Nunca afirme que a validação passou sem evidências."
      },
      "reviewer": {
        "model": "openai-codex/gpt-6.1-sol",
        "thinking": "high",
        "inheritProjectContext": true,
        "defaultContext": "fresh",
        "tools": [
          "read",
          "grep",
          "find",
          "ls",
          "contact_supervisor"
        ],
        "systemPrompt": "Você é o revisor de implementação somente leitura. Revise o ponto de verificação do trabalhador atribuído em relação aos requisitos reais do usuário, à implementação, aos testes e às evidências de validação. Não edite arquivos nem crie arquivos de patch ou relatório. Retorne conclusões acionáveis com referências de requisitos, locais exatos, evidências e código de substituição concreto ou diffs unificados EM LINHA quando útil. Distinga defeitos reais de recomendações opcionais. Não expanda ou redefina o escopo e nunca trate suas recomendações como aprovação do usuário. Relate conclusões de bloqueio prontamente através de contact_supervisor; caso contrário, retorne uma revisão final concisa. Evite batimentos cardíacos, conclusões duplicadas e conversa de rotina. Identifique pontos de verificação obsoletos e alegações de conclusão não suportadas."
      },
      "oracle": {
        "model": "openai-codex/gpt-6-astra",
        "thinking": "medium",
        "inheritProjectContext": true,
        "defaultContext": "fresh",
        "tools": [
          "read",
          "grep",
          "find",
          "ls",
          "contact_supervisor"
        ],
        "systemPrompt": "Você é um consultor somente leitura que responde à pergunta específica atribuída pelo coordenador. Desafie suposições não suportadas, identifique riscos arquiteturais ou de correção e distinga fatos, incertezas e recomendações. Quando útil, forneça código corretivo real ou diffs unificados EM LINHA. Não edite arquivos nem crie arquivos de patch ou relatório. Preserve os requisitos reais do usuário; a expansão do escopo requer aprovação prévia explícita do USUÁRIO. Você não pode conceder essa aprovação. Escale decisões ausentes de bloqueio através de contact_supervisor; caso contrário, retorne sua resposta limitada sem conversa de progresso de rotina. Não invente requisitos adicionais nem inicie trabalho não relacionado."
      },
      "scopeCreepPatrol": {
        "model": "openai-codex/gpt-6-astra",
        "thinking": "medium",
        "inheritProjectContext": true,
        "defaultContext": "fresh",
        "tools": [
          "read",
          "grep",
          "find",
          "ls",
          "contact_supervisor"
        ],
        "systemPrompt": "Você é o auditor de escopo e rastreabilidade de requisitos somente leitura. Compare o ponto de verificação do trabalhador atribuído e o registro de progresso com os requisitos reais do usuário e aprovações prévias explícitas do usuário. Detecte expansão não autorizada, requisitos omitidos ou alterados e sugestões do agente deturpadas como autoridade do usuário. Verifique se o registro inclui referências de requisitos de implementação, uma coluna literal de 1 a N, status e origem do requisito. Não invente o significado de 1 a N. Preserve os status exatamente: no-started / in-progress / deferred / completed / not-applicable. Distinga requisito do usuário de requisito do agente; um requisito do agente não autoriza a expansão do escopo. Relate discrepâncias apoiadas por evidências prontamente através de contact_supervisor. Forneça código corretivo concreto EM LINHA quando útil e dentro do escopo existente. Nunca edite arquivos, crie arquivos de patch ou relatório, redefina requisitos, conceda aprovações ou fabrique portões de aceitação. Evite conversa de rotina."
      }
    },
    "watchdog": {
      "enabled": true,
      "scope": {
        "enabled": true
      },
      "clarification": true,
      "main": {
        "model": "openai-codex/gpt-6-astra",
        "thinking": "medium"
      },
      "cadence": {
        "everyNTools": 16
      },
      "children": {
        "enabled": false,
        "overrides": {
          "worker": {
            "enabled": true,
            "model": "openai-codex/gpt-6.1-sol",
            "thinking": "high",
            "cadence": {
              "everyNTools": 8
            }
          }
        }
      }
    }
  }
}

Comportamento do watchdog

O watchdog é um mecanismo de revisão de segundo modelo separado, não a função reviewer. O watchdog principal verifica a cada 16 resultados de ferramentas e em limites de trabalho alterado elegíveis. O monitoramento de escopo e o esclarecimento da sessão principal estão habilitados. Os watchdogs filhos estão desligados exceto para o trabalhador: sua substituição explícita habilita a revisão a cada oito resultados de ferramentas e em limites elegíveis, usando Sol/alto. Estes são gatilhos de atividade/limite, não um loop de sondagem ocioso.

Comandos de inspeção úteis dentro do Pi: /subagents-fleet, /subagents-doctor e /subagents-watchdog status.

Inferência local: uma API HTTP suportada pelo Pi

Meu workspace Bun/TypeScript local-inference/ expõe uma API de Chat Completions compatível com OpenAI em http://127.0.0.1:8081/v1. É um gateway HTTP local para provedores gerenciados pelo Pi, não um servidor de pesos de modelo no dispositivo.

  • packages/protocol: Validação de solicitação Zod 4 e o contrato de backend.
  • packages/pi-proxy: ModelRuntime público do Pi para resolução de modelo, credenciais salvas, atualização OAuth e streaming nativo.
  • packages/server: Bun.serve, tradução HTTP/SSE, cancelamento, contrapressão e envelopes de continuação criptografados.

O gateway fixa @earendil-works/pi-coding-agent e @earendil-works/pi-ai em 1.5.0, independentemente da versão 1.5.2 da minha CLI instalada.

flowchart LR
    C["Cliente HTTP"] -->|Chat Completions| H["local-inference: servidor HTTP Bun"]
    H --> V["Solicitação validada por Zod"]
    V --> M["Pi ModelRuntime"]
    P["Configuração de modelo Pi e login salvo"] --> M
    M --> Q["Provedor upstream configurado"]
    Q -->|Stream nativo| M
    M -->|Texto, raciocínio, eventos de ferramenta| H
    H -->|Deltas SSE| C
    C --> T["Execução de ferramenta opcional no lado do cliente"]
    T -->|Resultados da ferramenta na próxima solicitação| H

Cada solicitação realiza um turno do provedor: o gateway não executa ferramentas nem edita arquivos. A execução da ferramenta pertence ao cliente. O texto flui separadamente do raciocínio; desconexões/desligamentos cancelam o trabalho upstream. Dados de continuação nativos usam um envelope reasoning_details autenticado e criptografado.

Após entrar no provedor desejado com o Pi, inicie o gateway a partir do diretório que contém local-inference/:

cd local-inference
bun install --frozen-lockfile
bun run start -- --port 8081

Em outro terminal, inspecione o listener ou faça explicitamente uma solicitação em stream (o POST usa a conta do provedor e pode incorrer em uso):

curl http://127.0.0.1:8081/healthz
curl http://127.0.0.1:8081/v1/models
curl -N http://127.0.0.1:8081/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"openai-codex/gpt-6.1-sol","stream":true,
       "messages":[{"role":"user","content":"Reply with hello."}]}'

IDs de modelo são strings exatas provider/model; /v1/models anuncia modelos, mas não é uma lista de permissões de admissão. O Pi possui o suporte ao provedor e o manuseio de credenciais. O listener de loopback padrão não precisa de token de cliente; a vinculação fora do loopback exige um. --token-env NAME protege opcionalmente o listener, independentemente do login do provedor. Nunca publique auth.json ou tokens.

A API suporta texto e ferramentas de função, não imagens, respostas com restrição de esquema ou o endpoint de Respostas. Os clientes devem usar Chat Completions. Execute bun run typecheck a partir de local-inference/ para verificar os tipos do gateway.

Código de local-inference

Estes são trechos literais, não programas autônomos: a classe, os tipos e as definições de auxiliares ao redor permanecem nos arquivos de origem nomeados. Nenhuma aplicação cliente ou namespace de pacote não relacionado é reproduzido aqui.

Criar o runtime do Pi e listar modelos anunciados

De local-inference/packages/pi-proxy/src/index.ts. Credenciais e configuração do provedor permanecem atrás de ModelRuntime; a atualização e a listagem recebem o sinal de cancelamento da solicitação.

  static async create(options: PiBackendOptions = {}): Promise<PiBackend> {
    const { provider, ...runtimeOptions } = options;
    return new PiBackend(await ModelRuntime.create(runtimeOptions), provider);
  }

  async models(signal: AbortSignal) {
    await this.runtime.refresh({ providers: this.provider ? [this.provider] : undefined, signal });
    signal.throwIfAborted();
    const available = await this.runtime.getAvailable(this.provider, { signal });
    return available.map(model => ({ id: this.provider ? model.id : `${model.provider}/${model.id}`, owned_by: model.provider }));
  }

Resolver o provedor preservando o ID de modelo exato solicitado

Do mesmo arquivo. O Pi fornece metadados do provedor e resolução de modelo personalizado; a camada HTTP retém o ID de modelo exato do chamador em vez de aplicar conveniências de nome difuso ou sufixo de raciocínio da CLI a ele.

  async resolve(id: string, signal: AbortSignal): Promise<InferenceModel> {
    signal.throwIfAborted();
    const slash = id.indexOf("/");
    const provider = this.provider ?? (slash > 0 ? id.slice(0, slash) : undefined);
    const modelId = this.provider ? id : id.slice(slash + 1);
    if (!provider) throw new ApiError(400, "Use provider/model como o ID do modelo, ou comece com --provider");
    await this.runtime.refresh({ providers: [provider], signal });
    signal.throwIfAborted();
    const selected = resolveCliModel({ cliProvider: provider, cliModel: modelId, modelRuntime: this.runtime });
    if (!selected.model) throw new ApiError(400, selected.error ?? "O Pi não pôde resolver o modelo solicitado", "model_resolution_error");
    // O Pi possui a construção do modelo, metadados do provedor e suporte a modelo personalizado.
    // Seu resolvedor CLI também aceita nomes difusos/sufixos de raciocínio; um campo de modelo HTTP
    // é um ID exato, então essas conveniências não devem reescrever esse campo.
    return { ...selected.model, id: modelId };
  }

Escolher a API de streaming do Pi

De PiBackend.stream no mesmo arquivo. Opções de raciocínio compartilhadas usam streamSimple; opções nativas reasoningEffort usam stream.

    const events = request.reasoningEffort === undefined
      ? this.runtime.streamSimple(model, context, request)
      : this.runtime.stream(model, context, request);

Manter texto e raciocínio separados no fio

De local-inference/packages/server/src/index.ts, dentro do switch de eventos. Deltas de texto são emitidos conforme chegam, sem esperar pela conclusão do provedor.

      case "text_delta": source.push(event.delta); await chunk({ content: event.delta }); break;
      case "thinking_delta": await chunk({ reasoning_content: event.delta }); break;

Referências

Fontes para o harness, extensões, ferramentas baseadas em habilidades e bibliotecas que uso com o Pi: