タイプサーバープロトコル

2026/10/27 3:14

タイプサーバープロトコル

RSS: https://news.ycombinator.com/rss

要約▶

Japanese Translation:

元のサマリーは簡潔であるが、Key Points に記載されているいくつかの具体的な技術詳細を欠いている。以下に、それらを組み入れながら明瞭性を維持した改善版を示す:

改善されたサマリー:

Type Server Protocol(TSP)は、Python アナリシスデータを効率的に取得するための専用の JSON-RPC スタンダードを確立し、Position、Range、URI の表現について Language Server Protocol(LSP)の慣習に従うとともに、

typeServer/
接頭辞付きの方法を用いる。権威ある定義は
typeServerProtocol.ts
などのファイルに記述されており、TSP はプロトコルバージョン、スナップショット、検索パス、インポート解決、および 3 つの特定の型アナリシス(computed、declared、expected)を含む多様なクエリを支援する。アーキテクチャ上の重要な革新として、バージョン 0.4.1 で導入されたマルチ接続サポートがある;このオプションモードでは、クライアントが高負荷な同時クエリ(
getComputedType
または
resolveImport
など)に対してメイン接続をブロックせずに追加の読み取り専用接続を開くことが可能であり、メイン接続は状態変更操作と LSP ライフサイクルメッセージの独占的な所有権を保持する。接続はメインチャンネル上の JSON 制御メッセージ(
open
/
close
)を通じて管理される。TSP はマイナーな 0.x の変化であっても破壊的変更になり得る点において厳密なセマンティックバージョニングを強制し、破棄されたスナップショットには -32802、無効なパラメータには -32602 とする標準的な JSON-RPC エラーコードを利用する。結果はスナップショットのコンテキスト内でのみ有効であり、権威ある定義は
tsp.json
に記述されているため、TSP は高パフォーマンスと後方互換性の期待をバランスさせた堅牢な Python ツーリングの基盤を提供しており、現在は Pylance 2026.4.1 と整合している。

本文

Type Server プロトコル(TSP)仕様書

Type Server プロトコル(TSP)は、型サーバーに対して Python の分析データを照会するための JSON-RPC プロトコル です。

概要とアーキテクチャ

型サーバーはワークスペースの型分析状態を保持し、以下の情報をクライアントに返答します。

  • プロトコルのバージョン情報
  • スナップショット(分析状態の識別子)
  • Python の検索パス
  • インポート解決結果
  • 型クエリ結果(計算された型、宣言された型、想定される型)

データ形状と慣習

  • Position
    や
    Range
    などは、**言語サーバープロトコル(LSP)**のデータ形状と慣習を採用します。
  • URI は文字列として表現し、LSP と同等の形式を使用します。
  • メソッド名はすべて
    typeServer/
    プレフィックスで始まります。

プロトコルアティファクト

以下のファイルが権限のある定義です。

  • typeServerProtocol.ts
    : TypeScript インターフェースとリクエストタイプを定義。
  • tsp.json
    : 機械可読なプロトコルモデル。
  • tsp.schema.json
    : プロトコルモデルの JSON スキーマ。

バージョン履歴

クライアントとサーバー間の互換性チェックには、**セマンティックバージョニング(SemVer)**文字列を使用します。

  • 0.x ライン: マイナー版の変更でも破壊的変更が生じる可能性があります。
  • パッチ版: 同じマイナーライン内で後方互換性を維持します。

バージョン一覧

バージョン変更点
0.1.0
初期のプロトコルバージョン。
0.2.0
リクエストタイプとフィールドを追加。
0.3.0
より複雑な型形状への変更。
0.4.0
Type union およびスタブベースの型ペイロードへの変更。
0.4.1
複数接続間のネゴシエーションと
typeServer/connection
コントロールリクエストの追加。

接続モデル

クライアントは型サーバーを起動し、以下のトランспортを通じてメイン JSON-RPC 接続で通信します。

  • stdio
    (出力標準をプロトコルメッセージに予約)
  • Node IPC

状態の同期フロー

