Skip to main content

Decorator to wrap LLM calls for production use with flexible prompt binding.

Project description

llmwrap

Usage guide for llmwrap with eight distinct integration patterns. Each pattern appears as a pair: wrap_llm_call (decorator) and wrap_llm_line (inline) implement the same behavior; only prompt binding differs. Additional permutations (OpenRouter-only snippets, naming variants, LangChain-style flows) remain in tests/testing_different_interfaces.py.

This document intentionally covers API usage only. Internal algorithm details are not disclosed.

Table of Contents

Install

pip install arbis-llmwrap

Public APIs

from llmwrap import wrap_llm_call, wrap_llm_line, openai_sdk_result_text

Config Fields

Core Mental Model

For each wrapped LLM call, you are describing where this call sits in your orchestration graph.

  • workflow_group_name = top-most business/process container
  • Workflow_name = a workflow inside that group
  • agent_name = the exact executing step/agent inside that workflow
  • Run_Id = one end-to-end execution id tying all related calls together

So for one user request that traverses many agents, all calls share the same Run_Id, but agent_name changes per step.

Golden rule: one Run_Id = one user query/request. Reuse it across all hops for that query; allocate a new one for the next query.

Shared Fields (wrap_llm_call and wrap_llm_line)

company_name: str (Required)

What it is: Organization identifier.
Why it matters: High-level tenant/org partition for ingest and analytics.
How to fill: Stable canonical company name, e.g. "ArbisAI".
Best practice: Keep consistent casing/spelling across all services.

project_name: str (Required)

What it is: Product/application name inside the company.
Why it matters: Separates telemetry for different apps under same company.
How to fill: Stable app id, e.g. "Arbis-Decorator" or "support-copilot".
Best practice: Do not use random env-specific names unless intentional.

agent_name: str (Required)

What it is: The current executing agent/step label for this call.
Why it matters: This is the node identifier in your execution chain.
How to fill: Step-specific name, e.g. "Agent-1", "Retriever", "Writer".
Best practice: Human-readable and unique enough within workflow.

Run_Id: str | None (Optional, strongly recommended)

What it is: Correlation id for one complete run/user query/session.
Why it matters: Lets you reconstruct the full path across agents/workflows.
How to fill: Generate once at run start (uuid4) and reuse on every call in that run.
Example: All A1 -> A2 -> B3 -> B4 calls carry same Run_Id.

Workflow_name: str | None (Optional, recommended)

What it is: Workflow containing this agent.
Why it matters: Groups agent nodes into workflow-level segments.
How to fill: Use logical workflow id, e.g. "A", "B", "triage_flow".
Best practice: Stable naming so workflow-level analytics remain clean.

workflow_group_name: str | None (Optional, recommended)

What it is: Top-level grouping for one or more workflows.
Why it matters: Organizes related workflows under a single umbrella.
How to fill: Product/process group, e.g. "Workflow Group 1" or "customer_support".
Best practice: This should typically remain constant while Workflow_name may change within the run.

agent_parent: list[str] | None (Optional)

What it is: Upstream agent lineage for current agent call.
Why it matters: Captures agent-to-agent dependency edges.
How to fill:

  • Root/first step: None
  • Next step consuming Agent-1 output: ["Agent-1"]
  • For deeper nesting, include lineage order if you track ancestry.

Best practice: At minimum include immediate parent when there is one.

Workflow_parent_name: list[str] | None (Optional)

What it is: Parent workflow lineage when transitioning across workflows.
Why it matters: Captures workflow-level dependency (A -> B, etc.).
How to fill:

  • Within same workflow: often None
  • First step in child workflow B after A: ["A"]

Best practice: Set it at workflow boundary transitions for clear graph reconstruction.

metadata: dict | None (Optional)

What it is: Arbitrary JSON-serializable context for user/request/business metadata.
Why it matters: Adds business observability and audit dimensions.
How to fill: Include only safe, needed keys. Typical:

  • user_id
  • role
  • tenant_id
  • request_id
  • session_id
  • channel

Best practice:

  • Avoid secrets/PII unless policy permits
  • Keep schema consistent across calls
  • You can enrich this per step if needed, but keep core keys stable per run

secret_key: str (Required)

What it is: Wrapper authentication/authorization key used by ingest path.
Why it matters: Required for secure wrapper operations.
How to fill: From env var (WRAP_SECRET_KEY), never hardcoded.
Best practice: Rotate regularly and keep out of logs.

max_tries: int = 1 (Optional)

What it is: Retry budget for wrapped execution pipeline.
Why it matters: Improves resilience against transient errors.
How to fill: Integer >= 1; often 1 to 3.
Best practice: Use higher values only where retries are safe and expected.

response_extractor: Callable[[Any], str] | None (Optional)

What it is: Custom function that extracts answer text from raw model output.
Why it matters: Needed when return shape is custom/non-standard.
How to fill: Provide function returning str, e.g. lambda obj: obj["raw_text"].
Best practice: Pair with merge/writeback settings if preserving object shape.

prompt_json_pointer: str | None (Optional)

What it is: RFC 6901 pointer to prompt field inside structured prompt payload.
Why it matters: Wrap only one field instead of whole JSON payload.
How to fill: Example "/messages/0/content" or "/query".
Best practice: Validate pointer path exists in your payload schema.

passthrough_when: Callable[[Any], bool] | None (Optional)

What it is: Predicate to bypass parse/ingest flow and return raw output unchanged.
Why it matters: Useful for tool-calls or intermediate SDK objects.
How to fill: Function returning True when output should pass through.
Example: detect tool_calls and skip final merge logic.

return_merger: Callable[[Any, str], Any] | None (Optional)

What it is: Hook to combine original output object with extracted answer text.
Why it matters: Gives full control over final response shape.
How to fill: (base_output, answer_text) -> desired_output.
Best practice: Use when default merge behavior does not match your API contract.

response_answer_json_pointer: str | None (Optional)

What it is: Explicit pointer for where extracted answer should be written back.
Why it matters: Deterministic answer placement in complex return objects.
How to fill: RFC 6901 path like "/choices/0/message/content".
Best practice: Prefer explicit pointer in non-standard/ambiguous structures.

wrap_llm_call-Specific Field

prompt_arg: str = "prompt" (Optional param with default, functionally required correctness)

What it is: Name of decorated function argument containing prompt payload.
Why it matters: Wrapper must know which argument to wrap.
How to fill: Match actual function signature, e.g. "messages", "question".
Best practice: Always set explicitly if your prompt arg is not named prompt.

wrap_llm_line-Specific Fields

llm_call: Callable[[Any], Any] (Required)

What it is: Callable that executes model request using wrapped prompt payload.
Why it matters: This is the actual invocation path for line-level API.
How to fill: lambda prompt: client.chat.completions.create(...) etc.
Best practice: Keep deterministic and side-effect-free except model call.

prompt: Any (Required)

What it is: Raw prompt input to be wrapped.
Why it matters: Source content entering wrapper pipeline.
How to fill:

  • plain string prompt, or
  • dict/JSON string when using prompt_json_pointer

