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

На цій сторінці
У вас вже є 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:/. Вона підтримує формат OpenAI Chat Completions, тож openai-go працює без обгортки. У документації є та сама адреса та сторінка з ключем./ api. cheaptokens. dev/ v1 - Ідентифікатор моделі. Ми використовуємо
deepseek-: контекст 380K і до 32 768 токенів в одній відповіді. Використовуйте повний ідентифікатор; коротку назву з таблиць цін API не приймає.ai/ DeepSeek- V4- Flash- 0731
Крок за кроком
Налаштування проєкту
Встановлення SDK
У порожній папці:
go mod init example.com/first-request
go get -u 'github.com/openai/openai-go/[email protected]'Шлях імпорту — github., назва пакета — openai.
Розміщення ключа в середовищі
export CHEAPTOKENS_API_KEY="paste-your-key-here"У Windows PowerShell: $env:CHEAPTOKENS_. Заповнювач не є справжнім ключем.
Створення main.go і запуск
Вставте програму з наступного розділу в main.go, потім виконайте go run ..
Уся програма#
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)
}
Важливі частини:
option.— єдиний рядок, який переводить SDK з OpenAI на CheapTokens. Використовуйте адресу точно як у документації.WithBaseURL(. . . ) option.передає ключ явно. Без нього клієнт читаєWithAPIKey(os. Getenv(. . . )) OPENAI_API_KEY, що зручно під час перенесення наявного коду: встановіть цю змінну в ключ CheapTokens, і код не потребує зміни ключа. Те саме стосуєтьсяOPENAI_BASE_URL, але явнийWithBaseURLмає пріоритет, тож не буде сюрпризів, якщо існують обидва.Model— звичайний рядок у SDK (ChatModelє псевдонімомstring), тож підходить будь-який ідентифікатор моделі, а не лише константи, показані в README.openai.— один хід користувача. У прикладі README використовуєтьсяUserMessage(. . . ) 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- і запустіть знову. Більше нічого в програмі не змінюється. Текст відповіді та три числа usage відрізнятимуться — це найшвидший спосіб порівняти дві моделі на власному запиті. GLM-5.3-Flash має контекст 390K і до 8 192 токенів в одній відповіді.
Повторні спроби та тайм-аути: три різні ліміти#
Саме тут Go-сервіси зазвичай страждають: за замовчуванням SDK взагалі не має тайм-ауту, тож зависле з'єднання може чекати вічно. Три налаштування це виправляють, і вони працюють на різних рівнях:
option.: SDK повторює спроби при помилках з'єднання, 408, 409, 429 і 5xx з короткою експоненційною паузою. Дві повторні спроби вже є типовим значенням;WithMaxRetries(2) 0вимикає повторні спроби. Можна встановити на клієнті або на окремому виклику.option.: ліміт для однієї спроби.WithRequestTimeout(30*time. Second) - Дедлайн
context: ліміт для всього виклику, включно з повторними спробами та паузами.
Отже, з 2 повторними спробами може бути до 3 спроб: 3 × 30 = 90 секунд очікування в найгіршому разі, плюс короткі паузи між спробами. Двохвилинний контекст це покриває. Якщо вам потрібне жорстке правило «відповідь протягом 20 секунд» для веб-обробника, скоротіть контекст, а не лише тайм-аут на спробу.

Для докладнішого пояснення щодо вибору цих чисел, Python-версія тієї самої поради є в OpenAI Python SDK timeout and retries. Логіка переноситься на Go.
Скільки коштують тисяча таких викликів#
Припустімо, ви запускаєте невеликий сервіс, який робить 1 000 запитів на день, кожен приблизно з 800 вхідними токенами та 300 вихідними. На deepseek- цей день коштує $0.042 (1 000 × 800 вхідних токенів, 1 000 × 300 вихідних токенів). Таблиця показує те саме навантаження для наших моделей; у сумі, з вхідними та вихідними разом, це дешевше за OpenRouter.
| Модель | Вхід $/1М | Вихід $/1М | За запит | 1 000 запитів | OpenRouter, 1 000 запитів |
|---|---|---|---|---|---|
| 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 |
800 вхідних і 300 вихідних токенів на запит. Ціни за 1 млн токенів актуальні та змінюються разом із нашими тарифами; стовпець OpenRouter показує довідкові ціни для того самого навантаження.
Підставте власні числа. Ваш перший запуск виводить реальні PromptTokens і CompletionTokens, тож вам не потрібно вгадувати середнє:
Калькулятор вартості
Один день невеликого Go-сервісу
Вхідні токени на запит: 800 · Вихідні токени на запит: 300 · Запитів на день: 1 000
| Модель | За день | За місяць |
|---|---|---|
| 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 |
Ціни на сторінці цін і сторінці моделей актуальні та використовують одну фіксовану ціну за модель, без пікових годин.
Якщо не працює#
- Помилка згадує 401: ключ порожній або неправильний.
os.Getenvповертає порожній рядок для невстановленої змінної, тож перевіртеecho $CHEAPTOKENS_у тому самому терміналі, де ви запускаєтеAPI_ KEY go run .. - Помилка згадує 404 або невідому модель: ідентифікатор. Скопіюйте його повністю, з префіксом
deepseek-ai/. Ви можете перелічити ідентифікатори в виклику списку моделей. go: module requires Go 1.: ваш інструментарій старіший. Зафіксуйте старіший тег SDK, як показано вище.26 - Виклик зависає, а потім завершується помилкою: це тайм-аут виконує свою роботу. Спочатку перевірте мережевий шлях, потім збільште
WithRequestTimeout, якщо моделі справді потрібно більше часу для довгої відповіді.
Якщо ідея base URL для вас нова, що таке base_url і як перемикатися пояснює це без коду.



