langchain4android Agent 架构讟计

版本4.0合并版
状态已实斜 / 迭代䞭
最后曎新2026-07-08
䞻芁绎技者[RD] 党栈工皋垈
历史合并诎明本文档由 AGENT_ARCHITECTURE.md 侎 REMOTE_INFERENCE_ARCHITECTURE.md 合并而成。远皋掚理盞关的 OpenAI 协议、langchain4j 标准化、DeepSeek 适配、四层暡型、性胜成本䞎验收标准已并入“掚理暡匏选型”䞎“远皋掚理”章节原 REMOTE_INFERENCE_ARCHITECTURE.md 已删陀。

蟹界声明Boundary Statement - 本文档定义 Agent 的运行时架构、Capability 暡型䞎掚理暡匏选型。 - 产品目标䞎验收口埄以 ../01-PRODUCT/FEATURES.md 䞺准。 - 顶层治理规则角色协䜜、党局红线、文档流皋以根目圕 AGENTS.md 䞺准。 - 重芁:agent-core 是 Java 基础库ChatModel、Tool、AiServicesAgent 猖排层AgentOrchestrator、CapabilityRegistry、PrivacyGuard、MemoryManager、SceneManager 等圚 :runtime-core 暡块的 runtime-core/src/main/java/com/mamba/picme/agent/core/ 目圕䞋。诊见 MODULE_ARCHITECTURE.md。

暡块定䜍: AI Agent 运行时架构䞎掚理暡匏选型基础库 langchain4android + Demo 工皋 PicMe
阅读对象: RD、AI Agent


目圕

  1. 栞心产品逻蟑
  2. 架构囟
  3. 栞心组件讟计
  4. 掚理暡匏选型
  5. 呜什扩展
  6. 数据暡型
  7. 执行规纊
  8. 垞见陷阱检查枅单
  9. 验收标准
  10. 远皋掚理任务拆分
  11. 架构挔进路线囟
  12. 附圕参考文档

1. 栞心产品逻蟑 (Core Product Logic)

1.1 红线纊束

纊束 定义 验证方匏
[PRIVACY] 敏感数据䌘先本地掚理确需云端倄理时必须获埗甚户授权䞔䞍埗留存 PrivacyGuard 拊截数据流 + 授权流皋审计
[PERF] 亀互反銈 < 100msLLM 掚理后台完成 端䟧 Qwen3.5-2B 驖 token 目标 < 600ms
[I18N] System Prompt 及甚户可见回倍犁止硬猖码䞭文 接入 string 资源
[OFFLINE] 本地暡型未䞋蜜时提䟛明确匕富 非静默倱莥
[TYPE_SAFE] AgentCommand / AgentAction 必须䜿甚 Sealed Class 犁止字笊䞲魔法倌

1.2 圓前架构暡匏ADR-005 后

本地铟路单蜮 Function Calling自定义 JSON 数组协议
远皋铟路标准 OpenAI Chat Completions API原生 tool_calls + 流匏 + 倚蜮对话

䞀条铟路完党独立无共享路由逻蟑。

甚户蟓入 → AgentOrchestrator.dispatch() → 暡匏选择
    ├── LOCAL → LocalInferencePipeline → LocalLlmEngine → JSON 数组解析 → Capability 执行
    └── REMOTE → RemoteInferencePipeline → RemoteOrchestrator → OpenAI tool_calls → Capability 执行

栞心组件状态:

组件 职莣 状态
AgentOrchestrator 统䞀入口管理本地/远皋䞀条独立掚理铟路 ✅ 已萜地
LocalInferencePipeline 本地掚理铟路L1 Cache + L2 Batch自定义 JSON 数组协议 ✅ 已萜地
RemoteInferencePipeline 远皋掚理铟路OpenAI Chat Completions APItool_calls·流匏·倚蜮 ✅ 已萜地
LocalLlmEngine 封装 MNN-LLM 客户端Qwen3.5-2B 本地掚理 ✅ 已萜地
RemoteOrchestrator 远皋掚理猖排:agent-core OpenAiChatModel + ChatMemory ✅ 已萜地
:agent-core (暡块) Java Android Library提䟛 LangChain4j 风栌 APIChatModel、@Tool、AiServices、ChatMemory、OpenAiChatModel、OkHttp SSE 流匏客户端 ✅ 已萜地
CapabilityRegistry Capability 泚册䞎呜什分发 ✅ 已萜地
PrivacyGuard 蟓入内容隐私分级䞎本地䌘先纊束 ✅ 已萜地
MemoryManager DataStore 持久化对话历史按 session 隔犻 ✅ 已萜地
KeywordSpotterEngine KWS 垞驻䜎功耗唀醒词检测Sherpa-ONNX~14MB ✅ 已萜地
SherpaOnnxAsrEngine ASR 按需加蜜语音蜬圕Sherpa-ONNX~282MB ✅ 已萜地
FeishuRemoteChannel 飞乊 WebSocket 盎连IM 远皋控制入口 🔄 迭代䞭
IntentCache L1 远皋意囟猓存高频指什盎接返回 ✅ 已萜地

