Model or dataset
fim-ai/fim-one avatar
fim-ai/fim-one

FIM One: An Agent Core for Enterprises That Run Both Global SaaS and the China Stack

Open-source agent platform for Global × China enterprises — wire every system through one agent core. Self-hosted, any LLM.

1,508 stars169 forksPythonNOASSERTION

At a glance

What is it?
FIM One is a self-hosted Python agent platform that connects APIs, databases and MCP servers as agent tools, with connectors for China-market databases and IM platforms that most Western agent frameworks ignore. The trade-off is a Source Available licence and a young project with no published releases.
Who is it for?
FIM One is worth a pilot if your organisation already runs Feishu, WeCom, DingTalk, DM or KingbaseES alongside global SaaS, and you want one self-hosted agent core instead of stitching connectors yourself. It is the wrong choice if you need a permissively licensed dependency, a published release you can pin, or a platform whose roadmap is set outside a single vendor.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 9 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem FIM One targets: two system estates that rarely meet in one agent

A multinational running operations in China usually ends up with two disconnected toolchains. Global SaaS on one side. Feishu, WeCom, DingTalk, DM and KingbaseES on the other. The README frames this directly: enterprises run ERP, CRM, OA, HR, finance, databases and IM platforms across regions, and those systems do not talk to each other. The stated goal is to wire all of them into one agent core.

Most agent frameworks are built against a Western connector set. You get Salesforce and Slack integrations, then you write your own adapter for DingTalk. FIM One inverts that assumption. Its database connector list names PostgreSQL, MySQL, Oracle and SQL Server alongside DM, KingbaseES, GBase and Highgo. The README claims these are databases that most global platforms cannot reach. That claim is the product thesis, and it is also the reason the project exists at all.

The intended user is an engineering team inside a company that spans both estates, not an individual developer experimenting with agents. The three delivery modes (Standalone assistant, Copilot embedded via iframe or widget, and Hub as central orchestration) map to different deployment scopes within one organisation rather than different customer types.

One agent core, three delivery modes, and what that actually constrains

The README describes a single agent core exposed three ways. Standalone is a general-purpose assistant reached through a portal, covering search, code and knowledge base tasks. Copilot embeds the same assistant inside a host system's UI through an iframe, widget or embed. Hub is central orchestration across all connected systems, reachable through the portal or an API.

The architecture diagram shows a central node labelled FIM One Agent Core with bidirectional links to ERP, a database, Lark, CRM, OA and a custom API. There is no message bus or event stream in that diagram; the connections are drawn as direct edges to the core. That shape matters. It suggests the agent core is the hub in a literal sense, and every system integration terminates there.

Tools are registered from three sources: imported OpenAPI specs, an AI chat builder, and MCP servers. The README states that actions auto-register as agent tools with auth injection, and that progressive disclosure meta-tools reduce token usage by 80% or more across all tool types. That last figure is a vendor claim from the README, not an independent measurement, and it is stated without a described methodology. Treat it as a design goal rather than a benchmark.

The Copilot mode is the one with the clearest constraint. An iframe or widget embed means the agent renders inside someone else's UI, which ties its behaviour to that host's session and layout. The README does not describe how identity is passed from the host system into the embedded agent, and that is the question I would ask before choosing Copilot over Hub.

ReAct loop, runtime DAG planning, and the re-plan budget

FIM One ships two execution strategies and an auto-router that picks between them. The ReAct agent runs a structured reasoning-and-acting loop with automatic error recovery. The DAG planner has the LLM decompose a goal into a dependency graph at runtime, with no hard-coded workflows. Independent steps execute concurrently through asyncio, and the system re-plans up to 3 rounds when something fails.

That re-plan ceiling is the most concrete number in the planning section, and it deserves attention. Three rounds is a hard stop. A task that needs four rounds of recovery will not get them. The auto re-plan behaviour is bounded by design, presumably to cap token spend, and the README does not describe what happens at the boundary: whether the run fails cleanly, returns a partial result, or surfaces an error to the operator. If you are evaluating this for long multi-step workflows, that boundary is worth testing yourself.

