跳到主要内容

Android SDK

概述​

iFlow SDK是用于与iFlow CLI进行编程交互的SDK,通过他可以快速将iFlow CLI集成到你的业务系统中,结合workflow等智能体扩展,允许开发者构建具有对话、工具执行和任务规划能力的 AI 驱动应用程序,让业务系统具备AI的能力。 目前已支持Python、Java、TypeScript、Android版本。

系统要求​

  • Android API: 21+ (Android 5.0 Lollipop 或更高版本)
  • Kotlin: 1.8 或更高版本
  • iFlow CLI: 0.2.24 或更高版本

依赖​

添加到你的 build.gradle:

dependencies {
// 用于与iFlow CLI建立连接、通信等
implementation 'cn.iflow:iflow-cli-sdk-android:1.0.0'

// OkHttp 用于 WebSocket
implementation 'com.squareup.okhttp3:okhttp:4.12.0'

// Gson 用于 JSON
implementation 'com.google.code.gson:gson:2.10.1'

// 协程
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
}

快速开始​

基础示例​

使用 IFlowClient 进行基本的对话交互:

import com.iflow.sdk.IFlowClient
import com.iflow.sdk.IFlowOptions
import com.iflow.sdk.models.*

val options = IFlowOptions()

IFlowClient(options).use { client ->
client.connect()
client.sendMessage("你好,iFlow!")

client.receiveMessages { message ->
when (message) {
is AssistantMessage -> {
println(message.chunk.text)
}
is TaskFinishMessage -> {
return@receiveMessages // 完成
}
}
}
}

简单查询​

最简单的使用方式是通过 IFlowQuery.query 函数:

import com.iflow.sdk.query.IFlowQuery

// 简单一键查询
val result = IFlowQuery.query("What is 2 + 2?")
println(result) // "2 + 2 equals 4."

核心概念​

IFlowClient​

IFlowClient 是与 iFlow CLI 交互的主要接口,管理 WebSocket 连接的生命周期:

import com.iflow.sdk.IFlowClient
import com.iflow.sdk.IFlowOptions

// 使用默认配置
val options = IFlowOptions()
IFlowClient(options).use { client ->
client.connect()
client.sendMessage("你的问题")

client.receiveMessages { message ->
// 处理消息
}
}

// 使用自定义配置
val options = IFlowOptions(
url = "ws://localhost:8090/acp?peer=iflow",
timeout = 300_000L, // 5 分钟
permissionMode = PermissionMode.AUTO
)
IFlowClient(options).use { client ->
client.connect()
client.sendMessage("你的问题")

client.receiveMessages { message ->
// 处理消息
}
}

消息类型​

SDK 支持多种消息类型,对应 iFlow 协议的不同响应:

AssistantMessage - AI 助手响应​

import com.iflow.sdk.IFlowClient
import com.iflow.sdk.IFlowOptions
import com.iflow.sdk.models.*

fun handleAssistantMessage() {
val options = IFlowOptions()

IFlowClient(options).use { client ->
client.connect()
client.sendMessage("请介绍一下 Kotlin")

client.receiveMessages { message ->
when (message) {
is AssistantMessage -> {
println(message.chunk.text)
}
is TaskFinishMessage -> {
return@receiveMessages
}
}
}
}
}

ToolCallMessage - 工具调用​

import com.iflow.sdk.IFlowClient
import com.iflow.sdk.IFlowOptions
import com.iflow.sdk.models.*

fun handleToolCalls() {
val options = IFlowOptions(
permissionMode = PermissionMode.MANUAL
)

IFlowClient(options).use { client ->
client.connect()
client.sendMessage("列出当前目录的文件")

client.receiveMessages { message ->
when (message) {
is ToolCallMessage -> {
println("工具调用: ${message.label}")
println("状态: ${message.status}")

// 处理工具确认
if (message.confirmation?.required == true) {
client.approveToolCall(message.id)
}
}
is TaskFinishMessage -> {
return@receiveMessages
}
}
}
}
}

PlanMessage - 任务计划​

import com.iflow.sdk.IFlowClient
import com.iflow.sdk.IFlowOptions
import com.iflow.sdk.models.*

fun showPlan() {
val options = IFlowOptions()

IFlowClient(options).use { client ->
client.connect()
client.sendMessage("帮我创建一个 Android 项目结构")

client.receiveMessages { message ->
when (message) {
is PlanMessage -> {
println("执行计划:")
message.entries.forEach { entry ->
val statusIcon = if (entry.status == "completed") "✅" else "⏳"
println("$statusIcon [${entry.priority}] ${entry.content}")
}
}
is TaskFinishMessage -> {
return@receiveMessages
}
}
}
}
}

TaskFinishMessage - 任务完成​

import com.iflow.sdk.IFlowClient
import com.iflow.sdk.IFlowOptions
import com.iflow.sdk.models.*

fun checkCompletion() {
val options = IFlowOptions()

IFlowClient(options).use { client ->
client.connect()
client.sendMessage("计算 1+1")

client.receiveMessages { message ->
when (message) {
is AssistantMessage -> {
print(message.chunk.text)
}
is TaskFinishMessage -> {
println() // 换行
println("任务完成: ${message.stopReason}")
return@receiveMessages
}
}
}
}
}

常见用例​

交互式聊天机器人​

import com.iflow.sdk.IFlowClient
import com.iflow.sdk.IFlowOptions
import com.iflow.sdk.models.*