已移陀组件ADR-005/0062026-06 - InferenceRouter — 拆分䞺 LocalInferencePipeline + RemoteInferencePipeline 䞀条独立铟路 - ToolCallingChatLanguageModel — 远皋盎接䜿甚 langchain4j 原生 OpenAiChatModel - ToolCallingOutputParser — 远皋䜿甚标准 OpenAI tool_calls 响应栌匏 - ToolPromptBuilder — 拆分䞺 LocalPromptBuilder + RemotePromptBuilder - AdaptiveStrategySelector — 本地䞍再需芁策略分级 - ToolOrchestrator — 猖排逻蟑合并入 RemoteOrchestrator - SherpaMnnAsrEngine + com.k2fsa.sherpa.mnn.* — 已迁移至 Sherpa-ONNXSherpaOnnxAsrEngine - MnnAsrClient — 占䜍死代码同步移陀 - 共枅理 ~2,600 行冗䜙代码


2. 架构囟

2.1 系统党景架构

┌──────────────────────────────────────────────────────────────────────────────┐
│                               UI Layer (Compose)                               │
│                                                                               │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐               │
│  │   ChatScreen    │  │  GalleryScreen  │  │   CameraScreen  │               │
│  │  🏠 默讀銖页     │  │  📞 智胜盞册     │  │  📷 蟅助入口     │               │
│  │  AI对话·暡型切换  │  │  媒䜓浏览·AI搜玢 │  │  矎颜·滀镜·语音  │               │
│  └────────┬────────┘  └────────┬────────┘  └────────┬────────┘               │
│           │                    │                    │                         │
│           └────────────────────┌────────────────────┘                         │
│                                â–Œ                                              │
│  ┌──────────────────────────────────────────────────────────────────────┐    │
│  │                   GlobalAgentPanel / AiAgentUseCase (Facade)           │    │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐   │    │
│  │  │ Chat UI  │ │Voice Btn │ │QuickActs │ │Model Sel │ │StatusBar │   │    │
│  │  │(倚线皋)   │ │(KWS唀醒) │ │(快捷入口) │ │(本地/远皋)│ │(掚理状态) │   │    │
│  │  └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘   │    │
│  └──────────────────────────────────────────────────────────────────────┘    │
└──────────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▌
┌──────────────────────────────────────────────────────────────────────────────┐
│                       Agent Orchestration Layer (:app · Kotlin)                  │
│                                                                               │
│  ┌────────────────────────────────────────────────────────────────────────┐  │
│  │                      AgentOrchestrator (猖排噚)                          │  │
│  │  ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐          │  │
│  │  │SceneManager│ │PrivacyGuard│ │MemoryManager│ │IntentCache │          │  │
│  │  │(场景感知)   │ │(隐私分级)   │ │(对话持久化)  │ │(L1远皋猓存) │          │  │
│  │  └────────────┘ └────────────┘ └────────────┘ └────────────┘          │  │
│  └────────────────────────────────────────────────────────────────────────┘  │
│                    │                              │                           │
│          LOCAL mode│                              │REMOTE mode                │
│                    â–Œ                              â–Œ                           │
│  ┌────────────────────────────┐  ┌──────────────────────────────────────┐   │
│  │  LocalInferencePipeline    │  │  RemoteInferencePipeline              │   │
│  │  ┌──────────────────────┐  │  │  ┌────────────────────────────────┐  │   │
│  │  │ LocalLlmEngine       │  │  │  │ RemoteOrchestrator             │  │   │
│  │  │ Qwen3.5-2B (MNN)     │  │  │  │ :agent-core OpenAiChatModel   │  │   │
│  │  │ L1 Cache → L2 Batch  │  │  │  │ OpenAI Chat Completions API   │  │   │
│  │  └──────────────────────┘  │  │  │ DeepSeek V4 适配               │  │   │
│  └────────────────────────────┘  │  │ L2 Batch / L3 Plan / L4 Chat   │  │   │
│                                  │  └────────────────────────────────┘  │   │
│  ┌──────────────────────────┐    │                                      │   │
│  │   Voice Pipeline (ONNX)  │    │  ┌────────────────────────────────┐  │   │
│  │  ┌────────────────────┐  │    │  │ FeishuRemoteChannel            │  │   │
│  │  │KeywordSpotterEngine│  │    │  │ 飞乊 WebSocket 盎连             │  │   │
│  │  │ KWS always-on      │  │    │  │ IM消息→AgentCommand            │  │   │
│  │  │ ~14MB · 50mW       │  │    │  │ 拍照回䌠·讟倇绑定·确讀机制      │  │   │
│  │  └─────────┬──────────┘  │    │  └────────────────────────────────┘  │   │
│  │            │ 唀醒        │    │                                      │   │
│  │  ┌─────────▌──────────┐  │    │  ┌────────────────────────────────┐  │   │
│  │  │SherpaOnnxAsrEngine │  │    │  │ Cloudflare AI Gateway           │  │   │
│  │  │ ASR on-demand      │  │    │  │ API Key 保技 · 速率限制          │  │   │
│  │  │ ~282MB · 按需加蜜   │  │    │  │ DeepSeek / Claude 倚暡型路由    │  │   │
│  │  └────────────────────┘  │    │  └────────────────────────────────┘  │   │
│  └──────────────────────────┘    └──────────────────────────────────────┘   │
│                                      │                                       │
│                                      â–Œ                                       │
│  ┌──────────────────────────────────────────────────────────────────────┐   │
│  │                    CapabilityRegistry (胜力泚册衚)                      │   │
│  │                                                                       │   │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐  │   │
│  │  │ Camera   │ │ Gallery  │ │ Settings │ │ Navigate │ │ Editor   │  │   │
│  │  │拍照/圕像  │ │查看/删陀  │ │䞻题/语蚀  │ │页面切换   │ │囟片猖蟑  │  │   │
│  │  │矎颜/滀镜  │ │分享/搜玢  │ │暡型管理  │ │返回/退出  │ │AI 䌘化   │  │   │
│  │  │变焊/曝光  │ │批量操䜜   │ │语音配眮  │ │          │ │          │  │   │
│  │  └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘  │   │
│  │  ┌──────────┐                                                        │   │
│  │  │ IMRemote │ 飞乊远皋控制 · 讟倇绑定 · 呜什确讀                        │   │
│  │  └──────────┘                                                        │   │
│  └──────────────────────────────────────────────────────────────────────┘   │
└──────────────────────────────────────────────────────────────────────────────┘
                                      │
                                      ▌
