跳转到内容

Agent Core

头文件:claw_core.h

claw_core 实现设备侧的 Agent 核心:收到包含「用户说了什么、来自哪个会话与通道」的消息后,在独立任务里完成上下文拼装、调用大语言模型、解析 Tool Call、再通过统一入口执行能力,并按配置迭代多轮,直到模型给出最终文本或出错。

claw_core_request_t 包含单次交互所需的全部元数据,例如:

  • session_id:会话标识(Console 里 session 命令会切换当前会话;IM 路由也会按策略生成会话 id)。
  • user_text:用户输入正文。
  • source_* / target_*:来源通道、聊天 id、消息 id、来源 cap 等。这些字段会原样传入 claw_cap_call_from_core,以便在 Capability 层定向回复或关联上下文。

应用通过 claw_core_submit 投递请求,用 claw_core_receive / claw_core_receive_for 取回 claw_core_response_tclaw_core_response_t 包含助手回复正文(text 字段)与错误信息(error_message)。

claw_core_request_t.flags 支持以下标志位的组合:

标志说明
CLAW_CORE_REQUEST_FLAG_PUBLISH_OUT_MESSAGEAgent 完成推理后,将响应以 out_message 事件发布到 Event Router
CLAW_CORE_REQUEST_FLAG_SKIP_RESPONSE_QUEUE跳过响应队列,不通过 claw_core_receive 返回结果

Event Router 的 run_agent 动作会同时设置这两个标志,实现异步提交 + 事件发布的响应路径。

在拼装发往大语言模型的当前轮用户提示时,claw_core 会附带一段 Behavior Notes,说明最终助手结果通常会由框架自动投递给用户,因此一般不必再主动调用各 IM 的 cap_im_* 发送接口返回正文(减少重复回复)。

claw_core 支持挂接多个 context providerclaw_core_context_provider_t)。每个 provider 在收集阶段往 claw_core_context_t 里填一块内容,类型由 claw_core_context_kind_t 区分,包括:

  • CLAW_CORE_CONTEXT_KIND_SYSTEM_PROMPT
  • CLAW_CORE_CONTEXT_KIND_MESSAGES
  • CLAW_CORE_CONTEXT_KIND_TOOLS

basic_demoapp_claw_start 里按固定顺序挂了多个 provider:

  1. 可编辑人设与画像:claw_memory_profile_provider
  2. 长期记忆:claw_memory_long_term_provider(完整模式)或 claw_memory_long_term_lightweight_provider(轻量模式)
  3. 会话历史:claw_memory_session_history_provider
  4. Skills 目录:claw_skill_skills_list_provider
  5. 已激活 Skill 文档:claw_skill_active_skill_docs_provider
  6. 当前可见工具列表:claw_cap_tools_provider
  7. Lua 异步任务状态:cap_lua_async_jobs_provider

因此:大语言模型最终接收的工具列表,不仅取决于注册了哪些 Capability,还取决于 claw_cap_set_llm_visible_groups

claw_core 通过回调处理大语言模型发出的工具调用请求。

basic_democall_cap 回调指向 claw_cap_call_from_core,该函数由 claw_cap 提供。 claw_core 只基于「能力名 + JSON 参数 + 当前请求上下文」接受调用工具的指令,但不负责查找对应的 Capability 实现与执行。 Capability 的解析与执行工作由 claw_cap 负责。

一轮里允许的工具轮数由 max_tool_iterations 限制。

claw_core 通过回调机制支持多种会话历史写入方式。

basic_demo 中,append_session_turn 设为 claw_memory_append_session_turn_callback,该函数由 claw_memory 提供。 claw_core 会在合适时机触发回调函数,将会话历史交由 claw_memory 处理。

claw_core_cancel_request(request_id) 用于取消当前正在执行的请求:

  • request_id == 0:取消任意当前 in-flight 请求。
  • request_id != 0:仅当当前 in-flight 请求 ID 匹配时才生效。
  • 若没有可取消的请求,返回 ESP_ERR_NOT_FOUND

该取消是协作式中断,主要用于中止进行中的 LLM HTTP 请求;请求结束后,错误信息会被统一标记为 request cancelled,便于上层识别。

claw_core_add_completion_observer 允许注册完成观察器,在每次请求结束后接收 claw_core_completion_summary_t

  • request_id / session_id:请求与会话标识。
  • final_text:本轮最终回复文本(可能为空)。
  • context_providers_csv:本轮注入了非空上下文的 provider 列表(CSV)。
  • tool_calls_csv:本轮触发过的工具调用列表(CSV)。

该机制适合做审计、统计或“结果一致性”检查(例如检测某些声明是否伴随了对应工具调用)。

basic_demo 注册了 cap_lua_honesty_observe_completion 作为 completion observer,用于检测模型回复中声称执行了 Lua 操作但实际未产生工具调用的情况,并在发现不一致时记录日志。

app_claw_start 会在 API Key、profile、model 不全时跳过 claw_core_init / claw_core_start,并打印日志。

此时依赖大语言模型的 ask、Event Router 发往 Agent 的路由(含 fallback 路由)、图片 inspect 等能力不可用。 但 Event Router、自动化、本地 Capability、Console REPL 仍可工作。

claw_core_config_t 中常见字段含义:

  • profile / provider / backend_type / model / base_url / auth_type / timeout_ms:对接不同大语言模型供应商时的路由与鉴权(具体支持的后端在 claw_core_llmllm/backends 下实现)。profileprovider 二选一即可。
  • system_prompt:系统提示词,必填(claw_core_init 会校验此字段非空)。
  • image_max_bytes:传入 LLM 层的图像/媒体大小上限。
  • task_stack_sizetask_prioritytask_core:后台 Agent 任务在 FreeRTOS 上的资源。
  • request_queue_lenresponse_queue_len:请求/响应队列深度。
  • max_context_providers:最多可注册的 provider 数量。