@chainpearc/ai-tools 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -17,33 +17,21 @@ type ChainPeToolOptions = ChainPeOptions | {
17
17
  declare function getClient(options: ChainPeToolOptions): ChainPe;
18
18
  declare const fetchInputSchema: z.ZodObject<{
19
19
  url: z.ZodString;
20
- method: z.ZodOptional<z.ZodEnum<["GET", "POST", "PUT", "DELETE", "PATCH"]>>;
20
+ method: z.ZodOptional<z.ZodEnum<{
21
+ GET: "GET";
22
+ POST: "POST";
23
+ PUT: "PUT";
24
+ DELETE: "DELETE";
25
+ PATCH: "PATCH";
26
+ }>>;
21
27
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
22
28
  body: z.ZodOptional<z.ZodString>;
23
- }, "strip", z.ZodTypeAny, {
24
- url: string;
25
- method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
26
- headers?: Record<string, string> | undefined;
27
- body?: string | undefined;
28
- }, {
29
- url: string;
30
- method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
31
- headers?: Record<string, string> | undefined;
32
- body?: string | undefined;
33
- }>;
29
+ }, z.core.$strip>;
34
30
  declare const discoverInputSchema: z.ZodObject<{
35
31
  query: z.ZodOptional<z.ZodString>;
36
- tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
32
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
37
33
  maxPrice: z.ZodOptional<z.ZodString>;
38
- }, "strip", z.ZodTypeAny, {
39
- query?: string | undefined;
40
- tags?: string[] | undefined;
41
- maxPrice?: string | undefined;
42
- }, {
43
- query?: string | undefined;
44
- tags?: string[] | undefined;
45
- maxPrice?: string | undefined;
46
- }>;
34
+ }, z.core.$strip>;
47
35
  type FetchInput = z.infer<typeof fetchInputSchema>;
48
36
  type DiscoverInput = z.infer<typeof discoverInputSchema>;
49
37
  interface FetchResult {
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ var fetchInputSchema = z.object({
10
10
  "The URL to call. If it responds 402 Payment Required, the USDC payment is signed and sent automatically."
11
11
  ),
12
12
  method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).optional().describe("HTTP method (default GET)."),
13
- headers: z.record(z.string()).optional().describe("Optional request headers."),
13
+ headers: z.record(z.string(), z.string()).optional().describe("Optional request headers."),
14
14
  body: z.string().optional().describe("Optional request body, as a string (e.g. a JSON payload).")
15
15
  });
