Skip to main content

Python bindings for Enki's Rust agent runtime.

Project description

enki-py

Python bindings for Enki's Rust agent runtime.

enki-py exposes two layers:

  • A high-level Python API built around Agent and MultiAgentRuntime
  • The lower-level native bindings generated from the Rust runtime, including workflow APIs

The package is designed for Python-first usage without giving up the native runtime features that already exist in the Rust core.

Requirements

  • Python >=3.8
  • A supported model string such as openai::gpt-4o, anthropic::claude-sonnet-4-6, or ollama::qwen3.5:latest

Install

Published package:

pip install enki-py

With the built-in LiteLLM adapter:

pip install "enki-py[litellm]"

Using uv:

uv add enki-py
uv add "enki-py[litellm]"

What It Exports

High-level Python API

The main Python-facing exports are:

  • Agent
  • AgentLoopRequest
  • AgentLoopResult
  • AgentRunResult
  • ExecutionStep
  • Tool
  • ToolRegistry
  • RunContext
  • MemoryBackend
  • MemoryModule
  • MemoryEntry
  • MemoryKind
  • MultiAgentRuntime
  • MultiAgentMember
  • AgentCard
  • LiteLlmProvider
  • LlmProviderBackend

Low-level native bindings

The generated module is also re-exported, so lower-level runtime types remain available when you want to work closer to the Rust layer. Commonly used native types include:

  • EnkiAgent
  • EnkiWorkflowRuntime
  • EnkiTool and EnkiToolSpec
  • EnkiMemoryEntry
  • EnkiMemoryModule

Agent API

Agent is the main Python entrypoint. Its constructor supports:

  • model: required provider and model string
  • deps_type: optional dependency type used with RunContext
  • instructions: system guidance / prompt preamble
  • agentic_loop: optional prompt-level loop instructions
  • agent_loop_handler: optional Python callback that overrides the runtime loop
  • name: display name for the agent
  • max_iterations: iteration cap for the runtime loop
  • workspace_home: optional workspace root for persisted runtime state
  • tools: optional list of pre-registered Tool objects
  • tool_registry: optional reusable ToolRegistry
  • memories: optional list of MemoryModule objects
  • llm: optional Python-side LLM backend or callback

Main methods:

  • run(...): async single-agent execution
  • run_sync(...): sync wrapper around run(...)
  • set_agent_loop_handler(...)
  • clear_agent_loop_handler(...)
  • tool_plain(...): decorator for plain Python tools
  • tool(...): decorator for tools that receive RunContext
  • register_tool(...)
  • connect_tool_registry(...)
  • register_memory(...)
  • as_workflow_agent(...): converts the wrapper into a workflow-configured low-level agent

The result of run(...) or run_sync(...) is AgentRunResult, which contains:

  • output: final model response text
  • steps: ExecutionStep entries describing runtime progress

Both run(...) and run_sync(...) accept:

  • session_id: optional explicit session id
  • deps: optional dependency object passed into RunContext
  • on_step: optional callback for streaming step visibility

Basic Agent

Synchronous example:

import uuid

from enki_py import Agent


agent = Agent(
    "anthropic::claude-sonnet-4-6",
    name="Simple Agent",
    instructions="Answer clearly and keep responses short.",
)

result = agent.run_sync(
    "Explain what this Enki Python example demonstrates.",
    session_id=f"simple-agent-{uuid.uuid4()}",
)

print(result.output)
for step in result.steps:
    print(f"{step.index}. [{step.phase}] {step.kind}: {step.detail}")

Async version:

import asyncio

from enki_py import Agent


async def main() -> None:
    agent = Agent(
        "ollama::qwen3.5:latest",
        name="Async Agent",
        instructions="Answer clearly and keep responses short.",
    )

    result = await agent.run("What does enki-py provide?")
    print(result.output)


asyncio.run(main())

Tools

The high-level wrapper lets you register Python functions directly as tools.

@agent.tool_plain

Use this when the tool only needs its declared arguments:

from enki_py import Agent


agent = Agent(
    "ollama::qwen3.5:latest",
    name="Researcher",
    instructions="Use tools when they help answer factual questions.",
)


@agent.tool_plain
def lookup_example_topics(topic: str) -> str:
    """Return a canned fact for an example topic."""
    facts = {
        "memory": "Memory lets the agent persist and recall useful session context.",
        "tools": "Tools let the agent call Python functions to fetch or compute structured results.",
        "multi-agent": "Multi-agent runtimes let a coordinator route work to specialized agents.",
    }
    return facts.get(topic.lower(), f"No prepared fact exists for '{topic}'.")

