Bloga dön

API ve SDKKılavuz

openai-go ile Go'da ilk istek: temel URL, anahtar, usage

openai-go aracılığıyla bir CheapTokens modelini çağıran ve yanıtı, finish_reason ve token kullanımını yazdıran, yeniden denemeler ve zaman aşımı içeren eksiksiz bir Go programı.

Yazan: CheapTokens TeamYayınlanma tarihi: 5 dk okuma

Kapak: openai-go SDK'sı ile Go'da ilk istek, go run çalıştıran bir terminal ve yanıt, finish_reason ve usage
Bu sayfada
  1. Başlamadan önce ihtiyacınız olanlar
  2. Programın tamamı
  3. Yanıtı, finish_reason ve usage değerlerini okuyun
  4. Yeniden denemeler ve zaman aşımları: üç farklı sınır
  5. Bu çağrılardan bin tanesinin maliyeti
  6. Çalışmazsa

OpenAI tarzı bir API ile konuşan Go kodunuz zaten var ya da yazmak üzeresiniz. Bunu CheapTokens'e göndermek için istemcide iki seçeneği ve bir dizeyi, model kimliğini değiştirirsiniz. SDK aynı kalır: resmi openai-go paketi, v3.

Aşağıda programın tamamı, ardından her satırın ne yaptığı, yanıtın ve token sayılarının nasıl okunacağı ve takılı kalan bir isteğin hizmetinizi askıda bırakmasının nasıl önleneceği yer alıyor. Sürümler 3 Kasım 2026'da openai-go README'sine göre kontrol edildi: o sayfadaki en son etiket v3.91.1 ve Go 1.26 veya daha yenisini gerektiriyor.

Başlamadan önce ihtiyacınız olanlar#

  • Go 1.26 veya daha yenisi. Go 1.25'te v3.74.0 sürümünü sabitleyin; Go 1.22–1.24'te v3.44.0 sürümünü sabitleyin (README, eski hattın garantili düzeltme almadığını söylüyor).
  • Bir CheapTokens API anahtarı. Bunu kaynak dosyada değil, bir ortam değişkeninde tutun.
  • API adresi: https://api.cheaptokens.dev/v1. OpenAI Chat Completions biçimini konuşur, bu yüzden openai-go bir sarmalayıcı olmadan çalışır. Belgelerde aynı adres ve anahtar sayfası var.
  • Bir model kimliği. deepseek-ai/DeepSeek-V4-Flash-0731 kullanıyoruz: 380K bağlam ve tek yanıtta en fazla 32.768 token. Tam kimliği kullanın; fiyat tablolarındaki kısa ad API tarafından kabul edilmez.

Adım adım

Projeyi kurun

SDK'yı yükleyin

Boş bir klasörde:

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

İçe aktarma yolu github.com/openai/openai-go/v3, paket adı openai.

Anahtarı ortama koyun

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

Windows PowerShell'de: $env:CHEAPTOKENS_API_KEY = "paste-your-key-here". Yer tutucu gerçek bir anahtar değildir.

main.go dosyasını oluşturun ve çalıştırın

Sonraki bölümdeki programı main.go dosyasına yapıştırın, ardından go run . komutunu çalıştırın.

Programın tamamı#

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)
}
Tek bir isteğin yolu: ortamdan anahtar, openai-go istemcisi, sohbet tamamlama, ardından content, finish_reason ve usage
Programın sırasıyla ne yaptığı

Önemli olan parçalar:

  • option.WithBaseURL(...), SDK'yı OpenAI'den CheapTokens'e taşıyan tek satırdır. Adresi belgelerdeki gibi tam olarak kullanın.
  • option.WithAPIKey(os.Getenv(...)) anahtarı açıkça iletir. Bu olmadan istemci OPENAI_API_KEY değişkenini okur; bu, mevcut kodu taşırken kullanışlıdır: o değişkeni bir CheapTokens anahtarına ayarlayın, kodda anahtar değişikliği gerekmez. Aynısı OPENAI_BASE_URL için de geçerlidir, ancak açık bir WithBaseURL onu geçersiz kılar, yani ikisi de varsa sürpriz olmaz.
  • Model SDK'da düz bir dizedir (ChatModel, string için bir takma addır), bu yüzden yalnızca README'de gösterilen sabitler değil, herhangi bir model kimliği çalışır.
  • openai.UserMessage(...) tek bir kullanıcı turudur. README örneği DeveloperMessage ve bir GPT sabiti kullanır; burada bir kullanıcı mesajı ve bir dize kimliği yeterlidir.

Yanıtı, finish_reason ve usage değerlerini okuyun#

Üçü de SDK'nın sizin için zaten ayrıştırdığı alanlardan gelir:

  • resp.Choices[0].Message.Content metindir (bir string).
  • resp.Choices[0].FinishReason de bir string. stop modelin kendi kendine bitirdiği anlamına gelir; length yanıtın token sınırına ulaşıp kesildiği anlamına gelir. length görürseniz, bir yanıtın neden cümle ortasında durduğunu okuyun.
  • resp.Usage, PromptTokens (gönderdiğiniz), CompletionTokens (modelin yazdığı) ve TotalTokens değerlerini tutar; hepsi int64.

