项目简介
Predictable Agents是一个基于Kotlin语言构建的多平台AI应用开发库,旨在通过类型安全和函数式编程范式,帮助开发者构建可预测的AI应用。它提供了灵活的Agent和Tool机制,可以与OpenAI、OpenRouter等大模型服务集成。其中,MCP模块允许开发者将其创建的AI代理和工具,以标准化的Model Context Protocol (MCP) 格式对外提供服务,从而实现与任何MCP兼容的LLM客户端进行高效、安全的上下文交互。
主要功能点
- 类型安全的AI交互: 自动从Kotlin数据类生成Schema,确保AI输入输出的类型安全。
- 多平台支持: 可以在JVM、Android、iOS、Linux和WASM等多个平台运行。
- 工具集成: 将自定义函数封装为AI工具,扩展AI代理的能力。
- 代理组合: 允许将Agent作为工具使用,构建复杂的AI处理流程和多代理系统。
- MCP服务器: 核心功能是启动一个符合Model Context Protocol (MCP) 标准的服务器,将Predictable Agents中定义的AI工具和代理暴露给外部MCP客户端。
- JSON-RPC通信: MCP服务器通过JSON-RPC协议与客户端通信,支持SSE (Server-Sent Events) 等多种传输协议。
- 会话管理与能力声明: 提供会话管理,并向客户端声明服务器所提供的工具能力。
安装步骤
Predictable Agents库及其MCP支持模块可以轻松集成到您的Kotlin项目中。
- 在您的 'build.gradle.kts' 文件中,添加以下依赖:
dependencies { // Predictable Agents 核心库 implementation("com.predictablemachines:agents:0.1.0-SNAPSHOT") // 可选:MCP 服务器支持模块 implementation("com.predictablemachines:mcp:0.1.0-SNAPSHOT") } - 如果您正在进行多平台开发,请在 'kotlin { sourceSets { ... } }' 块中为 'commonMain' 添加依赖:
kotlin { sourceSets { val commonMain by getting { dependencies { implementation("com.predictablemachines:agents:0.1.0-SNAPSHOT") // 如果需要在commonMain中使用MCP相关API,也在此处添加mcp模块 // implementation("com.predictablemachines:mcp:0.1.0-SNAPSHOT") } } } } - 确保您的环境已配置必要的API密钥,例如OpenAI或OpenRouter,通常作为环境变量设置:
export OPENAI_API_KEY="your-api-key" export OPENROUTER_API_KEY="your-openrouter-key" # 可选 export OPENAI_API_URL="https://api.openai.com/v1/" # 可选:自定义API端点
服务器配置
Predictable Agents的MCP服务器通常通过Ktor框架启动,并暴露预定义的AI工具和代理。MCP客户端连接此服务器时,需要指定正确的配置信息才能与MCP服务器建立连接。
以下是一个典型的MCP客户端需要配置的信息示例,用于连接Predictable Agents MCP服务器:
{ "servers": { "my-predictable-server": { "name": "我的Predictable AI服务", "namespace": "predictable", "description": "由Predictable Agents驱动的MCP服务", "config": { "type": "sse", "url": "http://localhost:8080/sse", "headers": { "Authorization": "Bearer YOUR_CUSTOM_TOKEN" } } } } }
- server name: 'my-predictable-server' (您为该服务器实例定义的唯一名称)
- type: 'sse' (表示服务器通过Server-Sent Events协议通信,这是Predictable Agents MCP服务器默认的一种常用传输协议)
- url: 'http://localhost:8080/sse' (MCP服务器的监听地址和SSE端点。请确保端口和主机与您实际启动服务器时设置的一致)
- headers: (可选) 如果服务器需要认证或其他自定义请求头,可以在此配置。例如,'"Authorization": "Bearer YOUR_CUSTOM_TOKEN"'。
- 如果您将MCP服务器打包为可执行JAR并通过 'java -jar your-server-application.jar' 方式启动,并希望MCP客户端能自动管理其生命周期,那么客户端配置的 'type' 也可以是 'stdio',并提供启动命令和参数:
{ "type": "stdio", "command": "java", "args": [ "-jar", "your-server-application.jar", // 如果您的应用需要,可以添加启动参数,例如: // "--port", "8080", // "--host", "0.0.0.0" ], "env": { "OPENAI_API_KEY": "YOUR_OPENAI_KEY" // 传入服务器所需的API密钥 } }- command: 'java' (启动Java应用程序的命令)
- args: '"-jar", "your-server-application.jar"' (执行JAR文件的参数。'your-server-application.jar' 是您编译打包后的Predictable Agents MCP服务器应用的JAR文件名)
- env: (可选) 额外的环境变量,如 'OPENAI_API_KEY',用于在服务器进程中配置AI服务提供商的API密钥。
基本使用方法
启动Predictable Agents MCP服务器的步骤如下:
-
定义您的AI工具或代理: 例如,创建一个简单的翻译工具:
import predictable.Tool import predictable.tool.KotlinSchema import kotlinx.serialization.Serializable import kotlinx.coroutines.runBlocking @Serializable data class TranslationInput(val text: String, val targetLanguage: String) @Serializable data class TranslationOutput(val translatedText: String, val sourceLanguage: String) val translator = Tool( name = "translator", description = "Translates text to different languages", schema = KotlinSchema( TranslationInput.serializer(), TranslationOutput.serializer() ) ) { input -> // 您的翻译逻辑 TranslationOutput( translatedText = "Translated: ${input.text} to ${input.targetLanguage}", sourceLanguage = "auto-detected" ) } -
启动MCP服务器: 使用 'startKtorMCPServer' 函数启动服务器,并将您定义的工具列表传入。
import predictable.mcp.server.MCPServer.startKtorMCPServer fun main() = runBlocking { val server = startKtorMCPServer( tools = listOf(translator), // 传入您定义的工具 port = 8080, host = "0.0.0.0", serverName = "my-translation-server", // 服务器名称 serverVersion = "1.0.0" // 服务器版本 ) println("MCP Server running at http://localhost:8080/sse") server.start(wait = true) // 启动服务器并等待 }将上述代码编译打包成一个可执行的JAR文件,即可作为MCP服务器运行。
-
MCP客户端连接: 当MCP服务器运行后,任何MCP兼容的客户端(例如,另一个Predictable Agents客户端、VS Code插件或支持MCP的LLM前端)都可以通过配置服务器的URL ('http://localhost:8080/sse') 来发现并调用您暴露的工具。
例如,使用Predictable Agents作为MCP客户端连接:
import predictable.mcp.client.MCPClient import predictable.mcp.config.MCPConfig import predictable.mcp.config.MCPServerConfig import predictable.mcp.config.ServerConfig import kotlinx.serialization.json.* suspend fun connectToMCPServer() { val config = MCPConfig( servers = mapOf( "remote-server" to MCPServerConfig( name = "Remote Translation Server", namespace = "remote", description = "远程翻译服务", config = ServerConfig.SSE( // 使用SSE协议 url = "http://localhost:8080/sse" ) ) ) ) MCPClient(config) { client -> val tools = client.tools() // 发现服务器上的工具 val translatorTool = tools.first { it.name == "translator" } val input = buildJsonObject { put("text", "Hello world") put("targetLanguage", "Spanish") } val result = translatorTool.invoke(input) // 调用翻译工具 println("Translation result: $result") } }
信息
分类
AI与计算