TypeScript Client Setup
The AgentMark client is configured in agentmark.client.ts. It connects your prompts to AI models, tools, evaluations, and prompt loading. This file is auto-generated by npm create agentmark@latest — you can customize it after setup.
Choose Your Adapter
AI SDK (Vercel)
Claude Agent SDK
Mastra
npm install @agentmark-ai/ai-sdk-v5-adapter @agentmark-ai/loader-api @ai-sdk/openai
import {
createAgentMarkClient,
VercelAIModelRegistry,
} from "@agentmark-ai/ai-sdk-v5-adapter";
import { ApiLoader } from "@agentmark-ai/loader-api";
import { openai } from "@ai-sdk/openai";
const loader =
process.env.NODE_ENV === "development"
? ApiLoader.local({
baseUrl: process.env.AGENTMARK_BASE_URL || "http://localhost:9418",
})
: ApiLoader.cloud({
apiKey: process.env.AGENTMARK_API_KEY!,
appId: process.env.AGENTMARK_APP_ID!,
});
const modelRegistry = new VercelAIModelRegistry()
.registerModels(["gpt-4o", "gpt-4o-mini"], (name) => openai(name))
.registerModels(["dall-e-3"], (name) => openai.image(name))
.registerModels(["tts-1-hd"], (name) => openai.speech(name));
export const client = createAgentMarkClient({
loader,
modelRegistry,
});
Use with Vercel AI SDK functions: generateText(), generateObject(), streamText(), streamObject().npm install @agentmark-ai/claude-agent-sdk-v0-adapter @agentmark-ai/loader-api
import {
createAgentMarkClient,
ClaudeAgentModelRegistry,
} from "@agentmark-ai/claude-agent-sdk-v0-adapter";
import { ApiLoader } from "@agentmark-ai/loader-api";
const loader =
process.env.NODE_ENV === "development"
? ApiLoader.local({
baseUrl: process.env.AGENTMARK_BASE_URL || "http://localhost:9418",
})
: ApiLoader.cloud({
apiKey: process.env.AGENTMARK_API_KEY!,
appId: process.env.AGENTMARK_APP_ID!,
});
const modelRegistry = ClaudeAgentModelRegistry.createDefault();
export const client = createAgentMarkClient({
loader,
modelRegistry,
adapterOptions: {
permissionMode: "bypassPermissions",
maxTurns: 20,
},
});
Adapter options:| Option | Description |
|---|
permissionMode | 'default', 'acceptEdits', 'bypassPermissions', or 'plan' |
maxTurns | Maximum number of agent turns |
maxBudgetUsd | Spending limit per run |
cwd | Working directory for the agent |
allowedTools | Whitelist of tool names |
disallowedTools | Blacklist of tool names |
npm install @agentmark-ai/mastra-v0-adapter @agentmark-ai/loader-api @ai-sdk/openai
import {
createAgentMarkClient,
MastraModelRegistry,
} from "@agentmark-ai/mastra-v0-adapter";
import { ApiLoader } from "@agentmark-ai/loader-api";
import { openai } from "@ai-sdk/openai";
const loader =
process.env.NODE_ENV === "development"
? ApiLoader.local({
baseUrl: process.env.AGENTMARK_BASE_URL || "http://localhost:9418",
})
: ApiLoader.cloud({
apiKey: process.env.AGENTMARK_API_KEY!,
appId: process.env.AGENTMARK_APP_ID!,
});
const modelRegistry = new MastraModelRegistry()
.registerModels(["gpt-4o", "gpt-4o-mini"], (name) => openai(name));
export const client = createAgentMarkClient({
loader,
modelRegistry,
});
Model Registry
Register models by name, mapping them to provider-specific constructors:
const modelRegistry = new VercelAIModelRegistry()
// Text models
.registerModels(["gpt-4o", "gpt-4o-mini"], (name) => openai(name))
// Image models
.registerModels(["dall-e-3"], (name) => openai.image(name))
// Speech models
.registerModels(["tts-1-hd"], (name) => openai.speech(name));
Model names in the registry must match the model_name in your prompt frontmatter.
Prompt Loading
The loader determines how prompts are fetched at runtime:
// Local — loads from dev server (development)
const loader = ApiLoader.local({
baseUrl: "http://localhost:9418",
});
// Cloud — loads from AgentMark CDN (production)
const loader = ApiLoader.cloud({
apiKey: process.env.AGENTMARK_API_KEY!,
appId: process.env.AGENTMARK_APP_ID!,
});
Prompts are cached client-side with a 60-second TTL. Repeated calls to loadTextPrompt() within the TTL return the cached version without a network request.
Adding Tools
Pass tools to the client via the tools option:
import { tool } from "ai";
import { z } from "zod";
export const client = createAgentMarkClient({
loader,
modelRegistry,
tools: {
calculate: tool({
description: "Performs arithmetic calculations",
parameters: z.object({
expression: z.string(),
}),
execute: async ({ expression }) => {
return { result: Function(`"use strict"; return (${expression})`)() };
},
}),
},
});
See Tools & Agents for more.
Full Reference
For all configuration options including evals, MCP servers, and advanced loader options, see Client Config.
Have Questions?
We’re here to help! Choose the best way to reach us: