sie

superlinkedApache-2.0活跃维护

开源的推理服务器与生产集群,统一部署 Agent 所需的各类模型,涵盖嵌入、检索与 LLM 推理,省去自建服务与运维的麻烦。

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

v0.11.0发布于 2026-11-04 08:55 UTC3,480star +4 / 7 天332fork同步于 2026-11-10 05:39 UTC

怎么上手

由 README 提炼,执行前请确认
pip install "sie-server[local]" && sie-server serve
# 或
docker run --gpus all -p 8080:8080 -v sie-hf-cache:/app/.cache/huggingface ghcr.io/superlinked/sie-server:latest-cuda12-default
硬件要求按 README 说明

支持 Linux NVIDIA GPU(docker run --gpus all)与纯 CPU 镜像;macOS Apple Silicon 或 Linux 可原生安装,需 Python 3.12。README 未给出具体显存要求。

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

项目说明

由 README 自动翻译提炼

自托管推理引擎,用一个集群统一服务 Agent 所需的全部开源模型

开源的推理服务器与生产集群,统一部署 Agent 所需的各类模型,涵盖嵌入、检索与 LLM 推理,省去自建服务与运维的麻烦。

核心能力

  • 提供 OpenAI 兼容接口,可无缝迁移 embeddings、chat 和 completions
  • 预置 100+ 模型目录,按需加载并用 LRU 淘汰
  • 单集群同时服务多模型,覆盖检索、OCR、结构化抽取、审核、翻译、语音
  • 内置 Kubernetes 与 Helm 配置,含网关、KEDA 自动扩缩和 Grafana 面板
  • 集成 LangChain、LlamaIndex、Haystack、DSPy、CrewAI 及主流向量库

容易踩的坑

镜像按依赖包区分,LightOnOCR、GLM-OCR、PaddleOCR-VL 需用 sglang-vision-extract 镜像,GLiNER2.5-Decide 等需 transformers5 镜像,default 镜像不含这些模型;每个模型首次调用会从 Hugging Face 下载权重,需预留缓存卷和等待时间;服务默认监听 8080 端口,可用 /readyz 检查就绪。

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

最近发版

