Skip to content
125 changes: 125 additions & 0 deletions libs/community/langchain_community/tools/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,81 @@
from langchain_community.tools.financial_datasets.income_statements import (
IncomeStatements,
)
from langchain_community.tools.insumer.acp_discount import (
InsumerAcpDiscount,
)
from langchain_community.tools.insumer.attest import (
InsumerAttest,
)
from langchain_community.tools.insumer.batch_wallet_trust import (
InsumerBatchWalletTrust,
)
from langchain_community.tools.insumer.buy_credits import (
InsumerBuyCredits,
)
from langchain_community.tools.insumer.buy_merchant_credits import (
InsumerBuyMerchantCredits,
)
from langchain_community.tools.insumer.check_discount import (
InsumerCheckDiscount,
)
from langchain_community.tools.insumer.compliance_templates import (
InsumerComplianceTemplates,
)
from langchain_community.tools.insumer.configure_nfts import (
InsumerConfigureNfts,
)
from langchain_community.tools.insumer.configure_settings import (
InsumerConfigureSettings,
)
from langchain_community.tools.insumer.configure_tokens import (
InsumerConfigureTokens,
)
from langchain_community.tools.insumer.confirm_payment import (
InsumerConfirmPayment,
)
from langchain_community.tools.insumer.create_merchant import (
InsumerCreateMerchant,
)
from langchain_community.tools.insumer.credits import (
InsumerCredits,
)
from langchain_community.tools.insumer.get_merchant import (
InsumerGetMerchant,
)
from langchain_community.tools.insumer.jwks import (
InsumerJwks,
)
from langchain_community.tools.insumer.list_merchants import (
InsumerListMerchants,
)
from langchain_community.tools.insumer.list_tokens import (
InsumerListTokens,
)
from langchain_community.tools.insumer.merchant_status import (
InsumerMerchantStatus,
)
from langchain_community.tools.insumer.publish_directory import (
InsumerPublishDirectory,
)
from langchain_community.tools.insumer.request_domain_verification import (
InsumerRequestDomainVerification,
)
from langchain_community.tools.insumer.ucp_discount import (
InsumerUcpDiscount,
)
from langchain_community.tools.insumer.validate_code import (
InsumerValidateCode,
)
from langchain_community.tools.insumer.verify import (
InsumerVerify,
)
from langchain_community.tools.insumer.verify_domain import (
InsumerVerifyDomain,
)
from langchain_community.tools.insumer.wallet_trust import (
InsumerWalletTrust,
)
from langchain_community.tools.gmail import (
GmailCreateDraft,
GmailGetMessage,
Expand Down Expand Up @@ -411,6 +486,31 @@
"HumanInputRun",
"IFTTTWebhook",
"IncomeStatements",
"InsumerAcpDiscount",
"InsumerAttest",
"InsumerBatchWalletTrust",
"InsumerBuyCredits",
"InsumerBuyMerchantCredits",
"InsumerCheckDiscount",
"InsumerComplianceTemplates",
"InsumerConfigureNfts",
"InsumerConfigureSettings",
"InsumerConfigureTokens",
"InsumerConfirmPayment",
"InsumerCreateMerchant",
"InsumerCredits",
"InsumerGetMerchant",
"InsumerJwks",
"InsumerListMerchants",
"InsumerListTokens",
"InsumerMerchantStatus",
"InsumerPublishDirectory",
"InsumerRequestDomainVerification",
"InsumerUcpDiscount",
"InsumerValidateCode",
"InsumerVerify",
"InsumerVerifyDomain",
"InsumerWalletTrust",
"InfoPowerBITool",
"InfoSQLDatabaseTool",
"InfoSparkSQLTool",
Expand Down Expand Up @@ -562,6 +662,31 @@
"HumanInputRun": "langchain_community.tools.human.tool",
"IFTTTWebhook": "langchain_community.tools.ifttt",
"IncomeStatements": "langchain_community.tools.financial_datasets.income_statements", # noqa: E501
"InsumerAcpDiscount": "langchain_community.tools.insumer.acp_discount",
"InsumerAttest": "langchain_community.tools.insumer.attest",
"InsumerBatchWalletTrust": "langchain_community.tools.insumer.batch_wallet_trust",
"InsumerBuyCredits": "langchain_community.tools.insumer.buy_credits",
"InsumerBuyMerchantCredits": "langchain_community.tools.insumer.buy_merchant_credits", # noqa: E501
"InsumerCheckDiscount": "langchain_community.tools.insumer.check_discount",
"InsumerComplianceTemplates": "langchain_community.tools.insumer.compliance_templates", # noqa: E501
"InsumerConfigureNfts": "langchain_community.tools.insumer.configure_nfts",
"InsumerConfigureSettings": "langchain_community.tools.insumer.configure_settings",
"InsumerConfigureTokens": "langchain_community.tools.insumer.configure_tokens",
"InsumerConfirmPayment": "langchain_community.tools.insumer.confirm_payment",
"InsumerCreateMerchant": "langchain_community.tools.insumer.create_merchant",
"InsumerCredits": "langchain_community.tools.insumer.credits",
"InsumerGetMerchant": "langchain_community.tools.insumer.get_merchant",
"InsumerJwks": "langchain_community.tools.insumer.jwks",
"InsumerListMerchants": "langchain_community.tools.insumer.list_merchants",
"InsumerListTokens": "langchain_community.tools.insumer.list_tokens",
"InsumerMerchantStatus": "langchain_community.tools.insumer.merchant_status",
"InsumerPublishDirectory": "langchain_community.tools.insumer.publish_directory",
"InsumerRequestDomainVerification": "langchain_community.tools.insumer.request_domain_verification", # noqa: E501
"InsumerUcpDiscount": "langchain_community.tools.insumer.ucp_discount",
"InsumerValidateCode": "langchain_community.tools.insumer.validate_code",
"InsumerVerify": "langchain_community.tools.insumer.verify",
"InsumerVerifyDomain": "langchain_community.tools.insumer.verify_domain",
"InsumerWalletTrust": "langchain_community.tools.insumer.wallet_trust",
"InfoPowerBITool": "langchain_community.tools.powerbi.tool",
"InfoSQLDatabaseTool": "langchain_community.tools.sql_database.tool",
"InfoSparkSQLTool": "langchain_community.tools.spark_sql.tool",
Expand Down
65 changes: 65 additions & 0 deletions libs/community/langchain_community/tools/insumer/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"""Insumer Model tools for on-chain verification and token-gated commerce."""

from langchain_community.tools.insumer.acp_discount import InsumerAcpDiscount
from langchain_community.tools.insumer.attest import InsumerAttest
from langchain_community.tools.insumer.batch_wallet_trust import (
InsumerBatchWalletTrust,
)
from langchain_community.tools.insumer.buy_credits import InsumerBuyCredits
from langchain_community.tools.insumer.buy_merchant_credits import (
InsumerBuyMerchantCredits,
)
from langchain_community.tools.insumer.compliance_templates import (
InsumerComplianceTemplates,
)
from langchain_community.tools.insumer.check_discount import InsumerCheckDiscount
from langchain_community.tools.insumer.configure_nfts import InsumerConfigureNfts
from langchain_community.tools.insumer.configure_settings import (
InsumerConfigureSettings,
)
from langchain_community.tools.insumer.configure_tokens import InsumerConfigureTokens
from langchain_community.tools.insumer.confirm_payment import InsumerConfirmPayment
from langchain_community.tools.insumer.create_merchant import InsumerCreateMerchant
from langchain_community.tools.insumer.credits import InsumerCredits
from langchain_community.tools.insumer.get_merchant import InsumerGetMerchant
from langchain_community.tools.insumer.jwks import InsumerJwks
from langchain_community.tools.insumer.list_merchants import InsumerListMerchants
from langchain_community.tools.insumer.list_tokens import InsumerListTokens
from langchain_community.tools.insumer.merchant_status import InsumerMerchantStatus
from langchain_community.tools.insumer.publish_directory import InsumerPublishDirectory
from langchain_community.tools.insumer.request_domain_verification import (
InsumerRequestDomainVerification,
)
from langchain_community.tools.insumer.ucp_discount import InsumerUcpDiscount
from langchain_community.tools.insumer.validate_code import InsumerValidateCode
from langchain_community.tools.insumer.verify import InsumerVerify
from langchain_community.tools.insumer.verify_domain import InsumerVerifyDomain
from langchain_community.tools.insumer.wallet_trust import InsumerWalletTrust

__all__ = [
"InsumerAcpDiscount",
"InsumerAttest",
"InsumerBatchWalletTrust",
"InsumerBuyCredits",
"InsumerBuyMerchantCredits",
"InsumerCheckDiscount",
"InsumerComplianceTemplates",
"InsumerConfigureNfts",
"InsumerConfigureSettings",
"InsumerConfigureTokens",
"InsumerConfirmPayment",
"InsumerCreateMerchant",
"InsumerCredits",
"InsumerGetMerchant",
"InsumerJwks",
"InsumerListMerchants",
"InsumerListTokens",
"InsumerMerchantStatus",
"InsumerPublishDirectory",
"InsumerRequestDomainVerification",
"InsumerUcpDiscount",
"InsumerValidateCode",
"InsumerVerify",
"InsumerVerifyDomain",
"InsumerWalletTrust",
]
81 changes: 81 additions & 0 deletions libs/community/langchain_community/tools/insumer/acp_discount.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
"""Tool for requesting ACP-format discounts."""

import json
from typing import Any, Optional, Type

from langchain_core.callbacks import CallbackManagerForToolRun
from langchain_core.tools import BaseTool
from pydantic import BaseModel, Field

from langchain_community.utilities.insumer import InsumerAPIWrapper


class InsumerAcpDiscountSchema(BaseModel):
"""Input for InsumerAcpDiscount."""

merchant_id: str = Field(description="Merchant ID to request discount from.")
wallet: Optional[str] = Field(
default=None,
description="EVM wallet address (0x...).",
)
solana_wallet: Optional[str] = Field(
default=None,
description="Solana wallet address (base58).",
)
xrpl_wallet: Optional[str] = Field(
default=None,
description="XRPL wallet address (r-address).",
)
items: Optional[str] = Field(
default=None,
description=(
"JSON array of cart items for per-item allocation. "
'Each item: {"path": "cart/item-name", "amount": 450}. '
"Amount is in cents. Pass as a JSON string."
),
)


class InsumerAcpDiscount(BaseTool):
"""Request an ACP-format discount for a wallet at a merchant.

Returns OpenAI/Stripe Agentic Commerce Protocol coupon objects with
applied/rejected arrays, codes, and per-item allocations.
Costs 1 merchant credit.
"""

mode: str = "acp_discount"
name: str = "insumer_acp_discount"
description: str = (
"Request an ACP (Agentic Commerce Protocol) discount for a wallet "
"at a specific merchant. Returns coupon objects with discount percentage, "
"codes, and optional per-item allocations. Costs 1 merchant credit."
)
args_schema: Type[InsumerAcpDiscountSchema] = InsumerAcpDiscountSchema

api_wrapper: InsumerAPIWrapper = Field(..., exclude=True)

def __init__(self, api_wrapper: InsumerAPIWrapper) -> None:
super().__init__(api_wrapper=api_wrapper)

def _run(
self,
merchant_id: str,
wallet: Optional[str] = None,
solana_wallet: Optional[str] = None,
xrpl_wallet: Optional[str] = None,
items: Optional[str] = None,
run_manager: Optional[CallbackManagerForToolRun] = None,
) -> str:
"""Request ACP discount."""
parsed_items: list[dict[str, Any]] | None = None
if items:
parsed_items = json.loads(items)
return self.api_wrapper.run(
mode=self.mode,
merchant_id=merchant_id,
wallet=wallet,
solana_wallet=solana_wallet,
xrpl_wallet=xrpl_wallet,
items=parsed_items,
)
93 changes: 93 additions & 0 deletions libs/community/langchain_community/tools/insumer/attest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
"""Tool for creating privacy-preserving on-chain attestations."""

import json
from typing import Any, Optional, Type

from langchain_core.callbacks import CallbackManagerForToolRun
from langchain_core.tools import BaseTool
from pydantic import BaseModel, Field

from langchain_community.utilities.insumer import InsumerAPIWrapper


class InsumerAttestSchema(BaseModel):
"""Input for InsumerAttest."""

wallet: Optional[str] = Field(
default=None,
description="EVM wallet address (0x...) to verify.",
)
solana_wallet: Optional[str] = Field(
default=None,
description="Solana wallet address (base58) to verify.",
)
xrpl_wallet: Optional[str] = Field(
default=None,
description="XRPL wallet address (r-address) to verify.",
)
proof: Optional[str] = Field(
default=None,
description=(
'Set to "merkle" to include EIP-1186 Merkle storage proofs in results. '
"Proofs available for token_balance conditions on RPC chains "
"(1, 56, 8453, 43114, 137, 42161, 10, 88888, 1868, 98866, 480). "
"Costs 2 credits instead of 1. Reveals raw balance to caller."
),
)
conditions: str = Field(
description=(
'JSON array of conditions. Each condition: {"type": "token_balance", '
'"nft_ownership", or "eas_attestation", "contractAddress": "0x...", '
'"chainId": 1, "threshold": 1000, "decimals": 6, "label": "..."}. '
"For EAS attestations, use type \"eas_attestation\" with either "
'"template": "coinbase_verified_account" (or coinbase_verified_country, '
'coinbase_one) or raw "schemaId". No contractAddress/threshold needed. '
"Supports 32 chains. Max 10 conditions."
),
)


class InsumerAttest(BaseTool):
"""Verify on-chain token balances, NFT ownership, or EAS attestations.

Returns only true/false per condition -- never exposes actual balances.
The response includes an ECDSA P-256 signature for cryptographic proof.
Costs 1 attestation credit per call, or 2 credits with proof="merkle".
"""

mode: str = "attest"
name: str = "insumer_attest"
description: str = (
"Verify on-chain conditions (token balances, NFT ownership, EAS "
"attestations) across 32 blockchains. Returns a cryptographically signed "
"true/false attestation without exposing actual wallet balances. For EAS "
"attestations (e.g. Coinbase Verifications KYC), use compliance templates "
"or raw schema IDs. Costs 1 credit. "
'Pass proof="merkle" for EIP-1186 Merkle storage proofs (2 credits).'
)
args_schema: Type[InsumerAttestSchema] = InsumerAttestSchema

api_wrapper: InsumerAPIWrapper = Field(..., exclude=True)

def __init__(self, api_wrapper: InsumerAPIWrapper) -> None:
super().__init__(api_wrapper=api_wrapper)

def _run(
self,
conditions: str,
wallet: Optional[str] = None,
solana_wallet: Optional[str] = None,
xrpl_wallet: Optional[str] = None,
proof: Optional[str] = None,
run_manager: Optional[CallbackManagerForToolRun] = None,
) -> str:
"""Execute the attestation."""
parsed_conditions: list[dict[str, Any]] = json.loads(conditions)
return self.api_wrapper.run(
mode=self.mode,
conditions=parsed_conditions,
wallet=wallet,
solana_wallet=solana_wallet,
xrpl_wallet=xrpl_wallet,
proof=proof,
)
Loading