synsema
JA 日本語

プログラミング言語 · AIエージェントフレームワーク · デフォルトで安全

人はページを読む。
エージェントはソースを読む。

ひとつのURLをコンテントネゴシエーションで。Synsemaは、エージェントフレームワークを内蔵した、高速でデフォルトで安全なAIエージェント向けプログラミング言語です。同じルートが人にはHTMLを、モデルにはMarkdownを返します。パネルを切り替えると、LLMがこのページから受け取るMarkdownそのものが見えます。

try.synsema.com で作りながら学ぶ:本物のサンドボックス付きのコース、インストール不要。

GET synsema.com/ja
200 OK · Content-Type: text/markdown
# Synsema
> AIエージェントのためのプログラミング言語。

## 何であるか
- 高速。 47,200 req/s、GoとNodeを上回る。
- デフォルトで安全。 `require` がなければアクセスなし。
- エージェントネイティブ。 ひとつのルート、HTMLかMarkdown。

## インストール
curl -fsSL synsema.com/install.sh | sh
エージェント向けインデックス: /llms.txt

Synsema

AIエージェントのためのプログラミング言語。

スループット
47,200req/s
vs Go (net/http)
+10%
デフォルトで安全
エージェントネイティブ

↑ 同じリソース、ふたつの表現 · curl -H "Accept: text/markdown" synsema.com/ja

高速 · req/s(c=50)

47,200req/s

Go(42,800)とNode(38,700)を上回る1。ネイティブ非同期、真のマルチコア、単一の静的バイナリ、ランタイム不要。

デフォルトで安全

-- require がなければアクセスなし
require net("api.shop.com")
fetch("api.shop.com")  ✓ 許可
fetch("evil.com")      ⊘ 拒否

require がなければアクセスはありません。拒否するのはコードレビューではなくインタプリタです。認証、バリデーション、intentは宣言的です。

エージェントネイティブ

このページそのものがデモです。すべてのルートが人にはHTMLを、エージェントにはMarkdown/JSONを返し、/llms.txt/sitemap.xml/openapi.json はルートテーブルから導出されます。

ドキュメントは MCPサーバー を公開しています。エージェントはひとつのエンドポイントで検索・閲覧・実行・テストができます。

1 · Linux VPS上で計測、6ワークロード、c=50、複数回実行の中央値(初回は除外)。再現用ハーネス: synsema-arena。

これで作れるもの

AIエージェントフレームワークとプログラミング言語を、ひとつのバイナリに。

エージェント型アプリに必要なものはすべて言語の中にあり、上に貼り付けたフレームワークにはありません。LLM呼び出し、ツール利用、メモリ、人間による承認、マルチエージェントのオーケストレーション、本番用サーバー、そしてセキュリティモデル。だから同じ言語で、エージェントの周りのAPI、サイト、cron、CLIも作れます。

エージェント

AIエージェントとLLMアプリ

reasondecideanalyzegenerate はプリミティブ。検証済みの応答、リトライ、任意のプロバイダ、シークレットとして封印された鍵。

docs ↗

オーケストレーション

マルチエージェントシステム

実スレッド上のエージェント、共有ブラックボード、シグナル、イベントバス、永続メモリ。メッセージブローカーの運用は不要。

docs ↗

ヒューマン・イン・ザ・ループ

承認とゲート

approveconfirmask は本物の人を待ちます。ターミナルで、あるいはワンタイムリンクの背後のキューで。誰もいなければ拒否されます。

docs ↗

ツール

MCPサーバー

プログラムができることをClaude Code、Cursor、Lampsonに公開。ドキュメントサイト自身のMCPサーバーもこの方法で書かれています。

docs ↗

バックエンド

REST APIとCRUD

ルート、宣言的な認証とバリデーション、ページネーション、SQLite、Postgres、MySQL、Mongo、Redis。1ファイルに、本番用サーバー込みで。

docs ↗

リアルタイム

エージェント型アプリ

受信WebSocket、1行ずつ監視する子プロセス、すべてをまたぐひとつの select、キャンセルと順序立てたシャットダウン。

docs ↗

Web

ウェブサイト、SSR

テンプレート、レイアウト、コンポーネント。すべてのページがエージェント向けにネゴシエートされ、/llms.txt、サイトマップ、OpenAPIが無料で付いてきます。このサイトもそのひとつ。

docs ↗

デプロイ

自動HTTPS

--tls-auto you@site.com:Let's Encryptの証明書と更新、HTTP/2、www からapexへ、必要ならリバースプロキシ。

docs ↗

アプリ

ひとつのアプリ:Web、スマホ、デスクトップ

synsema init --desktop:同じサーバーレンダリングのアプリが、AndroidとiOSにはネイティブプッシュ付きPWAとしてインストールされ、デスクトップにはデスクトップアプリとして配布できます — 単一バイナリ、ブラウザのアプリウィンドウ、あなたのアイコン、コンソールなし。

