langchain-oneshot
LangChain tools for OneShot: 48 tools as LangChain BaseTool subclasses. Your agent sends email, makes calls, researches, enriches, and buys; each paid call is paid automatically in USDC on Base (x402).
Installation
pip install langchain-oneshot
Quick Start
from langchain_oneshot import OneShotToolkit
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent
toolkit = OneShotToolkit.from_private_key(
private_key="0x...",
)
# Use all 48 tools with a LangGraph agent
tools = toolkit.get_tools()
llm = ChatOpenAI(model="gpt-4o")
agent = create_react_agent(llm, tools)
result = agent.invoke({
"messages": [("user", "Research the latest AI agent frameworks")]
})
Access-token sessions
Hosted agents pay from prepaid credits and never hold a wallet key:
import os
from langchain_oneshot import OneShotToolkit
toolkit = OneShotToolkit.from_access_token(os.environ["ONESHOT_ACCESS_TOKEN"])
# Inside an async application:
# toolkit = await OneShotToolkit.afrom_access_token(os.environ["ONESHOT_ACCESS_TOKEN"])
tools = toolkit.get_tools()
Mint the token and set budgets from a wallet session. Token calls spend the agent's
credits within its stored caps and cannot change budgets or manage tokens.
An insufficient balance raises InsufficientCreditsError. Fund credits from a wallet
with OneShotClient.top_up_credits(amount) and retry. See the
hosted setup guide.
Individual Tools
from langchain_oneshot import OneShotClient, ResearchTool
client = OneShotClient(private_key="0x...")
research = ResearchTool(client=client)
result = research.invoke({"topic": "AI agent frameworks 2026"})
Available Tools
| Tool | Description |
|---|---|
oneshot_email |
Send emails |
oneshot_voice |
Make phone calls |
oneshot_sms |
Send SMS messages |
oneshot_research |
Deep web research |
oneshot_web_search |
Search the web |
oneshot_web_read |
Read a web page as markdown |
oneshot_people_search |
Search for people |
oneshot_enrich_profile |
Enrich a profile |
oneshot_find_email |
Find email address |
oneshot_verify_email |
Verify email |
oneshot_deep_research_person |
Full dossier on a person |
oneshot_social_profiles |
Find all social accounts |
oneshot_article_search |
Find articles about a person |
oneshot_person_newsfeed |
Recent social posts |
oneshot_person_interests |
Analyze interests |
oneshot_person_interactions |
Map followers/following |
oneshot_commerce_search |
Search products |
oneshot_commerce_buy |
Purchase product |
oneshot_build |
Build a website |
oneshot_update_build |
Update a website |
oneshot_browser |
Browser automation task |
oneshot_browser_create_profile |
Create a browser profile |
oneshot_browser_list_profiles |
List browser profiles |
oneshot_browser_delete_profile |
Delete a browser profile |
oneshot_inbox_list |
List inbox emails |
oneshot_inbox_get |
Get email by ID |
oneshot_sms_inbox_list |
List SMS inbox |
oneshot_sms_inbox_get |
Get SMS by ID |
oneshot_notifications |
List notifications |
oneshot_mark_notification_read |
Mark read |
oneshot_get_balance |
USDC balance |
oneshot_budget_status |
Today's spend vs the configured budget (read-only) |
oneshot_linkedin_connect |
Hosted login link for a human to connect their LinkedIn account (free) |
oneshot_linkedin_accounts |
Connected LinkedIn accounts / pending connection status (free) |
oneshot_linkedin_sync |
One bounded, resumable LinkedIn history-sync run (paid) |
oneshot_linkedin_conversations |
Synced LinkedIn conversations with coverage state (free) |
oneshot_linkedin_messages |
Synced LinkedIn messages, filterable by direction / since (free) |
oneshot_linkedin_reply |
Send a reply through the connected account (paid, idempotent) |
oneshot_linkedin_message |
Message a first-degree connection, in the existing 1:1 conversation or a new one (paid, idempotent) |
oneshot_linkedin_invitation |
Status of one sent invitation: pending, accepted, withdrawn (free) |
oneshot_linkedin_invitations |
Sent invitations by status / changed since (free) |
oneshot_linkedin_view_profile |
View a profile through the connected account (paid) |
oneshot_linkedin_react |
React to a post through the connected account (paid) |
oneshot_list_domains |
Sending domains + reputation/rotation state |
oneshot_pause_domain |
Take a domain out of rotation |
oneshot_resume_domain |
Put a paused domain back into rotation |
Paid tools are priced in USDC via x402. Current rates are on the Pricing page.
How Payments Work
Payment signing happens locally; your private key never leaves your machine. Paid tools use the x402 protocol. When a tool requires payment:
- The client POSTs to the tool endpoint
- The API returns
402 Payment Requiredwith a quote - The client signs a USDC
TransferWithAuthorization(EIP-3009) using your private key - The client re-POSTs with the signed payment header
- The API processes the request and returns the result
Read tools (inbox, SMS inbox, notifications, balance, browser profiles) also send a signed EIP-712 read proof (x-agent-proof) so the API can verify you control the X-Agent-ID wallet before returning private data. The underlying oneshot-python client handles this with no extra code. It requires oneshot-python >= 0.18.0, which is already the dependency floor.
Configuration
toolkit = OneShotToolkit.from_private_key("0x...")
# Custom API URL
toolkit = OneShotToolkit.from_private_key("0x...", base_url="https://custom-api.example.com")
The SDK runs on Base Mainnet with real USDC. Fund your wallet before making paid tool calls.
Spend budget
toolkit = OneShotToolkit.from_private_key(
"0x...",
budgets={"daily": 50, "per_transaction": 5, "alert_at": 0.8},
alert_email="you@example.com",
)
The server enforces the budget on every paid call (403 budget_exceeded → oneshot.BudgetExceededError). The agent can read its utilization with oneshot_budget_status but cannot change the cap. Requires oneshot-python >= 0.20.0.
LinkedIn connection recovery
If the active account list is empty or an account is deleted_upstream or
revoked, ask the human to use oneshot_linkedin_connect and authorize fresh
grants. An existing account with reconnect_required must be reconnected through
the owning application. Reconnect and revoke are deliberately not agent tools.
Do not create a new connection automatically after authentication failures or
timeouts.
Requirements
- Python 3.10+
langchain-core >= 0.3.0oneshot-python >= 0.18.0pydantic >= 2.0
Links
- Documentation
- oneshot-python on PyPI: core HTTP client (dependency)
- TypeScript SDK
- MCP Server
- GitHub
License
MIT
Metadata
Release files for langchain-oneshot 0.17.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 | |
|---|---|---|---|
| langchain_oneshot-0.17.0.tar.gz | 135.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| langchain_oneshot-0.17.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 164.0 kB
Release files / langchain_oneshot-0.17.0.tar.gz
| Download URL | langchain_oneshot-0.17.0.tar.gz |
|---|---|
| Size | 135.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ef69faaf8e47e3ecba063dfc729ad9bc75260f87f330a31b29dbd29af0f9c3f9
|
|
BLAKE2b-256 checksum How to use checksums |
3d52b6828d2d34d13deceee2388d4292dfde6a1dca70c7cc301c81e2031ceb99
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / langchain_oneshot-0.17.0-py3-none-any.whl
| Download URL | langchain_oneshot-0.17.0-py3-none-any.whl |
|---|---|
| Size | 28.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8acd8e1a82b9c2407dc8d837a801f86702bbd7d944f99f4e5c2874f20ff42ea4
|
|
BLAKE2b-256 checksum How to use checksums |
46f7261913c060b8f66806d3ed1fb188620beec64de75ca9af82788cb244678f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|