Powrót do bloga

API i SDKPrzewodnik

Pierwsze żądanie w Go z openai-go: bazowy adres URL, klucz, usage

Kompletny program w Go, który wywołuje model CheapTokens przez openai-go i wypisuje odpowiedź, finish_reason i zużycie tokenów, z ponowieniami i limitem czasu.

Autor: CheapTokens TeamOpublikowano 5 min czytania

Okładka: Pierwsze żądanie w Go z SDK openai-go, terminal z go run oraz odpowiedź, finish_reason i usage
Na tej stronie
  1. Co musisz mieć przed rozpoczęciem
  2. Cały program
  3. Odczytaj odpowiedź, finish_reason i usage
  4. Ponowienia i limity czasu: trzy różne ograniczenia
  5. Ile kosztuje tysiąc takich wywołań
  6. Jeśli nie działa

Masz już kod w Go, który rozmawia z API w stylu OpenAI, albo zaraz go napiszesz. Aby wysłać go do CheapTokens, zmieniasz dwie opcje klienta i jeden ciąg znaków — identyfikator modelu. SDK pozostaje ten sam: oficjalny pakiet openai-go, wersja v3.

Poniżej znajduje się cały program, a następnie opis każdej linii, sposób odczytu odpowiedzi i liczników tokenów oraz to, jak zapobiec zawieszeniu usługi przez zablokowane żądanie. Wersje sprawdzone względem README openai-go z 3 listopada 2026: najnowszy tag na tej stronie to v3.91.1, wymaga Go 1.26 lub nowszego.

Co musisz mieć przed rozpoczęciem#

  • Go 1.26 lub nowszy. W Go 1.25 przypnij v3.74.0; w Go 1.22–1.24 przypnij v3.44.0 (README mówi, że starsza linia nie ma gwarantowanych poprawek).
  • Klucz API CheapTokens. Trzymaj go w zmiennej środowiskowej, a nie w pliku źródłowym.
  • Adres API: https://api.cheaptokens.dev/v1. Mówi w formacie OpenAI Chat Completions, więc openai-go działa bez nakładki. Dokumentacja zawiera ten sam adres i stronę z kluczem.
  • Identyfikator modelu. Używamy deepseek-ai/DeepSeek-V4-Flash-0731: kontekst 380K i do 32 768 tokenów w jednej odpowiedzi. Używaj pełnego identyfikatora; krótka nazwa z tabel cen nie jest akceptowana przez API.

Krok po kroku

Skonfiguruj projekt

Zainstaluj SDK

W pustym folderze:

bash
go mod init example.com/first-request
go get -u 'github.com/openai/openai-go/[email protected]'

Ścieżka importu to github.com/openai/openai-go/v3, nazwa pakietu to openai.

Umieść klucz w środowisku

bash
export CHEAPTOKENS_API_KEY="paste-your-key-here"

W Windows PowerShell: $env:CHEAPTOKENS_API_KEY = "paste-your-key-here". Symbol zastępczy nie jest prawdziwym kluczem.

Utwórz main.go i uruchom go

Wklej program z następnej sekcji do main.go, a następnie uruchom go run ..

Cały program#

go
package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"time"

	"github.com/openai/openai-go/v3"
	"github.com/openai/openai-go/v3/option"
)

