Subversion Repositories Games.Chess Giants

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
40 pmbaty 1
 
2
 
3
Description of the universal chess interface (UCI)    April  2006
4
=================================================================
5
 
6
* The specification is independent of the operating system. For Windows,
7
  the engine is a normal exe file, either a console or "real" windows application.
8
 
9
* all communication is done via standard input and output with text commands,
10
 
11
* The engine should boot and wait for input from the GUI,
12
  the engine should wait for the "isready" or "setoption" command to set up its internal parameters
13
  as the boot process should be as quick as possible.
14
 
15
* the engine must always be able to process input from stdin, even while thinking.
16
 
17
* all command strings the engine receives will end with '\n',
18
  also all commands the GUI receives should end with '\n',
19
  Note: '\n' can be 0x0d or 0x0a0d or any combination depending on your OS.
20
  If you use Engine and GUI in the same OS this should be no problem if you communicate in text mode,
21
  but be aware of this when for example running a Linux engine in a Windows GUI.
22
 
23
* arbitrary white space between tokens is allowed
24
  Example: "debug on\n" and  "   debug     on  \n" and "\t  debug \t  \t\ton\t  \n"
25
  all set the debug mode of the engine on.
26
 
27
* The engine will always be in forced mode which means it should never start calculating
28
  or pondering without receiving a "go" command first.
29
 
30
* Before the engine is asked to search on a position, there will always be a position command
31
  to tell the engine about the current position.
32
 
33
* by default all the opening book handling is done by the GUI,
34
  but there is an option for the engine to use its own book ("OwnBook" option, see below)
35
 
36
* if the engine or the GUI receives an unknown command or token it should just ignore it and try to
37
  parse the rest of the string in this line.
38
  Examples: "joho debug on\n" should switch the debug mode on given that joho is not defined,
39
            "debug joho on\n" will be undefined however.
40
 
41
* if the engine receives a command which is not supposed to come, for example "stop" when the engine is
42
  not calculating, it should also just ignore it.
43
 
44
 
45
Move format:
46
------------
47
 
48
The move format is in long algebraic notation.
49
A nullmove from the Engine to the GUI should be sent as 0000.
50
Examples:  e2e4, e7e5, e1g1 (white short castling), e7e8q (for promotion)
51
 
52
 
53
 
54
GUI to engine:
55
--------------
56
 
57
These are all the command the engine gets from the interface.
58
 
59
* uci
60
	tell engine to use the uci (universal chess interface),
61
	this will be sent once as a first command after program boot
62
	to tell the engine to switch to uci mode.
63
	After receiving the uci command the engine must identify itself with the "id" command
64
	and send the "option" commands to tell the GUI which engine settings the engine supports if any.
65
	After that the engine should send "uciok" to acknowledge the uci mode.
66
	If no uciok is sent within a certain time period, the engine task will be killed by the GUI.
67
 
68
* debug [ on | off ]
69
	switch the debug mode of the engine on and off.
70
	In debug mode the engine should send additional infos to the GUI, e.g. with the "info string" command,
71
	to help debugging, e.g. the commands that the engine has received etc.
72
	This mode should be switched off by default and this command can be sent
73
	any time, also when the engine is thinking.
74
 
75
* isready
76
	this is used to synchronize the engine with the GUI. When the GUI has sent a command or
77
	multiple commands that can take some time to complete,
78
	this command can be used to wait for the engine to be ready again or
79
	to ping the engine to find out if it is still alive.
80
	E.g. this should be sent after setting the path to the tablebases as this can take some time.
81
	This command is also required once before the engine is asked to do any search
82
	to wait for the engine to finish initializing.
83
	This command must always be answered with "readyok" and can be sent also when the engine is calculating
84
	in which case the engine should also immediately answer with "readyok" without stopping the search.
85
 
86
* setoption name <id> [value <x>]
87
	this is sent to the engine when the user wants to change the internal parameters
88
	of the engine. For the "button" type no value is needed.
89
	One string will be sent for each parameter and this will only be sent when the engine is waiting.
90
	The name and value of the option in <id> should not be case sensitive and can inlude spaces.
91
	The substrings "value" and "name" should be avoided in <id> and <x> to allow unambiguous parsing,
92
	for example do not use <name> = "draw value".
93
	Here are some strings for the example below:
94
	   "setoption name Nullmove value true\n"
95
      "setoption name Selectivity value 3\n"
96
	   "setoption name Style value Risky\n"
97
	   "setoption name Clear Hash\n"
98
	   "setoption name NalimovPath value c:\chess\tb\4;c:\chess\tb\5\n"
