首页> 都市> KingFlow AI API中转站 Kotlin Ktor 接入教程
>KingFlow AI API中转站 Kotlin Ktor 接入教程
著本文标签:
KingFlow AI API中转站 Kotlin Ktor 接入教程 使用协程完成 JSON 请求 SSE 流式读取 超时控制与有限重试 KingFlow AI 提供 OpenAI 与 Anthropic 兼容接口。本文选择 OpenAI 兼容的 Chat Completions 端点,使用 Kotlin 协程与 Ktor Client 构建异步客户端。教
来源:KingFlow AI 主角: 更新: 2026-11-13 11:23:38
【扫一扫】手机随心读
- 读书简介
KingFlow AI API中转站 Kotlin Ktor 接入教程 使用协程完成 JSON 请求 SSE 流式读取 超时控制与有限重试 KingFlow AI 提供 OpenAI 与 Anthropic 兼容接口。本文选择 OpenAI 兼容的 Chat Completions 端点,使用 Kotlin 协程与 Ktor Client 构建异步客户端。教
KingFlow AI API中转站 Kotlin Ktor 接入教程
使用协程完成 **ON 请求 SSE 流式读取 超时控制与有限重试 KingFlow AI 提供 OpenAI 与 Anthropic 兼容接口。本文选择 OpenAI 兼容的 Chat Completions 端点,使用 Kotlin 协程与 Ktor ****** 构建异步客户端。教程从普通 **ON 请求开始,再加入 SSE 流式读取、分层超时、有限重试、并发门限和生产环境验收。 Claude中转、Claude中转站、API中转和API中转站的实际接入均需核对协议与模型权限。 内容核验日期 2026-11-13KingFlow AI API中转站 Kotlin Ktor 接入教程

