Skip to content

Gideon-Zucker/async-chesskit-engine

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

108 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

β™ŸοΈπŸ€– ChessKitEngine

A Swift package for the following chess engines:

chesskit-engine 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.

Usage

  1. Add chesskit-engine as a dependency

  2. Next, import ChessKitEngine to use it in Swift code:

import ChessKitEngine

// ...

⚠️ Be sure to check the Neural Networks section below for important setup details.

Features

  • Initialize an engine and set response stream
// create Stockfish engine
let engine = Engine(type: .stockfish)

// set response stream, called when engine issues responses
for await response in await engine.responseStream! {
    print(response)
}

// start listening for engine responses
engine.start()
// check that engine is running before sending commands
guard await engine.isRunning else { return }

// stop any current engine processing
await engine.send(command: .stop)

// set engine position to standard starting chess position
await engine.send(command: .position(.startpos))

// start engine analysis with maximum depth of 15
await 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"

await engine.send(command: .stop)
await engine.send(command: .position(.fen(newPosition)))
await engine.send(command: .go(depth: 15))
  • Receive engine's analysis of current position
// responseStream is called whenever the engine publishes a response
for await response in await engine.responseStream! {
    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
await engine.stop()
  • Enable engine response logging
// log engine commands and responses to the console
engine.setLoggingEnabled(true)

// Logging is off by default since engines can be very
// verbose while analyzing positions and returning evaluations.

Neural Networks

Both Stockfish 17, LeelaChessZero 0.31.1 and Arasan 25.0 require neural network files to be provided to the engine for computation. In order to keep the package size small and allow for the greatest level of flexibility, these neural network files are not bundled with the package. Therefore they must be added to the app (either in the bundle or manually by a user) and then provided to the engine at runtime.

For Stockfish and Lc0, they can be provided to the engine using the .setoption(id:value:) UCI commands included in chesskit-engine.

For example:

// Stockfish
await engine.send(command: .setoption(id: "EvalFile", value: fileURL))
await engine.send(command: .setoption(id: "EvalFileSmall", value: smallFileURL))

// Lc0
await engine.send(command: .setoption(id: "WeightsFile", value: fileURL))

For Arasan the file needs to be set in the arasan.rc file to the following:

  1. Rename the nnue file to arasan.nnue
  2. Open the arsan.rc file, uncomment the line search.nnueFile=
  3. set its value to arasan.nnue

The following details the recommended files for each engine and where to obtain them.

Stockfish

LeelaChessZero

⚠️ There are currently some performance issues with lc0 in chesskit-engine (PR's are welcome!).

Arasan

arasan.rc, arasan.nnue (arasanv3-20241109.nnue) and book.bin can be found in the Tests/Resources folder.

  • Unmodified versions of arasan.rc can be found at: /Sources/ChessKitEngineCore/Engines/Arasan/src/arasan.rc
  • Both book.bin and arasan.nnue files are bundled with official (arasan distributions)

Supported Engines

The following engines are currently supported:

Engine Version License Options Reference
Stockfish 17 GPL v3 πŸ”—
lc0 0.31.1 GPL v3 πŸ”—
Arasan 25.0 MIT License πŸ”—

License

ChessKitEngine is distributed under the MIT License.

About

β™ŸοΈπŸ€– Swift package for UCI chess engines

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages

  • Swift 84.8%
  • C++ 5.4%
  • Objective-C++ 4.7%
  • Objective-C 4.4%
  • C 0.7%