┌──────────────────────────────────────────────────────────────────────────────┐
│                          Domain / Data / Infra                                │
│                                                                              │
│  ┌────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│  │MediaRepo   │ │SettingsRepo  │ │ BeautyEngine │ │ MNN-LLM (本地暡型)    │ │
│  │(Room DB)   │ │(DataStore)   │ │ (OpenGL ES)  │ │ Qwen3.5-2B · 端䟧掚理 │ │
│  └────────────┘ └──────────────┘ └──────────────┘ └──────────────────────┘ │
│                                                                              │
│  ┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐ │
│  │ :agent-core (SDK)    │ │LlmModelDownloadManager│ │ FaceDetect Pipeline  │ │
│  │ Java Library          │ │前台服务·断点续䌠       │ │ MediaPipe·MNN        │ │
│  │ ChatModel·@Tool      │ └──────────────────────┘ └──────────────────────┘ │
│  │ AiServices·SSE       │ ┌──────────────────────┐                           │
│  └──────────────────────┘ │ Network Monitor      │                           │
│                           │ 飞乊重连·心跳保持     │                           │
│                           └──────────────────────┘                           │
└──────────────────────────────────────────────────────────────────────────────┘

2.2 掚理铟路数据流ADR-005 后

甚户蟓入 "扟出去幎倏倩的照片" / "磚皮50"
        │
        ▌
AgentOrchestrator.dispatch(input)
        │
        ├── PrivacyGuard.assess(input) → 敏感? → 区制 LOCAL
        │
        ├── LOCAL mode (默讀端䟧暡型)
        │   │
        │   ├── IntentCache.lookup(input) → HIT? → 盎接返回 (L1)
        │   │
        │   └── LocalLlmEngine.generate(messages)
        │       └── MNN-LLM (Qwen3.5-2B) → JSON 数组解析 → Capability 执行
        │
        └── REMOTE mode (甚户手劚切换或隐私允讞)
            │
            ├── IntentCache.lookup(input) → HIT? → 盎接返回 (L1)
            │
            └── RemoteOrchestrator.chat(messages, tools)
                └── :agent-core (Java Library)
                    ├── OpenAiChatModel (ChatLanguageModel)
                    ├── ToolSpecification (tool_calls 构建)
                    └── OkHttp SSE Streaming (流匏响应)
                        └── Cloudflare Gateway → DeepSeek / Claude API
                            → tool_calls 解析 → Capability 执行

2.3 语音亀互管线Sherpa-ONNX 双匕擎

[䌑眠态] Always-on KWS (~14MB · 50mW)
    │
    │ 甚户诎"小觅拍匠照"
    ▌
KWS 检测到唀醒词 → 暂停 KWS
    │
    ▌
加蜜 ASR (~282MB · ~500mW) → 蜬圕 "拍匠照"
    │
    ▌
AgentOrchestrator.dispatch("拍匠照") → Capability 执行
    │
    ▌
释攟 ASR → 恢倍 KWS always-on

3. 栞心组件讟计

3.1 SceneManager 场景管理噚

/**
 * 场景管理噚
 * 
 * 莟莣
 * 1. 跟螪圓前掻跃场景
 * 2. 根据场景获取对应的 Capability 集合
 * 3. 劚态构建场景盞关的 system prompt
 */
class SceneManager {
    
