Escreva no GitHub a partir do agente com segurança: toda gravação passa primeiro por aprovação humana e o token nunca chega a um log.
Um plugin de host para o DeepSeek Harness que conecta PRs, revisões, issues e CI: 15 ferramentas, 4 famílias de comandos, jobs de revisão em segundo plano, uma ação composta de CI e uma barreira de status-check.
Instalação · Configuração · FAQ · 简体中文 · English · Español · Português · हिन्दी
dsh plugin --profile <name> add @perrylink/dsh-githubPlugin da comunidade, não afiliado à DeepSeek. Repositório canônico: https://github.com/PerryLink/dsh-github (o Gitee é um espelho). É publicado no npm como @perrylink/dsh-github; o nome simples dsh-github pertence a outro projeto não relacionado. Migrado para dsh-github-bot: este repositório fica como índice/backup, o pacote npm antigo @perrylink/dsh-github está obsoleto — para trabalho novo instale dsh-github-bot.
dsh-github coloca o GitHub dentro do turno do agente e, ao mesmo tempo, amarra cada gravação a uma aprovação: ferramentas como pr_create, pr_merge, review_post e issue_close só chegam ao GitHub depois que ctx.approval devolve um sim explícito. As superfícies de leitura — metadados de PR, diff truncado, arquivos, busca e checks — respondem sem perguntar. /review roda um analisador determinístico de vários arquivos como job em segundo plano em ctx.jobs, e o lado de CI traz uma ação composta, um bot de revisão por polling e uma barreira de status-check. O token é resolvido por operação na camada de credenciais, no ambiente ou na CLI gh, enviado apenas no cabeçalho Authorization e nunca aparece em logs, eventos, cards, saídas de comandos ou erros.
-
Instale (escolha um canal):
# canal git (último main; equivale a git+https://github.com/PerryLink/dsh-github.git) dsh plugin --profile web add github:PerryLink/dsh-github # canal npm (versões publicadas) dsh plugin --profile web add @perrylink/dsh-github # canal tarball: pnpm pack neste repositório e depois dsh plugin --profile web add ./perrylink-dsh-github-<version>.tgz
O script
preparecompila apenas com dependências de produção, então o canal git não precisa de preparação extra. -
Configuração mínima (os padrões funcionam; fixe a fonte do token se precisar):
- insert: - id: dsh-github name: '@perrylink/dsh-github' config: tokenSource: auto autoCommit: false
tokenSource: autotenta o campo da página Plugins → o arquivo de credenciais → o ambiente → a CLIgh, nessa ordem; o token nunca entra neste YAML. -
Verifique que monta:
dsh --profile web --dump-config | grep -A3 'id: dsh-github'
Uma linha com
id: dsh-githubsignifica que o plugin montou; a primeira gravação passa por aprovação.
Desinstalar: dsh plugin --profile web remove @perrylink/dsh-github (ou remova a linha do patch de perfil).
Instalar a partir do mercado do DSH Desktop
Todos os plugins PerryLink podem ser explorados no mercado integrado do DSH Desktop: Market → Sources → add source → colar https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json → selecionar. A instalação continua passando pela verificação de identidade npm do mercado e pela sua confirmação.
São os pontos de entrada reais; instale e chame um.
Exemplo detalhado — comando pr_create, entrada:
{
"title": "feat: shiny",
"body": "desc"
}Saída:
created pull request #7: https://github.com/o/r/pull/7 (main ← feat/shiny)
Observed from plugins/dsh-github/test/tools.test.ts:69-74 (fixture + assertions); renderer at plugins/dsh-github/src/tools.ts:189
Ramo de falha — sem nenhum token utilizável, entrada:
{"title":"x"} (credentials seam empty; GITHUB_TOKEN unset; gh not logged in)
Saída:
{
"status": "error",
"code": "no-token",
"message": "no GitHub token found (source: credentials/env/gh)",
"guidance": "Configure one of: 1) a dsh credential for this reference (recommended; $DSH_HOME/.credentials.yaml), 2) the same-named environment variable, or 3) `gh auth login` for the gh CLI. Set `tokenSource` in cordis.yml to pin one source."
}
Observed from plugins/dsh-github/src/credential.ts:96-104; plugins/dsh-github/test/tools.test.ts:88-93
Exemplos breves: pr_merge · gh_review
O dsh-github preenche a lacuna do GitHub entre o dsh e ferramentas como Claude Code e Codex: o agente pode ler, revisar, abrir, atualizar e mesclar pull requests, ler metadados de repositórios e arquivos, comentar e fechar issues, e pesquisar — enquanto um humano aprova toda gravação e o token permanece em segredo.
- 15 ferramentas —
pr_create,pr_merge,pr_update,gh_review,review_post,gh_issue,issue_open,issue_comment,issue_close,gh_search,gh_repo,gh_file,gh_repo_search,gh_checks, todas com JSON canônico viadefineTool, mais a ferramenta de execução únicaci_runquandoci.enabledestá ligado. - 4 famílias de comandos —
/pr create,/review(start/stop/post),/issue opene/ci(scan/status/start/stop/run) sobci.enabled. - Ciclo de vida completo do PR — criar → revisar → atualizar (título/corpo/estado/rama base) → mesclar (merge/squash/rebase, exclusão opcional da rama head).
- Revisões inline —
review_postpublica um único comentário de resumo ou comentários de revisão ancorados por linha no commit head do PR. - Gravações com aprovação — toda gravação no GitHub passa por
ctx.approval(padrãoask, falha fechada); os motivos de aprovação pré-visualizam títulos, tamanhos de corpo e substituições de comentários. - Sigilo do token — camada de credenciais → ambiente → CLI
gh, resolvido por operação, nunca em logs, eventos, renderizações ou erros. - Jobs de revisão em segundo plano —
/reviewroda emctx.jobscom a própria superfíciejob_list/job_output/job_killdo host. - Resiliência — nova tentativa em 429 com backoff
Retry-After/x-ratelimit-reset; as ferramentas de leitura são seguras para concorrência; todas as chamadas respeitam o cancelamento. - Superfície de CI — a ferramenta de execução única
ci_run, um bot de revisão por polling e uma barreira de status-check (ação compostaaction.yml).
| Superfície | Tipo | Observações |
|---|---|---|
pr_create |
ferramenta | Cria uma pull request (gravação; com aprovação) |
pr_merge |
ferramenta | Mescla uma PR (merge/squash/rebase, exclusão opcional da rama head) |
pr_update |
ferramenta | Atualiza uma PR (título/corpo/estado/rama base) |
gh_review |
ferramenta | Lê uma PR: metadados, diff limitado, comentários, CI, achados estáticos |
review_post |
ferramenta | Publica um comentário de revisão (resumo ou inline ancorado por linha) |
gh_issue |
ferramenta | Lista / obtém / comenta issues (PRs marcados kind: "pr") |
issue_open |
ferramenta | Cria um issue |
issue_comment |
ferramenta | Comenta um issue ou PR |
issue_close |
ferramenta | Fecha um issue (motivo de estado opcional) |
gh_search |
ferramenta | Pesquisa issues e PRs (cota de busca separada) |
gh_repo |
ferramenta | Lê os metadados do repositório |
gh_file |
ferramenta | Lê um arquivo em uma rama/tag/commit |
gh_repo_search |
ferramenta | Busca GraphQL de repositórios (cota de busca separada) |
gh_checks |
ferramenta | Checks de status GraphQL de um PR (check runs + commit statuses) |
/pr create |
comando | Lê o estado do git e enfileira uma instrução pr_create |
/review |
comando | Inicia / para / publica um job de revisão em segundo plano |
/issue open |
comando | Enfileira uma instrução issue_open |
/ci |
comando | Driver de CI: scan / status / start / stop / run (ci.enabled) |
ci_run |
ferramenta | Revisão CI de execução única conduzida pela ação composta / driver CI |
| bot de revisão | superfície | Bot de revisão por polling com comentários inline idempotentes (ci.*) |
| barreira de status-check | superfície | Publica o veredito success / needs-changes por commit head de PR (action.yml) |
- Camada de credenciais.
tokenSource: autoresolve por operação na ordem camada de credenciais (referênciaGITHUB_TOKEN) → variável de ambiente → token da CLIgh. O valor é uma variável local entregue ao cliente REST; ele nunca entra em valores canônicos, renderizações, cards, saídas de comandos, avisos injetados, saídas de jobs, motivos de aprovação ou mensagens de erro. - Barreira de aprovação. Todas as gravações passam pelas ferramentas do modelo. Um listener waterfall
tools/pre-executeretornaaskpara as ferramentas de gravação, de modo que o registro pergunta ao humano por meio dectx.approval(o host registra o par de auditoriaapproval/asked+approval/decided) e falha fechado sem um respondedor. Comandos nunca gravam diretamente: um comando de gravação coleta contexto somente leitura e então acorda o agente para que o modelo execute a ferramenta com aprovação dentro de um turno. - Job de revisão em segundo plano.
/review <pr>inicia um jobgithub-reviewemctx.jobs; o job busca metadados (capturando o SHA do commit head para a publicação inline), o diff limitado, as verificações de CI e os comentários existentes, e então executa o analisador determinístico de múltiplos arquivos (src/review.ts). O job pertence aoSessionIdpuro do agente que chama — o0.1.7-alpha.1fecha o registro sobreSessionId, sem união comAgent—, entãodsh-tool-jobsprecisa estar composto oustartrecusa. ComreviewMode: "model", o job entrega o diff limitado a um subagente de uso único pela seamsubagentsdo host. A conclusão chega à sessão por meio do consumidordsh-tool-jobsdo host; o modelo a lê comjob_outpute a publica comreview_post. - Ação composta de CI / bot de revisão / barreira de status-check. O repositório inclui uma ação composta (
action.yml) que revisa PRs, corrige CI e escreve o relatório; um bot de revisão por polling publica comentários inline idempotentes; e uma barreira de status-check publica o veredito por commit head de PR. A ferramenta de execução únicaci_runconduz a execução headless. Toda gravação permanece sujeita a aprovação.
Todos os ajustes são campos Config do Schemastery (modificáveis a partir do cordis.yml). Uma substituição direcionada por id troca toda a linha — redeclare cada chave de que você precisa. O cordis.patch.yml documenta cada chave em linha. Na GUI, o cartão de configurações da página Plugins (grupo Official) lê tokenRef do próprio formulário de configuração da entrada — o host 0.1.7-alpha.1 removeu a vinculação ctx.settingsScope e a costura de registro de namespace por trás dela, então o cartão não possui mais um namespace de configuração. O token em si é o campo githubToken da entrada: o cartão o grava ali e a metade host o resolve antes do arquivo de credenciais, do ambiente e do CLI gh.
Chaves mais usadas:
| Chave | Padrão | Significado |
|---|---|---|
tokenSource |
auto |
auto (campo da página → credenciais → ambiente → gh) ou um de config / credentials / env / gh |
tokenRef |
GITHUB_TOKEN |
Referência da camada de credenciais / nome da variável de ambiente |
githubToken |
— | Token salvo pela página Plugins; texto puro na configuração do perfil, usado primeiro enquanto não estiver vazio |
defaultOwnerRepo |
— | Fallback owner/repo quando uma chamada não nomeia nenhum e o git não tem origin |
autoCommit |
false |
Se /pr create pode instruir o modelo a fazer commit + push primeiro |
maxDiffChars |
8000 |
Limite de caracteres para diffs de PR lidos nas revisões |
reviewMode |
static |
Motor de revisão: static (analisador determinístico) ou model (subagente de uso único pela seam subagents do host; falha em alto e bom som quando a seam está ausente) |
ci |
{ enabled: false, … } |
Seção de integração CI: bot de revisão por polling, barreira de status-check e a ferramenta de execução única ci_run (contém todas as chaves ci.*) |
Tabela de configuração completa (23 chaves)
| Chave | Padrão | Significado |
|---|---|---|
tokenSource |
auto |
auto (campo da página → credenciais → ambiente → gh) ou um de config / credentials / env / gh |
tokenRef |
GITHUB_TOKEN |
Referência da camada de credenciais / nome da variável de ambiente |
githubToken |
— | Token salvo pela página Plugins; texto puro na configuração do perfil, usado primeiro enquanto não estiver vazio |
defaultOwnerRepo |
— | Fallback owner/repo quando uma chamada não nomeia nenhum e o git não tem origin |
autoCommit |
false |
Se /pr create pode instruir o modelo a fazer commit + push primeiro |
maxDiffChars |
8000 |
Limite de caracteres para diffs de PR lidos nas revisões |
renderExcerptChars |
2000 |
Limite de caracteres para o trecho de diff renderizado na saída da ferramenta |
maxComments |
20 |
Limite para comentários de PR listados por gh_review |
reviewJobTimeoutMs |
600000 |
Prazo para um job de revisão em segundo plano (falha com timeout) |
maxReviewRecords |
50 |
Limite para registros em memória de jobs de revisão; os registros concluídos mais antigos são removidos primeiro |
maxFileChars |
12000 |
Limite de caracteres para o conteúdo de arquivos lido por gh_file |
maxFindings |
50 |
Limite de achados do analisador por revisão |
maxLineLength |
300 |
Comprimento de linha a partir do qual o analisador marca um achado de linha longa |
reviewMode |
static |
Motor de revisão: static (analisador determinístico) ou model (subagente de uso único pela seam subagents do host; falha em alto e bom som quando a seam está ausente) |
modelReviewProvider |
— | Nome do provedor de subagente para reviewMode: "model"; usa, por padrão, o primeiro provedor registrado |
maxRetries |
3 |
Tentativas de nova tentativa em 429 por requisição |
retryBaseMs |
500 |
Base do backoff de nova tentativa (dobra a cada tentativa) |
retryMaxWaitMs |
60000 |
Teto do backoff de nova tentativa |
requestTimeoutMs |
30000 |
Timeout rígido por requisição; aborta o fetch ao exceder |
apiBaseUrl |
https://api.github.com |
URL base da API REST do GitHub (GitHub Enterprise) |
allowedActions |
['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close','ci.run'] |
Allowlist de ações de gravação; qualquer outra coisa é negada antes da aprovação |
workspaceDir |
process cwd | Diretório de trabalho para inspeção somente leitura do git |
ci |
{ enabled: false, … } |
Seção de integração CI: bot de revisão por polling, barreira de status-check e a ferramenta de execução única ci_run (contém todas as chaves ci.*) |
Exemplo de substituição no patch de perfil:
- insert:
- id: dsh-github
name: '@perrylink/dsh-github'
config:
tokenSource: auto
tokenRef: GITHUB_TOKEN
autoCommit: false
reviewMode: static
allowedActions: [pr.create, review.post, issue.create, issue.comment, issue.close, pr.merge, pr.update, ci.run]O plugin guarda o token? Onde ficam os dados de revisão?
O plugin nunca persiste o token: resolve um por operação na ordem de tokenSource e o coloca apenas no cabeçalho Authorization, nunca em logs, eventos, cards, saídas de comandos ou erros. A única exceção é um githubToken que você salva na página Plugins — ele fica na configuração do perfil como texto puro (a mesma exposição de um arquivo de credenciais); deixe-o vazio quando a configuração for compartilhada e use uma referência de credenciais, o ambiente ou gh auth login. Os relatórios de revisão vivem na memória do processo por job id; nada durável é gravado em disco.
O que acontece sem token ou sem respondedor de aprovação? Falha em silêncio?
Sem token, a ferramenta devolve um erro estruturado com code: "no-token" e três rotas de configuração. Se faltar o serviço de aprovação ou não houver respondedor, a gravação falha fechada em vez de passar. Ambos são erros visíveis, não um sucesso falso.
Ele disputa nomes de ferramenta, eventos ou slots com outros plugins?
Não. Todas as ferramentas têm namespace, ele não fornece nenhuma chave de serviço, não registra slot de cliente nem prefixo webServer; o evento compartilhado tools/pre-execute é observado com a semântica de broadcast de ctx.on() e cada listener delega via next(), então a cadeia nunca é curto-circuitada. A argumentação ponto a ponto está em «Interoperabilidade com outros plugins do DSH».
Revisão estática ou revisão com modelo?
O padrão reviewMode: "static" é determinístico, sem tokens e reproduzível — o certo para a maioria dos PRs. reviewMode: "model" entrega o diff limitado a um subagente de uso único, consome tokens e exige a seam subagents e um provedor registrado; se faltarem, falha em alto e bom som no carregamento.
E os limites de taxa do GitHub ou uma rede instável?
Os 429 são repetidos com backoff a partir de Retry-After / x-ratelimit-reset (maxRetries, retryBaseMs e retryMaxWaitMs são ajustáveis), e cada requisição tem um requestTimeoutMs rígido. A cota restante é exibida em todo resultado, incluindo falhas.
- Aprovação, não aplicação. As gravações apenas produzem decisões
ask/deny na camada oficial; o sandbox e os sistemas de aprovação continuam sendo a autoridade de aplicação. - Falha fechada. A ausência de respondedor de aprovação degrada para a decisão mais estrita — nunca para uma passagem silenciosa.
- O token nunca sai do processo. É lido por operação e enviado apenas no cabeçalho Authorization; nunca é registrado, renderizado, injetado nem aparece em erros.
- Sem gravações fora da aprovação.
/pr createnunca faz commit ou push por conta própria; comautoCommit: true, o modelo realiza essas gravações pela própria barreira de aprovação da ferramenta bash. O job de revisão não realiza gravações; apenasreview_postpublica, após aprovação. - Conteúdo não confiável é escapado e marcado.
formatPostBodyescapa as crases e em HTML os nomes de arquivo derivados do diff, e o conteúdo externo do GitHub (arquivos, corpos, comentários, resultados de busca) é marcado como externo nas renderizações. - Trabalho limitado e limites de taxa. Os 429 são repetidos com backoff; a cota restante é exibida em todo resultado, incluindo falhas.
- Permissões: as gravações usam a camada de aprovação oficial; nada é reimplementado nem contornado. O plugin declara
network:outboundefilesystem:writeem seu manifesto de workshop. - Dados: o relatório de revisão vive na memória do processo, indexado pelo id do job; nada durável é gravado em disco.
- Log de sessão: o plugin não adiciona tipos de evento de sessão personalizados; todo conteúdo visível ao modelo flui por superfícies registradas pelo host (
tool/result,user/message,command/run,approval/asked…). Os avisos que os comandos enfileiram carregam o kind de origem próprio do plugin,{ kind: 'dsh-github', form: 'notice', summary }— o host não tem um kindplugingenérico e sua rota de admissão do formato de sessão o recusa de imediato.
- Sem eventos de sessão personalizados — deliberado (veja Arquitetura); as trilhas de auditoria dependem do próprio vocabulário de eventos do host.
- Analisador estático por padrão — regras determinísticas (
src/review.ts), zero tokens, reproduzível.reviewMode: "model"consome tokens e requer a seamsubagentse um provedor registrado. - Jobs e registros são locais ao processo — o relatório de revisão vive na memória do plugin, indexado pelo id do job; o mapa de registros é limitado por
maxReviewRecords(os registros concluídos mais antigos são removidos primeiro). - As dist-tags
latestdo npm estão desatualizadas — instale por meio do fechamento de perfil que odsh-basefornece; nunca com um simplesnpm i @deepseek-ai/dsh-tools.
Verificado contra DSH 0.2.0-rc.2 (o runtime para o qual este README é publicado) e o conjunto de plugins com mais estrelas pesquisado em 2026-10-05.
Este plugin não interfere em outros plugins, incluindo os de mais estrelas:
- Sem colisão de nome de ferramenta. Todas as ferramentas têm namespace; nenhuma ocupa um nome puro já pertencente a uma ferramenta embutida ou a outro plugin.
- Sem colisão de chave de serviço. Não fornece nenhuma chave de serviço, portanto não pode colidir em uma.
- Sem colisão de slot. Não registra nenhuma chave de slot de cliente, então não disputa um assento
shadows-shipped-ui. - Sem colisão de rota HTTP. Não registra nenhum prefixo
webServer. - Sem colisão na camada de patch. O patch do bundle apenas faz
insertda própria linha; nunca sobrescreve oconfigde uma linha embutida. - Sem mutação global. Não altera protótipos, não reescreve
process.envnem substitui o dispatcher global de fetch.
Listeners de eventos compartilhados não interferem por construção. Observa o evento sensível à ordem tools/pre-execute com ctx.on() — o registro de difusão do Cordis, onde cada listener executa e nenhum pode privar outro do turno. Todos os listeners aqui delegam via next(), então a cadeia nunca é curto-circuitada, e a mutação é aplicada ao valor que next() produziu em vez de ser devolvida no lugar dele:
tools/pre-execute— also used bycc-safety-net(1576★).
Evidência estática: dsh-plugin-doctor K10–K13 retornam pass em todas as verificações deste repositório.
| Superfície | Status |
|---|---|
| Harness | DeepSeek Harness dsh-v0.2.1-rc.2 (verificado 2026-10-18): engines.dsh >=0.2.1-0 <0.3.0; os caminhos de compatibilidade P0 têm testes de regressão. |
| Node | ^22.19.0 || >=24.0.0 |
| Plataformas | Todas (plugin host; rede de saída para o GitHub) |
| Modelo | Qualquer (a revisão estática é determinística; reviewMode: "model" é opcional) |
- Espelho no Gitee (espelho sincronizado; o GitHub é a fonte canônica)
- Página do plugin no dshfind (instalações e ranking)
- Relatório do OpenSSF Scorecard (conduzido por .github/workflows/scorecard.yml)
- Relatório de verificação do dsh-plugin-doctor (K10–K13 todos
pass) - DSH Market (listado)
- Canal 1024 store:
npm i -g dsh1024uma vez, depoisdsh1024 plugin --profile web add @perrylink/dsh-github(conta para o ranking de instalações do deepseek1024.com) - Base de conhecimento do ecossistema — dados medidos, não marketing: guia de desenvolvimento de plugins · dados de seleção · critérios de manutenção
pnpm install # node ^22.19 || >=24
pnpm run build # tsc --noEmitOnError → lib/ (mais fix-dts e o bundle de cliente)
pnpm run prepare # build autocontido para instalação via git (scripts/prepare.mjs)
pnpm run prepublishOnly # compilar + testar antes de publicar
pnpm test # vitest run
pnpm run typecheck # tsc --noEmit
pnpm run typecheck:ci # typecheck da linha publicada
pnpm run check:readmes # cruza ferramentas e chaves de configuração nos 5 READMEslib/ é o artefato publicado commitado no repositório; pnpm run build o regenera. As imagens do README são geradas por scripts/gen-readme-assets.py (Python + Pillow) e podem ser reexecutadas; elas escrevem docs/assets/dsh-github-hero-{zh,en}-{light,dark}.webp e docs/assets/dsh-github-flow-v5-{light,dark}.svg.
Tópicos: dsh · dsh-plugin · deepseek-harness · github · pull-request · code-review · issue-tracker
src/index.ts plugin entry (name/inject/apply, applyWithDeps for tests)
src/config.ts Schemastery Config
src/types.ts local structural views of host services + Context merging
src/credential.ts token resolution (seam → env → gh), per operation
src/github.ts REST client: 429 retry, rate limits, diff media type
src/git.ts read-only git inspection + origin parsing for any API host
src/review.ts deterministic diff analyzer + sanitized comment drafting
src/jobs.ts github-review background job producer (metadata + diff + CI + comments)
src/approval-gate.ts tools/pre-execute ask/deny gate with write previews
src/tools.ts the fourteen model-facing tools
src/ci/ review pipeline, polling bot, one-shot ci_run
src/commands.ts /pr, /review, /issue
src/client.ts browser half: the Plugins settings card
src/present.ts pure UI-card presenters
test/ vitest suite + mock host scaffolding + opt-in e2e smoke
cordis.patch.yml bundle patch (one insert row)
scripts/prepare.mjs self-contained git-install build
Este projeto faz parte da família de plugins do DeepSeek Harness da PerryLink (todos Apache-2.0). Se ele for útil, uma estrela ajuda a próxima pessoa a encontrá-lo — nada fica bloqueado por isso.
- @JosephTian876 — o relatório do
lib/client.jsnão empacotado (#11). - @womeimingzi11 — o relatório de registro do module-loader da metade navegador (#14); o bundle embrulhado em factory veio em versões posteriores.
- @PerryLink — criador e mantenedor: a superfície de ferramentas do GitHub, a barreira de aprovação, os jobs de revisão em segundo plano, a ação composta de CI, o bot de revisão, a barreira de status-check e a documentação em cinco idiomas.
- @AraragiEro — o cartão de configuração do token do GitHub na página de ajustes de Plugins (#6).
- @alexchenzl — convidou o plugin a ser listado no DSH Directory (#5).
Expandir todos os plugins
LICENSE (Apache License 2.0) © 2026 dsh-github contributors
Apache-2.0 · Plugin da comunidade, não afiliado à DeepSeek.