langchain-azure-compute
LangChain integrations for Azure Container Apps compute that runs agent-authored code.
Installation
Install only the integration you need:
pip install "langchain-azure-compute[dynamic-sessions]"
pip install "langchain-azure-compute[sandboxes]"
pip install "langchain-azure-compute[durabletask]"
Extras control dependencies, not which modules are present — every module ships in the wheel. Each subpackage checks for its own requirements at import time and raises an error naming the extra to install.
Both Deep Agents backends are marked @beta: deepagents is pre-1.0 and ACA
sandboxes is an Early Access service, so these interfaces may change.
Which one do I want?
Dynamic sessions and sandboxes are different Azure products, not tiers of one. They use different ARM resource types and different data planes.
| Dynamic sessions | Sandboxes | |
|---|---|---|
| ARM resource | Microsoft.App/sessionPools |
Microsoft.App/sandboxGroups |
| Access | HTTP via a session pool endpoint | per-sandbox data plane SDK / aca CLI |
| State | ephemeral, destroyed after cooldown | stateful: suspend, resume, snapshots |
| Persistent storage | none | volumes (Azure Blob, Data Disk) |
| Networking | basic isolation | egress policies, VNet integration, port management |
| Best for | one-shot LLM-generated code execution | long-running agent workspaces, dev environments |
Choose dynamic sessions for a managed execution experience that abstracts away infrastructure. Choose sandboxes when you need programmable control over isolated compute that keeps state across tasks.
Dynamic sessions
Tools
SessionsPythonREPLTool and SessionsBashTool run LLM-authored code in an
ephemeral session and return its output.
from langchain_azure_compute.dynamic_sessions import SessionsPythonREPLTool
tool = SessionsPythonREPLTool(pool_management_endpoint="<pool-management-endpoint>")
print(tool.invoke("print(sum(range(10)))"))
By default a DefaultAzureCredential fetches a token for the
https://dynamicsessions.io scope; pass access_token_provider= to supply one
yourself. Requires the Azure ContainerApps Session Executor role on the
session pool.
Deep Agents backend
SessionsBashBackend implements the Deep Agents SandboxBackendProtocol
against a Shell-typed session pool. Its file operations are bash-native
rather than the python3 -c wrappers BaseSandbox uses, which a shell-only
pool image may not be able to run.
from deepagents import create_deep_agent
from langchain_azure_compute.dynamic_sessions.backends import (
SessionsBashBackend,
)
backend = SessionsBashBackend(pool_management_endpoint="<pool-management-endpoint>")
agent = create_deep_agent(model="...", backend=backend)
upload_files/download_files use the session's file API, which is a flat
store rooted at /mnt/data. Only /mnt/data/<name> is storable; any other
path is rejected with invalid_path rather than silently written elsewhere.
write() has no such limit — it goes through the shell and can create any
path.
The session data plane intermittently drops a command's final line of output
(measured at 1.6–4%). ls, read, glob and grep detect this and retry,
so they never report a short result as a complete one. execute() is not
covered: it runs your command verbatim, and wrapping it would change the
exit status it returns. If you parse the last line of execute() output,
terminate the command with a marker of your own and re-run when it is missing.
The data plane also caps each command's stdout and stderr at 4,096 bytes,
silently. read pages beneath the cap in base64 chunks, so any file within
max_output_bytes reads intact — larger windows just cost more round trips.
A listing, glob, or grep whose output exceeds the cap says so: ls advises
listing a subdirectory, glob/grep return what fits, flagged truncated.
execute() sets truncated=True on a stream arriving at the cap — a
heuristic, and the only signal there is, since the service reports none.
Three behavioral notes:
write()refuses to overwrite an existing file, matching the sharedlangchain-testssandbox suite; the error tells the model to useeditor delete first.write()content andedit()strings ride inside a single shell command, which Linux caps at 128 KiB per string; payloads above ~90 KB are refused with an error saying so.edit()budgetsold_stringandnew_stringtogether, because both travel in that one command. Larger transfers belong inupload_files, within its/mnt/datalimit.glob()follows the protocol's Python-glob semantics for the common shapes (*.pystays in one directory level,**/namerecurses); patterns mixing several**segments take a documentedfind -pathapproximation. As in Python, a wildcard does not match a leading dot — pass a pattern that names the hidden entry (.env,.github/**) to reach one. Naming a hidden directory opens that directory only, not hidden entries beneath it.
Sandboxes: Deep Agents backend
ACASandbox implements the Deep Agents SandboxBackendProtocol on top of an
Azure Container Apps sandbox. It wraps a client you construct, so it never
builds endpoints or handles credentials itself, and you keep control of the
sandbox lifecycle through that same client.
from azure.containerapps.sandbox import SandboxClient, endpoint_for_region
from azure.identity import DefaultAzureCredential
from deepagents import create_deep_agent
from langchain_azure_compute.sandboxes import ACASandbox
client = SandboxClient(
endpoint_for_region("westus2"),
DefaultAzureCredential(),
subscription_id="<subscription-id>",
resource_group="<resource-group>",
sandbox_group="<sandbox-group>",
sandbox_id="<sandbox-id>",
)
client.ensure_running()
agent = create_deep_agent(model="...", backend=ACASandbox(client))
Requires the Container Apps SandboxGroup Data Owner role on the sandbox
group.
Two options are worth knowing about:
async_client=— passazure.containerapps.sandbox.aio.SandboxClientfor the same sandbox to run async operations on the SDK's async transport. Without it, they run the sync client in a worker thread. Either wayaread,awrite,aupload_filesandadownload_filestake the same SDK path as their sync counterparts rather than the base class's shell implementation -- except that a read above the ~10 MiB routing cap deliberately falls back to the base class's server-side path, asread/areadboth do. Callaclose()when done to release the async client's connection pool.enable_capture_offload=True— offloads large command output at the source. Needs a POSIX shell and coreutils in the disk image: fine for theubuntu,debian, andpythonpresets, not guaranteed foralpineor BYO OCI images, so it is off by default.
SandboxClient.exec() has no server-side command timeout, so execute(..., timeout=N) is honored by wrapping the command in coreutils timeout. On an
image without it, the command still runs — untimed.
The HTTP request itself is bounded by the client transport's read timeout
(about 300 seconds on the SDK default), and a command that outruns it fails
the request first: execute then returns an error ExecuteResponse rather
than raising, and the command may keep running server-side. To use timeouts
above ~300 seconds, construct the SandboxClient with a transport whose read
timeout exceeds them.
Durable LangGraph execution (Durable Task Scheduler)
langchain_azure_compute.graph runs compiled LangGraph graphs (StateGraph.compile()),
LangChain agents (create_agent / create_react_agent), and Deep Agents
(create_deep_agent) on the
Azure Durable Task Scheduler (DTS)
or the local DTS emulator.
from typing import Annotated, TypedDict
from durabletask.azuremanaged.client import DurableTaskSchedulerClient
from durabletask.azuremanaged.worker import DurableTaskSchedulerWorker
from langchain_core.messages import AIMessage, AnyMessage, HumanMessage
from langchain_core.tools import tool
from langgraph.graph import END, START, StateGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode
from langgraph.types import interrupt
from langchain_azure_compute.graph import attach_durability, durable_tool, sdk_options
class SupportState(TypedDict):
messages: Annotated[list[AnyMessage], add_messages]
approved: bool
@durable_tool(retries=3)
@tool
def refund_order(order_id: str) -> str:
"""Runs as an isolated Durable Task activity with its own retry policy."""
return f"Refunded order {order_id}"
def manager_gate(state: SupportState) -> dict:
decision = interrupt({"question": "Approve refund?", "order_id": "ord-42"})
return {
"approved": bool(decision.get("approved")),
"messages": [
AIMessage(
content="",
tool_calls=[
{
"id": "call_1",
"name": "refund_order",
"args": {"order_id": "ord-42"},
}
],
)
],
}
builder = StateGraph(SupportState)
builder.add_node("approve", manager_gate)
builder.add_node("tools", ToolNode([refund_order]))
builder.add_edge(START, "approve")
builder.add_conditional_edges(
"approve",
lambda s: "tools" if s.get("approved") else END,
{"tools": "tools", END: END},
)
builder.add_edge("tools", END)
graph = builder.compile()
reg = attach_durability(graph, name="support")
# Connect to the local DTS emulator ("127.0.0.1:8080") or an Azure DTS endpoint
# ("https://<scheduler>.<region>.durabletask.io") with DefaultAzureCredential:
opts = sdk_options("127.0.0.1:8080")
worker = DurableTaskSchedulerWorker(**opts)
sdk = DurableTaskSchedulerClient(**opts)
reg.register(worker)
worker.start()
try:
client = reg.client(sdk)
run = client.start(
{"messages": [HumanMessage(content="Refund order 42")], "approved": False},
instance_id="refund-42",
)
pending = run.wait_pending(timeout=30)
run.resume(pending, {"approved": True})
result = run.wait_result(timeout=60)
finally:
worker.stop()
sdk.close()
Key capabilities include:
-
Control plane vs. state plane separation: With a persistent checkpointer (
SqliteSaver,PostgresSaver, orCosmosDBSaver), step transitions pass< 1 KBcheckpoint IDs instead of full checkpoint bundles. Durable tool/node inputs and outputs, plus final output returned through DTS, still travel in DTS payloads. Zero-configInMemorySavercheckpoints also travel as inline bundles. Long-running conversations roll over viacontinue_as_new. -
Per-tool and per-node activity isolation:
@durable_toolcalls inside aToolNodeand@durable_nodebranches (including dynamicSend()map-reduce fan-out) execute as parallel DTS activities with independent retry policies. -
Human-in-the-loop (
interrupt()/resume()): Maps LangGraphinterrupt()and static breakpoints to DTS external events without holding worker threads. -
Azure Functions hosting (
LangGraphFunctionApp): Exposes/api/graphs/<name>/start,/status/{instanceId}, and/respond/{instanceId}/{interruptId}routes on Azure Functions Python v2.Function apps require verified per-instance identity through Azure EasyAuth or an
identity_providertoken-validation callback. A Function key alone does not identify a user. This also applies toAuthLevel.ANONYMOUSbehind EasyAuth: gateway authentication does not disable instance ownership checks. ANONYMOUS with no identity source requires explicitrequire_instance_owner=False; omission raisesValueError. False explicitly selects shared, platform-key-authorized access without user isolation. See the Functions sample identity contract for deployment requirements and the opt-in loopback demo.
Supported Functions and Worker Topologies
- Topology A (recommended): Azure Functions, ACA, or App Service serves thin
HTTP control routes with
start_worker=False(the default on every helper). DedicatedDurableTaskSchedulerWorkerreplicas run on ACA or AKS, scaled by theazure-durabletask-schedulerKEDA scaler, or on a Dedicated App Service plan with Always On. The HTTP host and all workers must use the same scheduler and hub. - Topology B (local development / Dedicated Always-On only):
explicitly set
start_worker=Truefor single-processfunc start, local Python testing, or a Dedicated plan with Always On enabled.
An embedded worker is not supported on Consumption or Flex. It is not an
Azure Functions trigger: the scale controller cannot see DTS activities, may kill
the host mid-activity on scale-in, and can scale to zero after /respond returns,
leaving queued work stalled. A successful HTTP response means the event was queued,
not that a graph worker is alive.
By default /respond is owner-only. Supply
respond_authorizer(caller, instance_id, owner[, graph_name]) (legacy
two-argument callbacks are also supported) to require an independently
authenticated approver, for example a configured manager principal distinct from
the starter. Authorized approvers can read /status before responding. Ownership
and graph-scope lookups consult DTS and fail closed; an instance from another
graph cannot be controlled through these routes. The server overwrites dict resume
fields responder and reviewer with the verified caller. For a batch
{"value": {"interrupt-id": {...}}}, it stamps each dict payload, never the outer
interrupt-ID map. The expense sample uses this identity, not a body-supplied reviewer.
Authenticated default thread IDs are owner-namespaced. Checkpoints record
durable_owner alongside durable_instance_id; sync/async starts and worker
steps reject checkpoints belonging to another principal even after DTS purge.
Explicit thread_id remains supported by the Python API, not by HTTP /start.
HTTP bodies are limited to 1,000,000 bytes, instance IDs to
[A-Za-z0-9_.:@-]{1,128}, and internal resume envelope keys are rejected.
Ordinary user fields such as {"approved": true, "version": 2} remain valid
interrupt response data.
Execution Guarantees, Streaming, Tracing & Data Retention
- At-least-once activities: Durable tools and nodes may execute more than
once, including after a worker crashes between an external mutation and its
completion acknowledgement. Completed history avoids ordinary replay of
completed siblings, but does not provide exactly-once external effects.
Tools receive a deterministic
runtime.config["metadata"]["durable_call_id"]for use as an external idempotency key. Persist deduplication at the mutation boundary (provider API or a database unique constraint), not just in RAM. - Streaming and tracing:
stream_writerinside a durable tool activity is a no-op. This adapter does not expose a continuous token stream over DTS. LangSmith traces are scoped to individual supersteps/activities rather than one uninterrupted graph invocation. - DTS retention: Tool/node activity inputs and outputs are recorded in DTS
history. Zero-config
InMemorySavercheckpoints and final graph state also travel in DTS payloads. Interrupt payloads whose serialized custom-status representation fits the 16 KB limit may be inlined; larger values use checkpoint references. Review sensitive data, DTS retention and purge policies, and checkpoint-store retention independently. - Deployed Azure auth: Prefer
Authentication=ManagedIdentity, withClientID=<user-assigned-client-id>when using a user-assigned identity. Grant that identity the Durable Task Data Contributor RBAC role on the intended scheduler/task hub. DeveloperAzureClicredentials are not a production authentication strategy.
Connecting to Hosted Azure DTS (Entra ID / Managed Identity) vs. Local Emulator
sdk_options() supports both the local DTS emulator and hosted Azure Durable Task
Scheduler resources:
import os
from azure.identity import DefaultAzureCredential
from durabletask.azuremanaged.client import DurableTaskSchedulerClient
from durabletask.azuremanaged.worker import DurableTaskSchedulerWorker
from langchain_azure_compute.graph import sdk_options
# 1. Local DTS Emulator (secure_channel=False, token_credential=None, taskhub="default")
emulator_opts = sdk_options("127.0.0.1:8080")
# 2. Hosted Azure DTS with Entra ID / Managed Identity (secure_channel=True auto-enabled)
hosted_opts = sdk_options(
"https://<scheduler>.<region>.durabletask.io",
taskhub="my-taskhub",
token_credential=DefaultAzureCredential(),
)
# 3. Hosted Azure DTS via Connection String (Endpoint=...;TaskHub=...;Authentication=DefaultAzure)
conn_str_opts = sdk_options(
connection_string=os.environ["DURABLE_TASK_SCHEDULER_CONNECTION_STRING"],
token_credential=DefaultAzureCredential(),
)
worker = DurableTaskSchedulerWorker(**hosted_opts)
sdk = DurableTaskSchedulerClient(**hosted_opts)
Two-Tier State Model
| Mode | How to Enable | How State Moves | Best For |
|---|---|---|---|
| Tier 1: Shared Checkpointer (Checkpoint IDs) | builder.compile(checkpointer=SqliteSaver(...)) (compatible with SqliteSaver, AsyncSqliteSaver, or any BaseCheckpointSaver) |
inline_checkpoints=False (default). Step transitions pass < 1 KB checkpoint IDs instead of full checkpoint bundles stored in your external database. Durable tool/node inputs and outputs, plus final output returned through DTS, still travel in DTS payloads. |
Multi-turn conversations across stateless API pods, large state payloads, long-lived threads. |
| Tier 2: Zero-Config (Inline Checkpoint Bundle) | builder.compile() (no checkpointer or InMemorySaver()) |
inline_checkpoints=True (default). After each step, the latest checkpoint slice (up to the 900 KB bundle guard) is exported into checkpoint_bundle and hydrated into the next worker's InMemorySaver. |
Single-turn runs or getting started immediately with zero database setup while still surviving worker crashes and multi-worker routing. |
Final inline results carry the checkpoint bundle once, without a duplicate state
blob; wait_result() reads the projected output from the hydrated checkpoint.
Every complete activity input/result, orchestration input/output, and
continue_as_new input must fit the 950,000-byte serialized payload guard. The
900 KB bundle guard is a separate limit on the encoded bundle, not raw graph state.
Oversized payloads fail without activity retries. Use a persistent checkpointer
for large inline checkpoint bundles. For large durable tool/node inputs or return
values, reduce their size or store blobs externally and pass references.
sdk_options(payload_store=...) does not bypass the integration's wire-size guard.
Caller-supplied checkpointer serializers are preserved, including custom or
encrypted InMemorySaver serializers. For custom state types used in activity
payloads, register explicitly trusted types with
attach_durability(..., allowed_msgpack_modules=[("myapp.models", "MyState")]).
This allowlist is process-wide; configure it on both clients and workers.
allowed_msgpack_modules=True permits arbitrary types and should only be used
with trusted payloads.
Async checkpointers retain their caller-owned event loop and lock.
Limits(async_timeout_seconds=300.0) controls bridged async operation timeouts;
use None to disable the timeout. Async clients read state directly on their
current event loop.
Concurrent starts from the same checkpoint are fenced by the recorded run ID and
input signature. A different run or input raises RunError instead of silently
replaying another turn. Default run IDs are deterministic for the graph name,
thread, base checkpoint, and input; sequential turns with new checkpoints get
distinct IDs. Wait for an active turn to finish before submitting another turn.
Pending interrupt status is explicitly cleared after a response and on completion;
terminal runs never return pending receipts. Owner identity stays in the durable
orchestration input, not public custom status or output.
sdk_options() resolves task hubs from explicit arguments, connection strings,
DTS_TASKHUB, then TASKHUB_NAME. Credentials cannot be sent to a non-loopback
host with secure_channel=False. max_message_bytes is optional and does not
change the SDK's gRPC defaults unless supplied.
Configuring Tool Durability, Retries, and Concurrency
By default (durable_tools=True), every tool inside a ToolNode executes as an
isolated langgraph.<name>.tool activity. You can customize retries or opt out
pure in-memory helpers either via @durable_tool or centrally on attach_durability():
Durable tool dispatch follows the actual scheduled LangGraph tasks, including
Send() routing: HITL-rejected or human-responded calls are not executed.
Invalid tool arguments handled by ToolNode produce an error ToolMessage
immediately, allowing the model to self-correct without activity retries.
Other tool errors retain retries; when exhausted, custom error policies are
evaluated against the original exception type before crossing the DTS boundary.
from langchain_core.tools import tool
from langgraph.prebuilt import ToolNode
from langchain_azure_compute.graph import attach_durability, durable_tool
@durable_tool(retries=4)
@tool
def book_flight(destination: str) -> str:
"""Runs as an isolated DTS activity with up to 4 attempts."""
return f"FLIGHT-{destination}"
@durable_tool(durable=False)
@tool
def format_itinerary(summary: str) -> str:
"""Pure in-memory helper: runs locally inside the tool-commit step."""
return summary.upper()
reg = attach_durability(
graph,
name="travel_agent",
tool_policy={"tools::book_flight": "durable", "tools::format_itinerary": "local"},
tool_retries={"book_flight": 4},
tool_max_concurrency=2, # None = parallel batch (default), 1 = sequential, N = batches of N
)
Durable Nodes (@durable_node) for Parallel Fan-Out & Send() Map-Reduce
When a graph fans out across parallel branches (START -> [branch_a, branch_b] -> join)
or uses Send("worker", item) map-reduce, decorate the branch/target node with
@durable_node(retries=3) (or pass durable_nodes=True / node_policy=... to
attach_durability()). Each parallel branch or Send() packet executes concurrently
as its own langgraph.<name>.node activity across workers with per-branch retry
isolation.
Graph Versioning & Live Migration
When deploying an updated graph topology ("v2") while "v1" runs are in flight:
reg = attach_durability(
graph_v2,
name="order_workflow",
version="v2",
previous_versions={"v1": graph_v1},
migrations={
("v1", "v2"): lambda state, snap, resume_val: {
"as_node": "new_approval_gate",
"values": {"approved_by": resume_val},
}
},
upgrade_on_continue_as_new=True,
)
Runnable Samples
Ten end-to-end runnable samples (each with its own README.md, requirements.txt,
and sample.py) are available in samples/langgraph-durabletask/:
| # | Sample | What It Demonstrates |
|---|---|---|
| 01 | 01_hello_graph |
Minimal linear & conditional graph (Zero-Config builder.compile()) |
| 02 | 02_vacation_booking |
Per-tool retry isolation inside a ToolNode (book_car retries without re-running book_flight or book_hotel) & idempotent client.start(..., instance_id=...) |
| 03 | 03_human_in_the_loop |
Sequential and parallel interrupt(), pending_interrupts(), and run.resume() |
| 04 | 04_react_agent_and_subgraphs |
Prebuilt ReAct agents (create_agent / create_react_agent) and compiled subgraphs as nodes |
| 05 | 05_multi_turn_conversation |
Multi-turn conversation with SqliteSaver, SqliteStore, and Runtime[Context] propagation |
| 06 | 06_durable_nodes_map_reduce |
Static parallel fan-out and dynamic Send() map-reduce with @durable_node and node_max_concurrency |
| 07 | 07_multi_graph_app |
Multiple durable graphs (triage, vacation, refund) sharing one worker and delegating across graphs |
| 08 | 08_graph_versioning_and_migration |
Graph versioning and live checkpoint migration (version="v2", previous_versions, migrations, run.upgrade()) |
| 09 | 09_two_process_crash_recovery |
Two OS worker processes (pod-A hard-killed mid-run, pod-B recovers via Zero-Config checkpoint_bundle) |
| 10 | 10_azure_functions_hitl |
Azure Functions Python v2 HTTP routes (LangGraphFunctionApp /start, /status/{id}, /respond/{id}/{interruptId}) across two worker processes |
Development
See CONTRIBUTING.md in the repository root.
make test # unit tests
make lint # ruff + mypy
make check_imports # import smoke check
Running the integration tests
These run against live Azure resources. Each suite skips itself when its
variables are unset, so make integration_tests is safe to run with nothing
configured — that is what release CI does.
cp .env.example .env # then fill in the resources you have
az login
make integration_tests
.env is gitignored and loaded automatically. Authentication is
DefaultAzureCredential, so az login is enough; no credential belongs in the
repository.
| Variable | Suite | Role |
|---|---|---|
AZURE_DYNAMIC_SESSIONS_POOL_MANAGEMENT_ENDPOINT |
the tools, against a Python-typed pool | Azure ContainerApps Session Executor on the pool |
AZURE_DYNAMIC_SESSIONS_SHELL_POOL_MANAGEMENT_ENDPOINT |
SessionsBashBackend, against a Shell-typed pool |
Azure ContainerApps Session Executor on the pool |
AZURE_SUBSCRIPTION_ID, AZURE_CONTAINER_APPS_RESOURCE_GROUP, AZURE_CONTAINER_APPS_SANDBOX_GROUP, AZURE_CONTAINER_APPS_REGION |
ACASandbox, all four required together |
Container Apps SandboxGroup Data Owner on the sandbox group |
The sandbox suite provisions and deletes a real sandbox per test class, so it
carries an aca_sandbox marker:
uv run --frozen --all-extras --group test --group test_integration \
pytest tests/integration_tests -m "not aca_sandbox"
Changelog
-
0.2.0:
- [NEW] We introduced the
langchain-azure-computepackage for running LangChain, LangGraph, and Deep Agents workloads on Azure compute services. #907 - [NEW] We added the Azure Container Apps dynamic sessions tools under
langchain_azure_compute.dynamic_sessions. #908 - [NEW] We added a Deep Agents backend that runs code and file operations inside Azure Container Apps dynamic sessions. #909
- [NEW] We added
ACASandbox, a Deep Agents sandbox backend for Azure Container Apps. #910 - [NEW] We added durable execution for LangGraph graphs and LangChain agents with Azure Durable Task Scheduler under
langchain_azure_compute.graph, available through thedurabletaskextra. It supports durable tools and nodes, human-in-the-loop interrupts, graph versioning and migration, and Azure Functions hosting. #1270
- [NEW] We introduced the
-
0.1.1:
- We raised the minimum supported Python version from 3.10 to 3.11 in accordance with the repository's Python support policy. Users running Python 3.10 must upgrade their runtime to install this release. #1021
Metadata
Release files for langchain-azure-compute 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| langchain_azure_compute-0.2.0.tar.gz | 142.6 kB | Without provenance | Details for langchain_azure_compute-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| langchain_azure_compute-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for langchain_azure_compute-0.2.0-py3-none-any.whl |
Total release size: 283.9 kB
Release files / langchain_azure_compute-0.2.0.tar.gz
| Download URL | langchain_azure_compute-0.2.0.tar.gz |
|---|---|
| Size | 142.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4b66c35071045335d02e6283461ab89a09c18497e31c85924afd1de8a475f0fd
|
|
BLAKE2b-256 checksum How to use checksums |
dfe3c757428eebdda350468df734bcd0a75708133015e07dfdbf45525bc98e77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / langchain_azure_compute-0.2.0-py3-none-any.whl
| Download URL | langchain_azure_compute-0.2.0-py3-none-any.whl |
|---|---|
| Size | 141.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5a4d0317d2dbd17306ceded39b03a66fd07c1c5c958ebb6e10723207d7a7e355
|
|
BLAKE2b-256 checksum How to use checksums |
3753e9f3f7735a4284b593a9fff7559ddda4b0f2dfce5ab764caf8681278af22
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Security for langchain-azure-compute 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.