Klienci Go dla Ollama: porównanie SDK oraz przykłady Qwen3/GPT-OSS

Integruj Ollama z Go: przewodnik po SDK, przykłady i najlepsze praktyki w środowisku produkcyjnym.

Page content

Ten przewodnik oferuje kompleksowy przegląd dostępnych Go SDKs dla Ollama i porównuje ich zestawy funkcji.

Zbadamy praktyczne przykłady w Go do wywoływania modeli Qwen3 i GPT-OSS hostowanych na Ollama — zarówno poprzez surowe wywołania REST API, jak i oficjalny klient Go — w tym szczegółowe obsługę trybów myślenia i niemyślenia w Qwen3.

go i ollama

Dlaczego Ollama + Go?

Ollama udostępnia mały, praktyczny HTTP API (zwykle działający na http://localhost:11434), zaprojektowane do generowania i rozmów, z wbudowaną obsługą strumieniowania i możliwością zarządzania modelami. Dokumentacja oficjalna dokładnie pokrywa struktury żądań i odpowiedzi /api/generate i /api/chat oraz semantykę strumieniowania.

Go jest świetnym wyborem do budowania klientów Ollama dzięki silnej bibliotece standardowej dla HTTP, bardzo dobrej obsłudze JSON, oryginalnym prymitywom współbieżności i statycznie typowanym interfejsom, które wykrywają błędy w czasie kompilacji.

Na koniec października 2025 roku, oto opcje SDK w Go, które najprawdopodobniej rozważysz.


SDK w Go dla Ollama — co jest dostępne?

SDK / Pakiet Status i „właściciel” Zakres (Generowanie/Rozmowa/Strumieniowanie) Zarządzanie modelami (pobieranie/lista itp.) Dodatki / Uwagi
github.com/ollama/ollama/api Oficjalny pakiet wewnątrz repozytorium Ollama; używany przez sam CLI ollama Pełny zakres odwzorowany na REST; obsługiwane strumieniowanie Tak Uznawany za kanoniczny klient Go; API dokładnie odzwierciedla dokumentację.
LangChainGo (github.com/tmc/langchaingo/llms/ollama) Społeczny framework (LangChainGo) z modułem LLM dla Ollama Rozmowa/Pełne kompletacje + strumieniowanie przez abstrakcje frameworku Ograniczone (zarządzanie modelami nie jest głównym celem) Świetny, jeśli chcesz łańcuchy, narzędzia, magazyny wektorów w Go; mniej to surowy SDK.
github.com/swdunlop/ollama-client Społeczny klient Skupienie się na rozmowie; dobre eksperymenty z wywołaniem narzędzi Częściowe Stworzony do eksperymentowania z wywołaniem narzędzi; nie jest pełnym powierzchnią 1:1.
Inne społeczne SDK (np. ollamaclient, trzecie strony „go-ollama-sdk”) Społeczność Wariuje Wariuje Jakość i zakres różnią się; oceniaj na repozytorium.

Rekomendacja: Dla produkcji preferuj github.com/ollama/ollama/api — jest utrzymywany wraz z projektem bazowym i dokładnie odzwierciedla API REST.


Qwen3 & GPT-OSS na Ollama: myślenie vs niemyślenie (co warto wiedzieć)

  • Tryb myślenia w Ollama oddziela „rozumowanie” modelu od końcowego wyniku, gdy jest włączony. Ollama dokumentuje pierwszorzędne włączanie/wyłączanie myślenia w obsługiwanych modelach.
  • (https://www.glukhov.org/pl/post/2025/10/qwen3-30b-vs-gpt-oss-20b/ “Qwen3:30b vs GPT-OSS:20b: Szczegóły techniczne, porównanie wydajności i prędkości”) obsługuje dynamiczne przełączanie: dodaj /think lub /no_think w komunikatach systemowych/użytkownika, aby przełączać tryby po kolei; najnowsze polecenie wygrywa.
  • GPT-OSS: użytkownicy raportują, że wyłączenie myślenia (np. /set nothink lub --think=false) może być niepewne na gpt-oss:20b; planuj filtrację/ukrycie każdego rozumowania, którego nie powinien wyświetlać interfejs użytkownika.

Część 1 — Wywoływanie Ollama przez surowy REST (Go, net/http)

Udostępnione typy

Najpierw zdefiniujmy typy wspólne i pomocnicze funkcje, które wykorzystamy w naszych przykładach:

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"time"
)

// ---- Typy API do rozmowy ----

type ChatMessage struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

type ChatRequest struct {
	Model    string        `json:"model"`
	Messages []ChatMessage `json:"messages"`
	// Niektóre serwery udostępniają kontrolę myślenia jako flagę logiczną.
	// Nawet jeśli zostanie pominięta, nadal możesz kontrolować Qwen3 za pomocą /think lub /no_think.
	Think   *bool          `json:"think,omitempty"`
	Stream  *bool          `json:"stream,omitempty"`
	Options map[string]any `json:"options,omitempty"`
}

type ChatResponse struct {
	Model     string `json:"model"`
	CreatedAt string `json:"created_at"`
	Message   struct {
		Role     string `json:"role"`
		Content  string `json:"content"`
		Thinking string `json:"thinking,omitempty"` // obecny, gdy myślenie jest włączone
	} `json:"message"`
	Done bool `json:"done"`
}

// ---- Typy API do generowania ----

type GenerateRequest struct {
	Model   string         `json:"model"`
	Prompt  string         `json:"prompt"`
	Think   *bool          `json:"think,omitempty"`
	Stream  *bool          `json:"stream,omitempty"`
	Options map[string]any `json:"options,omitempty"`
}

type GenerateResponse struct {
	Model     string `json:"model"`
	CreatedAt string `json:"created_at"`
	Response  string `json:"response"`           // końcowy tekst dla nie-strumieniowego
	Thinking  string `json:"thinking,omitempty"` // obecny, gdy myślenie jest włączone
	Done      bool   `json:"done"`
}

// ---- Funkcje pomocnicze ----

func httpPostJSON(url string, payload any) ([]byte, error) {
	body, err := json.Marshal(payload)
	if err != nil {
		return nil, err
	}
	c := &http.Client{Timeout: 60 * time.Second}
	resp, err := c.Post(url, "application/json", bytes.NewReader(body))
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()
	return io.ReadAll(resp.Body)
}

// bptr zwraca wskaźnik do wartości logicznej
func bptr(b bool) *bool { return &b }

Rozmowa — Qwen3 z myśleniem WŁĄCZONYM (i jak je WYŁĄCZYĆ)

func chatQwen3Thinking() error {
	endpoint := "http://localhost:11434/api/chat"

	req := ChatRequest{
		Model:   "qwen3:8b-thinking", // dowolny :*-thinking tag, który pobrano
		Think:   bptr(true),
		Stream:  bptr(false),
		Messages: []ChatMessage{
			{Role: "system", Content: "Jesteś precyzyjnym asystentem."},
			{Role: "user",   Content: "Wyjaśnij rekurencję z krótkim przykładem w Go."},
		},
	}

	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out ChatResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
	fmt.Println("🧠 myślenie:\n", out.Message.Thinking)
	fmt.Println("\n💬 odpowiedź:\n", out.Message.Content)
	return nil
}

// Aby wyłączyć myślenie w kolejnym przejściu, należy:
// (a) ustawić Think=false, i/lub
// (b) dodać "/no_think" do najnowszego komunikatu systemowego/użytkownika (Qwen3 miękki przełącznik).
// Qwen3 uwzględnia najnowsze polecenie /think lub /no_think w wielokrotnych rozmowach.
func chatQwen3NoThinking() error {
	endpoint := "http://localhost:11434/api/chat"

	req := ChatRequest{
		Model:  "qwen3:8b-thinking",
		Think:  bptr(false),
		Stream: bptr(false),
		Messages: []ChatMessage{
			{Role: "system", Content: "Jesteś krótki. /no_think"},
			{Role: "user",   Content: "Wyjaśnij rekurencję w jednym zdaniu."},
		},
	}

	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out ChatResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
	// Oczekiwane myślenie jest puste; nadal obracaj się defensywnie.
	if out.Message.Thinking != "" {
		fmt.Println("🧠 myślenie (nieoczekiwane):\n", out.Message.Thinking)
	}
	fmt.Println("\n💬 odpowiedź:\n", out.Message.Content)
	return nil
}

(Miękki przełącznik Qwen3 /think i /no_think jest dokumentowany przez zespół Qwen; ostatnie polecenie wygrywa w wielokrotnych rozmowach.)

Rozmowa — GPT-OSS z myśleniem (i zastrzeżenie)

func chatGptOss() error {
	endpoint := "http://localhost:11434/api/chat"

	req := ChatRequest{
		Model:  "gpt-oss:20b",
		Think:  bptr(true),   // żądaj oddzielonego rozumowania, jeśli jest obsługiwane
		Stream: bptr(false),
		Messages: []ChatMessage{
			{Role: "user", Content: "Co to jest programowanie dynamiczne? Wyjaśnij główną ideę."},
		},
	}

	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out ChatResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
	// Znane zastrzeżenie: wyłączanie myślenia może nie całkowicie tłumić rozumowania na gpt-oss:20b.
	// Zawsze filtruj/ukryj myślenie w interfejsie użytkownika, jeśli nie chcesz, by się pojawiło.
	fmt.Println("🧠 myślenie:\n", out.Message.Thinking)
	fmt.Println("\n💬 odpowiedź:\n", out.Message.Content)
	return nil
}

Użytkownicy raportują, że wyłączanie myślenia na gpt-oss:20b (np. /set nothink lub --think=false) może być ignorowane — planuj filtrowanie po stronie klienta, jeśli jest to konieczne.

Generowanie — Qwen3 i GPT-OSS

func generateQwen3() error {
	endpoint := "http://localhost:11434/api/generate"
	req := GenerateRequest{
		Model:  "qwen3:4b-thinking",
		Prompt: "W 2–3 zdaniach, do czego służą drzewa B w bazach danych?",
		Think:  bptr(true),
	}
	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out GenerateResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
	if out.Thinking != "" {
		fmt.Println("🧠 myślenie:\n", out.Thinking)
	}
	fmt.Println("\n💬 odpowiedź:\n", out.Response)
	return nil
}

func generateGptOss() error {
	endpoint := "http://localhost:11434/api/generate"
	req := GenerateRequest{
		Model:  "gpt-oss:20b",
		Prompt: "Krótko wyjaśnij propagację wsteczną w sieciach neuronowych.",
		Think:  bptr(true),
	}
	raw, err := httpPostJSON(endpoint, req)
	if err != nil {
		return err
	}
	var out GenerateResponse
	if err := json.Unmarshal(raw, &out); err != nil {
		return err
	}
	if out.Thinking != "" {
		fmt.Println("🧠 myślenie:\n", out.Thinking)
	}
	fmt.Println("\n💬 odpowiedź:\n", out.Response)
	return nil
}

Struktury REST i zachowanie strumieniowe pochodzą bezpośrednio z dokumentacji API Ollama.


Część 2 — Wywoływanie Ollama przez oficjalny SDK w Go (github.com/ollama/ollama/api)

Oficjalny pakiet udostępnia Client z metodami odpowiadającymi API REST. Sam CLI Ollama używa tego pakietu do komunikacji z usługą, co czyni go najbezpieczniejszym wyborem pod względem kompatybilności.

Instalacja

go get github.com/ollama/ollama/api

Rozmowa — Qwen3 (myślenie WŁĄCZONE / WYŁĄCZONE)

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/ollama/ollama/api"
)