Best practice: Ensure shape matches what llm_call expects after wrapping.

Practical Fill Pattern (for your hierarchy)

For one incoming user query:

  1. Generate run_id once.
  2. Keep workflow_group_name constant for entire orchestration.
  3. Set Workflow_name based on current workflow segment.
  4. Set agent_name for current step.
  5. Set lineage:
    • first agent: agent_parent=None, Workflow_parent_name=None
    • downstream in same workflow: agent_parent=[prev_agent]
    • first step in new workflow B after A: Workflow_parent_name=["A"]
  6. Attach metadata with user context (user_id, role, etc.).

Workflow graph example (linear chain)

This matches the topology and field usage in tests/test_linear_workflow_group_chain.py: four agents, two workflows inside one workflow group, with prompt text handed off along the chain.

Graph (who talks to whom)

Data flow: Agent-1 → Agent-2 → Agent-3 → Agent-4.

workflow_group_name = "Workflow Group 1"     ← same on every call

Workflow_name = "A"
  Agent-1   (root: no parents)
    ↓
  Agent-2   (agent_parent = ["Agent-1"])

Workflow_name = "B"   (starts after A’s last agent)
  Agent-3   (agent_parent = ["Agent-2"], Workflow_parent_name = ["A"])
    ↓
  Agent-4   (agent_parent = ["Agent-3"])

How each field builds the graph

  • workflow_group_name — Set to "Workflow Group 1" (or your real group id) on all steps so ingest knows every call belongs to the same product/process bucket.
  • Workflow_name"A" for Agent-1 and Agent-2; "B" for Agent-3 and Agent-4. This splits the run into two workflow segments under that group.
  • agent_name — The current node: "Agent-1""Agent-4". Must be distinct per step so each hop is identifiable.
  • Run_IdOne id reused on all four wrap_llm_line calls so analytics can stitch them into a single user/query trace (one session = one Run_Id). In this repo, the id is allocated from the VeryTrace run-id API on WRAP_ARBIS_BASE_URL and then reused for every agent hop.
  • agent_parentImmediate upstream agent name(s). None only for the first agent. Agent-2 points at Agent-1; Agent-3 at Agent-2; Agent-4 at Agent-3. That encodes the agent-level edge list.
  • Workflow_parent_nameWorkflow-level lineage when you enter a new workflow that continues after another. Here workflow B follows A, so only Agent-3 (the first step in B) sets Workflow_parent_name=["A"]. Agent-4 stays in B with no new workflow transition, so it uses None (same as agents fully inside A).

Optional metadata — Use the same dict on each call for fields like user_id and role so every step in the run carries the same user context; you can add step-specific keys if needed.

Run_Id API (session id allocation)

In tests/test_linear_workflow_group_chain.py, the session id comes from the run-id API before the first agent call:

  • Endpoint: POST {WRAP_ARBIS_BASE_URL}/api/unique-run-id
  • Request JSON: {"secret_key": WRAP_SECRET_KEY, "company_name": WRAP_COMPANY_NAME}
  • Response JSON: {"run_id": "..."}

Then that run_id is passed as Run_Id to Agent-1, Agent-2, Agent-3, and Agent-4. This is what links all hops into one session in the graph.

Step-by-step summary

Step agent_name Workflow_name workflow_group_name agent_parent Workflow_parent_name
1 Agent-1 A Workflow Group 1 None None
2 Agent-2 A Workflow Group 1 ["Agent-1"] None
3 Agent-3 B Workflow Group 1 ["Agent-2"] ["A"]
4 Agent-4 B Workflow Group 1 ["Agent-3"] None

Code shape (prompt strings omitted—see the test file for the full handoff text):

import requests

from llmwrap import openai_sdk_result_text, wrap_llm_line

WORKFLOW_GROUP = "Workflow Group 1"
WORKFLOW_A = "A"
WORKFLOW_B = "B"

# One Run_Id for the whole chain (one session id for all agent hops).
def allocate_run_id_from_api() -> str:
    base = CFG.wrap_arbis_base_url.rstrip("/")
    resp = requests.post(
        f"{base}/api/unique-run-id",
        json={
            "secret_key": CFG.key,
            "company_name": CFG.company,
        },
        timeout=30,
    )
    resp.raise_for_status()
    return str(resp.json()["run_id"])


run_id = allocate_run_id_from_api()

METADATA = {"user_id": "user-42", "role": "analyst"}  # optional; same dict every hop


def run_agent(*, client, model, agent_name, workflow_name, agent_parent, workflow_parent_name, prompt):
    return wrap_llm_line(
        llm_call=lambda p: client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": p}],
            temperature=0,
        ),
        prompt=prompt,
        company_name=CFG.company,
        project_name=CFG.project,
        agent_name=agent_name,
        Run_Id=run_id,
        Workflow_name=workflow_name,
        workflow_group_name=WORKFLOW_GROUP,
        agent_parent=agent_parent,
        Workflow_parent_name=workflow_parent_name,
        metadata=METADATA,
        secret_key=CFG.key,
        max_tries=3,
    )


# Agent-1: root of the agent graph, workflow A, no workflow parent.
out1 = run_agent(
    client=openai_client,
    model=CFG.model,
    agent_name="Agent-1",
    workflow_name=WORKFLOW_A,
    agent_parent=None,
    workflow_parent_name=None,
    prompt='...',  # e.g. ask for a single marked line — see test_linear_workflow_group_chain.py
)
text1 = openai_sdk_result_text(out1).strip()

# Agent-2: still workflow A; parent agent is Agent-1.
out2 = run_agent(
    client=openai_client,
    model=CFG.model,
    agent_name="Agent-2",
    workflow_name=WORKFLOW_A,
    agent_parent=["Agent-1"],
    workflow_parent_name=None,
    prompt=f"The previous agent output is:\n{text1}\n...",
)
text2 = openai_sdk_result_text(out2).strip()

# Agent-3: first step in workflow B; consumes Agent-2; workflow B follows A.
out3 = run_agent(
    client=openai_client,
    model=CFG.model,
    agent_name="Agent-3",
    workflow_name=WORKFLOW_B,
    agent_parent=["Agent-2"],
    workflow_parent_name=[WORKFLOW_A],
    prompt=f"Previous workflow A ended with:\n{text2}\n...",
)
text3 = openai_sdk_result_text(out3).strip()

# Agent-4: still workflow B; parent agent Agent-3 only.
out4 = run_agent(
    client=openai_client,
    model=CFG.model,
    agent_name="Agent-4",
    workflow_name=WORKFLOW_B,
    agent_parent=["Agent-3"],
    workflow_parent_name=None,
    prompt=f"Previous agent in workflow B produced:\n{text3}\n...",
)

Distinct example pairs

Convention. Snippets assume CFG, openai_client, RUN_ID, WORKFLOW_NAME, WORKFLOW_GROUP_NAME, AGENT_PARENT, WORKFLOW_PARENT_NAME, METADATA, and (where needed) TOOLS / MESSAGES exist in your app. The same tracking kwargs appear in every call so ingest can correlate steps.