@agent.tool

Use this when the tool should receive a RunContext with typed dependencies:

from dataclasses import dataclass

from enki_py import Agent, RunContext


@dataclass
class AppDeps:
    project_name: str


agent = Agent(
    "ollama::qwen3.5:latest",
    deps_type=AppDeps,
    name="Context Agent",
    instructions="Use the provided context when it helps answer.",
)


@agent.tool
def project_name(ctx: RunContext[AppDeps]) -> str:
    """Return the active project name from runtime dependencies."""
    return ctx.deps.project_name

Tool schemas are inferred from Python signatures and type annotations. Required parameters come from arguments without defaults, and optional parameters come from arguments with defaults.

If you need lower-level control, you can also build Tool(...) values directly and register them with register_tool(...).

Reusable ToolRegistry

If you want to manage a shared set of tools separately from a single agent, build a ToolRegistry and connect it when needed:

from enki_py import Agent, ToolRegistry


registry = ToolRegistry()


@registry.tool_plain
def lookup_release(version: str) -> str:
    """Return a canned release note."""
    return f"Release {version} is ready."


agent = Agent(
    "ollama::qwen3.5:latest",
    name="Registry Agent",
    instructions="Use connected tools when they help.",
)

agent.connect_tool_registry(registry)

You can also pass tool_registry=registry to Agent(...) during construction.

This is the cleanest path when multiple agents should share the same tool catalog or when you want to prepare tools separately from agent creation.

Memory

enki-py supports Python-defined memory modules through MemoryBackend and MemoryModule.

Implement MemoryBackend when you want custom record and recall behavior:

from dataclasses import dataclass, field
from time import time_ns

from enki_py import MemoryBackend, MemoryEntry, MemoryKind


@dataclass
class SessionMemory(MemoryBackend):
    name: str = "session_memory"
    _entries: dict[str, list[MemoryEntry]] = field(default_factory=dict)

    def record(self, session_id: str, user_msg: str, assistant_msg: str) -> None:
        entries = self._entries.setdefault(session_id, [])
        entries.append(
            MemoryEntry(
                key=f"{session_id}-{len(entries)}",
                content=f"User: {user_msg}\nAssistant: {assistant_msg}",
                kind=MemoryKind.RECENT_MESSAGE,
                relevance=1.0,
                timestamp_ns=time_ns(),
            )
        )

    def recall(self, session_id: str, query: str, max_entries: int) -> list[MemoryEntry]:
        entries = self._entries.get(session_id, [])
        return entries[-max_entries:]

    def flush(self, session_id: str) -> None:
        return None

Register it like this:

memory = SessionMemory()
agent = Agent(
    "ollama::qwen3.5:latest",
    memories=[memory.as_memory_module()],
)

Supported memory kinds:

  • MemoryKind.RECENT_MESSAGE
  • MemoryKind.SUMMARY
  • MemoryKind.ENTITY
  • MemoryKind.PREFERENCE

Memory callbacks may be synchronous or async def coroutines.

Multi-Agent Runtime

MultiAgentRuntime wires multiple Agent instances together and installs the coordination tools used for agent discovery and delegation.

Available methods:

  • registry()
  • discover(...)
  • process(...)
  • process_sync(...)

The runtime automatically installs two reserved tools on member agents:

  • discover_agents
  • delegate_task

Minimal example:

from enki_py import Agent, MultiAgentMember, MultiAgentRuntime


coordinator = Agent(
    "ollama::qwen3.5:latest",
    name="Coordinator",
    instructions=(
        "Use discover_agents first. "
        "Delegate research work to the researcher with delegate_task."
    ),
)

researcher = Agent(
    "ollama::qwen3.5:latest",
    name="Researcher",
    instructions="Answer delegated questions clearly and briefly.",
)

runtime = MultiAgentRuntime(
    [
        MultiAgentMember(
            agent_id="coordinator",
            agent=coordinator,
            capabilities=["planning", "orchestration"],
        ),
        MultiAgentMember(
            agent_id="researcher",
            agent=researcher,
            capabilities=["research"],
        ),
    ]
)

result = runtime.process_sync(
    "coordinator",
    "Use discover_agents first, then delegate to the researcher.",
    session_id="simple-multi-agent-example",
)

print(result.output)

Repository examples:

Workflow Runtime

For workflow execution, the lower-level EnkiWorkflowRuntime is the main entrypoint. A common pattern is:

  1. Create Python Agent wrappers
  2. Convert them with as_workflow_agent(agent_id=..., capabilities=[...])
  3. Provide JSON task definitions and JSON workflow definitions
  4. Start and inspect runs through the workflow runtime