Auto-routing classifies queries and sends them to either ReAct or DAG, configurable through an `AUTO_ROUTING` setting. The README does not document the classifier itself, so the routing decision is opaque by default. For straightforward tool calls that is fine. For workloads where you need to know in advance which execution path a request will take, an opaque classifier is a friction point.

The agent harness wraps execution with three named components: ContextGuard for five-layer token-budget management, progressive-disclosure meta-tools to keep the tool surface tractable, and self-reflection loops to counter goal drift. These are described as production-grade, which is a positioning statement rather than a verified property. The mechanism names are specific enough to be checkable in the source.

Getting it running: Docker, start.sh, and the env keys that matter

The README gives two paths. Docker is recommended. The sequence is to clone the repository, copy `example.env` to `.env`, edit `LLM_API_KEY` and optionally `LLM_BASE_URL` and `LLM_MODEL`, then run `docker compose up --build -d`. The UI comes up on port 3000, and on first launch you create an admin account.

For local development the prerequisites are Python 3.11 or later, uv, Node.js 18 or later, and pnpm. The commands are `uv sync --all-extras`, then `cd frontend && pnpm install && cd ..`, then `./start.sh dev` for hot reload across both the Python and Next.js sides. The script has five modes documented in a table: `./start.sh` for the full stack, `./start.sh dev` for the same with hot reload, `./start.sh dev:api` for the API alone with reload, `./start.sh dev:ui` for the frontend alone with HMR, and `./start.sh api` for a headless FastAPI instance on port 8000.

Two environment keys appear in the README beyond the LLM settings. `FIM_GUARDRAILS_OUTPUT` toggles output guardrails, which are optional. `AUTO_ROUTING` controls the ReAct-versus-DAG classifier. The README notes a default jailbreak-phrase detector that aborts a turn before the LLM is invoked, which saves tokens and shows a blocked notice in chat. That ordering is deliberate: the check runs before inference, not after.

The README points to a separate deployment guide for production concerns such as reverse proxy and zero-downtime updates. That guide is not reproduced in the repository README, so I cannot describe what it contains.

The Hook System is the most interesting design decision, and the least finished

Hooks run outside the LLM loop. That is the whole point. The README describes the Hook System as deterministic enforcement, which places it in contrast to guardrails that depend on the model's own compliance. A hook fires regardless of what the model decides.

One hook ships today: `FeishuGateHook`, which gates sensitive tool calls behind a human approval card posted to a Feishu group. That is a narrow but sensible first implementation. It gives a concrete approval path for a China-market IM platform, which is consistent with the rest of the product's positioning.

The README then lists what is planned for v0.9: audit logging, read-only-mode guards, and rate limits. Those three are the ones most enterprises would want first, and they are not shipped. Anyone adopting today gets exactly one hook. If your compliance requirement is an audit trail of every tool call, the platform does not yet provide it out of the box, and you would be writing that hook yourself against an extension point whose API surface the README does not document.

This is the clearest gap between the marketing frame and the current state. Deterministic enforcement outside the model loop is a good architecture. One shipped hook is a thin implementation of it.

Where FIM One is the wrong tool

Start with the licence. The repository metadata reports the licence as NOASSERTION, and the README badge reads Source Available rather than naming a standard licence. Those two facts together mean you cannot assume the rights that come with Apache 2.0 or MIT. Source Available covers a wide range of terms, from near-permissive to heavily restricted on commercial use, hosting and modification. The README does not state which. If your organisation has a dependency policy that requires an OSI-approved licence, this project fails that check until someone reads the actual licence file.