How to read this section. Each numbered scenario is one behavioral class for the wrapper. For each class we show the same behavior twice: wrap_llm_call binds the prompt via a decorated function argument; wrap_llm_line passes llm_call and prompt at the call site. Ingest and response handling are the same; only binding style differs.

Quick contrast

# Scenario What makes it different from the others
1 Chat Completions Normal chat completion object (or dict with the same choices / message / content layout). OpenRouter uses this same shape via an OpenAI-compatible client.
2 Responses API Uses client.responses.create and string input, not chat.completions.
3 Multipart assistant content Assistant content is a list of parts (e.g. multiple {"type":"text",...}), not a single string.
4 Tool calls + passthrough passthrough_when returns the raw SDK object on tool-call turns so you can run another round trip before a final wrapped answer.
5 Nested wrapped calls A parent function calls other wrapped functions; each invocation is a separate wrapped LLM call with its own agent_name.
6 Custom response_extractor Answer lives in a custom field (here raw_text); without return_merger / answer pointer you often get a plain string back.
7 Non-reconstructable return Object cannot be deep-copied or rebuilt; the wrapper uses model_dump()-style serialization and returns a dict tree instead of the original type.
8 Tool agent + wrapped LLM tools Top chat turn uses tools= and passthrough_when (same idea as row 4), but each tool name is implemented by a separate wrapped LLM function, so every tool invocation is its own ingest (agent_name per tool).

1. Chat Completions

What this demonstrates. The common Chat Completions path: messages in, completion object out. The library can detect the answer slot and preserve the SDK return shape when possible.

How it differs. This is the baseline. OpenRouter (or any OpenAI-compatible base URL) is not a separate pattern: use the same chat.completions.create call with a different client and model id.

wrap_llm_call — prompt is the messages argument of your function.

@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex1_chat_call",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="messages",
    max_tries=1,
)
def one_turn(messages):
    return openai_client.chat.completions.create(
        model=CFG.model, messages=messages, temperature=0
    )

wrap_llm_line — prompt lives inside a dict; prompt_json_pointer selects the user text to wrap.

payload = {
    "model": CFG.model,
    "messages": [{"role": "user", "content": "one sentence"}],
}
out = wrap_llm_line(
    llm_call=lambda p: openai_client.chat.completions.create(
        model=p["model"], messages=p["messages"], temperature=0
    ),
    prompt=payload,
    prompt_json_pointer="/messages/0/content",
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex1_chat_line",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    max_tries=1,
)

2. Responses API

What this demonstrates. The OpenAI Responses API: a string (or structured) input and responses.create, which returns a different object shape than chat completions.

How it differs. From example 1: different method, different prompt parameter name (input vs messages), different default extraction rules inside the wrapper.

wrap_llm_call

@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex2_responses_call",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="question",
    max_tries=1,
)
def ask(question: str):
    return openai_client.responses.create(model=CFG.model, input=question)

wrap_llm_line

out = wrap_llm_line(
    llm_call=lambda prompt: openai_client.responses.create(
        model=CFG.model, input=prompt
    ),
    prompt="Return one sentence.",
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex2_responses_line",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    max_tries=1,
)

3. Multipart assistant content

What this demonstrates. The assistant message content is a list of segments (multipart), not a single string. The wrapper still extracts or merges answer text from that structure.

How it differs. From examples 1–2: tests list-shaped content under choices[0].message, which is a different merge path than a scalar string.

wrap_llm_call

@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex3_multipart_call",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="messages",
    max_tries=1,
)
def one_turn(messages):
    return {
        "choices": [{
            "message": {
                "role": "assistant",
                "content": [
                    {"type": "text", "text": "Part A"},
                    {"type": "text", "text": "Part B"},
                ],
            }
        }]
    }

wrap_llm_line

payload = {"messages": [{"role": "user", "content": "multipart"}]}
out = wrap_llm_line(
    llm_call=lambda _p: {
        "choices": [{
            "message": {
                "role": "assistant",
                "content": [
                    {"type": "text", "text": "Part A"},
                    {"type": "text", "text": "Part B"},
                ],
            }
        }]
    },
    prompt=payload,
    prompt_json_pointer="/messages/0/content",
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex3_multipart_line",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    max_tries=1,
)

4. Tool calls with passthrough

What this demonstrates. When the model returns tool calls, you usually want the raw completion object back so your app can execute tools and call the model again. passthrough_when does that: no parse/ingest on those turns; later turns without tool calls follow the normal wrapped path.

How it differs. From examples 1–3: introduces branching behavior based on the raw return value and requires tools in the request.

Related pattern. Example 8 uses the same passthrough mechanism when each named tool is backed by its own wrapped LLM (see test_top_level_tool_agent_with_two_real_tools_and_nested_wrapped_llm_tools in tests/testing_different_interfaces.py).

wrap_llm_call

def has_tool_calls(raw):
    try:
        return bool(raw.choices[0].message.tool_calls)
    except Exception:
        return False

@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex4_tools_call",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="messages",
    passthrough_when=has_tool_calls,
    max_tries=1,
)
def run_turn(messages):
    return openai_client.chat.completions.create(
        model=CFG.model, messages=messages, tools=TOOLS, tool_choice="auto"
    )

wrap_llm_line

out = wrap_llm_line(
    llm_call=lambda p: openai_client.chat.completions.create(
        model=p["model"],
        messages=p["messages"],
        tools=p["tools"],
        tool_choice="auto",
    ),
    prompt={"model": CFG.model, "messages": MESSAGES, "tools": TOOLS},
    prompt_json_pointer="/messages/1/content",
    passthrough_when=has_tool_calls,
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex4_tools_line",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    max_tries=1,
)

5. Nested wrapped calls

What this demonstrates. Composition: a top-level wrapped function calls other wrapped functions. Each inner call is a full wrapper invocation (its own agent_name, same or different Run_Id depending on how you thread context). This replaces the older README variants that repeated the same idea under different names (separate tools vs “manager” vs “hierarchy”).

How it differs. From examples 1–4: not about return shape; about call graph and multiple ingest events per user request.

wrap_llm_call

@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex5_subagent_a",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="question",
    max_tries=1,
)
def subagent_a(question: str):
    return openai_client.responses.create(model=CFG.model, input=question)

@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex5_subagent_b",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="question",
    max_tries=1,
)
def subagent_b(question: str):
    return openai_client.responses.create(model=CFG.model, input=question)

@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex5_top_call",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="question",
    max_tries=1,
)
def top_agent(question: str):
    return subagent_a(question) + "\n" + subagent_b(question)

wrap_llm_line

