SDK-guider
Java
Använd det officiella biblioteket openai-java med api14 genom att sätta baseUrl på klientbyggaren, med exempel för chat, streaming, verktyg och återförsök.
Använd det officiella biblioteket openai-java med api14. Sätt baseUrl på klientbyggaren och ange modell-id (till exempel openai/gpt-5-mini) som vanliga strängar.
Installera
Gradle:
implementation("com.openai:openai-java:4.+")
Maven:
<dependency>
<groupId>com.openai</groupId>
<artifactId>openai-java</artifactId>
<version>LATEST</version>
</dependency>
Sätt sedan API14_API_KEY=sk-api14-... i din miljö.
Konfigurera
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() läser i stället OPENAI_BASE_URL och OPENAI_API_KEY, så du kan växla miljö utan kodändringar:
export OPENAI_BASE_URL="https://api14.com/api/v1"
export OPENAI_API_KEY="sk-api14-..."
Chat
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);
}
Se Streaming.
Verktygsanrop
Beskriv ett verktyg som en klass. SDK:n härleder dess JSON Schema och tolkar argumenten tillbaka till den:
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)) // din funktion
.build());
}
}
Byggaren behåller hela konversationen: varje varv i loopen lägger till assistentmeddelandet med dess verktygsanrop, sedan ett verktygsmeddelande per anrop, och skickar allt igen. Verktygsklassens fält blir schemats egenskaper. Lägg till @JsonPropertyDescription på ett fält för att tala om för modellen vad det betyder. Begränsa antalet varv i produktionskod så att en modell som fortsätter anropa verktyg inte kan loopa i all oändlighet. Se Verktygsanrop.
Strukturerad utdata
Skicka en klass till responseFormat. SDK:n genererar ett strikt JSON Schema från den och tolkar varje svarsalternativs innehåll till en instans. Använd en modell som listar structured_outputs eller response_format i sina supported_parameters:
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));
Bild som indata
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") // eller en data:image/png;base64,...-URL
.build())
.build())))
.build();
Se Vision och filer.
Extra parametrar
Gateway-fält utan typad setter (reasoning, provider, models) går via putAdditionalBodyProperty:
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();
Fel
Svar som inte är 2xx kastar subklasser av OpenAIServiceException, som exponerar status och huvuden:
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;
}
}
Se Fel.
Tidsgränser och återförsök
Klienten försöker som standard igen två gånger vid anslutningsfel, 408, 409, 429 och 5xx med exponentiell backoff. Konfigurera antal och tidsgräns på byggaren, eller per anrop:
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());
Byggarens tidsgräns gäller för varje försök. Långa resonemangsanrop kan ta minuter, så ge dem en längre tidsgräns per anrop eller strömma dem. Återförsök hjälper inte vid daily_limit_reached eller insufficient_balance. Fånga RateLimitException och kontrollera felkoden innan du schemalägger ett nytt försök. Se Hastighetsgränser.
Alla funktioner
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);