{"id":196,"date":"2026-10-09T16:01:30","date_gmt":"2026-10-09T12:01:30","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2026\/10\/09\/opencode-gigachat\/"},"modified":"2026-10-09T16:01:30","modified_gmt":"2026-10-09T12:01:30","slug":"opencode-gigachat","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2026\/10\/09\/opencode-gigachat\/","title":{"rendered":"Provedores russos de IA para OpenCode"},"content":{"rendered":"<p>OpenCode \u00e9 um agente de programa\u00e7\u00e3o aberto que funciona diretamente no terminal: l\u00ea arquivos de projeto, edita c\u00f3digo, executa comandos e testes, pesquisa no reposit\u00f3rio e trabalha com git. Seu ponto forte \u00e9 que ele n\u00e3o est\u00e1 vinculado a um provedor modelo e pode conectar dezenas de provedores.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2026\/10\/aibank.jpg\"\/><\/p>\n<p>GigaChat \u00e9 um grande modelo de linguagem da Sber. N\u00e3o est\u00e1 na lista pronta de provedores OpenCode, mas isso n\u00e3o \u00e9 um problema: OpenCode conecta provedores arbitr\u00e1rios por meio de pacotes Vercel AI SDK. Para o GigaChat existe um pacote <b>gigachat-ai-sdk-provider<\/b>, que cuida da autoriza\u00e7\u00e3o OAuth e da atualiza\u00e7\u00e3o do token de acesso. Uma nuance separada s\u00e3o os certificados do Minist\u00e9rio de Desenvolvimento Digital: sem eles, o Node n\u00e3o confia nos servidores GigaChat e as solicita\u00e7\u00f5es falham com um erro de verifica\u00e7\u00e3o do certificado.<\/p>\n<p>Neste post irei descrever como obter uma chave, instalar certificados e conectar o GigaChat ao OpenCode.<\/p>\n<h2>O que voc\u00ea precisa<\/h2>\n<p>Para funcionar voc\u00ea precisa de tr\u00eas coisas:<\/p>\n<ul>\n<li><b>OpenCode instalado.<\/b> Se o agente ainda n\u00e3o estiver instalado, discuti o procedimento de instala\u00e7\u00e3o em uma nota separada sobre OpenCode e DeepSeek.<\/li>\n<li><b>Conta GigaChat.<\/b> Registro no GigaChat Studio e chave de autoriza\u00e7\u00e3o &#8211; voc\u00ea precisar\u00e1 do Sber ID para fazer login.<\/li>\n<li><b>Terminal moderno.<\/b> WezTerm, Alacritty, Ghostty, Kitty ou qualquer outro serve.<\/li>\n<\/ul>\n<h2>Chave de autoriza\u00e7\u00e3o do GigaChat<\/h2>\n<p>A chave \u00e9 criada na sua conta pessoal do GigaChat Studio. Acesse developers.sber.ru\/studio, fa\u00e7a login e crie um projeto na se\u00e7\u00e3o <b>GigaChat API<\/b>. Nas configura\u00e7\u00f5es do projeto existe um bloco com dados de autoriza\u00e7\u00e3o: a linha que \u00e9 copiada de l\u00e1 \u00e9 uma chave de autoriza\u00e7\u00e3o pronta em base64. \u00c9 isso que \u00e9 substitu\u00eddo na vari\u00e1vel de ambiente, e n\u00e3o no par segredo do cliente separadamente.<\/p>\n<p>Juntamente com a chave, \u00e9 especificado o <b>escopo<\/b> &#8211; a \u00e1rea de acesso:<\/p>\n<ul>\n<li><b>GIGACHAT_API_PERS<\/b> &#8211; para indiv\u00edduos.<\/li>\n<li><b>GIGACHAT_API_B2B<\/b> &#8211; para empreendedores individuais e pessoas jur\u00eddicas.<\/li>\n<li><b>GIGACHAT_API_CORP<\/b> &#8211; acesso corporativo.<\/li>\n<\/ul>\n<p>O valor da chave exibida dever\u00e1 ser salvo imediatamente: n\u00e3o ser\u00e1 mostrado novamente posteriormente e, se necess\u00e1rio, dever\u00e1 ser emitida uma nova.<\/p>\n<p>\u00c9 importante entender o que \u00e9 essa linha. A chave de autoriza\u00e7\u00e3o n\u00e3o \u00e9 um segredo separado, mas um par de <b>client_id:client_secret<\/b> j\u00e1 codificados em base64. A biblioteca gigachat-js substitui este cabe\u00e7alho na solicita\u00e7\u00e3o OAuth:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>Authorization: Basic \u0432\u0430\u0448_\u043a\u043b\u044e\u0447_\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438\n<\/code><\/pre>\n<\/div>\n<p>Em resposta, um token de acesso JWE tem vida \u00fatil de cerca de meia hora e, em seguida, a biblioteca o atualiza automaticamente. O pr\u00f3prio pacote verifica se o valor \u00e9 semelhante a base64 e avisa se a vari\u00e1vel cont\u00e9m acidentalmente um segredo \u201cbruto\u201d do cliente. Portanto, \u00e9 necess\u00e1rio transferir a string base64 pronta da conta para a vari\u00e1vel de configura\u00e7\u00e3o e ambiente, e n\u00e3o o par client_id e client_secret separadamente.<\/p>\n<h2>Certificados do Minist\u00e9rio do Desenvolvimento Digital<\/h2>\n<p>A API GigaChat usa certificados do Minist\u00e9rio de Desenvolvimento Digital da NCA. O armazenamento de ra\u00edzes confi\u00e1veis \u200b\u200bpadr\u00e3o n\u00e3o os possui, portanto, ao tentar obter um token de acesso, a solicita\u00e7\u00e3o falha com um erro como:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>self-signed certificate in certificate chain\n<\/code><\/pre>\n<\/div>\n<p>Os certificados podem ser instalados no n\u00edvel do sistema operacional &#8211; ent\u00e3o eles ser\u00e3o confi\u00e1veis \u200b\u200b\u200b\u200bpara o navegador e os utilit\u00e1rios do sistema. Mas o OpenCode roda em Node e Bun, ent\u00e3o \u00e9 mais seguro e f\u00e1cil especificar o arquivo de certificado diretamente na vari\u00e1vel <b>NODE_EXTRA_CA_CERTS<\/b>. Baixe os certificados raiz e do emissor e coloque-os em um arquivo PEM:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>curl -s https:\/\/gu-st.ru\/content\/lending\/russian_trusted_root_ca_pem.crt -o russian_trusted_root_ca_pem.crt\ncurl -s https:\/\/gu-st.ru\/content\/lending\/russian_trusted_sub_ca_pem.crt -o russian_trusted_sub_ca_pem.crt\ncat russian_trusted_root_ca_pem.crt russian_trusted_sub_ca_pem.crt > russian_trusted_ca_bundle.pem\n<\/code><\/pre>\n<\/div>\n<p>O arquivo pode ser colocado em um local conveniente e seu caminho completo pode ser especificado ao iniciar o agente.<\/p>\n<p>H\u00e1 um problema aqui. Os arquivos baixados usam quebras de linha CRLF e o certificado raiz n\u00e3o possui um feed de linha final. Portanto, um gato normal concatena o final do primeiro certificado e o in\u00edcio do segundo em uma linha:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>-----END CERTIFICATE----------BEGIN CERTIFICATE-----\n<\/code><\/pre>\n<\/div>\n<p>LibreSSL &#8211; e o sistema openssl no macOS, deixe-me lembr\u00e1-lo, \u00e9 exatamente LibreSSL &#8211; n\u00e3o aceita tal arquivo e responde com um erro:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>PEM routines:CRYPTO_internal:bad end line\n<\/code><\/pre>\n<\/div>\n<p>Isso significa que s\u00f3 o gato n\u00e3o \u00e9 suficiente. Cada certificado deve primeiro ser executado atrav\u00e9s do openssl: ele ser\u00e1 recodificado em PEM can\u00f4nico com feeds de linha LF e um feed de linha final, e s\u00f3 ent\u00e3o mesclado:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>openssl x509 -in russian_trusted_root_ca_pem.crt -out russian_trusted_root_ca.pem\nopenssl x509 -in russian_trusted_sub_ca_pem.crt -out russian_trusted_sub_ca.pem\ncat russian_trusted_root_ca.pem russian_trusted_sub_ca.pem > russian_trusted_ca_bundle.pem\n<\/code><\/pre>\n<\/div>\n<p>Voc\u00ea pode verificar se o arquivo est\u00e1 sendo lido assim:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>openssl x509 -in russian_trusted_ca_bundle.pem -noout -subject\n<\/code><\/pre>\n<\/div>\n<p>Se os certificados forem obtidos de outra fonte e vierem no formato DER ou PKCS#7, eles tamb\u00e9m poder\u00e3o ser recodificados em PEM:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>openssl x509 -in cert.crt -inform DER -outform PEM -out cert.pem\nopenssl pkcs7 -print_certs -in bundle.p7b -out cert.pem\n<\/code><\/pre>\n<\/div>\n<h2>Conecte-se ao OpenCode<\/h2>\n<p>O provedor est\u00e1 descrito no arquivo de configura\u00e7\u00e3o <b>opencode.jsonc<\/b>. O pr\u00f3prio OpenCode ir\u00e1 baixar e conectar o pacote npm especificado no campo <b>npm<\/b>, encontrar a f\u00e1brica <b>createGigaChat<\/b> nele e passar as op\u00e7\u00f5es para ele. Basta listar os modelos pelos seus identificadores da API.<\/p>\n<p>O arquivo pode ser colocado em dois locais:<\/p>\n<ul>\n<li><b>Global<\/b> &#8211; ~\/.config\/opencode\/opencode.jsonc. As configura\u00e7\u00f5es se aplicam a todos os projetos do usu\u00e1rio.<\/li>\n<li><b>No projeto<\/b> &#8211; opencode.jsonc na raiz do projeto. Esta configura\u00e7\u00e3o tem prioridade mais alta e \u00e9 segura para commitar no git.<\/li>\n<\/ul>\n<p>Ambos os arquivos usam o mesmo esquema e s\u00e3o combinados: o arquivo do projeto se sobrep\u00f5e ao arquivo global apenas com as chaves correspondentes, as configura\u00e7\u00f5es restantes s\u00e3o salvas. A extens\u00e3o .jsonc tamb\u00e9m \u00e9 suportada. Se o GigaChat for necess\u00e1rio apenas para alguns reposit\u00f3rios, \u00e9 mais conveniente manter o provedor na configura\u00e7\u00e3o do projeto do que na configura\u00e7\u00e3o global.<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"provider\": {\n    \"gigachat\": {\n      \"npm\": \"gigachat-ai-sdk-provider\",\n      \"name\": \"GigaChat\",\n      \"models\": {\n        \"GigaChat-2-Max\": { \"name\": \"GigaChat 2 Max\" },\n        \"GigaChat-2-Pro\": { \"name\": \"GigaChat 2 Pro\" },\n        \"GigaChat-2\": { \"name\": \"GigaChat 2 Lite\" },\n        \"GigaChat\": { \"name\": \"GigaChat\" }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Os modelos dispon\u00edveis com chave pessoal est\u00e3o listados aqui. Se voc\u00ea possui um projeto para empres\u00e1rio individual ou pessoa jur\u00eddica com acesso ao GigaChat 3, adicione os identificadores necess\u00e1rios do m\u00e9todo models ao bloco models.<\/p>\n<p>\u00c9 mais conveniente n\u00e3o armazenar a chave em si em um arquivo, mas pass\u00e1-la para uma vari\u00e1vel de ambiente: o pacote gigachat-js a l\u00ea automaticamente. O valor do escopo tamb\u00e9m pode ser definido como uma vari\u00e1vel. Resta apenas definir o caminho para os certificados e iniciar o agente:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>export GIGACHAT_CREDENTIALS=\u0432\u0430\u0448_\u043a\u043b\u044e\u0447_\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438\nexport GIGACHAT_SCOPE=GIGACHAT_API_PERS\nexport NODE_EXTRA_CA_CERTS=\/\u043f\u0443\u0442\u044c\/\u043a\/russian_trusted_ca_bundle.pem\nopencode\n<\/code><\/pre>\n<\/div>\n<p>Essa op\u00e7\u00e3o tamb\u00e9m \u00e9 boa porque o segredo n\u00e3o vai parar no armazenamento local auth.json: ele fica apenas no ambiente do processo. Isso \u00e9 mais conveniente para CI e lan\u00e7amentos \u00fanicos.<\/p>\n<h2>Modelos<\/h2>\n<p>O conjunto de modelos dispon\u00edveis depende da chave do escopo. A chave pessoal (GIGACHAT_API_PERS) est\u00e1 dispon\u00edvel para a fam\u00edlia GigaChat e GigaChat 2:<\/p>\n<ul>\n<li><b>GigaChat<\/b> &#8211; modelo b\u00e1sico.<\/li>\n<li><b>GigaChat-2<\/b> &#8211; um modelo r\u00e1pido e leve para tarefas di\u00e1rias, exibido como Lite na interface.<\/li>\n<li><b>GigaChat-2-Pro<\/b> &#8211; um modelo aprimorado para tarefas que consomem muitos recursos.<\/li>\n<li><b>GigaChat-2-Max<\/b> \u00e9 o mais poderoso dispon\u00edvel usando uma chave pessoal.<\/li>\n<\/ul>\n<p>A fam\u00edlia GigaChat 3 (GigaChat-3-Ultra, GigaChat-3-Pro, modelos abertos como GigaChat3.5-432B-A28B-Reasoning) \u00e9 vis\u00edvel no cat\u00e1logo do console, mas n\u00e3o est\u00e1 dispon\u00edvel para a chave pessoal: requer um projeto de empreendedor individual ou pessoa jur\u00eddica com escopo GIGACHAT_API_B2B ou GIGACHAT_API_CORP e tarifa adequada. Em uma chave pessoal, esse modelo responde com um erro:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\"status\":404,\"message\":\"No such model\"}\n<\/code><\/pre>\n<\/div>\n<p>Voc\u00ea pode verificar o que sua chave realmente produz consultando a lista de modelos:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>curl -H \"Authorization: Bearer <\u0442\u043e\u043a\u0435\u043d_\u0434\u043e\u0441\u0442\u0443\u043f\u0430>\" https:\/\/gigachat.devices.sberbank.ru\/api\/v1\/models\n<\/code><\/pre>\n<\/div>\n<p>Mais dois pontos. Os IDs de modelo na API n\u00e3o correspondem aos nomes exibidos &#8211; o modelo light \u00e9 chamado de <b>GigaChat-2<\/b>, n\u00e3o de GigaChat-2-Lite. E o cat\u00e1logo do console n\u00e3o mostra a mesma coisa que est\u00e1 dispon\u00edvel para sua chave, ent\u00e3o voc\u00ea deve focar na resposta do m\u00e9todo dos modelos, e n\u00e3o na lista com pre\u00e7os.<\/p>\n<p>Na interface, a lista de modelos \u00e9 aberta com o comando:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>\/models\n<\/code><\/pre>\n<\/div>\n<p>Para trabalhos de rotina no reposit\u00f3rio &#8211; navega\u00e7\u00e3o por arquivos, pequenas edi\u00e7\u00f5es, execu\u00e7\u00e3o de testes &#8211; o GigaChat-2 \u00e9 suficiente. Para tarefas e design complexos, faz sentido mudar para Pro ou Max.<\/p>\n<h2>Primeiro lan\u00e7amento do projeto<\/h2>\n<p>V\u00e1 para o diret\u00f3rio do projeto e inicie o agente:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>cd \u0432\u0430\u0448_\u043f\u0440\u043e\u0435\u043a\u0442\nopencode\n<\/code><\/pre>\n<\/div>\n<p>A primeira etapa \u00e9 inicializar o agente:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>\/init\n<\/code><\/pre>\n<\/div>\n<p>OpenCode analisar\u00e1 a estrutura do projeto e criar\u00e1 um arquivo <b>AGENTS.md<\/b> &#8211; instru\u00e7\u00f5es para o agente. Vale a pena comprometer esse arquivo com o git: ele ajuda o agente a entender as conven\u00e7\u00f5es e padr\u00f5es adotados no projeto.<\/p>\n<h2>Alternativa: proxy local<\/h2>\n<p>Se por algum motivo voc\u00ea n\u00e3o quiser usar o provedor npm, um proxy local fornecer\u00e1 o mesmo resultado. A equipe GigaChat possui um servi\u00e7o oficial <b>gpt2giga<\/b> &#8211; FastAPI que traduz solicita\u00e7\u00f5es nos formatos OpenAI, Anthropic e Gemini para a API GigaChat e atualiza o pr\u00f3prio token de acesso. Ele \u00e9 gerado localmente na porta 8090, ap\u00f3s a qual um provedor regular compat\u00edvel com OpenAI \u00e9 configurado no OpenCode por meio do pacote <b>@ai-sdk\/openai-compat\u00edvel<\/b> com o endere\u00e7o base http:\/\/localhost:8090\/v1. A desvantagem desse caminho \u00e9 que voc\u00ea tamb\u00e9m precisa manter um servi\u00e7o Python em execu\u00e7\u00e3o pr\u00f3ximo ao OpenCode.<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"provider\": {\n    \"gigachat\": {\n      \"npm\": \"@ai-sdk\/openai-compatible\",\n      \"name\": \"GigaChat (proxy)\",\n      \"options\": {\n        \"baseURL\": \"http:\/\/localhost:8090\/v1\"\n      },\n      \"models\": {\n        \"GigaChat-2-Max\": { \"name\": \"GigaChat 2 Max\" }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<h2>DeepSeek e outros modelos via Cloud.ru<\/h2>\n<p>A API GigaChat em si n\u00e3o possui modelos DeepSeek: existem apenas a fam\u00edlia GigaChat e modelos para embeddings. Se voc\u00ea precisar do DeepSeek no OpenCode, mas por meio de um gateway de nuvem russo, o servi\u00e7o Foundation Models da Cloud.ru \u00e9 adequado. Ele fornece modelos usando o protocolo compat\u00edvel com OpenAI, portanto, \u00e9 conectado usando o pacote padr\u00e3o <b>@ai-sdk\/openai-compat\u00edvel<\/b>.<\/p>\n<p>No cat\u00e1logo Cloud.ru Foundation Models existem, por exemplo, os seguintes modelos:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>deepseek-ai\/DeepSeek-V4.1-Flash\ndeepseek-ai\/DeepSeek-V4-Flash\ndeepseek-ai\/DeepSeek-V4-Pro\n<\/code><\/pre>\n<\/div>\n<p>A chave \u00e9 emitida no console Cloud.ru: se\u00e7\u00e3o Usu\u00e1rios, guia Contas de servi\u00e7o. Criamos uma conta de servi\u00e7o em n\u00edvel de projeto e, em suas credenciais, criamos uma chave de API com o servi\u00e7o Foundation Models. O segredo da chave \u00e9 mostrado uma vez e n\u00f3s o salvamos.<\/p>\n<p>A configura\u00e7\u00e3o do provedor em opencode.json \u00e9 assim:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"provider\": {\n    \"cloudru\": {\n      \"npm\": \"@ai-sdk\/openai-compatible\",\n      \"name\": \"Cloud.ru Foundation Models\",\n      \"options\": {\n        \"baseURL\": \"https:\/\/foundation-models.api.cloud.ru\/v1\",\n        \"apiKey\": \"{env:CLOUDRU_API_KEY}\"\n      },\n      \"models\": {\n        \"deepseek-ai\/DeepSeek-V4.1-Flash\": { \"name\": \"DeepSeek V4.1 Flash\", \"limit\": { \"context\": 1048576, \"output\": 1048576 } },\n        \"deepseek-ai\/DeepSeek-V4-Flash\": { \"name\": \"DeepSeek V4 Flash\", \"limit\": { \"context\": 1048576, \"output\": 1048576 } },\n        \"deepseek-ai\/DeepSeek-V4-Pro\": { \"name\": \"DeepSeek V4 Pro\", \"limit\": { \"context\": 1048576, \"output\": 1048576 } }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Passamos a chave para a vari\u00e1vel de ambiente:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>export CLOUDRU_API_KEY=\u0432\u0430\u0448_\u043a\u043b\u044e\u0447_cloudru\nopencode\n<\/code><\/pre>\n<\/div>\n<p>Os certificados do Minist\u00e9rio do Desenvolvimento Digital n\u00e3o s\u00e3o necess\u00e1rios aqui: o dom\u00ednio api.cloud.ru possui TLS regular, ao contr\u00e1rio do GigaChat. Mas vale a pena acompanhar o equil\u00edbrio do projeto. Se a conta for zero, a autoriza\u00e7\u00e3o ser\u00e1 aprovada e as solicita\u00e7\u00f5es ser\u00e3o descartadas com a resposta de cobran\u00e7a:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\"message\":\"Not enough money\"}\n<\/code><\/pre>\n<\/div>\n<p>Este n\u00e3o \u00e9 um erro de configura\u00e7\u00e3o, mas um sinal de que voc\u00ea precisa atualizar o projeto no console Cloud.ru.<\/p>\n<h2>No que prestar aten\u00e7\u00e3o<\/h2>\n<p>Alguns pontos pr\u00e1ticos que costumam atrapalhar na primeira configura\u00e7\u00e3o:<\/p>\n<ul>\n<li><b>Erro de verifica\u00e7\u00e3o do certificado.<\/b> A mensagem sobre certificado autoassinado na cadeia significa que a vari\u00e1vel NODE_EXTRA_CA_CERTS n\u00e3o foi selecionada. Verifique o caminho do arquivo, se o agente est\u00e1 rodando no mesmo ambiente e o pr\u00f3prio arquivo: se, ao mesclar dois certificados usando cat, suas extremidades terminarem na mesma linha, o LibreSSL retornar\u00e1 uma linha final incorreta e o pacote precisa ser reconstru\u00eddo via openssl, como na se\u00e7\u00e3o sobre certificados.<\/li>\n<li><b>Erro 401.<\/b> Como regra, esta \u00e9 uma chave de autoriza\u00e7\u00e3o incorreta ou um escopo incompat\u00edvel. Para um indiv\u00edduo, voc\u00ea precisa de GIGACHAT_API_PERS.<\/li>\n<li><b>Erro 404 com o texto Esse modelo n\u00e3o existe.<\/b> Isso n\u00e3o \u00e9 uma falha de conex\u00e3o, mas uma falta de acesso a um modelo espec\u00edfico. Remova-o da configura\u00e7\u00e3o ou substitua-o por um dispon\u00edvel. Em uma mensagem como GigaChat 404: Erro desconhecido, a culpa \u00e9 da mesma resposta do GigaChat &#8211; o provedor simplesmente n\u00e3o conseguiu analisar o corpo do erro.<\/li>\n<li><b>Custo.<\/b> O OpenCode n\u00e3o requer assinatura: voc\u00ea paga o GigaChat diretamente quando gasta tokens, portanto, sess\u00f5es longas t\u00eam pre\u00e7o previs\u00edvel.<\/li>\n<li><b>Qualidade do modelo.<\/b> Para tarefas arquitet\u00f4nicas complexas, modelos de classes diferentes s\u00e3o diferentes, portanto, para o projeto, faz sentido escolher um modelo mais forte e dar a rotina a um modelo mais r\u00e1pido.<\/li>\n<\/ul>\n<h2>Links<\/h2>\n<p><a href=\"https:\/\/opencode.ai\/\" rel=\"noopener\" target=\"_blank\">https:\/\/opencode.ai\/<\/a><br \/>\n<a href=\"https:\/\/opencode.ai\/docs\/providers\/\" rel=\"noopener\" target=\"_blank\">https:\/\/opencode.ai\/docs\/providers\/<\/a><br \/>\n<a href=\"https:\/\/developers.sber.ru\/studio\/\" rel=\"noopener\" target=\"_blank\">https:\/\/developers.sber.ru\/studio\/<\/a><br \/>\n<a href=\"https:\/\/developers.sber.ru\/docs\/ru\/gigachat\/guides\/main\" rel=\"noopener\" target=\"_blank\">https:\/\/developers.sber.ru\/docs\/ru\/gigachat\/guides\/main<\/a><br \/>\n<a href=\"https:\/\/github.com\/nyddle\/gigachat-ai-sdk-provider\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/nyddle\/gigachat-ai-sdk-provider<\/a><br \/>\n<a href=\"https:\/\/github.com\/ai-forever\/gpt2giga\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/ai-forever\/gpt2giga<\/a><br \/>\n<a href=\"https:\/\/cloud.ru\/docs\/foundation-models\/ug\/topics\/quickstart\" rel=\"noopener\" target=\"_blank\">https:\/\/cloud.ru\/docs\/foundation-models\/ug\/topics\/quickstart<\/a><\/p>\n<h2>Fontes<\/h2>\n<p><a href=\"https:\/\/opencode.ai\/docs\/providers\/#custom-provider\" rel=\"noopener\" target=\"_blank\">https:\/\/opencode.ai\/docs\/providers\/#custom-provider<\/a><br \/>\n<a href=\"https:\/\/developers.sber.ru\/docs\/ru\/gigachat\/certificates\" rel=\"noopener\" target=\"_blank\">https:\/\/developers.sber.ru\/docs\/ru\/gigachat\/certificates<\/a><br \/>\n<a href=\"https:\/\/developers.sber.ru\/docs\/ru\/gigachat\/models\/main\" rel=\"noopener\" target=\"_blank\">https:\/\/developers.sber.ru\/docs\/ru\/gigachat\/models\/main<\/a><br \/>\n<a href=\"https:\/\/developers.sber.ru\/docs\/ru\/gigachat\/guides\/selecting-a-model\" rel=\"noopener\" target=\"_blank\">https:\/\/developers.sber.ru\/docs\/ru\/gigachat\/guides\/selecting-a-model<\/a><br \/>\n<a href=\"https:\/\/github.com\/nyddle\/gigachat-ai-sdk-provider\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/nyddle\/gigachat-ai-sdk-provider<\/a><br \/>\n<a href=\"https:\/\/github.com\/ai-forever\/gpt2giga\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/ai-forever\/gpt2giga<\/a><br \/>\n<a href=\"https:\/\/cloud.ru\/docs\/foundation-models\/ug\/topics\/quickstart\" rel=\"noopener\" target=\"_blank\">https:\/\/cloud.ru\/docs\/foundation-models\/ug\/topics\/quickstart<\/a><br \/>\n<a href=\"https:\/\/cloud.ru\/docs\/foundation-models\/ug\/topics\/overview__available__models\" rel=\"noopener\" target=\"_blank\">https:\/\/cloud.ru\/docs\/foundation-models\/ug\/topics\/overview__available__models<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>OpenCode \u00e9 um agente de programa\u00e7\u00e3o aberto que funciona diretamente no terminal: l\u00ea arquivos de projeto, edita c\u00f3digo, executa comandos e testes, pesquisa no reposit\u00f3rio e trabalha com git. Seu ponto forte \u00e9 que ele n\u00e3o est\u00e1 vinculado a um provedor modelo e pode conectar dezenas de provedores. GigaChat \u00e9 um grande modelo de linguagem [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-196","post","type-post","status-publish","format-standard","hentry","category-notes"],"translation":{"provider":"WPGlobus","version":"3.0.6","language":"pt","enabled_languages":["en","ru","zh","de","ja","fr","es","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"es":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=196"}],"version-history":[{"count":0,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/196\/revisions"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}