Назад до блогу

API та SDKПосібник

Перший запит у Go з openai-go: base URL, ключ, usage

Повна програма на Go, яка викликає модель CheapTokens через openai-go і виводить відповідь, finish_reason і використання токенів, з повторними спробами та тайм-аутом.

Автор: CheapTokens TeamОпубліковано 5 хв читання

Обкладинка: Перший запит у Go з SDK openai-go, термінал з go run і відповідь, finish_reason та usage
На цій сторінці
  1. Що потрібно перед початком
  2. Уся програма
  3. Читання відповіді, finish_reason і usage
  4. Повторні спроби та тайм-аути: три різні ліміти
  5. Скільки коштують тисяча таких викликів
  6. Якщо не працює

У вас вже є Go-код, який звертається до API у стилі OpenAI, або ви збираєтеся його написати. Щоб надсилати його до CheapTokens, ви змінюєте два параметри клієнта і один рядок — ідентифікатор моделі. SDK залишається тим самим: офіційний пакет openai-go, v3.

Нижче наведено всю програму, потім пояснення, що робить кожен рядок, як читати відповідь і кількість токенів, а також як не дати завислому запиту заблокувати ваш сервіс. Версії звірено з README openai-go станом на 3 листопада 2026 року: останній тег на цій сторінці — v3.91.1, і він потребує Go 1.26 або новішого.

Що потрібно перед початком#

  • Go 1.26 або новіший. На Go 1.25 зафіксуйте v3.74.0; на Go 1.22–1.24 зафіксуйте v3.44.0 (у README сказано, що старша лінійка не отримує гарантованих виправлень).
  • Ключ API CheapTokens. Тримайте його у змінній середовища, а не у вихідному файлі.
  • Адреса API: https://api.cheaptokens.dev/v1. Вона підтримує формат OpenAI Chat Completions, тож openai-go працює без обгортки. У документації є та сама адреса та сторінка з ключем.
  • Ідентифікатор моделі. Ми використовуємо deepseek-ai/DeepSeek-V4-Flash-0731: контекст 380K і до 32 768 токенів в одній відповіді. Використовуйте повний ідентифікатор; коротку назву з таблиць цін API не приймає.

Крок за кроком

Налаштування проєкту

Встановлення SDK

У порожній папці:

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

Шлях імпорту — github.com/openai/openai-go/v3, назва пакета — openai.

Розміщення ключа в середовищі

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

У Windows PowerShell: $env:CHEAPTOKENS_API_KEY = "paste-your-key-here". Заповнювач не є справжнім ключем.

Створення main.go і запуск

Вставте програму з наступного розділу в main.go, потім виконайте go run ..

Уся програма#

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)
}
Шлях одного запиту: ключ із середовища, клієнт openai-go, chat completion, потім content, finish_reason і usage
Що робить програма, по порядку

Важливі частини:

  • option.WithBaseURL(...) — єдиний рядок, який переводить SDK з OpenAI на CheapTokens. Використовуйте адресу точно як у документації.
  • option.WithAPIKey(os.Getenv(...)) передає ключ явно. Без нього клієнт читає OPENAI_API_KEY, що зручно під час перенесення наявного коду: встановіть цю змінну в ключ CheapTokens, і код не потребує зміни ключа. Те саме стосується OPENAI_BASE_URL, але явний WithBaseURL має пріоритет, тож не буде сюрпризів, якщо існують обидва.
  • Model — звичайний рядок у SDK (ChatModel є псевдонімом string), тож підходить будь-який ідентифікатор моделі, а не лише константи, показані в README.
  • openai.UserMessage(...) — один хід користувача. У прикладі README використовується DeveloperMessage і константа GPT; тут достатньо повідомлення користувача та рядкового ідентифікатора.

Читання відповіді, finish_reason і usage#

Усі три походять із полів, які SDK уже розбирає за вас:

  • resp.Choices[0].Message.Content — це текст (string).
  • resp.Choices[0].FinishReason також є string. stop означає, що модель завершила самостійно; length означає, що відповідь досягла ліміту токенів і була обрізана. Якщо ви бачите length, прочитайте чому відповідь обривається посеред речення.
  • resp.Usage містить PromptTokens (що ви надіслали), CompletionTokens (що написала модель) і TotalTokens, усі int64.

Вивід виглядатиме так: відповідь, потім finish_reason: зі значенням, потім три кількості токенів. Числа відрізняються при кожному запуску, тож логуйте їх. Це те, за що ви платите, а вихідні токени — дорожча сторона.

