Przewodniki SDK
Go
Użyj biblioteki openai-go z api14 w Go: konfiguracja klienta, streaming, wywoływanie narzędzi, ustrukturyzowane wyjście i obsługa błędów.
Użyj oficjalnej biblioteki openai-go z api14. Skieruj option.WithBaseURL na api14 i przekaż jako model dowolny identyfikator modelu (na przykład openai/gpt-5-mini).
Instalacja
go get github.com/openai/openai-go
export API14_API_KEY="sk-api14-..."
Konfiguracja
package main
import (
"context"
"fmt"
"os"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
)
var client = openai.NewClient(
option.WithBaseURL("https://api14.com/api/v1/"),
option.WithAPIKey(os.Getenv("API14_API_KEY")),
)
var ctx = context.Background()
// The snippets below run inside func main().
openai.NewClient() bez opcji odczytuje OPENAI_BASE_URL i OPENAI_API_KEY, więc możesz też skonfigurować klienta ze środowiska:
export OPENAI_BASE_URL="https://api14.com/api/v1/"
export OPENAI_API_KEY="sk-api14-..."
Czat
resp, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
Model: "openai/gpt-5-mini",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage("Explain vector databases in two sentences."),
},
})
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
Streaming
stream := client.Chat.Completions.NewStreaming(ctx, openai.ChatCompletionNewParams{
Model: "anthropic/claude-sonnet-4.5",
Messages: []openai.ChatCompletionMessageParamUnion{openai.UserMessage("Write a haiku about APIs.")},
})
for stream.Next() {
chunk := stream.Current()
if len(chunk.Choices) > 0 {
fmt.Print(chunk.Choices[0].Delta.Content)
}
}
if err := stream.Err(); err != nil {
panic(err)
}
Zobacz Streaming.
Wywoływanie narzędzi
params := openai.ChatCompletionNewParams{
Model: "openai/gpt-5-mini",
Messages: []openai.ChatCompletionMessageParamUnion{openai.UserMessage("What's the weather in Istanbul?")},
Tools: []openai.ChatCompletionToolParam{{
Function: openai.FunctionDefinitionParam{
Name: "get_weather",
Description: openai.String("Current weather for a city"),
Parameters: openai.FunctionParameters{
"type": "object",
"properties": map[string]any{"city": map[string]string{"type": "string"}},
"required": []string{"city"},
},
},
}},
}
for {
resp, err := client.Chat.Completions.New(ctx, params)
if err != nil {
panic(err)
}
msg := resp.Choices[0].Message
if len(msg.ToolCalls) == 0 {
fmt.Println(msg.Content)
break
}
params.Messages = append(params.Messages, msg.ToParam())
for _, call := range msg.ToolCalls {
var args struct{ City string }
json.Unmarshal([]byte(call.Function.Arguments), &args)
params.Messages = append(params.Messages, openai.ToolMessage(getWeather(args.City), call.ID))
}
}
getWeather to Twoja funkcja zwracająca ciąg znaków. Zobacz Wywoływanie narzędzi.
Ustrukturyzowane wyjście
schema := map[string]any{
"type": "object",
"properties": map[string]any{
"name": map[string]string{"type": "string"},
"born": map[string]string{"type": "integer"},
},
"required": []string{"name", "born"},
"additionalProperties": false,
}
resp, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
Model: "openai/gpt-5-mini",
Messages: []openai.ChatCompletionMessageParamUnion{openai.UserMessage("Extract: Ada Lovelace, born 1815.")},
ResponseFormat: openai.ChatCompletionNewParamsResponseFormatUnion{
OfJSONSchema: &openai.ResponseFormatJSONSchemaParam{
JSONSchema: openai.ResponseFormatJSONSchemaJSONSchemaParam{
Name: "person", Schema: schema, Strict: openai.Bool(true),
},
},
},
})
var person struct {
Name string `json:"name"`
Born int `json:"born"`
}
_ = json.Unmarshal([]byte(resp.Choices[0].Message.Content), &person)
Zobacz Ustrukturyzowane wyjście.
Obraz na wejściu
resp, err := client.Chat.Completions.New(ctx, openai.ChatCompletionNewParams{
Model: "google/gemini-2.5-flash",
Messages: []openai.ChatCompletionMessageParamUnion{
openai.UserMessage([]openai.ChatCompletionContentPartUnionParam{
openai.TextContentPart("What is in this picture?"),
openai.ImageContentPart(openai.ChatCompletionContentPartImageImageURLParam{
URL: "https://example.com/photo.jpg", // or a data:image/png;base64,... URL
}),
}),
},
})
Zobacz Obrazy i pliki w wejściu.
Dodatkowe parametry
Pola, dla których SDK nie ma typu (reasoning, provider, models), dodajesz przez option.WithJSONSet:
resp, err := client.Chat.Completions.New(ctx, params,
option.WithJSONSet("reasoning", map[string]any{"effort": "high"}),
option.WithJSONSet("provider", map[string]any{"sort": "throughput"}),
)
Embeddingi
emb, err := client.Embeddings.New(ctx, openai.EmbeddingNewParams{
Model: "openai/text-embedding-3-small",
Input: openai.EmbeddingNewParamsInputUnion{OfArrayOfStrings: []string{"The quick brown fox", "Lorem ipsum"}},
})
if err == nil {
fmt.Println(len(emb.Data[0].Embedding))
}
Błędy
Błędy API są zwracane jako *openai.Error, który niesie status HTTP, kod maszynowy Code i surową odpowiedź:
import "errors"
var apiErr *openai.Error
if errors.As(err, &apiErr) {
switch apiErr.StatusCode {
case 402: // insufficient_balance
fmt.Println("Balance too low, add funds:", apiErr.Code)
case 429: // rate_limited or daily_limit_reached
fmt.Println("Retry after", apiErr.Response.Header.Get("Retry-After"), "s:", apiErr.Code)
}
}
Zobacz Błędy.
Limity czasu i ponowienia
Klient domyślnie ponawia 408, 409, 429 i 5xx dwukrotnie, z wykładniczym opóźnieniem. Liczbę ponowień i limit czasu na próbę ustaw jako opcje klienta lub żądania, a całe wywołanie ogranicz kontekstem:
client := openai.NewClient(
option.WithBaseURL("https://api14.com/api/v1/"),
option.WithAPIKey(os.Getenv("API14_API_KEY")),
option.WithMaxRetries(4),
option.WithRequestTimeout(60*time.Second), // per attempt
)
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) // all attempts
defer cancel()
Ponawianie nie pomaga przy daily_limit_reached ani insufficient_balance. Zobacz Limity zapytań.
Wszystkie możliwości
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api14.com/api/v1",
apiKey: process.env.API14_API_KEY,
});
const result = await client.chat.completions.create({
"model": "openai/gpt-5-mini",
"messages": [
{
"role": "user",
"content": "Explain vector databases in two sentences."
}
]
});
console.log(result.choices[0].message.content);