16
16
  var discoverInputSchema = z.object({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core.ts"],"sourcesContent":["/**\n * Framework-agnostic core for the ChainPe agent tools.\n *\n * Both the Vercel AI SDK adapter (`./vercel`) and the LangChain adapter\n * (`./langchain`) are thin wrappers over the `runFetch` / `runDiscover`\n * functions here, which in turn wrap `@chainpearc/sdk`. The input schemas and\n * serializable return shapes live here so the two adapters stay identical.\n */\nimport { z } from 'zod'\nimport { ChainPe, type ChainPeOptions } from '@chainpearc/sdk'\n\n/** Either SDK constructor options, or a pre-built {@link ChainPe} instance. */\nexport type ChainPeToolOptions = ChainPeOptions | { client: ChainPe }\n\nexport function getClient(options: ChainPeToolOptions): ChainPe {\n if ('client' in options) return options.client\n return new ChainPe(options)\n}\n\n// ─── Input schemas (shared by both frameworks) ───────────────────────────────\n\nexport const fetchInputSchema = z.object({\n url: z\n .string()\n .url()\n .describe(\n 'The URL to call. If it responds 402 Payment Required, the USDC payment is signed and sent automatically.'\n ),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .optional()\n .describe('HTTP method (default GET).'),\n headers: z\n .record(z.string())\n .optional()\n .describe('Optional request headers.'),\n body: z\n .string()\n .optional()\n .describe('Optional request body, as a string (e.g. a JSON payload).')\n})\n\nexport const discoverInputSchema = z.object({\n query: z\n .string()\n .optional()\n .describe('Free-text search over service name, description, and tags.'),\n tags: z.array(z.string()).optional().describe('Filter by tags.'),\n maxPrice: z\n .string()\n .optional()\n .describe('Maximum price per request, in USDC (e.g. \"0.05\").')\n})\n\nexport type FetchInput = z.infer<typeof fetchInputSchema>\nexport type DiscoverInput = z.infer<typeof discoverInputSchema>\n\n// ─── Serializable results ────────────────────────────────────────────────────\n\nexport interface FetchResult {\n status: number\n ok: boolean\n /** Parsed response body (object for JSON, string otherwise). */\n data: unknown\n /** Present when a USDC payment was made + settled. */\n payment?: {\n amount: string\n recipient: string\n network: string\n rail: string\n txHash?: string\n transferId?: string\n }\n /** Present when ERC-8004 feedback was posted (autoFeedback). */\n reputation?: { agentId: string; score: number; txHash: string }\n}\n\nexport interface DiscoverResultItem {\n name: string\n description: string\n endpoint: string\n pricePerRequest: string\n tags: string[]\n walletAddress: string\n agentId?: string\n /** Aggregate ERC-8004 score (0–100) or null when unrated. */\n reputationScore: number | null\n /** Number of distinct clients that left feedback. */\n reputationCount: number\n}\n\n// ─── Tool descriptions (shared) ──────────────────────────────────────────────\n\nexport const FETCH_TOOL_DESCRIPTION =\n 'Fetch a URL, automatically paying any x402 \"402 Payment Required\" response in ' +\n 'USDC on Arc. Use this to call paid HTTP APIs or hire paid AI ' +\n 'agents. Returns the response body plus payment + reputation details.'\n\nexport const DISCOVER_TOOL_DESCRIPTION =\n \"Discover paid services and AI agents through Circle's Discovery API and ChainPe's on-chain listings, \" +\n 'ranked by ERC-8004 reputation (best first). Returns each service\\'s endpoint, ' +\n 'price, and reputation so you can pick one before paying.'\n\n// ─── Execution (shared) ──────────────────────────────────────────────────────\n\nexport async function runFetch(\n client: ChainPe,\n input: FetchInput\n): Promise<FetchResult> {\n const res = await client.pay(input.url, {\n method: input.method,\n headers: input.headers,\n body: input.body\n })\n return {\n status: res.status,\n ok: res.ok,\n data: res.data,\n payment: res.payment\n ? {\n amount: res.payment.amount,\n recipient: res.payment.recipient,\n network: res.payment.network,\n rail: res.payment.rail,\n txHash: res.payment.txHash,\n transferId: res.payment.transferId\n }\n : undefined,\n reputation: res.reputation\n }\n}\n\nexport async function runDiscover(\n client: ChainPe,\n input: DiscoverInput\n): Promise<DiscoverResultItem[]> {\n const services = await client.discover({\n query: input.query,\n tags: input.tags,\n maxPrice: input.maxPrice\n })\n return services.map(s => ({\n name: s.name,\n description: s.description,\n endpoint: s.endpoint,\n pricePerRequest: s.pricePerRequest,\n tags: s.tags,\n walletAddress: s.walletAddress,\n agentId: s.agentId,\n reputationScore: s.reputation?.score ?? null,\n reputationCount: s.reputation?.count ?? 0\n }))\n}\n"],"mappings":";AAQA,SAAS,SAAS;AAClB,SAAS,eAAoC;AAKtC,SAAS,UAAU,SAAsC;AAC9D,MAAI,YAAY,QAAS,QAAO,QAAQ;AACxC,SAAO,IAAI,QAAQ,OAAO;AAC5B;AAIO,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,KAAK,EACF,OAAO,EACP,IAAI,EACJ;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,EACL,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU,OAAO,CAAC,EAC9C,SAAS,EACT,SAAS,4BAA4B;AAAA,EACxC,SAAS,EACN,OAAO,EAAE,OAAO,CAAC,EACjB,SAAS,EACT,SAAS,2BAA2B;AAAA,EACvC,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,2DAA2D;AACzE,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,4DAA4D;AAAA,EACxE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,EAC/D,UAAU,EACP,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AACjE,CAAC;AAyCM,IAAM,yBACX;AAIK,IAAM,4BACX;AAMF,eAAsB,SACpB,QACA,OACsB;AACtB,QAAM,MAAM,MAAM,OAAO,IAAI,MAAM,KAAK;AAAA,IACtC,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,SAAS,IAAI,UACT;AAAA,MACE,QAAQ,IAAI,QAAQ;AAAA,MACpB,WAAW,IAAI,QAAQ;AAAA,MACvB,SAAS,IAAI,QAAQ;AAAA,MACrB,MAAM,IAAI,QAAQ;AAAA,MAClB,QAAQ,IAAI,QAAQ;AAAA,MACpB,YAAY,IAAI,QAAQ;AAAA,IAC1B,IACA;AAAA,IACJ,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,eAAsB,YACpB,QACA,OAC+B;AAC/B,QAAM,WAAW,MAAM,OAAO,SAAS;AAAA,IACrC,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,SAAO,SAAS,IAAI,QAAM;AAAA,IACxB,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,UAAU,EAAE;AAAA,IACZ,iBAAiB,EAAE;AAAA,IACnB,MAAM,EAAE;AAAA,IACR,eAAe,EAAE;AAAA,IACjB,SAAS,EAAE;AAAA,IACX,iBAAiB,EAAE,YAAY,SAAS;AAAA,IACxC,iBAAiB,EAAE,YAAY,SAAS;AAAA,EAC1C,EAAE;AACJ;","names":[]}
1
+ {"version":3,"sources":["../src/core.ts"],"sourcesContent":["/**\n * Framework-agnostic core for the ChainPe agent tools.\n *\n * Both the Vercel AI SDK adapter (`./vercel`) and the LangChain adapter\n * (`./langchain`) are thin wrappers over the `runFetch` / `runDiscover`\n * functions here, which in turn wrap `@chainpearc/sdk`. The input schemas and\n * serializable return shapes live here so the two adapters stay identical.\n */\nimport { z } from 'zod'\nimport { ChainPe, type ChainPeOptions } from '@chainpearc/sdk'\n\n/** Either SDK constructor options, or a pre-built {@link ChainPe} instance. */\nexport type ChainPeToolOptions = ChainPeOptions | { client: ChainPe }\n\nexport function getClient(options: ChainPeToolOptions): ChainPe {\n if ('client' in options) return options.client\n return new ChainPe(options)\n}\n\n// ─── Input schemas (shared by both frameworks) ───────────────────────────────\n\nexport const fetchInputSchema = z.object({\n url: z\n .string()\n .url()\n .describe(\n 'The URL to call. If it responds 402 Payment Required, the USDC payment is signed and sent automatically.'\n ),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .optional()\n .describe('HTTP method (default GET).'),\n headers: z\n .record(z.string(), z.string())\n .optional()\n .describe('Optional request headers.'),\n body: z\n .string()\n .optional()\n .describe('Optional request body, as a string (e.g. a JSON payload).')\n})\n\nexport const discoverInputSchema = z.object({\n query: z\n .string()\n .optional()\n .describe('Free-text search over service name, description, and tags.'),\n tags: z.array(z.string()).optional().describe('Filter by tags.'),\n maxPrice: z\n .string()\n .optional()\n .describe('Maximum price per request, in USDC (e.g. \"0.05\").')\n})\n\nexport type FetchInput = z.infer<typeof fetchInputSchema>\nexport type DiscoverInput = z.infer<typeof discoverInputSchema>\n\n// ─── Serializable results ────────────────────────────────────────────────────\n\nexport interface FetchResult {\n status: number\n ok: boolean\n /** Parsed response body (object for JSON, string otherwise). */\n data: unknown\n /** Present when a USDC payment was made + settled. */\n payment?: {\n amount: string\n recipient: string\n network: string\n rail: string\n txHash?: string\n transferId?: string\n }\n /** Present when ERC-8004 feedback was posted (autoFeedback). */\n reputation?: { agentId: string; score: number; txHash: string }\n}\n\nexport interface DiscoverResultItem {\n name: string\n description: string\n endpoint: string\n pricePerRequest: string\n tags: string[]\n walletAddress: string\n agentId?: string\n /** Aggregate ERC-8004 score (0–100) or null when unrated. */\n reputationScore: number | null\n /** Number of distinct clients that left feedback. */\n reputationCount: number\n}\n\n// ─── Tool descriptions (shared) ──────────────────────────────────────────────\n\nexport const FETCH_TOOL_DESCRIPTION =\n 'Fetch a URL, automatically paying any x402 \"402 Payment Required\" response in ' +\n 'USDC on Arc. Use this to call paid HTTP APIs or hire paid AI ' +\n 'agents. Returns the response body plus payment + reputation details.'\n\nexport const DISCOVER_TOOL_DESCRIPTION =\n \"Discover paid services and AI agents through Circle's Discovery API and ChainPe's on-chain listings, \" +\n 'ranked by ERC-8004 reputation (best first). Returns each service\\'s endpoint, ' +\n 'price, and reputation so you can pick one before paying.'\n\n// ─── Execution (shared) ──────────────────────────────────────────────────────\n\nexport async function runFetch(\n client: ChainPe,\n input: FetchInput\n): Promise<FetchResult> {\n const res = await client.pay(input.url, {\n method: input.method,\n headers: input.headers,\n body: input.body\n })\n return {\n status: res.status,\n ok: res.ok,\n data: res.data,\n payment: res.payment\n ? {\n amount: res.payment.amount,\n recipient: res.payment.recipient,\n network: res.payment.network,\n rail: res.payment.rail,\n txHash: res.payment.txHash,\n transferId: res.payment.transferId\n }\n : undefined,\n reputation: res.reputation\n }\n}\n\nexport async function runDiscover(\n client: ChainPe,\n input: DiscoverInput\n): Promise<DiscoverResultItem[]> {\n const services = await client.discover({\n query: input.query,\n tags: input.tags,\n maxPrice: input.maxPrice\n })\n return services.map(s => ({\n name: s.name,\n description: s.description,\n endpoint: s.endpoint,\n pricePerRequest: s.pricePerRequest,\n tags: s.tags,\n walletAddress: s.walletAddress,\n agentId: s.agentId,\n reputationScore: s.reputation?.score ?? null,\n reputationCount: s.reputation?.count ?? 0\n }))\n}\n"],"mappings":";AAQA,SAAS,SAAS;AAClB,SAAS,eAAoC;AAKtC,SAAS,UAAU,SAAsC;AAC9D,MAAI,YAAY,QAAS,QAAO,QAAQ;AACxC,SAAO,IAAI,QAAQ,OAAO;AAC5B;AAIO,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,KAAK,EACF,OAAO,EACP,IAAI,EACJ;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,EACL,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU,OAAO,CAAC,EAC9C,SAAS,EACT,SAAS,4BAA4B;AAAA,EACxC,SAAS,EACN,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAC7B,SAAS,EACT,SAAS,2BAA2B;AAAA,EACvC,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,2DAA2D;AACzE,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,4DAA4D;AAAA,EACxE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,EAC/D,UAAU,EACP,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AACjE,CAAC;AAyCM,IAAM,yBACX;AAIK,IAAM,4BACX;AAMF,eAAsB,SACpB,QACA,OACsB;AACtB,QAAM,MAAM,MAAM,OAAO,IAAI,MAAM,KAAK;AAAA,IACtC,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,SAAS,IAAI,UACT;AAAA,MACE,QAAQ,IAAI,QAAQ;AAAA,MACpB,WAAW,IAAI,QAAQ;AAAA,MACvB,SAAS,IAAI,QAAQ;AAAA,MACrB,MAAM,IAAI,QAAQ;AAAA,MAClB,QAAQ,IAAI,QAAQ;AAAA,MACpB,YAAY,IAAI,QAAQ;AAAA,IAC1B,IACA;AAAA,IACJ,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,eAAsB,YACpB,QACA,OAC+B;AAC/B,QAAM,WAAW,MAAM,OAAO,SAAS;AAAA,IACrC,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,SAAO,SAAS,IAAI,QAAM;AAAA,IACxB,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,UAAU,EAAE;AAAA,IACZ,iBAAiB,EAAE;AAAA,IACnB,MAAM,EAAE;AAAA,IACR,eAAe,EAAE;AAAA,IACjB,SAAS,EAAE;AAAA,IACX,iBAAiB,EAAE,YAAY,SAAS;AAAA,IACxC,iBAAiB,EAAE,YAAY,SAAS;AAAA,EAC1C,EAAE;AACJ;","names":[]}
@@ -1,4 +1,5 @@
1
1
  import * as _langchain_core_tools from '@langchain/core/tools';
2
+ import * as zod_v4_core from 'zod/v4/core';
2
3
  import * as zod from 'zod';
3
4
  import { ChainPeToolOptions } from './index.js';
4
5
  import '@chainpearc/sdk';
@@ -11,10 +12,16 @@ import '@chainpearc/sdk';
11
12
  declare function createChainPeLangChainTools(options: ChainPeToolOptions): {
12
13
  chainpeFetchTool: _langchain_core_tools.DynamicStructuredTool<zod.ZodObject<{
13
14
  url: zod.ZodString;
14
- method: zod.ZodOptional<zod.ZodEnum<["GET", "POST", "PUT", "DELETE", "PATCH"]>>;
15
+ method: zod.ZodOptional<zod.ZodEnum<{
16
+ GET: "GET";
17
+ POST: "POST";
18
+ PUT: "PUT";
19
+ DELETE: "DELETE";
20
+ PATCH: "PATCH";
21
+ }>>;
15
22
  headers: zod.ZodOptional<zod.ZodRecord<zod.ZodString, zod.ZodString>>;
16
23
  body: zod.ZodOptional<zod.ZodString>;
17
- }, "strip", zod.ZodTypeAny, {
24
+ }, zod_v4_core.$strip>, {
18
25
  url: string;
19
26
  method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
20
27
  headers?: Record<string, string> | undefined;
@@ -24,30 +31,12 @@ declare function createChainPeLangChainTools(options: ChainPeToolOptions): {
24
31
  method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
25
32
  headers?: Record<string, string> | undefined;
26
33
  body?: string | undefined;
27
- }>, {
28
- url: string;
29
- method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
30
- headers?: Record<string, string> | undefined;
31
- body?: string | undefined;
32
- }, {
33
- url: string;
34
- method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
35
- headers?: Record<string, string> | undefined;
36
- body?: string | undefined;
37
- }, string>;
34
+ }, string, unknown, "chainpe_fetch">;
38
35
  discoverServiceTool: _langchain_core_tools.DynamicStructuredTool<zod.ZodObject<{
39
36
  query: zod.ZodOptional<zod.ZodString>;
40
- tags: zod.ZodOptional<zod.ZodArray<zod.ZodString, "many">>;
37
+ tags: zod.ZodOptional<zod.ZodArray<zod.ZodString>>;
41
38
  maxPrice: zod.ZodOptional<zod.ZodString>;
42
- }, "strip", zod.ZodTypeAny, {
43
- query?: string | undefined;
44
- tags?: string[] | undefined;
45
- maxPrice?: string | undefined;
46
- }, {
47
- query?: string | undefined;
48
- tags?: string[] | undefined;
49
- maxPrice?: string | undefined;
50
- }>, {
39
+ }, zod_v4_core.$strip>, {
51
40
  query?: string | undefined;
52
41
  tags?: string[] | undefined;
53
42
  maxPrice?: string | undefined;
@@ -55,7 +44,7 @@ declare function createChainPeLangChainTools(options: ChainPeToolOptions): {
55
44
  query?: string | undefined;
56
45
  tags?: string[] | undefined;
57
46
  maxPrice?: string | undefined;
58
- }, string>;
47
+ }, string, unknown, "discover_service">;
59
48
  };
60
49
  type ChainPeLangChainTools = ReturnType<typeof createChainPeLangChainTools>;
61
50
 
package/dist/langchain.js CHANGED
@@ -13,7 +13,7 @@ var fetchInputSchema = z.object({
13
13
  "The URL to call. If it responds 402 Payment Required, the USDC payment is signed and sent automatically."
14
14
  ),
15
15
  method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).optional().describe("HTTP method (default GET)."),
16
- headers: z.record(z.string()).optional().describe("Optional request headers."),
16
+ headers: z.record(z.string(), z.string()).optional().describe("Optional request headers."),
17
17
  body: z.string().optional().describe("Optional request body, as a string (e.g. a JSON payload).")
18
18
  });
