Upgrade to Pro — share decks privately, control downloads, hide ads and more …

オーケストレーション記述言語 Katari

オーケストレーション記述言語 Katari

Katari (https://katari-lang.dev) はオーケストレーション記述言語です。Durable で非同期な実行が可能で、長期のタスクの記述に向きます
このスライドでは Katari v0.1 の言語機能と Katari v0.2 への展望を述べます

Avatar for ゆきくらげ

ゆきくらげ

October 22, 2026

More Decks by ゆきくらげ

Other Decks in Programming

Transcript

  1. AIオーケストレーションしたい! • プログラミングしてサーバーを作る → めんどい やることに対して大層なコードになってしまう • AI オーケストレーションするサービス →

    だいたいテキストベースじゃない or YAML AI にテキスト生成させた方が、いいだろ • やりたいこともある…… • 型システムでセキュリティレベルトラッキングしたい • MCP Tool を関数として扱う → DSL 作るしかねぇ! KATARI 2
  2. KATARI • v0.1 公開中 • 言語機能: 構造的部分型、Durable / 非同期な実行、Effect System、

    セキュリティトラッキング、MCP Tool = Functions、エコシステ ム(ライブラリ、LSPなど) • 詳しく解説していきます! KATARI 3
  3. KATARI のランタイム • ランタイムは常時起動のサーバー • ユーザーは KATARI コードを書いて アップロード •

    ランタイムはそれを実行する • 実行状態は全て DB に保存される → 再起動しても OK! 長時間タスクに最適 ランライムサーバー 実行 実行状態 認証情報 アップロード ユーザー KATARI 4
  4. KATARI コードの見た目 意外と普通! @"Greet someone by name." agent greet(name: string)

    -> string { f"Hello, ${name}!" } agent: 関数宣言 @: コメント 構造的型付け KATARI 5
  5. 例: Discord Bot の構成 無限に動き続けて discord を監視する agent watcher(self: string)

    -> null { use supervise.forever() discord.watch_messages(channel = channel(), deliver_to = agent (value: discord.message) { ai.mail(...) } ) Discord Channel にメッセージが飛んでくるたび } ai.mail を呼ぶ ... ai.spawn[bot_effects]( ..., AI が監視する対象を渡す sources = [watcher], ) region.watch(nursery = root) KATARI region.watch は処理を無限に止める (詳しく説明する時間はない……) 6
  6. エフェクトシステム request ask(question: string) -> string agent greet(name: string) ->

    string { f"Hello, ${name}!" } エフェクト ask の宣言 ask のハンドラの宣言 ここより下のコンテキストではこの定義が使われる agent scripted() -> string { use handler { request ask(question: string) { next "Yukikurage" } } greet(name = ask(question = "Who should I greet?")) } KATARI ask を使う ここでは "Yukikurage" となる。 7
  7. エフェクト as Human in the Loop root までたどってハンドラがない場合はユーザーがハンドラになる agent main()

    -> string with ask { greet(name = ask(question = "Who should I greet?")) } ランライム 返信 ダッシュボード KATARI ユーザー 8
  8. use 構文 Gleam ライクな use 構文でカスタムハンドラを注入できる ai ライブラリが提供する authropic.provider agent

    chat(question: string) -> string with io { use anthropic.provider( source = credentials.env(key = "ANTHROPIC_API_KEY"), system = "You are a concise assistant.", ) ai.infer(history = [types.turn(role = types.user_role(), text = question)]) } このコンテキストでは ai.infer が使える KATARI 9
  9. Function as a Tool 任意の関数は AI に Tool として与えることができる スキーマや説明は型とアノテーションから導出される

    @"Count letters of given word" agent count_letters(word: string, letter: string) -> integer { ... } ... ai.infer_with_tools( ... tools = [count_letters, tavily.search, web.fetch_page], max_steps = 8, ) 関数の配列を渡して呼んでもらう KATARI 11
  10. Tool as a Function 外部 MCP サーバーに繋げて Tool を関数としてインポートできる CLI

    katari mcp pull --url https://mcp.notion.com/mcp let results = notion.search(query = query) KATARI 12
  11. セキュリティトラッキング 変数に public / private の情報を付与できる let secret_value : string

    of private = "coco_sk_MEOWOEWOWMEW" http.fetch( url = "https://foo.com/lookup?key=" ++ secret_value, ...) 型エラー expected: public actual: private KATARI 13
  12. KATARI v0.2: リアクティブアップデート v0.1 の観察 • 状態が伝播しない • 自動で伝播させたい •

    コードが固定 • ワークフローというより組織ツリー • 例えば discord.watch は無限に動き続ける • 下位のエージェントの動きを親が制御する • FFI が JS しかない → Katari v0.2 で解決したい! KATARI 16
  13. まとめ Katari v0.1 • Durable なオーケストレーション言語 • エフェクトシステム、use 構文、Human in

    the Loop • Tool = Function • セキュリティトラッキング Katari v0.2 • コンポーネント指向と状態の伝播 • 動的なコード更新 • Katari Protocol による接続 KATARI 21