Спробуйте саміСпробуйте: що зміниться, якщо замінити модель?Показати відповідь

Змініть рядок Model на zai-org/GLM-5.3-Flash і запустіть знову. Більше нічого в програмі не змінюється. Текст відповіді та три числа usage відрізнятимуться — це найшвидший спосіб порівняти дві моделі на власному запиті. GLM-5.3-Flash має контекст 390K і до 8 192 токенів в одній відповіді.

Повторні спроби та тайм-аути: три різні ліміти#

Саме тут Go-сервіси зазвичай страждають: за замовчуванням SDK взагалі не має тайм-ауту, тож зависле з'єднання може чекати вічно. Три налаштування це виправляють, і вони працюють на різних рівнях:

  • option.WithMaxRetries(2): SDK повторює спроби при помилках з'єднання, 408, 409, 429 і 5xx з короткою експоненційною паузою. Дві повторні спроби вже є типовим значенням; 0 вимикає повторні спроби. Можна встановити на клієнті або на окремому виклику.
  • option.WithRequestTimeout(30*time.Second): ліміт для однієї спроби.
  • Дедлайн context: ліміт для всього виклику, включно з повторними спробами та паузами.

Отже, з 2 повторними спробами може бути до 3 спроб: 3 × 30 = 90 секунд очікування в найгіршому разі, плюс короткі паузи між спробами. Двохвилинний контекст це покриває. Якщо вам потрібне жорстке правило «відповідь протягом 20 секунд» для веб-обробника, скоротіть контекст, а не лише тайм-аут на спробу.

Типові значення порівняно з налаштуваннями в програмі: дві повторні спроби в обох, без тайм-ауту за замовчуванням проти 30-секундного тайм-ауту на спробу
Типові значення проти програми вище

Для докладнішого пояснення щодо вибору цих чисел, Python-версія тієї самої поради є в OpenAI Python SDK timeout and retries. Логіка переноситься на Go.

Скільки коштують тисяча таких викликів#

Припустімо, ви запускаєте невеликий сервіс, який робить 1 000 запитів на день, кожен приблизно з 800 вхідними токенами та 300 вихідними. На deepseek-ai/DeepSeek-V4-Flash-0731 цей день коштує $0.042 (1 000 × 800 вхідних токенів, 1 000 × 300 вихідних токенів). Таблиця показує те саме навантаження для наших моделей; у сумі, з вхідними та вихідними разом, це дешевше за OpenRouter.

Модель За запит 1 000 запитів OpenRouter, 1 000 запитів
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 вхідних і 300 вихідних токенів на запит. Ціни за 1 млн токенів актуальні та змінюються разом із нашими тарифами; стовпець OpenRouter показує довідкові ціни для того самого навантаження.

Підставте власні числа. Ваш перший запуск виводить реальні PromptTokens і CompletionTokens, тож вам не потрібно вгадувати середнє:

Калькулятор вартості

Один день невеликого Go-сервісу

Вхідні токени на запит: 800 · Вихідні токени на запит: 300 · Запитів на день: 1 000

МодельЗа деньЗа місяць
GLM-5.3-Flash$0.028$0.84
DeepSeek-V4-Flash$0.042$1.26
MiniMax-M2.7$0.085$2.55

Ціни на сторінці цін і сторінці моделей актуальні та використовують одну фіксовану ціну за модель, без пікових годин.

Якщо не працює#

  • Помилка згадує 401: ключ порожній або неправильний. os.Getenv повертає порожній рядок для невстановленої змінної, тож перевірте echo $CHEAPTOKENS_API_KEY у тому самому терміналі, де ви запускаєте go run ..
  • Помилка згадує 404 або невідому модель: ідентифікатор. Скопіюйте його повністю, з префіксом deepseek-ai/. Ви можете перелічити ідентифікатори в виклику списку моделей.
  • go: module requires Go 1.26: ваш інструментарій старіший. Зафіксуйте старіший тег SDK, як показано вище.
  • Виклик зависає, а потім завершується помилкою: це тайм-аут виконує свою роботу. Спочатку перевірте мережевий шлях, потім збільште WithRequestTimeout, якщо моделі справді потрібно більше часу для довгої відповіді.

Якщо ідея base URL для вас нова, що таке base_url і як перемикатися пояснює це без коду.