Android Agent-Runtime Implementation

基于 OHOS ascf-agent 架构 + Kai Android 参考实现的 Android agent-runtime 模块。

1. 概述

flexui-engine/modules/android/agent-runtime/ — 与 OHOS ascf-agent/agent-runtime/ 功能对齐的 Android 库模块。

  • 包名: org.flexui.agent
  • Demo 包名: org.flexui.agentdemo
  • 插件: com.android.library + org.jetbrains.kotlin.android
  • 编译: compileSdkVersion 34, minSdkVersion 21, Java 1.8

2. 架构

org.flexui.agent
├── AgentRuntime                 — 公共门面
├── AgentRuntimeConfig           — 配置 + 公共类型
├── core/
│   ├── AgentLoop                — think → tool-call → execute → repeat
│   ├── AgentTypes               — 枚举、事件、类型定义
│   └── SystemPromptBuilder      — 系统提示词构建(skills/memories/context)
├── llm/
│   ├── LlmClient                — Ktor SSE 流式客户端
│   ├── LlmTypes                 — StreamCallbacks、ToolCall、ChatRequestBody
│   └── ToolCallAccumulator      — SSE delta 增量工具调用累积器
├── tools/
│   ├── Tool                     — Tool 接口(schema + timeout + execute)
│   ├── ToolRegistry             — 注册/注销/查询
│   ├── ToolExecutor             — 三源路由(builtin/mcp/skill)
│   ├── BuiltinTools             — activate_skill、fetch_url、web_search
│   ├── FetchUrlTool             — HTTP 安全抓取(从 Kai 移植)
│   ├── WebSearchTool            — DuckDuckGo 搜索(从 Kai 移植)
│   ├── MemoryTools              — memory_store/forget/learn/reinforce
│   ├── EmailTools               — 6 个邮件工具
│   ├── SmsTools                 — 5 个短信工具
│   ├── SchedulingTools          — schedule_task/list_tasks/cancel_task
│   └── HeartbeatTools           — promote_learning
├── mcp/
│   ├── McpClient                — JSON-RPC 2.0 协议客户端
│   ├── McpTool                  — MCP → Tool 适配器
│   ├── McpServerManager         — MCP 服务器生命周期管理
│   ├── McpConfigLoader          — mcp.json 解析 + 工具/卡片注册
│   ├── McpValidator             — API 列表文本构建
│   └── McpTypes                 — 协议类型定义
├── cards/
│   ├── CardRegistry             — componentPath → FlexView 映射
│   └── CardRenderer             — 工具结果 → CardRenderData 解析
├── modelcontext/
│   ├── AscfAIModule             — Hippy NativeModule 桥接
│   ├── SkillDiscovery           — 技能扫描(assets + filesystem)
│   ├── SkillActivator           — activate_skill 处理器
│   ├── SkillApiBridge           — JS↔Native 技能 API 桥接
│   ├── InstanceManager          — 卡片实例生命周期
│   ├── SkillPackageInstaller    — 下载→解压→安装流程
│   └── VersionManager           — 语义版本解析/比较
├── data/
│   ├── DataRepository           — 中央编排器
│   ├── AppSettings              — SharedPreferences 封装
│   ├── Conversation + Storage   — 会话模型 + JSON 持久化
│   ├── MemoryStore              — 分类记忆 CRUD
│   ├── TaskScheduler/TaskStore  — 定时任务调度
│   ├── HeartbeatManager         — 心跳自检配置
│   ├── EmailModels/Store        — 邮件模型 + 存储
│   ├── SmsModels/Store          — 短信模型 + 存储
│   ├── ModelCatalog             — 静态模型目录
│   └── PendingQueue             — 有界 FIFO 队列
├── email/
│   ├── EmailConnection          — TLS/TCP Socket 接口
│   ├── ImapClient               — IMAP 协议实现
│   ├── SmtpClient               — SMTP 协议实现
│   ├── EmailPoller              — 邮件轮询器
│   └── ServerAutoDetect         — 已知服务商配置
├── sms/
│   ├── SmsReader                — ContentProvider 短信读取
│   ├── SmsSender                — SmsManager 短信发送
│   └── SmsPoller                — 短信轮询器
├── network/
│   ├── RemoteConfigLoader       — 远程配置获取
│   └── Requests                 — Ktor HttpClient 工厂
├── platform/
│   ├── DaemonService            — Android 前台服务
│   ├── DaemonController         — 守护进程启停
│   └── HeartbeatNotifier        — 心跳通知
├── ui/
│   ├── AgentChatView            — 顶层 Compose 组件
│   ├── ChatViewModel            — StateFlow 状态管理
│   ├── ChatScreen/ChatMessageList/ChatInputBar/MessageBubble
│   ├── Markdown (11 文件)        — GFM markdown 解析/渲染
│   ├── Math (4 文件)             — LaTeX 数学渲染
│   ├── FlexCardView             — FlexUIView AndroidView 互操作
│   ├── ChainOfThought/ToolCallCard/TypingIndicator/Banners
│   └── markdown/                — 从 Kai 移植的 markdown 子系统
└── utils/
    └── Logger                   — 统一 TAG="FlexUIAgent" 日志

