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.77.tar.gz (426.5 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.77-py3-none-win_arm64.whl (1.5 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

enki_py-0.5.77-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.77-py3-none-musllinux_1_2_i686.whl (1.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

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

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

enki_py-0.5.77-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.77-py3-none-manylinux_2_28_s390x.whl (1.6 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ s390x

enki_py-0.5.77-py3-none-manylinux_2_28_ppc64le.whl (1.6 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.28+ i686

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

Uploaded Python 3manylinux: glibc 2.28+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

enki_py-0.5.77-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.77.tar.gz.

File metadata

  • Download URL: enki_py-0.5.77.tar.gz
  • Upload date:
  • Size: 426.5 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.77.tar.gz
Algorithm Hash digest
SHA256 33d726f1957202b05ae6723194684c35271f743d1f3eae854833af9763225e7c
MD5 45d6b004d5e141bf1d06bb6dceaf697d
BLAKE2b-256 4b4bb3b7b9c270484cd760f91d460a78b0a5432acba7d1341ffc2f561e2b3d02

See more details on using hashes here.

File details

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

File metadata

  • Download URL: enki_py-0.5.77-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.77-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 001fafeab985b6e74addf4a41c017fb85bfab1fae19dbf9e2c01202db0aced4c
MD5 8bffe574d5eb67b0d71c0f8d391d04dc
BLAKE2b-256 e8b541663370c5d0d3ac25db7380e9b42e9a5232b16647fd7ff8814389db0ea9

See more details on using hashes here.

File details

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

File metadata

  • Download URL: enki_py-0.5.77-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.77-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 6a6ece8ce0bc12ecd0499edf9b15709a06482fa27eeca6ddfbbb808df78b04e6
MD5 6bb6f26628eb533fc16b777d4a3b1314
BLAKE2b-256 9afddb662cfbbc199eed9d0582fc9305bd231a9ae2e0313489c16f3bd707c7fb

See more details on using hashes here.

File details

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

File metadata

  • Download URL: enki_py-0.5.77-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.77-py3-none-win32.whl
Algorithm Hash digest
SHA256 24e2fcd1170ec2838a03d4823f9ea36c32b90d76c78fca4dce399823334de8db
MD5 90a227cec6d0e294e24651d29f081ffd
BLAKE2b-256 a7548597f3e615b9fab0c25b67653f6a9ded5161459a81f1ac9116122d210570

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1ae5ce2733d9bb3fc30c8e32cafc59e9ecdc093a225e05809cb3da4c31e7a6bb
MD5 7f8178435f745bbc187ca881d7d49448
BLAKE2b-256 9cff90dbf640dfe9906a5d825a807ca7ad56e1c9b1f0fd5375d9537ea097e3dc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 a831b9261fb0670799a9c81c0fb85742f045cd8005f0f174b449b3fafb9a4d62
MD5 b3e549304240957c986ae25de6250140
BLAKE2b-256 2859e7959eaa61d727d6b7ed91c56d5b4b908cd49ae387ffe179967a2558f285

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 c3ee5f1800848a5b4a48630649c706c578760f44236ef6ffe8ebb0c2e679d240
MD5 56b6a8f8cdba6185471ae8252a60628e
BLAKE2b-256 fb291ef3981ab2e09ea45e0331aa8d8138c0c57d852dcfa8fc0751091108241d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 39d92893ed3409c417f7e141877efb00ea1677d2276fad0221a8efbd027adb64
MD5 d4e642695826678dfd4a3d952dd4fbe3
BLAKE2b-256 14726ce27c57c7ec89bdad6c50cd3d7c39893907dc567c1bc7828ee0ba9a5735

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 19ed9a24381a0c13693e23c8048b683c05bddaf2cb04c324823a503de09475e6
MD5 7c82c70e2a6c1f3e226f64a4040e5895
BLAKE2b-256 6b82c770d6cddecf8c3ab89b49e205878e049350f6b9603500b4b38d6d38bb39

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-manylinux_2_28_s390x.whl
Algorithm Hash digest
SHA256 feebc54eee53d8e542e1e736e0f8774de610a5ff49c349e9443bf802d49939af
MD5 0e64793ccdab58249760da6cbeb8748f
BLAKE2b-256 6a79d9cf0c1050d3e233d9a73fc2d2f44f1932b38432d246c1ddbcbf079b06b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-manylinux_2_28_ppc64le.whl
Algorithm Hash digest
SHA256 befee3efd0ecc201568faa60c0b07b40063e03d6c01054010fae664663df69ea
MD5 bcbae38f726f10f3cbccc9155cbee2bf
BLAKE2b-256 cd893d477bce86f92a8e4bbb03f80b2635da9250e9f5404cac86a272128d7d84

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-manylinux_2_28_i686.whl
Algorithm Hash digest
SHA256 0c0a5e4e97ed4fbdc14bf5a127fd52f920ae14c3bfbeb91948340a11c3791706
MD5 799d45cc81a9870e64dffa2299968982
BLAKE2b-256 19e73195f4a672e751bc2061c79afe22235674dc5393d21842893659d99d1521

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 fb5d5e6c75eac991376f0ccf2224a23531e5647e3bc8b5449c50d728324f036f
MD5 2c4348c63d5c50caf0aee70427a93d53
BLAKE2b-256 d790514453fe5e44050a31cc5ff3748238f959c404ec9cb26b295082bb55ba37

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5b3c9b5ad615ae1aa0ebddcd3142df4585a7528eacaeaac4b5feca7c622c77ca
MD5 0fed95991d1ac80701fc51d18f064d35
BLAKE2b-256 e13a27dd5d189f8cf881033916aafd05b3dc2b65b412cbfe1b2428afb009947f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 64940a5e893e756d5f2051f5f957ca462b063eba123b67d2a5c5497aa449b339
MD5 298fe63ef1c8b6bbbdb8e2ba8ff8b3f7
BLAKE2b-256 7a2d4b7e29fc82089cb658e82a1a5aafdedcd49ebfe077bf0068e93bec6eba31

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for enki_py-0.5.77-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 dce518282734f8cdfa2465a99bacaf215729572cd7cef6a0df18aa8d3ef6d784
MD5 5a00da5bea81521437a4fb8ee74e00bd
BLAKE2b-256 926ff96dc82f9038084579ece622db45d7e7e87c0019bd9e9af56d87e849f844

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