Second, there are no published releases. The releases list is empty, and the default branch is master. That means no version tags to pin, no changelog entries in the repository to diff between versions, and no release artefacts. The README references a changelog at docs.fim.ai, which is off-repository. For a team that needs reproducible builds and a documented upgrade path, tracking master is the only option the repository itself offers. The last push date is 2026-09-06, so the project is active, but activity is not the same as a release process.

Third, the platform's centre of gravity is a specific geography. If your systems are entirely Western SaaS and standard open-source databases, the connector advantage that justifies the project's existence does not apply to you, and you would be taking on a Source Available dependency for no gain.

Fourth, the cloud offering at cloud.fim.ai is described as early access. The README presents it as a way to skip setup, which is accurate, but early access means the managed path carries its own instability. Choosing cloud does not remove the self-hosted questions about licence and releases; it defers them to a vendor whose terms are outside this repository.

How it compares to Dify and LangGraph, and where the difference actually lies

Dify is the closest comparison on deployment shape. It is a self-hosted, Apache 2.0 licensed platform for building LLM applications, with a visual workflow editor and a plugin marketplace. The difference in approach is where the workflow lives. Dify asks you to author a workflow graph in its editor, and the graph is the artefact you maintain. FIM One generates the DAG at runtime from an LLM decomposition, with re-planning up to 3 rounds. Dify gives you a diagram you can read and version. FIM One gives you a plan you did not write and cannot fully predict. For regulated processes where the execution path must be auditable in advance, Dify's authored graph is the safer shape, and FIM One's runtime planning is a liability rather than a feature.

LangGraph is the other axis. It is a code-first library, not a platform. You define agent state and transitions in Python, and you own the deployment, the UI and the connectors. FIM One ships the UI, the portal, the admin account flow and the connector layer as part of the product. The trade is control for integration work. With LangGraph you write the DingTalk connector yourself; with FIM One the README says the connector set already covers it. If your team would rather own the whole stack in code, LangGraph is the more honest fit, because FIM One's value is precisely the parts you would otherwise build.

The China-stack connectors are the one dimension where neither comparison is close. Dify's database and IM support does not centre on DM, KingbaseES, GBase, Highgo, Feishu, WeCom or DingTalk in the way FIM One's README does. That is the defensible reason to pick this project over either alternative.

Maintenance cost and the questions to resolve before you commit

The local development path pins Python 3.11 or later, uv, Node.js 18 or later and pnpm, plus a frontend build. That is a two-runtime stack, and upgrades touch both. The `start.sh` script centralises the entry points, which helps, but there is no documented migration procedure between versions, because there are no published versions to migrate between.

The licence question is the one that needs a human answer, not a summary. NOASSERTION in repository metadata means GitHub could not map the licence file to a known identifier. Read the file. If it restricts commercial hosting or requires attribution in a form your legal team has not approved, that changes the adoption decision more than any technical detail in this review.

Three checks are worth running before a pilot. Clone the repository and confirm which hooks exist in the source beyond `FeishuGateHook`, since the README lists audit logging, read-only-mode guards and rate limits as v0.9 work. Confirm that your specific database appears in the connector code rather than only in the README's list. And test the re-plan boundary directly: construct a task that fails three times and observe whether the run fails cleanly or returns a partial result, because the README does not say. Those three answers will tell you more about production readiness than the feature list does.

Editorial conclusion

FIM One is worth a pilot if your organisation already runs Feishu, WeCom, DingTalk, DM or KingbaseES alongside global SaaS, and you want one self-hosted agent core instead of stitching connectors yourself. It is the wrong choice if you need a permissively licensed dependency, a published release you can pin, or a platform whose roadmap is set outside a single vendor. Before adopting, verify three things: the actual terms behind the Source Available badge (the repository declares NOASSERTION, so read the LICENSE file directly), whether the Hook System beyond FeishuGateHook exists in the code you clone rather than only in the v0.9 note, and whether your target database is on the connector list in the README or merely adjacent to it.

Official sources

  1. fim-ai/fim-one on GitHub
  2. Issues
  3. Project website
  4. README
Community notes

Community notes