    enum class Scene {
        GALLERY,     // 盞册銖页默讀
        CHAT,        // AI 对话二级页
        CAMERA,      // 盞机页
        SETTINGS,    // 讟眮页
        EDITOR,      // 猖蟑页
        DEBUG        // 调试页
    }
    
    private val _currentScene = MutableStateFlow(Scene.GALLERY)
    val currentScene: StateFlow<Scene> = _currentScene.asStateFlow()
    
    fun transitionTo(scene: Scene) {
        _currentScene.value = scene
    }
    
    /**
     * 获取场景对应的 Capability 列衚
     */
    fun getCapabilitiesForScene(scene: Scene): List<String> = when (scene) {
        Scene.GALLERY -> listOf("gallery", "editor", "navigation")
        Scene.CHAT -> listOf("chat", "navigation", "gallery", "editor")
        Scene.CAMERA -> listOf("camera", "navigation")
        Scene.SETTINGS -> listOf("settings", "navigation")
        Scene.EDITOR -> listOf("edit", "navigation")
        Scene.DEBUG -> listOf("navigation")
    }
}

3.2 分层 Prompt 构建噚ADR-005 后

本地和远皋䜿甚独立的 Prompt 构建噚

// 本地 Prompt — 粟简、结构化
class LocalPromptBuilder {
    fun buildSystemPrompt(capabilities: List<Capability>, context: AgentContext): String = """
        䜠是 PicMe AI 助手运行圚端䟧讟倇。
        请根据甚户蟓入蟓出 JSON 数组栌匏的呜什。

        可甚呜什
        ${capabilities.joinToString("\n") { "- ${it.name}: ${it.description}" }}

        蟓出栌匏
        [{"method":"呜什名称","args":{"参数名":倌}}]
        劂果无法理解蟓出{"method":"text_reply","args":{"text":"回倍内容"}}
    """.trimIndent()
}

// 远皋 Prompt — 标准 OpenAI 协议栌匏
// 通过 langchain4j 构建 ChatRequestSDK 自劚序列化䞺 OpenAI Chat Completions 请求䜓
class RemotePromptBuilder {
    fun buildChatRequest(
        systemPrompt: String,
        userInput: String,
        capabilities: List<Capability>
    ): ChatRequest {
        val toolSpecs = capabilities.map { cap ->
            ToolSpecification.builder()
                .name(cap.name)
                .description(cap.description)
                .build()
        }
        return ChatRequest.builder()
            .messages(
                SystemMessage(systemPrompt),
                UserMessage(userInput)
            )
            .toolSpecifications(toolSpecs)
            .build()
        // langchain4j 自劚序列化䞺:
        // POST /v1/chat/completions
        // {"model":"...","messages":[...],"tools":[...]}
    }
}

3.3 Capability 接口扩展

/**
 * Capability 接口 V2
 * 
 * 新增
 * - 场景绑定声明该 Capability 掻跃的场景
 * - 䞊䞋文感知接收页面特定的䞊䞋文数据
 */
interface Capability {
    val name: String
    val description: String
    
    /**
     * 该 Capability 圚哪些场景䞋可甚
     */
    fun activeScenes(): List<SceneManager.Scene>
    
    fun supportedCommands(): List<String>
    
    /**
     * 执行呜什
     * @param command 解析后的呜什
     * @param context 圓前䞊䞋文
     * @param pageContext 页面特定䞊䞋文劂 Gallery 圓前选䞭的照片
     */
    suspend fun execute(
        command: AgentCommand,
        context: AgentContext,
        pageContext: PageContext? = null
    ): Result<AgentAction>
}

/**
 * 页面䞊䞋文页面特定状态
 */
sealed class PageContext {
    data class GalleryContext(
        val currentMedia: MediaAsset?,
        val selectedItems: List<MediaAsset>,
        val isSelectionMode: Boolean
    ) : PageContext()
    
    data class SettingsContext(
        val currentCategory: String?
    ) : PageContext()
    
    data class EditorContext(
        val editingMedia: MediaAsset,
        val hasUnsavedChanges: Boolean
    ) : PageContext()
    
    object None : PageContext()
}

3.4 GalleryCapability 瀺䟋

/**
 * 盞册控制 Capability
 */
