1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Twilic はあれからどうなった? 公開から約3ヶ月でかなり進化しました

1
Posted at

はじめに

お久しぶりです、みなぎしです!

前回 Twilic についての記事 を公開したのが 2026 年 5 月 24 日なので、気づけば約 3 ヶ月半が経ちました

前回の記事では、Twilic というバイナリフォーマットを作ったことや、MessagePack と比較して同じ形のデータを大量に送る場合にかなり小さくできることなどを紹介しました

特に、同じ shape のレコードを 256 件まとめたベンチマークでは

  • Twilic: 5,316 B
  • MessagePack: 19,505 B
  • 約 72.75% 削減

という結果になっていて、当時はこの部分を中心に紹介していました

ただ、あれから開発を続けていく中で Twilic 自体もかなり変わりました!

言語実装が増えたり、Playground が強化されたり、Web フレームワーク向けのライブラリが増えたり、エンコードの仕組みを視覚的に確認できる Explorer を作ったり、最近では AI のストリームや Agent の実行記録を扱う Twilic AI まで作っています

今回は、前回の記事から現在までに Twilic がどう変わったのかをまとめていきます!

Twilic は1つのライブラリからプロジェクト群になった

まず、一番大きく変わった部分です

前回の記事を書いた頃は、Twilic の仕様があって、Rust の実装があって、JavaScript や Go や Zig の実装がある、という比較的シンプルな構成でした

現在はそこからかなり広がっていて

  • Twilic の仕様
  • 多言語 Runtime
  • Conformance Test
  • Benchmark
  • Playground
  • Explorer
  • CLI
  • 公式 Website
  • Hono
  • Express
  • Fastify
  • Fetch
  • Axios
  • Examples
  • Twilic AI

などが Twilic Organization の中で開発されています

最初はバイナリフォーマットそのものを作ることが中心でしたが、現在は Twilic を実際のアプリケーションで使うための周辺環境もかなり増えてきました

言語ごとのリポジトリを monorepo に統合しました

そして、かなり最近の変更なのですが、Twilic の各言語実装を twilic/twilic にまとめました!

以前は

  • twilic-rust
  • twilic-js
  • twilic-go
  • twilic-zig

のように、言語ごとにリポジトリを分けていました

ただ、Twilic のような同じ wire format を複数言語で実装するプロジェクトの場合、仕様変更を行ったときに全 Runtime が同じ挙動をしていることを確認する必要があります

そこで現在は

twilic/
├ SPEC.md
├ docs/
├ versions/
├ conformance/
├ testdata/
├ runtimes/
│  ├ rust/
│  ├ javascript/
│  ├ go/
│  ├ python/
│  └ ...
└ tools/

という構成に変更しています

仕様、テストデータ、Conformance Test、各言語実装を同じリポジトリで管理できるようになりました
これによって、仕様を変更したときに複数の Runtime をまとめて確認しやすくなっています

CI についても、変更された Runtime を判定して必要なテストを実行できる構成にしています

なお、package のバージョンまで全言語で統一したわけではありません
Twilic の仕様とソースツリーは共通で管理しつつ、各 Runtime の package version はそれぞれ独立しています

新しい cross-runtime の変更については、monorepo 側を中心に進めていく予定です

Runtime もかなり増えました

前回紹介した時点では、Rust や JavaScript や Go や Zig が中心でした

現在の runtimes/ には

  • C
  • C++
  • C#
  • Dart
  • Elixir
  • Go
  • Java
  • JavaScript
  • Kotlin
  • Lua
  • PHP
  • Python
  • R
  • Ruby
  • Rust
  • Scala
  • Swift
  • Zig

などの実装があります

もちろん、全ての Runtime が完全に同じ成熟度というわけではありません
そのため実際に利用する場合は、各 Runtime の README や対応 profile を確認してもらう必要があります

ただ、最初は数言語から始めたものがここまで増えたのは、自分でもかなり大きな変化だと思っています!

Schema-first の仕組みも増えました

Twilic はもともと、スキーマなしで JSON のようにそのまま encode できる、という部分をかなり大事にしています
これは現在も変わっていません

一方で、スキーマを事前に共有できる環境ではさらに小さくできるように、v3 profile では schema-aware な仕組みも増えています

代表的なのが BOUND_STREAMSCHEMA_BATCH です

BOUND_STREAM は、事前に共有している schema を利用して、フィールド名などを毎回送らないための仕組みです
SCHEMA_BATCH は、同じ schema のレコードをまとめて送る場合に利用できます

つまり現在の Twilic は

Schema-less
↓
繰り返し構造を自動的に利用

Schema-aware
↓
事前に分かっている構造まで利用

という 2 つの方向から使えるようになっています

Protobuf のように最初から schema を用意する構成でも、MessagePack のように schema を用意しない構成でも、同じ Twilic の中で選択できるようにすることを目指しています

Playground もかなり変わりました

前回の記事でも Playground を少し紹介しましたが、現在は比較できる内容が増えています
大きく分けると 2 つあります

Encoded sizes

こちらでは

  • Twilic
  • MessagePack
  • CBOR
  • BSON
  • JSON

を比較できます

Benchmark リポジトリと同じ fixture を利用していて、single-smallbatch-homogeneous-256batch-mixed-256patch-session などをブラウザから確認できます
さらに、Custom JSON に自分の JSON を貼り付けて比較することもできます

Twilic に都合の良い fixture だけを見るのではなく、実際に自分が利用しているデータを入れて確認できるようにしています

Schema-first