docs ↗

自動化

cron、Webhook、ジョブ

スケジュールされたタスクとWebSocketのライブフィード。本物のイベントループ上の長時間処理、可観測性込み。

docs ↗

データ

データとグラフ

CSV、SQL、統計、数値配列、そしてエージェントはデータとして、人は画像として読むネイティブSVGグラフ。PNGとPDFへの書き出し。

docs ↗

配布

単一バイナリ、またはWASM

synsema build がプログラムとアセットをひとつの実行ファイルに封印。インタプリタはブラウザ、エッジ、TEEでも動きます。

docs ↗

1ファイル

バックエンド全体を、権限を先頭に。

Synsemaのプログラムは、何に触れてよいかを宣言することから始まります。その行より下のすべて(ルート、データベース、シークレット、モデル)はその中で動きます。下のふたつのファイルはこのままパースされ、実行されます。

api.synREST APIを作る ↗
-- A bookshop API. The `require` lines are the whole permission
-- surface: a port, one database file, one secret. Nothing else.
intent: "public read API; writes need the staff token"

require serve(8080)
require db("./shop.db")
require secret("API_TOKEN")

task check_token(token)
    let want be hmac_sha256("staff", token)
    when verify_hmac("staff", want, secret("API_TOKEN"))
        give {"role": "staff"}
    give nothing

serve on 8080
    auth with check_token
    rate_limit 120 per minute

    route "GET /books"
        give paged("SELECT id, title, price FROM books")

    route "POST /books" requires auth
        expect body {title: text, price: number}
        let b be json of request
        sql_exec("INSERT INTO books (title, price) VALUES (?, ?)",
                 [b.title, b.price])
        give created(b)

    route "GET /about"
        let doc be page([heading(1, "Bookshop"),
                         prose("HTML or Markdown, one route.")],
                        {"title": "Bookshop"})
        give content(doc)
agent.synLLMプリミティブ ↗
-- An agent that triages support tickets. The model decides;
-- a human approves refunds; the API key is a sealed secret.
intent: "triage open tickets; refunds wait for a human"

require llm
require net("api.example.com")
require secret("SUPPORT_TOKEN")

let api be "https://api.example.com"
let auth be {"Authorization": bearer(secret("SUPPORT_TOKEN"))}
let r be http_get(api + "/tickets?open=1", auth)
let tickets be json_decode(body of r)

each t in tickets
    let msg be t["text"]
    let kind be decide between ["bug", "billing", "other"] given msg
    when kind == "billing"
        let amount be analyze msg for "the amount to refund"
        let who be t["customer"]
        approve "Refund " + text(amount) + " to " + who + "?" within 1h
    otherwise
        let reply be generate "a short, kind answer" given msg
        let url be api + "/tickets/" + t["id"] + "/reply"
        http_post(url, {"text": reply}, auth)
  • require が権限の全面です。 ポートひとつ、データベースファイルひとつ、シークレットひとつ。他のホストへの fetch はインタプリタが拒否します。
  • 認証とバリデーションは宣言です。 auth with がトークンの正体を決めるタスクを指名し、expect body は不正なペイロードをフィールド名付きの400で弾きます。
  • ひとつのルート、すべての読者。 content() はブラウザにHTML、エージェントにMarkdownかJSONを返し、paged() は大きな結果を自動でページングします。
  • モデルはプリミティブです。 decide は選択肢のひとつを返すかリトライし、analyzegenerate は型付きで、手で貼り合わせたプロンプト文字列ではありません。
  • 人もプリミティブです。 approve … within 1h は本物の人を待ち、誰もいなければ拒否します。
  • シークレットは決して実体化しません。 鍵は封印されたままソケットまで運ばれ、モデルにはプレースホルダーしか見えません。

Synsemaで作られたもの

今日から使える3つのもの。

コーディングエージェント

Lampson

ターミナルとブラウザで動くオープンソースのAIコーディングエージェント。すべてSynsemaで書かれています。ツールはプロジェクト内に閉じ込められ、権限はあなたの管理下、サブエージェント、スケジュールタスク、プラグイン。

lampson.org ↗

エージェントのケイパビリティ

Lamps

持ち運べるケイパビリティの単位。マニフェストがコードの触れてよい範囲を宣言し、ランタイムがそれを強制して呼び出しごとに監査します。lamp add のあと lamp mcp で、Claude Code、Cursor、あらゆるMCPエージェントへ。

lamps.sh ↗

学ぶ

Try Synsema

実在するビジネス向けのソフトウェアをブラウザで作りながら学ぶ。コース、本物のサンドボックスで検証されるミッション、XPとレベル。インストール不要。

try.synsema.com ↗

ブログから

ベンチマーク、設計判断、ハウツー。

すべての記事 → · RSS