5 个版本v0.11.0
  1. v0.11.0最新正式版2026-11-04 · 2026-11-04 08:55 UTC

    0.11.0 (2026-11-03)

    This release expands the model catalog and client compatibility, with fixes across extraction, generation, and self-hosted deployment.

    ⚠ BREAKING CHANGES

    • rust: adopt maintained Candle ZIP 9 backport (#765)

    New models

    • google: google/embeddinggemma-2.
    • ibm-granite: ibm-granite/granite-speech-5.0-2b.
    • perplexity-ai: perplexity-ai/pplx-decider-flash-v1.2, perplexity-ai/pplx-decider-v1.1-27b.
    • VAGOsolutions: VAGOsolutions/SauerkrautLM-MoEdernColBERT-115M.
    • xiaomi-research: xiaomi-research/Xiaomi-OCR-0.

    Features

    • EmbeddingGemma 2 provides text-only embeddings through the transformers5 bundle, requiring Transformers 5.19 or later.
    • Granite Speech 5.0 adds speech-to-text extraction from audio.
    • Perplexity Decider answers typed choice and score questions from text-only inputs.
    • SauerkrautLM MoEdernColBERT provides text multivector embeddings and scoring with an FP32 serving profile.
    • Xiaomi OCR extracts documents, text, tables, and formulas from images, using SGLang by default.
    • The gateway and single server accept Anthropic Messages clients at /v1/messages; token counting is not served. System One and OpenAI Decisions compatibility includes Python and TypeScript client support.
    • Opt-in runtime LoRA supports standard BERT and unquantized XLM-R rerankers, plus GLiNER2 entity extraction; cold entity-adapter requests return 503 LORA_LOADING and must be retried after readiness.
    • Self-hosted servers support opt-in token authentication, with default-off Helm token generation for gateways and workers.

    Bug fixes

    • MADLAD loads artifacts from Hugging Face's shared blob store and removes Moses entity escaping; French elision is rejoined only for French targets.
    • Model fixes correct BERT scoring on Apple Silicon CPU, BGE Flash embedding addition order, independent GTE code revisions, and ColBERT unknown-token handling; Snowflake Arctic Embed loads without xformers, and Qwen3.6-27B's H100 profile fits one H100 80GB.
    • GLiNER preserves word pieces and counts long-word tokens once across windows; GLiNER2 preserves repeated mentions and isolates malformed results, with corrected document-window usage. Docling text and Markdown exports retain picture text.
    • Chat fixes preserve MLX thinking-model answers, keep long tool calls alive, accept OpenRouter's final usage events, and render single-server tools as sent; upstream input refusals return 400, and other upstream failures expose safe reason codes.
    • Grammar requests retain explicitly named remote profiles, and queued native prompts reach chat-only upstreams as one user turn; typed decisions resolve aliases and preserve refusal and malformed-output errors.
    • LoRA fixes preserve selectors and profile defaults across clients, roll back failed attachment, resolve declared adapters through configured caches, support partial QKV adapters in SGLang, and release GPU slots on unload.
    • The CLI honors environment cache and Hub-fallback settings; cluster downloads stay within their destination, and bundle images constrain compatible dependencies to uv.lock.
    • Whisper restores SDPA after word-timestamp requests; sidecar scheduling separates long audio from clips, idle workers wake for admitted work, and the model-loading Prometheus metric retains its KEDA-compatible name.

    Performance improvements

    • GLiNER loads faster by constructing encoders on the target device, falling back to CPU construction if GPU memory is insufficient.

    Upgrade notes

    • Candle now uses ZIP 9, which tries UTF-8 filenames before CP437 regardless of the filename flag. Some NPZ/PTH archive names therefore decode differently; review affected archives before upgrading. Safetensors is unaffected.
    • LoRA requests must select adapters declared by the chosen profile or receive 400. Move experimental CrossEncoder lora_paths profiles to `
  2. v0.10.12026-10-13 · 2026-10-13 23:10 UTC
    查看更新说明

    0.10.1 (2026-10-13)

    Features

    • add high-resolution Gemma thinking profile (#677) (e619232)
    • api: opt-in reasoning_content on chat completions via include_reasoning (#728) (24400df)
    • config: let a remote profile declare its own context window (#730) (530dcde)
    • examples: add a full-frame Earnings21 URL caller (#680) (461189b)
    • examples: add a portable Workflow DEV32 runner (#671) (5a6180f)
    • examples: add image OCR and fixed-page evaluation (f7ba07f)
    • examples: add portable Markdown frame runner (#670) (ca6980f)
    • examples: coding agent with OpenCode, with an agent-loop conformance check (#727) (d59e8a1)
    • examples: expose workflow32 top-k sampling (#686) (a23013c)
    • examples: let the typed-decisions workflow32 runner set temperature (#679) (415f2f4)
    • models: claim tool calling on GLM-5.3-Flash (#726) (3d39f37)
    • sdk: default to SIE Serverless when an API key is set and no base URL is given (#691) (d680237)
    • sdk: type SIE Relay refusals and attach request metadata to TypeScript errors (#689) (c571e0a)
    • server: add LightOnOCR-3-4B model config (#666) (51f03ff)
    • server: cap private reasoning with a per-profile thinking budget on SGLang (#700) (6c33b38)
    • server: report SGLang vision extract prompt and completion tokens per item (#673) (b0020ff)
    • server: serve LightOnOCR-3-4B on SGLang by default (#668) (a753964)
    • server: serve the PII redaction composition as superlinked/pii-redact (#692) (766f799)
    • server: show json_schema response formats
  3. v0.10.02026-10-09 · 2026-10-09 20:43 UTC
    查看更新说明

    0.10.0 (2026-10-09)

    ⚠ BREAKING CHANGES

    • server: a LoRA whose PEFT config sets bias to "all" or "lora_only" no longer loads. A profile that declares one still loads its model without that LoRA and logs the refusal. A request that names one gets the same retryable LORA_LOADING response as for any other LoRA that fails to load in the background, and the server log carries the refusal. Retrain or export the LoRA with bias="none".

    Features

    • config: accept hybrid encode and score routing in a cluster (#576) (96de71c), closes #415
    • config: refuse a remote profile that names an undefined upstream (#500) (4977097)
    • examples: add bounded agent stage latency trials (2326f19)
    • examples: add custom-entity-types, caller-named entity types against LLMs, Comprehend and spaCy (#468) (7860d1f)
    • examples: add reproducible agent stage latency evaluation (aa20315)
    • examples: add reproducible photo transcription study (#630) (a826a95)
    • examples: add structured-output-accuracy, strict structured outputs scored on the Structured Output Benchmark (#474) (96b7f9b)
    • examples: compare matched short-verdict guardrails configurations (#479) (3ebda81)
    • examples: document-to-markdown-olmocr prints the score without the math files (#459) (37e1380)
    • examples: evaluate ordinary named entity tags (#629) (4ecec8a)
    • examples: rebuild guardrails as a harmful-prompt screening study (#456) (01e606e)
    • examples: rebuild image-search on a held-out Amazon Berkeley Objects product catalogue (#470) (8041b15)
    • examples: rebuild redact on the pre-registered PII coverage run (#452) (f99850a)
    • examples: rebuild visual-document-search on the ViDoRe v3 head-to-head (#472) (832f561)
    • examples: replay document-field extraction evidence (#511) (971f2d4)
    • examples: reproduce caller-rule rerank study (#485) ([c5df8f9](https://github.com/
  4. v0.9.02026-09-30 · 2026-09-30 13:19 UTC
    查看更新说明

    0.9.0 (2026-09-30)

    ⚠ BREAKING CHANGES

    • helm: nats.auth.enabled defaults to true. Upgrading restarts NATS and rolls sie-config, the gateway, and the workers; pods that have not rolled yet are refused until they do, and memory-backed queued work is lost as on any NATS restart. To avoid the gap, upgrade once with nats.auth.allowAnonymous=true, then again without it. helm upgrade --reuse-values now fails the render because the reused NATS values lack the server wiring; use --reset-then-reuse-values or -f. With an external NATS server (nats.install=false), set nats.auth.existingSecrets.{config,gateway,worker} and create the users, or set nats.auth.enabled=false. nats-box and the NATS helm test pod are disabled by default. Credentials embedded in SIE_NATS_URL are not used.
    • helm: values-aws.yaml, values-gke.yaml, and values-aks.yaml no longer enable the gateway Ingress, so a plain upgrade with them removes the existing host-less, TLS-less Ingress. A gateway Ingress now renders only with gateway auth (gateway.auth.mode=static with gateway.auth.tokenSecretName), the oauth2-proxy edge on ingress-nginx, or ingress.allowUnauthenticated=true, and only with TLS or ingress.allowPlaintext=true; set both opt-ins to keep the previous catch-all Ingress. A LoadBalancer or NodePort gateway Service needs gateway auth or gateway.service.allowUnauthenticated=true. POST /v1/pools now rejects a warm floor above SIE_GATEWAY_POOL_MAX_MINIMUM_WORKER_COUNT (default 4) or a TTL above SIE_GATEWAY_POOL_MAX_TTL_S (default 3600) with 400, a pool beyond SIE_GATEWAY_MAX_POOLS (default 64) or named default with 403. The Python and TypeScript SDKs now send SIE_API_KEY when no API key is passed and the base URL has the same origin as SIE_BASE_URL; pass an empty API key to opt out.
    • config: the gateway no longer receives the sie-config admin token, so with gateway auth enabled its admin routes (POST, PUT and DELETE under /v1/pools, /v1/admin and /v1/configs) answer 403 until gateway.auth.adminTokenSecretName is set. sie-config, gateway and worker sidecar images older than this chart do not work with the split tokens.

    Features

    • examples: add document-to-markdown-olmocr, LightOnOCR-2-1B on all of olmOCR-Bench (#441) (934a2a6)
    • examples: add support-assistant-policy, the /chat support-rules run (#438) (533ed0f)
    • generation: report prefix-cache hits as usage.prompt_tokens_details.cached_tokens (#386) (c125504)
    • helm: authenticate every NATS connection with per-component users (#421) (60f30ab)
    • models: add tencent/Hy-MT2-1.8B (#360) (08c111f)
    • models: add thinking profiles for Qwen3.8-27B-FP8 (#383) (ad87d96)
    • score: report the caller's content tokens separately from the reranker prompt template (#442) (b17a906)
    • server: add operator-defined upstreams with credential and egress controls (#431) ([fe22241](https://github.com/superlinked/sie/commit/fe22241111ea334d9caa
  5. v0.8.32026-09-26 · 2026-09-26 19:32 UTC
    查看更新说明

    0.8.3 (2026-09-26)

    Features

    • examples: add a typed-decisions verification example (#362) (d4e00b3)
    • examples: add watermark robustness eval (translation vs paraphrase) (#296) (a7c37ac)
    • examples: refresh typed-decisions evidence on a faster server and add GLiNER2.5-Decide (#376) (8b4dc45)
    • server: add GLiFormer multi-task extraction models (#358) (28a07f5)
    • server: encode GLiClass label groups separately by default (#364) (71b395f)
    • server: GLiClass task prompts, few-shot examples and label groups, plus instruct, Opir and multilingual models (#355) (bc1d66e)
    • server: relations from GLiNER relex models, plus GLiNER bi-encoder v2 and PII models (#356) (5914e91)
    • server: replay GLiClass forwards as CUDA graphs (#367) (7afc169)
    • server: serve GLiNER2.5-Decide typed-decision models (#368) (2bbbc54)
    • server: serve Laya typed-decision models through extract (#353) (5162aa7)

    Bug Fixes

    • examples: follow the screenshot-mining and multi-vector page selections (#349) (72c74bb)
    • examples: score /structured-output's amended run, and drop the last display claim (#352) (26c81c2)
    • examples: score the detect and image-classify pages as they now publish (#350) (e48c1a6)
    • examples: score the redact composition, and stop both examples describing their pages (#357) (e9815c3)
    • examples: stop chat and caption-vqa describing what their pages display (#351) (2e3c45e)
    • examples: stop guardrails and speech-to-text describing what their pages display (#354) (79ae97e)
    • gliformer: bound span decoding and keep padding out of it (#375) (0ee26b0)

用户点评

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

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

    README 原文

    未翻译

    License PyPI GitHub stars

    ⭐ Help us reach more developers and grow the SIE community. Star this repo!

    About

    SIE is an open-source inference engine that runs the models behind every agent task through one API: search and retrieval, document-to-markdown conversion, structured output, content safety, the agent loop itself, and the translation, transcription, and vision calls around it. It replaces the patchwork of a separate model server per task with one system that serves 100+ models, loading each on demand.

    • OpenAI-compatible API for drop-in migration: /v1/embeddings, /v1/chat/completions, /v1/completions, /v1/responses
    • Pre-configured model catalog: Stella, SPLADE, Qwen3, GLiNER, SigLIP, and more; embedding and retrieval models benchmarked on MTEB
    • Serves multiple models simultaneously with on-demand loading and LRU eviction
    • Ships Kubernetes and Helm deployment configs for the load-balancing gateway, KEDA autoscaling, and Grafana dashboards
    • Integrates with LangChain, LlamaIndex, Haystack, DSPy, CrewAI, Chroma, Qdrant, Weaviate, and LanceDB

    Tasks

    One SIE cluster runs the inference behind a whole agent. Each task is a handful of swappable models; every name below links to its config, whose sie_id is the model name you pass to the SDK (hf_id is the Hugging Face repository the weights load from; the two usually match). Browse packages/sie_server/models/ for the full set.

    TaskWhat it doesModels
    SearchEmbed, match, and rerank to retrieve the right context.bge-m3, splade-v3, colbertv2, qwen3-reranker
    Document to markdownPDFs, Office files, and scans become clean markdown.lightonocr-3, lightonocr, glm-ocr, mineru, paddleocr-vl, docling
    Structured outputSchema-valid JSON, extracted or generated.gliner2, gliner-relex, gliformer, nuner-zero, qwen3.8-27b, qwen3.6-27b
    DecideChoice, yes/no, and score answers with probabilities to typed questions about a text or JSON state.laya, laya-multilingual, laya-typed-decisions, gliner2.5-decide, gliner2.5-multi-decide, gliner2.5-decide-1b
    ClassifyZero-shot labels, with several label groups answered in one call. The instruct models also follow a task instruction and few-shot examples.gliclass-large-v3, gliclass-instruct-large, gliclass-multilang-mini
    Guard contentA safety verdict: Safe, Unsafe, or Controversial with the unsafe categories; Yes/No with the threshold set in the model config; or safe/unsafe and policy-label scores with the threshold chosen per request.qwen3guard-gen-4b, granite-guardian-2b, opir-multitask-large, opir-edge
    Run the agent loopPlan steps and call tools with an open LLM, streaming included.qwen3.8-27b, qwen3.6-27b
    TranslateText between 400+ languages.madlad400-3b-mt
    See imagesCaption, detect objects, and answer questions about images.florence-2, owlv2, grounding-dino
    Transcribe audioSpeech to text.whisper-large-v3-turbo

    Quickstart

    The quickstart uses the smallest model in each family so the first run is fast on a laptop. Swap in any model from the table above for production quality.

    1. Start the server

    # macOS (Apple Silicon) or Linux, native (requires Python 3.12)
    pip install "sie-server[local]" && sie-server serve
    
    # Linux, NVIDIA GPU
    docker run --gpus all -p 8080:8080 \
      -v sie-hf-cache:/app/.cache/huggingface \
      ghcr.io/superlinked/sie-server:latest-cuda12-default
    
    # Linux, NVIDIA GPU: Transformers 5 models (`:transformers` OCR profiles, GLiNER2.5-Decide, and TopK-Embed-V1)
    docker run --gpus all -p 8080:8080 \
      -v sie-hf-cache:/app/.cache/huggingface \
      ghcr.io/superlinked/sie-server:latest-cuda12-transformers5
    
    # Linux, NVIDIA GPU — SGLang vision OCR (default profiles of LightOnOCR-3, LightOnOCR-2, GLM-OCR, PaddleOCR-VL)
    docker run --gpus all -p 8080:8080 \
      -v sie-hf-cache:/app/.cache/huggingface \
      ghcr.io/superlinked/sie-server:latest-cuda12-sglang-vision-extract
    
    # Linux, CPU
    docker run -p 8080:8080 \
      -v sie-hf-cache:/app/.cache/huggingface \
      ghcr.io/superlinked/sie-server:latest-cpu-default
    

    Docker images are bundle-specific so dependency-incompatible model families stay isolated. Use the sglang-vision-extract image for LightOnOCR-3, LightOnOCR-2, GLM-OCR, and PaddleOCR-VL, or the transformers5 image for the :transformers profiles of LightOnOCR-3, LightOnOCR-2, and GLM-OCR, the GLiNER2.5-Decide models, and the TopK-Embed-V1 models; the default image intentionally does not advertise them.

    # in a second terminal
    curl http://localhost:8080/readyz   # expect: ok
    

    The server speaks the OpenAI API out of the box, embeddings and generation alike (the cluster gateway serves /v1/chat/completions, /v1/completions, and /v1/responses). Your first call needs nothing but curl:

    curl http://localhost:8080/v1/embeddings \
      -H 'Content-Type: application/json' \
      -d '{"model": "sentence-transformers/all-MiniLM-L6-v2", "input": "Hello world"}'
    # {"object": "list", "data": [{"object": "embedding", "embedding": [-0.0344, 0.0310, ...
    

    Each model's first call downloads its weights (progress appears in the server terminal). Later calls skip the download; inference latency depends on the model, task, hardware, and batch size.

    2. Install the SDK

    pip install sie-sdk                # Python
    npm install @superlinked/sie-sdk   # TypeScript (pnpm and yarn work too)
    

    3. Generate embeddings, rerank, and extract entities

    from sie_sdk import SIEClient
    from sie_sdk.types import Item
    
    client = SIEClient("http://localhost:8080")
    
    # Generate embeddings
    result = client.encode("sentence-transformers/all-MiniLM-L6-v2", Item(text="Hello world"))
    print(result["dense"].shape)  # (384,)
    
    # Rerank search results
    scores = client.score(
        "cross-encoder/ms-marco-MiniLM-L-6-v2",
        Item(text="What is machine learning?"),
        [Item(text="ML learns from data."), Item(text="The weather is sunny.")],
    )
    print(scores["scores"][0])  # {'item_id': 'item-0', 'score': -7.1, 'rank': 0}
    
    # Extract entities
    result = client.extract(
        "urchade/gliner_multi-v2.1",
        Item(text="Tim Cook is the CEO of Apple."),
        labels=["person", "organization"],
    )
    print(result["entities"][0])
    # {'text': 'Tim Cook', 'label': 'person', 'score': 0.992, 'start': 0, 'end': 8, ...}
    
    # Entities and a schema-valid record from one forward pass
    result = client.extract(
        "knowledgator/gliformer-base-v1",
        Item(text="Refund request from Maria Lopez for order 4471 was denied: the item was returned after 45 days."),
        labels=["person"],
        output_schema={
            "type": "object",
            "properties": {
                "order number": {"type": "string"},
                "reason": {"type": "string"},
                "decision": {"type": "string", "enum": ["approved", "denied", "escalated"]},
            },
        },
    )
    print(result["data"])
    # e.g. {'order number': '4471', 'reason': 'the item was returned after 45 days', 'decision': 'denied'}
    

    Typed decisions ask one or more typed questions about each item (a text, or a JSON object or conversation passed as metadata={"state": ...}) and return an answer with probabilities per question in data. laya and laya-typed-decisions calibrate the probabilities with their shipped temperatures; laya-multilingual ships none, so its probabilities are the raw softmax. usage.input_tokens counts every (item, question) row the model encodes: the state's tokens plus the question's, once per question. An item may use up to 32,768 row tokens (questions × max_len), so the 1024-token laya-multilingual and laya-typed-decisions take up to 32 questions per request and laya up to 64.

    result = client.extract(
        "convaiinnovations/laya",
        Item(text="Hi, we were billed twice for March. Please refund the duplicate today."),
        output_schema={
            "department": {"type": "choice", "instructions": "Which team should handle this?",
                           "criteria": {"billing": "invoices, payments, refunds", "technical": "bugs, outages"}},
            "refund_requested": {"type": "noul", "instructions": "Does the user ask for a refund?"},
            "urgency": {"type": "score", "instructions": "How urgent is this?", "criteria": ["low", "medium", "high"]},
        },
    )
    print(result["data"]["department"])  # values are illustrative and rounded
    # {'type': 'choice', 'choice': 'billing', 'probabilities': {'billing': 0.987, 'technical': 0.013}, 'confidence': 0.9}
    

    The GLiNER2.5-Decide models (fastino/GLiNER2.5-Decide for English, GLiNER2.5-multi-Decide, and GLiNER2.5-Decide-1B), served by the transformers5 image from step 1, take the same questions, GLiClass-style options={"label_groups": {...}}, or plain labels, and return every option's probability. They read all of a call's questions next to the document in one row per item: one forward pass answers them all, and each question's probabilities depend on the other questions sent with it. A score question is read as the ordinal labels "0" to "k-1", each described by its criterion; a noul question as "yes"/"no". usage.input_tokens counts the document tokens the model reads plus the questions' instructions and criteria text; question ids and label names are not counted.

    result = client.extract(
        "fastino/GLiNER2.5-Decide",
        Item(text="Guest in room 1408 says the AC has been out since yesterday and wants to move rooms tonight."),
        output_schema={
            "intent": {"type": "choice", "instructions": "What does the guest want?",
                       "criteria": {"room_change": "move to another room", "maintenance": "fix something", "checkout": None}},
            "needs_human": {"type": "noul", "instructions": "Must a person act on this?"},
            "urgency": {"type": "score", "instructions": "How urgent is this?", "criteria": ["low", "normal", "high", "urgent"]},
        },
    )
    print(result["data"]["intent"])  # values are illustrative and rounded
    # {'type': 'choice', 'choice': 'room_change',
    #  'probabilities': {'room_change': 0.871, 'maintenance': 0.085, 'checkout': 0.045}, 'confidence': 0.57}
    

    Text generation runs on the GPU generation image; stop the first server, then start this one on the same port:

    # Linux, NVIDIA GPU (for generation on Apple Silicon via MLX, see the docs below)
    docker run --gpus all -p 8080:8080 \
      -v sie-hf-cache:/app/.cache/huggingface \
      ghcr.io/superlinked/sie-server:latest-cuda12-sglang
    
    result = client.generate(
        "Qwen/Qwen3-0.6B",
        "Reply with a single word: the capital of France.",
        max_new_tokens=16,
        temperature=0.0,
    )
    print(result["text"])  # Paris
    

    For generation on Apple Silicon (MLX), the TypeScript walkthrough, and every configuration in between, see the quickstart guide, TypeScript SDK docs, and SDK reference.


    Production

    The same code works against a production cluster. SIE ships a load-balancing gateway and Kubernetes deployment surface, including Helm charts, KEDA autoscaling (scale to zero), and Grafana dashboards. Public Terraform modules are maintained separately for Alibaba Cloud ACK, EKS, AKS, and GKE. Not just the server, the whole stack. All Apache 2.0.

    # pick one values overlay: values-ack.yaml / values-aws.yaml / values-aks.yaml / values-gke.yaml
    # (pin a chart version for reproducible installs, e.g. --version 0.7.3)
    helm upgrade --install sie-cluster oci://ghcr.io/superlinked/charts/sie-cluster \
      --namespace sie --create-namespace \
      --set hfToken.create=true \
      --set hfToken.value=YOUR_HF_TOKEN \
      -f https://raw.githubusercontent.com/superlinked/sie/main/deploy/helm/sie-cluster/values-gke.yaml
    

    See the deployment guide.

    Telemetry

    sie-server sends anonymous usage telemetry so the maintainers can see which versions, platforms, and GPUs are in use. It is on by default in releases before 0.13.0. From 0.13.0 it is off unless SIE_TELEMETRY_ENABLED=1 is set. Until then, a server that sends it only because of the default logs a notice at startup.

    Each event is a JSON POST to https://telemetry.superlinked.com/api/telemetry (SIE_TELEMETRY_URL overrides the endpoint) with these fields:

    FieldValue
    worker_idA random UUID generated on first start and stored in the server data directory (SIE_DATA_DIR)
    sent_atThe send time (UTC)
    eventinit, update, or terminate
    sie_versionThe installed sie-server version
    variantSIE_VARIANT: the image platform and bundle, set by the Helm chart (null otherwise)
    os, archOperating system and CPU architecture
    gpusGPU model names
    deployment_envSIE_DEPLOYMENT_ENV (default unknown)

    The receiver derives country, region, and city from the request's source IP address and does not store the address. No request data, hostnames, or file paths are sent.

    init is sent at start, the first update 45 to 75 minutes later, then one update every 55 to 65 minutes, and terminate at shutdown.

    • Opt in: SIE_TELEMETRY_ENABLED=1.
    • Opt out: SIE_TELEMETRY_DISABLED=1 or DO_NOT_TRACK=1, which always win, or SIE_TELEMETRY_ENABLED=0.
    • SIE_TELEMETRY_ENABLED and SIE_TELEMETRY_DISABLED accept 1, true, yes, on and 0, false, no, off, in any case. Any other value of either turns telemetry off with a warning.

    Every start logs the state and where it came from, for example telemetry: on (default) or telemetry: off (DO_NOT_TRACK). The Helm chart's telemetry.enabled default also changes to false in 0.13.0; see the chart README. Policy: superlinked.com/policies/telemetry.


    Explore

    Model catalog: every model is a config in packages/sie_server/models/; pass its sie_id to the SDK.

    Integrations: setup guides for all nine framework and vector-store integrations, in Python and TypeScript.

    Examples: An end-to-end project gallery.

    MCP edge: offload document, image, and structured-output work from Claude and other MCP clients to your cluster and save agent tokens.

    Why we built SIE: The motivation, told at AI Engineer Europe 2026.


    Development

    Read CONTRIBUTING.md for the complete development workflow and AGENTS.md for repository automation boundaries.

    Install mise, then bootstrap the versioned Python, Rust, Node.js, and Helm toolchains from the repository root:

    ./tools/init.sh
    

    The common development checks and local server are available as mise tasks (mise tasks lists them all):

    mise run test
    mise run lint
    mise run typecheck
    mise run serve
    mise run rust-check
    mise run rust-test
    mise run gateway-test
    mise run server-sidecar-test
    mise run helm -- dependencies
    mise run helm -- lint --set payloadStore.enabled=false
    mise run helm -- template --set payloadStore.enabled=false
    

    The Python workspace uses the committed root lock. Package membership is explicit in pyproject.toml; a package joins the workspace only in the same change that adds its complete source. Native audio is always an opt-in build: install cmake, then run mise exec -- uv sync --frozen --project . --all-packages --all-extras.