def top_agent(question: str):
    a = wrap_llm_line(
        llm_call=lambda q: openai_client.responses.create(model=CFG.model, input=q),
        prompt=question,
        company_name=CFG.company,
        project_name=CFG.project,
        agent_name="ex5_subagent_a",
        Run_Id=RUN_ID,
        Workflow_name=WORKFLOW_NAME,
        workflow_group_name=WORKFLOW_GROUP_NAME,
        agent_parent=AGENT_PARENT,
        Workflow_parent_name=WORKFLOW_PARENT_NAME,
        metadata=METADATA,
        secret_key=CFG.key,
        max_tries=1,
    )
    b = wrap_llm_line(
        llm_call=lambda q: openai_client.responses.create(model=CFG.model, input=q),
        prompt=question,
        company_name=CFG.company,
        project_name=CFG.project,
        agent_name="ex5_subagent_b",
        Run_Id=RUN_ID,
        Workflow_name=WORKFLOW_NAME,
        workflow_group_name=WORKFLOW_GROUP_NAME,
        agent_parent=AGENT_PARENT,
        Workflow_parent_name=WORKFLOW_PARENT_NAME,
        metadata=METADATA,
        secret_key=CFG.key,
        max_tries=1,
    )
    return f"{a}\n{b}"

6. Custom response extractor

What this demonstrates. Your model function returns a custom object shape. You supply response_extractor so the wrapper knows where the answer text lives for ingest.

How it differs. From examples 1–5: answer is not in the default chat/response slots; if you do not also supply return_merger or response_answer_json_pointer, the wrapper may give you a plain string instead of preserving the original object.

wrap_llm_call

@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex6_extractor_call",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="messages",
    response_extractor=lambda obj: obj["raw_text"],
    max_tries=1,
)
def one_turn(messages):
    return {"raw_text": "Model content here", "meta": {"id": "abc"}}

wrap_llm_line

out = wrap_llm_line(
    llm_call=lambda _prompt: {"raw_text": "model answer", "meta": {"id": "abc"}},
    prompt="hello",
    response_extractor=lambda obj: obj["raw_text"],
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex6_extractor_line",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    max_tries=1,
)

7. Non-reconstructable model output

What this demonstrates. Some return values cannot be cloned or rebuilt into the same Python type. The wrapper still needs a structured view for merge/ingest, so it falls back to a dict produced from model_dump()-style data.

How it differs. Focuses on serialization / copy failure, not on chat tools or custom extractors.

wrap_llm_call

class NonCopyable:
    def model_dump(self):
        return {
            "choices": [{"message": {"role": "assistant", "content": "hello"}}]
        }

    def __deepcopy__(self, memo):
        raise RuntimeError("cannot deepcopy")

@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex7_noncopy_call",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="messages",
    max_tries=1,
)
def one_turn(messages):
    return NonCopyable()

wrap_llm_line

class NonCopyable:
    def model_dump(self):
        return {
            "choices": [{"message": {"role": "assistant", "content": "hello"}}]
        }

    def __deepcopy__(self, memo):
        raise RuntimeError("cannot deepcopy")

out = wrap_llm_line(
    llm_call=lambda _prompt: NonCopyable(),
    prompt="one sentence",
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex7_noncopy_line",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    max_tries=1,
)

8. Tool agent with wrapped LLM tools

Plain summary. The coordinator model gets a tool menu via chat.completions.create(..., tools=...). When it returns tool_calls, your code runs real Python for each name. If a “tool” is actually another LLM call, wrap that call too: then ingest sees one event per tool LLM (its own agent_name) and separate events for the coordinator.

What goes in tools?
tools is a list of JSON descriptions for the API only. Each entry is usually {"type": "function", "function": {...}} with:

  • name: string the model will put in tool_calls[].function.name
  • description: free text shown to the model
  • parameters: a small JSON Schema object (type, properties, required, …) describing the arguments JSON the model should output

It is not a list of Python callables. The provider uses this list so the model knows what to ask for; you map name → your own functions (or wrapped LLM helpers) after the response comes back.

Do I need something like a run_coordinator function?
llmwrap does not require it. Chat Completions tool use is multi-step: one response is either “here are tool_calls” or “here is final text”. After tool calls you append the assistant turn and one {"role": "tool", ...} message per call, then call the coordinator again. Any name (run_coordinator, your agent framework, inline code) is fine—the README uses one small driver so the flow is obvious.

Runnable reference. test_top_level_tool_agent_with_two_real_tools_and_nested_wrapped_llm_tools and test_top_level_tool_agent_with_two_real_tools_and_nested_wrapped_llm_tools_line_wrapper in tests/testing_different_interfaces.py.

How it differs from example 4. Same passthrough_when on the coordinator; example 8 adds wrapped LLM functions as the bodies behind specific tool names.

wrap_llm_call

import json

from llmwrap import openai_sdk_result_text, wrap_llm_call

# Declares two callable tools the MODEL may request (API schema, not Python functions).
TOOL_DEFINITIONS_FOR_API = [
    {
        "type": "function",
        "function": {
            "name": "get_operational_fact",
            "description": "Return one short operational fact about a topic.",
            "parameters": {
                "type": "object",
                "properties": {"topic": {"type": "string", "description": "Subject to summarize"}},
                "required": ["topic"],
            },
        },
    },
    {
        "type": "function",
        "function": {
            "name": "get_risk_fact",
            "description": "Return one short risk-oriented fact about a topic.",
            "parameters": {
                "type": "object",
                "properties": {"topic": {"type": "string"}},
                "required": ["topic"],
            },
        },
    },
]


def has_tool_calls(raw):
    try:
        return bool(raw.choices[0].message.tool_calls)
    except Exception:
        return False


@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex8_weather_tool",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="question",
    max_tries=1,
)
def weather_tool_llm(question: str):
    return openai_client.chat.completions.create(
        model=CFG.model,
        messages=[{"role": "user", "content": question}],
        temperature=0,
    )


@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex8_risk_tool",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="question",
    max_tries=1,
)
def risk_tool_llm(question: str):
    return openai_client.chat.completions.create(
        model=CFG.model,
        messages=[{"role": "user", "content": question}],
        temperature=0,
    )


@wrap_llm_call(
    company_name=CFG.company,
    project_name=CFG.project,
    agent_name="ex8_tool_coordinator",
    Run_Id=RUN_ID,
    Workflow_name=WORKFLOW_NAME,
    workflow_group_name=WORKFLOW_GROUP_NAME,
    agent_parent=AGENT_PARENT,
    Workflow_parent_name=WORKFLOW_PARENT_NAME,
    metadata=METADATA,
    secret_key=CFG.key,
    prompt_arg="messages",
    passthrough_when=has_tool_calls,
    max_tries=1,
)
def coordinator_turn(messages: list, tool_definitions: list):
    return openai_client.chat.completions.create(
        model=CFG.model,
        messages=messages,
        tools=tool_definitions,
        tool_choice="auto",
        temperature=0,
    )