99
 
100
* ucinewgame
101
   this is sent to the engine when the next search (started with "position" and "go") will be from
102
   a different game. This can be a new game the engine should play or a new game it should analyse but
103
   also the next position from a testsuite with positions only.
104
   If the GUI hasn't sent a "ucinewgame" before the first "position" command, the engine shouldn't
105
   expect any further ucinewgame commands as the GUI is probably not supporting the ucinewgame command.
106
   So the engine should not rely on this command even though all new GUIs should support it.
107
   As the engine's reaction to "ucinewgame" can take some time the GUI should always send "isready"
108
   after "ucinewgame" to wait for the engine to finish its operation.
109
 
110
* position [fen <fenstring> | startpos ]  moves <move1> .... <movei>
111
	set up the position described in fenstring on the internal board and
112
	play the moves on the internal chess board.
113
	if the game was played  from the start position the string "startpos" will be sent
114
	Note: no "new" command is needed. However, if this position is from a different game than
115
	the last position sent to the engine, the GUI should have sent a "ucinewgame" inbetween.
116
 
117
* go
118
	start calculating on the current position set up with the "position" command.
119
	There are a number of commands that can follow this command, all will be sent in the same string.
120
	If one command is not sent its value should be interpreted as it would not influence the search.
121
	* searchmoves <move1> .... <movei>
122
		restrict search to this moves only
123
		Example: After "position startpos" and "go infinite searchmoves e2e4 d2d4"
124
		the engine should only search the two moves e2e4 and d2d4 in the initial position.
125
	* ponder
126
		start searching in pondering mode.
127
		Do not exit the search in ponder mode, even if it's mate!
128
		This means that the last move sent in in the position string is the ponder move.
129
		The engine can do what it wants to do, but after a "ponderhit" command
130
		it should execute the suggested move to ponder on. This means that the ponder move sent by
131
		the GUI can be interpreted as a recommendation about which move to ponder. However, if the
132
		engine decides to ponder on a different move, it should not display any mainlines as they are
133
		likely to be misinterpreted by the GUI because the GUI expects the engine to ponder
134
	   on the suggested move.
135
	* wtime <x>
136
		white has x msec left on the clock
137
	* btime <x>
138
		black has x msec left on the clock
139
	* winc <x>
140
		white increment per move in mseconds if x > 0
141
	* binc <x>
142
		black increment per move in mseconds if x > 0
143
	* movestogo <x>
144
      there are x moves to the next time control,
145
		this will only be sent if x > 0,
146
		if you don't get this and get the wtime and btime it's sudden death
147
	* depth <x>
148
		search x plies only.
149
	* nodes <x>
150
	   search x nodes only,
151
	* mate <x>
152
		search for a mate in x moves
153
	* movetime <x>
154
		search exactly x mseconds
155
	* infinite
156
		search until the "stop" command. Do not exit the search without being told so in this mode!
157
 
158
* stop
159
	stop calculating as soon as possible,
160
	don't forget the "bestmove" and possibly the "ponder" token when finishing the search
161
 
162
* ponderhit
163
	the user has played the expected move. This will be sent if the engine was told to ponder on the same move
164
	the user has played. The engine should continue searching but switch from pondering to normal search.
165
 
166
* quit
167
	quit the program as soon as possible
168
 
169
 
170
Engine to GUI:
171
--------------
172
 
173
* id
174
	* name <x>
175
		this must be sent after receiving the "uci" command to identify the engine,
176
		e.g. "id name Shredder X.Y\n"
177
	* author <x>
178
		this must be sent after receiving the "uci" command to identify the engine,
179
		e.g. "id author Stefan MK\n"
180
 
181
* uciok
182
	Must be sent after the id and optional options to tell the GUI that the engine
183
	has sent all infos and is ready in uci mode.
184
 
185
* readyok
186
	This must be sent when the engine has received an "isready" command and has
187
	processed all input and is ready to accept new commands now.
188
	It is usually sent after a command that can take some time to be able to wait for the engine,
189
	but it can be used anytime, even when the engine is searching,
190
	and must always be answered with "isready".
191
 
192
* bestmove <move1> [ ponder <move2> ]
193
	the engine has stopped searching and found the move <move> best in this position.
194
	the engine can send the move it likes to ponder on. The engine must not start pondering automatically.
195
	this command must always be sent if the engine stops searching, also in pondering mode if there is a
196
	"stop" command, so for every "go" command a "bestmove" command is needed!
197
	Directly before that the engine should send a final "info" command with the final search information,
198
	the the GUI has the complete statistics about the last search.