func chatWithQwen3Thinking(ctx context.Context, thinking bool) error {
	client, err := api.ClientFromEnvironment() // uwzględnia OLLAMA_HOST, jeśli jest ustawiony
	if err != nil {
		return err
	}

	req := &api.ChatRequest{
		Model: "qwen3:8b-thinking",
		// Wiele konstrukcji serwera udostępnia myślenie jako flagę najwyższego poziomu;
		// dodatkowo możesz kontrolować Qwen3 za pomocą /think lub /no_think w komunikatach.
		Think: api.Ptr(thinking),
		Messages: []api.Message{
			{Role: "system", Content: "Jesteś precyzyjnym asystentem."},
			{Role: "user",   Content: "Wyjaśnij sortowanie przez scalanie z krótkim fragmentem kodu w Go."},
		},
	}

	var resp api.ChatResponse
	if err := client.Chat(ctx, req, &resp); err != nil {
		return err
	}

	if resp.Message.Thinking != "" {
		fmt.Println("🧠 myślenie:\n", resp.Message.Thinking)
	}
	fmt.Println("\n💬 odpowiedź:\n", resp.Message.Content)
	return nil
}

func main() {
	ctx := context.Background()
	if err := chatWithQwen3Thinking(ctx, true); err != nil {
		log.Fatal(err)
	}
	// Przykład: bez myślenia
	if err := chatWithQwen3Thinking(ctx, false); err != nil {
		log.Fatal(err)
	}
}

