基于 SDK 构建 Agent

概述

iFlow CLI SDK 是一个用于与 iFlow CLI 进行编程交互的 SDK。它通过代理通信协议(ACP)允许开发者构建具有对话、工具执行和任务规划能力的 AI 驱动应用程序。

:sparkles: 核心特性:SDK 自动管理 iFlow 进程 - 无需手动配置!

目前提供 Python SDK,Java 版本正在路上,敬请期待!

系统要求

  • Python: 3.8 或更高版本

  • iFlow CLI: 0.2.24 或更高版本

  • 操作系统: Windows、macOS、Linux

安装

pip install iflow-cli-sdk

快速开始

基础示例

SDK 会自动检测并启动 iFlow 进程,无需手动配置:

import asyncio
from iflow_sdk import IFlowClient

async def main():
    # SDK 自动处理:
    # 1. 检测 iFlow 是否已安装
    # 2. 启动 iFlow 进程(如果未运行)
    # 3. 查找可用端口并建立连接
    # 4. 退出时自动清理资源
    async with IFlowClient() as client:
        await client.send_message("你好,iFlow!")
        
        async for message in client.receive_messages():
            print(message)

asyncio.run(main())

简单查询

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

from iflow_sdk import query
import asyncio

async def main():
    response = await query("法国的首都是哪里?")
    print(response)  # 输出:法国的首都是巴黎。

asyncio.run(main())

核心概念

IFlowClient

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

from iflow_sdk import IFlowClient, IFlowOptions

# 使用默认配置(自动管理进程)
async with IFlowClient() as client:
    await client.send_message("你的问题")

# 使用自定义配置
options = IFlowOptions(
    url="ws://localhost:8090/acp",  # WebSocket URL
    auto_start_process=True,         # 自动启动 iFlow
    timeout=30.0                     # 超时时间(秒)
)
async with IFlowClient(options) as client:
    await client.send_message("你的问题")

消息类型

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

AssistantMessage - AI 助手响应

from iflow_sdk import AssistantMessage

async for message in client.receive_messages():
    if isinstance(message, AssistantMessage):
        print(message.chunk.text, end="", flush=True)
        if message.agent_id:
            print(f"\\n来自代理: {message.agent_id}")

ToolCallMessage - 工具调用

from iflow_sdk import ToolCallMessage, ToolCallStatus

async for message in client.receive_messages():
    if isinstance(message, ToolCallMessage):
        print(f"工具: {message.tool_name}")
        print(f"状态: {message.status.value}")
        if message.status == ToolCallStatus.COMPLETED:
            print(f"结果: {message.result}")

PlanMessage - 任务计划

from iflow_sdk import PlanMessage

async for message in client.receive_messages():
    if isinstance(message, PlanMessage):
        print("执行计划:")
        for entry in message.entries:
            status_icon = "✅" if entry.status == "completed" else "⏳"
            print(f"{status_icon} [{entry.priority}] {entry.content}")

TaskFinishMessage - 任务完成

from iflow_sdk import TaskFinishMessage, StopReason

async for message in client.receive_messages():
    if isinstance(message, TaskFinishMessage):
        if message.stop_reason == StopReason.STOP_SEQUENCE:
            print("任务正常完成")
        elif message.stop_reason == StopReason.MAX_TOKENS:
            print("达到最大令牌限制")
        break

常见用例

交互式聊天机器人

#!/usr/bin/env python3
import asyncio
from iflow_sdk import IFlowClient, AssistantMessage, TaskFinishMessage

async def chatbot():
    print("iFlow 聊天机器人 (输入 'quit' 退出)")
    print("-" * 50)
    
    async with IFlowClient() as client:
        while True:
            user_input = input("\\n你: ")
            
            if user_input.lower() in ['quit', 'exit', 'q']:
                print("再见!")
                break
            
            await client.send_message(user_input)
            
            print("iFlow: ", end="", flush=True)
            async for message in client.receive_messages():
                if isinstance(message, AssistantMessage):
                    print(message.chunk.text, end="", flush=True)
                elif isinstance(message, TaskFinishMessage):
                    print()  # 换行
                    break

if __name__ == "__main__":
    asyncio.run(chatbot())

流式响应处理

from iflow_sdk import query_stream
import asyncio

async def stream_example():
    prompt = "解释量子计算的基本原理"
    
    async for chunk in query_stream(prompt):
        print(chunk, end="", flush=True)
    print()  # 最后换行

asyncio.run(stream_example())

代码分析工具

#!/usr/bin/env python3
import asyncio
import sys
from pathlib import Path
from iflow_sdk import IFlowClient, AssistantMessage, ToolCallMessage, TaskFinishMessage

async def analyze_code(file_path):
    code_content = Path(file_path).read_text()
    
    prompt = f\"\"\"请分析以下代码并提供改进建议:
    
{code_content}
\"\"\"
    
    async with IFlowClient() as client:
        await client.send_message(prompt)
        
        print("分析中...\\n")
        async for message in client.receive_messages():
            if isinstance(message, AssistantMessage):
                print(message.chunk.text, end="", flush=True)
            elif isinstance(message, ToolCallMessage):
                if message.tool_name:
                    print(f"\\n[使用工具: {message.tool_name}]")
            elif isinstance(message, TaskFinishMessage):
                break

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("用法: python analyze_code.py <文件路径>")
        sys.exit(1)
    
    asyncio.run(analyze_code(sys.argv[1]))

高级配置

手动进程管理

如果需要手动管理 iFlow 进程:

from iflow_sdk import IFlowClient, IFlowOptions

# 禁用自动进程管理
options = IFlowOptions(
    auto_start_process=False,
    url="ws://localhost:8090/acp"  # 连接到已存在的 iFlow
)

async with IFlowClient(options) as client:
    await client.send_message("你的问题")

注意 手动模式需要您单独启动 iFlow:

iflow --experimental-acp --port 8090

错误处理

SDK 提供了详细的错误处理机制:

from iflow_sdk import IFlowClient, ConnectionError, TimeoutError

try:
    async with IFlowClient() as client:
        await client.send_message("测试")
        async for message in client.receive_messages():
            # 处理消息
            pass
except ConnectionError as e:
    print(f"连接错误: {e}")
except TimeoutError as e:
    print(f"超时错误: {e}")
except Exception as e:
    print(f"未知错误: {e}")

同步调用

对于需要同步调用的场景:

from iflow_sdk import query_sync

# 同步调用,带超时控制
response = query_sync("你的问题", timeout=30.0)
print(response)

API 参考

核心类

类名 描述
IFlowClient 主客户端类,管理与 iFlow 的连接
IFlowOptions 配置选项类
RawDataClient 访问原始协议数据的客户端

消息类型

消息类型 描述
AssistantMessage AI 助手的文本响应
ToolCallMessage 工具执行请求和状态
PlanMessage 结构化任务计划
TaskFinishMessage 任务完成信号

工具函数

函数 描述
query(prompt) 发送查询并返回完整响应
query_stream(prompt) 返回流式响应的异步生成器
query_sync(prompt) 同步查询(带超时)

故障排除

连接问题

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

  1. iFlow 是否已安装

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

    # Linux/Mac
    lsof -i :8090
    
    # Windows
    netstat -an | findstr :8090
    
    
  3. 手动测试连接

    iflow --experimental-acp --port 8090
    
    

超时问题

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

options = IFlowOptions(timeout=600.0)  # 10分钟超时
client = IFlowClient(options)

日志调试

启用详细日志以便调试:

import logging

# 设置日志级别
logging.basicConfig(level=logging.DEBUG)

options = IFlowOptions(log_level="DEBUG")
client = IFlowClient(options)