199
 
200
* info
201
	the engine wants to send information to the GUI. This should be done whenever one of the info has changed.
202
	The engine can send only selected infos or multiple infos with one info command,
203
	e.g. "info currmove e2e4 currmovenumber 1" or
204
	     "info depth 12 nodes 123456 nps 100000".
205
	Also all infos belonging to the pv should be sent together
206
	e.g. "info depth 2 score cp 214 time 1242 nodes 2124 nps 34928 pv e2e4 e7e5 g1f3"
207
	I suggest to start sending "currmove", "currmovenumber", "currline" and "refutation" only after one second
208
	to avoid too much traffic.
209
	Additional info:
210
	* depth <x>
211
		search depth in plies
212
	* seldepth <x>
213
		selective search depth in plies,
214
		if the engine sends seldepth there must also be a "depth" present in the same string.
215
	* time <x>
216
		the time searched in ms, this should be sent together with the pv.
217
	* nodes <x>
218
		x nodes searched, the engine should send this info regularly
219
	* pv <move1> ... <movei>
220
		the best line found
221
	* multipv <num>
222
		this for the multi pv mode.
223
		for the best move/pv add "multipv 1" in the string when you send the pv.
224
		in k-best mode always send all k variants in k strings together.
225
	* score
226
		* cp <x>
227
			the score from the engine's point of view in centipawns.
228
		* mate <y>
229
			mate in y moves, not plies.
230
			If the engine is getting mated use negative values for y.
231
		* lowerbound
232
	      the score is just a lower bound.
233
		* upperbound
234
		   the score is just an upper bound.
235
	* currmove <move>
236
		currently searching this move
237
	* currmovenumber <x>
238
		currently searching move number x, for the first move x should be 1 not 0.
239
	* hashfull <x>
240
		the hash is x permill full, the engine should send this info regularly
241
	* nps <x>
242
		x nodes per second searched, the engine should send this info regularly
243
	* tbhits <x>
244
		x positions where found in the endgame table bases
245
	* sbhits <x>
246
		x positions where found in the shredder endgame databases
247
	* cpuload <x>
248
		the cpu usage of the engine is x permill.
249
	* string <str>
250
		any string str which will be displayed be the engine,
251
		if there is a string command the rest of the line will be interpreted as <str>.
252
	* refutation <move1> <move2> ... <movei>
253
	   move <move1> is refuted by the line <move2> ... <movei>, i can be any number >= 1.
254
	   Example: after move d1h5 is searched, the engine can send
255
	   "info refutation d1h5 g6h5"
256
	   if g6h5 is the best answer after d1h5 or if g6h5 refutes the move d1h5.
257
	   if there is no refutation for d1h5 found, the engine should just send
258
	   "info refutation d1h5"
259
		The engine should only send this if the option "UCI_ShowRefutations" is set to true.
260
	* currline <cpunr> <move1> ... <movei>
261
	   this is the current line the engine is calculating. <cpunr> is the number of the cpu if
262
	   the engine is running on more than one cpu. <cpunr> = 1,2,3....
263
	   if the engine is just using one cpu, <cpunr> can be omitted.
264
	   If <cpunr> is greater than 1, always send all k lines in k strings together.
265
		The engine should only send this if the option "UCI_ShowCurrLine" is set to true.
266
 
267
 
268
* option
269
	This command tells the GUI which parameters can be changed in the engine.
270
	This should be sent once at engine startup after the "uci" and the "id" commands
271
	if any parameter can be changed in the engine.
272
	The GUI should parse this and build a dialog for the user to change the settings.
273
	Note that not every option needs to appear in this dialog as some options like
274
	"Ponder", "UCI_AnalyseMode", etc. are better handled elsewhere or are set automatically.
275
	If the user wants to change some settings, the GUI will send a "setoption" command to the engine.
276
	Note that the GUI need not send the setoption command when starting the engine for every option if
277
	it doesn't want to change the default value.
278
	For all allowed combinations see the examples below,
279
	as some combinations of this tokens don't make sense.
280
	One string will be sent for each parameter.
281
	* name <id>
282
		The option has the name id.
283
		Certain options have a fixed value for <id>, which means that the semantics of this option is fixed.
284
		Usually those options should not be displayed in the normal engine options window of the GUI but
285
		get a special treatment. "Pondering" for example should be set automatically when pondering is
286
		enabled or disabled in the GUI options. The same for "UCI_AnalyseMode" which should also be set
287
		automatically by the GUI. All those certain options have the prefix "UCI_" except for the
