♟️

USIプロトコルとは

2025/02/18に公開

USIプロトコルとは

USIプロトコルは、標準入出力(stdin/stdout)を用いたテキストベースのプロトコルで、UIと思考エンジンがコマンドを送受信することで対局を進めます。

将棋AIでは、UIと思考エンジンの通信にUSI(Universal Shogi Interface)プロトコルがよく使われます。
将棋所ShogiHomeなどはUSIプロトコルに対応しています。

また、局面の表現には SFEN(Shogi Forsyth-Edwards Notation) が使用されます。

SFENとは

SFEN(Shogi Forsyth–Edwards Notation)形式は、USIプロトコル内で将棋の局面を一行の文字列で表現する方法。

サンプル

lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1

サンプルの各要素の説明
盤面の駒配置
1段目:lnsgkgsnl
右から左へ、香、桂、銀、金、玉、金、銀、桂、香
2段目:1r5b1
1つの空きマス、飛車、5つの空きマス、角、1つの空きマス
3段目:ppppppppp
9つの歩
4~6段目:9
各段全て空きマス(9個の空白を意味する)
7段目:PPPPPPPPP
9つの歩(先手側)
8段目:1B5R1
1つの空きマス、角、5つの空きマス、飛車、1つの空きマス
9段目:LNSGKGSNL
右から左へ、香、桂、銀、金、王、金、銀、桂、香
手番

b:後手(下記の例では通常は先手は「b」、後手は「w」と表記される場合もありますが、USIでは「b」が先手、通常は「w」が後手です。ここでは例として「b」と記載しています)
持ち駒

-:現時点でどちらの持ち駒もないことを示す
手数

1:初手であることを示します

詳細な仕様については、以下のページをご参照ください。
🔗 将棋所:USIプロトコルとは

他のプロトコル

UCI(Universal Chess Interface)
将棋のUSIプロトコルは、チェスでよく使われるUCIプロトコルと基本構造が似ていますが、局面表現や独自のコマンド(例: checkmate など)に違いがあります。USIは将棋特有の情報(SFEN、駒の動きなど)に対応しているため、将棋エンジンとの連携に適しています。


USIプロトコルの基本構成

USIプロトコルでは、UIとエンジン間の通信が2方向で行われ、各コマンドは以下の2カテゴリに分類されます。

1. UI → エンジンに送るコマンド

主なコマンド一覧
usi
目的: USIモードで動作することをエンジンに通知し、初期化情報の提示を要求する。
流れ:
GUIが usi コマンドを送信
エンジンは自身の識別情報(名前、作者など)や設定可能なオプションを出力
最後に usiok と応答して、初期化完了を通知

isready
目的: エンジンが次の指示を受け付ける準備が整ったか確認する。
流れ:
GUIが isready を送信
エンジンは内部初期化が完了したら readyok を返答

setoption
目的: エンジンの内部パラメータや動作設定を変更する。
詳細:
例として、探索アルゴリズム、メモリサイズ、カスタムパラメータなどを指定可能。

usinewgame
目的: 新しい対局の開始を通知し、エンジン内部の状態(探索情報やキャッシュなど)をリセットする。

position
目的: 局面の設定を行う。
詳細:
初期配置や任意の局面をSFEN形式で指定可能
局面に至るまでの指し手のリストを付加することもできる

go
目的: エンジンに探索(思考)を開始するよう指示する。
詳細:
探索条件(時間制限、探索深度、ノード数など)の指定が可能
探索中、エンジンは逐次的に思考情報(評価値や候補手など)を出力する場合がある

stop
目的: 現在の探索を中断し、最善手を返すように要求する。

ponderhit
目的: 事前に予想していた相手の指し手が実際に指されたとき、ポンダリング中の探索を引き継ぐ。

quit
目的: エンジンを直ちに終了させる。

gameover
目的: 対局終了の通知を行う。
注意: 実装により扱いが異なる場合があるため、利用時は各ソフトウェアの仕様を確認すること。

2. エンジン → UIに送るコマンド

主なコマンド一覧
id
目的: エンジン自身の識別情報(名前、作者など)をGUIに伝える。
形式: 例 id name MyShogiEngine、id author John Doe

usiok
目的: 初期化情報の提示が完了し、USIモードへの移行が完了したことをGUIに通知する。

readyok
目的: エンジンの準備が整い、次の命令を受け付ける状態にあることをGUIに示す。

bestmove
目的: 探索結果としてエンジンが選んだ最善手をGUIに通知する。
形式: 例 bestmove 7g7f
詳細: 場合によっては探索終了の理由(時間切れや投了など)の情報が付加されることもある

info
目的: 探索中の詳細情報(探索深度、評価値、ノード数、探索時間、候補手など)を逐次的にGUIに報告する。

option
目的: エンジンが利用可能な設定項目やその詳細情報をGUIに通知する。
形式: 例
option name Hash type spin default 128 min 1 max 1024
GUIはこの情報を基にユーザーに対して設定項目を表示し、調整を可能にする。

checkmate
目的: 一部の拡張実装で、詰み(チェックメイト)が確定した局面を示すために用いられるコマンド。
注意: 公式仕様には含まれていないため、利用時は各エンジン・GUIの実装に依存する。

USIプロトコルを用いた通信の流れ

以下は、初期化から対局開始、思考中、対局終了までのコマンドの通信の流れ例です。

初期化フェーズ
UIがusiを送信すると、エンジンは自身の情報(id、optionなど)を返し、最後にusiokで初期化完了を通知します。

準備フェーズ
次に、isreadyに対してエンジンがreadyokと応答し、次のコマンドを受け付ける状態になります。

新局面の設定と対局開始
UIはusinewgameで新対局の開始を伝え、positionで局面(例:初期局面からの指し手の履歴)を設定し、goで探索開始を指示します。

探索中の情報出力
エンジンは探索過程でinfoコマンドを使って逐次情報を出力し、最終的にbestmoveで最善手を通知します。

終了
最後にUIがquitを送信し、エンジンは終了処理を行います。

参考

[1] 将棋所, “USIプロトコルとは”, http://shogidokoro.starfree.jp/usi.html
[2] ShogiHome, “ShogiHome”, https://sunfish-shogi.github.io/shogihome/

Discussion