class GalleryCapability(
    private val onViewMedia: ((MediaAsset) -> Unit)? = null,
    private val onDeleteMedia: ((List<MediaAsset>) -> Unit)? = null,
    private val onShareMedia: ((List<MediaAsset>) -> Unit)? = null,
    private val onSelectMedia: ((MediaAsset, Boolean) -> Unit)? = null,
    private val onSearch: ((String) -> Unit)? = null,
    private val onSwitchViewMode: ((ViewMode) -> Unit)? = null
) : Capability {
    
    override val name = "gallery"
    override val description = "查看、删陀、分享、搜玢照片和视频"
    
    override fun activeScenes() = listOf(SceneManager.Scene.GALLERY, SceneManager.Scene.CHAT)
    
    override fun supportedCommands() = listOf(
        "view_media",
        "delete_media",
        "share_media",
        "select_media",
        "search_media",
        "switch_view",
        "text_reply"
    )
    
    override suspend fun execute(
        command: AgentCommand,
        context: AgentContext,
        pageContext: PageContext?
    ): Result<AgentAction> {
        val galleryContext = pageContext as? PageContext.GalleryContext
        
        return when (command) {
            is AgentCommand.ViewMedia -> {
                val media = command.mediaId?.let { findMediaById(it) }
                    ?: galleryContext?.currentMedia
                media?.let { onViewMedia?.invoke(it) }
                Result.success(AgentAction.Success(command))
            }
            
            is AgentCommand.DeleteMedia -> {
                val items = command.mediaIds.mapNotNull { findMediaById(it) }
                    .ifEmpty { galleryContext?.selectedItems ?: emptyList() }
                onDeleteMedia?.invoke(items)
                Result.success(AgentAction.Success(command))
            }
            
            else -> Result.success(AgentAction.Error("䞍支持的呜什"))
        }
    }
}
/**
 * 富航 Capability
 * 
 * 圚所有场景郜可甚莟莣页面切换
 */
class NavigationCapability(
    private val onNavigate: (Screen) -> Unit,
    private val onBack: () -> Unit
) : Capability {
    
    override val name = "navigation"
    override val description = "页面富航切换页面、返回䞊䞀页"
    
    override fun activeScenes() = SceneManager.Scene.entries.toList()
    
    override fun supportedCommands() = listOf(
        "navigate_to",
        "go_back",
        "text_reply"
    )
    
    override suspend fun execute(
        command: AgentCommand,
        context: AgentContext,
        pageContext: PageContext?
    ): Result<AgentAction> {
        return when (command) {
            is AgentCommand.NavigateTo -> {
                val screen = when (command.destination.lowercase()) {
                    "camera", "盞机" -> Screen.Camera
                    "gallery", "盞册" -> Screen.Gallery
                    "settings", "讟眮" -> Screen.Settings
                    "editor", "猖蟑" -> Screen.Editor
                    "chat", "聊倩" -> Screen.Chat
                    else -> return Result.success(AgentAction.Error("未知页面${command.destination}"))
                }
                onNavigate(screen)
                Result.success(AgentAction.Success(command))
            }
            
            is AgentCommand.GoBack -> {
                onBack()
                Result.success(AgentAction.Success(command))
            }
            
            else -> Result.success(AgentAction.Error("䞍支持的富航呜什"))
        }
    }
}

4. 掚理暡匏选型

4.1 本地 vs 远皋掚理

绎床 本地掚理 远皋掚理
协议 自定义 JSON 数组 标准 OpenAI Chat Completions API
Library 无第䞉方䟝赖 :agent-core (OpenAiChatModel)
Prompt 粟简、结构化 自然语蚀 + Tool Schema
蟓出解析 简单 JSON 数组解析 标准 JSON 反序列化tool_calls
纊束方匏 JSON 数组栌匏 Prompt 纊束 OpenAI 原生协议纊束
聊倩/闲聊 通过 text_reply 呜什兜底 原生支持流匏 + 倚蜮
Strategy L1 Cache / L2 Batch L2 Batch / L3 Plan / L4 Chat
延迟 < 600ms 500ms-2s
隐私 敏感数据本地倄理倍杂掚理可经甚户授权后䞊云 非敏感数据允讞䞊云

4.2 端䟧掚理暡匏选型Qwen3.5-2B

䞍掚荐完敎 ReAct原因 - 2B 暡型 COT铟匏思考胜力匱Thought 莚量䞍皳定 - AI 对话页芁求 < 500ms 銖字延迟倚蜮掚理无法满足 [PERF] 红线 - 端䟧电池/发热敏感

端䟧胜力蟹界2026-06-12 验证 | 胜力 | 端䟧支持 | 诎明 | |——|———-|——| | 单条 Function Calling | 已验证 | 明确意囟→JSON 呜什准确率 > 90% | | 简单 Batch FC2-3 条 | 郚分支持 | JSON 数组栌匏需区 prompt 纊束偶有栌匏错误 | | 倍杂组合指什含条件/延迟 | 䞍支持 | 超出 2B 暡型理解范囎明确走远皋 | | 䞊䞋文掚理隐匏匕甚 | 䞍支持 | “再亮䞀点”类指什需规则兜底 | | 匀攟匏闲聊 | 䞍支持 | 生成莚量差应路由到远皋 L4 |

4.3 远皋掚理暡匏选型

远皋暡匏䞋减少 LLM 调甚次数比端䟧曎重芁RTT 成本䞻富。

掚荐分层自适应暡匏

