A Swift package for the following chess engines:
ChessKitEngine
implements the Universal Chess Interface protocol for communication between chess engines and user interfaces built with Swift.
For a related Swift package that manages chess logic, see chesskit-swift.
- Add a package dependency to your Xcode project or Swift Package:
.package(url: "https://github.com/chesskit-app/chesskit-engine", from: "0.2.0")
- Next you can import
ChessKitEngine
to use it in your Swift code:
import ChessKitEngine
// ...
- Initialize an engine and set response handler
// create Stockfish engine
let engine = Engine(type: .stockfish)
// set response handler
engine.receiveResponse = { response in
print(response)
}
// start listening for engine responses
engine.start()
- Send UCI protocol commands
// check that engine is running before sending commands
guard engine.isRunning else { return }
// stop any current engine processing
engine.send(command: .stop)
// set engine position to standard starting chess position
engine.send(command: .position(.startpos))
// start engine analysis with maximum depth of 15
engine.send(command: .go(depth: 15))
- Update engine position after a move is made
// FEN after 1. e4
let newPosition = "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1"
engine.send(command: .stop)
engine.send(command: .position(.fen(newPosition)))
engine.send(command: .go(depth: 15))
- Receive engine's analysis of current position
// receiveResponse is called whenever the engine publishes a response
engine.receiveResponse = { response in
switch response {
case let .info(info):
print(info.score) // engine evaluation score in centipawns
print(info.pv) // array of move strings representing best line
default:
break
}
}
- Terminate engine communication
// stop listening for engine responses
engine.stop()
- Enable engine response logging
// log engine commands and responses to the console
engine.loggingEnabled = true
// Logging is off by default since engines can be very
// verbose while analyzing positions and returning evaluations.
- Enable engine neural networks
- Copy the relevant file in the
Resources
directory of this repo to your app's bundle, then use the engine-specific commands to provide them to the engine (wherefileURL
is aString
of the URL of the file). - These must be called in the order shown.
- For
Stockfish 15.1
(nn-1337b1adec5b.nnue
):engine.send(command: .setoption(id: "EvalFile", value: fileURL)) engine.send(command: .setoption(id: "Use NNUE", value: "true"))
- For
LeelaChessZero 0.29
(192x15_network
):engine.send(command: .setoption(id: "WeightsFile", value: fileURL))
- Copy the relevant file in the
The following engines are currently supported:
Engine | Version | License | Options Reference | |
---|---|---|---|---|
Stockfish | 16.1 | GPL v3 | 🔗 | |
lc0 | 0.29 | GPL v3 | 🔗 |
ChessKitEngine
is distributed under the MIT License.