Skip to content
HN On Hacker News ↗

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.

▲ 24 points 9 comments by marcobambini 3w ago HN discussion ↗

Pangram verdict · v3.3

We believe that this document is primarily human-written, with some AI-generated content detected

49 %

AI likelihood · overall

Mixed
72% human-written 28% AI-generated
SEGMENTS · HUMAN 1 of 5
SEGMENTS · AI 2 of 5
WORD COUNT 1,008
PEAK AI % 71% · §5
Analyzed
May 6
backend: pangram/v3.3
Segments scanned
5 windows
avg 202 words each
Distribution
72 / 28%
human / AI fraction
Verdict
Mixed
Pangram v3.3

Article text · 1,008 words · 5 segments analyzed

Human AI-generated
§1 Human · 26%

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

§2 Mixed · 44%

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?");

§3 Mixed · 51%

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."

§4 AI · 71%

-- 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

§5 AI · 71%

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