Skip to content

Quickstart — install, use, data

One page from the files Limma sends you to an agent reading your documents. Each step links the page that holds its detail; Install inside your network is the whole install.

Install

  1. Load the image and check it: sha256sum -c limma-image-<version>.tar.gz.sha256, then docker load -i limma-image-<version>.tar.gz (install, step 1).
  2. Configure, in the bundle's deploy/customer/: cp .env.example .env, then fill the [common] section — an admin key and an analyst key in EPISTEM_API_KEYS (<key>:<organization>:admin,<key>:<organization>:analyst, each key from openssl rand -hex 32), the URL your agents reach the API at in LIMMA_APP_BASE_URL, and LIMMA_TERMS_ACCEPTED once you have read TERMS.md. Put the license.json Limma sent you at license/license.json.
  3. Choose the model. The recommended reader runs on one GPU of 48 GB or more; add to .env (removing the # from the COMPOSE_FILE line):

    COMPOSE_FILE=compose.yaml:compose.vllm.yaml
    VLLM_IMAGE=vllm/vllm-openai:v0.29.0@sha256:c2914767605584b6d8f45686b82de173ecc99e781897aa3d0a66dacd72c51ae1
    LIMMA_VLLM_ARTEFACT=Qwen/Qwen3-30B-A3B-Instruct-2507-FP8
    MAX_MODEL_LEN=32768
    

    More GPUs, or open weights you already serve: install, section 2. That model is Limma's own reader; your agents may use any model. 4. Start, then check:

    docker compose --profile fetch run --rm model-fetch
    docker compose up -d
    curl -s http://127.0.0.1:8000/health
    docker compose exec api python -m epistem.deploy smoke --bundle bundle_expert_network --registry-less
    

    The smoke ends smoke: PASSED (install, step 5, which also says what every line of /health must read).

Use — the five tools

Attach an agent to the API's MCP endpoint, <LIMMA_APP_BASE_URL>/mcp, with a key — for Claude Code:

claude mcp add --transport http limma https://limma.your-company.internal/mcp --header 'X-API-Key: ${LIMMA_API_KEY}'

Claude Desktop, Cursor and VS Code: MCP over HTTP. There is no workspace to create first: a call that names none is served from the key's default workspace, which the first such call of the admin or analyst key creates. The agent is offered five tools:

tool for one example
limma_ingest put a text in limma_ingest(content="Board minutes: Ingrid Solberg was appointed CFO on 1 March 2024.", filename="minutes.txt")
limma_facts every fact at an address, with a receipt each and a count limma_facts(question="revenue 2023", mode="enumerate", coordinate={"attribute": "revenue", "period": "FY2023"})
limma_search the closed set of people (or anything a pack declares) that meet a request limma_search(brief="VP-level sales people in DACH")
limma_region re-read the exact bytes a receipt points at limma_region(source_id="<from a fact>", start=126, end=131, page=0)
limma_connect load a table or an export as addressed facts limma_connect(document_source={"path": "/data/imports/experts.jsonl", "collection": "experts"}, mode="propose")

What each returns, and every field: the verb reference.

Data — getting yours in

what you have how it goes in
Documents — PDF, Word, PowerPoint, Excel, HTML, e-mail, text, scans a folder sync (below), or one file at a time: POST /v1/workspaces/{workspace_id}/documents (multipart files=@<file>). An agent sends a text with limma_ingest.
Exports — JSON / JSONL (a mongoexport file), CSV / TSV, Excel put the file in the bundle's ./imports (the API reads it at /data/imports), then limma_connect with document_source.path — mode="propose" first, which drafts the mapping and writes nothing (the connect path). A file from another machine is uploaded first (POST /v1/public/upload_export) and connected by its export_id.
Databases — PostgreSQL, MySQL / MariaDB list the host in EPISTEM_CONNECT_ALLOWED_HOSTS (by name, in .env), then limma_connect(database_url=..., table=..., relation_mapping=...) with a read-only account (the connect path).
A folder, a bucket, Google Drive or SharePoint, kept current — S3, Azure Blob, Google Cloud Storage, a Drive folder, a SharePoint or OneDrive for Business library pip install limma-ai on any machine that reaches the API, then limma sync ./contracts --url https://limma.your-company.internal, run again to keep it current; in an air gap the image runs the same command as python -m epistem.sdk sync (connectors).

A sync tool you already run (Airbyte, Fivetran, a nightly job) writes files; load what it writes as an export (its output). Deleting a document or a workspace is proven by enumeration (data handling).