Model or dataset
superlinked/sie avatar
superlinked/sie

SIE serves a hundred models from one cluster, ships three Docker images all tagged latest, and declares no Python dependencies

Open-source inference server and production cluster for all the models your agent needs.

3,517 stars337 forksPythonApache-2.0

At a glance

What is it?
The Superlinked Inference Engine is a self-hosted inference server for agent workloads, Apache-2.0 licensed, with an OpenAI-compatible API, a catalog of per-task model configs, and Kubernetes and Helm deployment files. Its root Python project declares an empty dependency list, its TypeScript overrides block mixes unbounded floors with caret ranges, and the repository carries four lockfiles for three build systems.
Who is it for?
Use SIE if you want one self-hosted server to cover the model calls an agent makes, rather than a container per task, and if you are willing to choose a model per task from a catalog rather than a single model for everything. The design is coherent: one API shape, one cluster, models loaded on demand with eviction, and deployment files for the gateway, autoscaling and dashboards already in the repository.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Python, according to GitHub's language statistics.

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

From daily snapshots

Star history

  • superlinked/sie3,517 ★ · +1,121
Star history
Repository2026-08-042026-11-14
superlinked/sie2.4k3.5k

1,121 Stars in the last 102 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

Three container images, and every tag in the quickstart is latest

The quickstart gives three ways to start the server, and the last two are the deployment route you would actually use on a machine with a graphics card.

The first is native, on Apple Silicon or Linux, with a note that it requires Python 3.12, and it is a single install-and-run line.

bash
pip install "sie-server[local]" && sie-server serve

The second and third are the same container invocation with different image tags, one for the default bundle and one for a bundle covering models built on a newer version of the transformers library. Both publish the same host port and mount the same named volume for the model cache.

The reason for separate images is stated immediately after them: images are bundle-specific so that dependency-incompatible model families stay isolated.

That reasoning is sound. The tags are not. Every image reference in the quickstart ends in the floating tag, so a deployment written from these examples resolves to whatever was built last on that registry, and the third variant the file was about to show is cut off mid-sentence.

For a production inference server, the image tag is a version pin, and none of these three examples provide one.

The root Python project declares no dependencies and is not a distribution

The root manifest is four lines of project metadata and then an admission.

The project is named for the engine, its version is zero point zero point zero, and it describes itself as the inference engine. Its runtime dependency list is empty, an empty pair of brackets.

Then a tool section explains why: the repository root is a development environment, not a distribution, and the package flag is set accordingly.

Everything the server needs is declared further down, as workspace sources for five internal packages, and the workspace member list is explicit with a comment above it that says the allowlist defines the supported Python workspace boundary and never to infer membership from the packages directory.

So there are three layers of truth: an empty dependency list at the root, a hand-maintained list of members, and a comment forbidding anyone from generating that list from what is on disk. That last instruction is the interesting one, because it means a new package added under the directory does not become a workspace member, and nothing in the repository will tell you that you forgot.

The override block mixes ten unbounded floors with two caret ranges

The TypeScript side of the repository has an overrides block with twelve entries, and they are not written the same way.

Ten are floors with no ceiling: build tooling at or above one version, a form-data library at or above four, a tracing library at or above zero point six, a glob matcher, a CSS processor, a protobuf runtime, a query string parser, a bundler, a tar implementation, a UUID library and a websocket library, each with an open-ended greater-than-or-equal.

Two are caret ranges, which is the opposite policy: a floor and a ceiling.

The ten floors have no upper bound at all, so an install today and an install next year can resolve to majors that did not exist when the override was written. The two caret ranges will stop at their ceiling and start failing loudly instead.

The two caret entries are also the two build tools of the test and bundle chain, so the tools that break most often are the two with a ceiling, and the libraries everything else depends on are the ten that float.

None of this is wrong in isolation. Together it is a dependency policy written one line at a time by whoever last touched each library.

Four lockfiles, three build systems, one toolchain manager

The root listing shows what kind of repository this is.

There is a JavaScript manifest and a Python manifest and a Rust manifest. There are four lockfiles to match: one for the JavaScript workspace, one for Python, one for Rust, and one for a second JavaScript package manager that has no manifest at the root. There is a toolchain manager configuration file, a deny file for auditing Rust dependencies, a coverage configuration, and both a release configuration and a release manifest.

The Rust manifest is the tidiest of the three. It is a virtual workspace over four public crates, with a resolver version and a comment explaining that the root manifest, the lockfile and the deny file are published verbatim so that a public checkout is a complete, buildable workspace.

The JavaScript manifest is less tidy. It declares its workspaces inline, with five paths, while a separate workspace file for the other package manager sits at the root as well.

So the same repository runs three build systems and resolves dependencies through four mechanisms. That is a fair price for a project whose gateway, sidecar and telemetry components are written in a systems language while its server and SDKs are not.

Two models serve both structured output and the agent loop

The task table lists ten tasks, and reading down the model column shows that the catalogue is smaller than the table.

Two models appear in two rows. A 27B model in its floating-point-eight variant and a 27B model in its full-precision variant are listed under structured output, and the same pair is listed again under running the agent loop. So the table's ten tasks are served by fewer models than the rows suggest.

That is a design decision worth noticing rather than a defect. A general-purpose instruction model that can emit schema-valid JSON can also drive a tool loop, and serving one set of weights for both means one model resident instead of two.

Elsewhere the names encode more than they appear to. Config file names are built from the repository owner and the repository, joined by two underscores, so two models that look unrelated in a list can be seen to come from the same organisation once you read their paths. One document-conversion model carries a version string with a year and month embedded in it, and the floating-point-eight variant's name records the quantisation in the file path rather than in the short identifier you would pass to the SDK.