# App-side driver (name arbitrary): repeat coordinator → execute tools → append results.
def run_until_final_answer(user_text: str) -> str:
    messages = [
        {
            "role": "system",
            "content": "Use the tools when needed, then answer in plain language.",
        },
        {"role": "user", "content": user_text},
    ]
    for _ in range(8):
        out = coordinator_turn(messages, TOOL_DEFINITIONS_FOR_API)
        msg = out.choices[0].message
        if not msg.tool_calls:
            return openai_sdk_result_text(out)
        messages.append(msg.model_dump(exclude_none=True))
        for tc in msg.tool_calls:
            args = json.loads(tc.function.arguments or "{}")
            topic = str(args.get("topic", ""))
            if tc.function.name == "get_operational_fact":
                fact = openai_sdk_result_text(
                    weather_tool_llm(f"One operational fact about {topic}")
                )
            elif tc.function.name == "get_risk_fact":
                fact = openai_sdk_result_text(
                    risk_tool_llm(f"One risk fact about {topic}")
                )
            else:
                fact = "unknown tool"
            messages.append(
                {
                    "role": "tool",
                    "tool_call_id": tc.id,
                    "content": json.dumps({"fact": fact}),
                }
            )
    raise RuntimeError("Tool loop limit exceeded")

wrap_llm_line

Same TOOL_DEFINITIONS_FOR_API and the same driver idea: coordinator = one wrap_llm_line with passthrough_when and prompt_json_pointer on the user message; each tool = wrap_llm_line on a small payload (here {"model", "question"}).

import json

from llmwrap import openai_sdk_result_text, wrap_llm_line

# TOOL_DEFINITIONS_FOR_API: identical list as in the wrap_llm_call example above.


def weather_tool_llm(question: str):
    payload = {"model": CFG.model, "question": question}
    return wrap_llm_line(
        llm_call=lambda p: openai_client.chat.completions.create(
            model=p["model"],
            messages=[{"role": "user", "content": p["question"]}],
            temperature=0,
        ),
        prompt=payload,
        prompt_json_pointer="/question",
        company_name=CFG.company,
        project_name=CFG.project,
        agent_name="ex8_weather_tool",
        Run_Id=RUN_ID,
        Workflow_name=WORKFLOW_NAME,
        workflow_group_name=WORKFLOW_GROUP_NAME,
        agent_parent=AGENT_PARENT,
        Workflow_parent_name=WORKFLOW_PARENT_NAME,
        metadata=METADATA,
        secret_key=CFG.key,
        max_tries=1,
    )


def risk_tool_llm(question: str):
    payload = {"model": CFG.model, "question": question}
    return wrap_llm_line(
        llm_call=lambda p: openai_client.chat.completions.create(
            model=p["model"],
            messages=[{"role": "user", "content": p["question"]}],
            temperature=0,
        ),
        prompt=payload,
        prompt_json_pointer="/question",
        company_name=CFG.company,
        project_name=CFG.project,
        agent_name="ex8_risk_tool",
        Run_Id=RUN_ID,
        Workflow_name=WORKFLOW_NAME,
        workflow_group_name=WORKFLOW_GROUP_NAME,
        agent_parent=AGENT_PARENT,
        Workflow_parent_name=WORKFLOW_PARENT_NAME,
        metadata=METADATA,
        secret_key=CFG.key,
        max_tries=1,
    )


def has_tool_calls(raw):
    try:
        return bool(raw.choices[0].message.tool_calls)
    except Exception:
        return False


def coordinator_turn(messages: list, tool_definitions: list):
    return wrap_llm_line(
        llm_call=lambda p: openai_client.chat.completions.create(
            model=p["model"],
            messages=p["messages"],
            tools=p["tools"],
            tool_choice="auto",
            temperature=0,
        ),
        prompt={"model": CFG.model, "messages": messages, "tools": tool_definitions},
        prompt_json_pointer="/messages/1/content",
        passthrough_when=has_tool_calls,
        company_name=CFG.company,
        project_name=CFG.project,
        agent_name="ex8_tool_coordinator",
        Run_Id=RUN_ID,
        Workflow_name=WORKFLOW_NAME,
        workflow_group_name=WORKFLOW_GROUP_NAME,
        agent_parent=AGENT_PARENT,
        Workflow_parent_name=WORKFLOW_PARENT_NAME,
        metadata=METADATA,
        secret_key=CFG.key,
        max_tries=1,
    )


def run_until_final_answer(user_text: str) -> str:
    messages = [
        {"role": "system", "content": "Use the tools when needed, then answer."},
        {"role": "user", "content": user_text},
    ]
    for _ in range(8):
        out = coordinator_turn(messages, TOOL_DEFINITIONS_FOR_API)
        msg = out.choices[0].message
        if not msg.tool_calls:
            return openai_sdk_result_text(out)
        messages.append(msg.model_dump(exclude_none=True))
        for tc in msg.tool_calls:
            args = json.loads(tc.function.arguments or "{}")
            topic = str(args.get("topic", ""))
            if tc.function.name == "get_operational_fact":
                fact = openai_sdk_result_text(
                    weather_tool_llm(f"One operational fact about {topic}")
                )
            elif tc.function.name == "get_risk_fact":
                fact = openai_sdk_result_text(
                    risk_tool_llm(f"One risk fact about {topic}")
                )
            else:
                fact = "unknown tool"
            messages.append(
                {
                    "role": "tool",
                    "tool_call_id": tc.id,
                    "content": json.dumps({"fact": fact}),
                }
            )
    raise RuntimeError("Tool loop limit exceeded")

Console output

Each wrapped call may emit one line to stdout when ingest succeeds or when ingest / logs reporting fails. The line starts with [Arbis-Wrapper], followed by a single JSON object (no pretty-printing). If stdout is a TTY, that line is wrapped in green (success) or red (failure) ANSI sequences; if stdout is not a TTY (pipes, CI, log capture), the same JSON is printed without color codes.

Successful POSTs to /api/logs do not print anything to the console.

Success (after ingest HTTP 2xx)

Emitted when encrypted POST …/api/ingest returns a success status code (after the model output was parsed successfully).

Expected shape (values are examples):

[Arbis-Wrapper] {"message": "Query processed successfully; ingest accepted.", "api_status": 200, "path": "/api/ingest", "query": "<original logical prompt passed to the wrapper>"}
  • message: Fixed success text.
  • api_status: HTTP status from the ingest response (typically 200).
  • path: "/api/ingest" for the normal ingest path.
  • query: The wrapper’s original prompt string used for correlation (the same logical input ingest uses as prompt, not the augmented “wrapped” block sent to the model).

If the pipeline used the fallback ingest instead (POST …/ingest/fallback after parse retries were exhausted), a success line looks the same except path is "/ingest/fallback" and query is still the logical prompt:

[Arbis-Wrapper] {"message": "Query processed successfully; ingest accepted.", "api_status": 200, "path": "/ingest/fallback", "query": "<original logical prompt>"}

Failure

Emitted when ingest or fallback ingest fails, or when POST …/api/logs fails after all retries. Same [Arbis-Wrapper] prefix and single JSON object; red when stdout is a TTY.

Main ingest failed (model output parsed, but /api/ingest did not return 2xx, or the request raised before a response):