Rozmowa — GPT-OSS (obrona przed rozumowaniem)

func chatWithGptOss(ctx context.Context) error {
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return err
	}
	req := &api.ChatRequest{
		Model: "gpt-oss:20b",
		Think: api.Ptr(true),
		Messages: []api.Message{
			{Role: "user", Content: "Co to jest memoizacja i kiedy jest przydatna?"},
		},
	}
	var resp api.ChatResponse
	if err := client.Chat(ctx, req, &resp); err != nil {
		return err
	}
	// Jeśli zamierzasz ukryć rozumowanie, zrób to tutaj niezależnie od flag.
	if resp.Message.Thinking != "" {
		fmt.Println("🧠 myślenie:\n", resp.Message.Thinking)
	}
	fmt.Println("\n💬 odpowiedź:\n", resp.Message.Content)
	return nil
}

Generowanie — Qwen3 & GPT-OSS

func generateWithQwen3(ctx context.Context) error {
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return err
	}
	req := &api.GenerateRequest{
		Model:  "qwen3:4b-thinking",
		Prompt: "Podsumuj rolę drzewa B w indeksowaniu.",
		Think:  api.Ptr(true),
	}
	var resp api.GenerateResponse
	if err := client.Generate(ctx, req, &resp); err != nil {
		return err
	}
	if resp.Thinking != "" {
		fmt.Println("🧠 myślenie:\n", resp.Thinking)
	}
	fmt.Println("\n💬 odpowiedź:\n", resp.Response)
	return nil
}