288
		first 6 options below. If the GUI gets an unknown Option with the prefix "UCI_", it should just
289
		ignore it and not display it in the engine's options dialog.
290
		* <id> = Hash, type is spin
291
			the value in MB for memory for hash tables can be changed,
292
			this should be answered with the first "setoptions" command at program boot
293
			if the engine has sent the appropriate "option name Hash" command,
294
			which should be supported by all engines!
295
			So the engine should use a very small hash first as default.
296
		* <id> = NalimovPath, type string
297
			this is the path on the hard disk to the Nalimov compressed format.
298
			Multiple directories can be concatenated with ";"
299
		* <id> = NalimovCache, type spin
300
			this is the size in MB for the cache for the nalimov table bases
301
			These last two options should also be present in the initial options exchange dialog
302
			when the engine is booted if the engine supports it
303
		* <id> = Ponder, type check
304
			this means that the engine is able to ponder.
305
			The GUI will send this whenever pondering is possible or not.
306
			Note: The engine should not start pondering on its own if this is enabled, this option is only
307
			needed because the engine might change its time management algorithm when pondering is allowed.
308
		* <id> = OwnBook, type check
309
			this means that the engine has its own book which is accessed by the engine itself.
310
			if this is set, the engine takes care of the opening book and the GUI will never
311
			execute a move out of its book for the engine. If this is set to false by the GUI,
312
			the engine should not access its own book.
313
		* <id> = MultiPV, type spin
314
			the engine supports multi best line or k-best mode. the default value is 1
315
		* <id> = UCI_ShowCurrLine, type check, should be false by default,
316
			the engine can show the current line it is calculating. see "info currline" above.
317
		* <id> = UCI_ShowRefutations, type check, should be false by default,
318
			the engine can show a move and its refutation in a line. see "info refutations" above.
319
		* <id> = UCI_LimitStrength, type check, should be false by default,
320
			The engine is able to limit its strength to a specific Elo number,
321
		   This should always be implemented together with "UCI_Elo".
322
		* <id> = UCI_Elo, type spin
323
			The engine can limit its strength in Elo within this interval.
324
			If UCI_LimitStrength is set to false, this value should be ignored.
325
			If UCI_LimitStrength is set to true, the engine should play with this specific strength.
326
		   This should always be implemented together with "UCI_LimitStrength".
327
		* <id> = UCI_AnalyseMode, type check
328
		   The engine wants to behave differently when analysing or playing a game.
329
		   For example when playing it can use some kind of learning.
330
		   This is set to false if the engine is playing a game, otherwise it is true.
331
		 * <id> = UCI_Opponent, type string
332
		   With this command the GUI can send the name, title, elo and if the engine is playing a human
333
		   or computer to the engine.
334
		   The format of the string has to be [GM|IM|FM|WGM|WIM|none] [<elo>|none] [computer|human] <name>
335
		   Examples:
336
		   "setoption name UCI_Opponent value GM 2800 human Gary Kasparov"
337
		   "setoption name UCI_Opponent value none none computer Shredder"
338
		 * <id> = UCI_EngineAbout, type string
339
		   With this command, the engine tells the GUI information about itself, for example a license text,
340
		   usually it doesn't make sense that the GUI changes this text with the setoption command.
341
		   Example:
342
			"option name UCI_EngineAbout type string default Shredder by Stefan Meyer-Kahlen, see www.shredderchess.com"
343
		* <id> = UCI_ShredderbasesPath, type string
344
			this is either the path to the folder on the hard disk containing the Shredder endgame databases or
345
			the path and filename of one Shredder endgame datbase.
346
	   * <id> = UCI_SetPositionValue, type string
347
	      the GUI can send this to the engine to tell the engine to use a certain value in centipawns from white's
348
	      point of view if evaluating this specifix position. 
349
	      The string can have the formats:
350
	      <value> + <fen> | clear + <fen> | clearall
351
 
352
	* type <t>
353
		The option has type t.
354
		There are 5 different types of options the engine can send
355
		* check
356
			a checkbox that can either be true or false
357
		* spin
358
			a spin wheel that can be an integer in a certain range
359
		* combo
360
			a combo box that can have different predefined strings as a value
361
		* button
362
			a button that can be pressed to send a command to the engine
363
		* string
364
			a text field that has a string as a value,
365
			an empty string has the value "<empty>"
366
	* default <x>
367
		the default value of this parameter is x
368
	* min <x>
369
		the minimum value of this parameter is x
370
	* max <x>
371
		the maximum value of this parameter is x
372
	* var <x>
373
		a predefined value of this parameter is x
374
	Examples:
375
    Here are 5 strings for each of the 5 possible types of options
376
	   "option name Nullmove type check default true\n"
377
      "option name Selectivity type spin default 2 min 0 max 4\n"
378
	   "option name Style type combo default Normal var Solid var Normal var Risky\n"
379
	   "option name NalimovPath type string default c:\\n"
380
	   "option name Clear Hash type button\n"
381
 
382
 
383
 
384
Examples:
385
---------
386
 
387
This is how the communication when the engine boots can look like:
388
 
389
GUI     engine
390
 
391
// tell the engine to switch to UCI mode
392
uci
393
 
394
// engine identify  
395
      id name Shredder
396
		id author Stefan MK
397
 
398
// engine sends the options it can change
399
// the engine can change the hash size from 1 to 128 MB
400
		option name Hash type spin default 1 min 1 max 128
401
 
402
// the engine supports Nalimov endgame tablebases
403
		option name NalimovPath type string default <empty>
404
		option name NalimovCache type spin default 1 min 1 max 32
405
 
406
// the engine can switch off Nullmove and set the playing style
407
	   option name Nullmove type check default true
408
  		option name Style type combo default Normal var Solid var Normal var Risky
409
 
410
// the engine has sent all parameters and is ready
411
		uciok
412
 
413
// Note: here the GUI can already send a "quit" command if it just wants to find out
414
//       details about the engine, so the engine should not initialize its internal
415
//       parameters before here.
416
// now the GUI sets some values in the engine
417
// set hash to 32 MB
418
setoption name Hash value 32
419
 
420
// init tbs
421
setoption name NalimovCache value 1
422
setoption name NalimovPath value d:\tb;c\tb
423
 
424
// waiting for the engine to finish initializing
425
// this command and the answer is required here!
426
isready
427
 
428
// engine has finished setting up the internal values
429
		readyok
430
 
431
// now we are ready to go
432
 
433
// if the GUI is supporting it, tell the engine that is is
434
// searching on a game that it hasn't searched on before
435
ucinewgame
436
 
437
// if the engine supports the "UCI_AnalyseMode" option and the next search is supposed to
438
// be an analysis, the GUI should set "UCI_AnalyseMode" to true if it is currently
439
// set to false with this engine
440
setoption name UCI_AnalyseMode value true
441
 
442
// tell the engine to search infinite from the start position after 1.e4 e5
443
position startpos moves e2e4 e7e5
444
go infinite
445
 
446
// the engine starts sending infos about the search to the GUI
447
// (only some examples are given)
448
 
449
 
450
		info depth 1 seldepth 0
451
		info score cp 13  depth 1 nodes 13 time 15 pv f1b5 
452
		info depth 2 seldepth 2
453
		info nps 15937
454
		info score cp 14  depth 2 nodes 255 time 15 pv f1c4 f8c5 
455
		info depth 2 seldepth 7 nodes 255
456
		info depth 3 seldepth 7
457
		info nps 26437
458
		info score cp 20  depth 3 nodes 423 time 15 pv f1c4 g8f6 b1c3 
459
		info nps 41562
460
		....
461
 
462
 
463
// here the user has seen enough and asks to stop the searching
464
stop
465
 
466
// the engine has finished searching and is sending the bestmove command
467
// which is needed for every "go" command sent to tell the GUI
468
// that the engine is ready again
469
		bestmove g1f3 ponder d8f6
470
 
471
 
472
 
473
Chess960
474
========
475
 
476
UCI could easily be extended to support Chess960 (also known as Fischer Random Chess).
477
 
478
The engine has to tell the GUI that it is capable of playing Chess960 and the GUI has to tell
479
the engine that is should play according to the Chess960 rules.
480
This is done by the special engine option UCI_Chess960. If the engine knows about Chess960
481
it should send the command 'option name UCI_Chess960 type check default false'
482
to the GUI at program startup.
483
Whenever a Chess960 game is played, the GUI should set this engine option to 'true'.
484
 
485
Castling is different in Chess960 and the white king move when castling short is not always e1g1.
486
A king move could both be the castling king move or just a normal king move.
487
This is why castling moves are sent in the form king "takes" his own rook.
488
Example: e1h1 for the white short castle move in the normal chess start position.
489
 
490
In EPD and FEN position strings specifying the castle rights with w and q is not enough as
491
there could be more than one rook on the right or left side of the king.
492
This is why the castle rights are specified with the letter of the castle rook's line.
493
Upper case letters for white's and lower case letters for black's castling rights.
494
Example: The normal chess position would be:
495
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w AHah -
496