npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@mondaydotcomorg/atp-vercel-sdk

v0.19.10

Published

Vercel AI SDK integration for Agent Tool Protocol

Maintainers

guykorenguykorennitzanezranitzanezrayairfeyairfesaararsaararyonaharelyonahareljoshpe-mondayjoshpe-mondayalonbehaimalonbehaimsergeyroytsergeyroytantonru92antonru92laviomrilaviomrishanibenaderetmondayshanibenaderetmondayvitalimvitalimadarmondayadarmondayaviel_mondayaviel_mondayhadaspehadasperotemtarotemtashayelmodnayshayelmodnaychristopher-nowakchristopher-nowakvladmondayvladmondayella-miella-miliorkeliorkeomermondayomermondayrutikeveshrutikeveshaf8811af8811shiraweshirawewitold-mondaywitold-mondayavihayavavihayavcsalomancsalomaneran.hubermaneran.hubermandanielabdanielabmoshikmoshikaviv_go_npmaviv_go_npmdanielb-bladepopdanielb-bladepoporibaoribaoronmelleroronmelleryglaubachyglaubachayelet-mondayayelet-mondaydanielle.ahdanielle.ahidohayidohayliran-brimer-mondayliran-brimer-mondaynavecohennavecohensaharbsaharbtombogtombogbarakbebarakbeidoyana-mondayidoyana-mondaylorin-totahlorin-totahoronmondayoronmondaynik-savchenkonik-savchenkotomerfriedmantomerfriedmanyosefwyosefwigor_budiigor_budimatanyaw2matanyaw2nirlachmannirlachmanorrgottlorrgottlsebastian-curland-mndysebastian-curland-mndyyuly-robermanyuly-robermanamirbardugoamirbardugobarcohen2barcohen2illyayuillyayutootmorantootmoranfreak4pcfreak4pcmateuszwomateuszwoamit_hanochamit_hanochdorhasondorhasongal_libermangal_libermannoamn3knoamn3kitamargolditamargoldronachmany-mondayronachmany-mondayshahafmelamedshahafmelamedyuvalbyuvalbbenpibenpidorshakeddorshakedmickael_firstmickael_firstitaycohenitaycohenmayaheilbrunmayaheilbrunventuramdventuramdudidoronudidorondoryehudadoryehudagoralthgoralthshaietshaieturi-shmueliuri-shmuelianatkatzanatkatzshalomsteinbachshalomsteinbachannasoannasoboazjboazjofirmonsingoofirmonsingoshaneeshaneeavifreegeavifreegeliorrabinliorrabinvirtservirtserarinaonmondayarinaonmondayssddnodessddnodepablo-mdcpablo-mdcamitbiranamitbiranorelhazorelhazroyna-devroyna-devsergeybrsergeybrofirc-mondayofirc-mondayavnerhaavnerhaaxelstaxelstdanielkheyfetsdanielkheyfetscarloscr.mondaycarloscr.mondaylorenzo.palorenzo.pagiuliofigiuliofiheshamgoheshamgotaniasilvataniasilvabenymondaybenymondaydanielokanindanielokaninneomi_shavitneomi_shavitshaikatzzshaikatzzarielmondayarielmondayguywaguywatomsap-mondaytomsap-mondaylukaszf-mondaylukaszf-mondayeran-coheneran-cohenliorla13liorla13maya-assayagmaya-assayagrami-mondayrami-mondayethans-mondayethans-mondaywitoldtkwitoldtkerlich75erlich75adamflooradamfloorchenbechenbelahavplahavpomernave1omernave1rankupmondayrankupmondayjeandavidjeandavidmeromcomeromcoarnonrgoarnonrgomitzafon-mondaymitzafon-mondayyoavgayoavgalueranlueranliors619liors619nirro.mondaynirro.mondaynicole_kezliknicole_kezliklaurefelaurefemichalsz-mondaymichalsz-mondaymickey_mondaymickey_mondayitamarteitamartedor-cohendor-cohenliranbinliranbinasif_mondayasif_mondaylotemkirshlotemkirshorihassid2507orihassid2507itaymndyitaymndyeyalmueyalmuamirdana115amirdana115arekze-mondayarekze-mondayibmondayibmondayvikas-mondayvikas-mondayalonmualonmulukaszfiszer-mondaylukaszfiszer-mondaymarszelun-mondaymarszelun-mondayarnonguarnonguliortalmondayliortalmondaymarekpemarekpeharelcohenharelcohenameerdoameerdokamiekamiedekelabedekelabesergeyts4sergeyts4hadascohadascoalonsadanalonsadanrama-ronrama-rongilby1gilby1galor-mondaygalor-mondayran-haveshush-mondayran-haveshush-mondaymichaelsimkinmichaelsimkinbarakbsbarakbsedenhayatedenhayatrachelikarachelikaliorfrliorfranyatchernishovanyatchernishovnadavavnadavavthierryguythierryguynirarazi.mondaynirarazi.mondayedenberdugoedenberdugoneilmonneilmonalonzialonzirongabbayrongabbayetgarmonetgarmonronniemironniemiidofinderidofindermoshe-samsonmoshe-samsonadamru-mondayadamru-mondaygauravsh-mondaygauravsh-mondayshlomiatmondayshlomiatmondayandrey-palmanandrey-palmanleonidkrleonidkrtomzohtomzohshirsharshirsharmonday-grahamlamonday-grahamlayoni-alalufyoni-alaluftomer-gillmoretomer-gillmorerobertdarobertdasaarbasaarbatalsoffertalsofferalonlealonlestasshwstasshwataliareataliareidanmondayidanmondayraneldanraneldanbarosenbarosennoarenoarerotemda10rotemda10vladislavmovladislavmoyardendvyardendvchensarchensaryuvalgryuvalgrjohhh_mondayjohhh_mondayandreihryhoryeuandreihryhoryeuinbaldginbaldgjosephsamondayjosephsamondaynoasharvitnoasharvitkubakolybaczkubakolybaczbanueldobanueldomoriatmoriatmatanlamatanlaavivgiavivgialonschatzalonschatzidanoridanorshayo-arshayo-arshaharga4shaharga4michallormichallorsrdjan-mondaysrdjan-mondayggaallggaallshanmondayshanmondaytomerzlotomerzloophirdoophirdojohnny-morjohnny-morfilip-daca-mondayfilip-daca-mondayurielwasyngurielwasyngchrisbamondaychrisbamondayamitmazor37amitmazor37jakubmojakubmoflistflistoded_by_mondayoded_by_mondaymichaljamichaljatalahmondaytalahmondayamitcoamitcogalspmondaygalspmondayorelco2orelco2eyalleeyallealexjalbaalexjalbaadva-gonshadva-gonshorcomondayorcomondayronov1ronov1shoshanyshoshanygalko_mondaygalko_mondaymaciej-mondaymaciej-mondayalonbrimeralonbrimeraviv_goaviv_gobernardpo-mondaybernardpo-mondayeviatharmeviatharmshayalshayalronavmondayronavmondaygal_finger_mondaygal_finger_mondaymichaelimasmichaelimasyoavteyoavtemarta-mondaymarta-mondayarielklarielklmichalbelmichalbeldvirpedvirpeshaharshakishaharshakitomasztarczynskitomasztarczynskishalevkeshalevkeransarusiransarusimaor-barazanimaor-barazanimarcinko-mondaymarcinko-mondaydanielga-mondaydanielga-mondayeliyapleliyaplsapir_barsapir_baryavgenypayavgenypaomergrinomergrinigorczigorczmayaismayaistim-mondaytim-mondaygil_zilbermangil_zilbermansandeepkmondaysandeepkmondayleimoniomndleimoniomndadirhadirhgrzegorzrojekgrzegorzrojekorilaorilatomhousmantomhousmantomkochtomkochromkadriaromkadriayotamhermesyotamhermesroni-ben-aharonroni-ben-aharontomnisimtomnisimmoro256moro256litalwlitalwshirazbehar2shirazbehar2cezarylacezarylanirfridnirfridvasilyklvasilykldorbidorbiaviel_hershkovitzaviel_hershkovitzmayabarkanmayabarkanmatanmamanmatanmamanbenmamondaybenmamondaydoron.brikmandoron.brikmanliorl-mondayliorl-mondaytalhararitalhararitalshetalshetomersttomersttsemachlitsemachlilotanyuranlotanyuranramhillelramhillelidangaidangapiotrdu-mondaypiotrdu-mondayephraimgrephraimgrjakubso2749jakubso2749yevgeniliyevgenilidorsimmdorsimmmichaelvamondaymichaelvamondaygioraguatmondaygioraguatmondayyahorzhyahorzhshaharzishaharzianastasiyakhanastasiyakhomrialomrialofir-efraimofir-efraimmiloszpi-mondaymiloszpi-mondaykarolszmndykarolszmndyyardengavyardengavdanielmo-mondaydanielmo-mondaytalibl.mondaytalibl.mondayamirkeamirkeantonigmantonigmashb22ashb22neyemaawneyemaawrzmndrzmndrangr-mondayrangr-mondaytomer.mondaytomer.mondayyossisaadi.mondayyossisaadi.mondayofekkiofekkijonathansejonathansetheidotheidoguyhadasguyhadasronco99ronco99olegsh_mondayolegsh_mondayjr-mondayjr-mondayomerraomerradord2dord2giladar-mondaygiladar-mondaygiladscgiladscyuliagoldbergyuliagoldbergpiotrkopiotrkoyonatanbi-mondayyonatanbi-mondayaranweb-mondayaranweb-mondayhananmahananmaeladna-mondayeladna-mondaynaorsnaorssamwisamwilukaszmichlukaszmichuziabuziabasafswasafswadmonsaadmonsatalkortalkorv0vs-mondayv0vs-mondayamitbenmoramitbenmoravivzafraniavivzafraniyoniho_myoniho_mpinizopinizovickyhivickyhitiagopi-mondaytiagopi-mondayliangcaoldnliangcaoldnidanklingeridanklingerdanielepdanielepidanmoralidanmoralorborochovichorborochovichadirmonadirmontomergatomerganegevmanegevmayosia1990yosia1990rivkaungarrivkaungarmatbec96matbec96eliyahumanymondayeliyahumanymondayadirhaziz2adirhaziz2galbenoziliomdygalbenoziliomdyori-mondayori-mondaykuzalekskuzaleksnatanrolnik_mndnatanrolnik_mndkapusjkapusjavileviavileviliranroliranroorizvidamondayorizvidamondaykamalwo-mondaykamalwo-mondayasaf472mondayasaf472mondayguygotguygotnoamco-mondaynoamco-mondaydavidgohbergdavidgohbergnurkiewicznurkiewicznoamst-mondaynoamst-mondaymichael-azimovmichael-azimovnitzanshinitzanshisaridansaridanidanpedidanpedronilaronilaitaykalitaykalmoshiko_ben_avimoshiko_ben_avimondayshpiglifymondayshpiglifynoamagoodmannoamagoodmandimaaldimaalgadshgadshrotemdurotemduroishroishcmp-mondaycmp-mondaymaxime.mondaymaxime.mondaydanielvadanielvagabriel.amramgabriel.amraminbalziinbalzitomasz-fijalkowski-mondaytomasz-fijalkowski-mondayalmogrualmogrudaniilvodaniilvomondayjohnmondayjohnrotemassa123rotemassa123bashanyebashanyetomaszlamondaytomaszlamondayeden-eitanieden-eitanitom-katztom-katzlihibmlihibmdoniawadoniawaedogr1edogr1yonatanelyonataneleladdoeladdolukasz-dudzinskilukasz-dudzinskitom_shlomitom_shlomiodedsandakodedsandakhodayaishodayaisalexandrzhalexandrzhmichalpl-mondaymichalpl-mondayiradcoiradconitzanholmes718nitzanholmes718eliasgaeliasgaidoagidoagitaysimitaysimjacksnettjacksnetteladmondayeladmondaytomasfeldertomasfelderibgudmanibgudmanalexjialexjiitcerbyitcerbybrittdabrittdashahargmndshahargmndkevinmondaykevinmondaymortzmondaymortzmondayyoniarvivyoniarvivmarcin-gabmarcin-gabalonedelmanmonday1alonedelmanmonday1mulhamhamulhamhasheenanashsheenanashmaslomonday2maslomonday2talbamatalbamakuba_niemieckuba_niemiecyoavroyoavrocoralincoralinlaver_mondaylaver_mondaysimohanounasimohanounaohad-katzavohad-katzavmeytalfremeytalfredavidbr1davidbr1awallace327awallace327romanshapromanshapzivamzivamdh94dh94adamyahidadamyahidhagaiwehagaiweyoni-mondayyoni-mondayomerfoxomerfoxrivkapelegrivkapelegjakubrohlederjakubrohledertomaszjackowiaktomaszjackowiakfabiotaatmondayfabiotaatmondayishandua-mondayishandua-mondayhadarahhadarahmatthewtomatthewtoilyamezilyamezdamianmarek-mondaydamianmarek-mondayandrewlo-mondayandrewlo-mondaymaxdv-4016maxdv-4016shanybarshanybarsefinisefinikatedubouskayakatedubouskayamaor-karomaor-karonovrosenamnnovrosenamnjohnnpmmanjohnnpmmanharveyr-mondayharveyr-mondayyuval-moshe-mndyyuval-moshe-mndyyardenliyardenlisagilinshitssagilinshitsshaygrshaygrjeremybarnejeremybarneidoziidozibarakzabarakzashamilgshamilgibukun-mondayibukun-mondaysagibarkol89sagibarkol89alonsegalalonsegalofrichenofrichenyuvallev-mondayyuvallev-mondayshannon-mondayshannon-mondayjoel-mondayjoel-mondaymichaelozmondaymichaelozmondaybenlivnibenlivniapeslinapeslinnaorsolmondaynaorsolmondaysergeytsibulnik3sergeytsibulnik3jonathanadlerjonathanadlerliatyaliatyaalonmorgenalonmorgenellaportnovellaportnovadelebeadelebemichaelarmichaelaritamarhiitamarhileahorlinleahorlinruthiedarruthiedaramirfeamirferonykrishtalronykrishtalitaypa777itaypa777reutlevyreutlevyeithanhollandermondayeithanhollandermondaybenhabenhagiladomgiladomyuriisrohyiyuriisrohyiamirnajjaramirnajjarmohamedig1mohamedig1raunaq-mondayraunaq-mondayodedgoodedgonuri-mondaynuri-mondaysreekanthjusreekanthjunavelenavelelironamlironamzivha-mondayzivha-mondayshirzashirzazvimintszvimintsasif_d_dromiasif_d_dromibroster.mondaybroster.mondayhilakislevhilakislevtommattommateran_zidkiyaeran_zidkiyastavrastavraozkamaozkamaofirstofirstcarmeldahancarmeldahandordvdordvalonadaalonadadvirshdvirshtamarshetamarshemark-watkin-mondaymark-watkin-mondayshimony-urielshimony-urieltzvico-mondaytzvico-mondayasafbashiriasafbashiriohadleshnoohadleshnoor-mondayor-mondayaviramashkenazi-monaviramashkenazi-monjihyunum-mondayjihyunum-mondaydanielkorichdanielkorichguymarushchenkoguymarushchenkobruchim_mondaybruchim_mondaytomda-mondaytomda-mondaymiroslawwomiroslawwonickday-mondaynickday-mondayyuvalpadanyuvalpadanamalpiamalpiroeiyaroeiyaiddoaliddoalshirlyrashirlyramichaldamichaldayuvalezyuvalezkerensokerensoyaarmaypazyaarmaypazroiemondayroiemondayhadarlibmanhadarlibmannetaezra1netaezra1guybe-mondayguybe-mondayamitsabag1amitsabag1lorengolorengomusayedahmusayedahamitreamitreedendoron-mondayedendoron-mondayfranekmondayfranekmondaylinoymarganlinoymargannoam-yehudanoam-yehudasergeisasergeisamatanmematanmeyoavkulayoavkularoniavroniavmonadavmonadavsofivasofivaprzemyslawbprzemyslawbadiknafoadiknafoalekseiilalekseiilandreiyuandreiyubargaldbargaldtbreuerweiltbreuerweilyanivridelyanivridelmichalbudziakmichalbudziakdananodananourasmuurasmulayanhalayanhamoshe1100moshe1100moranossmoranosssergeym-mondaysergeym-mondaylevkomondaylevkomondayyonatanc163yonatanc163matkotmatkotolegkaplunolegkaplunohad-mondayohad-mondayandreyolandreyolnetta-snetta-schezkibotwinickchezkibotwinickwitoswitosguysimaimondayguysimaimonday