层级 暡匏 适甚场景 协议 蟓出栌匏 执行䜍眮
Layer 1 本地规则猓存 高频指什呜䞭猓存 䞍走 LLM 预定义呜什 端䟧
Layer 2 Batch Function Calling 简单连续劚䜜指什2-3 步 OpenAI Chat Completions + tool_calls ToolExecutionRequest[] → AgentCommand[] 远皋
Layer 3 Plan-and-Execute 条件/䟝赖/倚步骀 OpenAI Chat Completions + tool_calls ExecutionPlan (含 command 字段) 远皋规划 + 本地执行
Layer 4 流匏 Chat 匀攟匏对话、闲聊 OpenAI Chat Completions (stream=true) 文本流 + 可选 tool_calls 远皋

远皋䌘化策略 - 连接池 + Keep-Alive 倍甚 TCP - 100ms 防抖窗口合并请求 - 2s 超时降级到本地规则或文本提瀺 - 垞见意囟响应猓存LruCache - 隐私分级敏感数据人脞/对话内容区制本地非敏感指什倩气/通甚闲聊允讞远皋

4.4 远皋掚理协议实现

远皋掚理䜿甚标准 OpenAI Chat Completions API 栌匏

请求栌匏

POST /v1/chat/completions
{
  "model": "deepseek-chat",
  "messages": [
    {"role": "system", "content": "..."},
    {"role": "user", "content": "垮我䌘化这匠照片"}
  ],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "ai_optimize",
        "description": "AI 䞀键䌘化囟片",
        "parameters": {
          "type": "object",
          "properties": {...},
          "required": [...],
          "additionalProperties": false
        }
      }
    }
  ],
  "tool_choice": "required",
  "stream": false
}

响应栌匏tool_calls

{
  "choices": [{
    "message": {
      "role": "assistant",
      "content": null,
      "tool_calls": [{
        "id": "call_xxx",
        "type": "function",
        "function": {
          "name": "ai_optimize",
          "arguments": "{\"image_id\": \"img_123\"}"
        }
      }]
    }
  }]
}

关键规则 - tool_calls 是 message 对象的独立字段䞎 content 互斥 - 圓存圚 tool_calls 时content 必须䞺 null - 参数通过 function.arguments 䌠递䞺标准 JSON 字笊䞲

langchain4j 标准化实现

class RemoteOrchestrator(config: RemoteModelConfig) {
    private val openAiChatModel = OpenAiChatModel.builder()  // :agent-core
        .baseUrl(config.baseUrl)
        .apiKey(config.apiKey)
        .modelName(config.modelId)
        .temperature(config.temperature)
        .maxTokens(config.maxTokens)
        .build()
    
    fun chat(request: ChatRequest): ChatResponse {
        // 盎接䜿甚 :agent-core OpenAiChatModel支持 tool_calls、流匏、倚蜮
    }
}

远皋掚理盎接䜿甚 :agent-core OpenAiChatModel支持所有兌容 OpenAI API 的服务DeepSeek、通义千问等通过 AiServices 代理构建噚 + ChatMemory 实现倚蜮对话。

呜什解析ToolCallCommandParser

object ToolCallCommandParser {
    fun parse(request: ToolExecutionRequest, context: AgentContext): AgentCommand {
        val name = request.name()      // 工具名 → 呜什类型映射
        val args = request.arguments() // 标准 JSON 参数
        
        return when (name) {
            "switch_filter" -> AgentCommand.SwitchFilter(filterType = parseFilterType(args))
            "adjust_beauty" -> AgentCommand.AdjustBeauty(settings = parseBeautySettings(args))
            // ... 其他呜什
            else -> AgentCommand.TextReply("未知呜什: $name")
        }
    }
}

远皋解析噚䞎本地解析噚完党隔犻 - 远皋ToolCallCommandParser — 解析 name + arguments → AgentCommand - 本地LocalCommandParser — 解析 method + params → AgentCommand

4.5 DeepSeek 适配

适配项 实现 䜍眮
穁甹 thinking API 请求自劚附加 thinking: {"type": "disabled"} OpenAiChatModel 内郚倄理
strict 暡匏兌容 ToolSpec 自劚添加 additionalProperties: false OpenAiChatModel 内郚倄理
tool_choice 修倍 REQUIRED 正确映射䞺 "required"非 "auto" OpenAiChatModel 内郚倄理
content 回退解析 圓 API 未返回 tool_calls 䜆 content 含 tool_calls JSON 时正则提取解析 RemoteOrchestrator.parseFallbackToolCalls()
Prompt 规范 犁止圚 Prompt 䞭提䟛具䜓 tool_calls JSON 瀺䟋避免暡型蟓出到 content RemotePromptBuilder

4.6 性胜䞎成本考量

Token 消耗䌰算

暡匏 System Prompt User Input Output 单次总 Token
L1 Cache 0 0 0 0
L2 Batch ~800 ~50 ~200 ~1050
L3 Plan ~1000 ~100 ~500 ~1600
L4 Chat ~800 ~50 ~300 ~1150

延迟䌰算

暡匏 眑络 RTT LLM 生成 解析 总延迟
L1 0 0 0 < 10ms
L2 200-500ms 200-500ms 50ms 450-1050ms
L3 200-500ms 500-1000ms 100ms 800-1600ms
L4 (流匏) 200-500ms 驖 token 50-200ms 50ms 250-750ms

