AI (lexigram-ai)
Agents, LLMs, RAG, Skills — wired together, no glue code.

lexigram-ai is the AI layer of the lexigram framework: a thin coordinator that wires the lexigram-ai family — agents, LLMs, RAG, memory, skills, MCP, session, workers, observability, feedback, guard, governance, evaluation, prompt, relay — into the container through entry-point discovery. one install, one Application.boot, and the whole family is resolvable by contract. every backend is swappable: run it on your own infra or point it at an API.
- wired, not glued. agents, llms, rag, memory — one container, one boot call.
- async, end to end. the container, the modules, the controllers — concurrency-safe by construction.
- contracts everywhere. every package talks through protocols, so swapping an implementation never ripples.
- local-first. defaults point at any OpenAI-compatible server — Ollama, LM Studio, vLLM — hosted providers are a config change away.
→ full docs at docs.lexigram.dev
install
Section titled “install”uv add "lexigram[ai,web]" # framework + web + ai + server (what the example below uses)uv add lexigram-ai # just the coordinatorpip install "lexigram[ai,web]"60 seconds, end to end
Section titled “60 seconds, end to end”from lexigram import Applicationfrom lexigram.web import Controller, get, WebModulefrom lexigram.web.server import run_serverfrom lexigram.ai.llm import LLMModule, ClientConfigfrom lexigram.contracts.ai import LLMClientProtocol, ChatMessage, Role
class ChatController(Controller): def __init__(self, llm: LLMClientProtocol): self.llm = llm
@get("/chat") async def chat(self, q: str) -> dict: messages = [ChatMessage(role=Role.USER, content=q)] result = await self.llm.complete(messages) return {"reply": result.unwrap().content}
app = Application()app.add_modules([ # Local-first. To talk to a hosted provider instead, set # `provider="openai"` (or "anthropic", "groq", ...) and supply # the matching API key. LLMModule.configure(ClientConfig( provider="ollama", model="llama3.2", api_base="http://localhost:11434", api_key="ollama", )), WebModule.configure(controllers=[ChatController]),])
run_server(app, port=8000)→ http://localhost:8000/chat?q=hello
No API key needed if you’re pointing at a local model. To talk to a hosted provider instead, set
provider="openai"(or"anthropic","groq", …), dropapi_base, and supply the matching API key — or letLLMModule.configure()read the whole block fromLEX_AI_LLM__*env vars.
what just happened?
Application.bootassembled two modules — an LLM client and a web server — into one container and started them together.LLMModule.configure(...)declared a provider, a model, and an endpoint. No SDK, no per-provider code.ChatControllerresolvedLLMClientProtocolby type from the container. Swap the provider; the controller never changes.
lexigram-ai├── umbrella entry point · discovers subsystems├── llm provider-agnostic clients├── agents tools, react, and beyond├── rag chunkers, embedders, retrieval pipelines├── memory working, episodic, semantic stores├── skills versioned agent capabilities├── session conversation state and resumption├── mcp model-context-protocol clients├── workers background AI jobs├── observability tracing and metrics├── feedback quality loops├── guard input/output safety gates├── governance policy, audit, budgets├── evaluation evals and quality gates├── prompt versioned prompt templates├── relay protocol conversion engine└── relay-gateway HTTP gateway for relaywhat’s in the box
Section titled “what’s in the box”the whole family lives in lexigram-ai-experimental — experimental tier, API stability is not guaranteed between releases. same container, same contracts, same rules as the stable core.
lexigram-ai— the coordinator (this package)lexigram-ai-llm— provider-agnostic clients for Ollama, OpenAI, Anthropic, Groq, Mistral, and morelexigram-ai-agents— tools, react, and beyondlexigram-ai-rag— chunkers, embedders, retrieval pipelineslexigram-ai-memory— working, episodic, semantic storeslexigram-ai-skills— versioned agent capabilitieslexigram-ai-session— conversation state and resumptionlexigram-ai-mcp— model-context-protocol clientslexigram-ai-workers— background AI jobslexigram-ai-observability— tracing and metricslexigram-ai-feedback— quality loopslexigram-ai-guard— input/output safety gateslexigram-ai-governance— policy, audit, budgetslexigram-ai-evaluation— evals and quality gateslexigram-ai-prompt— versioned prompt templateslexigram-ai-relay— protocol conversion enginelexigram-ai-relay-gateway— HTTP gateway for relay
early on purpose
Section titled “early on purpose”The AI layer is in 0.1 — which means you can still change it. APIs may shift before 1.0, so pin your versions, and tell us what feels wrong. Shaping a framework is more fun when it’s still soft.
pointers
Section titled “pointers”- full docs → docs.lexigram.dev
- the stable core → lexigram
- the AI family → lexigram-ai-experimental