Readme

@mondaydotcomorg/atp-vercel-ai-sdk

Vercel AI SDK integration for Agent Tool Protocol with production-ready features.

Overview

This package integrates ATP with Vercel AI SDK, enabling agents to generate and execute ATP code as tools. Includes support for human-in-the-loop approvals, LLM sampling, and embeddings.

Installation

npm install @mondaydotcomorg/atp-vercel-ai-sdk ai @ai-sdk/openai

Architecture

graph TB
    Agent[Vercel AI SDK Agent] --> Tools[ATP Tools]
    Tools --> Client[VercelAIATPClient]

    Client --> Server[ATP Server]
    Server --> Runtime[Runtime APIs]

    Runtime --> LLM[atp.llm.*]
    Runtime --> Embed[atp.embedding.*]
    Runtime --> Approval[atp.approval.*]

    LLM --> Callback[Client LLM Callback]
    Embed --> EmbedCallback[Client Embedding Callback]
    Approval --> Handler[Approval Handler]

Features

  • 🤖 Vercel AI SDK Tools - Use ATP as tools with generateText and streamText
  • 🔄 Multi-Step Execution - Full integration with Vercel AI SDK's maxSteps parameter
  • 🧠 LLM Sampling - atp.llm.call() routes to your Vercel AI SDK model
  • 🔍 Embedding Support - atp.embedding.* routes to your embeddings model
  • Approval Workflows - Human-in-the-loop via async callbacks
  • 📡 Streaming Support - Works with both generateText and streamText
  • 📝 TypeScript - Full type safety