[Arbis-Wrapper] {"message": "Ingest request failed.", "http_status": 401, "error": "<API error body or short reason>"}

Fallback ingest failed (/ingest/fallback):

[Arbis-Wrapper] {"message": "Ingest fallback request failed.", "http_status": 503, "error": "<API error body or short reason>"}

Wrapper logs failed (all attempts to /api/logs failed):

[Arbis-Wrapper] {"message": "Failed to record wrapper logs to the server.", "http_status": 500, "error": "<API error body or exception text>"}

When there is no HTTP response (timeouts, connection errors, etc.), http_status is JSON null:

[Arbis-Wrapper] {"message": "Ingest request failed.", "http_status": null, "error": "<exception message>"}

If the library has no usable error text, error may be "(no detailed error available)".

Notes

  • Keep credentials in environment variables (.env) and never hardcode production keys.
  • Use distinct agent_name values per workflow for clean tracking.
  • Pass Run_Id, workflow fields, and metadata when you need ingest to group steps or attach user context (user_id, role, and so on); omit any argument you do not use.
  • For custom return shapes, pair response_extractor with response_answer_json_pointer or return_merger when needed.
  • Exhaustive runnable variants (including redundant naming patterns) are in tests/testing_different_interfaces.py. For a linear workflow-group chain demo, see tests/test_linear_workflow_group_chain.py.

License

MIT. See LICENSE.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

arbis_llmwrap-0.3.7-cp313-cp313-win_amd64.whl (173.5 kB view details)

Uploaded CPython 3.13Windows x86-64

arbis_llmwrap-0.3.7-cp313-cp313-win32.whl (143.9 kB view details)

Uploaded CPython 3.13Windows x86

arbis_llmwrap-0.3.7-cp313-cp313-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

