{"slug": "typed-lm-a-rust-jev-open-source-alternative", "title": "Typed-lm: a Rust jev open source alternative", "summary": "Neurono ML released typed-lm, an Apache-2.0 Rust inference engine that turns dense decoder models including Llama, Qwen2, Qwen3, Mistral, Gemma, Gemma2 and Gemma3 into a typed semantic-routing API returning booleans, choices and scores instead of generated text. On a single RTX 3070 with F16 weights, a full request with a 64-token prefix completes in 14 ms prefill plus 36 ms for five batched suffixes, and the recommended CPU mode, a GGUF Q4_K_M checkpoint with the mkl feature, cuts 64-token prefill from a 3.13 s baseline to 0.52 s. The project is drop-in compatible with the Jev (TypeSafe AI) contract and supports LoRA, QLoRA and full training against the same decision-position loss read at inference.", "body_md": "`Deterministic inference · Adapter training · Apache-2.0`\n\n**typed-lm** turns dense decoder models — Llama, Qwen2, Qwen3, Mistral, Gemma,\nGemma2 and Gemma3 — into a typed semantic-routing API. Send a *state* and typed\n*questions*; receive booleans, choices and scores your code can branch on. No\ntext generation, no parsing.\n\n| **7** | **3** | **4** | **1** | \n|---|---|---|---|\n| dense model families | question primitives | training methods | forward pass per request | \n\nOne forward pass means **milliseconds, not seconds**. On a single RTX 3070 with\nF16 weights, a full request — the shared prefill plus five batched question\nsuffixes — is answered in tens to hundreds of milliseconds.\n\n**GPU** (release, Qwen2.5-1.5B, `F16`, RTX 3070):\n\n| Prefix | prefill | 5 batched suffixes | single next token | \n|---|---|---|---|\n| 64 | **14 ms** | **36 ms** | **52 ms** | \n| 256 | **31 ms** | **81 ms** | **65 ms** | \n| 1024 | **154 ms** | **379 ms** | **64 ms** | \n\nAdding a question adds a suffix to the same batched pass, not a new request, so latency grows with the prefix length — not with the number of questions.\n\n## **CPU numbers** (release, dense `F32`)\n\n| Prefix | Stage | Baseline | + CPU flash | + MKL | \n|---|---|---|---|---|\n| 64 | prefill | 3.13 s | 2.34 s | **0.52 s** | \n| 256 | prefill | 8.65 s | 4.97 s | **1.69 s** | \n| 1024 | prefill | 28.23 s | 20.66 s | **13.13 s** | \n| 64 | 5 batched suffixes | 1.44 s | 1.33 s | **0.25 s** | \n| 256 | 5 batched suffixes | 2.47 s | 1.98 s | **0.35 s** | \n| 1024 | 5 batched suffixes | 4.74 s | 4.59 s | **2.57 s** | \n\nThe recommended CPU mode is a GGUF `Q4_K_M` checkpoint with the `mkl` feature.\n\nThe session prefix cache skips the prefill entirely for repeated states. More in\n[benchmarks](https://neurono-ml.github.io/typed-lm/engineering/benchmarks.html).\n\nA large language model answers by generating text token by token. When your\nsoftware needs a judgment it can branch on, that creates a mismatch: you prompt,\nyou parse, you validate — and you still get a string. **typed-lm** removes the\nmismatch. It runs the model **once**, reads the logits at a single **decision\nposition**, and returns a typed value with a calibrated distribution.\n\n```\nflowchart LR\n  client[\"Client\"]:::neutral\n  request[\"state + questions\"]:::primary\n\n  subgraph model[\"typed-lm-serve\"]\n    direction TB\n    prefill[\"shared prefill\"]:::accent\n    batch[\"batched decision positions\"]:::accent\n  end\n\n  answers[\"typed answers<br/>noul · choice · score\"]:::success\n  code[\"your code<br/>branch · sort · route\"]:::success\n\n  client --> request --> prefill --> batch --> answers --> code\n\n  classDef primary fill:#ede9fe,stroke:#7c3aed,color:#3b0764,stroke-width:1.5px\n  classDef accent fill:#dbeafe,stroke:#2563eb,color:#0c4a6e,stroke-width:1.5px\n  classDef success fill:#d1fae5,stroke:#059669,color:#064e3b,stroke-width:1.5px\n  classDef neutral fill:#f4f4f5,stroke:#a1a1aa,color:#18181b,stroke-width:1.5px\n```\n\n| **⚡ One forward pass per request** All questions share a prefill and are evaluated in one batched pass. Adding questions barely changes latency. **🎯 Calibrated by training** LoRA, QLoRA and full training optimize the exact decision-position loss the server reads at inference. | **🧩 Jev-compatible** Drop-in compatible with the Jev (TypeSafe AI) contract: `noul` ,`choice` and`score` , combinable in one call. **📦 Servable artifacts** FP8/FP4 quantization and full/from-scratch checkpoints are served directly by the same binary. | \n\n| Question | Goal | Returns | \n|---|---|---|\n| **Noul** | Is this statement true? | `noul` (0.0 to 1.0) | \n| **Choice** | Pick one option from a closed set | `choice` ,`probabilities` ,`confidence` | \n| **Score** | Rate the state on ordered levels | `score` ,`legend` ,`probabilities` ,`confidence` | \n\nAll three can be combined in a single request, and each question is evaluated independently against the same state.\n\n```\nflowchart LR\n  state[\"state\"]:::neutral\n  noul[\"noul question\"]:::primary\n  choice[\"choice question\"]:::accent\n  score[\"score question\"]:::success\n  answers[\"answers map\"]:::success\n\n  state --> noul --> answers\n  state --> choice --> answers\n  state --> score --> answers\n\n  classDef primary fill:#ede9fe,stroke:#7c3aed,color:#3b0764,stroke-width:1.5px\n  classDef accent fill:#dbeafe,stroke:#2563eb,color:#0c4a6e,stroke-width:1.5px\n  classDef success fill:#d1fae5,stroke:#059669,color:#064e3b,stroke-width:1.5px\n  classDef neutral fill:#f4f4f5,stroke:#a1a1aa,color:#18181b,stroke-width:1.5px\n```\n\ntyped-lm is not just an inference server — it ships a **trainer** that turns a\ngeneral-purpose checkpoint into a specialist for *your* decisions. It optimizes\nthe **cross-entropy at the decision position**, the exact position the server\nreads, so what you train is what you serve.\n\n| **LoRA** | **QLoRA** | **Full** | **From-scratch** | \n|---|---|---|---|\n| adapters over a frozen base | adapters over a quantized base | every parameter | random init, deterministic | \n\n**Why train with typed-lm?**\n\n- **One objective, end to end** — the training loss is the serving decision, so\nthere is no train/serve skew.\n- **Cheap specialization** — LoRA/QLoRA store only the adapter tensors; the base\nis never duplicated.\n- **Your labels, your thresholds** — confidence is calibrated on your data.\n- **Quantize what you train** — FP8/FP4 PTQ and full/from-scratch checkpoints are\nserved by the same binary, with no merge step for complete checkpoints.\n\n```\nflowchart LR\n  dataset[\"dataset<br/>state + questions + answer\"]:::neutral\n  checkpoint[\"base checkpoint\"]:::accent\n  config[\"run configuration<br/>CLI or TOML\"]:::warning\n  train[\"train<br/>lora · qlora · full · from-scratch\"]:::primary\n  artifact[\"artifact<br/>adapter or checkpoint\"]:::success\n  quantize[\"quantize<br/>fp8 · fp4\"]:::accent\n  serve[\"typed-lm-serve\"]:::success\n\n  dataset --> train\n  checkpoint --> train\n  config --> train\n  train --> artifact --> serve\n  artifact --> quantize --> serve\n\n  classDef primary fill:#ede9fe,stroke:#7c3aed,color:#3b0764,stroke-width:1.5px\n  classDef accent fill:#dbeafe,stroke:#2563eb,color:#0c4a6e,stroke-width:1.5px\n  classDef success fill:#d1fae5,stroke:#059669,color:#064e3b,stroke-width:1.5px\n  classDef warning fill:#fef3c7,stroke:#d97706,color:#78350f,stroke-width:1.5px\n  classDef neutral fill:#f4f4f5,stroke:#a1a1aa,color:#18181b,stroke-width:1.5px\n# Train a LoRA adapter over a frozen checkpoint.\ntyped-lm-trainer train \\\n  --model-id /path/to/local/checkpoint \\\n  --dataset resources/dataset.jsonl \\\n  --output-directory output/train \\\n  --method lora --epochs 3 --batch-size 4 --learning-rate 1e-4\n\n# Merge the adapter and quantize to FP8.\ntyped-lm-trainer quantize \\\n  --model-id /path/to/local/checkpoint \\\n  --adapter-directory output/train \\\n  --quantization fp8 --output-directory output/quantized\n```\n\n| `--method` | Trainable parameters | Output | Serve directly? | \n|---|---|---|---|\n| `lora` (default) | LoRA `A` /`B` over a frozen checkpoint | `adapter.safetensors` | merge first | \n| `qlora` | LoRA over a quantized base | `adapter.safetensors` | merge first | \n| `full` | Every parameter from a checkpoint | complete checkpoint | **yes** | \n| `from-scratch` | Every parameter from random init (deterministic by `--seed` ) | complete checkpoint | **yes** | \n\nFull tutorial: [training](https://neurono-ml.github.io/typed-lm/training/index.html).\n\nThe fastest path — no toolchain, just an image. The server image pulls the model\non first startup and listens on `8080`:\n\n```\n# Server. Pass an HF_TOKEN for gated models and mount a context file if you have one.\ndocker run --rm -p 8080:8080 \\\n  -e HF_TOKEN=<hugging-face-token> \\\n  -v \"$PWD/resources/memory.md:/etc/typed-lm/memory.md:ro\" \\\n  -e CONTEXT_PATH=/etc/typed-lm/memory.md \\\n  ghcr.io/neurono-ml/typed-lm-serve:0.1.1\n\n# Ask three typed questions in one call.\ncurl -s http://127.0.0.1:8080/v1/systemone \\\n  -H 'Content-Type: application/json' \\\n  -d @examples/request_mixed.json\n```\n\nThe trainer runs the same way, with the artifacts directory mounted so the outputs survive the container:\n\n```\n# Train a LoRA adapter; /work holds the checkpoint, dataset and outputs.\ndocker run --rm -v \"$PWD:/work\" -w /work \\\n  -e HF_TOKEN=<hugging-face-token> \\\n  ghcr.io/neurono-ml/typed-lm-trainer:0.1.1 train \\\n  --model-id /work/checkpoint \\\n  --dataset /work/resources/dataset.jsonl \\\n  --output-directory /work/output/train \\\n  --method lora --epochs 3 --batch-size 4 --learning-rate 1e-4\n```\n\nFor a GPU, use the `:cuda` image (it includes the CUDA runtime libraries) and\npass `--gpus all`; the host only needs the NVIDIA driver and the container\ntoolkit:\n\n```\n# Server on GPU.\ndocker run --rm --gpus all -p 8080:8080 \\\n  -e HF_TOKEN=<hugging-face-token> \\\n  ghcr.io/neurono-ml/typed-lm-serve:cuda\n\n# Trainer on GPU.\ndocker run --rm --gpus all -v \"$PWD:/work\" -w /work \\\n  -e HF_TOKEN=<hugging-face-token> \\\n  ghcr.io/neurono-ml/typed-lm-trainer:cuda train \\\n  --model-id /work/checkpoint \\\n  --dataset /work/resources/dataset.jsonl \\\n  --output-directory /work/output/train \\\n  --method lora --device cuda --epochs 3 --batch-size 4 --learning-rate 1e-4\n# Install (CPU build; add --features cuda or --features metal for a GPU).\ncargo install typed-lm-serve typed-lm-trainer\n\n# Start the server (downloads the default model on first startup).\ntyped-lm-serve --context-path resources/memory.md\n\n# Ask three typed questions in one call.\ncurl -s http://127.0.0.1:8080/v1/systemone \\\n  -H 'Content-Type: application/json' \\\n  -d @examples/request_mixed.json\n```\n\n**Request**\n\n```\n{\n  \"model\": \"typed-lm\",\n  \"state\": \"Order #7710 arrived with a smashed box and a cracked vase inside. Delivery was 3 days ago and the customer asks what to do next.\",\n  \"questions\": {\n    \"refund_eligible\": {\n      \"type\": \"noul\",\n      \"instructions\": \"The customer is eligible for a full refund under the store policy.\"\n    },\n    \"responsible_department\": {\n      \"type\": \"choice\",\n      \"instructions\": \"Which department should handle this case?\",\n      \"criteria\": {\n        \"billing\": \"Double charges and payment errors\",\n        \"logistics\": \"Damaged, lost, or late shipments\",\n        \"product_support\": \"Defective-item troubleshooting, replacements, and setup help\"\n      }\n    },\n    \"urgency\": {\n      \"type\": \"score\",\n      \"instructions\": \"How urgent is this case?\",\n      \"criteria\": [\"Routine\", \"Urgent\", \"Emergency\"]\n    }\n  }\n}\n```\n\n**Response**\n\n```\n{\n  \"model\": \"typed-lm\",\n  \"answers\": {\n    \"refund_eligible\": { \"type\": \"noul\", \"noul\": 0.87 },\n    \"responsible_department\": {\n      \"type\": \"choice\",\n      \"choice\": \"logistics\",\n      \"probabilities\": { \"billing\": 0.05, \"logistics\": 0.9, \"product_support\": 0.05 },\n      \"confidence\": 0.85\n    },\n    \"urgency\": {\n      \"type\": \"score\",\n      \"score\": 1.2,\n      \"legend\": { \"0\": \"Routine\", \"1\": \"Urgent\", \"2\": \"Emergency\" },\n      \"probabilities\": { \"0\": 0.2, \"1\": 0.4, \"2\": 0.4 },\n      \"confidence\": 0.2\n    }\n  },\n  \"usage\": { \"input_tokens\": 512, \"output_tokens\": 4 }\n}\n```\n\nFull walkthrough: [quickstart](https://neurono-ml.github.io/typed-lm/quickstart.html).\n\nDetected automatically from `model_type` in `config.json`.\n\n```\nflowchart TB\n  config[\"config.json model_type\"]:::neutral\n  dense{\"dense family?\"}:::warning\n  family[\"llama · qwen2 · qwen3<br/>mistral · gemma · gemma2 · gemma3\"]:::success\n  moe[\"mixtral · qwen3_moe<br/>deepseek_v2 · deepseek_v3\"]:::danger\n  served[\"served\"]:::success\n  rejected[\"rejected\"]:::danger\n\n  config --> dense\n  dense -- \"yes\" --> family --> served\n  dense -- \"no\" --> moe --> rejected\n\n  classDef success fill:#d1fae5,stroke:#059669,color:#064e3b,stroke-width:1.5px\n  classDef danger fill:#fee2e2,stroke:#dc2626,color:#7f1d1d,stroke-width:1.5px\n  classDef warning fill:#fef3c7,stroke:#d97706,color:#78350f,stroke-width:1.5px\n  classDef neutral fill:#f4f4f5,stroke:#a1a1aa,color:#18181b,stroke-width:1.5px\n```\n\nDense safetensors, PyTorch (`.pth`/`.bin`) and NumPy (`.npz`) checkpoints of any\nof the seven families are served. **GGUF-quantized serving is Qwen2-only.**\nMixture-of-Experts and multi-head-latent-attention families are rejected at load\ntime. FP8 and FP4 artifacts are dequantized on load; `GPTQ`/` AWQ` are rejected.\n\n| Crate | Role | Type | \n|---|---|---|\n| [`typed-lm-common`](https://github.com/neurono-ml/typed-lm/blob/main/typed-lm-common/README.md) | Jev contract, labels, prompt rendering, checkpoint detection, device/dtype, quantization | lib | \n| [`typed-lm-serve`](https://github.com/neurono-ml/typed-lm/blob/main/typed-lm-serve/README.md) | Jev-compatible Actix server (binary, no subcommand) | bin | \n| [`typed-lm-trainer`](https://github.com/neurono-ml/typed-lm/blob/main/typed-lm-trainer/README.md) | LoRA/QLoRA/full/from-scratch training and FP8/FP4 PTQ | bin + lib | \n\n```\ncargo build --workspace\ncargo run -p typed-lm-serve -- --help\ncargo run -p typed-lm-trainer -- --help\n```\n\n| Variant | Server | Trainer | Requirements | \n|---|---|---|---|\n| **CPU** (default) | `cargo install typed-lm-serve` | `cargo install typed-lm-trainer` | A Rust toolchain. Add `--features mkl` for Intel MKL BLAS on x86. | \n| **CUDA** | `--features cuda` | `--features cuda` | The CUDA toolkit ( `nvcc` ) and an NVIDIA driver. | \n| **Apple GPU (Metal)** | `--features metal` | `--features metal` | macOS on Apple Silicon. | \n\nPrebuilt images for both binaries are published to the GitHub Container Registry\non every release. CPU images carry `latest` and the version; CUDA images add a\n`-cuda` suffix (and the `cuda` tag):\n\n```\nflowchart LR\n  host[\"host\"]:::neutral\n  gpu{\"NVIDIA GPU<br/>+ container toolkit?\"}:::warning\n  cpu[\"typed-lm-serve:0.1.1<br/>typed-lm-trainer:0.1.1<br/>(latest too)\"]:::accent\n  cuda[\"typed-lm-serve:cuda<br/>typed-lm-trainer:cuda\"]:::success\n  runcpu[\"docker run -p 8080:8080\"]:::accent\n  runcuda[\"docker run --gpus all<br/>--model-dtype auto\"]:::success\n  serve[\"typed answers\"]:::primary\n\n  host --> gpu\n  gpu -- \"no\" --> cpu --> runcpu --> serve\n  gpu -- \"yes\" --> cuda --> runcuda --> serve\n\n  classDef primary fill:#ede9fe,stroke:#7c3aed,color:#3b0764,stroke-width:1.5px\n  classDef accent fill:#dbeafe,stroke:#2563eb,color:#0c4a6e,stroke-width:1.5px\n  classDef success fill:#d1fae5,stroke:#059669,color:#064e3b,stroke-width:1.5px\n  classDef warning fill:#fef3c7,stroke:#d97706,color:#78350f,stroke-width:1.5px\n  classDef neutral fill:#f4f4f5,stroke:#a1a1aa,color:#18181b,stroke-width:1.5px\n# CPU\ndocker pull ghcr.io/neurono-ml/typed-lm-serve:latest\ndocker pull ghcr.io/neurono-ml/typed-lm-serve:0.1.1\n\n# CUDA (GPU)\ndocker pull ghcr.io/neurono-ml/typed-lm-serve:cuda\ndocker pull ghcr.io/neurono-ml/typed-lm-serve:0.1.1-cuda\n```\n\n| Image | Accelerator | Contents | \n|---|---|---|\n| `ghcr.io/neurono-ml/typed-lm-serve` | CPU | The Jev-compatible HTTP server | \n| `ghcr.io/neurono-ml/typed-lm-trainer` | CPU | `train` and`quantize` | \n| `.../typed-lm-serve:cuda` | CUDA | Server with the CUDA runtime libraries | \n| `.../typed-lm-trainer:cuda` | CUDA | Trainer with the CUDA runtime libraries | \n\nThe server listens on `8080`; pass an `HF_TOKEN` for gated models, and mount a\ncontext file and the model cache:\n\n```\ndocker run --rm -p 8080:8080 \\\n  -e HF_TOKEN=<hugging-face-token> \\\n  -v typed-lm-cache:/root/.cache/huggingface \\\n  -v \"$PWD/resources/memory.md:/etc/typed-lm/memory.md:ro\" \\\n  -e CONTEXT_PATH=/etc/typed-lm/memory.md \\\n  ghcr.io/neurono-ml/typed-lm-serve:0.1.1\n```\n\nThe CUDA images bundle the runtime libraries candle loads (`cudart`, `cublas`,\n`curand`, `nvrtc`); the host only needs the NVIDIA driver and the container\ntoolkit. Select F16 weights automatically with `--model-dtype auto`:\n\n```\ndocker run --rm --gpus all -p 8080:8080 \\\n  -e HF_TOKEN=<hugging-face-token> \\\n  -e MODEL_DTYPE=auto \\\n  -v typed-lm-cache:/root/.cache/huggingface \\\n  ghcr.io/neurono-ml/typed-lm-serve:cuda\n```\n\nTo build the CUDA image from source instead (the release pipeline does this automatically), use the multi-stage Dockerfile; the compute capability can be tuned for the target GPU:\n\n```\ndocker build -f docker/Dockerfile.serve-cuda \\\n  --build-arg CUDA_COMPUTE_CAP=80 -t typed-lm-serve:cuda .\n```\n\nEach [release](https://github.com/neurono-ml/typed-lm/releases) attaches binaries\nfor Linux x86_64 (CPU/CUDA) and macOS arm64 (Metal):\n\n## **Server flags (defaults)**\n\n| Flag | Env | Default | \n|---|---|---|\n| `--host` | `HOST` | `0.0.0.0` | \n| `--port` | `PORT` | `8080` | \n| `--model-id` | `MODEL_ID` | `Qwen/Qwen2.5-1.5B-Instruct` | \n| `--context-path` | `CONTEXT_PATH` | empty | \n| `--served-model-name` | `SERVED_MODEL_NAME` | `typed-lm` | \n| `--model-dtype` | `MODEL_DTYPE` | `auto` | \n| `--session-cache-entries` | `SESSION_CACHE_ENTRIES` | `16` | \n| `--session-cache-tokens` | `SESSION_CACHE_TOKENS` | `32768` | \n\nFull reference: [server flags](https://neurono-ml.github.io/typed-lm/reference/server-flags.html).\n\nFull CPU and GPU latency tables, the acceleration features and the session-cache\ngain are in [benchmarks](https://neurono-ml.github.io/typed-lm/engineering/benchmarks.html).\n\n`POST /v1/systemone`, `GET /v1/models`, `GET /health`, `GET /health/live`.\nInvalid bodies return `422`, unknown models `404`, inference failures `500`, all\nwith the `{\"error\": {\"message\": \"...\"}}` envelope.\n\n```\ncargo test --workspace                            # unit + integration, no download\ncargo test --workspace -- --ignored --nocapture   # live tests (real weights)\ncargo clippy --workspace --all-targets\ncargo fmt --check\n```\n\n`cargo test --workspace` includes a weight-free **binary E2E**\n(`train` → `quantize` → `serve` over HTTP). Live tests marked `#[ignore]` need\nreal weights and a GPU for the training cases; they never run in CI.\n\nThe complete guide is published at **[https://neurono-ml.github.io/typed-lm/](https://neurono-ml.github.io/typed-lm/)**:\n\n| Guide | Link | \n|---|---|\n| Quick start | [https://neurono-ml.github.io/typed-lm/quickstart.html](https://neurono-ml.github.io/typed-lm/quickstart.html) | \n| Calling the API | [https://neurono-ml.github.io/typed-lm/guides/api.html](https://neurono-ml.github.io/typed-lm/guides/api.html) | \n| Running the server | [https://neurono-ml.github.io/typed-lm/guides/running.html](https://neurono-ml.github.io/typed-lm/guides/running.html) | \n| Training tutorial | [https://neurono-ml.github.io/typed-lm/training/index.html](https://neurono-ml.github.io/typed-lm/training/index.html) | \n| Configuration file (TOML) | [https://neurono-ml.github.io/typed-lm/reference/configuration-file.html](https://neurono-ml.github.io/typed-lm/reference/configuration-file.html) | \n| CLI cheat sheet | [https://neurono-ml.github.io/typed-lm/reference/cheatsheet.html](https://neurono-ml.github.io/typed-lm/reference/cheatsheet.html) | \n\nFor AI assistants, the site exposes an index at\n[https://neurono-ml.github.io/typed-lm/llms.txt](https://neurono-ml.github.io/typed-lm/llms.txt).\n\nContributions are welcome — code, docs, datasets and prompts alike. The project\nrules live in [`AGENTS.md`](https://github.com/neurono-ml/typed-lm/blob/main/AGENTS.md).\n\n```\ncargo fmt --all --check\ncargo clippy --workspace --all-targets -- -D warnings\ncargo test --workspace\n```\n\nApache-2.0. See [LICENSE](https://github.com/neurono-ml/typed-lm/blob/main/LICENSE).", "url": "https://wpnews.pro/news/typed-lm-a-rust-jev-open-source-alternative", "canonical_source": "https://github.com/neurono-ml/typed-lm", "published_at": "2026-09-26 12:44:18+00:00", "updated_at": "2026-09-26 13:01:10.983076+00:00", "lang": "en", "topics": ["ai-infrastructure", "large-language-models", "ai-tools", "developer-tools"], "entities": ["typed-lm", "Neurono ML", "Rust", "Llama", "Qwen2", "Qwen3", "Mistral", "Gemma"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/typed-lm-a-rust-jev-open-source-alternative", "markdown": "https://wpnews.pro/news/typed-lm-a-rust-jev-open-source-alternative.md", "text": "https://wpnews.pro/news/typed-lm-a-rust-jev-open-source-alternative.txt", "jsonld": "https://wpnews.pro/news/typed-lm-a-rust-jev-open-source-alternative.jsonld"}}