常用接入术语
名称 常见含义 接入提示 Claude中转 把请求转发到已开通的 Claude 模型 先确认协议与模型权限 Claude中转站 统一管理密钥 额度 路由和兼容接口 Claude 客户端可按 Anthropic 协议接入 API中转 通过统一接口转发模型请求 Ktor 可直接发送 **** **ON API中转站 提供端点 模型和用量管理的服务 正式环境需设置超时 并发和重试边界 Kotlin 异步请求链路
环节 职责 注意事项 协程作用域 调度请求并管理任务生命周期 避免无归属的**协程 Ktor ****** 发送请求并复用底层连接 应用级创建并统一关闭 ContentNegotiation 序列化请求并处理 **ON 忽略未知字段以适配响应扩展 KingFlow AI 认证密钥并路由目标模型 OpenAI 兼容路径保留 /v1 SSE 插件 按事件持续消费流式响应 识别 **ta 与 DONE Se**phore 限制同时运行的请求数量 门限按实例与额度设置 采用协程与 Ktor 的优势
接入前准备
加入 Gradle 依赖
val ktorVersion = "3.6.1"
dependencies {
implementation("io.ktor:ktor-client-core:$ktorVersion")
implementation("io.ktor:ktor-client-cio:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
implementation("org.jet*rains.kotlinx:kotlinx-coroutines-core:1.10.2")
}配置环境变量
$env:KINGFLOW_*ASE_**L="https://api.**nju**shen.com/v1"
$env:KINGFLOW_API_KEY="sk-你的密钥"
$env:KINGFLOW_MODEL="<KingFlow控制台中的完整模型ID>"验证基础接口
curl https://api.**nju**shen.com/v1/chat/completions `
-H "Authorization: *earer sk-你的密钥" `
-H "Content-Type: application/json" `
-d '{"model":"<完整模型ID>","messages":[{"role":"user","content":"只回复 KTOR_READY"}],"stream":false}' 创建共享客户端
import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.plugins.sse.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.json.Json
val json = Json { ignoreUnknownKeys = true }
fun *uild******() = Http******(CIO) {
expectSuccess = false
install(ContentNegotiation) { json(json) }
install(SSE) {
**xReconnectionAttempts = 0
*ufferPolicy = SSE*ufferPolicy.LastEvents(5)
}
install(HttpRequestRetry) {
**xRetries = 2
retryIf { _, response -> response.status.value in setOf(429, 503) }
exponentialDelay(*ase = 2.0, **xDelayMs = 8_000)
}
install(HttpTimeout) {
requestTimeoutMillis = 45_000
connectTimeoutMillis = 10_000
socketTimeoutMillis = 60_000
}
}发送普通响应请求
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
import kotlinx.coroutines.run*locking
import kotlinx.serialization.json.*
fun required(name: String): String =
******.getenv(name) ?: error("缺少环境变量 $name")
fun **in() = run*locking {
val *ase = required("KINGFLOW_*ASE_**L").trimEnd('/')
val key = required("KINGFLOW_API_KEY")
val model = required("KINGFLOW_MODEL")
val client = *uild******()
try {
val payload = *uildJsonO*ject {
put("model", model)
putJsonArray("messages") {
addJsonO*ject {
put("role", "user")
put("content", "只回复 KTOR_CONNECTED")
}
}
put("stream", false)
}
val response = client.post("$*ase/chat/completions") {
*earerAuth(key)
contentType(ContentType.Application.Json)
set*ody(payload)
}
val *ody = response.*odyAsText()
check(response.status.isSuccess()) {
"**** ${response.status.value}: $*ody"
}
val root = json.parseToJsonElement(*ody).jsonO*ject
val text = root["choices"]!!.jsonArray[0].jsonO*ject
["message"]!!.jsonO*ject["content"]!!.jsonPrimitive.content
println(text)
} finally {
client.close()
}
}读取 SSE 流式响应
import io.ktor.client.plugins.sse.*
import io.ktor.client.request.*
import io.ktor.http.*
import kotlinx.coroutines.flow.takeWhile
import kotlinx.serialization.json.*
suspend fun streamAnswer(
client: Http******,
*ase: String,
key: String,
model: String,
prompt: String,
) {
val payload = *uildJsonO*ject {
put("model", model)
putJsonArray("messages") {
addJsonO*ject {
put("role", "user")
put("content", prompt)
}
}
put("stream", true)
}
client.sse({
method = HttpMethod.Post
url("${*ase.trimEnd('/')}/chat/completions")
*earerAuth(key)
contentType(ContentType.Application.Json)
set*ody(payload.toString())
}) {
incoming
.takeWhile { it.**ta != "[DONE]" }
.collect { event ->
val **ta = event.**ta ?: return@collect
val root = json.parseToJsonElement(**ta).jsonO*ject
val delta = root["choices"]!!.jsonArray[0].jsonO*ject
["delta"]!!.jsonO*ject["content"]
if (delta != null && delta !is JsonNull) {
print(delta.jsonPrimitive.content)
}
}
}
}限制批量任务并发
import kotlinx.coroutines.*
import kotlinx.coroutines.sync.Se**phore
import kotlinx.coroutines.sync.withPermit
suspend fun run*atch(
prompts: List<String>,
callModel: suspend (String) -> String,
): List<Result<String>> = coroutineScope {
val gate = Se**phore(permits = 6)
prompts.**p { prompt ->
async {
runCatching {
gate.withPermit { callModel(prompt) }
}
}
}.awaitAll()
}
运行和验收
检查点 预期结果 判断依据 基础接口 返回 KTOR_READY 端点 密钥和模型可用 普通响应 返回 KTOR_CONNECTED **ON 请求与解析正常 流式响应 文本按事件增量输出 SSE 解析与 DONE 正常 客户端复用 跨任务使用同一个 ****** 没有在循环中重复创建 并发门限 同时执行任务不超过设定值 Se**phore 正常释放许可 有限重试 最多追加两次尝试 只覆盖 429 和 503 正式环境配置
密钥和数据安全
上线检查清单
常见故障排查
现象 常见原因 处理方法 返回 401 密钥错误 停用或额度异常 核对 sk- 密钥并检查控制台状态 返回 404 模型 ID 或路径错误 保留 /v1 并复制完整模型 ID 返回 429 请求频率或额度受限 降低并发并执行有限退避 返回 503 模型通道暂不可用 稍后有限重试或切换已开通模型 请求超时 连接 请求或包间隔超时 区分三类超时后分别调整 流式无输出 stream 未开启或事件解析失败 检查 **ta delta.content 与 DONE 重复输出片段 流式中断后从头自动重试 流式开始输出后停止自动重连 任务大量堆积 并发或队列没有边界 使用 Se**phore 或有界队列限制入口 最小上线策略
《KingFlow AI API中转站 Kotlin Ktor 接入教程》资讯列表:
为您推荐
小说标签

别再说我这台电脑能跑 新加坡远程 Mac 如何留下可复现的项目环境
项目只做三个月 真的要先买一台 Mac 吗
新人明天入组 电脑还在路上 新加坡远程 Mac 让项目先开工
API中转 高消耗模型用量控制指南
Claude中转 跨地区使用迁移指南