func generateWithGptOss(ctx context.Context) error {
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return err
	}
	req := &api.GenerateRequest{
		Model:  "gpt-oss:20b",
		Prompt: "Wyjaśnij gradient descent w prostych słowach.",
		Think:  api.Ptr(true),
	}
	var resp api.GenerateResponse
	if err := client.Generate(ctx, req, &resp); err != nil {
		return err
	}
	if resp.Thinking != "" {
		fmt.Println("🧠 myślenie:\n", resp.Thinking)
	}
	fmt.Println("\n💬 odpowiedź:\n", resp.Response)
	return nil
}

Powierzchnia oficjalnego pakietu odzwierciedla dokumentację REST i jest aktualizowana wraz z projektem bazowym.


Strumieniowe odpowiedzi

Dla rzeczywistego strumieniowania ustaw Stream: bptr(true) w swoim żądaniu. Odpowiedź zostanie dostarczona jako fragmenty JSON oddzielone nową linią:

func streamChatExample() error {
	endpoint := "http://localhost:11434/api/chat"
	req := ChatRequest{
		Model:  "qwen3:8b-thinking",
		Think:  bptr(true),
		Stream: bptr(true), // Włącz strumieniowanie
		Messages: []ChatMessage{
			{Role: "user", Content: "Wyjaśnij algorytm sortowania szybkiego krok po kroku."},
		},
	}

	body, _ := json.Marshal(req)
	resp, err := http.Post(endpoint, "application/json", bytes.NewReader(body))
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	decoder := json.NewDecoder(resp.Body)
	for {
		var chunk ChatResponse
		if err := decoder.Decode(&chunk); err == io.EOF {
			break
		} else if err != nil {
			return err
		}
		
		// Przetwarzaj myślenie i zawartość, gdy przychodzą
		if chunk.Message.Thinking != "" {
			fmt.Print(chunk.Message.Thinking)
		}
		fmt.Print(chunk.Message.Content)
		
		if chunk.Done {
			break
		}
	}
	return nil
}