こちらは、schema が存在するフォーマットも含めた比較です

  • Twilic BOUND_STREAM
  • Twilic SCHEMA_BATCH
  • Twilic Dynamic
  • Protobuf
  • Avro
  • FlatBuffers
  • Apache Arrow IPC

などを同じデータで比較できます

前回よりも「MessagePack より小さいか」だけではなく、「Schema を利用した場合に他のフォーマットとどう変わるか」まで確認できる Playground になりました

ちなみに Twilic の encode は、ブラウザ上で WASM を使って実行しています
そのため、JSON を外部のサーバーに送って計測しているわけではなく、ブラウザ上でそのまま試すことができます

Twilic Explorer も作りました

Playground を作っていて思ったのですが、「何 byte になったか」だけでは、Twilic が内部で何をしているのか少し分かりづらいです

そこで作ったのが Twilic Explorer です!

Explorer では JSON を入力すると

Input JSON
↓
Profile
↓
Shape detection
↓
Shape tree
↓
String interning
↓
Batch / Typed vector
↓
Binary

という Twilic の encode pipeline を確認できます

Dynamic、Batch、SCHEMA_BATCHBOUND_STREAM も切り替えられます
さらに、最終的な binary を hex で確認したり、どの部分がどの処理によって生成された byte なのかを確認したりできます

3D の byte 表示も入れているので、単純なテーブルだけではなく視覚的に Twilic の変換を追えるようになっています

Playground は「どれくらい小さくなるのかを見るもの」、Explorer は「どのように binary が作られているのかを見るもの」という感じで役割を分けています

Web Framework 周りも増えました

前回の記事では、Hono 向けの @twilic/hono を紹介していました

現在はそこから増えて

向けの integration があります

例えば、API の request body と response body を Twilic にしたい場合に、毎回 Content-Type の判定や encode / decode を全部自分で書かなくても使えるようにするためのものです
Examples リポジトリにも、HTTP の round-trip を確認できる example を追加しています

Twilic 本体だけを作って終わるのではなく、実際の Web API でどうやって使うのか、という部分も整備しています

そして Twilic AI も作りました

これは、前回の記事を書いた時には存在していなかったものです

最近 AI API や Agent を触っていると

  • text delta
  • tool call
  • reasoning
  • trace
  • metadata

など、同じような構造のイベントが大量にストリームされます
ここは Twilic とかなり相性が良いのではと思い作ったのが Twilic AI です

Twilic AI では、AI の stream や Agent の実行を記録して、あとから replay や inspect ができるようにしています

現在は @twilic/ai を中心に、@twilic/ai-openai@twilic/ai-sdk@twilic/ai-agents などがあります
OpenAI Responses API のイベントを正規化したり、Vercel AI SDK と連携したり、Agents SDK の trace を記録したりできます

記録した session は .twai という形式で保存できます
CLI からも

twilic ai inspect session.twai

twilic ai replay session.twai --speed 10

twilic ai record --input events.jsonl -o session.twai

のように扱えます

他にも、diff や convert や benchmark などの subcommand を用意しています

Twilic はもともと汎用的な構造化データ向けフォーマットとして作っていますが、こういった特定用途でどのように使えるのかも今後試していきたいと思っています

公式サイトもできました

Twilic の公式サイトとして twilic.dev も作りました!

仕様だけでなく

  • Getting Started
  • Why Twilic
  • 各 Runtime
  • Integration
  • AI

などのドキュメントをまとめています

ブランド周りについても少しずつ変更していて、現在はオレンジを使った新しい mark に変更しています
このあたりはコードそのものではありませんが、OSS として利用する人が迷わず情報にたどり着けるように整備している部分です

前回から一番変わったと思うところ

前回の記事を書いた頃は、「MessagePack より繰り返しデータを小さくできるフォーマットを作った」という状態でした

今はそこから

Protocol
  ↓
Multi-language Runtime
  ↓
Conformance
  ↓
Benchmark
  ↓
Playground
  ↓
Explorer
  ↓
Web Integration
  ↓
AI tooling

という形まで広がってきました

個人的には、単純に対応言語を増やすことより

  • 仕様を確認できる
  • 他言語との互換性をテストできる
  • 数字を再現できる
  • ブラウザですぐ試せる
  • 実際のアプリケーションに組み込める

というところまで含めて、1 つのプロジェクトにしていきたいと思っています

まだまだ開発途中です

ここまで色々紹介しましたが、Twilic はまだ開発途中です

特に Runtime が増えた分

  • Conformance Test
  • API の安定化
  • 各 package の release
  • ドキュメント

なども今まで以上に重要になっています

フォーマットを作ること自体より、複数の言語で同じ binary を読み書きできる状態を維持することの方が大変なのではと思うことも増えてきました
ただ、ここはマルチ言語の binary format を作る上で避けて通れない部分なので、引き続き整備していきます!

まとめ

前回の記事から約 3 ヶ月半で、Twilic はかなり変わりました

最初は Rust を中心としたバイナリフォーマットとして始まりましたが、現在は仕様と Runtime をまとめた monorepo、多数の言語実装、BenchmarkPlaygroundExplorer、Web Framework Integration、CLITwilic AI、公式 Website などまで広がっています

まだ完成したプロジェクトではありませんが、少なくとも前回の記事を書いた頃より、「実際に触って試せるもの」にはかなり近づいてきたと思っています!

もし Twilic に興味を持ってもらえたら、Playground で普段使っている JSON を入れて比較してみてもらえると嬉しいです!
Explorer で binary がどのように作られているのかを見るのも結構面白いと思います

GitHub の Star や Issue、PR も歓迎しています!
これからも開発を続けていくので、また大きく変わった頃に続きを書こうと思います!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?