GPT-OSS
- A nova era da IA privada na plataforma .NET
![]() |
Hoje vou apresentar o GPT-OSS e como usá-lo na plataforma .NET. |
O GPT-OSS é o primeiro modelo de código aberto da OpenAI desde o GPT-2, e é um divisor de águas para desenvolvedores que desejam uma IA poderosa sem dependência da nuvem.
Você obtém duas
versões – gpt-oss-120b e gpt-oss-20b – ambas oferecendo desempenho
sólido em codificação, matemática e uso de ferramentas, mantendo seus dados
completamente privados. O modelo 20B é interessante
porque roda com apenas 16 GB de memória, tornando-o perfeito para
desenvolvimento e experimentação local. Confira o
Rodar o GPT-OSS localmente abre novas possibilidades de experimentação, eficiência de custos e privacidade. Neste guia, você aprenderá a usar o modelo de código aberto GPT-OSS com o Ollama para construir recursos de IA rápidos, privados e com capacidade offline usando C#.
O que você vai precisar:
- Uma máquina com pelo menos 16 GB de RAM e uma
GPU capaz (ou um Mac com Apple Silicon).
- O .NET 8 SDK ou superior
instalado.
- O Ollama instalado e em execução. (baixe no site
https://ollama.com)
- O modelo GPT-OSS:20b baixado com
ollama pull gpt-oss:20b

A Microsoft facilitou o trabalho com modelos de IA usando as bibliotecas
Microsoft.Extensions.AI. Essas
bibliotecas fornecem um conjunto unificado de abstrações, permitindo que
você escreva um código que pode funcionar com diferentes provedores de IA – como
Ollama, Azure AI ou OpenAI – sem alterar sua lógica
central.
Criando um projeto Console
Você pode criar o projeto console no VS 2022 ou terminal usando os comandos:
| dotnet new console -n OllamaGPTOSS
cd OllamaGPTOSS |
Para poder se conectar ao Ollama usando
Microsoft.Extensions.AI, você precisará de dois pacotes
principais. O pacote Microsoft.Extensions.AI
fornece as abstrações centrais, enquanto o pacote OllamaSharp
atua como o provedor que implementa essas abstrações para o Ollama.
| dotnet add package Microsoft.Extensions.AI dotnet add package OllamaSharp |
O OllamaSharp é o responsável pela conexão e Interação com o Ollama. Ele Simplifica a comunicação entre seu código C# (.NET) e o serviço Ollama (que gerencia e executa os modelos de IA localmente, como o GPT-OSS). Ele lida com os detalhes das chamadas de API (como requisições HTTP) para que você possa focar apenas na lógica da sua aplicação.
O OllamaSharp implementa as interfaces de abstração genéricas (IChatClient,
IEmbeddingGenerator) fornecidas pela biblioteca
Microsoft.Extensions.AI. Isso significa que:
- Seu código se torna
portável. Você escreve sua lógica usando a interface (IChatClient),
e pode trocar o provedor (por exemplo, de OllamaApiClient para um cliente Azure
AI ou OpenAI) sem precisar reescrever a lógica central do seu chat.
- Ele
funciona como o "provedor" que liga o Ollama a esse conjunto unificado de
ferramentas de IA da Microsoft.
Criando o código na classe Program
Abra
Program.cs e substitua seu
conteúdo pelo código a seguir. Este exemplo mantém um histórico de chat
contínuo e transmite as respostas em tempo real.
using Microsoft.Extensions.AI; using OllamaSharp; // Inicializa o cliente da API Ollama visando o modelo "gpt-oss:20b" IChatClient clienteChat = new OllamaApiClient(new Uri("http://localhost:11434/"), "gpt-oss:20b"); // Mantém o histórico da conversa List<ChatMessage> historicoChat = new(); Console.WriteLine("Chat GPT-OSS - Digite 'sair' para encerrar"); Console.WriteLine(); // Solicita entrada do usuário em um loop while (true) { Console.Write("Voce: "); var entradaUsuario = Console.ReadLine(); if (entradaUsuario?.ToLower() == "sair") break; if (string.IsNullOrWhiteSpace(entradaUsuario)) continue; // Adiciona a mensagem do usuário ao histórico do chat historicoChat.Add(new ChatMessage(ChatRole.User, entradaUsuario)); // Transmite a resposta da IA e exibe em tempo real Console.Write("Assistente: "); var respostaAssistente = ""; await foreach (var atualizacao in clienteChat.GetStreamingResponseAsync(historicoChat)) { Console.Write(atualizacao.Text); respostaAssistente += atualizacao.Text; } // Adiciona a mensagem do assistente ao histórico do chat historicoChat.Add(new ChatMessage(ChatRole.Assistant, respostaAssistente)); Console.WriteLine(); Console.WriteLine(); } |
Entendendo o código:
1. Inicialização e Abstração do Cliente de IA
Este é o
ponto de partida para a comunicação com o modelo de IA.
O código usa a interface
IChatClient que é fornecida
pela biblioteca Microsoft.Extensions.AI e permite que o código use qualquer
provedor de chat (Ollama, Azure OpenAI, etc.) sem mudar a lógica principal.
A classe OllamaApiClient
(do pacote OllamaSharp) implementa essa interface, conectando o aplicativo ao
serviço Ollama que está rodando localmente na porta padrão
(http://localhost:11434/).
Ao inicializar o cliente,
definimos qual modelo queremos usar ("gpt-oss:20b"), garantindo que estamos
conversando com a IA correta.
2. Manutenção do Histórico de Conversa
Modelos de IA,
por si só, não "lembram" interações anteriores. É responsabilidade do
seu código fornecer o contexto.
Estrutura do Histórico: Uma lista de
objetos ChatMessage (List<ChatMessage> historicoChat = new();)
é usada para armazenar todas as mensagens (tanto do usuário quanto do
assistente) em ordem cronológica.
Adição de Mensagens:
Sempre que o usuário digita algo, a mensagem é adicionada ao histórico com o
papel (ChatRole.User).
Após a IA responder, a resposta completa da IA
também é adicionada ao histórico com o papel (ChatRole.Assistant).
O Contexto: Ao chamar o método de resposta da IA
(GetStreamingResponseAsync), passamos todo o historicoChat. É isso que permite
que o modelo gere uma resposta que faça sentido no contexto da conversa.
3. Loop Principal e Tratamento de Entrada
O código roda
em um loop while (true) para simular uma sessão de chat contínua.
Ele verifica se o usuário digitou "sair" para encerrar o loop com
break.
Validação: Usa string.IsNullOrWhiteSpace(entradaUsuario)
e continue para ignorar entradas vazias e pedir uma nova entrada, garantindo que
apenas mensagens válidas sejam processadas.
4. Respostas em Tempo
Real (Streaming)
Este é o ponto mais avançado e que demonstra a
experiência de usuário moderna com LLMs.
A chave
para o streaming. Em vez de esperar pela resposta completa do modelo, o método
clienteChat.GetStreamingResponseAsync(historicoChat)
retorna uma sequência assíncrona. O await foreach processa cada pedaço da
resposta (cada "token") assim que ele chega.
A linha
Console.Write(atualizacao.Text); exibe cada pedacinho da
resposta na tela em tempo real, dando a impressão de que a IA está "digitando"
a resposta.
Simultaneamente, os pedaços são
concatenados em respostaAssistente += atualizacao.Text; para formar a mensagem
completa, que será salva no histórico.
5. Finalização e
Atualização do Histórico
A última etapa garante que o contexto
esteja pronto para a próxima rodada do chat.
Após o await foreach
terminar (o que significa que a resposta completa foi recebida), a resposta
completa é salva na variável respostaAssistente.
Esta resposta é, então,
adicionada ao historicoChat como uma mensagem do
ChatRole.Assistant.
O loop recomeça, e o modelo terá acesso à
conversa inteira, incluindo a última resposta que ele mesmo gerou.
Este código é um modelo básico, mas robusto, para qualquer aplicação que envolva interação contínua com modelos de IA. Ele ensina sobre persistência de contexto, abstração de provedores e programação assíncrona.
Executando o projeto teremos o seguinte resultado:

Temos um chat funcional acessando uma LLM Local com grande poder de fogo.
Este é apenas o começo. As bibliotecas
Microsoft.Extensions.AI também suportam chamada de função (function
calling), permitindo que você dê ao seu LLM local acesso aos seus métodos
C#, APIs e dados. É aqui que você pode construir aplicativos
verdadeiramente poderosos e "agênticos" (agentic).
Pegue o projeto aqui: OllamaGPTOSS.zip
E estamos conversados...
"Porque Deus não nos destinou para a ira, mas para a aquisição da salvação,
por nosso Senhor Jesus Cristo,
¹⁰ Que morreu por nós, para que, quer
vigiemos, quer durmamos, vivamos juntamente com ele."
1 Tessalonicenses 5:9,10
Referências:
NET - Unit of Work - Padrão Unidade de ...