3. 核心数据流

3.1 对话流

User Input → ChatViewModel.sendMessage()
  → AgentRuntime.run(userMessage, history, callbacks)
    → buildSystemPrompt() → SystemPromptBuilder
    → AgentLoop.run(messages, systemPrompt, tools, onEvent)
      → [loop] LlmClient.streamChat() — Ktor SSE
        → text/reasoning delta → Compose recompose
        → tool_calls → ToolExecutor.executeAll()
          ├── builtin → local
          ├── mcp__ → McpTool → SkillApiBridge
          └── __ → skill stub
        → _componentPath → CardRenderer.resolve()
          → CardRenderData → FlexCardView (AndroidView + FlexUIView)
    → onComplete → ChatMessage → Compose recompose

3.2 心跳自主流

DaemonService (foreground) → TaskScheduler.poll(60s)
  → HeartbeatManager.shouldRun()
  → EmailPoller.poll() + SmsPoller.poll()
  → HeartbeatPromptBuilder.build()
  → DataRepository.ask(heartbeatPrompt) → AgentLoop
  → HeartbeatNotifier.show(result)

3.3 启动自测流

MainActivity.onCreate()
  → AgentRuntime.initialize() → tools registered
  → AgentChatView(startupMessage="帮我推荐饮品...")
    → LaunchedEffect → ChatViewModel.sendMessage(startupMessage)
      → AgentRuntime.run() → AgentLoop → LLM call

3.4 卡片回传流

Card click → sendFollowUpMessage (JS bridge)
  → AscfAIModule.handleCall("sendFollowUpMessage", ...)
    → AgentRuntime.handleFollowUpMessage(userText, apiResults)
      → onFollowUp callback → ChatViewModel.sendMessage(text, results)
        → AgentRuntime.run() with preExecutedToolResults

4. 技术决策

决策 选择 原因
UI 框架 Jetpack Compose 复用 Kai 的 markdown 渲染 + 聊天 UI
网络库 Ktor Client (Android) 复用 Kai Requests.kt
异步 Kotlin Coroutines + Flow 流式 SSE + UI 状态
JSON 解析 org.json (Android SDK) 无需 kotlinx.serialization 编译器插件
持久化 SharedPreferences + File 简单、无需 Room
日志 android.util.Log, TAG=FlexUIAgent 统一过滤
模块结构 单 :agent-runtime library 匹配 OHOS 单体 agent-runtime
compileSdk 34 (从 33 升级) Compose 传递依赖需要

5. 实现阶段

阶段 文件数 关键交付
Phase 1: Foundation 12 source + 3 test AgentLoop、LlmClient、ToolRegistry、ToolExecutor
Phase 2: Skills & Cards 16 source + 2 test MCP 子系统、SkillDiscovery、AscfAIModule、InstanceManager
Phase 3: Data Layer 8 source + 2 test AppSettings、Conversation、MemoryStore、DataRepository
Phase 4: Enrichment 4 source FetchUrl、WebSearch、Memory tools、SystemPromptBuilder
Phase 5: Scheduler 12 source + 1 test TaskScheduler、Heartbeat、Cron、DaemonService
Phase 6: Email & SMS 15 source IMAP/SMTP 客户端、SMS 读写、Poller
Phase 7: Chat UI 26 source Markdown(11)、Math(4)、Chat composables
Phase 8: Integration 1 source SkillPackageInstaller、demo 接入

总计: 94 source + 8 test 文件,~18,000 行代码

6. 快速开发命令

# 一键构建+安装+启动
./build.sh dev --platform android

# 构建
./build.sh build-apk --platform android

# 查看日志
./build.sh logs --platform android
# 或
adb logcat -s FlexUIAgent