Methods used in the checked-in Python examples include:

  • list_workflows_json()
  • list_runs_json()
  • inspect_json(run_id)
  • start_json(payload_json)
  • resume_json(run_id)
  • submit_intervention_json(run_id, intervention_id, response)

Workflow example:

import asyncio
import json
from pathlib import Path

import enki_py


WORKSPACE_HOME = Path("./example/enki-py/.enki-workflow")
MODEL = "ollama::qwen3.5:latest"


async def main() -> None:
    researcher = enki_py.Agent(
        MODEL,
        name="Researcher",
        instructions="Return short factual notes.",
        workspace_home=str(WORKSPACE_HOME),
    )
    writer = enki_py.Agent(
        MODEL,
        name="Writer",
        instructions="Turn notes into a concise summary.",
        workspace_home=str(WORKSPACE_HOME),
    )

    runtime = enki_py.EnkiWorkflowRuntime(
        agents=[
            researcher.as_workflow_agent(agent_id="researcher", capabilities=["research"]),
            writer.as_workflow_agent(agent_id="writer", capabilities=["writing"]),
        ],
        tasks_json=[],
        workflows_json=[],
        workspace_home=str(WORKSPACE_HOME),
    )

    print(json.loads(await runtime.list_workflows_json()))


asyncio.run(main())

For a complete runnable version with task and edge definitions, see example/enki-py/agent_workflow.py.

Human Intervention

Workflow runs can pause for human input and then resume from persisted state.

Two built-in patterns are demonstrated in the repository examples:

  • human_gate workflow nodes that pause and wait for a human response
  • task nodes with failure_policy: "pause_for_intervention" that convert a failure into a human resolution step

The runtime interaction loop is:

  1. start_json(...) starts the workflow and may return a paused response
  2. inspect_json(run_id) exposes pending_interventions
  3. submit_intervention_json(run_id, intervention_id, response) resolves the intervention
  4. resume_json(run_id) continues the persisted run

See example/enki-py/human_intervention_workflow.py.

Custom LLM Providers

You can keep model execution on the Python side by passing either:

  • an instance of LlmProviderBackend
  • a compatible Python callable matching the LLM completion shape

The built-in LiteLlmProvider is the default adapter for LiteLLM-backed usage. It is useful when you want:

  • provider-specific configuration in Python
  • LiteLLM-managed credentials or routing
  • a Python extension point without changing Rust code

Notes from the current implementation:

  • LiteLlmProvider raises a clear error if litellm is not installed
  • for Ollama, the default base URL comes from OLLAMA_URL or falls back to http://127.0.0.1:11434
  • ENKI_LITELLM_TIMEOUT controls the request timeout used by the adapter
  • Ollama tool calling is only forwarded when ENKI_OLLAMA_TOOLS is truthy

The repository workflow example also includes a custom OllamaProvider implementation in example/enki-py/agent_workflow.py.

Custom Agentic Loop

There are two different customization levels.

Use agentic_loop= when you want to keep the normal Rust runtime loop but replace the default loop instructions that the model sees:

from enki_py import Agent


agent = Agent(
    "anthropic::claude-sonnet-4-6",
    name="Custom Agentic Loop",
    instructions="Answer clearly and keep responses short.",
    agentic_loop=(
        "1. Understand the user request.\n"
        "2. Decide whether a tool is necessary before acting.\n"
        "3. If you use a tool, summarize what you learned.\n"
        "4. Verify that the answer is complete.\n"
        "5. Return the final response."
    ),
)

Use agent_loop_handler= when you want Python to own the turn-by-turn control flow:

from enki_py import Agent, AgentLoopRequest, AgentLoopResult, ExecutionStep


def custom_loop(request: AgentLoopRequest[None]) -> AgentLoopResult:
    return AgentLoopResult(
        output=f"Handled in Python for: {request.user_message}",
        steps=[
            ExecutionStep(
                index=1,
                phase="Custom",
                kind="final",
                detail="Returned a final answer from Python",
            )
        ],
    )


agent = Agent(
    "ollama::qwen3.5:latest",
    instructions="Answer clearly and keep responses short.",
    agent_loop_handler=custom_loop,
)

The loop request includes:

  • session_id
  • user_message
  • system_prompt
  • messages
  • tools
  • agent_dir
  • workspace_dir
  • sessions_dir
  • model
  • max_iterations
  • deps

You can also update the loop handler after construction with:

  • agent.set_agent_loop_handler(handler)
  • agent.clear_agent_loop_handler()

