Tags: OriPekelman/tep
Tags
tep v0.10.0
Two new batteries + tooling. Additive only — no breaking changes since v0.9.0.
NEW BATTERIES
* Tep::Proxy (Battery 6) — Sinatra-flavored reverse proxy.
- 6.1: non-streaming base (rewrite_path / before_forward /
after_forward).
- 6.2: streaming pass-through (stream_request? /
on_stream_chunk / on_stream_end + StreamStats).
- Block-form DSL — `proxy.before_forward do |req, res, ureq| ... end`
lowers via bin/tep to a synthesized subclass. The translator
rewrites local-var Proxy mounts into constant-mount form so
Tep.<verb> doesn't widen Proxy's rewrite_path param.
- See docs/PROXY-BATTERY.md.
* Tep::Llm::OpenAI::Server (Battery 7) — serve OpenAI-compatible HTTP
from local compute.
- 7.1a: Backend interface + Server.use / Server.serve! +
GET /v1/models.
- 7.1b: POST /v1/completions (non-streaming) +
generate_from_tokens.
- 7.1c: serve!(events_jsonl) — emit run_start at boot + one
`inference` event per request (Tep::Events).
- 7.2: streaming /v1/completions via SSE — subclass-override-sink
pattern (Backend#generate_stream_from_tokens(model, ids, sampling,
sink); sink.emit_token(piece)) lets backends emit per-token
without crossing a block boundary spinel can't lower. The
CompletionsStreamer writes data:[DONE] + emits the
inference event with sink.completion_count.
- /v1/embeddings deliberately lives app-side (lib stays
float-free; toy ships it in tep_demo/embeddings_handler.rb
against tnn_embed_lookup_to_doubles).
- See docs/OPENAI-SERVER-BATTERY.md.
* Tep::Events — toy/v1 JSONL emitter (run_start / inference /
run_end). Float-free by design (integer wall_us, schema floats
live in caller-built extra_json). Standalone-ready for any
per-request telemetry stream.
NEW EXAMPLES
* examples/llm_gateway/ — Tep::Proxy streaming demo; SSE pass-through
+ one inference event per stream.
* examples/api_gateway/ — buffered-proxy demo; capability-gated
forwarding with before/after_forward observability.
TOOLING
* make test-parallel + test/run_parallel.rb — subprocess fan-out
cuts wall time ~3.3× (13min → ~4min on the gx10). make test
stays serial as the canonical / CI path. 430 tests now (was
~360 at v0.9.0).
* spinel-ext.json — single JSON source of truth for the
@TEP_*_O@ / @TEP_PG_CFLAGS@ FFI placeholders inside lib/tep/*.rb
(replaces the hardcoded substitution dict in bin/tep). Lays the
groundwork for sibling projects (toy, tep_demo) to vendor tep's
C-ext wiring through a stable manifest.
* prism is a development dependency (was runtime). gemspec
required_ruby_version relaxed to >= 3.2 (was >= 3.4) — prism
is stdlib from 3.4 onward, a gem install on 3.2/3.3.
FIXES
* Scheduler-aware body drain for Tep::Server::Scheduled (#52). The
blocking sphttp_drain_body would stall a non-blocking client fd
under the fiber scheduler; replaced with a cooperative drain that
parks on io_wait + sphttp_recv_some until Content-Length-bytes
are read or the peer hangs up.
* res.streaming now drives correctly under Tep::Server::Scheduled
(was prefork-only; broke chatbot SSE).
* Tep::SQLite#prepare_cached + cached-finalize semantic — same
shape as ruby-sqlite3, lets ActiveRecord-on-spinel reuse the
adapter unchanged.
* Tep::Presence — heartbeat + prune_stale_workers for PG-mirror GC.
* examples/chatbot — streaming transport swapped from raw SSE to
Tep::WebSocket.
SPINEL TRACK
Tracking matz/spinel master; the workarounds live where they're
needed and are reverted as the upstream fixes land. Three blockers
still open:
* matz/spinel#556 — virtual-imeth dispatch enumeration.
* matz/spinel#564 — closure heap-cell undeclared in multi-fiber-capture
chains.
* matz/spinel #1007 — Tep::Server::Scheduled closure cleanup.
Full shortlog: `git log v0.9.0..v0.10.0`.
tep 0.9.0 (pre-alpha) -- Battery 5: Tep::MCP The agent-as-driver surface ships. Tep apps can now expose themselves as MCP servers; Claude Code / OpenCode / Gravity CLI discover and drive the catalog natively. Highlights: - mcp_tool DSL with typed params + caps gating. - mcp_resource DSL for read-only fetches. - /mcp JSON-RPC 2.0 dispatcher (initialize, tools/list, tools/call, resources/list, resources/read, notifications/initialized). - /tools/<name> + /resources/<uri> HTTP-direct routes for curl and non-MCP agents. - /llms.txt + /openapi.json auto-published catalog. - AGENTS.md convention for hand-written agent-facing surface docs. Demo: examples/experiments -- mock training-run manager driving the full agent loop in ~200 lines + worked AGENTS.md. Pre-alpha. API still in motion.
PreviousNext