Saikuro is a cross-language invocation fabric. It gives you typed function calls, streams, and channels across TypeScript, Python, C#, Rust, and whatever else you’re running, all over a single transport-agnostic protocol with no hand-written bindings required.

Saikuro means “cycle” in Japanese. The idea: your call leaves one language, travels through the runtime, and arrives in another, and the whole cycle is invisible to you as the developer.

What it solves

You’re building something that needs two (or five) languages talking to each other. Normally that means a pile of HTTP boilerplate, some JSON you hope stays in sync, and a week of debugging silent failures when a buffer goes missing or a type doesn’t round-trip cleanly.

Saikuro replaces all of that with a single protocol and a set of thin adapters. You define your functions once, Saikuro validates the schema, and callers in any supported language just… call them.

Features

Transport-Agnostic Protocol

Same wire format whether you’re talking in-process, over a Unix socket, or across a WebSocket. Pick the transport that fits; the protocol doesn’t care.

Strict Schema Model

Functions, types, capabilities, and namespaces are all declared in a schema the runtime enforces. No more “I thought it accepted a string” surprises.

Six Invocation Primitives

Call, cast, stream, channel, batch, and resource. Use the right primitive for the job instead of shoehorning everything into request/response.

Language Adapters

Thin clients for TypeScript, Python, C#, and Rust. They handle serialization and expose a consistent API. The runtime handles the rest.

Dev-Mode Discovery

In development, providers announce their schema automatically. No codegen step until you’re ready to freeze things for production.

Quick Example

TypeScript provider:

import { Provider } from "@nisoku/saikuro";

const provider = new Provider({ namespace: "math" });

provider.register("add", (a: number, b: number) => a + b);

await provider.serve();

Python caller:

from saikuro import Client

client = Client()
await client.connect()

result = await client.call('math.add', [1, 2])
print(result)  # 3

That’s it. No IDL file, no stub generator, no HTTP server.

Installation

TypeScript
Python
C#
Rust
npm install @nisoku/saikuro
pip install @nisoku/saikuro
dotnet add package Saikuro
[dependencies]
saikuro = "0.1"

Next Steps