Skip to main content

A High-Performance Research Environment for Riichi Mahjong

Project description


Accelerating Reproducible Mahjong Research

CI Open In Colab Kaggle PyPI - Version crates.io License


✨ Features

  • High Performance: Core logic implemented in Rust for lightning-fast state transitions and rollouts.
  • Gym-style API: Intuitive interface designed specifically for reinforcement learning.
  • Mortal Compatibility: Seamlessly interface with the Mortal Bot using the MJAI protocol.
  • Rule Flexibility: Support for diverse rule sets, including three-player mahjong (sanma).
  • Game Visualization: Integrated replay viewer for Jupyter Notebooks.

📦 Installation

uv add riichienv
# Or
pip install riichienv

Currently, building from source requires the Rust toolchain.

uv sync --dev
uv run maturin develop --release

🚀 Usage

Gym-style API

from riichienv import RiichiEnv
from riichienv.agents import RandomAgent

agent = RandomAgent()
env = RiichiEnv()
obs_dict = env.reset()
while not env.done():
    actions = {player_id: agent.act(obs)
               for player_id, obs in obs_dict.items()}
    obs_dict = env.step(actions)

scores, ranks = env.scores(), env.ranks()
print(scores, ranks)

env.reset() initializes the game state and returns the initial observations. The returned obs_dict maps each active player ID to their respective Observation object.

>>> from riichienv import RiichiEnv
>>> env = RiichiEnv()
>>> obs_dict = env.reset()
>>> obs_dict
{0: <riichienv._riichienv.Observation object at 0x7fae7e52b6e0>}

Use env.done() to check if the game has concluded.

>>> env.done()
False

By default, the environment runs a single round (kyoku). For game rules supporting sudden death or standard match formats like East-only or Half-round, the environment continues until the game-end conditions are met.

Observation

The Observation object provides all relevant information to a player, including the current game state and available legal actions.

obs.new_events() -> list[str] returns a list of MJAI JSON events that are new for that player since their previous observation. On a player's first observation in a hand, this can include start_game, start_kyoku, and earlier events from the hand. The full history for that observation window is accessible via obs.events.

>>> obs = obs_dict[0]
>>> obs.new_events()
['{"id":0,"type":"start_game"}', '{"bakaze":"E","dora_marker":"S", ...}', '{"actor":0,"pai":"6p","type":"tsumo"}']

obs.legal_actions() -> list[Action] provides the list of all valid moves the player can make.

>>> obs.legal_actions()
[Action(action_type=Discard, tile=Some(1), ...), ...]

If your agent communicates via the MJAI protocol, you can easily map an MJAI response to a valid Action object using obs.select_action_from_mjai().

>>> obs.select_action_from_mjai({"type":"dahai","pai":"1m","tsumogiri":False,"actor":0})
Action(action_type=Discard, tile=Some(1), consume_tiles=[])

Compatibility with Mortal

RiichiEnv is fully compatible with the Mortal MJAI bot processing flow. I have confirmed that MortalAgent can execute matches without errors in over 1,000,000+ hanchan games on RiichiEnv.

from riichienv import RiichiEnv, Action, GameRule
from model import load_model

class MortalAgent:
    def __init__(self, player_id: int):
        self.player_id = player_id
        # Initialize your libriichi.mjai.Bot or equivalent
        self.model = load_model(player_id, "./mortal_v4.pth")

    def act(self, obs) -> Action:
        resp = None
        for event in obs.new_events():
            resp = self.model.react(event)

        action = obs.select_action_from_mjai(resp)
        assert action is not None, "Mortal must return a legal action"
        return action

env = RiichiEnv(game_mode="4p-red-half", rule=GameRule.default_tenhou())
agents = {pid: MortalAgent(pid) for pid in range(4)}
obs_dict = env.reset()
while not env.done():
    actions = {pid: agents[pid].act(obs) for pid, obs in obs_dict.items()}
    obs_dict = env.step(actions)

print(env.scores(), env.ranks())

Game Rules and Modes

RiichiEnv separates high-level game flow configuration (Mode) from detailed game mechanics (Rules).

  • Game Mode (game_mode): Configuration for game length (e.g., East-only, Hanchan), player count, and termination conditions (e.g., Tobi/bust, sudden death).
  • Game Rules (rule): Configuration for specific game mechanics (e.g., handling of Chankan (Robbing the Kan) for Kokushi Musou, Kuitan availability, etc.).

