为单次生成配置独立传输策略
java-openai 支持向原始响应入口传入调用方管理的 OkHttpClient。业务可以独立设置等待时间、连接重试与跳转规则,继续复用客户端构造请求头、发送请求和返回响应的能力,不必改变公共客户端池。
如需根据 platform 自动选择服务地址与密钥,并获得统一的 UniChatResponse,使用 UniChatClient 与调用方 HTTP 客户端 中的 UniChatClient.generate(client, request)。本文的底层入口适用于需要自行构造请求头与 JSON、直接处理 HTTP 响应的场景。
完整调用示例
以下示例不记录输入正文、密钥或响应正文。调用方负责关闭 Response;只返回业务需要的结果,由上层继续完成结构校验、来源校验和当前权限核对。
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import nexus.io.openai.client.OpenAiClient;
import nexus.io.tio.utils.environment.EnvUtils;
import okhttp3.OkHttpClient;
import okhttp3.Response;
public final class DraftGenerationTransport {
private static final OkHttpClient CLIENT = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(45, TimeUnit.SECONDS)
.callTimeout(45, TimeUnit.SECONDS)
.retryOnConnectionFailure(false)
.followRedirects(false)
.followSslRedirects(false)
.build();
public String send(String operationId, String validatedJson) throws Exception {
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Bearer " + EnvUtils.get("draft.ai.key"));
headers.put("Content-Type", "application/json");
headers.put("Idempotency-Key", operationId);
try (Response response = OpenAiClient.chatCompletions(
CLIENT, EnvUtils.get("draft.ai.base-url"), headers, validatedJson)) {
if (!response.isSuccessful() || response.body() == null) {
throw new IllegalStateException("原生成结果需要核查");
}
return response.body().string();
}
}
}
draft.ai.base-url 是服务的 API 前缀,客户端会追加 /chat/completions。是否支持 Idempotency-Key 必须由实际服务协议确认;发送这个头本身不证明外部具备幂等能力。
与业务事务配合
- 在数据库事务中记录原意图、输入版本及原周期暂占,并把任务标为已领取。
- 提交事务后才调用外部服务,避免等待模型期间长期占用数据库连接和业务行锁。
- 返回后重新核对当前主体、源稿版本、用途、取消意图和结果可用性,再确认计量。
- 超时保留原操作待核,不自动再次发送。取消采用与外部实际终止分别记录。
重试、取消与删除是不同动作。对于协议明确支持幂等的删除接口,可以核查或重试同一删除请求;生成请求则须先确认原意图结果。应用自己的 HTTP 拦截器也应采用最小日志策略。
原有三个参数的原始响应入口保持不变,仍采用公共客户端池。新增入口的好处是让不同业务保有独立的等待预算和恢复策略,并让上层明确承担响应关闭和结果核定。