Quick Start

Basic Agent with Tools

import { createATPTools } from '@mondaydotcomorg/atp-vercel-ai-sdk';
import { openai } from '@ai-sdk/openai';
import { generateText } from 'ai';

const model = openai('gpt-4o');

const { tools } = await createATPTools({
	serverUrl: 'http://localhost:3333',
	headers: { Authorization: 'Bearer your-api-key' },
	model,
	approvalHandler: async (message, context) => {
		console.log('Approval needed:', message);
		return true;
	},
});

const result = await generateText({
	model,
	system: 'You can execute TypeScript code using ATP tools',
	prompt: 'Use ATP to call an LLM and get a creative product idea',
	tools,
	maxSteps: 5,
});

With Streaming

import { createATPTools } from '@mondaydotcomorg/atp-vercel-ai-sdk';
import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';

const model = openai('gpt-4o');

const { tools } = await createATPTools({
	serverUrl: 'http://localhost:3333',
	headers: { Authorization: 'Bearer your-api-key' },
	model,
	approvalHandler: async () => true,
});

const result = await streamText({
	model,
	prompt: 'Use ATP to generate code',
	tools,
	maxSteps: 5,
});

for await (const chunk of result.textStream) {
	process.stdout.write(chunk);
}

With Embeddings

import { createATPTools } from '@mondaydotcomorg/atp-vercel-ai-sdk';
import { openai } from '@ai-sdk/openai';
import { embed } from 'ai';