Repository examples:

Running The Examples

After building the local package with maturin develop, you can run the checked-in examples from the repository root:

python example\enki-py\simple_agent.py
python example\enki-py\simple_agent_ollama.py
python example\enki-py\tool_registry.py
python example\enki-py\simple_multi_agent.py
python example\enki-py\multi_agent_with_memory_and_tools.py
python example\enki-py\agent_workflow.py
python example\enki-py\human_intervention_workflow.py
python example\enki-py\custom_agentic_loop.py
python example\enki-py\react_custom_agentic_loop.py
python example\enki-py\compare_agent_loops.py

Model notes:

  • simple_agent.py uses anthropic::claude-sonnet-4-6
  • simple_agent_ollama.py uses ollama::qwen3.5
  • several other checked-in examples use ollama::qwen3.5:latest
  • agent_workflow.py reads ENKI_MODEL and falls back to ollama::qwen3.5:latest

Make sure the selected provider and model are available in your local environment before running the examples.

Development

From crates/bindings/enki-py:

pip install maturin
maturin develop
pytest python/tests

Useful commands:

  • maturin develop: build the Rust extension and install the package in editable form
  • pytest python/tests: run the Python-side tests and examples under test coverage

Project Layout

crates/bindings/enki-py/
|-- Cargo.toml
|-- pyproject.toml
|-- python/enki_py/
|-- python/tests/
`-- src/
  • src/: Rust UniFFI binding implementation
  • python/enki_py/: Python wrapper and generated native module
  • python/tests/: Python-side tests and usage coverage

Related Docs

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

enki_py-0.5.61.tar.gz (423.7 kB view details)

Uploaded Source

Built Distributions

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

enki_py-0.5.61-py3-none-win_arm64.whl (1.5 MB view details)

Uploaded Python 3Windows ARM64

enki_py-0.5.61-py3-none-win_amd64.whl (1.5 MB view details)

Uploaded Python 3Windows x86-64

enki_py-0.5.61-py3-none-win32.whl (1.4 MB view details)

Uploaded Python 3Windows x86

enki_py-0.5.61-py3-none-musllinux_1_2_x86_64.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

enki_py-0.5.61-py3-none-musllinux_1_2_i686.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

enki_py-0.5.61-py3-none-musllinux_1_2_armv7l.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

enki_py-0.5.61-py3-none-musllinux_1_2_aarch64.whl (1.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

enki_py-0.5.61-py3-none-manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

enki_py-0.5.61-py3-none-manylinux_2_28_s390x.whl (1.6 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ s390x

enki_py-0.5.61-py3-none-manylinux_2_28_ppc64le.whl (1.5 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ppc64le

enki_py-0.5.61-py3-none-manylinux_2_28_i686.whl (1.5 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ i686

enki_py-0.5.61-py3-none-manylinux_2_28_armv7l.whl (1.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARMv7l

enki_py-0.5.61-py3-none-manylinux_2_28_aarch64.whl (1.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

enki_py-0.5.61-py3-none-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

enki_py-0.5.61-py3-none-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file enki_py-0.5.61.tar.gz.

File metadata

  • Download URL: enki_py-0.5.61.tar.gz
  • Upload date:
  • Size: 423.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for enki_py-0.5.61.tar.gz
Algorithm Hash digest
SHA256 1101e8a962ff4dc79e0ffde4a142b06beb3a742514a2ccb90e070d2258a999f6
MD5 12c45f102390b63e98a2f6409d499467
BLAKE2b-256 a190d1c80ee18563bcd60362d5fe3087e97a93fc7b1324fb9df873bd72346602

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-win_arm64.whl.

File metadata

  • Download URL: enki_py-0.5.61-py3-none-win_arm64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for enki_py-0.5.61-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 931c5eb4226e863878c13c3bc907571ed8bb171b9211eb8e8d02297328e470aa
MD5 950ae2bbebb8a5b8c61318e36a54965a
BLAKE2b-256 d67b0ac7d72a01187ff28512f626e38cc73af6eee8c4ac92988aa8de7de22e78

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-win_amd64.whl.

File metadata

  • Download URL: enki_py-0.5.61-py3-none-win_amd64.whl
  • Upload date:
  • Size: 1.5 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for enki_py-0.5.61-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 375fd83a47487c30f0bd8939fde00df5d0fafcc5b668e636bfbd7b41a2295c37
MD5 715fa48c99d0b4cee0f06454830758fc
BLAKE2b-256 f7dab7a37c4de6f9222e34772942d5a2d46a0b53687b61cd8a3e81586efcc540

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-win32.whl.

File metadata

  • Download URL: enki_py-0.5.61-py3-none-win32.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for enki_py-0.5.61-py3-none-win32.whl
Algorithm Hash digest
SHA256 50c472836c36869f6f72aef5fad5aacc304f941f71a67dde5f6ece64884c1d19
MD5 ff9210eb245b2f2f3b03dfa82a41a0f5
BLAKE2b-256 800c46407a278437eadacd6232df072797073be44d0160e1309d763bba5e1c06

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6e7af0daf7d9fff03983d1ea063795f1aec38bdbc53fb8a1f6e3de03529dbfe9
MD5 d1c2647a3b59a8e4f91d49379fc7cd6a
BLAKE2b-256 8c1de256f9852ade9746260c1222041232e152655d77d94a33b80aa334485217

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 ba531aafe625b75109933f1351781742f506562a753518f1ecdb6fe8b5df4162
MD5 f0a91c9e2590a44990b1ef624d3e5392
BLAKE2b-256 600063c78d0745d7655903ec50cbbe27f7ee2ef6f40e82bcc0ad6e91c8b0f99c

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 0210c2d5382cdd262d045a3b931b39dc807d6eb1bcdd2b75b6f5889bd0d00de6
MD5 fa12c929575e7860f9fb771c5c925779
BLAKE2b-256 2758ba206be25bc113076965c606d68cd5321218cbf45dc1709352ded68ba160

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 93b307b9272b1212cffe710f416e06cc7ad5bf0caac7bf5f974f5d1cbea2c68e
MD5 97be90f60cff0f8c69aef5c2a62338e5
BLAKE2b-256 9f83c83ff0b989f329b0342615cb190a6de349d627b5715243558e61b9a1a0da

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0f697a7254258ae48fc120192a7eec118e0654fc1ce94545075468330a5eb422
MD5 99093433829074f11ab48444d6b0c1b1
BLAKE2b-256 9ce09697ae64b7a795125c58b647131db4a47b66e9a582dd29da15b88da72e32

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-manylinux_2_28_s390x.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 13e102047db3e7e9a1fcdeb015146cf64e8208615a11bb40576fc2aa5d7ac21e
MD5 d83a18a8648bcee0f686ab5312a3d7a9
BLAKE2b-256 4be0cab8f3b5183333deda741dbf8e7c8e4dc7c0a92ee049e441c08b35e4e082

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-manylinux_2_28_ppc64le.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 f57f304dff3cab1684d2f3c55f8eeb8b86acd1e4b82d906925026ddf5715b6ba
MD5 31a049dfcbe7e565585abb93c39119cd
BLAKE2b-256 970d4717961b4dc3d487799ec333df92c69e4377653d5dee4649dec69b6268ec

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-manylinux_2_28_i686.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 90732caa676e6282144620e1fa800db8ad53380cded509ee75aea60dd26b0515
MD5 dd32e73372ef00586aaec92aad3af914
BLAKE2b-256 882b8e5662f5d05a67524ac9cc9e7fff55c261b428e2140fb19d355c5891b64f

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-manylinux_2_28_armv7l.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 3e07063264fa408039e24ef0f5b508e3b436dac68b9c94df3f3b8dc5e3173ebf
MD5 ae48835badb88b646c5a03cf88c971bf
BLAKE2b-256 75d923c13746c948c596e87cbb72bbf0bf4867ae3c8edbfe1b110def19a22cd6

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3feca2aa55b1c9e37d50efb884be78c348d40f898e756a24ee4ca4c8a96a85cd
MD5 4aa750243630cd8b018d1738106364b2
BLAKE2b-256 5f4878f7a58b4e7993e5709545c14b49ec768e74b276b914dcb0b96e07bd0dfc

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9a61a30a80f9ee47f02f935fcf4a871f2bc416c0a0b2d87cd2f50c890db963a6
MD5 e829d250bac6342feb8adff100746096
BLAKE2b-256 7714dfa71f1eb2c024dc6ccfb914691ca67ca7fde417b5ae0803d7a209c620f3

See more details on using hashes here.

File details

Details for the file enki_py-0.5.61-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for enki_py-0.5.61-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5811db63c9e805f9e9ad4be3cc44f21be02e03b402b4f3136e7eab13211afdc4
MD5 4a99cd866ff139231a3e62ff3ffffd14
BLAKE2b-256 e363f186304880b3c4daece177998d345dfdfcbbaeeae1900513c349ccb35e3b

See more details on using hashes here.

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