䌘化策略 1. L1 猓存预热启劚时预眮 50+ 高频意囟 2. L2 默讀化80% 场景走 L2保持简单高效 3. L3 匂步执行计划生成后匂步执行䞍阻塞 UI 4. L4 流匏銖 token 䜎延迟提升对话䜓验 5. 连接池 + Keep-Alive倍甚 TCP 连接


5. 呜什扩展

/**
 * Agent 呜什 V2
 * 
 * 新增 Gallery、Settings、Navigation、Edit 盞关呜什
 */
sealed class AgentCommand {
    // ===== 盞机呜什已有=====
    data class AdjustBeauty(val settings: BeautySettings) : AgentCommand()
    data class SwitchFilter(val filterType: FilterType) : AgentCommand()
    // ... 其他盞机呜什
    
    // ===== Gallery 呜什新增=====
    data class ViewMedia(val mediaId: String? = null) : AgentCommand()
    data class DeleteMedia(val mediaIds: List<String> = emptyList()) : AgentCommand()
    data class ShareMedia(val mediaIds: List<String> = emptyList()) : AgentCommand()
    data class SelectMedia(val mediaId: String, val selected: Boolean) : AgentCommand()
    data class SearchMedia(val query: String) : AgentCommand()
    data class SwitchViewMode(val mode: ViewMode) : AgentCommand()
    
    // ===== 讟眮呜什新增=====
    data class ChangeTheme(val theme: ThemeMode) : AgentCommand()
    data class ChangeLanguage(val language: AppLanguage) : AgentCommand()
    data class DownloadModel(val modelId: String) : AgentCommand()
    data class SwitchFaceEngine(val engine: FaceDetectionEngineMode) : AgentCommand()
    data class ToggleSetting(val settingKey: String, val enabled: Boolean) : AgentCommand()
    
    // ===== 富航呜什新增=====
    data class NavigateTo(val destination: String) : AgentCommand()
    object GoBack : AgentCommand()
    
    // ===== 猖蟑呜什新增=====
    data class ApplyEdit(val editType: String, val params: Map<String, Any>) : AgentCommand()
    object SaveEdit : AgentCommand()
    object UndoEdit : AgentCommand()
    
    // ===== 通甚呜什 =====
    data class TextReply(val message: String) : AgentCommand()
    data class Unknown(val raw: String) : AgentCommand()
    data class Error(val reason: String) : AgentCommand()
}

5.1 功胜芆盖矩阵

圓前已接入功胜已验证

功胜域 具䜓功胜 呜什类型 Capability 状态
盞机控制 拍照 CapturePhoto CameraCapability 已验证
匀始/停止圕像 ToggleRecording CameraCapability 已验证
翻蜬摄像倎 FlipCamera CameraCapability 已验证
变焊调节 AdjustZoom CameraCapability 已验证
曝光调节 AdjustExposure CameraCapability 已验证
切换拍摄暡匏 SwitchMode CameraCapability 已验证
矎颜 磚皮/矎癜调节 AdjustBeauty CameraCapability 已验证
瘊脞/倧県调节 AdjustBeauty CameraCapability 已验证
唇色/腮红调节 AdjustBeauty CameraCapability 已验证
滀镜/风栌 切换滀镜 SwitchFilter CameraCapability 已验证
切换风栌特效 SwitchStyle CameraCapability 已验证
切换场景暡匏 SwitchScene CameraCapability 已验证
切换画幅比䟋 SwitchRatio CameraCapability 已验证
对话 文本回倍/聊倩 TextReply CameraCapability 已验证
远皋控制 飞乊消息倄理 倚种 RemoteControlCapability 匀发䞭

V2 新增功胜匀发䞭

功胜域 具䜓功胜 呜什类型 Capability 䌘先级
Gallery 查看照片 ViewMedia GalleryCapability P0
删陀照片 DeleteMedia GalleryCapability P0
分享照片 ShareMedia GalleryCapability P1
照片搜玢 SearchMedia GalleryCapability P2
讟眮 切换䞻题 ChangeTheme SettingsCapability P1
切换语蚀 ChangeLanguage SettingsCapability P1
富航 切换页面 NavigateTo NavigationCapability P0
返回䞊䞀页 GoBack NavigationCapability P0
猖蟑 进入猖蟑 预留 EditorCapability P2

6. 数据暡型

6.1 AgentCommand 密封类

见 第 5 章。

6.2 掚理结果包装

sealed class InferenceResult {
    data class Local(val command: AgentCommand) : InferenceResult()
    data class Remote(val commands: List<AgentCommand>) : InferenceResult()
    data class Text(val message: String) : InferenceResult()
    data class Plan(val plan: ExecutionPlan) : InferenceResult()
    data class Error(val reason: String) : InferenceResult()
}

6.3 ExecutionPlanL3 Plan 暡匏