const model = openai('gpt-4o');

const embeddings = {
	embed: async (text: string) => {
		const result = await embed({
			model: openai.embedding('text-embedding-3-small'),
			value: text,
		});
		return result.embedding;
	},
};

const { tools } = await createATPTools({
	serverUrl: 'http://localhost:3333',
	headers: { Authorization: 'Bearer your-api-key' },
	model,
	embeddings,
});

// Agent can now use atp.embedding.embed() in code

How It Works

ATP Runtime in Vercel AI SDK

When agents use ATP tools, they can generate TypeScript code using ATP's runtime APIs:

// Agent generates this code:
const idea = await atp.llm.call({
	prompt: 'Generate a product idea',
});

// Store embedding for semantic search
const embeddingId = await atp.embedding.embed(idea);

// Request approval
const approval = await atp.approval.request(`Launch product: ${idea}?`, { idea });

if (approval.approved) {
	return await atp.llm.call({
		prompt: `Create marketing copy for: ${idea}`,
	});
}

LLM Sampling

atp.llm.call() routes to your Vercel AI SDK model:

  • Uses the same model as your agent
  • Fresh context for sub-reasoning
  • Supports call(), extract(), classify()
// In ATP code:
const analysis = await atp.llm.call({
	prompt: 'Analyze this data: ' + JSON.stringify(data),
	temperature: 0.7,
});

