utopia

deepletheApache-2.0活跃维护

基于 Rust 和 PostgreSQL 的自托管企业级世界模型,用双时态知识图谱与 GraphRAG 为 LLM Agent 提供可追溯的长期记忆和知识检索。

World's first open-source enterprise world model.

v0.1.0-rc9发布于 2026-10-11 03:42 UTC8,698star +6 / 7 天1,185fork同步于 2026-11-10 11:31 UTC

怎么上手

由 README 提炼,执行前请确认
git clone https://github.com/deeplethe/utopia.git
cd utopia
docker compose --profile app up -d
硬件要求按 README 说明

README 未说明显存或 GPU 要求;预构建镜像支持 linux/amd64 与 linux/arm64,可在 x86-64 主机、Apple Silicon 和 AWS Graviton 上原生运行。

支持 Apple Silicon有 Docker 镜像
下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

开源企业级世界模型,用双时态知识图谱记录知识演变并支撑可信决策

基于 Rust 和 PostgreSQL 的自托管企业级世界模型,用双时态知识图谱与 GraphRAG 为 LLM Agent 提供可追溯的长期记忆和知识检索。

核心能力

  • 用双时态知识图谱记录事实何时成立与何时被习得
  • 冲突检测、推理与决策均基于本体层运行
  • 通过 MCP 让 Claude Desktop、Cursor 等智能体读取带日期和证据的事实
  • 支持离线部署,数据与审计留痕都在自有硬件上
  • 提供合同、时序问答等公开语料基准用于验证

容易踩的坑