arbis_llmwrap-0.3.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_x86_64.whl (212.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ x86-64

arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_universal2.whl (396.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ universal2 (ARM64, x86-64)

arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_arm64.whl (199.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

arbis_llmwrap-0.3.7-cp312-cp312-win_amd64.whl (171.8 kB view details)

Uploaded CPython 3.12Windows x86-64

arbis_llmwrap-0.3.7-cp312-cp312-win32.whl (143.6 kB view details)

Uploaded CPython 3.12Windows x86

arbis_llmwrap-0.3.7-cp312-cp312-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

arbis_llmwrap-0.3.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_x86_64.whl (214.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ x86-64

arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_universal2.whl (400.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ universal2 (ARM64, x86-64)

arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_arm64.whl (201.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

arbis_llmwrap-0.3.7-cp311-cp311-win_amd64.whl (184.1 kB view details)

Uploaded CPython 3.11Windows x86-64

arbis_llmwrap-0.3.7-cp311-cp311-win32.whl (153.0 kB view details)

Uploaded CPython 3.11Windows x86

arbis_llmwrap-0.3.7-cp311-cp311-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

arbis_llmwrap-0.3.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_x86_64.whl (216.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_universal2.whl (399.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ universal2 (ARM64, x86-64)

arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_arm64.whl (197.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

arbis_llmwrap-0.3.7-cp310-cp310-win_amd64.whl (183.2 kB view details)

Uploaded CPython 3.10Windows x86-64

arbis_llmwrap-0.3.7-cp310-cp310-win32.whl (153.3 kB view details)

Uploaded CPython 3.10Windows x86

arbis_llmwrap-0.3.7-cp310-cp310-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

arbis_llmwrap-0.3.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_x86_64.whl (218.7 kB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_universal2.whl (403.2 kB view details)

Uploaded CPython 3.10macOS 11.0+ universal2 (ARM64, x86-64)

arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_arm64.whl (199.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

arbis_llmwrap-0.3.7-cp39-cp39-win_amd64.whl (183.8 kB view details)

Uploaded CPython 3.9Windows x86-64

arbis_llmwrap-0.3.7-cp39-cp39-win32.whl (153.7 kB view details)

Uploaded CPython 3.9Windows x86

arbis_llmwrap-0.3.7-cp39-cp39-musllinux_1_2_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

arbis_llmwrap-0.3.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_x86_64.whl (219.6 kB view details)

Uploaded CPython 3.9macOS 11.0+ x86-64

arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_universal2.whl (404.9 kB view details)

Uploaded CPython 3.9macOS 11.0+ universal2 (ARM64, x86-64)

arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_arm64.whl (200.1 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

arbis_llmwrap-0.3.7-cp38-cp38-win_amd64.whl (210.5 kB view details)

Uploaded CPython 3.8Windows x86-64

arbis_llmwrap-0.3.7-cp38-cp38-win32.whl (180.3 kB view details)

Uploaded CPython 3.8Windows x86

arbis_llmwrap-0.3.7-cp38-cp38-musllinux_1_2_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ x86-64

arbis_llmwrap-0.3.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_x86_64.whl (256.6 kB view details)

Uploaded CPython 3.8macOS 11.0+ x86-64

arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_universal2.whl (479.3 kB view details)

Uploaded CPython 3.8macOS 11.0+ universal2 (ARM64, x86-64)

arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_arm64.whl (237.1 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

File details

Details for the file arbis_llmwrap-0.3.7-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 332e66eab380daf039a6229b400c544b0b92fe466a88d35b7e0a5f5c0092e0c7
MD5 43ed048565d82738da34bbc5674d4bea
BLAKE2b-256 1bcd88bf87c44972b352073b5828d61e8dd0f64502c722544e3f79e0aa27bf24

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp313-cp313-win_amd64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp313-cp313-win32.whl.

File metadata

  • Download URL: arbis_llmwrap-0.3.7-cp313-cp313-win32.whl
  • Upload date:
  • Size: 143.9 kB
  • Tags: CPython 3.13, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arbis_llmwrap-0.3.7-cp313-cp313-win32.whl
Algorithm Hash digest
SHA256 b43aff56df0df11bf926f7c6333e3ca08175f5834c87b87d027c737085ff8d6e
MD5 982047c847a06fc37e267c427b64094e
BLAKE2b-256 fcab80b68daf5d3a75bad2a5c1bb67bf41cf4cb5e0ec13f3233c5c7bd612878b

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp313-cp313-win32.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c09cf4d37678fc5d6353393efb9dd65bec36f2ce194782db03a0ca8b785e5d58
MD5 f648b6bec4b839d4d2069f8c7d7e7e8f
BLAKE2b-256 262bb37e9cc282741ee1ef2b630b0c6414ff791bea5ce7c8bb4031e55482e3b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 39f0f2ac9efd4f6929de904f4efb3ad47f5a692adab9ecbca5f796675c83ebe1
MD5 590f88418c48c1eba4a9aba10d19de9c
BLAKE2b-256 4ea8f65abe55cb9829d1d246501a7c13f9b3da1839fba48213b2cbe5b6d9a800

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 ee4f9f5a44c6a76d531d179d3a2d08484547867a4131cf1a4c1aef5830be25ae
MD5 6bfa490bbd319f61521a30baddf1ea4e
BLAKE2b-256 ba1af360de81b8006e6383703da6e6b757e141c6e91b28e882903a7affc0809b

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 391bb6f9a7bcaee4b248e34808f8833683538cc46f989c0a346d574cf42f37da
MD5 be4eb1aad6dee134eb87dc325887b334
BLAKE2b-256 96f2e40fbebbc59c81a5db393e934c91ae44b596e64f92ebe29adfa99829acb8

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_universal2.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0744f919d9286ad2526894cad7eb1ce191bc39e25460aa64474a1e52a43c39ef
MD5 d17c9a4374c95bc085dcf76a233b98bd
BLAKE2b-256 1b5f5caadf80067de2ae884ea26892cee2aa92ea0cfc06319e2609bded99e108

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 792db2b1b82316a782e1b1d4dd268c0b67c76c982cd351e4c9e27034dcd703a0
MD5 e640cfae3138a58d64284ce52372204e
BLAKE2b-256 6deff01d0fc85c3502373de23d774f5c0a8a131eb303ea7e7163826dbad697c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp312-cp312-win_amd64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp312-cp312-win32.whl.

File metadata

  • Download URL: arbis_llmwrap-0.3.7-cp312-cp312-win32.whl
  • Upload date:
  • Size: 143.6 kB
  • Tags: CPython 3.12, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arbis_llmwrap-0.3.7-cp312-cp312-win32.whl
Algorithm Hash digest
SHA256 69acbdbc533fd40820c7234789e686c1adb620fb3dcc466679b90d356ad8aac7
MD5 afab8b2dbc6df17555f2b6f6e06dd693
BLAKE2b-256 26e813ab2b12e69079cd60be6f20bf782d2b0ecfa801f4251ea8d1b1f9e12e38

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp312-cp312-win32.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3dfc591386e6f4e8bb965dc7a3aa7ef5505f657304b6ee2cfd305a404aac1820
MD5 bdeda18d9b920b9bbe234ea44d3b754e
BLAKE2b-256 0b0a3cac8484c47af9c0bc5c8566dcc2840e06d8385d28db14ff69ff3d3c132a

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 36f086bf6c812d57d365ab6b444404fb9539a7863cf7ecdea8a2650601030466
MD5 b818b93957d0d537e12f6e93235bf3e4
BLAKE2b-256 ac6567e1b405ef70d2d39c8967092c7c4b99c12cec126f0e96d2820f0d232db8

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 d15cf21527e8b89b728308f07c82e979763822d027a7f19081f66d7671a5958d
MD5 94a9d17499a79397e9ff764c2ebf0d8c
BLAKE2b-256 13e9dca0b6239b3427a399e65dd7b87aefeebd8725b652deef41355ed21c3761

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 d79fee026307900c6c81d0043133cf08ae6fa099f36cd9395d29359d1500424c
MD5 976918cc9d035a9ac4f7c8ca349196db
BLAKE2b-256 82e99bba0ff85d309e529a959fb5adbbf2bf01a81b144492bfb312000560ffac

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_universal2.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5c53979fe0d6345fcc77d69030df58f46b1d90befd967a815395df490f4344f9
MD5 61782d4c36f93a80ef7b25acc9b50d6b
BLAKE2b-256 bd882c872e4d6ac19ed50188e257af4ae82cecbd1ae2f36512d8dcce49bebada

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 8ae63aa6f6068439386d3ba62b213437a0e25d7ac06e740261697e8304305793
MD5 daf86e3824931aa411bf3108d27ad772
BLAKE2b-256 faead9febe9ea0a5b23a4c6ee635435fd7b5ddd3805e69c5f9cd034583f7a357

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp311-cp311-win_amd64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp311-cp311-win32.whl.

File metadata

  • Download URL: arbis_llmwrap-0.3.7-cp311-cp311-win32.whl
  • Upload date:
  • Size: 153.0 kB
  • Tags: CPython 3.11, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arbis_llmwrap-0.3.7-cp311-cp311-win32.whl
Algorithm Hash digest
SHA256 394d7a78bb2a977d828b39c748782300f6f6a0ed8aa32c634079358cedb13933
MD5 1a7d1f0dc63f8238fe94cc45a36060f6
BLAKE2b-256 33dcb13a7ef975d2198907da1ed35c76ae29596aa5d28e25d5634673d4789541

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp311-cp311-win32.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 5e44a32bb271aec5cfc2c4eb75b94285c2f29801068a883f6e0ec198dc219366
MD5 98eceb185381f54bf20923bde150db05
BLAKE2b-256 e788ba925a5993842090780038ef25ed2fc44e829c89daa35f123408a2f62a49

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 65b9cf1a877ecdb40b7745c41169da36d56b8b636d73f0980f966c4e6ae01a15
MD5 a5af13a537ebdeb8f706a00e0bb425ae
BLAKE2b-256 0398e1d7a17e0264738186895828fd48686199f78a122cef133db20664fc68dc

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 89e4c5bd704670799b6b1232e6d90adcef9b4d1dc4dd4e08c22ed5077b125709
MD5 3b410c7de7e7b91b4d20559fca0ed366
BLAKE2b-256 e56424191edd6bced917c65cad7b419b9d2fe2b83e15ad524762bd0b2f109b46

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 10f423c71401b59b6b8af94c0252781d2ac8252d580c93cfca65e9d9c9dc24a8
MD5 f50d41346cee506d693df716a8ed9f7b
BLAKE2b-256 d920f845b5b47d28ad7619d2dcd5ef67889ad5a0ebc700b412b001698c8808ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_universal2.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f57a0d132d67e6be5f9f1d9d1cd00d9fa529e7c84f79de24fe9ae35e26c5d011
MD5 888900f2a6dea55a5d04d8d89917cc12
BLAKE2b-256 ca5d0396d0c4fd0ce040420437f3593a61f517e04f528ff911b2d6f716026149

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 34612803b9ce6c3b541cb3604de58ac629e72be492902906dc71f73184b8efdd
MD5 b1076a5fad920574b999b0c7c4003b4a
BLAKE2b-256 31e35bf980f7991bb89f5ab059cd52dc39cccce1b387aab500142a09660f662d

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp310-cp310-win_amd64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp310-cp310-win32.whl.

File metadata

  • Download URL: arbis_llmwrap-0.3.7-cp310-cp310-win32.whl
  • Upload date:
  • Size: 153.3 kB
  • Tags: CPython 3.10, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arbis_llmwrap-0.3.7-cp310-cp310-win32.whl
Algorithm Hash digest
SHA256 4d7d2e66baa72240222d26a1514c82766fcbcade1a1a971ad4686b6280bb81a1
MD5 53c0fbf22b50c025956d13b6a6f977e9
BLAKE2b-256 9d66d6c30cbfbb827bcc57dbf2e444aef51c63970ade2dc07b35d75dc271f7e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp310-cp310-win32.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 1678cf4c9d6ff01a06a53c9519e43cf1f648865449c6c70a6c08b51a1233e725
MD5 ce813530153779bb6b6071fe14f0e35e
BLAKE2b-256 c63c50bc26ef41b92ddf889b45d26cdda0c667764f1e33eead763db105edb82a

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aed87b7f39b3d6633d7e8f79755d7074b8354d2e7c8910893ace0d4f10156a82
MD5 a3b8b3dba52ac7f9720b24016515a1c6
BLAKE2b-256 a878faced467ef814a5e5388b573ae3e107bf504ff66a7cde40a5dc29acd8710

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c35187cc8dc6e97e362c721ab640582bf84da78993f29d7e915e26d56d3b48ee
MD5 42c24f91003e2c62b61c2e38f5e2eff6
BLAKE2b-256 1f258625d355748c45fb80fcab107e8dc18a9effb310c538130bb1c2fc5cf7d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 3dfaff59ed550e8b197daba9dc0870f719a70e27055b054d1ee983cbd5be892b
MD5 0a15c97a631b74933d7736d2294d2174
BLAKE2b-256 f097e0db33dd49b8d87bc69db4bd8bc8f839ac69926b8edaef283578da9468d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_universal2.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 42da396a6bbce7563fa249a00242ae85a38ad9d0f56185fd8bde2ac9d8e91613
MD5 a87f5e3cc5fa9c07c02bd79b328f6ea3
BLAKE2b-256 d1feb3ce94707d1ee5a95afa66f6c853003759810952c2cd559d72f2e023526a

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 9a37bf54f1ec7dfde8e4ad377631bf06203eabce98b5afa1f1707eb757162871
MD5 173ddf3cc35c92e129a16426c380d992
BLAKE2b-256 a67e102c5e53a6a690cf7e87ec7e2da4373e936e4a801de080457a57c8031251

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp39-cp39-win_amd64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp39-cp39-win32.whl.

File metadata

  • Download URL: arbis_llmwrap-0.3.7-cp39-cp39-win32.whl
  • Upload date:
  • Size: 153.7 kB
  • Tags: CPython 3.9, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arbis_llmwrap-0.3.7-cp39-cp39-win32.whl
Algorithm Hash digest
SHA256 bd90ab6159e94833b7b3d7489c0a1e54287194b5830de65ef798d9eab60a1b9b
MD5 f122d18a895207736011b341c05e26d2
BLAKE2b-256 6551c471867860e2184c0320c37ff9a6317468e110590cd732b9689fc2b67773

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp39-cp39-win32.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ac80571e3a9a3889b0afa3d858b4fed579b667ebb8188e9bdc883b05765ada98
MD5 6a819ca5391df7e221222687be10526d
BLAKE2b-256 9532f211f07adb4e3a09a3e669cb69dd8bbd5f54e229f90658c4429cc15a402b

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp39-cp39-musllinux_1_2_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ac4e00208d90f938242311bbcd55a678dd580fdd346defbb90e1978845ddb66b
MD5 d568e9f361dd9129dcd26f274f12f913
BLAKE2b-256 27659d5f6d1e003f0e65085d9feef525ff5b0611abb785ed055c86debf7c95ba

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 e9d3b768ee96bcde5a679ce76e7861ceadb98c7fd99220e97363cc6c4ccc23c1
MD5 ad6947477c9b2a99379d3266cd3eaff7
BLAKE2b-256 c1553cbce5814c99abd76d767ff49e76f66dbdda03c903f2ee5b708e457f4ce6

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 85d004b011c225959c9f5cb5d76e329a2809991663253656b2fa5123f1b989cf
MD5 1f39f59c292c9a2396376f3ab2f391ba
BLAKE2b-256 dec74cb70aa54ffb339d9170101d4f5ca53ed5e61d475e2564efc9090d092820

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_universal2.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e52481be41c507a1a5d00e246af3049e6162139b7e52f0073e65b78875039ed9
MD5 2b16b82745f77124196e9889d1eda2c3
BLAKE2b-256 1ba0a5682fa0f6c08b3c619debd8307a0197747bf086ae022f1700f0778a3484

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 8ea9c7b4f05d5872e3136e5f6db01cbf570e0724586076dee605a4026ec390ab
MD5 2cf437a6b303f4589e32a9eb13a38fad
BLAKE2b-256 b51d9a0421ce9398579df23435c124d06f442b869d59ed755491a1c95a0ea620

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp38-cp38-win_amd64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp38-cp38-win32.whl.

File metadata

  • Download URL: arbis_llmwrap-0.3.7-cp38-cp38-win32.whl
  • Upload date:
  • Size: 180.3 kB
  • Tags: CPython 3.8, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for arbis_llmwrap-0.3.7-cp38-cp38-win32.whl
Algorithm Hash digest
SHA256 f2ee3734ea5a9059bea7cc6916f4f2dcee2ffc8deb82cd89a580d7bdfdf2f4d0
MD5 d192ef149ebced57f164481da0fbcdd4
BLAKE2b-256 cb5573f61e073fd60ab7a3edfc26ba84fd59afaf58dce0f46db83c6596a3d07b

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp38-cp38-win32.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 17b48e05cea6d6d71b776256668c49b2e5752d0693de23164cd53994998d2dc1
MD5 d1ac2332eb5b69748c772f9e351b05ee
BLAKE2b-256 6e9b2db29d0a081e7bc1aa1d10418432167ba3c6f464656cf737b32799c0adcd

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp38-cp38-musllinux_1_2_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8904c0f2ae1b5e8cfc568fd5282173584adab4955d8dbb0dae4fe850fe6917ce
MD5 0c1632352d13aa4395e23086f83d9246
BLAKE2b-256 d7cab71dc2f2311350dd9c3a78e4df8a09fb783fa59876215c45f2d99def1eb3

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 e7d6ebf400d8c5a1bca760064960059b3ab9073c4d38acf234f175294882777f
MD5 73e23835925908ee07a572b8c5ba61e7
BLAKE2b-256 00a2e724379456c0d71acbfb87948220e029e08378cbd24d427dc6261ba53698

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_x86_64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_universal2.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_universal2.whl
Algorithm Hash digest
SHA256 a629ab90b3b300483776b2f9242d27873998c47c586ccd5fd65c1783836308b7
MD5 2976c300f2fd22a18905e1bb4e50066e
BLAKE2b-256 6104221fe2f5972ad7f84b4338eeccd7e0352b5ebf94594743bca6cf4a7fcc51

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_universal2.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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

File details

Details for the file arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 18a12eb767fe9b765169764efbf172d5636f39e8459a7a818d2cc3b33ab21ed5
MD5 7fb8d45ac2bf1c5fc7ad864d1c4c2179
BLAKE2b-256 8d50ecd773ced59bea64c284fd32b93d55a68dfcd071cd82fc8b34920ea2fefc

See more details on using hashes here.

Provenance

The following attestation bundles were made for arbis_llmwrap-0.3.7-cp38-cp38-macosx_11_0_arm64.whl:

Publisher: build_wheels.yml on ArbisAI/Arbis-Decorator

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