19
19
  var discoverInputSchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/langchain.ts","../src/core.ts"],"sourcesContent":["/**\n * ChainPe tools for **LangChain** (`@langchain/core`).\n *\n * @example\n * ```ts\n * import { ChatAnthropic } from '@langchain/anthropic'\n * import { createReactAgent } from '@langchain/langgraph/prebuilt'\n * import { createChainPeLangChainTools } from '@chainpearc/ai-tools/langchain'\n *\n * const { chainpeFetchTool, discoverServiceTool } = createChainPeLangChainTools({\n * privateKey, autoFeedback: true\n * })\n *\n * const agent = createReactAgent({\n * llm: new ChatAnthropic({ model: 'claude-opus-4-8' }),\n * tools: [discoverServiceTool, chainpeFetchTool]\n * })\n * ```\n */\nimport { tool } from '@langchain/core/tools'\nimport {\n getClient,\n fetchInputSchema,\n discoverInputSchema,\n runFetch,\n runDiscover,\n FETCH_TOOL_DESCRIPTION,\n DISCOVER_TOOL_DESCRIPTION,\n type ChainPeToolOptions\n} from './core.js'\n\n/**\n * Builds the ChainPe LangChain `StructuredTool`s:\n * `{ chainpeFetchTool, discoverServiceTool }`. Tool results are returned as\n * JSON strings (LangChain tool outputs are strings).\n */\nexport function createChainPeLangChainTools(options: ChainPeToolOptions) {\n const client = getClient(options)\n\n const chainpeFetchTool = tool(\n async input => JSON.stringify(await runFetch(client, input)),\n {\n name: 'chainpe_fetch',\n description: FETCH_TOOL_DESCRIPTION,\n schema: fetchInputSchema\n }\n )\n\n const discoverServiceTool = tool(\n async input => JSON.stringify(await runDiscover(client, input)),\n {\n name: 'discover_service',\n description: DISCOVER_TOOL_DESCRIPTION,\n schema: discoverInputSchema\n }\n )\n\n return { chainpeFetchTool, discoverServiceTool }\n}\n\nexport type ChainPeLangChainTools = ReturnType<\n typeof createChainPeLangChainTools\n>\nexport type { ChainPeToolOptions } from './core.js'\n","/**\n * Framework-agnostic core for the ChainPe agent tools.\n *\n * Both the Vercel AI SDK adapter (`./vercel`) and the LangChain adapter\n * (`./langchain`) are thin wrappers over the `runFetch` / `runDiscover`\n * functions here, which in turn wrap `@chainpearc/sdk`. The input schemas and\n * serializable return shapes live here so the two adapters stay identical.\n */\nimport { z } from 'zod'\nimport { ChainPe, type ChainPeOptions } from '@chainpearc/sdk'\n\n/** Either SDK constructor options, or a pre-built {@link ChainPe} instance. */\nexport type ChainPeToolOptions = ChainPeOptions | { client: ChainPe }\n\nexport function getClient(options: ChainPeToolOptions): ChainPe {\n if ('client' in options) return options.client\n return new ChainPe(options)\n}\n\n// ─── Input schemas (shared by both frameworks) ───────────────────────────────\n\nexport const fetchInputSchema = z.object({\n url: z\n .string()\n .url()\n .describe(\n 'The URL to call. If it responds 402 Payment Required, the USDC payment is signed and sent automatically.'\n ),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .optional()\n .describe('HTTP method (default GET).'),\n headers: z\n .record(z.string())\n .optional()\n .describe('Optional request headers.'),\n body: z\n .string()\n .optional()\n .describe('Optional request body, as a string (e.g. a JSON payload).')\n})\n\nexport const discoverInputSchema = z.object({\n query: z\n .string()\n .optional()\n .describe('Free-text search over service name, description, and tags.'),\n tags: z.array(z.string()).optional().describe('Filter by tags.'),\n maxPrice: z\n .string()\n .optional()\n .describe('Maximum price per request, in USDC (e.g. \"0.05\").')\n})\n\nexport type FetchInput = z.infer<typeof fetchInputSchema>\nexport type DiscoverInput = z.infer<typeof discoverInputSchema>\n\n// ─── Serializable results ────────────────────────────────────────────────────\n\nexport interface FetchResult {\n status: number\n ok: boolean\n /** Parsed response body (object for JSON, string otherwise). */\n data: unknown\n /** Present when a USDC payment was made + settled. */\n payment?: {\n amount: string\n recipient: string\n network: string\n rail: string\n txHash?: string\n transferId?: string\n }\n /** Present when ERC-8004 feedback was posted (autoFeedback). */\n reputation?: { agentId: string; score: number; txHash: string }\n}\n\nexport interface DiscoverResultItem {\n name: string\n description: string\n endpoint: string\n pricePerRequest: string\n tags: string[]\n walletAddress: string\n agentId?: string\n /** Aggregate ERC-8004 score (0–100) or null when unrated. */\n reputationScore: number | null\n /** Number of distinct clients that left feedback. */\n reputationCount: number\n}\n\n// ─── Tool descriptions (shared) ──────────────────────────────────────────────\n\nexport const FETCH_TOOL_DESCRIPTION =\n 'Fetch a URL, automatically paying any x402 \"402 Payment Required\" response in ' +\n 'USDC on Arc. Use this to call paid HTTP APIs or hire paid AI ' +\n 'agents. Returns the response body plus payment + reputation details.'\n\nexport const DISCOVER_TOOL_DESCRIPTION =\n \"Discover paid services and AI agents through Circle's Discovery API and ChainPe's on-chain listings, \" +\n 'ranked by ERC-8004 reputation (best first). Returns each service\\'s endpoint, ' +\n 'price, and reputation so you can pick one before paying.'\n\n// ─── Execution (shared) ──────────────────────────────────────────────────────\n\nexport async function runFetch(\n client: ChainPe,\n input: FetchInput\n): Promise<FetchResult> {\n const res = await client.pay(input.url, {\n method: input.method,\n headers: input.headers,\n body: input.body\n })\n return {\n status: res.status,\n ok: res.ok,\n data: res.data,\n payment: res.payment\n ? {\n amount: res.payment.amount,\n recipient: res.payment.recipient,\n network: res.payment.network,\n rail: res.payment.rail,\n txHash: res.payment.txHash,\n transferId: res.payment.transferId\n }\n : undefined,\n reputation: res.reputation\n }\n}\n\nexport async function runDiscover(\n client: ChainPe,\n input: DiscoverInput\n): Promise<DiscoverResultItem[]> {\n const services = await client.discover({\n query: input.query,\n tags: input.tags,\n maxPrice: input.maxPrice\n })\n return services.map(s => ({\n name: s.name,\n description: s.description,\n endpoint: s.endpoint,\n pricePerRequest: s.pricePerRequest,\n tags: s.tags,\n walletAddress: s.walletAddress,\n agentId: s.agentId,\n reputationScore: s.reputation?.score ?? null,\n reputationCount: s.reputation?.count ?? 0\n }))\n}\n"],"mappings":";AAmBA,SAAS,YAAY;;;ACXrB,SAAS,SAAS;AAClB,SAAS,eAAoC;AAKtC,SAAS,UAAU,SAAsC;AAC9D,MAAI,YAAY,QAAS,QAAO,QAAQ;AACxC,SAAO,IAAI,QAAQ,OAAO;AAC5B;AAIO,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,KAAK,EACF,OAAO,EACP,IAAI,EACJ;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,EACL,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU,OAAO,CAAC,EAC9C,SAAS,EACT,SAAS,4BAA4B;AAAA,EACxC,SAAS,EACN,OAAO,EAAE,OAAO,CAAC,EACjB,SAAS,EACT,SAAS,2BAA2B;AAAA,EACvC,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,2DAA2D;AACzE,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,4DAA4D;AAAA,EACxE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,EAC/D,UAAU,EACP,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AACjE,CAAC;AAyCM,IAAM,yBACX;AAIK,IAAM,4BACX;AAMF,eAAsB,SACpB,QACA,OACsB;AACtB,QAAM,MAAM,MAAM,OAAO,IAAI,MAAM,KAAK;AAAA,IACtC,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,SAAS,IAAI,UACT;AAAA,MACE,QAAQ,IAAI,QAAQ;AAAA,MACpB,WAAW,IAAI,QAAQ;AAAA,MACvB,SAAS,IAAI,QAAQ;AAAA,MACrB,MAAM,IAAI,QAAQ;AAAA,MAClB,QAAQ,IAAI,QAAQ;AAAA,MACpB,YAAY,IAAI,QAAQ;AAAA,IAC1B,IACA;AAAA,IACJ,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,eAAsB,YACpB,QACA,OAC+B;AAC/B,QAAM,WAAW,MAAM,OAAO,SAAS;AAAA,IACrC,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,SAAO,SAAS,IAAI,QAAM;AAAA,IACxB,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,UAAU,EAAE;AAAA,IACZ,iBAAiB,EAAE;AAAA,IACnB,MAAM,EAAE;AAAA,IACR,eAAe,EAAE;AAAA,IACjB,SAAS,EAAE;AAAA,IACX,iBAAiB,EAAE,YAAY,SAAS;AAAA,IACxC,iBAAiB,EAAE,YAAY,SAAS;AAAA,EAC1C,EAAE;AACJ;;;ADpHO,SAAS,4BAA4B,SAA6B;AACvE,QAAM,SAAS,UAAU,OAAO;AAEhC,QAAM,mBAAmB;AAAA,IACvB,OAAM,UAAS,KAAK,UAAU,MAAM,SAAS,QAAQ,KAAK,CAAC;AAAA,IAC3D;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,sBAAsB;AAAA,IAC1B,OAAM,UAAS,KAAK,UAAU,MAAM,YAAY,QAAQ,KAAK,CAAC;AAAA,IAC9D;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO,EAAE,kBAAkB,oBAAoB;AACjD;","names":[]}
