SDK rehberleri
Java
Resmi openai-java kütüphanesini client builder üzerindeki baseUrl ile api14'e yönlendirin; sohbet, streaming, araçlar ve hata yönetimi örnekleri.
api14 ile resmi openai-java kütüphanesini kullanın. İstemci builder'ında baseUrl değerini ayarlayın ve model kimliklerini (örneğin openai/gpt-5-mini) düz dize olarak geçin.
Kurulum
Gradle:
implementation("com.openai:openai-java:4.+")
Maven:
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>LATEST</version>
</dependency>
Ardından ortamınızda API14_API_KEY=sk-api14-... ayarlayın.
Yapılandırma
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
OpenAIClient client = OpenAIOkHttpClient.builder()
.baseUrl("https://api14.com/api/v1")
.apiKey(System.getenv("API14_API_KEY"))
.build();
OpenAIOkHttpClient.fromEnv() bunun yerine OPENAI_BASE_URL ve OPENAI_API_KEY değerlerini okur; böylece kod değişikliği olmadan ortamlar arasında geçiş yapabilirsiniz:
export OPENAI_BASE_URL="https://api14.com/api/v1"
export OPENAI_API_KEY="sk-api14-..."
Sohbet
import com.openai.models.chat.completions.ChatCompletion;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("openai/gpt-5-mini")
.addUserMessage("Explain vector databases in two sentences.")
.build();
ChatCompletion completion = client.chat().completions().create(params);
completion.choices().get(0).message().content().ifPresent(System.out::println);
Streaming
import com.openai.core.http.StreamResponse;
import com.openai.models.chat.completions.ChatCompletionChunk;
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("anthropic/claude-sonnet-4.5")
.addUserMessage("Write a haiku about APIs.")
.build();
try (StreamResponse<ChatCompletionChunk> stream = client.chat().completions().createStreaming(params)) {
stream.stream()
.flatMap(chunk -> chunk.choices().stream())
.flatMap(choice -> choice.delta().content().stream())
.forEach(System.out::print);
}
Bkz. Streaming.
Tool calling
Bir aracı sınıf olarak tanımlayın; SDK onun JSON Schema'sını türetir ve argümanları geri o sınıfa ayrıştırır:
import com.fasterxml.jackson.annotation.JsonClassDescription;
import com.openai.models.chat.completions.*;
import java.util.Collection;
@JsonClassDescription("Current weather for a city")
static class GetWeather {
public String city;
}
ChatCompletionCreateParams.Builder builder = ChatCompletionCreateParams.builder()
.model("openai/gpt-5-mini")
.addTool(GetWeather.class)
.addUserMessage("What's the weather in Istanbul?");
while (true) {
ChatCompletionMessage message = client.chat().completions().create(builder.build())
.choices().get(0).message();
builder.addMessage(message);
if (message.toolCalls().map(Collection::isEmpty).orElse(true)) {
message.content().ifPresent(System.out::println);
break;
}
for (ChatCompletionMessageToolCall call : message.toolCalls().get()) {
GetWeather args = call.asFunction().function().arguments(GetWeather.class);
builder.addMessage(ChatCompletionToolMessageParam.builder()
.toolCallId(call.asFunction().id())
.contentAsJson(getWeather(args.city)) // your function
.build());
}
}
Builder tüm konuşmayı tutar: her döngü, araç çağrılarıyla birlikte asistan mesajını ekler, ardından her çağrı için bir araç mesajı ekler ve her şeyi tekrar gönderir. Araç sınıfının alanları şemanın özellikleri olur; modele ne anlama geldiğini söylemek için bir alana @JsonPropertyDescription ekleyin. Sürekli araç çağıran bir modelin sonsuza kadar dönememesi için üretim kodunda yineleme sayısını sınırlayın. Bkz. Tool calling.
Structured output
responseFormat için bir sınıf geçin; SDK ondan katı bir JSON Schema üretir ve her seçeneğin içeriğini bir örneğe ayrıştırır. supported_parameters alanında structured_outputs veya response_format bulunan bir model kullanın:
static class Person {
public String name;
public int born;
public String city;
}
StructuredChatCompletionCreateParams<Person> params = ChatCompletionCreateParams.builder()
.model("openai/gpt-5-mini")
.responseFormat(Person.class)
.addUserMessage("Extract: Ada Lovelace, born 1815 in London.")
.build();
client.chat().completions().create(params).choices().stream()
.flatMap(choice -> choice.message().content().stream())
.forEach(person -> System.out.println(person.name + " " + person.born));
Bkz. Structured outputs.
Görsel girdisi
import java.util.List;
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("google/gemini-2.5-flash")
.addUserMessageOfArrayOfContentParts(List.of(
ChatCompletionContentPart.ofText(ChatCompletionContentPartText.builder()
.text("What is in this picture?").build()),
ChatCompletionContentPart.ofImageUrl(ChatCompletionContentPartImage.builder()
.imageUrl(ChatCompletionContentPartImage.ImageUrl.builder()
.url("https://example.com/photo.jpg") // or a data:image/png;base64,... URL
.build())
.build())))
.build();
Bkz. Görsel ve dosyalar.
Ek parametreler
Türlü setter'ı olmayan ağ geçidi alanları (reasoning, provider, models) putAdditionalBodyProperty üzerinden geçer:
import com.openai.core.JsonValue;
import java.util.Map;
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.model("anthropic/claude-sonnet-4.5")
.addUserMessage("Prove there are infinitely many primes.")
.putAdditionalBodyProperty("reasoning", JsonValue.from(Map.of("effort", "high")))
.build();
Hatalar
2xx dışındaki yanıtlar, durumu ve başlıkları sunan OpenAIServiceException alt sınıflarını fırlatır:
import com.openai.errors.OpenAIServiceException;
try {
client.chat().completions().create(params);
} catch (OpenAIServiceException e) {
if (e.statusCode() == 402) {
System.err.println("Balance too low, add funds (insufficient_balance)");
} else if (e.statusCode() == 429) {
System.err.println("Rate limited, retry after " + e.headers().values("Retry-After") + "s");
} else {
throw e;
}
}
Bkz. Hatalar.
Zaman aşımları ve yeniden denemeler
İstemci bağlantı hatalarını, 408, 409, 429 ve 5xx hatalarını varsayılan olarak iki kez, üstel geri çekilmeyle yeniden dener. Sayıyı ve zaman aşımını builder üzerinde veya istek başına ayarlayın:
import com.openai.core.RequestOptions;
import java.time.Duration;
OpenAIClient client = OpenAIOkHttpClient.builder()
.baseUrl("https://api14.com/api/v1")
.apiKey(System.getenv("API14_API_KEY"))
.maxRetries(4)
.timeout(Duration.ofSeconds(60))
.build();
client.chat().completions().create(params,
RequestOptions.builder().timeout(Duration.ofMinutes(5)).build());
Builder zaman aşımı her denemeye uygulanır. Uzun reasoning istekleri dakikalar sürebilir; bu yüzden onlara daha uzun bir istek başına zaman aşımı verin veya stream edin. Yeniden denemek daily_limit_reached veya insufficient_balance için işe yaramaz; başka bir deneme planlamadan önce RateLimitException yakalayın ve hata kodunu kontrol edin. Bkz. Hız limitleri.
Tüm yetenekler
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);