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ı.

Bu sayfada
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.0sürümünü sabitleyin; Go 1.22–1.24'tev3.44.0sü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:/. 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./ api. cheaptokens. dev/ v1 - Bir model kimliği.
deepseek-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.ai/ DeepSeek- V4- Flash- 0731
Adım adım
Projeyi kurun
SDK'yı yükleyin
Boş bir klasörde:
go mod init example.com/first-request
go get -u 'github.com/openai/openai-go/[email protected]'İçe aktarma yolu github., paket adı openai.
Anahtarı ortama koyun
export CHEAPTOKENS_API_KEY="paste-your-key-here"Windows PowerShell'de: $env:CHEAPTOKENS_. 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ı#
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)
}
Önemli olan parçalar:
option., SDK'yı OpenAI'den CheapTokens'e taşıyan tek satırdır. Adresi belgelerdeki gibi tam olarak kullanın.WithBaseURL(. . . ) option.anahtarı açıkça iletir. Bu olmadan istemciWithAPIKey(os. Getenv(. . . )) OPENAI_API_KEYdeğ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_URLiçin de geçerlidir, ancak açık birWithBaseURLonu geçersiz kılar, yani ikisi de varsa sürpriz olmaz.ModelSDK'da düz bir dizedir (ChatModel,stringiç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.tek bir kullanıcı turudur. README örneğiUserMessage(. . . ) DeveloperMessageve 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.metindir (birChoices[0]. Message. Content string).resp.de birChoices[0]. FinishReason string.stopmodelin kendi kendine bitirdiği anlamına gelir;lengthyanıtın token sınırına ulaşıp kesildiği anlamına gelir.lengthgörürseniz, bir yanıtın neden cümle ortasında durduğunu okuyun.resp.Usage,PromptTokens(gönderdiğiniz),CompletionTokens(modelin yazdığı) veTotalTokensdeğerlerini tutar; hepsiint64.
Çı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- 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.: 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;WithMaxRetries(2) 0yeniden denemeleri kapatır. Bunu istemcide veya tek bir çağrıda ayarlayabilirsiniz.option.: tek bir deneme için sınır.WithRequestTimeout(30*time. Second) contextson 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.

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- ü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 | Giriş $/1M | Çıkış $/1M | İstek başına | 1.000 istek | OpenRouter, 1.000 istek |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.000028 | $0.028 | $0.0517 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.000042 | $0.042 | $0.098 |
| MiniMax-M2.7 | $0.05 | $0.15 | $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
| Model | Günlük | Aylık |
|---|---|---|
| GLM-5.3-Flash$0.02$0.04 | $0.028 | $0.84 |
| DeepSeek-V4-Flash$0.015$0.10 | $0.042 | $1.26 |
| MiniMax-M2.7$0.05$0.15 | $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üzdengo run .komutunu çalıştırdığınız aynı terminaldeecho $CHEAPTOKENS_değişkenini kontrol edin.API_ KEY - 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.: araç zinciriniz eski. Yukarıda gösterildiği gibi daha eski bir SDK etiketini sabitleyin.26 - Ç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
WithRequestTimeoutdeğ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.