Z oficjalnym SDK, użyj funkcji callback do obsługi fragmentów strumienia:

func streamWithOfficialSDK(ctx context.Context) error {
	client, _ := api.ClientFromEnvironment()
	
	req := &api.ChatRequest{
		Model: "qwen3:8b-thinking",
		Think: api.Ptr(true),
		Messages: []api.Message{
			{Role: "user", Content: "Wyjaśnij drzewa wyszukiwania binarnego."},
		},
	}
	
	err := client.Chat(ctx, req, func(resp api.ChatResponse) error {
		if resp.Message.Thinking != "" {
			fmt.Print(resp.Message.Thinking)
		}
		fmt.Print(resp.Message.Content)
		return nil
	})
	
	return err
}

Praca z Qwen3 myślenie vs niemyślenie (praktyczne wskazówki)

  • Dwa mechanizmy:

    1. Flagę logiczną myślenie, wspieraną przez funkcję myślenia Ollama; i
    2. Miękki przełącznik Qwen3 /think i /no_think w najnowszym komunikacie systemowym/użytkownika. Najnowsze polecenie rządzi kolejnymi przejściami.
  • Domyślna postawa: niemyślenie dla szybkich odpowiedzi; zwiększ do myślenia dla zadań wymagających krok po kroku rozumowania (matematyka, planowanie, debugowanie, złożone analizy kodu).

  • Interfejsy strumieniowe: gdy myślenie jest włączone, możesz zobaczyć przemieszane rozumowanie/zawartość w ramkach strumienia — buforuj lub renderuj je osobno i daj użytkownikom przełącznik „pokaż rozumowanie”. (Zobacz dokumentację API dla formatu strumienia.)

  • Wielokrotna rozmowa: Qwen3 pamięta tryb myślenia z poprzednich przejść. Jeśli chcesz przełączać się w środku rozmowy, użyj zarówno flagi, jak i miękkiego przełącznika polecenia dla niezawodności.

Uwagi dotyczące GPT-OSS

  • Traktuj rozumowanie jako obecne nawet jeśli spróbowałeś go wyłączyć; filtruj po stronie klienta, jeśli Twoja UX nie powinna go wyświetlać.
  • Dla aplikacji produkcyjnych korzystających z GPT-OSS, zaimplementuj logikę filtrowania po stronie klienta, która może wykrywać i usuwać wzorce rozumowania, jeśli to konieczne.
  • Dokładnie przetestuj swoją wersję modelu GPT-OSS, ponieważ zachowanie może się różnić między różnymi kwantyzacjami i wersjami.

Najlepsze praktyki i wskazówki dla produkcji

Obsługa błędów i czasów oczekiwania

Zawsze implementuj odpowiednie obsługę czasów oczekiwania i odzyskiwania błędów:

func robustChatRequest(ctx context.Context, model string, messages []api.Message) (*api.ChatResponse, error) {
	// Ustaw rozsądną granicę czasu
	ctx, cancel := context.WithTimeout(ctx, 2*time.Minute)
	defer cancel()
	
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return nil, fmt.Errorf("tworzenie klienta: %w", err)
	}
	
	req := &api.ChatRequest{
		Model:    model,
		Messages: messages,
		Options: map[string]interface{}{
			"temperature": 0.7,
			"num_ctx":     4096, // rozmiar okna kontekstu
		},
	}
	
	var resp api.ChatResponse
	if err := client.Chat(ctx, req, &resp); err != nil {
		return nil, fmt.Errorf("żądanie rozmowy nie powiodło się: %w", err)
	}
	
	return &resp, nil
}

Pule połączeń i ponowne użycie

Ponownie używaj klienta Ollama w wielu żądaniach zamiast tworzyć nowego każdego razu:

type OllamaService struct {
	client *api.Client
}

func NewOllamaService() (*OllamaService, error) {
	client, err := api.ClientFromEnvironment()
	if err != nil {
		return nil, err
	}
	return &OllamaService{client: client}, nil
}