1. Game Mode Presets (game_mode)

You can select a standard game mode using the game_mode argument in the constructor. This configures the basic flow of the game.

game_mode Players Mode Mechanics
4p-red-single 4 Single Round No sudden death
4p-red-east 4 East-only (東風; Tonpuu) Standard (Tenhou rule)
4p-red-half 4 Hanchan (半荘) Standard (Tenhou rule)
3p-red-single 3 Single Round No sudden death
3p-red-east 3 East-only (東風; Tonpuu) Standard (Tenhou sanma rule)
3p-red-half 3 Hanchan (半荘) Standard (Tenhou sanma rule)
# Initialize a standard 4-player Hanchan game
env = RiichiEnv(game_mode="4p-red-half")

2. Customizing Game Rules (GameRule)

For detailed rule customization, you can pass a GameRule object to the RiichiEnv constructor. RiichiEnv provides presets for popular platforms (Tenhou, MJSoul) and allows granular configuration.

from riichienv import RiichiEnv, GameRule

# Example 1: Use MJSoul rules (allows Ron on Ankan for Kokushi Musou)
rule_mjsoul = GameRule.default_mjsoul()
env = RiichiEnv(game_mode="4p-red-half", rule=rule_mjsoul)

# Example 2: Fully custom rules based on Tenhou preset
rule_custom = GameRule.default_tenhou()
rule_custom.allows_ron_on_ankan_for_kokushi_musou = True  # Enable Kokushi Chankan
rule_custom.length_of_game_in_rounds = 8  # Force 8 rounds? (Note: Length is mainly controlled by game_mode logic usually)

env = RiichiEnv(game_mode="4p-red-half", rule=rule_custom)

Detailed mechanic flags (like allows_ron_on_ankan_for_kokushi_musou) are defined in the GameRule struct. See RULES.md for a full list of configurable options.

Tile Conversion & Hand Parsing

Standardize between various tile formats (136-tile, MPSZ, MJAI) and easily parse hand strings.

>>> import riichienv.convert as cvt
>>> cvt.mpsz_to_tid("1z")
108

>>> from riichienv import parse_hand
>>> parse_hand("123m406m789m777z")
([0, 4, 8, 12, 16, 20, 24, 28, 32, 132, 133, 134], [])

See DATA_REPRESENTATION.md for more details.

Hand Evaluation

HandEvaluator evaluates a hand for tenpai status, waiting tiles, and winning results. Create an instance with HandEvaluator(tiles, melds) or HandEvaluator.hand_from_text(text).

  • is_tenpai() — returns whether the hand is in tenpai.
  • get_waits() — returns the list of winning tile IDs (34-tile format, 0–33).
  • calc(win_tile, dora_indicators, ura_indicators, conditions) — evaluates the hand with the given winning tile and returns a WinResult.
>>> from riichienv import HandEvaluator
>>> import riichienv.convert as cvt

>>> he = HandEvaluator.hand_from_text("111m33p12s111666z")
>>> he.is_tenpai()
True
>>> he.calc(cvt.mpsz_to_tid("3s"), dora_indicators=[], ura_indicators=[])
WinResult(is_win=True, yakuman=False, ron_agari=12000, tsumo_agari_oya=0, tsumo_agari_ko=0, yaku=[8, 11, 10, 22], han=5, fu=60)

The yaku field contains raw yaku IDs. Use yaku_list() to get detailed Yaku objects with Japanese/English names and platform-specific IDs.

>>> result = he.calc(cvt.mpsz_to_tid("3s"), dora_indicators=[], ura_indicators=[])
>>> for y in result.yaku_list():
...     print(y)
Yaku(id=8, name='役牌 發', name_en='Yakuhai (hatsu)', tenhou_id=19, mjsoul_id=8)
Yaku(id=11, name='場風牌', name_en='Yakuhai (round wind)', tenhou_id=14, mjsoul_id=11)
Yaku(id=10, name='自風牌', name_en='Yakuhai (seat wind)', tenhou_id=10, mjsoul_id=10)
Yaku(id=22, name='三暗刻', name_en='San Ankou', tenhou_id=29, mjsoul_id=22)

Shanten Number Calculation

Calculate the shanten number (minimum number of tiles away from tenpai) using lookup tables based on Cryolite/nyanten. Both 4-player and 3-player mahjong are supported.

4-player mahjong:

>>> from riichienv import parse_hand, calculate_shanten
>>> tiles, _ = parse_hand("123m456p789s11z")
>>> calculate_shanten(tiles)
-1  # complete hand

>>> tiles, _ = parse_hand("123m456p78s11z")
>>> calculate_shanten(tiles)
0  # tenpai

3-player mahjong:

In 3-player mahjong (sanma), tiles 2m-8m do not exist. calculate_shanten_3p correctly handles this by treating manzu tiles (1m, 9m) as honor-like tiles with no sequence potential, using the nyanten lookup tables.

>>> from riichienv import parse_hand, calculate_shanten, calculate_shanten_3p
>>> tiles, _ = parse_hand("111m123456789s11z")
>>> calculate_shanten_3p(tiles)
-1  # complete hand (111m koutsu + souzu shuntsu)

>>> tiles, _ = parse_hand("19m19p19s1234567z")
>>> calculate_shanten_3p(tiles)
0   # kokushi tenpai

>>> # Corner case: 3P shanten can differ from 4P
>>> tiles, _ = parse_hand("1111m111122233z")
>>> calculate_shanten(tiles), calculate_shanten_3p(tiles)
(1, 2)  # 4P tenpai path requires drawing 2m/3m, which don't exist in 3P

Game Visualization

GameViewer renders an interactive 3D replay viewer in Jupyter Notebooks. Use env.get_viewer() to create a viewer from a RiichiEnv instance, or GameViewer.from_jsonl() / GameViewer.from_list() to load from files or event lists.

from riichienv import RiichiEnv
from riichienv.agents import RandomAgent

agent = RandomAgent()
env = RiichiEnv(game_mode="4p-red-half")
obs_dict = env.reset()
while not env.done():
    actions = {pid: agent.act(obs) for pid, obs in obs_dict.items()}
    obs_dict = env.step(actions)

env.get_viewer().show()  # displays the 3D viewer in Jupyter

The returned GameViewer object also provides methods for programmatic inspection:

viewer = env.get_viewer()
viewer.show(step=100, perspective=0)  # show() accepts optional display parameters
viewer.summary()        # list of round info dicts (bakaze, kyoku, honba, oya, scores)
viewer.get_results(0)   # list[WinResult] for round 0

See demos/README.md for full API details and notebook examples.

Event-driven API for Online Inference

RiichiEnv provides two methods for applying MJAI events, designed for different use cases:

Method Signature Returns Use case
apply_event apply_event(event) None Replay parsing, training data generation
observe_event observe_event(event, player_id) Observation | None Online inference (bot play)

Why two methods? apply_event is minimal — it only updates state, leaving observation timing to the caller. This is ideal for batch replay where all events are pre-determined. observe_event combines state update with observation retrieval in a single call, and encapsulates the logic of which events can produce legal actions. This avoids the caller having to manually skip non-action events (start_game, dora, hora, etc.) and separately call get_observation().

apply_event(event) — State update only

Applies an MJAI event dict to advance the game state. Observations must be retrieved separately via get_observation(player_id). This is the right choice when replaying full game logs for training data generation, where all events are already known and observation timing is managed externally (e.g., by KyokuStepIterator).

env = RiichiEnv(game_mode="4p-red-half")
env.apply_event({"type": "start_game"})
env.apply_event({"type": "start_kyoku", "bakaze": "E", ...})
env.apply_event({"type": "tsumo", "actor": 0, "pai": "5m"})
# Manually check for actions:
obs = env.get_observation(player_id=0)
if obs.legal_actions():
    ...

observe_event(event, player_id) — State update + observation

Applies the event and returns an Observation if player_id has legal actions available. Returns None for events that never require decisions (start_game, start_kyoku, dora, hora, ryukyoku, etc.) and when the tracked player has no actions.

This is the recommended API for online inference — feed events one at a time and act whenever a non-None observation is returned.

env = RiichiEnv(game_mode="3p-red-half")
my_seat = 0

for event in mjai_events:
    obs = env.observe_event(event, my_seat)
    if obs is not None:
        # This player needs to act
        action = select_action(obs)  # your model logic
        ...

The key advantage of observe_event is that it handles all the complexity of determining when a player needs to act — including reaction phases (pon, chi, ron) after an opponent's discard. A simple loop over events is sufficient for a fully functional bot:

# 4P example: P1 can pon after P0's discard
env = RiichiEnv(game_mode="default")
env.observe_event({"type": "start_game"}, player_id=1)
env.observe_event({"type": "start_kyoku", ...}, player_id=1)
env.observe_event({"type": "tsumo", "actor": 0, "pai": "?"}, player_id=1)

obs = env.observe_event(
    {"type": "dahai", "actor": 0, "pai": "5m", "tsumogiri": True},
    player_id=1,
)
# obs is not None if player 1 can pon/ron the discarded tile
if obs is not None:
    for a in obs.legal_actions():
        print(a.to_mjai())  # e.g. pon, pass

🛠 Development

For more architectural details and contribution guidelines, see CONTRIBUTING.md and DEVELOPMENT_GUIDE.md.

Check our Milestones for the future roadmap and development plans.

📄 License

Apache License 2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

riichienv-0.4.8.tar.gz (493.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ ARM64

riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl (1.7 MB view details)

Uploaded PyPymanylinux: glibc 2.5+ i686

riichienv-0.4.8-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ ARM64

riichienv-0.4.8-cp314-cp314-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.14Windows x86-64

riichienv-0.4.8-cp314-cp314-win32.whl (1.3 MB view details)

Uploaded CPython 3.14Windows x86

riichienv-0.4.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

riichienv-0.4.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64

riichienv-0.4.8-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl (1.7 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.5+ i686

riichienv-0.4.8-cp314-cp314-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

riichienv-0.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARM64

riichienv-0.4.8-cp313-cp313-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.13Windows x86-64

riichienv-0.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

riichienv-0.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64

riichienv-0.4.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl (1.7 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.5+ i686

riichienv-0.4.8-cp313-cp313-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

riichienv-0.4.8-cp312-cp312-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.12Windows x86-64

riichienv-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

riichienv-0.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64

riichienv-0.4.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl (1.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.5+ i686

riichienv-0.4.8-cp312-cp312-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

riichienv-0.4.8-cp311-cp311-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.11Windows x86-64

riichienv-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

riichienv-0.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

riichienv-0.4.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl (1.7 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.5+ i686

riichienv-0.4.8-cp311-cp311-macosx_11_0_arm64.whl (1.5 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

riichienv-0.4.8-cp310-cp310-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.10Windows x86-64

riichienv-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

riichienv-0.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

riichienv-0.4.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl (1.7 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.5+ i686

File details

Details for the file riichienv-0.4.8.tar.gz.

File metadata

  • Download URL: riichienv-0.4.8.tar.gz
  • Upload date:
  • Size: 493.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for riichienv-0.4.8.tar.gz
Algorithm Hash digest
SHA256 21050fa4da4c53f23c8f5ea2e7b2f969076b4eb3f51ba606e5925b55156864cf
MD5 fa9c91a7a8d7dd74aa28d6db305c513f
BLAKE2b-256 68e572d98a2db79984f43fa8ed9fbdd09600b2f85876b98778b52c252a592f87

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8.tar.gz:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 52d4480330238c052784c7d0a3f649463a160254b0d18c7372ae6f6cc29c12ae
MD5 711bb242152173e5cfa9b8534c662d56
BLAKE2b-256 4ef589548b6432b612c2538674b8dea4de8c3abb6612e319016248df0c4163b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6d48873ec204c3f2daf01e8b9b0d894a380cb25c9ad19e5724cb847802e2602a
MD5 1a3393aa369925aefe84bc008289c0ad
BLAKE2b-256 1da0ec6ba0cfd62049849e864eb54a0aeb459f7b656206ff0a85ec765b4f2fb8

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 1658347065d60ca4c82dc030d862993200f98db456657b10055981ab563700fd
MD5 ed36e328ab5932e67808a0004d9a1286
BLAKE2b-256 4a2778edef2e59acadf5592d4a859659f083122595799047116406c454736b6f

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 84b40b0a72a564ad04bb028bc9d5c626f5105d54a9716d8ca18e5affdeb03f07
MD5 e1982fb1c3ca857b5a8464fcdd9886c8
BLAKE2b-256 b1827390974c076dbd976491b9b51ded9fe4a0f7c07109b93668e2859232ebcf

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: riichienv-0.4.8-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for riichienv-0.4.8-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 db49cd21308b6e479cd631bf6f4b63b95e16a1eb3cb6c2b28e64529ca938e1d2
MD5 018304e57091e7b49fdf444713963cd2
BLAKE2b-256 23716c8e1b60b2d076b21e73d1b14df6b4657aee2734df04a33529e57c984140

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp314-cp314-win_amd64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp314-cp314-win32.whl.

File metadata

  • Download URL: riichienv-0.4.8-cp314-cp314-win32.whl
  • Upload date:
  • Size: 1.3 MB
  • Tags: CPython 3.14, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for riichienv-0.4.8-cp314-cp314-win32.whl
Algorithm Hash digest
SHA256 2cc109f388f2bd56ae7906c1a85c9ece91ea8beac0555672c06407e587ae20c6
MD5 214677aa8ee0caffd7de4e09a75331a6
BLAKE2b-256 8563789481beac7b7f791cf7330fd34d5a121b731aabd572bbdbe31811f06f6a

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp314-cp314-win32.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 04423f22ca9528a709605fa814f1520da31ee536582ba2177212c24d45466dcb
MD5 15a9c7bac265baf4cf4e311b1752fd43
BLAKE2b-256 789a6ed66e0555d3e00ae9432c69db97226565c003e07cf36333ca0553f979b4

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8c5879da080dc25638aef963beb0867823eb5c95e889936e6a867155d660f970
MD5 c6202643503dedfb4e82076d239bdb39
BLAKE2b-256 1af0115716641bfdf583b34d1300b0635f5c9a15c72c4cc7a56b33fb2fa4c017

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 d4b5122fa563c61a32d359911e1b7f8084d682d8dbe76badeffa35ada5955cac
MD5 25ff72df1129d69fb83b3ece22ee81ea
BLAKE2b-256 41bd550dfb0f9aadb086833fb4511b8ef3e016980029ae45163b6b04de2c6b99

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f2750991c9ead8e68554571f8e35f86b19c71ff64ef3d5bb3639a154e4aa0403
MD5 e69abc897e22982dcb7b0b4dc7d46292
BLAKE2b-256 b93b7d86f7258efa03c7a9ae619d62a420d174db933b886c79ea66b096083af3

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c391e20375b82a45e01747f4b08d9cb56f4cb993f35b1596c42cfb0c058dea46
MD5 8cd8df70a70d3125d1928b2a10648892
BLAKE2b-256 ec501b1a5420a1736c034a95810d73f1d420a537c05d7d674422c34378719d23

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: riichienv-0.4.8-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for riichienv-0.4.8-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 29bd0d5b121c7637496b4354d0b7d54841e05138eb2096a7f42d2c0d3f75a955
MD5 fe91c73637004de87047f7e81b431388
BLAKE2b-256 176fb0831bb0dd910790c0790bd06b4d5ea2c2010b23f32958533df6ce7e7a67

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp313-cp313-win_amd64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d722fbefac236957e3c4eae22e1cd953f59d3acdc2d2c92f2d0af70915b2d9af
MD5 a01e4853d2acecddd9d886e1721fc8b2
BLAKE2b-256 6459cd8ee41a8403a71a8efb7ebcc503b556fb43f854b1f9e821ec8eca39fc3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d2cac7b6ed0e54526a7dd3d5a9cdef1635651c5026a83e4644fd5309eb224fb3
MD5 5a2da3e13c42a47870f78d24d369ab65
BLAKE2b-256 e49301cf93ba90e8e3a329086f870ddeb46006997135df745722fe67fb0ddd25

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 cec153be06b0cb2c4f8af2976ba08c6bbe6d38f3c14e2567b08a005d80274154
MD5 1f6c87695f127c82cbf132a2a39e7a29
BLAKE2b-256 f7e27af5b58b495d6b198c0a418e9be42df32e5398ea53709f618ad5b2624621

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 64f4e6ba4a9a3140b0a04b4843d78c8aa4d8db11324b316ceaa4290f81f666f3
MD5 75ddaf83547d2ffcc623bf5c3cc551a7
BLAKE2b-256 cb861ded4ac10cb24dae1eefa929b32e8b3a05202fd6ace1995020570b1f7956

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: riichienv-0.4.8-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for riichienv-0.4.8-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 50783478d424b0c6f9271bc153e01dc05eff64636be5e0ef4ea10f4e6fd60cd3
MD5 098db8580d243db227dc75b2483b914b
BLAKE2b-256 088af74498ecf4d2b9701e89281336d9f480fd31adbc81cc0dd8f1e8c515aab8

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp312-cp312-win_amd64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 745650e71c146c36efe7ec3293cbd9b5aa76211cee4433a15b4da3679a3cb9cb
MD5 fbb409c41e25b384f53bba78acb20e33
BLAKE2b-256 cd1fd58d44c203e5d1e63655cb47749a15a553e54bbb3f5f4bb7618ee7508ebd

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0220cd4a9f95f9fd86936b8e139aa83b8ab2ad9e7da0b542339e9b9fa645cb2f
MD5 4758129500f2fe14b8814d7a5e8bc8e7
BLAKE2b-256 36b01df4fc56309bee9b696c9ae8734077c0468cd31933dbaae7ba6ef416ad13

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 06b6e516574a94e6eb7f8a0dc163d84c9d60836c2cdf741bd3dfa5d9ebc997a3
MD5 99ce1e203ffde3e90587b4d92e8670c8
BLAKE2b-256 e2dea3116f86d6fb331d36803c79617cdc27fd5c895a3d880aa19712ab0e7be3

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b666cc4b4d1586ff1b588549fdd056e76b7899a89fae9ad07c518e96a044cf63
MD5 f76c9a033825eb93437b5c9f6a2028ab
BLAKE2b-256 9613d8518d5a0998ca4792c6ae78da9df3106bdaaf57cff1624a6c21a8ea4b18

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: riichienv-0.4.8-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for riichienv-0.4.8-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 0be7cba3ac771ccf426e5e9dd7c0c375b22ee20fa1c4158bfd1fb29fa76a6335
MD5 f06c6695546e55f8c02db05a94dc3e46
BLAKE2b-256 b38584c9c7187985235b7e5c623dd4640197aa5a947fd7c185fe76ed85c009da

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp311-cp311-win_amd64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 53ca595afea9c9c58975a4351019f7ae1b27c27f7873c3edcdc60e54ea981262
MD5 8d4313152cd2db6e1a2a5916e1bc467e
BLAKE2b-256 edbbe0fb074b0ac2a76b3fc7d3802e362de9afd0c8cccfb293f78ce2e28823ae

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 68222e906636cd42f72d50ebfd05ff20c753ecf5c6fcc157802b4965a65ff3ef
MD5 6df924b7d6c9470ab3254a275219576d
BLAKE2b-256 efe70e39c95ca80f22d1198547dfb93cf8aa2e95f6653c9d50f678941d9f0082

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 4236f3656774e04063a5ba424f8615ccde14957727b538446152535f126e8e2f
MD5 c28e7d951744e608030b5313202d3359
BLAKE2b-256 2be5649b44e61141383831feed15d82b1a734d765e69148bd7060c724d725996

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 69e3266e83e6bd0011aad311c63e4cca05d8cd7b161594c81f570538d79cbe1a
MD5 a8c43d24be0c890f81757994b3a647ce
BLAKE2b-256 984682d5a3e472251fd9cbe2fb86e9f4b4d410ac05111861cce862ff82783144

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: riichienv-0.4.8-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for riichienv-0.4.8-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2282a28dc928b9a49289f997c743ac8477fa0c27d76ca873a811465feb7efed2
MD5 e06f0a15622cd65865bb0dbdeb4ef3a0
BLAKE2b-256 b80ab1d0633498744ac5ed781d5cfb105636a7f44e44f26686f5c451054b17e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp310-cp310-win_amd64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6f4a43a5b82e13f7721052261e6126c334c63c8c6971c39466b37e95a6ad11bd
MD5 70de426ff8d9b62139b84f7db1de38b2
BLAKE2b-256 7c2798e33159b807f1578f1b3d0bf412032b515f6bfc1ce9b485298523866a94

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ab92ef17bbf0d5a78a1df8768c1b256fb886687518c761420107240644bb437d
MD5 c67f2900332d03b914307b34a7d4a78b
BLAKE2b-256 3de0ec8925e04674324f78035a217b497e1bef64b265d9535efd3cd2b7eda6ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file riichienv-0.4.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for riichienv-0.4.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 db4e97c01c552c0623ea1ee25e1eee23350b7e4beab93c88606093a221298dae
MD5 669968f14341f57e49e6bd06cb089b7c
BLAKE2b-256 7cbb60bd50be68e023fa85e9db272a3c81a334d9a0b37583fa19bc131bb8818e

See more details on using hashes here.

Provenance

The following attestation bundles were made for riichienv-0.4.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl:

Publisher: release.yml on smly/RiichiEnv

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page