# Lordevo tools for LangChain JS

> Needs `lordevo-x402` **0.1.5 or later** (on npm and PyPI; 0.1.3 lacks `toolDefs()` and `trial`).

Five web tools for a LangChain JS agent, paid per call with x402 (USDC on Base). No account and no API key.

| Tool | What it does | Price per call |
|---|---|---|
| `page_markdown` | A web page as clean, LLM-ready Markdown | $0.002 |
| `can_fetch` | robots.txt + AI-crawler permission check for a URL | $0.002 |
| `tech_stack` | What a site is built with (CMS, frameworks, analytics) | $0.002 |
| `dns_lookup` | DNS records (A, AAAA, CNAME, MX, TXT, NS, SOA, CAA) | $0.002 |
| `email_validate` | Email syntax + domain + MX (no mailbox probing) | $0.002 |

Prices are from the shop's price table (checked 13 Nov 2026; the published `lordevo-x402` 0.1.5 lists the same prices). The live price is always the one in the HTTP 402 and in https://shop.lordevo.com/catalog.json.

## Install
```bash
npm i lordevo-x402 @langchain/core langchain
npm i @x402/fetch @x402/evm viem        # only for paid calls
```
Copy `lordevo-langchain.mjs` next to your code.

## Use (5 lines)
```js
import { createAgent } from 'langchain';
import { fromPrivateKey } from 'lordevo-x402';
import { lordevoTools } from './lordevo-langchain.mjs';
const lordevo = await fromPrivateKey(process.env.AGENT_WALLET_KEY, { trial: true, maxPriceUsd: 0.01 });
const agent = createAgent({ model: process.env.LANGCHAIN_MODEL, tools: lordevoTools(lordevo) });
```
Then `await agent.invoke({ messages: [{ role: 'user', content: 'Read https://example.com and tell me what it is built with.' }] })`.

`lordevoTools(lordevo, ['page-markdown', 'can-fetch'])` picks other tools; any slug from the catalog works.

## Free trial
With `{ trial: true }` the first calls of the day are free: 3 calls per IP per UTC day on tools priced up to $0.005 (all five tools here). After that the client pays. Without a wallet key, use `createLordevo({ trial: true })`: free calls only; when they are used up the tool returns `{"error": "payment_required", ...}` to the model instead of throwing.

## How payment works
An unpaid request gets HTTP 402 with the price. The x402 fetch signs a USDC payment from your agent wallet on Base and retries; the shop's facilitator settles it, so the wallet needs USDC but no ETH for gas. `maxPriceUsd` refuses any tool priced above it before a request is made. Answers of 400 or higher are not charged. Use a separate agent wallet with a small balance, and keep its key in an environment variable, never in code.

## Errors
The tools never throw: errors reach the model as JSON with `error`, `message` and `charged` (always `false` for errors).

## Run the example
```bash
node example.mjs                       # free trial calls only
AGENT_WALLET_KEY=0x... node example.mjs # free first, then paid
```
It invokes each tool once without an LLM, plus one bad input, and prints what happened.

MIT licence, like `lordevo-x402`. LangChain is MIT-licensed; this file only uses its public `tool()` API.

## Files
- [example.mjs](https://shop.lordevo.com/guides/sdk/langchain-js/example.mjs)
- [lordevo-langchain.mjs](https://shop.lordevo.com/guides/sdk/langchain-js/lordevo-langchain.mjs)

All SDK guides: https://shop.lordevo.com/guides/sdk