1
+ {"version":3,"sources":["../src/langchain.ts","../src/core.ts"],"sourcesContent":["/**\n * ChainPe tools for **LangChain** (`@langchain/core`).\n *\n * @example\n * ```ts\n * import { ChatAnthropic } from '@langchain/anthropic'\n * import { createReactAgent } from '@langchain/langgraph/prebuilt'\n * import { createChainPeLangChainTools } from '@chainpearc/ai-tools/langchain'\n *\n * const { chainpeFetchTool, discoverServiceTool } = createChainPeLangChainTools({\n * privateKey, autoFeedback: true\n * })\n *\n * const agent = createReactAgent({\n * llm: new ChatAnthropic({ model: 'claude-opus-4-8' }),\n * tools: [discoverServiceTool, chainpeFetchTool]\n * })\n * ```\n */\nimport { tool } from '@langchain/core/tools'\nimport {\n getClient,\n fetchInputSchema,\n discoverInputSchema,\n runFetch,\n runDiscover,\n FETCH_TOOL_DESCRIPTION,\n DISCOVER_TOOL_DESCRIPTION,\n type ChainPeToolOptions,\n type DiscoverInput,\n type FetchInput\n} from './core.js'\n\n/**\n * Builds the ChainPe LangChain `StructuredTool`s:\n * `{ chainpeFetchTool, discoverServiceTool }`. Tool results are returned as\n * JSON strings (LangChain tool outputs are strings).\n */\nexport function createChainPeLangChainTools(options: ChainPeToolOptions) {\n const client = getClient(options)\n\n const chainpeFetchTool = tool(\n async (input: FetchInput) => JSON.stringify(await runFetch(client, input)),\n {\n name: 'chainpe_fetch',\n description: FETCH_TOOL_DESCRIPTION,\n schema: fetchInputSchema\n }\n )\n\n const discoverServiceTool = tool(\n async (input: DiscoverInput) => JSON.stringify(await runDiscover(client, input)),\n {\n name: 'discover_service',\n description: DISCOVER_TOOL_DESCRIPTION,\n schema: discoverInputSchema\n }\n )\n\n return { chainpeFetchTool, discoverServiceTool }\n}\n\nexport type ChainPeLangChainTools = ReturnType<\n typeof createChainPeLangChainTools\n>\nexport type { ChainPeToolOptions } from './core.js'\n","/**\n * Framework-agnostic core for the ChainPe agent tools.\n *\n * Both the Vercel AI SDK adapter (`./vercel`) and the LangChain adapter\n * (`./langchain`) are thin wrappers over the `runFetch` / `runDiscover`\n * functions here, which in turn wrap `@chainpearc/sdk`. The input schemas and\n * serializable return shapes live here so the two adapters stay identical.\n */\nimport { z } from 'zod'\nimport { ChainPe, type ChainPeOptions } from '@chainpearc/sdk'\n\n/** Either SDK constructor options, or a pre-built {@link ChainPe} instance. */\nexport type ChainPeToolOptions = ChainPeOptions | { client: ChainPe }\n\nexport function getClient(options: ChainPeToolOptions): ChainPe {\n if ('client' in options) return options.client\n return new ChainPe(options)\n}\n\n// ─── Input schemas (shared by both frameworks) ───────────────────────────────\n\nexport const fetchInputSchema = z.object({\n url: z\n .string()\n .url()\n .describe(\n 'The URL to call. If it responds 402 Payment Required, the USDC payment is signed and sent automatically.'\n ),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .optional()\n .describe('HTTP method (default GET).'),\n headers: z\n .record(z.string(), z.string())\n .optional()\n .describe('Optional request headers.'),\n body: z\n .string()\n .optional()\n .describe('Optional request body, as a string (e.g. a JSON payload).')\n})\n\nexport const discoverInputSchema = z.object({\n query: z\n .string()\n .optional()\n .describe('Free-text search over service name, description, and tags.'),\n tags: z.array(z.string()).optional().describe('Filter by tags.'),\n maxPrice: z\n .string()\n .optional()\n .describe('Maximum price per request, in USDC (e.g. \"0.05\").')\n})\n\nexport type FetchInput = z.infer<typeof fetchInputSchema>\nexport type DiscoverInput = z.infer<typeof discoverInputSchema>\n\n// ─── Serializable results ────────────────────────────────────────────────────\n\nexport interface FetchResult {\n status: number\n ok: boolean\n /** Parsed response body (object for JSON, string otherwise). */\n data: unknown\n /** Present when a USDC payment was made + settled. */\n payment?: {\n amount: string\n recipient: string\n network: string\n rail: string\n txHash?: string\n transferId?: string\n }\n /** Present when ERC-8004 feedback was posted (autoFeedback). */\n reputation?: { agentId: string; score: number; txHash: string }\n}\n\nexport interface DiscoverResultItem {\n name: string\n description: string\n endpoint: string\n pricePerRequest: string\n tags: string[]\n walletAddress: string\n agentId?: string\n /** Aggregate ERC-8004 score (0–100) or null when unrated. */\n reputationScore: number | null\n /** Number of distinct clients that left feedback. */\n reputationCount: number\n}\n\n// ─── Tool descriptions (shared) ──────────────────────────────────────────────\n\nexport const FETCH_TOOL_DESCRIPTION =\n 'Fetch a URL, automatically paying any x402 \"402 Payment Required\" response in ' +\n 'USDC on Arc. Use this to call paid HTTP APIs or hire paid AI ' +\n 'agents. Returns the response body plus payment + reputation details.'\n\nexport const DISCOVER_TOOL_DESCRIPTION =\n \"Discover paid services and AI agents through Circle's Discovery API and ChainPe's on-chain listings, \" +\n 'ranked by ERC-8004 reputation (best first). Returns each service\\'s endpoint, ' +\n 'price, and reputation so you can pick one before paying.'\n\n// ─── Execution (shared) ──────────────────────────────────────────────────────\n\nexport async function runFetch(\n client: ChainPe,\n input: FetchInput\n): Promise<FetchResult> {\n const res = await client.pay(input.url, {\n method: input.method,\n headers: input.headers,\n body: input.body\n })\n return {\n status: res.status,\n ok: res.ok,\n data: res.data,\n payment: res.payment\n ? {\n amount: res.payment.amount,\n recipient: res.payment.recipient,\n network: res.payment.network,\n rail: res.payment.rail,\n txHash: res.payment.txHash,\n transferId: res.payment.transferId\n }\n : undefined,\n reputation: res.reputation\n }\n}\n\nexport async function runDiscover(\n client: ChainPe,\n input: DiscoverInput\n): Promise<DiscoverResultItem[]> {\n const services = await client.discover({\n query: input.query,\n tags: input.tags,\n maxPrice: input.maxPrice\n })\n return services.map(s => ({\n name: s.name,\n description: s.description,\n endpoint: s.endpoint,\n pricePerRequest: s.pricePerRequest,\n tags: s.tags,\n walletAddress: s.walletAddress,\n agentId: s.agentId,\n reputationScore: s.reputation?.score ?? null,\n reputationCount: s.reputation?.count ?? 0\n }))\n}\n"],"mappings":";AAmBA,SAAS,YAAY;;;ACXrB,SAAS,SAAS;AAClB,SAAS,eAAoC;AAKtC,SAAS,UAAU,SAAsC;AAC9D,MAAI,YAAY,QAAS,QAAO,QAAQ;AACxC,SAAO,IAAI,QAAQ,OAAO;AAC5B;AAIO,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,KAAK,EACF,OAAO,EACP,IAAI,EACJ;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,EACL,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU,OAAO,CAAC,EAC9C,SAAS,EACT,SAAS,4BAA4B;AAAA,EACxC,SAAS,EACN,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAC7B,SAAS,EACT,SAAS,2BAA2B;AAAA,EACvC,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,2DAA2D;AACzE,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,4DAA4D;AAAA,EACxE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,EAC/D,UAAU,EACP,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AACjE,CAAC;AAyCM,IAAM,yBACX;AAIK,IAAM,4BACX;AAMF,eAAsB,SACpB,QACA,OACsB;AACtB,QAAM,MAAM,MAAM,OAAO,IAAI,MAAM,KAAK;AAAA,IACtC,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,SAAS,IAAI,UACT;AAAA,MACE,QAAQ,IAAI,QAAQ;AAAA,MACpB,WAAW,IAAI,QAAQ;AAAA,MACvB,SAAS,IAAI,QAAQ;AAAA,MACrB,MAAM,IAAI,QAAQ;AAAA,MAClB,QAAQ,IAAI,QAAQ;AAAA,MACpB,YAAY,IAAI,QAAQ;AAAA,IAC1B,IACA;AAAA,IACJ,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,eAAsB,YACpB,QACA,OAC+B;AAC/B,QAAM,WAAW,MAAM,OAAO,SAAS;AAAA,IACrC,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,SAAO,SAAS,IAAI,QAAM;AAAA,IACxB,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,UAAU,EAAE;AAAA,IACZ,iBAAiB,EAAE;AAAA,IACnB,MAAM,EAAE;AAAA,IACR,eAAe,EAAE;AAAA,IACjB,SAAS,EAAE;AAAA,IACX,iBAAiB,EAAE,YAAY,SAAS;AAAA,IACxC,iBAAiB,EAAE,YAAY,SAAS;AAAA,EAC1C,EAAE;AACJ;;;ADlHO,SAAS,4BAA4B,SAA6B;AACvE,QAAM,SAAS,UAAU,OAAO;AAEhC,QAAM,mBAAmB;AAAA,IACvB,OAAO,UAAsB,KAAK,UAAU,MAAM,SAAS,QAAQ,KAAK,CAAC;AAAA,IACzE;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,sBAAsB;AAAA,IAC1B,OAAO,UAAyB,KAAK,UAAU,MAAM,YAAY,QAAQ,KAAK,CAAC;AAAA,IAC/E;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO,EAAE,kBAAkB,oBAAoB;AACjD;","names":[]}
package/dist/vercel.js CHANGED
@@ -13,7 +13,7 @@ var fetchInputSchema = z.object({
13
13
  "The URL to call. If it responds 402 Payment Required, the USDC payment is signed and sent automatically."
14
14
  ),
15
15
  method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).optional().describe("HTTP method (default GET)."),