The summary names two model families that no task row uses

The About section describes the catalogue in one line, and the line does not match the table.

It names a handful of model families as pre-configured, and two of them never appear again. The first task table has ten rows covering retrieval, document conversion, structured output, decisions, classification, safety, the agent loop, translation, images and audio, and not one of those rows references either of the two families named in the summary.

The summary is also the place where a benchmark claim lives: embedding and retrieval models are said to be benchmarked on a public leaderboard. That is a claim about the models rather than about the server, which is fair, and the table then lists four retrieval models without saying which of them were the benchmarked ones.

It is a small thing, but it is the kind of small thing that matters in a catalogue whose entire purpose is that you can look up a task and see what serves it. The summary describes a different catalogue from the one the table documents.

The quickstart ends mid-sentence and the paragraph after it ends mid-word

The last part of the README's quickstart is incomplete, and the incompleteness is informative about how the file is maintained.

The code block lists three startup routes. The third one begins as a comment describing a fourth route, an alternative GPU image for a different model family, and stops after the opening parenthesis and the first clause of that description.

The sentence after the block explains the bundle isolation policy and then stops after two letters.

So the README ends its own installation instructions mid-thought, twice, with the model families it was about to document absent.

That matters more here than it would in a mature project, because this README is unusually specific everywhere else. It names the identifiers you pass, distinguishes them from the upstream repository identifiers, links every model to its configuration file, and gives a table by architecture for each of the ten tasks. Somebody maintained all of that carefully.

The quickstart section is the part that was appended to, and it shows.

Two exact pins in the development group, and the file explains why

The Python development group has fifteen entries, and three of them are pinned to an exact version rather than a range.

A linter, a type checker and the package manager itself. Each one is pinned with an equality sign, no upper bound and no lower bound.

Two of the three come with a comment explaining the pin, and both explanations are about shadowing rather than about reproducibility. The package manager is pinned to the same version the toolchain manager installs, so that syncing all packages cannot replace the task runner's own executable with a different one, because an integration package pulls it in as a runtime dependency. The type checker is pinned so that a dependency's extra can be checked without depending on a provider library to arrive transitively.

That is careful work. A pin with a stated reason survives the next person who wonders whether it can be loosened.

The one thing missing is a note about the linter, which is pinned to the same precision without a reason given, which is the entry a future contributor will try to bump first.

Editorial conclusion

Use SIE if you want one self-hosted server to cover the model calls an agent makes, rather than a container per task, and if you are willing to choose a model per task from a catalog rather than a single model for everything. The design is coherent: one API shape, one cluster, models loaded on demand with eviction, and deployment files for the gateway, autoscaling and dashboards already in the repository. Three things to check before you run it in production. Which container image you need, because the images are split by dependency bundle and every tag in the README's examples is a floating latest, so the image you deploy is not pinned to anything. Which Python you run, because the root project requires a single minor version and declares no dependencies at all, which means the actual dependency set lives in the workspace members. And which task you are solving, because the same two 27B models serve both structured output and the agent loop, so the catalogue rows overlap more than the table suggests.

Frequently asked questions

What is the SIE Superlinked Inference Engine?

It is an Apache-2.0 licensed open-source inference engine for running the model calls behind an agent from one self-hosted cluster in your own cloud. It covers search and retrieval, document-to-markdown conversion, structured output, content safety, the agent loop itself, translation, transcription and vision, serving more than a hundred models and loading each on demand with least-recently-used eviction, rather than running a separate model server per task.

What API does SIE expose, and what does it integrate with?

An OpenAI-compatible API for drop-in migration, with embeddings, chat completions, completions and responses endpoints under the version one prefix. The README lists integrations with LangChain, LlamaIndex, Haystack, DSPy and CrewAI for orchestration, and with Chroma, Qdrant, Weaviate and LanceDB as vector stores. There is also a command line client and an agent-readable set of links.

How do I run SIE on my own machine?

Natively on Apple Silicon or Linux, which the quickstart says requires Python 3.12, by installing the server package with its local extra and running its serve command. On Linux with an NVIDIA card, run one of three container images, which differ by dependency bundle so incompatible model families stay isolated, all publishing port 8080 and mounting a named volume for the model cache. The quickstart deliberately uses the smallest model in each family for speed.

What are SIE's Python and TypeScript requirements?

The root Python project requires Python 3.12 up to but not including 3.13 and declares no runtime dependencies at all, because the root is a development environment rather than a distribution and the real dependencies live in workspace members whose membership is an explicit list. The TypeScript side is a package-manager workspace with a pinned package manager version and an overrides block, and the Rust side is a virtual workspace over four published crates.

How does SIE choose and load a model for a task?

Each task is a list of swappable models, and every name links to a configuration file. The configuration carries two identifiers: the one you pass to the SDK, and the upstream repository the weights load from, which usually but not always match. Models load on demand and are evicted least-recently-used, so a cluster can serve several at once without holding every one resident. The README says embedding and retrieval models are benchmarked on a public leaderboard.

How is SIE deployed and released?

Kubernetes and Helm configuration files ship in the repository for the load-balancing gateway, autoscaling and dashboards, and telemetry is a separate package rather than a library dependency. Releases are managed by a release automation tool, which is consistent with the tag cadence: three tags in the last week. One caveat is that every container image in the quickstart carries a floating latest tag, so the documented startup commands do not pin a version.

Official sources

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
Community

Where developers are discussing it

Posts on Hacker News, dev.to and Lobsters that link to this repository, found by our scan of those communities. 1 in the last 30 days; newest first.

Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/superlinked-sie.svg)](https://hysenlabs.com/projects/superlinked-sie)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/superlinked-sie.svg)](https://hysenlabs.com/projects/superlinked-sie)

Was this useful?