// Structured extraction
const structured = await atp.llm.extract({
	prompt: 'Extract key information',
	schema: z.object({
		name: z.string(),
		age: z.number(),
	}),
});

Approval Mechanism

When ATP code calls atp.approval.request(), your async handler is invoked:

const { tools } = await createATPTools({
	serverUrl: 'http://localhost:3333',
	headers: { Authorization: 'Bearer your-api-key' },
	model,
	approvalHandler: async (message, context) => {
		// Option 1: CLI prompt
		return confirm(message);

		// Option 2: Webhook notification
		await sendSlackNotification(message);
		return await waitForWebhookResponse();

		// Option 3: Database queue
		await db.approvals.create({ message, context });
		return await pollForApproval();
	},
});

API Reference

createATPTools()

async function createATPTools(options: CreateATPToolsOptions): Promise<ATPToolsResult>;

Options:

interface CreateATPToolsOptions {
	serverUrl: string;
	headers?: Record<string, string>;
	model: any;
	embeddings?: EmbeddingProvider;
	approvalHandler?: ApprovalHandler;
	defaultExecutionConfig?: Partial<ExecutionConfig>;
	hooks?: ClientHooks;
}

Returns:

interface ATPToolsResult {
	client: VercelAIATPClient;
	tools: Record<string, any>;
}