16
- headers: z.record(z.string()).optional().describe("Optional request headers."),
16
+ headers: z.record(z.string(), z.string()).optional().describe("Optional request headers."),
17
17
  body: z.string().optional().describe("Optional request body, as a string (e.g. a JSON payload).")
18
18
  });
19
19
  var discoverInputSchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/vercel.ts","../src/core.ts"],"sourcesContent":["/**\n * ChainPe tools for the **Vercel AI SDK** (`ai`).\n *\n * @example\n * ```ts\n * import { generateText } from 'ai'\n * import { anthropic } from '@ai-sdk/anthropic'\n * import { createChainPeTools } from '@chainpearc/ai-tools/vercel'\n *\n * const tools = createChainPeTools({ privateKey, autoFeedback: true })\n *\n * const { text } = await generateText({\n * model: anthropic('claude-opus-4-8'),\n * tools,\n * prompt: 'Find a summarizer agent and summarize this article: …'\n * })\n * ```\n */\nimport { tool } from 'ai'\nimport {\n getClient,\n fetchInputSchema,\n discoverInputSchema,\n runFetch,\n runDiscover,\n FETCH_TOOL_DESCRIPTION,\n DISCOVER_TOOL_DESCRIPTION,\n type ChainPeToolOptions\n} from './core.js'\n\n/**\n * Builds the ChainPe tools as a Vercel AI SDK tool set:\n * `{ chainpeFetch, discoverService }`. Spread into `tools` on `generateText` /\n * `streamText`.\n */\nexport function createChainPeTools(options: ChainPeToolOptions) {\n const client = getClient(options)\n return {\n chainpeFetch: tool({\n description: FETCH_TOOL_DESCRIPTION,\n inputSchema: fetchInputSchema,\n execute: input => runFetch(client, input)\n }),\n discoverService: tool({\n description: DISCOVER_TOOL_DESCRIPTION,\n inputSchema: discoverInputSchema,\n execute: input => runDiscover(client, input)\n })\n }\n}\n\nexport type ChainPeTools = ReturnType<typeof createChainPeTools>\nexport type { ChainPeToolOptions } from './core.js'\n","/**\n * Framework-agnostic core for the ChainPe agent tools.\n *\n * Both the Vercel AI SDK adapter (`./vercel`) and the LangChain adapter\n * (`./langchain`) are thin wrappers over the `runFetch` / `runDiscover`\n * functions here, which in turn wrap `@chainpearc/sdk`. The input schemas and\n * serializable return shapes live here so the two adapters stay identical.\n */\nimport { z } from 'zod'\nimport { ChainPe, type ChainPeOptions } from '@chainpearc/sdk'\n\n/** Either SDK constructor options, or a pre-built {@link ChainPe} instance. */\nexport type ChainPeToolOptions = ChainPeOptions | { client: ChainPe }\n\nexport function getClient(options: ChainPeToolOptions): ChainPe {\n if ('client' in options) return options.client\n return new ChainPe(options)\n}\n\n// ─── Input schemas (shared by both frameworks) ───────────────────────────────\n\nexport const fetchInputSchema = z.object({\n url: z\n .string()\n .url()\n .describe(\n 'The URL to call. If it responds 402 Payment Required, the USDC payment is signed and sent automatically.'\n ),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .optional()\n .describe('HTTP method (default GET).'),\n headers: z\n .record(z.string())\n .optional()\n .describe('Optional request headers.'),\n body: z\n .string()\n .optional()\n .describe('Optional request body, as a string (e.g. a JSON payload).')\n})\n\nexport const discoverInputSchema = z.object({\n query: z\n .string()\n .optional()\n .describe('Free-text search over service name, description, and tags.'),\n tags: z.array(z.string()).optional().describe('Filter by tags.'),\n maxPrice: z\n .string()\n .optional()\n .describe('Maximum price per request, in USDC (e.g. \"0.05\").')\n})\n\nexport type FetchInput = z.infer<typeof fetchInputSchema>\nexport type DiscoverInput = z.infer<typeof discoverInputSchema>\n\n// ─── Serializable results ────────────────────────────────────────────────────\n\nexport interface FetchResult {\n status: number\n ok: boolean\n /** Parsed response body (object for JSON, string otherwise). */\n data: unknown\n /** Present when a USDC payment was made + settled. */\n payment?: {\n amount: string\n recipient: string\n network: string\n rail: string\n txHash?: string\n transferId?: string\n }\n /** Present when ERC-8004 feedback was posted (autoFeedback). */\n reputation?: { agentId: string; score: number; txHash: string }\n}\n\nexport interface DiscoverResultItem {\n name: string\n description: string\n endpoint: string\n pricePerRequest: string\n tags: string[]\n walletAddress: string\n agentId?: string\n /** Aggregate ERC-8004 score (0–100) or null when unrated. */\n reputationScore: number | null\n /** Number of distinct clients that left feedback. */\n reputationCount: number\n}\n\n// ─── Tool descriptions (shared) ──────────────────────────────────────────────\n\nexport const FETCH_TOOL_DESCRIPTION =\n 'Fetch a URL, automatically paying any x402 \"402 Payment Required\" response in ' +\n 'USDC on Arc. Use this to call paid HTTP APIs or hire paid AI ' +\n 'agents. Returns the response body plus payment + reputation details.'\n\nexport const DISCOVER_TOOL_DESCRIPTION =\n \"Discover paid services and AI agents through Circle's Discovery API and ChainPe's on-chain listings, \" +\n 'ranked by ERC-8004 reputation (best first). Returns each service\\'s endpoint, ' +\n 'price, and reputation so you can pick one before paying.'\n\n// ─── Execution (shared) ──────────────────────────────────────────────────────\n\nexport async function runFetch(\n client: ChainPe,\n input: FetchInput\n): Promise<FetchResult> {\n const res = await client.pay(input.url, {\n method: input.method,\n headers: input.headers,\n body: input.body\n })\n return {\n status: res.status,\n ok: res.ok,\n data: res.data,\n payment: res.payment\n ? {\n amount: res.payment.amount,\n recipient: res.payment.recipient,\n network: res.payment.network,\n rail: res.payment.rail,\n txHash: res.payment.txHash,\n transferId: res.payment.transferId\n }\n : undefined,\n reputation: res.reputation\n }\n}\n\nexport async function runDiscover(\n client: ChainPe,\n input: DiscoverInput\n): Promise<DiscoverResultItem[]> {\n const services = await client.discover({\n query: input.query,\n tags: input.tags,\n maxPrice: input.maxPrice\n })\n return services.map(s => ({\n name: s.name,\n description: s.description,\n endpoint: s.endpoint,\n pricePerRequest: s.pricePerRequest,\n tags: s.tags,\n walletAddress: s.walletAddress,\n agentId: s.agentId,\n reputationScore: s.reputation?.score ?? null,\n reputationCount: s.reputation?.count ?? 0\n }))\n}\n"],"mappings":";AAkBA,SAAS,YAAY;;;ACVrB,SAAS,SAAS;AAClB,SAAS,eAAoC;AAKtC,SAAS,UAAU,SAAsC;AAC9D,MAAI,YAAY,QAAS,QAAO,QAAQ;AACxC,SAAO,IAAI,QAAQ,OAAO;AAC5B;AAIO,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,KAAK,EACF,OAAO,EACP,IAAI,EACJ;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,EACL,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU,OAAO,CAAC,EAC9C,SAAS,EACT,SAAS,4BAA4B;AAAA,EACxC,SAAS,EACN,OAAO,EAAE,OAAO,CAAC,EACjB,SAAS,EACT,SAAS,2BAA2B;AAAA,EACvC,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,2DAA2D;AACzE,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,4DAA4D;AAAA,EACxE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,EAC/D,UAAU,EACP,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AACjE,CAAC;AAyCM,IAAM,yBACX;AAIK,IAAM,4BACX;AAMF,eAAsB,SACpB,QACA,OACsB;AACtB,QAAM,MAAM,MAAM,OAAO,IAAI,MAAM,KAAK;AAAA,IACtC,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,SAAS,IAAI,UACT;AAAA,MACE,QAAQ,IAAI,QAAQ;AAAA,MACpB,WAAW,IAAI,QAAQ;AAAA,MACvB,SAAS,IAAI,QAAQ;AAAA,MACrB,MAAM,IAAI,QAAQ;AAAA,MAClB,QAAQ,IAAI,QAAQ;AAAA,MACpB,YAAY,IAAI,QAAQ;AAAA,IAC1B,IACA;AAAA,IACJ,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,eAAsB,YACpB,QACA,OAC+B;AAC/B,QAAM,WAAW,MAAM,OAAO,SAAS;AAAA,IACrC,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,SAAO,SAAS,IAAI,QAAM;AAAA,IACxB,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,UAAU,EAAE;AAAA,IACZ,iBAAiB,EAAE;AAAA,IACnB,MAAM,EAAE;AAAA,IACR,eAAe,EAAE;AAAA,IACjB,SAAS,EAAE;AAAA,IACX,iBAAiB,EAAE,YAAY,SAAS;AAAA,IACxC,iBAAiB,EAAE,YAAY,SAAS;AAAA,EAC1C,EAAE;AACJ;;;ADrHO,SAAS,mBAAmB,SAA6B;AAC9D,QAAM,SAAS,UAAU,OAAO;AAChC,SAAO;AAAA,IACL,cAAc,KAAK;AAAA,MACjB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,SAAS,WAAS,SAAS,QAAQ,KAAK;AAAA,IAC1C,CAAC;AAAA,IACD,iBAAiB,KAAK;AAAA,MACpB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,SAAS,WAAS,YAAY,QAAQ,KAAK;AAAA,IAC7C,CAAC;AAAA,EACH;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/vercel.ts","../src/core.ts"],"sourcesContent":["/**\n * ChainPe tools for the **Vercel AI SDK** (`ai`).\n *\n * @example\n * ```ts\n * import { generateText } from 'ai'\n * import { anthropic } from '@ai-sdk/anthropic'\n * import { createChainPeTools } from '@chainpearc/ai-tools/vercel'\n *\n * const tools = createChainPeTools({ privateKey, autoFeedback: true })\n *\n * const { text } = await generateText({\n * model: anthropic('claude-opus-4-8'),\n * tools,\n * prompt: 'Find a summarizer agent and summarize this article: …'\n * })\n * ```\n */\nimport { tool } from 'ai'\nimport {\n getClient,\n fetchInputSchema,\n discoverInputSchema,\n runFetch,\n runDiscover,\n FETCH_TOOL_DESCRIPTION,\n DISCOVER_TOOL_DESCRIPTION,\n type ChainPeToolOptions\n} from './core.js'\n\n/**\n * Builds the ChainPe tools as a Vercel AI SDK tool set:\n * `{ chainpeFetch, discoverService }`. Spread into `tools` on `generateText` /\n * `streamText`.\n */\nexport function createChainPeTools(options: ChainPeToolOptions) {\n const client = getClient(options)\n return {\n chainpeFetch: tool({\n description: FETCH_TOOL_DESCRIPTION,\n inputSchema: fetchInputSchema,\n execute: input => runFetch(client, input)\n }),\n discoverService: tool({\n description: DISCOVER_TOOL_DESCRIPTION,\n inputSchema: discoverInputSchema,\n execute: input => runDiscover(client, input)\n })\n }\n}\n\nexport type ChainPeTools = ReturnType<typeof createChainPeTools>\nexport type { ChainPeToolOptions } from './core.js'\n","/**\n * Framework-agnostic core for the ChainPe agent tools.\n *\n * Both the Vercel AI SDK adapter (`./vercel`) and the LangChain adapter\n * (`./langchain`) are thin wrappers over the `runFetch` / `runDiscover`\n * functions here, which in turn wrap `@chainpearc/sdk`. The input schemas and\n * serializable return shapes live here so the two adapters stay identical.\n */\nimport { z } from 'zod'\nimport { ChainPe, type ChainPeOptions } from '@chainpearc/sdk'\n\n/** Either SDK constructor options, or a pre-built {@link ChainPe} instance. */\nexport type ChainPeToolOptions = ChainPeOptions | { client: ChainPe }\n\nexport function getClient(options: ChainPeToolOptions): ChainPe {\n if ('client' in options) return options.client\n return new ChainPe(options)\n}\n\n// ─── Input schemas (shared by both frameworks) ───────────────────────────────\n\nexport const fetchInputSchema = z.object({\n url: z\n .string()\n .url()\n .describe(\n 'The URL to call. If it responds 402 Payment Required, the USDC payment is signed and sent automatically.'\n ),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .optional()\n .describe('HTTP method (default GET).'),\n headers: z\n .record(z.string(), z.string())\n .optional()\n .describe('Optional request headers.'),\n body: z\n .string()\n .optional()\n .describe('Optional request body, as a string (e.g. a JSON payload).')\n})\n\nexport const discoverInputSchema = z.object({\n query: z\n .string()\n .optional()\n .describe('Free-text search over service name, description, and tags.'),\n tags: z.array(z.string()).optional().describe('Filter by tags.'),\n maxPrice: z\n .string()\n .optional()\n .describe('Maximum price per request, in USDC (e.g. \"0.05\").')\n})\n\nexport type FetchInput = z.infer<typeof fetchInputSchema>\nexport type DiscoverInput = z.infer<typeof discoverInputSchema>\n\n// ─── Serializable results ────────────────────────────────────────────────────\n\nexport interface FetchResult {\n status: number\n ok: boolean\n /** Parsed response body (object for JSON, string otherwise). */\n data: unknown\n /** Present when a USDC payment was made + settled. */\n payment?: {\n amount: string\n recipient: string\n network: string\n rail: string\n txHash?: string\n transferId?: string\n }\n /** Present when ERC-8004 feedback was posted (autoFeedback). */\n reputation?: { agentId: string; score: number; txHash: string }\n}\n\nexport interface DiscoverResultItem {\n name: string\n description: string\n endpoint: string\n pricePerRequest: string\n tags: string[]\n walletAddress: string\n agentId?: string\n /** Aggregate ERC-8004 score (0–100) or null when unrated. */\n reputationScore: number | null\n /** Number of distinct clients that left feedback. */\n reputationCount: number\n}\n\n// ─── Tool descriptions (shared) ──────────────────────────────────────────────\n\nexport const FETCH_TOOL_DESCRIPTION =\n 'Fetch a URL, automatically paying any x402 \"402 Payment Required\" response in ' +\n 'USDC on Arc. Use this to call paid HTTP APIs or hire paid AI ' +\n 'agents. Returns the response body plus payment + reputation details.'\n\nexport const DISCOVER_TOOL_DESCRIPTION =\n \"Discover paid services and AI agents through Circle's Discovery API and ChainPe's on-chain listings, \" +\n 'ranked by ERC-8004 reputation (best first). Returns each service\\'s endpoint, ' +\n 'price, and reputation so you can pick one before paying.'\n\n// ─── Execution (shared) ──────────────────────────────────────────────────────\n\nexport async function runFetch(\n client: ChainPe,\n input: FetchInput\n): Promise<FetchResult> {\n const res = await client.pay(input.url, {\n method: input.method,\n headers: input.headers,\n body: input.body\n })\n return {\n status: res.status,\n ok: res.ok,\n data: res.data,\n payment: res.payment\n ? {\n amount: res.payment.amount,\n recipient: res.payment.recipient,\n network: res.payment.network,\n rail: res.payment.rail,\n txHash: res.payment.txHash,\n transferId: res.payment.transferId\n }\n : undefined,\n reputation: res.reputation\n }\n}\n\nexport async function runDiscover(\n client: ChainPe,\n input: DiscoverInput\n): Promise<DiscoverResultItem[]> {\n const services = await client.discover({\n query: input.query,\n tags: input.tags,\n maxPrice: input.maxPrice\n })\n return services.map(s => ({\n name: s.name,\n description: s.description,\n endpoint: s.endpoint,\n pricePerRequest: s.pricePerRequest,\n tags: s.tags,\n walletAddress: s.walletAddress,\n agentId: s.agentId,\n reputationScore: s.reputation?.score ?? null,\n reputationCount: s.reputation?.count ?? 0\n }))\n}\n"],"mappings":";AAkBA,SAAS,YAAY;;;ACVrB,SAAS,SAAS;AAClB,SAAS,eAAoC;AAKtC,SAAS,UAAU,SAAsC;AAC9D,MAAI,YAAY,QAAS,QAAO,QAAQ;AACxC,SAAO,IAAI,QAAQ,OAAO;AAC5B;AAIO,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,KAAK,EACF,OAAO,EACP,IAAI,EACJ;AAAA,IACC;AAAA,EACF;AAAA,EACF,QAAQ,EACL,KAAK,CAAC,OAAO,QAAQ,OAAO,UAAU,OAAO,CAAC,EAC9C,SAAS,EACT,SAAS,4BAA4B;AAAA,EACxC,SAAS,EACN,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAC7B,SAAS,EACT,SAAS,2BAA2B;AAAA,EACvC,MAAM,EACH,OAAO,EACP,SAAS,EACT,SAAS,2DAA2D;AACzE,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,4DAA4D;AAAA,EACxE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,EAC/D,UAAU,EACP,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AACjE,CAAC;AAyCM,IAAM,yBACX;AAIK,IAAM,4BACX;AAMF,eAAsB,SACpB,QACA,OACsB;AACtB,QAAM,MAAM,MAAM,OAAO,IAAI,MAAM,KAAK;AAAA,IACtC,QAAQ,MAAM;AAAA,IACd,SAAS,MAAM;AAAA,IACf,MAAM,MAAM;AAAA,EACd,CAAC;AACD,SAAO;AAAA,IACL,QAAQ,IAAI;AAAA,IACZ,IAAI,IAAI;AAAA,IACR,MAAM,IAAI;AAAA,IACV,SAAS,IAAI,UACT;AAAA,MACE,QAAQ,IAAI,QAAQ;AAAA,MACpB,WAAW,IAAI,QAAQ;AAAA,MACvB,SAAS,IAAI,QAAQ;AAAA,MACrB,MAAM,IAAI,QAAQ;AAAA,MAClB,QAAQ,IAAI,QAAQ;AAAA,MACpB,YAAY,IAAI,QAAQ;AAAA,IAC1B,IACA;AAAA,IACJ,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,eAAsB,YACpB,QACA,OAC+B;AAC/B,QAAM,WAAW,MAAM,OAAO,SAAS;AAAA,IACrC,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,SAAO,SAAS,IAAI,QAAM;AAAA,IACxB,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,UAAU,EAAE;AAAA,IACZ,iBAAiB,EAAE;AAAA,IACnB,MAAM,EAAE;AAAA,IACR,eAAe,EAAE;AAAA,IACjB,SAAS,EAAE;AAAA,IACX,iBAAiB,EAAE,YAAY,SAAS;AAAA,IACxC,iBAAiB,EAAE,YAAY,SAAS;AAAA,EAC1C,EAAE;AACJ;;;ADrHO,SAAS,mBAAmB,SAA6B;AAC9D,QAAM,SAAS,UAAU,OAAO;AAChC,SAAO;AAAA,IACL,cAAc,KAAK;AAAA,MACjB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,SAAS,WAAS,SAAS,QAAQ,KAAK;AAAA,IAC1C,CAAC;AAAA,IACD,iBAAiB,KAAK;AAAA,MACpB,aAAa;AAAA,MACb,aAAa;AAAA,MACb,SAAS,WAAS,YAAY,QAAQ,KAAK;AAAA,IAC7C,CAAC;AAAA,EACH;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chainpearc/ai-tools",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "ChainPe agent tools: drop-in x402 pay and discover tools for the Vercel AI SDK and LangChain, on Arc.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -34,12 +34,13 @@
34
34
  "prepublishOnly": "npm run build"
35
35
  },
36
36
  "dependencies": {
37
- "@chainpearc/sdk": "^0.3.0"
37
+ "@chainpearc/sdk": "^0.4.0",
38
+ "zod": "^3.25.0 || ^4.0.0"
38
39
  },
39
40
  "peerDependencies": {
40
41
  "@langchain/core": ">=0.3.0",
41
42
  "ai": ">=4.0.0",
42
- "zod": "^3.23.0"
43
+ "zod": "^3.25.0 || ^4.0.0"
43
44
  },
44
45
  "peerDependenciesMeta": {
45
46
  "ai": {
@@ -50,13 +51,13 @@
50
51
  }
51
52
  },
52
53
  "devDependencies": {
53
- "@langchain/core": "^0.3.0",
54
+ "@langchain/core": "^1.3.5",
54
55
  "@types/node": "^22.15.21",
55
56
  "ai": "^6.0.0",
56
57
  "tsup": "^8.5.0",
57
58
  "typescript": "^5.8.3",
58
59
  "vitest": "^3.2.1",
59
- "zod": "^3.23.0"
60
+ "zod": "^4.6.7"
60
61
  },
61
62
  "keywords": [
62
63
  "x402",