func main() {
	client := openai.NewClient(
		option.WithBaseURL("https://api.cheaptokens.dev/v1"),
		option.WithAPIKey(os.Getenv("CHEAPTOKENS_API_KEY")),
		option.WithMaxRetries(2),
		option.WithRequestTimeout(30*time.Second),
	)

	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
	defer cancel()

	resp, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
		Model: "deepseek-ai/DeepSeek-V4-Flash-0731",
		Messages: []openai.ChatCompletionMessageParamUnion{
			openai.UserMessage("Explain in two sentences what a token is."),
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	if len(resp.Choices) == 0 {
		log.Fatal("no choices in the response")
	}

	fmt.Println(resp.Choices[0].Message.Content)
	fmt.Println("finish_reason:", resp.Choices[0].FinishReason)
	fmt.Println("input tokens:", resp.Usage.PromptTokens)
	fmt.Println("output tokens:", resp.Usage.CompletionTokens)
	fmt.Println("total tokens:", resp.Usage.TotalTokens)
}
Ścieżka jednego żądania: klucz ze środowiska, klient openai-go, uzupełnienie czatu, następnie treść, finish_reason i usage
Co robi program, po kolei

Najważniejsze elementy:

  • option.WithBaseURL(...) to jedyna linia, która przenosi SDK z OpenAI do CheapTokens. Użyj adresu dokładnie tak, jak w dokumentacji.
  • option.WithAPIKey(os.Getenv(...)) przekazuje klucz jawnie. Bez tego klient odczytuje OPENAI_API_KEY, co jest przydatne przy przenoszeniu istniejącego kodu: ustaw tę zmienną na klucz CheapTokens, a kod nie wymaga zmiany klucza. To samo dotyczy OPENAI_BASE_URL, ale jawne WithBaseURL ma pierwszeństwo, więc nie ma niespodzianki, jeśli istnieją oba.
  • Model to zwykły ciąg znaków w SDK (ChatModel jest aliasem string), więc działa dowolny identyfikator modelu, nie tylko stałe pokazane w README.
  • openai.UserMessage(...) to jedna tura użytkownika. Przykład w README używa DeveloperMessage i stałej GPT; tutaj wystarczy wiadomość użytkownika i identyfikator w postaci ciągu znaków.

Odczytaj odpowiedź, finish_reason i usage#

Wszystkie trzy pochodzą z pól, które SDK już analizuje za Ciebie:

  • resp.Choices[0].Message.Content to tekst (string).
  • resp.Choices[0].FinishReason to również string. stop oznacza, że model zakończył samodzielnie; length oznacza, że odpowiedź osiągnęła limit tokenów i została ucięta. Jeśli zobaczysz length, przeczytaj dlaczego odpowiedź urywa się w połowie zdania.
  • resp.Usage zawiera PromptTokens (to, co wysłałeś), CompletionTokens (to, co napisał model) i TotalTokens, wszystkie int64.

Dane wyjściowe będą wyglądać tak: odpowiedź, następnie finish_reason: z wartością, a potem trzy liczby tokenów. Liczby różnią się przy każdym uruchomieniu, więc je loguj. To za nie płacisz, a tokeny wyjściowe są droższą stroną.

Spróbuj samWypróbuj: co się zmieni, jeśli zamienisz model?Pokaż odpowiedź

Zmień ciąg Model na zai-org/GLM-5.3-Flash i uruchom ponownie. Nic innego w programie się nie zmienia. Tekst odpowiedzi i trzy liczby usage będą inne, co jest najszybszym sposobem porównania dwóch modeli na własnym prompcie. GLM-5.3-Flash ma kontekst 390K i do 8192 tokenów w jednej odpowiedzi.

Ponowienia i limity czasu: trzy różne ograniczenia#

To tutaj usługi w Go zwykle ucierpią: domyślnie SDK nie ma żadnego limitu czasu, więc zawieszone połączenie może czekać wiecznie. Trzy ustawienia to naprawiają i działają na różnych poziomach:

  • option.WithMaxRetries(2): SDK ponawia błędy połączenia, 408, 409, 429 i 5xx z krótkim wykładniczym oczekiwaniem. Dwa ponowienia są już domyślne; 0 wyłącza ponowienia. Możesz ustawić to na kliencie lub na pojedynczym wywołaniu.
  • option.WithRequestTimeout(30*time.Second): limit dla jednej próby.
  • Termin context: limit dla całego wywołania, łącznie z ponowieniami i oczekiwaniem.

Więc przy 2 ponowieniach mogą być do 3 prób: 3 × 30 = 90 sekund oczekiwania w najgorszym przypadku, plus krótkie przerwy między próbami. Dwuminutowy kontekst to pokrywa. Jeśli chcesz twardej reguły odpowiedzi w ciągu 20 sekund dla handlera WWW, skróć kontekst, a nie tylko limit czasu na próbę.

Wartości domyślne w porównaniu z ustawieniami w programie: dwa ponowienia w obu, brak limitu czasu domyślnie versus 30-sekundowy limit próby
Wartości domyślne versus powyższy program

Aby uzyskać szersze tło dotyczące wyboru tych liczb, wersja Python tej samej porady znajduje się w OpenAI Python SDK timeout and retries. Logika przenosi się na Go.

Ile kosztuje tysiąc takich wywołań#

Powiedzmy, że prowadzisz małą usługę, która wykonuje 1000 żądań dziennie, każde z około 800 tokenami wejściowymi i 300 tokenami wyjściowymi. W deepseek-ai/DeepSeek-V4-Flash-0731 ten dzień kosztuje $0.042 (1000 × 800 tokenów wejściowych, 1000 × 300 tokenów wyjściowych). Tabela pokazuje to samo obciążenie dla naszych modeli; liczone łącznie, z wejściem i wyjściem razem, jest tańsze niż OpenRouter.

Model Za żądanie 1000 żądań OpenRouter, 1000 żądań
GLM-5.3-Flash $0.000028 $0.028 $0.0517
DeepSeek-V4-Flash $0.000042 $0.042 $0.098
MiniMax-M2.7 $0.000085 $0.085 $1.02

800 tokenów wejściowych i 300 tokenów wyjściowych na żądanie. Ceny za 1 mln tokenów są aktualne i zmieniają się wraz z naszymi taryfami; kolumna OpenRouter pokazuje ceny referencyjne dla tego samego obciążenia.

Wstaw własne liczby. Pierwsze uruchomienie wypisuje rzeczywiste PromptTokens i CompletionTokens, więc nie musisz zgadywać średniej:

Kalkulator kosztów

Jeden dzień małej usługi w Go

Tokeny wejściowe na żądanie: 800 · Tokeny wyjściowe na żądanie: 300 · Żądania dziennie: 1000

ModelDziennieMiesięcznie
GLM-5.3-Flash$0.028$0.84
DeepSeek-V4-Flash$0.042$1.26
MiniMax-M2.7$0.085$2.55

Ceny na stronie cen i stronie modeli są aktualne i używają jednej stałej ceny za model, bez godzin szczytu.

Jeśli nie działa#

  • Błąd wspomina o 401: klucz jest pusty lub nieprawidłowy. os.Getenv zwraca pusty ciąg dla nieustawionej zmiennej, więc sprawdź echo $CHEAPTOKENS_API_KEY w tym samym terminalu, w którym uruchamiasz go run ..
  • Błąd wspomina o 404 lub nieznanym modelu: identyfikator. Skopiuj go w całości, z prefiksem deepseek-ai/. Możesz wyświetlić identyfikatory w wywołaniu listy modeli.
  • go: module requires Go 1.26: Twój zestaw narzędzi jest starszy. Przypnij starszy tag SDK, jak pokazano na górze.
  • Wywołanie zawiesza się, a potem kończy niepowodzeniem: to limit czasu robi swoje. Najpierw sprawdź ścieżkę sieciową, a następnie zwiększ WithRequestTimeout, jeśli model naprawdę potrzebuje więcej czasu na długą odpowiedź.

Jeśli koncepcja bazowego adresu URL jest dla Ciebie nowa, czym jest base_url i jak przełączyć wyjaśnia to bez kodu.