GitHub - sqliteai/adam: An embeddable cross-platform AI agent library written in C. Cloud and local LLMs, tool calling, long-term memory, voice, sessions, research mode, self-evolving loops. The SQLite of agent frameworks: small, portable, just works.
We believe that this document is primarily human-written, with some AI-generated content detected.
Hacker News Article AI Analysis
Content Label
Mixed
AI Generated
28%
Human
72%
Window 1 - Human
Embeddable AI agent library in C.
Adam gives you a complete agent loop: tool calling, memory, sessions, voice, streaming, structured output, in one #include. Works with cloud APIs (Anthropic, OpenAI, Google Gemini, Groq, Together, xAI) and local models (llama.cpp) through the same interface. Compiles on macOS, Linux, Windows, iOS, Android, and WASM.
Quick Start
#include "adam.h"
int main(void) {
adam_init();
adam_settings_t *s = adam_create_settings();
adam_settings_set_provider(s, ADAM_API_ANTHROPIC,
getenv("ANTHROPIC_API_KEY"),
"claude-sonnet-4-20250514");
adam_history_t *h = adam_history_create();
adam_run_result_t r = adam_run(s, h, "What is the capital of France?");
printf("%s\n", r.final_response); // "The capital of France is Paris."
adam_run_result_free(&r);
adam_history_destroy(h);
adam_settings_destroy(s);
adam_cleanup();
}
make deps # build llama.cpp + whisper.cpp
make all # build libadam.a
make test # run 161 tests (ASan + UBSan)
Features
Feature
Description
Agent loop
Tool calling with automatic iteration until final response
Three providers
Anthropic, OpenAI, Google Gemini + any compatible API + local GGUF via llama.cpp
Local vision
Multimodal image understanding via llama.cpp + mmproj (Gemma 3, LLaVA, etc.)
Image generation
Native image output via Gemini image models (gemini-3.1-flash-image-preview)
Database extensions
SQLite and PostgreSQL extensions — embed Adam as SQL functions that query the same database
13 built-in tools
File I/O, shell, calculator, SQL, web fetch/search, HTTP POST, memory, research, multi-agent
Long-term memory
Hybrid BM25 + vector search via SQLite (sqlite-memory + sqlite-vector)
Session persistence
Save/load conversations with UUIDv7 keys
Telegram bot
Full-featured Telegram integration with text, voice, images, tools, and memory
Voice
STT (Whisper
Window 2 - Human
cloud/local) + TTS (cloud/system) + full audio pipeline
Streaming
Real-time token delivery via callback
Structured output
adam_run_json() with validation and retry
Evolution loop
Self-improving agent: iterate, score, refine strategy
Research mode
Autonomous multi-iteration information gathering with report synthesis
Multi-agent
Agent A invokes Agent B as a tool, with independent settings/tools
Guardrails
Pre-send and post-receive validation callbacks
Response cache
LRU hash table keyed on model + message history
History management
Clone, summarize (LLM-based compression), token estimation
Thread pool
Concurrent agent execution with job queue
Filesystem sandbox
Tools restricted to explicitly allowed directories
Cross-platform
macOS, Linux, Windows, iOS, Android, WASM (Emscripten)
Arena allocator
Zero-leak per-iteration memory with automatic cleanup
Build
make deps # Build llama.cpp, whisper.cpp (+ mbedtls/curl on Linux)
make all # Build libadam.a
make test # Build & run unit tests (ASan + UBSan)
make chat # Interactive text chat (cloud API)
make chat GGUF=models/model.gguf # Interactive text chat (local)
make vision GGUF=models/model.gguf MMPROJ=models/mmproj.gguf # Local vision test
make talk # Voice agent (cloud)
make talk LOCAL=1 # Voice agent (fully local)
make memory # Memory system tests
make clean # Remove all build artifacts
API Reference
Full API documentation with every function, type, and callback: API.md
Examples
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, "Explain quantum entanglement simply.");
printf("%s\n", r.final_response);
adam_run_result_free(&r);
// Continue the conversation — history carries forward
r = adam_run(s, h, "Can you give an analogy?");
Window 3 - Human
printf("%s\n", r.final_response);
adam_run_result_free(&r);
adam_history_destroy(h);
adam_settings_destroy(s);
More examples are available in the examples/ directory:
Example
Description
simple-conversation
Multi-turn chat with a cloud API
tool-calling
Register a custom tool and let the agent call it
local-model
Run a local GGUF model via llama.cpp
local-vision
Image understanding with a local vision model + mmproj
google-gemini
Use Google Gemini models
image-generation
Generate images with Gemini
sqlite-query
Natural language queries on any SQLite database
structured-json
Get validated JSON output with retry
memory
Long-term memory with hybrid BM25 + vector search
sessions
Save and restore conversations
streaming
Real-time token streaming via callback
voice
Speech-to-text + agent + text-to-speech pipeline
multi-agent
Agent A delegates to Agent B as a tool
evolution
Self-improving agent with scoring loop
research
Autonomous multi-iteration research with report
filesystem-sandbox
File and shell tools restricted to allowed directories
guardrails
Pre-send and post-receive validation
response-cache
LRU cache for repeated queries
thread-pool
Concurrent agent execution
telegram
Telegram bot with text, images, tools, and memory
wasm-chat
Browser-based chat UI via WebAssembly
full-agent
All features combined
Database Extensions
Adam can be embedded directly inside SQLite and PostgreSQL as a SQL extension. The agent can query the same database it's loaded in — ask questions in natural language, get answers from your data.
-- SQLite
.load adam
-- PostgreSQL
CREATE EXTENSION adam;
-- Configure (both)
SELECT adam_config('provider', 'anthropic');
SELECT adam_config('api_key', 'sk-ant-...');
-- Ask about your data — the agent reads the schema and runs SQL
SELECT adam_ask('How many users signed up last month?');
-- → "47 users signed up last month."
Window 4 - 71% AI-Generated
-- Generate SQL without executing
SELECT adam_sql('top 5 products by revenue');
-- → "SELECT p.name, SUM(oi.quantity * oi.price) AS revenue FROM ..."
Function
Description
adam_config(key, val)
Configure provider, API key, model (persisted)
adam(msg)
Stateless one-shot chat
adam_ask(msg)
SQL-aware agent — reads schema, queries data, multi-turn
adam_sql(question)
Generate SQL from natural language
adam_create_session()
Create session (auto-created on first adam_ask)
adam_get_session()
Get current session UUID
adam_clear_session()
Clear session and history
See extensions/sqlite/ and extensions/postgres/ for build instructions.
Architecture
adam_run() loop:
build system prompt (identity + instructions + bootstrap files + memory + datetime)
-> check guardrails (on_before_send)
-> check cache
-> dispatch LLM (mock | local/llama.cpp | remote/HTTP)
-> check guardrails (on_after_receive)
-> if tool_calls: execute tools -> append results -> loop
-> if text: return final response -> auto-save session -> extract memory
Platform abstraction: macOS uses NSURLSession, Linux uses libcurl+mbedtls, WASM uses embedder-provided http_fn callback.
Memory management: Arena allocators for per-iteration zero-copy work. malloc/free for long-lived structures. Arena-allocated strings are only valid within the current iteration.
Feature Gates
Define before #include "adam.h" to disable features:
Gate
Effect
ADAM_NO_CURL
No libcurl (must provide http_fn callback)
ADAM_NO_LOCAL
No llama.cpp (no local inference)
ADAM_NO_PTHREADS
No thread pool, no voice thread
ADAM_NO_SQLITE
No SQLite (no memory, sessions, or SQL tool)
ADAM_NO_VOICE
No voice subsystem
ADAM_NO_FILESYSTEM
No file_read/file_write/list_directory tools
ADAM_NO_SHELL
No shell_exec tool
Dependencies
All vendored as git
Window 5 - 71% AI-Generated
submodules in modules/:
Module
Purpose
llama.cpp
Local LLM inference + GGML compute
whisper.cpp
Local speech-to-text (shares ggml via symlink)
miniaudio
Cross-platform audio I/O
sqlite
Amalgamation build
sqlite-memory
Hybrid BM25 + vector knowledge store
sqlite-vector
Vector similarity search
mbedtls
TLS (Linux only)
curl
HTTP (Linux only)
macOS uses system frameworks (Foundation, Security, Metal, AVFoundation, Accelerate) instead of curl/mbedtls.
License
MIT