型サーバーには十分なワークスペースおよびドキュメント状態を受け取る必要があります。通常は以下のような手順で行われます。

  1. 通常の LSP 初期化とドキュメント同期を行う。
  2. 同じ JSON-RPC 接続上で
    typeServer/*
    リクエスト
    を送信する。

オプション:追加読み取り専用接続

TSP は、メイン接続(初期化・状態管理など)とは別に、追加の読み取り専用接続をサポートします。

  • 両者がネゴシエーションした場合のみ開かれます。
  • メイン接続が変更可能な状態を管理し続け、追加接続で読み取り専用クエリを実行できます。

起動シーケンス

典型的なセッションは以下の順序で進みます。

  1. クライアントが型サーバーを起動または接続します。
  2. LSP の
    initialize
    /
    initialized
    メッセージで共有ワークスペース状態を初期化します。
  3. クライアントは
    typeServer/getSupportedProtocolVersion
    を呼び出し、互換性を検証します。
  4. クライアントは
    typeServer/getSnapshot
    を呼び出して、最初のスナップショット識別子を入手します。
  5. 現在のスナップショットを添えて、型クエリなどを送信します。
  6. 型結果が無効になった場合(ファイル変更など)、サーバーは
    typeServer/snapshotChanged
    を送信します。

マルチ接続モード

大量の型クエリやバックグラウンドワーカーなどの同時実行を最適化するためのオプション機能です。

  • メイン接続:ワークスペース状態の変更を管理(書可能)。
  • 追加接続:読み取り専用の TSP リクエストを実行。
  • 注意: マルチ接続サポートはプロトコルの必須条件ではありませんが、大量処理時に推奨されます。

キャパビリティハンドシェイク

マルチ接続サポートは LSP

initialize
のネゴシエーションで決定されます。

クライアント側の広告(Advertisement)

実験機能領域に以下の構造を返します:

{
  "capabilities": {
    "experimental": {
      "typeServerMultiConnection": {
        "supportedTransports": ["ipc"]
      }
    }
  }
}

サーバー側の広告

サーバーも同様の構造を

initialize
レスポンスで返すことで、両方がサポートしていることを示します。

有効になる条件:

  • 両側が
    typeServerMultiConnection
    を広告すること。
  • 共有するトランспорт(例:
    ipc
    )が少なくとも 1 つ存在すること。
  • どちらかが能力を省略したり、共通するトランспортがなければ、セッションは単一接続のままになります。

現在標準的にサポートされている追加接続トランポート種別は

ipc
です。


追加接続の開通と閉鎖

ネゴシエーション後、メイン接続上で

typeServer/connection
を使用してチャンネルを管理します。

チャンネル開通(Open)

クライアントが送信するリクエスト:

{
  "type": "open",
  "kind": "ipc",
  "args": ["<ipc-endpoint>"]
}
  • 成功時:
    success: true
    を含む結果を返す。
  • 失敗時:
    success: false
    とエラーメッセージを返す。

IPC エンドポイント引数

プラットフォーム依存の形式があります。

フルダプлекс(双方向)ストリームの場合:

{
  "type": "open",
  "kind": "ipc",
  "args": ["<full-duplex-ipc-endpoint>"]
}

片方向エンドポイントのみ公開する場合(入力/出力ペア):

{
  "type": "open",
  "kind": "ipc",
  "args": ["<input-ipc-endpoint>", "<output-ipc-endpoint>"]
}

チャンネル閉鎖(Close)

クライアントが送信するリクエスト:

{
  "type": "close",
  "kind": "ipc",
  "args": ["<ipc-endpoint>"]
}
  • args
    は開通時の形式と同じです(双方向なら 1 つ、片方向なら 2 つ)。
  • サーバーは対応するチャンネルの提供を停止し、トランポートを閉じます。

許可されたトラフィック

メイン接続

すべての状態変更トラフィックを管理します。以下のメッセージのみ許されます:

  • LSP の初期化およびライフサイクルメッセージ。
  • ワークスペース、設定、ファイルウォッチャー、ドキュメント同期通知。
  • サーバーからクライアントへのスナップショット通知。
  • typeServer/connection
    コントロールリクエスト。

追加接続(読み取り専用)

TSP 専用です。以下の制限があります。

  • サーバーの状態を変更しません。
  • クライアントが提供したスナップショットの結果が無効になっているようなリクエストにのみ使用できます。
  • ネゴシエされた TSP バージョンに基づき、特定のリクエストのみ許可されます(後述の表参照)。

サーバー側の拒否処理: 追加接続で受け取った場合、以下のいずれかを拒否すべきです:

  • LSP のトラフィック
  • 状態変更通知
  • typeServer/connection
    リクエスト
  • ネゴシエされたバージョンに許可されていないあらゆる TSP メッセージ

バージョン別の追加接続メッセージ(TSP 0.4.1)

メッセージ名機能
typeServer/getSupportedProtocolVersion
プロトコルバージョン照会
typeServer/getSnapshot
スナップショット取得
typeServer/getPythonSearchPaths
Python 検索パス取得
typeServer/resolveImport
インポート解決
typeServer/getComputedType
計算された型取得
typeServer/getDeclaredType
宣言された型取得
typeServer/getExpectedType
想定される型取得

スナップショット

スナップショットは、型サーバーの分析状態の時点ごとのビューを識別するための非負整数です。

  • 型ハンドルやオブジェクトは、明示的に別のことを述べない限り、そのスナップショットで有効です。
  • 分析結果が無効化されるたびに(ファイル変更、設定変更など)、サーバーはスナップショットを進める必要があります。

スナップショットルール

項目動作
typeServer/getSnapshot
現在のスナップショット識別子を返します。
識別子の順序セッション中は減少してはいけません。
typeServer/snapshotChanged
以前と新しいスナップショット識別子を報告します。
古いスナップショットの要求JSON-RPC エラーで失敗し、クライアントは再試行(新スナップショット取得)する必要があります。推奨エラーコード:
-32802 (ServerCancelled)
。

位置と範囲

TSP は LSP の位置慣習に従います。

  • ライン番号: 0 ベース
  • 文字オフセット: 0 ベースの UTF-16 コードユニット
  • 範囲: 開始位置と終了位置を使用してソーススパンを識別

型サーバーが異なるエンコーディング(例:Byte Offset)で位置を保持する場合、プロトコル境界で LSP 形式への変換が必要です。不適切な変換は構文ノード情報の誤りを引き起こします。


ノード、宣言、およびハンドル

型クエリリクエスト(

getComputedType
など)は、以下のいずれかでソース構造を識別します:

  • ノード: URI + ソース範囲
  • 宣言: シンボル定義場所と方法(AST ノードを持つ通常のもの、または合成宣言)。

特殊値
InvalidHandle

  • 値: -1
  • 意味: 無効または利用できないハンドル。
  • 扱い: クライアントとサーバーはこれを有効なオブジェクト ID ではなく、Sentinel 値として扱う必要があります。

型結果(Type Objects)

型結果は JSON シリアライズ可能なタグ付きオブジェクトです。

Discriminator
(数値種別)により解釈方法が区別されます。

種別一覧

種別 (Discriminator)タイプ名説明
0
BuiltInunknown, any, unbound, ellipsis, never など不確かな型
1
Declaredソースで宣言された型のベース(直接使用稀)
2
Functiondef ステートメントからの関数とメソッド
3
Classクラスとそのインスタンス
4
Unionユニオン型 (例:
int | str
)
5
Moduleモジュールオブジェクト (例:
import os
の場合)
6
TypeVar型変数 (T, P, Ts など)
7
Overloaded複数の
@overload
サインチャを持つ関数
8
Synthesized型チェックャーによって合成された型
9
TypeReference別の型の参照(重複排除、循環処理用)

型 ID とスナップショットの関係

  • 返される型オブジェクトは、そのリクエストで使用されたスナップショットのみ有効です。
  • 型 ID はシリアライズされたグラフ内で
    TypeReference
    を介して参照されますが、別のレスポンス間で比較してはなりません(グローバル ID でありません)。
  • 大きなまたは再帰的なグラフを避けるために
    TypeReference
    を使用します。

プロトコル表面:メッセージ一覧

現在のプロトコルは意図的に小さく設定されています。下表にすべての TSP メッセージ、方向、パラメータ形状を示します。

メッセージ方向パラメータ結果
getSupportedProtocolVersion
C→Sなしstring (semver)
getSnapshot
C→Sなしnumber
snapshotChanged
S→C
{ old, new }
通知
connection
C→S
{ type, kind, args? }
{ success, message? }
getPythonSearchPaths
C→S
{ fromUri, snapshot }
string[] | undefined
resolveImport
C→S
{ sourceUri, moduleDescriptor, snapshot }
string | undefined
getComputedType
C→S
{ arg: Node|Decl, snapshot }
Type | undefined
getDeclaredType
C→S
{ arg: Node|Decl, snapshot }
Type | undefined
getExpectedType
C→S
{ arg: Node|Decl, snapshot }
Type | undefined
  • サーバーは統合するクライアントによって要求されるメッセージを実装し、結果形状で許可されている場所のみ
    undefined
    を返すべきです。

型クエリの違い

3 つの型クエリリクエストは、報告される型の種類が異なります。

  1. getComputedType
    : コードフローから推測された型
    • 例:
      a: int
      を絞り込み
      b = a + 1
      とすると、
      b
      は
      int
      。
  2. getDeclaredType
    : ソースに明示的に記述された型
    • 例:
      def foo(a: int \| str)
      の場合、
      a
      は
      int \| str
      。
  3. getExpectedType
    : 周囲のコンテキストが期待する型
    • 例:
      foo(4)
      の呼び出しにおける引数の想定型は
      int \| str
      。

エラー処理

標準的な JSON-RPC エラーレスポンスを使用します。

シチュエーションエラーコードガイドライン
古いスナップショット
-32802
(ServerCancelled)
クライアントは新しいスナップショットを要求して再試行できます。
無効なパラメータ
-32602
(InvalidParams)
必要なフィールドが欠落しているか、破損しています。
内部エラー
-32603
(InternalError)
サーバーが予期せぬ失敗をしました。

メッセージ詳細の注意点: エラーには失敗したリクエストを特定するのに十分な情報を含める必要がありますが、ローカルシークレットや実装固有の状態を暴露してはなりません。


互換性チェックリスト

型サーバーは以下の振る舞いを検証すべきです。

  • getSupportedProtocolVersion
    はクライアントの SemVer と互換性を保つ文字列を返す。
  • すべてのペイロードはプロトコルアティファクトに従ってシリアライズされる。
  • getSnapshot
    は減少しない非負整数を返す。
  • ファイルや設定の変更がスナップショット無効化を適切に引き起こす。
  • 古いスナップショットへの要求は再試行可能なエラー(-32802)で失敗する。
  • 位置・範囲の変換に LSP 規格(0 ベース UTF-16)を使用する。
  • インポート解決はドキュメント URI または結果なしを返す。
  • 型クエリは適切な Type オブジェクトまたは
    undefined
    を返す。
  • マルチ接続はネゴシエ可能なトランポートのみ広告する。
  • 追加接続は許可された TSP メッセージのみ受け入れ、その他を拒否する。

最終更新情報: この仕様の最後のコンテンツ更新は Pylance 2026.4.1 と一致しています。

同じ日のほかのニュース

一覧に戻る →

2026/10/27 6:18

コリドーキー 2.0

## Japanese Translation: Corridor Digital は、CorridorKey 2.0(CK2.0)を発売しました。これは、Resolve、Nuke、After Effects、Premiere Pro、Blender のすべてに対応した初の公式ワンクリックキーイングプラグインです。サブスクリプションモデルとは異なり、一回購入制を採用し、柔軟なライセンス体系を提供しています。個人ユーザーは 2 回のアクティベーションが可能で、スタジオでは最大 24 セットまでの中央集約型請求によるライセンスが可能です。ソフトウェアは「Son of a Dungeon」(11 月 7 日初公開予定)からの 400 ショット以上を使用した厳密な 6 ヶ月のテストに基づいて構築されており、ネイティブ 4K HDR、浮動小数点色深度、フリッカー除去、ヘアやモーションブラーといった複雑な要素に対して AlphaHint インプットなどの機能により対応しています。 **ハードウェア要件:** Windows PC に NVIDIA RTX グラフィックスカード(RTX 30 シリーズ以降が推奨、ベータ版では RTX 20 で対応)または macOS 14 以降を実行する M シリーズ Mac の必要があります。Linux、Intel マック、AMD GPU は現時点で未対応です。Mac ではスタンドアロンアプリに加え、OpenFX/Blender/AE/Pr プラグインが提供されます。 **価格とスケジュール:** 個人向けベータ版価格は税金込みで 54.45 ドル(米ドル)ですが、11 月 21 日以降は 108.90 ドルに引き上がります。スタジオ向けボリューム価格は 1 セットあたり 42.50 ドルから始まり、11 月 21 日以降は引き上がります。ベータコード CK2BETA は 11 月 20 日まで有効です。本製品には 14 日間の全額返金保証が含まれ、月額費用なしでアーティストに強力な合成制御を提供し、2.x ラインのライフタイムアップデートを約束しています。

2026/10/27 0:11

セバスチャン・ラスカによるゼロから始める推論モデル構築ビデオコース

## Japanese Translation: 本稿では、ゼロから環境設定を開始し、Python および PyTorch を用いて高度な推論モデルを構築する方法を教える 8 部構成の 11 時間の動画シリーズを紹介する。これらのモデルは標準的な LLM よりも大幅に高性能であり、検証可能な報酬を取り入れたポストトレーニング手法やインフェレンススケールアップにより達成されている。カリキュラムでは、事前学習済みの Qwen3 0.6B モデルをベースとして使用し、強化学習(RLVR)、教師モデルからの蒸留(例:DeepSeek R1)、MATH-500 データセットに対する数学回答検証器等の独自ツールを用いた評価といった技術を実装する。具体的なモジュールには、環境設定、検証器の構築、インフェレンススケールアップ(自己一貫性投票を含む)、自己改善ループ、Group Relative Policy Optimization(GRPO)を用いた RLVR 訓練、KL ロスなどの訓練指標の解析が含まれる。「Build a Reasoning Model (From Scratch)」という本によって裏付けられ、これらのリソースは、文脈管理やツール利用を制御するアクセスしやすい「エージェントハネス」を通じて、コーディングや旅行予約といった複雑なタスクを実行できる洗練された AI エージェントを作成することを学習者に導く。

2026/10/27 0:51

CSS-Tricks に新たなオーナーが登場

## Japanese Translation: Chris Coyier が CSS-Tricks の独立した所有権を回復し、DigitalOcean による 2022 年の買収を完了させ、プラットフォームを元のミッションへ再転換させた。同サイトは表示広告、スポンサード記事、ニュースレターのスポンサー、 merchandise、特典(Discord アクセスなど)を含むメンバーシップ、および将来のカートージ購入を通じて広告支援収益へと復帰する予定である。コンテンツは、専門家の中心となるチュートリアルから、初心者に親しみやすく、包摂的な学習へシフトし、フロントエンド開発における重要なスキルギャップに対処するため、HTML/CSS カリキュラムを含む新編も発表される。発行頻度は一時的に週 1〜2 記事へと減少するが、Coyier はバックログの整理を進める一方で、「Publisher」として背景で引き続き活動し、コミュニティ構築とゲスト寄稿を優先する。ゲスト執筆フォームは再開設され、事前承認された作品から順次掲載されるため、新規投稿は遅延を招く可能性がある。また、非常に低い品質(「スロップ」)の投稿は受け付けられない。金銭的支援以外の選択肢には、ニュースレターの購読、コンテンツの共有、RSS フィードの利用、そしてスポンサーサイトへの訪問がある。総じて、刷新されたサイトは、フロントエンド学習の旅路にあるすべての人のための明確なエントリーポイントを提供することを目標とする。

タイプサーバープロトコル | そっか~ニュース