Çıktı şöyle görünecek: yanıt, ardından bir değerle finish_reason:, ardından üç token sayısı. Sayılar her çalıştırmada farklıdır, bu yüzden bunları günlüğe kaydedin. Ödediğiniz şey bunlardır ve çıktı tokenları daha pahalı taraftır.

Kendin deneDeneyin: modeli değiştirirseniz ne değişir?Cevabı göster

Model dizesini zai-org/GLM-5.3-Flash olarak değiştirin ve tekrar çalıştırın. Programda başka hiçbir şey değişmez. Yanıt metni ve üç usage sayısı farklı olacaktır; bu, kendi isteminizde iki modeli karşılaştırmanın en hızlı yoludur. GLM-5.3-Flash 390K bağlama ve tek yanıtta en fazla 8.192 tokena sahiptir.

Yeniden denemeler ve zaman aşımları: üç farklı sınır#

Go hizmetlerinin genellikle zarar gördüğü yer burasıdır: varsayılan olarak SDK'nın hiç zaman aşımı yoktur, bu yüzden takılan bir bağlantı sonsuza kadar bekleyebilir. Üç ayar bunu düzeltir ve farklı düzeylerde çalışırlar:

  • option.WithMaxRetries(2): SDK, bağlantı hatalarını, 408, 409, 429 ve 5xx yanıtlarını kısa bir üstel beklemeyle yeniden dener. İki yeniden deneme zaten varsayılandır; 0 yeniden denemeleri kapatır. Bunu istemcide veya tek bir çağrıda ayarlayabilirsiniz.
  • option.WithRequestTimeout(30*time.Second): tek bir deneme için sınır.
  • context son tarihi: yeniden denemeler ve beklemeler dahil tüm çağrı için sınır.

Yani 2 yeniden denemeyle en fazla 3 deneme olabilir: en kötü durumda 3 × 30 = 90 saniye bekleme, artı denemeler arasındaki kısa duraklamalar. İki dakikalık bir bağlam bunu kapsar. Bir web işleyicisi için 20 saniye içinde kesin yanıt kuralı istiyorsanız, yalnızca deneme başına zaman aşımını değil, bağlamı da kısaltın.

Varsayılanların programdaki ayarlarla karşılaştırılması: her ikisinde de iki yeniden deneme, varsayılan olarak zaman aşımı yok ile 30 saniyelik deneme zaman aşımı
Varsayılanlar ile yukarıdaki program

Bu sayıları seçme konusunda daha uzun bir arka plan için aynı tavsiyenin Python sürümü OpenAI Python SDK timeout and retries sayfasındadır. Mantık Go'ya da taşınır.

Bu çağrılardan bin tanesinin maliyeti#

Diyelim ki günde 1.000 istek yapan, her biri yaklaşık 800 giriş tokenı ve 300 çıktı tokenı içeren küçük bir hizmet çalıştırıyorsunuz. deepseek-ai/DeepSeek-V4-Flash-0731 üzerinde o gün $0.042 tutar (1.000 × 800 giriş tokenı, 1.000 × 300 çıktı tokenı). Tablo aynı yükü modellerimiz genelinde gösteriyor; giriş ve çıktı birlikte toplam olarak sayıldığında OpenRouter'dan daha ucuz.

Model İstek başına 1.000 istek OpenRouter, 1.000 istek
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

İstek başına 800 giriş ve 300 çıkış token'ı. 1M token başına fiyatlar günceldir ve tarifelerimizle birlikte değişir; OpenRouter sütunu aynı iş yükü için referans fiyatları gösterir.

Kendi sayılarınızı girin. İlk çalıştırmanız gerçek PromptTokens ve CompletionTokens değerlerini yazdırır, böylece ortalamayı tahmin etmek zorunda kalmazsınız:

Maliyet hesaplayıcı

Küçük bir Go hizmetinin bir günü

İstek başına giriş token'ı: 800 · İstek başına çıkış token'ı: 300 · Günlük istek sayısı: 1.000

ModelGünlükAylık
GLM-5.3-Flash$0.028$0.84
DeepSeek-V4-Flash$0.042$1.26
MiniMax-M2.7$0.085$2.55

Fiyatlandırma sayfasındaki ve modeller sayfasındaki fiyatlar canlıdır ve model başına tek bir sabit fiyat kullanır, yoğun saat yoktur.

Çalışmazsa#

  • Hata 401'den bahsediyor: anahtar boş veya yanlış. os.Getenv, ayarlanmamış bir değişken için boş bir dize döndürür, bu yüzden go run . komutunu çalıştırdığınız aynı terminalde echo $CHEAPTOKENS_API_KEY değişkenini kontrol edin.
  • Hata 404 veya bilinmeyen bir modelden bahsediyor: kimlik. deepseek-ai/ önekiyle birlikte tam olarak kopyalayın. Kimlikleri modeller listesi çağrısında listeleyebilirsiniz.
  • go: module requires Go 1.26: araç zinciriniz eski. Yukarıda gösterildiği gibi daha eski bir SDK etiketini sabitleyin.
  • Çağrı takılıyor ve sonra başarısız oluyor: bu, zaman aşımının işini yapmasıdır. Önce ağ yolunu kontrol edin, ardından model gerçekten uzun bir yanıt için daha fazla zamana ihtiyaç duyuyorsa WithRequestTimeout değerini artırın.

Temel URL fikri sizin için yeniyse, base_url nedir ve nasıl değiştirilir bunu kod olmadan açıklar.