
Unified DSL-based AI model client for multiple providers and API protocols; supports streaming/non-stream calls, tool calling and automated agents, ACP/A2A & MCP integration, model presets and retry/backoff.
English | 中文
RAC 是一个基于 Kotlin Multiplatform 与 Ktor 的 AI 模型调用库,通过统一的 llm { } DSL 入口接入 11 家 LLM 供应商,覆盖 3 种
API 协议(OpenAI Chat Completions、OpenAI Responses、Anthropic Messages),支持非流式调用、流式调用、工具调用(Tool Calling)与自动化
Agent,并双向支持 Agent Client Protocol(ACP)与 Agent-to-Agent Protocol(A2A)——既能作为 Client 调用外部 Agent,也能将自身
Agent 暴露为 ACP / A2A Server。
model(DeepSeekModel.V4_FLASH) 一行注册,免去手写模板代码chat { } 自动路由chatStream { }(Completions)、anthropicStream { }(Anthropic)、respondStream { }(Responses),基于 SSE
冷流,统一为 StreamEvent 语义事件agent(llm) { prompts(); tools { } } 声明式配置,run / runStream 自动完成多轮工具调用循环;
Session 记录完整对话历史,可跨 Agent 复用tool<Args>(name, desc) { } 自动生成 JSON Schema;散开参数
tool(name, desc) { param(); execute { } } 无需 data class,支持 0-10 参数stop(停止序列)、seed(随机种子)、enableThinking(思考开关),全栈同步并按 API 差异化处理chatWithMcp { } 自动发现 MCP 工具并执行多轮调用,支持 Stdio / HTTP 传输chatWithAcpAgent { } 作为 Client 调用外部 Agent(Claude Code、Codex CLI 等),serveAsAcpAgent { } 将
RAC 暴露为 ACP Agent ServerchatWithA2aAgent 作为 Client 调用远端 A2A Agent(Google ADK、LangGraph 等),serveAsA2aAgent 将 RAC
暴露为 A2A Agent ServerRetryExecutor 提供指数退避重试,自动处理 429/5xx 瞬时错误与 Retry-After 头| 平台 | 支持 | Ktor 引擎 |
|---|---|---|
| JVM | ✅ | OkHttp |
| Android(minSdk 24) | ✅ | OkHttp |
| iOS(iosArm64 / iosSimulatorArm64) | ✅ | Darwin |
| mingwX64(Windows 原生) | ✅ | WinHttp + Curl |
| linuxX64 | ✅ | Curl |
| linuxArm64 | ✅ | Curl |
| macosArm64 | ✅ | Darwin |
| JS(browser / nodejs) | ✅ | JS |
| WasmJs(browser / nodejs) | ✅ | JS |
RAC 分为 4 个 Gradle 模块(依赖 DAG:core ← mcp ← {acp, a2a}):
| 模块 | Maven 坐标 | 作用 |
|---|---|---|
| core | top.resderx.rac:rac-core:0.1.0-alpha01 |
消息模型、网络层、API 协议客户端、供应商实现、基础 DSL、Agent |
| mcp | top.resderx.rac:rac-mcp:0.1.0-alpha01 |
MCP 客户端 + Llm.chatWithMcp 扩展函数 |
| acp | top.resderx.rac:rac-acp:0.1.0-alpha01 |
ACP 双向支持 + Llm.chatWithAcpAgent / Llm.serveAsAcpAgent 扩展函数 |
| a2a | top.resderx.rac:rac-a2a:0.1.0-alpha01 |
A2A 双向支持 + Llm.chatWithA2aAgent / Llm.serveAsA2aAgent 扩展函数 |
仅使用基础对话能力只需引入 core;需要 MCP / ACP / A2A 协议集成时再引入对应模块(需同时引入 core)。
在 build.gradle.kts 的 commonMain 依赖中添加:
kotlin {
// 配置你的目标平台,例如:
jvm()
mingwX64()
iosArm64()
iosSimulatorArm64()
}
dependencies {
commonMain {
implementation("top.resderx.rac:rac-core:0.1.0-alpha01")
// 按需引入协议模块
implementation("top.resderx.rac:rac-mcp:0.1.0-alpha01")
implementation("top.resderx.rac:rac-acp:0.1.0-alpha01")
implementation("top.resderx.rac:rac-a2a:0.1.0-alpha01")
}
}dependencies {
implementation("top.resderx.rac:rac-core:0.1.0-alpha01")
}import top.resderx.rac.dsl.llm
import top.resderx.rac.dsl.deepseek
import top.resderx.rac.providers.presets.DeepSeekModel
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
// 1. 创建 Llm 实例——注册 DeepSeek 供应商并使用预设模型
val ai = llm {
providers {
deepseek {
apiKey("sk-...")
models {
// 一行注册预设模型,自动应用推荐配置
model(DeepSeekModel.V4_FLASH)
}
}
}
}
// 2. 非流式对话
val response = ai.chat {
user("用一句话解释 Kotlin Multiplatform")
}
println(response.content)
}更多示例见下方文档链接。
llm { } 创建 Llm 实例,providers { } 注册供应商,models { } 注册模型,chat { } 构建请求ModelConfig(模型注册时的默认值)→ ChatRequestBuilder(调用时覆盖)→ 服务端默认。未在 builder 显式设置的字段回退到
ModelConfig,仍为 null 时回退到服务端默认AIMessage(content / reasoningContent / toolCalls / usage / finishReason),流式响应归一化为
StreamEvent 密封接口Agent 持有 systemPrompt 与工具集,Session 仅记录 user/assistant/tool 消息(不含 system),不同 Agent
可共用同一 Sessiontool<Args> 自动从 @Serializable data class 生成 JSON Schema;散开参数
tool { param(); execute { } } 无需类定义,支持 0-10 参数;11+ 参数须用强类型模式详见 LICENSE。
English | 中文
RAC 是一个基于 Kotlin Multiplatform 与 Ktor 的 AI 模型调用库,通过统一的 llm { } DSL 入口接入 11 家 LLM 供应商,覆盖 3 种
API 协议(OpenAI Chat Completions、OpenAI Responses、Anthropic Messages),支持非流式调用、流式调用、工具调用(Tool Calling)与自动化
Agent,并双向支持 Agent Client Protocol(ACP)与 Agent-to-Agent Protocol(A2A)——既能作为 Client 调用外部 Agent,也能将自身
Agent 暴露为 ACP / A2A Server。
model(DeepSeekModel.V4_FLASH) 一行注册,免去手写模板代码chat { } 自动路由chatStream { }(Completions)、anthropicStream { }(Anthropic)、respondStream { }(Responses),基于 SSE
冷流,统一为 StreamEvent 语义事件agent(llm) { prompts(); tools { } } 声明式配置,run / runStream 自动完成多轮工具调用循环;
Session 记录完整对话历史,可跨 Agent 复用tool<Args>(name, desc) { } 自动生成 JSON Schema;散开参数
tool(name, desc) { param(); execute { } } 无需 data class,支持 0-10 参数stop(停止序列)、seed(随机种子)、enableThinking(思考开关),全栈同步并按 API 差异化处理chatWithMcp { } 自动发现 MCP 工具并执行多轮调用,支持 Stdio / HTTP 传输chatWithAcpAgent { } 作为 Client 调用外部 Agent(Claude Code、Codex CLI 等),serveAsAcpAgent { } 将
RAC 暴露为 ACP Agent ServerchatWithA2aAgent 作为 Client 调用远端 A2A Agent(Google ADK、LangGraph 等),serveAsA2aAgent 将 RAC
暴露为 A2A Agent ServerRetryExecutor 提供指数退避重试,自动处理 429/5xx 瞬时错误与 Retry-After 头| 平台 | 支持 | Ktor 引擎 |
|---|---|---|
| JVM | ✅ | OkHttp |
| Android(minSdk 24) | ✅ | OkHttp |
| iOS(iosArm64 / iosSimulatorArm64) | ✅ | Darwin |
| mingwX64(Windows 原生) | ✅ | WinHttp + Curl |
| linuxX64 | ✅ | Curl |
| linuxArm64 | ✅ | Curl |
| macosArm64 | ✅ | Darwin |
| JS(browser / nodejs) | ✅ | JS |
| WasmJs(browser / nodejs) | ✅ | JS |
RAC 分为 4 个 Gradle 模块(依赖 DAG:core ← mcp ← {acp, a2a}):
| 模块 | Maven 坐标 | 作用 |
|---|---|---|
| core | top.resderx.rac:rac-core:0.1.0-alpha01 |
消息模型、网络层、API 协议客户端、供应商实现、基础 DSL、Agent |
| mcp | top.resderx.rac:rac-mcp:0.1.0-alpha01 |
MCP 客户端 + Llm.chatWithMcp 扩展函数 |
| acp | top.resderx.rac:rac-acp:0.1.0-alpha01 |
ACP 双向支持 + Llm.chatWithAcpAgent / Llm.serveAsAcpAgent 扩展函数 |
| a2a | top.resderx.rac:rac-a2a:0.1.0-alpha01 |
A2A 双向支持 + Llm.chatWithA2aAgent / Llm.serveAsA2aAgent 扩展函数 |
仅使用基础对话能力只需引入 core;需要 MCP / ACP / A2A 协议集成时再引入对应模块(需同时引入 core)。
在 build.gradle.kts 的 commonMain 依赖中添加:
kotlin {
// 配置你的目标平台,例如:
jvm()
mingwX64()
iosArm64()
iosSimulatorArm64()
}
dependencies {
commonMain {
implementation("top.resderx.rac:rac-core:0.1.0-alpha01")
// 按需引入协议模块
implementation("top.resderx.rac:rac-mcp:0.1.0-alpha01")
implementation("top.resderx.rac:rac-acp:0.1.0-alpha01")
implementation("top.resderx.rac:rac-a2a:0.1.0-alpha01")
}
}dependencies {
implementation("top.resderx.rac:rac-core:0.1.0-alpha01")
}import top.resderx.rac.dsl.llm
import top.resderx.rac.dsl.deepseek
import top.resderx.rac.providers.presets.DeepSeekModel
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
// 1. 创建 Llm 实例——注册 DeepSeek 供应商并使用预设模型
val ai = llm {
providers {
deepseek {
apiKey("sk-...")
models {
// 一行注册预设模型,自动应用推荐配置
model(DeepSeekModel.V4_FLASH)
}
}
}
}
// 2. 非流式对话
val response = ai.chat {
user("用一句话解释 Kotlin Multiplatform")
}
println(response.content)
}更多示例见下方文档链接。
llm { } 创建 Llm 实例,providers { } 注册供应商,models { } 注册模型,chat { } 构建请求ModelConfig(模型注册时的默认值)→ ChatRequestBuilder(调用时覆盖)→ 服务端默认。未在 builder 显式设置的字段回退到
ModelConfig,仍为 null 时回退到服务端默认AIMessage(content / reasoningContent / toolCalls / usage / finishReason),流式响应归一化为
StreamEvent 密封接口Agent 持有 systemPrompt 与工具集,Session 仅记录 user/assistant/tool 消息(不含 system),不同 Agent
可共用同一 Sessiontool<Args> 自动从 @Serializable data class 生成 JSON Schema;散开参数
tool { param(); execute { } } 无需类定义,支持 0-10 参数;11+ 参数须用强类型模式详见 LICENSE。