VercelAIATPClient

class VercelAIATPClient {
	execute(code: string, config?: ExecutionConfig): Promise<ExecutionResult>;
	getTypeDefinitions(): string;
	getUnderlyingClient(): AgentToolProtocolClient;
}

Production Patterns

Webhook-Based Approval

const pendingApprovals = new Map();

const approvalHandler = async (message: string, context?: any) => {
	const approvalId = generateId();

	await db.approvals.create({
		id: approvalId,
		message,
		context,
		status: 'pending',
	});

	await sendSlackNotification({
		channel: '#approvals',
		text: message,
		actions: [
			{ type: 'button', text: 'Approve', action_id: `approve_${approvalId}` },
			{ type: 'button', text: 'Deny', action_id: `deny_${approvalId}` },
		],
	});

	return new Promise((resolve) => {
		pendingApprovals.set(approvalId, resolve);
		setTimeout(() => {
			pendingApprovals.delete(approvalId);
			resolve(false);
		}, 300000);
	});
};

app.post('/slack/actions', async (req, res) => {
	const { action_id } = req.body;
	const approvalId = action_id.replace(/^(approve|deny)_/, '');
	const approved = action_id.startsWith('approve');

	const resolve = pendingApprovals.get(approvalId);
	if (resolve) {
		resolve(approved);
		pendingApprovals.delete(approvalId);
	}

	res.json({ ok: true });
});

Multiple Sequential Approvals

// Agent generates ATP code with multiple approvals:
const step1 = await atp.approval.request('Approve step 1?');
if (!step1.approved) return { cancelled: true };

const step2 = await atp.approval.request('Approve step 2?');
if (!step2.approved) return { cancelled: true };

return { success: true };

Each atp.approval.request() triggers your approval handler.

Error Handling

const { tools } = await createATPTools({
	serverUrl: 'http://localhost:3333',
	headers: { Authorization: 'Bearer your-api-key' },
	model,
	approvalHandler: async (message) => {
		try {
			return await requestApproval(message);
		} catch (error) {
			console.error('Approval error:', error);
			return false;
		}
	},
});

Comparison with LangChain Integration

| Feature | Vercel AI SDK | LangChain | | ------------------ | ----------------- | ------------------------ | | Tool Format | tool() function | Tool classes | | Agent Type | ToolLoopAgent | ReActAgent | | Approval Mechanism | Async callbacks | Interrupts + Checkpoints | | State Persistence | Custom | Built-in (LangGraph) | | Streaming | Native support | Via LangChain | | Model Integration | generateText | ChatModel.invoke |

Examples

See examples/vercel-ai-sdk-example/:

  • agent.ts - Basic ToolLoopAgent with CLI approvals
  • streaming.ts - Streaming responses with ATP tools
  • webhook-approval.ts - Production webhook-based approvals

RAG with Embeddings

import { createATPTools } from '@mondaydotcomorg/atp-vercel-ai-sdk';
import { openai } from '@ai-sdk/openai';
import { embed } from 'ai';

const model = openai('gpt-4o');

const embeddings = {
	embed: async (text: string) => {
		const result = await embed({
			model: openai.embedding('text-embedding-3-small'),
			value: text,
		});
		return result.embedding;
	},
};

const { tools } = await createATPTools({
	serverUrl: 'http://localhost:3333',
	headers: { Authorization: 'Bearer your-api-key' },
	model,
	embeddings,
});

const result = await generateText({
	model,
	tools,
	maxSteps: 5,
	prompt: `Use ATP to:
    1. Embed these documents: ["AI is...", "ML is...", "DL is..."]
    2. Search for content similar to "neural networks"
    3. Use atp.llm.call() to answer based on results`,
});

TypeScript Support

import type {
	VercelAIATPClient,
	VercelAIATPClientOptions,
	ApprovalRequest,
	ApprovalResponse,
	ApprovalHandler,
	CreateATPToolsOptions,
	ATPToolsResult,
	EmbeddingProvider,
} from '@mondaydotcomorg/atp-vercel-ai-sdk';

Requirements

  • Node.js 18+
  • TypeScript 5.0+
  • ai ^4.0.0
  • Vercel AI SDK provider (e.g., @ai-sdk/openai)

License

MIT

Learn More