fun chatbot() {
println("iFlow 聊天机器人 (输入 'quit' 退出)")
println("-".repeat(50))

val options = IFlowOptions()

IFlowClient(options).use { client ->
client.connect()

while (true) {
print("\n你: ")
val userInput = readLine() ?: break

if (userInput.lowercase() in listOf("quit", "exit", "q")) {
println("再见!")
break
}

client.sendMessage(userInput)

print("iFlow: ")
client.receiveMessages { message ->
when (message) {
is AssistantMessage -> {
print(message.chunk.text)
}
is TaskFinishMessage -> {
println() // 换行
return@receiveMessages
}
}
}
}
}
}

fun main() {
chatbot()
}

高级配置​

权限模式配置​

配置工具调用的权限管理:

import com.iflow.sdk.IFlowClient
import com.iflow.sdk.IFlowOptions
import com.iflow.sdk.models.*

// 自动批准所有工具
val autoOptions = IFlowOptions(
permissionMode = PermissionMode.AUTO
)

// 每次确认都询问
val manualOptions = IFlowOptions(
permissionMode = PermissionMode.MANUAL
)

// 选择性批准
val selectiveOptions = IFlowOptions(
permissionMode = PermissionMode.SELECTIVE
)

会话配置​

import com.iflow.sdk.IFlowClient
import com.iflow.sdk.IFlowOptions
import com.iflow.sdk.models.*

val options = IFlowOptions(
url = "ws://localhost:8090/acp?peer=iflow",
timeout = 300_000L, // 5 分钟
permissionMode = PermissionMode.AUTO,
fileAccess = true,
fileReadOnly = true,
authMethodId = "iflow",
sessionSettings = SessionSettings(
workingDirectory = "/workspace"
)
)

文件附件支持​

SDK 支持多种文件类型:

  • 图片:PNG, JPG, GIF, WebP, SVG (base64 编码)
  • 音频:MP3, WAV, M4A, OGG, FLAC (base64 编码)
  • 文档:PDF, TXT, 代码文件 (资源链接)
client.sendMessage(
text = "分析这些文件",
files = listOf(
"/path/to/image.png",
"/path/to/audio.mp3",
"/path/to/document.pdf"
)
)

错误处理​

SDK 提供特定的异常类型:

import com.iflow.sdk.query.IFlowQuery
import com.iflow.sdk.exceptions.*

try {
val result = IFlowQuery.query("你好")
println(result)
} catch (e: ConnectionException) {
println("连接失败: ${e.message}")
} catch (e: AuthenticationException) {
println("认证失败: ${e.message}")
} catch (e: TimeoutException) {
println("操作超时: ${e.message}")
} catch (e: IFlowException) {
println("iFlow 错误: ${e.message}")
}

API 参考​

核心类​

类名描述
IFlowClient主客户端类,管理与 iFlow 的连接
IFlowOptions配置选项类
IFlowQuery简单查询工具类

IFlowQuery 方法​

方法描述
query(text, files, options)发送查询并返回完整响应
querySync(text, files, options)同步版本的 query(阻塞当前线程)
queryBatch(queries, options)并行发送多个查询
queryWithFile(text, filePath, options)带单个文件附件的查询
queryCode(prompt, language, options)生成带语言提示的代码
queryAnalyze(filePath, question, options)分析文件

IFlowClient 方法​

方法描述
connect()建立与 iFlow 的连接
sendMessage(text, files)发送带可选文件的消息
receiveMessages(callback)接收流式响应
getMessageChannel()获取消息通道用于接收消息
interrupt()取消当前生成
approveToolCall(id, outcome)批准工具调用
rejectToolCall(id)拒绝工具调用
disconnect()优雅地关闭连接

消息类型​

消息类型描述主要属性
AssistantMessageAI 助手的文本响应chunk.text
ToolCallMessage工具执行请求和状态label, status, confirmation
PlanMessage结构化任务计划entries (包含 content, priority, status)
TaskFinishMessage任务完成信号stopReason
ErrorMessage错误信息message

配置选项​

选项类型描述
urlStringWebSocket URL (默认: ws://localhost:8090/acp?peer=iflow)
timeoutLong超时时间(毫秒,默认: 300000 即 5 分钟)
permissionModePermissionMode工具调用权限模式
fileAccessBoolean是否允许文件访问
fileReadOnlyBoolean文件访问是否只读
authMethodIdString认证方法 ID
sessionSettingsSessionSettings会话配置

权限模式​

模式描述
PermissionMode.AUTO自动批准所有工具
PermissionMode.MANUAL每次确认都询问
PermissionMode.SELECTIVE自动批准某些类型

架构​

SDK 的结构如下:

com.iflow.sdk/
├── IFlowClient.kt // 主客户端类
├── IFlowOptions.kt // 配置
├── models/ // 数据类和枚举
├── transport/ // WebSocket 传输 (OkHttp)
├── protocol/ // ACP 协议实现
├── query/ // 简单查询工具
├── exceptions/ // 自定义异常
└── utils/ // JSON 和日志工具

故障排除​

连接问题​

如果遇到连接错误,请检查:

  1. iFlow 是否已安装

    iflow --version
  2. 端口是否被占用

    # Linux/Mac
    lsof -i :8090

    # Windows
    netstat -an | findstr :8090
  3. 手动测试连接

    iflow --experimental-acp --port 8090
  4. WebSocket URL 是否正确

    • 默认: ws://localhost:8090/acp?peer=iflow
    • 确保 URL 格式正确且IP地址和端口可访问

超时问题​

对于长时间运行的任务,可以增加超时时间:

val options = IFlowOptions(
timeout = 600_000L // 10 分钟超时
)