需 Docker,本地开发另需 Rust 1.85+、Node 20+ 和 pnpm;首次使用前要在 Administration → Models 配置 chat 和 embedding 模型端点;数据库密码只在数据卷首次初始化时生效,改密码需同步改数据库或删卷重来;v0.1 数据库迁移只向前不回滚,升级前需备份数据库和 data 目录。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v0.1.0-rc9
  1. v0.1.0-rc9pre-release最新正式版2026-10-11 · 2026-10-11 03:42 UTC

    Two days after rc8, this release is mostly what people running rc8 found: Gemini's OpenAI-compatible endpoint now works from embedding to tool calls, a deployment with a restricted database role gets its vector indexes, and a failing embedding model no longer silences chat memory. The first cut of regression cases for the ontology arrives, and the old ontology growth loop is retired.

    Model endpoints

    Four fixes from one deployment against Gemini's OpenAI-compatible endpoint; each also holds for any endpoint that answers in the same shape.

    • An embedding item without an index takes its position beside the indexed ones. On rc8 every ingestion batch failed (#1135).
    • A tool call's extra_content is returned to the endpoint within the turn. Gemini 3 signs each function call and refuses the next request without the signature (#1183).
    • A streamed tool call without an index starts a new call when it brings an id. Two parallel calls used to merge into one with a concatenated name (#1190).
    • A failed answer is logged on the server with its code and the endpoint's message; before, only the browser saw it (#1189).

    Memory

    • A memory is extracted even while the embedding model answers with an error, and a sentence that cannot be embedded or extracted no longer blocks the ones after it. On rc8, remember kept answering "Recorded" while nothing reached confirmation (#1188).

    Ontology

    • Regression cases. A property remembers the example statements it was approved with, and a person can add a case from any open statement in the document viewer. When alignment decides again after an edit, each case records whether it still binds, and when; a signature a person bound by hand passes and says so. The Ontology page lists the cases with their evidence (0061 cut 2, #1178, #1184).
    • The old growth loop is retired. Suggest, automatic extension and adoption by wording are gone; the agent's proposals are the one way the ontology grows (#1129, #1132, #1128).
    • A column becomes an attribute through the expression tree rules already execute (#1133). A rule update that keeps Y conditions without a join is refused (#1126).

    Identity, alignment and extraction

    • Recall does not pair two names that carry different numbers, such as migration 395 and migration 394 (#1134).
    • A phrase signature's vector is kept, so an alignment run embeds only the texts it has not seen (#1186).
    • A vector index is built by the role that owns the table, so a deployment with a restricted runtime role gets its indexes (#1124).
    • An empty balance stops open extraction at the refused chunk; the job fails once and raises the alert (#1118). Duplicate reviews are read in batches and their summary counts are cheaper (#1119).
    • A # line inside a Markdown code block is no longer read as a heading when a time word looks for its section (#1162).

    Interface and CLI

    • In the Chinese interface a weekly schedule is saved as valid cron (#1166). The schedule keeps its last valid time while the time box is incomplete (#1168).
    • The worker form offers the range the server accepts, 1 to 256 (#1163).
    • In the rule editor an empty numeric condition is refused instead of saved as zero (#1148), and a range may have signed bounds (#1147).
    • A number with a physical unit is shown as 500 MW, not MW500 (#1143). A data source's database, catalog or schema name may contain #, ? or % (#1157). A field's label is tied to its text input (#1156).
    • utopia backup and restore refuse an option whose value is missing (#1140).

    Measured

    • Identity bench for #1134, two builds one commit apart, 16 new bases a side: F1 0.64 before and 0.63 after; decisions between two names that both carry digits fell from 33 to 7 over eight bases a side.
    • The bench scripts take a judge's verdict only when it is the boolean true (#1175), stop instead of scoring when the pipeline m
  2. v0.1.0-rc8pre-release2026-10-09 · 2026-10-09 06:46 UTC
    查看更新说明

    Two weeks in which a document's own dates began to govern what is true when: extraction reads time as it goes, a statement is attested by the date its section speaks from, and a deleted document stops attesting. The ontology is now proposed from the open graph and judged by the questions it answers. Word, Excel, PowerPoint and PDF files are read as they are laid out. This is also the first tag published for linux/arm64 as well as linux/amd64.

    Time is read as the document speaks

    • Extraction reads time as it goes (0064, #989). Each chunk reports the dates its passage states, and a time word is measured from the date of its own section (#991). A statement is attested by that date, and one with no time holds at every moment (#995). A document that states no date is not asked for one (#998).
    • The uniqueness timeline orders a row without a start by its attestation (#1054). Each piece of evidence records when its passage speaks, so a deleted document's date no longer attests (#1059). A row a rule implies is attested by the statements it read (#1012).
    • A binding to a state property says which end a single date marks, and a state row with equal ends is never written (#975). An end the timeline derived cites the fact that closed the row, and a corrected date says which end a person changed (#986, #976). A corrected fact keeps the statements it was computed from (#967, #972).
    • Time mentions resolve whatever order the model lists them in (#1087). A pushed statement's complete date or zoned timestamp is resolved in code, with no chat model (#1090). A quote and its time words are found across a line break (#1081), a deck's cover date attests every slide (#1082), and an upload's date is read from its filename before its body (#979).

    The ontology is proposed from the open graph and judged by its questions

    • Competency questions are rows of a base. An agent proposes classes and properties from the signatures and kind words nothing binds, each with a definition and the statements behind it; adopting one writes the element and re-decides those shapes (0061, #945, #947).
    • The agent remembers what it has seen, and "already in the ontology" becomes a proposal a person adopts as a binding (#950). It proposes questions for a base that has none, and the ontology is measured by two numbers (#955, #962). Its glossary is trimmed per batch the way alignment picks candidates (#963, #965).
    • The editor refreshes the ontology's vectors before alignment runs (#956). A kind-word decision records the inputs it considered (#932). An empty ontology says what the documents still need (#1083). A SHACL shape gives a property the domain and range it does not declare (#1001), and an xsd:hexBinary range is imported as text (#1008).

    Alignment and extraction

    • Every model call uses the workspace's reasoning effort, and none is a value: alignment no longer thinks on its own (#1066).
    • Phrase alignment batches signatures by their candidates, casts no second vote after a first that says none, and asks no rules of a bare head word (#999). Class definitions are written once per batch of kind words (#1004). Phrase alignment waits for the last kind-word round (#926).
    • An extraction reply that is not valid JSON is read item by item, and a slot of the wrong type costs only that slot (#1003, #1011). The usage log says which call it was (#996). The extraction loop is split into call and apply halves, ahead of concurrent chunks (#980).
    • On large bases: the signature queries make one pass instead of one scan per group (#1108), and signatures are not embedded while no property has a vector (#1107). Both come from a deployment with 36,000 open statements.

    Documents are read as they are laid out

    • Word: headings are read as headings, so sections reach the chunks and each is dated by its own date (
  3. v0.1.0-rc7pre-release2026-09-25 · 2026-09-25 21:21 UTC
    查看更新说明

    Six days in which the typed graph became a view that keeps itself honest: alignment learned to reconcile what it writes, to shortlist what it asks about and to read a model's answer in whatever shape it comes; an errata agent now needs two votes and a structural reason before it retracts anything; a name meets its entity through a vector as well as a string; and a source can push statements straight into the open contract.

    Alignment writes a view, and the view reconciles itself

    • A phrase decision records the inputs it considered, so a binding is stale when its basis changed, not when a clock says so (0053, #878). A human decision commits with its own recomputation job and answers 202 (0051, #876).
    • Materialization reconciles the rows it writes along their uniqueness timelines, as the write path always did, so a later observation of a functional attribute closes the earlier one without a manual reconcile; a document version keeps the date it was pushed with, so a same-identity update no longer makes two values look simultaneous (#911, from the #875 replay in #898).
    • A shape of statement can imply a fact of another property, read once per phrase and cached (#882); a business rule may join two entities and conclude a relation (0047, #861); a rule's definition has a history, and a conclusion names the version it was drawn under (0060, #913).
    • The aligner reads the kind-word and phrase replies in the shapes models actually write, and asks again a bounded number of times, so a whole base no longer stays untyped in silence (#894, #895). When the structure fits more than ten properties it shows the ten nearest by the ontology's own vectors, describes the candidates once per batch, accepts a label where a key was asked for, and asks for rules only about bound signatures (#906).
    • Each task thinks as hard as it needs: chat_reasoning_effort in the workspace settings rides on every chat call, extraction and errata run at minimal, alignment and rule proposals at low, all measured on the typed-graph bench (#906, migration 0075).

    An errata agent, on two votes and a flag

    An agent reviews each document's typed facts through the gate, structure first (0044 decision 7, #885). The first measured runs showed it retracting mostly what the document did say, so a retraction or revision now needs a structural flag and a second vote asked alone with the document; an unflagged fact is never retracted by the agent alone. Additions opened the other way: a name the document contains becomes an entity, and a document with no typed facts is reviewed once with an empty list (#906). On 100 documents: 34 wrong retractions to zero, recall 9.3% to 18.4%.

    A name meets its entity

    Recall proposes a pair by name vector, so a short form or a name in another script meets its entity through a question rather than a silent second entity (0041 cut 2, #877, migration 0080). A pair proposed by similarity rather than by the same string is never merged on the batch verdict alone: it takes the tool-using second look, or goes to a person when that look cannot run (#889). Review paging looks the two entities up before their same-name peers (#888).

    A source may push statements

    A Statements source accepts the open extraction contract over HTTP with its own push token: what a client sends is what the graph reads, no model in between, and it reaches the typed layer the same way a document does, through alignment. Same identity is an update, deleted is a tombstone, a key outside the contract or a subject not listed is refused at the door ([0054](do

  4. v0.1.0-rc6pre-release2026-09-19 · 2026-09-19 08:24 UTC
    查看更新说明

    Two weeks in which extraction stopped writing into a schema and started writing what documents say, and alignment learned to turn that back into typed facts. The ledger, the interface and the reading of files all moved with it.

    A document is read in its own words

    Extraction writes an open graph — the subject, the relation phrase as written, the object, the quote it came from — and nothing is bent to fit a class on the way in (0044, #710, #731, #736).

    • The quote is the first thing a statement carries, so the model copies the sentence before it writes from it (#748)
    • A statement reads on its own, and a thing is named by a proper name or a term that means the same in any document (#743)
    • A statement says its mood: a plan, a forecast and a requirement are not facts about the world, and never become typed facts (#745, #746)
    • A table keeps its headings, its sections and its caption, in HTML, in Word, in a spreadsheet and in a CSV (#744, #750)
    • A memory waits in its own words rather than being written straight into the graph (#735)

    The ontology is a view over that, not a gate in front of it

    • A kind word binds to a class and a phrase binds to a property, each by two votes with the candidates reversed, and a person's decision is never overwritten (#741, #751)
    • A bound statement becomes a typed fact through the same gate as any other fact, with its sources recorded; several statements about one triple make one row, not one each (#752, #753)
    • What the aligner could not decide has a queue, beside the other review queues (#754)
    • Editing a class or property definition reconsiders the negative bindings it may now fit, not only the new ones (#775, thanks @Maya-Kid)
    • The ontology table can create classes and properties, not only edit them (#756, thanks @siu91)

    Time

    • A document is dated from its own text, every time mention is interpreted by the model and computed by code, and upload time is never a document's date (0045, #724, #740)
    • A timeline closes on how a start was got, not on a number. The resolution grade travels from the mention to the statement to the typed row; a successor whose start could not be anchored closes nothing and opens no conflict, and AUTO_CLOSE_MIN_CONFIDENCE is gone from the engine (#762)

    A file is read by something that says how it read it

    • A chunk carries its origin — stated, OCR'd, transcribed, described — the model that produced it, and an anchor back into the original bytes (#719, #722)
    • Scans and images go to a layout service; a recording is read with its speakers, and an unlabelled transcript degrades rather than lying (#720, #721)
    • A PDF whose text layer uses a CJK CMap no longer panics the reader (#761, thanks @Floating-Y)
    • A WebDAV file whose name contains an XML entity is no longer silently skipped (#765, thanks @Maya-Kid)

    What a call to the endpoint survives

    • 408, 502, 503, 504 and a request that never sent are transient and retried; 500 is not, and neither is a read timeout (#757)
    • Extraction streams, so the timeout measures silence rather than thinking. A stream that stops mid-answer is a failure, not a short answer (#757), and the two live-stream paths now check the same thing (#785, thanks @Maya-Kid)
    • A multi-byte character split across two network chunks survives (#764, thanks @Maya-Kid)
    • The token ceiling is ours rather than the endpoint's default, and a reply cut at it says so in the drop table (#786, thanks @basil-k-aji-dev)
    • Embedding responses that carry an index are paired by it, not by arrival order (#784, thanks @Maya-Kid)
    • A passage that could not be extracted is a row in the drop table, not silence (#757)

    Measured, and left alone

    Capping the model's reasoning halves the thinking and costs a sixth of a filing's table figures, 885 statements against 729, and nearly double the

  5. v0.1.0-rc5pre-release2026-09-05 · 2026-09-05 00:17 UTC
    查看更新说明

    Time

    • Every graph read now rewinds the second clock. as_of travels beside at all the way to the API, so the graph, its neighbourhoods and an entity's panel can be asked what we believed on a date, not only what was true on one (#317)
    • A wrong extracted date can be corrected without deleting the document. The edit goes through the ledger — the old reading stays, with the correction pointing back at it (#311)

    The ledger can leave

    • A base exports as RDF, in Turtle or JSON-LD: GET /api/v1/kbs/{id}/export. Facts carry both clocks as reified statements, evidence rides as PROV-O lineage back to the document and the sentence, and imported classes keep the IRIs they arrived with (#320)

    Ontology

    • The ontology can be seen as a schema, not only edited as forms — classes as nodes, inheritance, disjointness and object properties as edges (#281, thanks @kalyp-angel)
    • A deployment's first base starts with a vocabulary instead of an empty one (#325, #292)
    • A class imported without a readable IRI takes its key from its label (#328)
    • Type resolution runs itself after extraction, and applies only what stays inside the subtree (#297)

    Who is who

    • Two people with one name in a single document keep their identities (#296)
    • A namesake tie now goes to review instead of being decided by the order rows came back from the database (#329, thanks @ousamabenyounes)
    • The review card stops presenting a namesake pair as 100% context similarity (#310, thanks @Floating-Y)
    • Disambiguating suffixes follow the ontology's own predicates rather than a four-word list, so a schema.org base stops showing two identical "John Smith · Person" (#319)
    • The entity-name guard reads structure instead of a hand-written verb list (#285)

    Agents and data

    • An agent can record over MCP. remember is exposed to a write-scoped token held by an editor, and what it records waits in Review before entering the graph; the card names which agent said it (#318)
    • MySQL-compatible warehouses can be mounted — one driver reaches TiDB, OceanBase, Doris and StarRocks (#315, #323)
    • A data source is usable the moment it is registered (#294)
    • Trino now has a test against a real cluster (#327)

    Security

    • Credentials are sealed before they reach the database (#284)
    • The push key is compared in constant time (#301)
    • Purging a deleted document removes its content for good (#283)

    Also

    Empty pages say which step comes next (#321) · the class form has room to breathe (#288) · search boxes stand at one height (#312) · one embedding refresh per base at a time (#295) · the in-app docs explain agents over MCP (#293) · the README says what ships (#291) · the benchmark gets an answer ke

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Utopia

    Philosophy · Quick start · Features · Roadmap

    Stars License Rust

    Official site Container Discussions Built by DeepLethe 中文

    The enterprise world model built by DeepLethe. It is the first open substrate for knowledge engineering that learns passively and governs itself. Where a knowledge graph or a vector store works to hold present knowledge, Utopia puts time awareness and ontology in the base layer: the knowledge system evolves as material arrives, and conflict detection, reasoning and decision making all run against that ontology. It deploys offline, so a company can stand up a knowledge foundation, a decision core its agents can trust, and a compliance audit trail on hardware it controls.

    Please note: we would rather this project were not framed as an open-source take on Palantir. It is a different route to enterprise intelligence, built bottom up from knowledge governance to trustworthy decisions and simulation.


    https://github.com/user-attachments/assets/aa226443-75de-437e-bd80-88e592ed8457


    Philosophy

    We gave it a somewhat romantic name, Utopia. Ptolemy's geocentric model was taken for truth for a very long time, then falsified step by step by Copernicus, Kepler, Galileo and Newton. Looking back, what we keep is not only that heliocentrism turned out to be right; it is how that history unfolded.

    Where existing vector stores and knowledge graphs work to get present knowledge right, one of Utopia's founding aims is to record the whole course of changing understanding. Engineered, that becomes a bitemporal knowledge graph. When a decision is reviewed later, the system can produce the full course it took and the grounds it rested on. To make this hold up in practice we have iterated at length against public corpora spanning enterprise records, education, finance, law and research. Temporality is only one facet; for how knowledge is taken in, how the future is reasoned about, and how logic bounds action, see utopia.bi/philosophy.

    Use cases

    What Utopia is for, in the shape of the question someone brings. Each is available today unless it says otherwise; each needs a chat model configured, and each leaves the doubtful cases to a person in Review.

    Who and whatInputQuestion, and what comes backWhat the base adds over search or RAG
    A contract chain. Legal or procurement, a master agreement amended several times.The agreement and its amendments, as PDF or Word.Which payment terms applied on 15 March 2024, and who were the parties? The terms in force on that date, the amendment they came from, the sentence.Each fact carries when it held and where it was said; a later amendment closes the earlier term instead of overwriting it. The contracts corpus is this scenario, with the questions it has to answer.
    Who held what, when. HR, finance or research records that change: handovers, corrections, restatements.Announcements, minutes, filings, dated as they were written.Who led project X in Q2 2023, and what did we believe about it at the time? The holder for that period, and separately what the base knew then.Two clocks: when something was true, and when the base learned it. A correction links to what it replaced. The temporal QA bench measures this.
    An agent that reads the base. Engineering or operations teams with Claude Desktop, Cursor or their own agent.An existing base; the agent connects over MCP with a token scoped to it.Facts about this entity as of a date; the path between two things; what changed last week. Structured answers with stable identifiers and evidence; anything the agent wants to record goes to a person first.Reads are typed and dated, not passages; writes are proposals. The MCP guide lists the tools.
    Observations from a system. Robotics, monitoring, security tooling: a system that already knows what it saw and when.One push per observation, in the extraction contract itself, with the observation's time. New in rc7.Where was this object at 08:05, and where is it now? The value that held at that moment and the observation it rests on.No model between the system and the graph; a functional attribute closes its earlier value when a later observation arrives. The walkthrough runs this end to end with curl.

    The walkthrough is the shortest way to see the whole path: sample data, ingestion, a question, the answer with its evidence, and what the base does not do.

    Features

    One Rust binary and one Postgres. Full-text search is embedded in the binary, vectors go in pgvector, and the job queue is a table: nothing else to run.

    A complete applicationA system console, a graph browser and an ontology workbench in one web UI. A product, not a library: install it and it works.
    Knowledge ingestUpload PDF, DOCX, PPTX, XLSX, XLS, ODS, CSV, TSV, Markdown, HTML or plain text, with legacy encodings detected on the way in. Scans and images are read by a MinerU service or a Volcengine Ark vision model, recordings by a transcription model that labels speakers. Web pages, RSS, GitHub, Jira, Notion, WebDAV and S3-compatible buckets sync on a schedule; everything else comes in through the API.
    Search and chatFull-text on Tantivy, vectors on pgvector, fused with RRF. Answers stream with inline citations that open the passage they came from. Any OpenAI-compatible endpoint works (DeepSeek, Qwen, GLM, Ollama, vLLM), so the whole system can run air-gapped.
    Agent harness and agentic RAGThe whole system can be driven through conversation. The built-in agent searches documents, walks the graph (an entity's facts as of any date, or what changed in a period) and queries a mounted database. The same read-only tools are exposed over MCP.
    Agents over MCPAn MCP server for every knowledge base, so Claude Desktop, Cursor, Workbuddy and other agent frameworks can connect, with fine-grained permissions.
    Ontology and cold startA new knowledge base has no vocabulary of its own; it starts from the packs you pick at creation. Five ship inside the binary: schema.org, W3C Org, PROV-O, FOAF and IOF Core (ask for your industry). Terms outside the packs are counted as they appear; confirm the common ones and they join the ontology.
    Bitemporal graphExtraction turns documents into entities and facts, following an ontology you can edit. Every fact carries when it held and where it came from. Correcting a fact closes the old version and links the new one to it rather than overwriting, so the graph keeps two timelines: when something was true in the world, and when the system came to believe it. Edges are reified, so an edge carries attributes of its own.
    Entity resolution and reviewDuplicates are resolved in three stages: exact name or alias, embedding similarity, then a model's call on the doubtful pairs. Every merge can be undone. Uncertain cases go to a review queue: low-confidence extractions, suspected duplicates and cardinality conflicts.
    Agent adjudicationThe agent adjudicates on its own, from common sense and the business documents. Low-confidence calls go to the human review queue, and the decisions people make there are recorded and used to tune the agent, closing the loop.
    Reasoning and derivationOntology axioms compile into rules: transitivity, symmetry, inverses and relation hierarchy derive new facts by forward chaining. Derivation is off by default, since a wrong axiom derives wrong facts. A derived fact is marked as such on the graph, carries validity and confidence like any other, and shows what it was derived from. When it contradicts an asserted fact, the asserted one stands.
    Conflict detectionThree kinds of conflict, three sets of choices. A new fact that clashes with an older one: close the old, keep both, or reject the new. Data that breaks an axiom (self-loop, asymmetry, transitive cycle, cardinality): retract the fact, relax the axiom, or accept both. The ontology itself is checked first, because violations of a self-contradictory ontology are noise.
    Ontology-driven queryingMount a database on a base (Postgres, MySQL and the engines that speak its protocol, ClickHouse, Trino for Iceberg / Delta Lake / Hive, Databricks, Snowflake) and chat can query it alongside the documents. The agent proposes how its tables map onto the ontology, and you confirm. The method behind it, Ontology2SQL, is state of the art on BIRD Mini-Dev for SQLite and PostgreSQL (submission).
    Multi-user and permissionsEach knowledge base has its own members and roles: owner, admin, editor and viewer. Open bases are readable by everyone in the deployment, restricted ones only by invitation. The first account registered becomes the system administrator.
    Decision ledgerConfirming or rejecting a fact, merging or reverting an entity, rebuilding the graph: each leaves a record of who, when, and what the object looked like at the time. The ledger is append-only, and a record outlives its object, even the base it belonged to.
    Decision intelligence (in development)Record a decision, replay both what was understood and the course it took, and reason over overlaid scenarios.

    Quick start

    Requirements: Docker (local development also needs Rust 1.85+, Node 20+, pnpm).

    The prebuilt image is published for linux/amd64 and linux/arm64, so it runs natively on x86-64 hosts as well as Apple Silicon and AWS Graviton. Tags up to 0.1.0-rc7 are amd64 only.

    Start from the prebuilt image:

    git clone https://github.com/deeplethe/utopia.git
    cd utopia
    docker compose --profile app up -d
    

    Open http://localhost:1516 and register. The first account automatically becomes the administrator, and a public knowledge base readable by everyone is created at the same time. Before extracting business documents, configure the model endpoints (chat and embedding) under Administration → Models.

    The database password (UTOPIA_DB_PASSWORD in .env, default utopia) is applied when the data volume is first initialised. To change it on a running deployment, change it in the database as well — docker compose exec db psql -U utopia -c "ALTER USER utopia PASSWORD '<new password>'" — or start over with docker compose --profile app down -v, which deletes all data.

    Or build from source:

    docker compose -f docker-compose.yml -f docker-compose.build.yml --profile app up -d --build
    

    Local development

    # 1. Postgres with pgvector
    docker compose up -d db
    
    # 2. Backend on :1516, runs migrations on startup
    cargo run -p utopia-server
    
    # 3. Frontend on :5173, proxying /api to the backend
    cd web && pnpm install && pnpm dev
    

    Roadmap

    • Decision reasoning: constraint computation, and replaying a decision after the fact
    • Business rules: rules written by people over an entity's attribute facts, a threshold or a category set, that classify it as a derived fact with the rule and the premises as its explanation (#277)
    • Execution gate: checking an agent's calls against ontology rules and symbolic logic
    • MaxCompute: mapping exploration and Ontology2SQL over Alibaba Cloud MaxCompute (Iceberg / Delta Lake via Trino, Databricks and Snowflake are in, awaiting a run against a real cluster)
    • More sources: a Feishu connector
    • Agent memory over MCP: episode writes, the retrieve endpoint, and the MCP server
    • Enterprise: OIDC SSO, backup and restore commands, benchmarks at 100k documents

    Status

    Utopia is still at v0.1. The database schema evolves between versions and migrations only roll forward, with no rollback. Pin a specific version with UTOPIA_IMAGE in production, and back up the database along with the data directory before upgrading.

    Please read SECURITY.md before exposing it to the public internet.

    Star History

    Community

    • 💬 Discussions: discuss the project, share your experience, and leave feedback
    • 🐛 Issues: report bugs, ask design questions, and submit feature requests
    • 🤝 Contributing: development setup, pre-push checks, and DCO sign-off
    • 🔌 Ontology2SQL: the ontology-driven text-to-SQL method referenced above

    License

    Apache-2.0