{
  "plan_id": "uuid",
  "steps": [
    {
      "step": 1,
      "condition": "currentCamera == BACK",
      "command": {
        "name": "flip_camera",
        "arguments": "{}"
      },
      "description": "切换到前眮摄像倎"
    }
  ]
}

6.4 AiAgentUseCaseFacade

class AiAgentUseCase(
    context: Context,
    agentMode: AiAgentMode = AiAgentMode.REMOTE, // 默讀 REMOTE远皋䌘先
    privacyLevel: AiAgentPrivacyLevel = AiAgentPrivacyLevel.STRICT,
    localModelId: String = "qwen3_5_2b",
    remoteConfig: RemoteModelConfig? = null,
    forceRemote: Boolean = false
) {
    private val orchestrator = AgentOrchestrator(
        localPipeline = LocalInferencePipeline(...),
        remotePipeline = RemoteInferencePipeline(...)
    )
    
    suspend fun processInput(userInput: String, context: AgentContext): InferenceResult {
        return when (configurator.getAgentMode()) {
            AiAgentMode.LOCAL -> localPipeline.process(input)
            AiAgentMode.REMOTE -> remotePipeline.process(input)
            AiAgentMode.OFF -> Result.failure(AgentDisabledException())
        }
    }
}

6.5 IM 远皋控制集成

飞乊远皋控制倍甚同䞀 RemoteOrchestrator 和 RemoteInferencePipeline

飞乊消息 → FeishuChannelHandler → RemoteCommandDispatcher
    → LLM 解析意囟倍甚 RemoteOrchestrator独立 System Prompt
    → CapabilityRegistry.dispatch()
    → 结果 → FeishuChannelHandler.sendMessage/sendImage

7. Agent 执行规纊 (Execution Rules)


8. 垞见陷阱检查枅单 (Checklist)


9. 验收标准

ID 验收项 䌘先级
AC-1 远皋暡匏䞋“磚皮 60 然后拍照” 胜解析䞺䞀䞪 tool_calls 并䟝次执行 P0
AC-2 远皋暡匏䞋“劂果是后眮就切前眮再拍” 胜正确执行条件刀断 P0
AC-3 本地暡匏䞋所有现有功胜保持 100% 兌容 P0
AC-4 L1 猓存呜䞭率 > 60%高频指什 P1
AC-5 远皋掚理平均延迟 < 1.5s P1
AC-6 支持对话匏记忆倚蜮䞊䞋文 P2
AC-7 DeepSeek 暡型 tool_calls 成功率 > 95% P0
AC-8 流匏聊倩銖 token 延迟 < 500ms P1

10. 远皋掚理任务拆分 [agent-task]

Phase 1: 基础讟斜 (RD) — 已完成

Phase 2: L2 Batch 暡匏 (RD) — 已完成

Phase 3: L3 Plan 暡匏 (RD) — 已完成

Phase 4: L4 流匏 Chat (RD) — 已完成

Phase 5: DeepSeek 适配 (RD) — 已完成

Phase 6: 集成䞎测试 (QA)


11. 架构挔进路线囟

┌─────────────────────────────────────────────────────────────────┐
│                        端䟧掚理挔进路线                           │
├──────────────────────────────────────────────────────────────────
│  P0已完成:                                                    │
│  1. JSON 解析改甚 kotlinx.serialization                         │
│  2. System Prompt 提取䞺 LocalPromptBuilder / RemotePromptBuilder │
│  3. MemoryManager 匕入内存猓存 + 批量刷盘                         │
│  4. 本地/远皋协议圻底分犻ADR-005                              │
│  5. 远皋掚理匕入 langchain4j 标准化                               │
│  6. DeepSeek 适配thinking 犁甚、strict 兌容                   │
│  7. Sherpa-MNN 语音栈枅理迁至 Sherpa-ONNX                      │
│  8. 唀醒词匕擎 Phase 1 完成21 词 + 劚态蜮询 + VAD 皳定性       │
│                                                                 │
│  P1进行䞭:                                                   │
│  9. KWS always-on 迁移Sherpa-ONNX KWSPhase 2               │
│  10. 支持 Batch Function Callingtool_calls 数组               │
│  11. ChatFormat 抜象支持倚暡型切换                              │
│  12. Capability 呜什映射改䞺泚解驱劚或属性声明                      │
│  13. IM 远皋控制飞乊 WebSocket党铟路打通                       │
│                                                                 │
│  P2䞭期:                                                    │
│  14. Plan-and-Execute 规则暡板匕擎端䟧䞍甚 LLM 做规划           │
│  15. Token 预算管理䞎䞊䞋文压猩                                    │
│  16. 隐私分级路由完善敏感区制本地非敏感允讞远皋                    │
│                                                                 │
│  P3远期:                                                    │
│  17. 记忆摘芁长期对话䞍䞢倱䞊䞋文                               │
│  18. 倚䌚话管理                                                   │
└─────────────────────────────────────────────────────────────────┘

12. 附圕参考文档