func (s *OllamaService) Chat(ctx context.Context, req *api.ChatRequest) (*api.ChatResponse, error) {
	var resp api.ChatResponse
	if err := s.client.Chat(ctx, req, &resp); err != nil {
		return nil, err
	}
	return &resp, nil
}

Konfiguracja środowiska

Używaj zmiennych środowiskowych dla elastycznej wdrożenie:

export OLLAMA_HOST=http://localhost:11434
export OLLAMA_NUM_PARALLEL=2
export OLLAMA_MAX_LOADED_MODELS=2

Oficjalny SDK automatycznie uwzględnia OLLAMA_HOST przez api.ClientFromEnvironment().

Monitorowanie i logowanie

Zaimplementuj strukturalne logowanie dla systemów produkcyjnych:

func loggedChat(ctx context.Context, logger *log.Logger, req *api.ChatRequest) error {
	start := time.Now()
	client, _ := api.ClientFromEnvironment()
	
	var resp api.ChatResponse
	err := client.Chat(ctx, req, &resp)
	
	duration := time.Since(start)
	logger.Printf("model=%s duration=%v error=%v tokens=%d", 
		req.Model, duration, err, len(resp.Message.Content))
	
	return err
}

Podsumowanie

  • Dla projektów w Go, github.com/ollama/ollama/api jest najbardziej kompletnym, gotowym do produkcji wyborem. Jest utrzymywany wraz z projektem bazowym Ollama, używany przez oficjalny CLI i oferuje kompleksowe pokrycie API z gwarantowaną kompatybilnością.

  • Dla wyższych poziomów abstrakcji, rozważ LangChainGo, gdy potrzebujesz łańcuchów, narzędzi, magazynów wektorów i potoków RAG — choć zrezygnujesz z pewnej kontroli na niskim poziomie na rzecz wygody.

  • Qwen3 daje Ci czystą, niezawodną kontrolę nad trybem myślenia zarówno przez flagi, jak i przełączniki komunikatów (/think, /no_think), co czyni go idealnym dla aplikacji wymagających zarówno szybkich odpowiedzi, jak i głębokiego rozumowania.

  • Dla GPT-OSS, zawsze planuj oczyszczenie wyjścia rozumowania po stronie klienta, gdy jest to konieczne, ponieważ flaga wyłączania myślenia może nie być zawsze spójnie przestrzegana.

  • W produkcji, zaimplementuj odpowiednią obsługę błędów, pulę połączeń, czas oczekiwania i monitorowanie, aby zbudować odporną aplikację z Ollama.

Kombinacja silnego typowania w Go, doskonałej obsługi współbieżności i prostego API Ollama czyni z niego idealny stos dla budowania aplikacji z AI — od prostych chatbotów po złożone systemy RAG.

Kluczowe wnioski

Oto szybki przewodnik do wyboru swojego podejścia:

Przypadek użycia Zalecany sposób Dlaczego
Aplikacja produkcyjna github.com/ollama/ollama/api Oficjalna obsługa, kompleksowe pokrycie API, utrzymywane wraz z projektem bazowym
Potoki RAG/łańcuchy/narzędzia LangChainGo Wysokie poziomy abstrakcji, integracje z magazynami wektorów
Nauka/eksperymentacja Surowy REST z net/http Pełna przejrzystość, brak zależności, edukacyjna
Szybkie prototypowanie Oficjalny SDK Zrównoważenie prostoty i mocy
Interfejsy strumieniowe do rozmowy Oficjalny SDK z callbackami Wbudowana obsługa strumieniowania, czysty API

Wskazówki dotyczące wyboru modelu:

  • Qwen3: Najlepszy dla aplikacji wymagających kontroli nad trybem myślenia, niezawodnych rozmów wielokrotnych
  • GPT-OSS: Silna wydajność, ale wymaga obrony przy wyjściu z rozumowania
  • Inne modele: Dokładnie testuj; zachowanie myślenia różni się w zależności od rodziny modeli

Odnośniki i dalsze materiały do przeczytania

Oficjalna dokumentacja

Alternatywy SDK Go

Zasoby specyficzne dla modeli

Powiązane tematy

Inne przydatne linki