adam
用纯C打造的可嵌入式AI Agent库,单文件10MB,支持本地/云端LLM,工具调用+记忆+语音+会话,一行代码集成
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用纯C打造的可嵌入式AI Agent库,单文件10MB,支持本地/云端LLM,工具调用+记忆+语音+会话,一行代码集成
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下:你在嵌入式设备上跑 AI Agent——树莓派、工业控制器、甚至智能手表。传统方案需要 Python 运行时 + 几十MB依赖,根本跑不动。而 sqliteai/adam 用 10MB 的 C 静态库解决了这个问题:一个 #include 搞定 AI Agent 全部功能。
这就是 Adam——"AI Agent 领域的 SQLite":小、快、随时可用。
Adam 是一个用纯 C 编写的可嵌入式 AI Agent 开发库,核心只有一个 adam.c + adam.h,加上几个子模块(llama.cpp、whisper.cpp、SQLite),就能跑起完整的 Agent 循环:工具调用、记忆管理、会话持久化、语音交互、多模态理解。
项目名里的"sqliteai"既是组织名,也暗示了设计哲学——像 SQLite 那样,把复杂能力压缩到最小体积,让任何平台都能即插即用。
adam_settings_t *s = adam_create_settings();
adam_settings_set_provider(s, ADAM_API_ANTHROPIC, api_key, "claude-sonnet-4-20250514");
adam_history_t *h = adam_history_create();
adam_run_result_t r = adam_run(s, h, "分析这份销售数据并给出建议");
printf("%s\n", r.final_response);
这是 Adam 最核心的 API:adam_run() 自动处理整个 Agent 循环——发送 Prompt → 解析 LLM 响应 → 如果有工具调用就执行 → 追加结果 → 继续循环,直到 LLM 输出纯文本响应。开发者无需手动管理迭代次数和状态。
// Anthropic
adam_settings_set_provider(s, ADAM_API_ANTHROPIC, key, "claude-sonnet-4-20250514");
// OpenAI
adam_settings_set_provider(s, ADAM_API_OPENAI, key, "gpt-4o");
// Google Gemini
adam_settings_set_provider(s, ADAM_API_GEMINI, key, "gemini-2.0-flash");
// 本地 GGUF 模型
adam_settings_set_provider(s, ADAM_API_LOCAL, NULL, "models/llama3-8b.Q4_K_M.gguf");
一套 API,无缝切换云端 API(Anthropic / OpenAI / Google Gemini / Groq / Together / xAI)和本地 llama.cpp 推理。不需要改业务代码。
Adam 开箱即带 13 种常用工具,覆盖文件 I/O、Shell 执行、计算器、SQL 查询、网页抓取、HTTP POST、记忆读写、研究模式、多 Agent 调用等场景。
adam_settings_add_tool(s, "file_read", file_read_tool, NULL);
adam_settings_add_tool(s, "shell_exec", shell_exec_tool, NULL);
adam_settings_add_tool(s, "sqlite_query", sqlite_tool, NULL);
开发者也可以注册自定义工具,Agent 会自动决定何时调用哪个工具。
make talk # 云端语音(Whisper 云 STT + 系统 TTS)
make talk LOCAL=1 # 完全本地:whisper.cpp 本地转写 + miniaudio 输出
Adam 集成了完整的音频管线:Whisper(云端或本地 whisper.cpp)做语音识别,miniaudio 处理系统音频 I/O,支持本地 TTS 或云端语音合成。完全离线可用。
这是 Adam 最独特的特性——通过 SQLite 或 PostgreSQL 扩展,把 Agent 变成 SQL 函数:
SELECT adam_agent(
'分析过去30天销售额趋势,给出下季度建议',
'postgresql://sales_user:pass@db/sales'
);
在数据库查询里直接调 Agent,数据不动,推理结果回来。这意味着可以在数据源附近做 AI 分析,避免大数据传输开销。
Evolution Loop:让 Agent 自己迭代优化输出策略。定义评估函数 → 自动生成多个策略变体 → 评分 → 选出最优:
adam_evolve_config_t cfg = adam_evolve_config_defaults();
cfg.task = "写一个产品介绍";
cfg.initial_strategy = "简洁专业";
adam_evolve(s, h, &cfg);
Research Mode:给定研究问题,Agent 自动多轮搜索网页、抓取数据、综合报告——相当于一个 mini 的 Perplexity。
| 使用方式 | 难度 | 说明 |
|---|---|---|
make chat(云端) | ⭐ | 5分钟体验,需 API Key |
make chat GGUF=xxx(本地) | ⭐⭐ | 需下载 GGUF 模型文件 |
| 集成到 C 项目 | ⭐⭐⭐ | 只需 #include "adam.h",CMakeLists 加 libadam.a |
| 数据库扩展 | ⭐⭐⭐⭐ | 需要 SQL 知识 + 数据库环境 |
API 设计极度简洁,核心流程不超过 10 行 C 代码。文档质量很高——API.md 详细描述每个类型和函数,ARCHITECTURE.md 深入讲解内部实现,数据流清晰。
Adam 用两层内存策略:
arena_t):每轮迭代开始时创建,结束时整体重置。用于 LLM 响应解析、系统 Prompt 构建、工具结果字符串。无泄漏,无需手动 free。_destroy() / _free() 释放。这个设计让 Agent 循环的临时内存完全不泄漏,同时避免了 GC 开销——C 语言的极致工程哲学。
adam_run() → 验证输入 → 重置 Arena
→ 构建系统 Prompt(身份+指令+Bootstrap文件+记忆+时间)
→ Guardrails 检查(发送前钩子)
→ 检查缓存
→ LLM 分发(Mock | llama.cpp | HTTP 云端)
→ Guardrails 检查(接收后钩子)
→ 有工具调用 → 执行 → 追加结果 → 循环
→ 无工具调用 → 返回最终响应 → 自动保存会话 → 提取记忆
| 模块 | 作用 |
|---|---|
llama.cpp | 本地 LLM 推理(GGUF 格式) |
whisper.cpp | 本地语音转文字 |
sqlite | 会话持久化、记忆存储 |
sqlite-memory | BM25 + 向量混合检索 |
sqlite-vector | 向量相似度搜索 |
miniaudio | 跨平台音频 I/O |
mbedtls | Linux TLS 加密 |
curl | Linux HTTP 请求 |
macOS 使用系统框架(Foundation、Security、Metal、AVFoundation)代替 curl/mbedtls,保持零外部依赖。
优势一面:
局限与挑战:
ADAM_NO_VOICE,不需要本地推理就要 ADAM_NO_LOCAL,否则编译体积会大在"万物皆可 AI Agent"的时代,Adam 代表了一个重要方向:把 Agent 能力下沉到边缘。
目前大多数 Agent 框架(LangChain、AutoGen、Semantic Kernel)都基于 Python,不适合嵌入式 / 移动端 / WASM 场景。而 Adam 用 C 语言证明了:在 < 10MB 的二进制体积里,可以跑完整的、多模态的、会话式的 AI Agent。
这个方向的价值不仅在于"小",更在于确定性——没有 Python 运行时依赖、没有 GIL、没有包管理器版本冲突,部署到哪里都能跑。这对于:
都是切实可行的路径。Adam 的数据库扩展(把 Agent 变成 SQL 函数)更是打开了一个有趣的场景:让 AI 推理靠近数据,而不是把数据拉到 AI 侧。
随着 llama.cpp 在移动端效率的持续优化,Adam 这类嵌入式 Agent 库的价值会越来越大。

make deps && make all && make chat(云端)或 make chat GGUF=model.gguf(本地)