---
title: Agent Enablement Toolkit
slug: ai/agent-enablement-toolkit
excerpt: >-
  Build AI-powered payment agents with LangChain, Vercel AI SDK, and the OpenAI
  Agents SDK using Pine Labs Online APIs.
hidden: false
sidebar_order: 4
metadata:
  title: "Agent Enablement Toolkit — LangChain, OpenAI & Vercel AI | Pine Labs"
  description: >-
    Build AI payment agents with Pine Labs toolkit. Integrate LangChain, OpenAI Agents SDK, and Vercel AI SDK with function calling for orders, payments, refunds.
  keywords: "AI payment agent, LangChain payments, OpenAI Agents SDK, Vercel AI SDK, function calling, AI toolkit, payment automation, agent framework"
  robots: index
---
## Overview

The **Pine Labs Online Agent Toolkit** lets you build AI-powered payment agents with **LangChain**, **Vercel AI SDK**, and the **OpenAI Agents SDK**. It exposes Pine Labs Online payment APIs as agent tools via function calling, so your agents can create orders, process payments, and manage transactions programmatically.

## Prerequisites

Complete the following prerequisites before building PineLabs payment agents.

1. Create Pine Labs Online Merchant Account. You can register to Pine Labs Online Merchant Account <a href="https://dashboardv2.pluralonline.com/signup" target="_blank" >**here**</a>.
2. After Creating Successfully, <a href="https://dashboardv2.pluralonline.com/login" target="_blank">**Login**</a> to our Dashboard and generate the **`client_id`** and **`client_secret`**.
3. Ensure **`Node.js`** version **`18`** or later is installed.

## Framework support

The toolkit supports the following frameworks, each accessible through a dedicated sub-path.

| Framework     | Import Path                                | Description            |
| :------------ | :----------------------------------------- | :--------------------- |
| OpenAI        | `@plural_pinelabs/agent-toolkit/openai`    | For Open AI Agents SDK |
| LangChain     | `@plural_pinelabs/agent-toolkit/langchain` | For LangChain agents   |
| Vercel AI SDK | `@plural_pinelabs/agent-toolkit/ai-sdk`    | For Vercel's AI SDK    |

## Installation

Use the below code to Install the toolkit using your preferred package manager:

```Text npm
npm install @plural_pinelabs/agent-toolkit
```
```Text yarn
yarn add @plural_pinelabs/agent-toolkit
```
```Text pnpm
pnpm add @plural_pinelabs/agent-toolkit
```

## Available Tools

The table below shows the list of PineLabs Tools available.

| Tool               | Description                                           |
| :----------------- | :---------------------------------------------------- |
| **`createOrder`**  | Use this tool to create an Order.                     |
| **`getOrder`**     | Use this tool to retrieve the order by order ID.      |
| **`cancelOrder`**  | Use this tool to cancel the Payment against an order. |
| **`createRefund`** | Use this tool to initiate a refund against an order.  |

## Sample Codes

Use the below code samples to test and integrate quickly.

[block:html]
{
  "html": "<style>\n\n.docs-container {\n  width: 100%;\n  margin: 0 auto;\n}\n\n/* Hide all radio inputs */\ninput[type=\"radio\"] {\n  display: none;\n}\n\n/* Main Tabs Styling */\n.main-tabs-list {\n  display: flex;\n  gap: 4px;\n  border-bottom: 1px solid #e5e7eb;\n  margin-bottom: 24px;\n}\n\n.main-tab {\n  padding: 12px 16px;\n  font-size: 14px;\n  font-weight: 500;\n  color: #4b5563;\n  border-bottom: 2px solid transparent;\n  cursor: pointer;\n  transition: all 0.2s;\n  user-select: none;\n}\n\n.main-tab:hover {\n  color: #111827;\n}\n\n/* Active state for main tabs */\n#tab-openai:checked ~ .main-tabs-list label[for=\"tab-openai\"],\n#tab-langchain:checked ~ .main-tabs-list label[for=\"tab-langchain\"],\n#tab-vercel:checked ~ .main-tabs-list label[for=\"tab-vercel\"] {\n  color: #003434;\n  border-bottom-color: #002323;\n}\n\n/* Hide all tab content by default */\n.tab-content {\n  display: none;\n}\n\n/* Show tab content when corresponding radio is checked */\n#tab-openai:checked ~ #content-openai,\n#tab-langchain:checked ~ #content-langchain,\n#tab-vercel:checked ~ #content-vercel {\n  display: block;\n}\n\n/* Sub-tabs Styling */\n.subtabs-list {\n  display: flex;\n  gap: 4px;\n  background-color: #f3f4f6;\n  border-radius: 8px;\n  width: fit-content;\n  margin-bottom: 16px;\n}\n\n.subtab {\n  padding: 8px 16px;\n  font-size: 14px;\n  font-weight: 500;\n  color: #374151;\n  border-radius: 6px;\n  cursor: pointer;\n  transition: all 0.2s;\n  user-select: none;\n}\n\n/* Active state for sub-tabs */\n#subtab-agents:checked ~ #content-openai .subtabs-list label[for=\"subtab-agents\"],\n#subtab-chat:checked ~ #content-openai .subtabs-list label[for=\"subtab-chat\"] {\n  background-color: #003434;\n  color: #fff;\n  box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n}\n\n/* Hide all subtab content by default */\n.subtab-content {\n  display: none;\n}\n\n/* Show subtab content when corresponding radio is checked */\n#subtab-agents:checked ~ #content-openai #content-agents,\n#subtab-chat:checked ~ #content-openai #content-chat {\n  display: block;\n}\n\n/* Code Block Styling */\n.code-block {\n  position: relative;\n  margin: 16px 0;\n}\n\n.code-block pre {\n  margin: 0;\n  padding: 24px;\n  background-color: #1e1e1e;\n  border-radius: 8px;\n  overflow-x: auto;\n}\n\n.code-block code {\n  font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n  font-size: 14px;\n  line-height: 1.5;\n  color: #d4d4d4;\n  display: block;\n}\n\n/* Syntax Highlighting - TypeScript */\n.language-typescript {\n  color: #d4d4d4;\n}\n\n/* TypeScript Keywords */\n.keyword {\n  color: #569cd6;\n}\n\n/* TypeScript Strings */\n.string {\n  color: #ce9178;\n}\n\n/* TypeScript Functions and Methods */\n.function {\n  color: #dcdcaa;\n}\n\n/* TypeScript Variables and Constants */\n.variable {\n  color: #9cdcfe;\n}\n\n/* TypeScript Comments */\n.comment {\n  color: #6a9955;\n  font-style: italic;\n}\n\n/* TypeScript Types and Classes */\n.type {\n  color: #4ec9b0;\n}\n\n/* TypeScript Operators */\n.operator {\n  color: #d4d4d4;\n}\n\n/* TypeScript Punctuation */\n.punctuation {\n  color: #d4d4d4;\n}\n\n/* TypeScript Numbers */\n.number {\n  color: #b5cea8;\n}\n\n/* Syntax Highlighting - JSON */\n.language-json {\n  color: #d4d4d4;\n}\n\n/* JSON Property Names */\n.json-property {\n  color: #9cdcfe;\n}\n\n/* JSON String Values */\n.json-string {\n  color: #ce9178;\n}\n\n/* JSON Number Values */\n.json-number {\n  color: #b5cea8;\n}\n\n/* JSON Punctuation */\n.json-punctuation {\n  color: #d4d4d4;\n}\n\n/* Result Section */\n.result-section {\n  margin-top: 24px;\n}\n\n.result-title {\n  font-size: 14px;\n  font-weight: 500;\n  color: #374151;\n  margin: 0 0 12px 0;\n}\n\n/* Responsive Design */\n@media (max-width: 768px) {\n  .docs-container {\n    padding: 16px;\n  }\n\n  .main-tab {\n    padding: 10px 12px;\n    font-size: 13px;\n  }\n\n  .subtab {\n    padding: 6px 12px;\n    font-size: 13px;\n  }\n\n  .code-block pre {\n    padding: 16px;\n    font-size: 12px;\n  }\n}\n\n/* Scrollbar Styling for Code Blocks */\n.code-block pre::-webkit-scrollbar {\n  height: 8px;\n}\n\n.code-block pre::-webkit-scrollbar-track {\n  background: #2d2d2d;\n  border-radius: 4px;\n}\n\n.code-block pre::-webkit-scrollbar-thumb {\n  background: #4a4a4a;\n  border-radius: 4px;\n}\n\n.code-block pre::-webkit-scrollbar-thumb:hover {\n  background: #5a5a5a;\n}\n</style>"
}
[/block]

[block:html]
{
  "html": "  <div class=\"docs-container\">\n    <!-- Main Tabs Radio Inputs (Hidden) -->\n    <input type=\"radio\" id=\"tab-openai\" name=\"main-tabs\" checked>\n    <input type=\"radio\" id=\"tab-langchain\" name=\"main-tabs\">\n    <input type=\"radio\" id=\"tab-vercel\" name=\"main-tabs\">\n    \n    <!-- OpenAI Sub-tabs Radio Inputs (Hidden) -->\n    <input type=\"radio\" id=\"subtab-agents\" name=\"openai-subtabs\" checked>\n    <input type=\"radio\" id=\"subtab-chat\" name=\"openai-subtabs\">\n\n    <!-- Main Tabs Navigation -->\n    <div class=\"main-tabs-list\">\n      <label for=\"tab-openai\" class=\"main-tab\">OpenAI</label>\n      <label for=\"tab-langchain\" class=\"main-tab\">LangChain</label>\n      <label for=\"tab-vercel\" class=\"main-tab\">Vercel AI SDK</label>\n    </div>\n\n    <!-- OpenAI Tab Content -->\n    <div class=\"tab-content\" id=\"content-openai\">\n      <!-- OpenAI Sub-tabs -->\n      <div class=\"subtabs-list\">\n        <label for=\"subtab-agents\" class=\"subtab\">Agents SDK</label>\n        <label for=\"subtab-chat\" class=\"subtab\">Chat Completion</label>\n      </div>\n\n      <!-- Agents SDK Content -->\n      <div class=\"subtab-content\" id=\"content-agents\">\n        <div class=\"code-block\">\n          <pre><code class=\"language-typescript\"><span class=\"keyword\">import</span> <span class=\"punctuation\">{</span> <span class=\"variable\">Agent</span><span class=\"punctuation\">,</span> <span class=\"variable\">run</span> <span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'@openai/agents'</span><span class=\"punctuation\">;</span>\n<span class=\"keyword\">import</span> <span class=\"punctuation\">{</span>\n  <span class=\"variable\">PinelabsAgentToolkit</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">pinelabsEnvironment</span><span class=\"punctuation\">,</span>\n<span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'@plural_pinelabs/agent-toolkit/openai'</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">pinelabs</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"type\">PinelabsAgentToolkit</span><span class=\"punctuation\">(</span>\n  <span class=\"variable\">pinelabsEnvironment</span><span class=\"punctuation\">.</span><span class=\"variable\">UAT</span><span class=\"punctuation\">,</span>               <span class=\"comment\">// or pinelabsEnvironment.PRODUCTION</span>\n  <span class=\"variable\">process</span><span class=\"punctuation\">.</span><span class=\"variable\">env</span><span class=\"punctuation\">.</span><span class=\"variable\">PINE_CLIENT_ID</span><span class=\"operator\">!</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">process</span><span class=\"punctuation\">.</span><span class=\"variable\">env</span><span class=\"punctuation\">.</span><span class=\"variable\">PINE_CLIENT_SECRET</span><span class=\"operator\">!</span>\n<span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">agent</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"type\">Agent</span><span class=\"punctuation\">(</span><span class=\"punctuation\">{</span>\n  <span class=\"variable\">name</span><span class=\"punctuation\">:</span> <span class=\"string\">'Payment Agent'</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">instructions</span><span class=\"punctuation\">:</span> <span class=\"string\">'You are a helpful payment assistant.'</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">model</span><span class=\"punctuation\">:</span> <span class=\"string\">'gpt-4o'</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">tools</span><span class=\"punctuation\">:</span> <span class=\"variable\">pinelabs</span><span class=\"punctuation\">.</span><span class=\"function\">getAgentTools</span><span class=\"punctuation\">(</span><span class=\"punctuation\">)</span><span class=\"punctuation\">,</span>\n<span class=\"punctuation\">}</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">result</span> <span class=\"operator\">=</span> <span class=\"keyword\">await</span> <span class=\"function\">run</span><span class=\"punctuation\">(</span><span class=\"variable\">agent</span><span class=\"punctuation\">,</span> <span class=\"string\">'Create an order for Rs. 500 for customer john@example.com'</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n<span class=\"variable\">console</span><span class=\"punctuation\">.</span><span class=\"function\">log</span><span class=\"punctuation\">(</span><span class=\"variable\">result</span><span class=\"punctuation\">.</span><span class=\"variable\">finalOutput</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span></code></pre>\n        </div>\n\n        <div class=\"result-section\">\n          <h3 class=\"result-title\">Expected Result</h3>\n          <div class=\"code-block\">\n            <pre><code class=\"language-json\"><span class=\"json-punctuation\">{</span>\n  <span class=\"json-property\">\"token\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"&lt;&lt;Redirect Token&gt;&gt;\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"order_id\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"v1-5757575757-aa-hU1rUd\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"redirect_url\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"https://api.pluralonline.com/api/v3/checkout-bff/redirect/checkout?token=&lt;&lt;Redirect Token&gt;&gt;\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"response_code\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-number\">200</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"response_message\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"Order Creation Successful.\"</span>\n<span class=\"json-punctuation\">}</span></code></pre>\n          </div>\n        </div>\n      </div>\n\n      <!-- Chat Completion Content -->\n      <div class=\"subtab-content\" id=\"content-chat\">\n        <div class=\"code-block\">\n          <pre><code class=\"language-typescript\"><span class=\"keyword\">import</span> <span class=\"variable\">OpenAI</span> <span class=\"keyword\">from</span> <span class=\"string\">'openai'</span><span class=\"punctuation\">;</span>\n<span class=\"keyword\">import</span> <span class=\"punctuation\">{</span>\n  <span class=\"variable\">PinelabsAgentToolkit</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">pinelabsEnvironment</span><span class=\"punctuation\">,</span>\n<span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'@plural_pinelabs/agent-toolkit/openai'</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">openai</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"type\">OpenAI</span><span class=\"punctuation\">(</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">pinelabs</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"type\">PinelabsAgentToolkit</span><span class=\"punctuation\">(</span>\n  <span class=\"variable\">pinelabsEnvironment</span><span class=\"punctuation\">.</span><span class=\"variable\">UAT</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">process</span><span class=\"punctuation\">.</span><span class=\"variable\">env</span><span class=\"punctuation\">.</span><span class=\"variable\">PINE_CLIENT_ID</span><span class=\"operator\">!</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">process</span><span class=\"punctuation\">.</span><span class=\"variable\">env</span><span class=\"punctuation\">.</span><span class=\"variable\">PINE_CLIENT_SECRET</span><span class=\"operator\">!</span>\n<span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">response</span> <span class=\"operator\">=</span> <span class=\"keyword\">await</span> <span class=\"variable\">openai</span><span class=\"punctuation\">.</span><span class=\"variable\">chat</span><span class=\"punctuation\">.</span><span class=\"variable\">completions</span><span class=\"punctuation\">.</span><span class=\"function\">create</span><span class=\"punctuation\">(</span><span class=\"punctuation\">{</span>\n  <span class=\"variable\">model</span><span class=\"punctuation\">:</span> <span class=\"string\">'gpt-4o'</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">messages</span><span class=\"punctuation\">:</span> <span class=\"punctuation\">[</span><span class=\"punctuation\">{</span> <span class=\"variable\">role</span><span class=\"punctuation\">:</span> <span class=\"string\">'user'</span><span class=\"punctuation\">,</span> <span class=\"variable\">content</span><span class=\"punctuation\">:</span> <span class=\"string\">'Create an order for Rs. 500'</span> <span class=\"punctuation\">}</span><span class=\"punctuation\">]</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">tools</span><span class=\"punctuation\">:</span> <span class=\"variable\">pinelabs</span><span class=\"punctuation\">.</span><span class=\"function\">getTools</span><span class=\"punctuation\">(</span><span class=\"punctuation\">)</span><span class=\"punctuation\">,</span>\n<span class=\"punctuation\">}</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">for</span> <span class=\"punctuation\">(</span><span class=\"keyword\">const</span> <span class=\"variable\">toolCall</span> <span class=\"keyword\">of</span> <span class=\"variable\">response</span><span class=\"punctuation\">.</span><span class=\"variable\">choices</span><span class=\"punctuation\">[</span><span class=\"number\">0</span><span class=\"punctuation\">]</span><span class=\"punctuation\">.</span><span class=\"variable\">message</span><span class=\"punctuation\">.</span><span class=\"variable\">tool_calls</span> <span class=\"operator\">??</span> <span class=\"punctuation\">[</span><span class=\"punctuation\">]</span><span class=\"punctuation\">)</span> <span class=\"punctuation\">{</span>\n  <span class=\"keyword\">const</span> <span class=\"variable\">result</span> <span class=\"operator\">=</span> <span class=\"keyword\">await</span> <span class=\"variable\">pinelabs</span><span class=\"punctuation\">.</span><span class=\"function\">handleToolCall</span><span class=\"punctuation\">(</span>\n    <span class=\"variable\">toolCall</span><span class=\"punctuation\">.</span><span class=\"variable\">function</span><span class=\"punctuation\">.</span><span class=\"variable\">name</span><span class=\"punctuation\">,</span>\n    <span class=\"variable\">JSON</span><span class=\"punctuation\">.</span><span class=\"function\">parse</span><span class=\"punctuation\">(</span><span class=\"variable\">toolCall</span><span class=\"punctuation\">.</span><span class=\"variable\">function</span><span class=\"punctuation\">.</span><span class=\"variable\">arguments</span><span class=\"punctuation\">)</span>\n  <span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n  <span class=\"variable\">console</span><span class=\"punctuation\">.</span><span class=\"function\">log</span><span class=\"punctuation\">(</span><span class=\"variable\">result</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n<span class=\"punctuation\">}</span></code></pre>\n        </div>\n\n        <div class=\"result-section\">\n          <h3 class=\"result-title\">Expected Result</h3>\n          <div class=\"code-block\">\n            <pre><code class=\"language-json\"><span class=\"json-punctuation\">{</span>\n  <span class=\"json-property\">\"token\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"&lt;&lt;Redirect Token&gt;&gt;\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"order_id\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"v1-5757575757-aa-hU1rUd\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"redirect_url\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"https://api.pluralonline.com/api/v3/checkout-bff/redirect/checkout?token=&lt;&lt;Redirect Token&gt;&gt;\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"response_code\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-number\">200</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"response_message\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"Order Creation Successful.\"</span>\n<span class=\"json-punctuation\">}</span></code></pre>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <!-- LangChain Tab Content -->\n    <div class=\"tab-content\" id=\"content-langchain\">\n      <div class=\"code-block\">\n        <pre><code class=\"language-typescript\"><span class=\"keyword\">import</span> <span class=\"punctuation\">{</span> <span class=\"variable\">ChatOpenAI</span> <span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'@langchain/openai'</span><span class=\"punctuation\">;</span>\n<span class=\"keyword\">import</span> <span class=\"punctuation\">{</span> <span class=\"variable\">AgentExecutor</span><span class=\"punctuation\">,</span> <span class=\"variable\">createOpenAIFunctionsAgent</span> <span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'langchain/agents'</span><span class=\"punctuation\">;</span>\n<span class=\"keyword\">import</span> <span class=\"punctuation\">{</span> <span class=\"variable\">ChatPromptTemplate</span> <span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'@langchain/core/prompts'</span><span class=\"punctuation\">;</span>\n<span class=\"keyword\">import</span> <span class=\"punctuation\">{</span>\n  <span class=\"variable\">PinelabsAgentToolkit</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">pinelabsEnvironment</span><span class=\"punctuation\">,</span>\n<span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'@plural_pinelabs/agent-toolkit/langchain'</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">pinelabs</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"type\">PinelabsAgentToolkit</span><span class=\"punctuation\">(</span>\n  <span class=\"variable\">pinelabsEnvironment</span><span class=\"punctuation\">.</span><span class=\"variable\">UAT</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">process</span><span class=\"punctuation\">.</span><span class=\"variable\">env</span><span class=\"punctuation\">.</span><span class=\"variable\">PINE_CLIENT_ID</span><span class=\"operator\">!</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">process</span><span class=\"punctuation\">.</span><span class=\"variable\">env</span><span class=\"punctuation\">.</span><span class=\"variable\">PINE_CLIENT_SECRET</span><span class=\"operator\">!</span>\n<span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">tools</span> <span class=\"operator\">=</span> <span class=\"variable\">pinelabs</span><span class=\"punctuation\">.</span><span class=\"function\">getTools</span><span class=\"punctuation\">(</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span> <span class=\"comment\">// DynamicStructuredTool[]</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">llm</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"type\">ChatOpenAI</span><span class=\"punctuation\">(</span><span class=\"punctuation\">{</span> <span class=\"variable\">model</span><span class=\"punctuation\">:</span> <span class=\"string\">'gpt-4o'</span> <span class=\"punctuation\">}</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n<span class=\"keyword\">const</span> <span class=\"variable\">prompt</span> <span class=\"operator\">=</span> <span class=\"variable\">ChatPromptTemplate</span><span class=\"punctuation\">.</span><span class=\"function\">fromMessages</span><span class=\"punctuation\">(</span><span class=\"punctuation\">[</span>\n  <span class=\"punctuation\">[</span><span class=\"string\">'system'</span><span class=\"punctuation\">,</span> <span class=\"string\">'You are a helpful payment assistant.'</span><span class=\"punctuation\">]</span><span class=\"punctuation\">,</span>\n  <span class=\"punctuation\">[</span><span class=\"string\">'human'</span><span class=\"punctuation\">,</span> <span class=\"string\">'{input}'</span><span class=\"punctuation\">]</span><span class=\"punctuation\">,</span>\n  <span class=\"punctuation\">[</span><span class=\"string\">'placeholder'</span><span class=\"punctuation\">,</span> <span class=\"string\">'{agent_scratchpad}'</span><span class=\"punctuation\">]</span><span class=\"punctuation\">,</span>\n<span class=\"punctuation\">]</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">agent</span> <span class=\"operator\">=</span> <span class=\"keyword\">await</span> <span class=\"function\">createOpenAIFunctionsAgent</span><span class=\"punctuation\">(</span><span class=\"punctuation\">{</span> <span class=\"variable\">llm</span><span class=\"punctuation\">,</span> <span class=\"variable\">tools</span><span class=\"punctuation\">,</span> <span class=\"variable\">prompt</span> <span class=\"punctuation\">}</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n<span class=\"keyword\">const</span> <span class=\"variable\">executor</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"type\">AgentExecutor</span><span class=\"punctuation\">(</span><span class=\"punctuation\">{</span> <span class=\"variable\">agent</span><span class=\"punctuation\">,</span> <span class=\"variable\">tools</span> <span class=\"punctuation\">}</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">result</span> <span class=\"operator\">=</span> <span class=\"keyword\">await</span> <span class=\"variable\">executor</span><span class=\"punctuation\">.</span><span class=\"function\">invoke</span><span class=\"punctuation\">(</span><span class=\"punctuation\">{</span> <span class=\"variable\">input</span><span class=\"punctuation\">:</span> <span class=\"string\">'Create an order for Rs. 500'</span> <span class=\"punctuation\">}</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n<span class=\"variable\">console</span><span class=\"punctuation\">.</span><span class=\"function\">log</span><span class=\"punctuation\">(</span><span class=\"variable\">result</span><span class=\"punctuation\">.</span><span class=\"variable\">output</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span></code></pre>\n      </div>\n\n      <div class=\"result-section\">\n        <h3 class=\"result-title\">Expected Result</h3>\n        <div class=\"code-block\">\n          <pre><code class=\"language-json\"><span class=\"json-punctuation\">{</span>\n  <span class=\"json-property\">\"token\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"&lt;&lt;Redirect Token&gt;&gt;\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"order_id\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"v1-5757575757-aa-hU1rUd\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"redirect_url\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"https://api.pluralonline.com/api/v3/checkout-bff/redirect/checkout?token=&lt;&lt;Redirect Token&gt;&gt;\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"response_code\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-number\">200</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"response_message\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"Order Creation Successful.\"</span>\n<span class=\"json-punctuation\">}</span></code></pre>\n        </div>\n      </div>\n    </div>\n\n    <!-- Vercel AI SDK Tab Content -->\n    <div class=\"tab-content\" id=\"content-vercel\">\n      <div class=\"code-block\">\n        <pre><code class=\"language-typescript\"><span class=\"keyword\">import</span> <span class=\"punctuation\">{</span> <span class=\"variable\">generateText</span> <span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'ai'</span><span class=\"punctuation\">;</span>\n<span class=\"keyword\">import</span> <span class=\"punctuation\">{</span> <span class=\"variable\">openai</span> <span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'@ai-sdk/openai'</span><span class=\"punctuation\">;</span>\n<span class=\"keyword\">import</span> <span class=\"punctuation\">{</span>\n  <span class=\"variable\">PinelabsAgentToolkit</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">pinelabsEnvironment</span><span class=\"punctuation\">,</span>\n<span class=\"punctuation\">}</span> <span class=\"keyword\">from</span> <span class=\"string\">'@plural_pinelabs/agent-toolkit/ai-sdk'</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">pinelabs</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"type\">PinelabsAgentToolkit</span><span class=\"punctuation\">(</span>\n  <span class=\"variable\">pinelabsEnvironment</span><span class=\"punctuation\">.</span><span class=\"variable\">UAT</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">process</span><span class=\"punctuation\">.</span><span class=\"variable\">env</span><span class=\"punctuation\">.</span><span class=\"variable\">PINE_CLIENT_ID</span><span class=\"operator\">!</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">process</span><span class=\"punctuation\">.</span><span class=\"variable\">env</span><span class=\"punctuation\">.</span><span class=\"variable\">PINE_CLIENT_SECRET</span><span class=\"operator\">!</span>\n<span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"keyword\">const</span> <span class=\"variable\">result</span> <span class=\"operator\">=</span> <span class=\"keyword\">await</span> <span class=\"function\">generateText</span><span class=\"punctuation\">(</span><span class=\"punctuation\">{</span>\n  <span class=\"variable\">model</span><span class=\"punctuation\">:</span> <span class=\"function\">openai</span><span class=\"punctuation\">(</span><span class=\"string\">'gpt-4o'</span><span class=\"punctuation\">)</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">tools</span><span class=\"punctuation\">:</span> <span class=\"variable\">pinelabs</span><span class=\"punctuation\">.</span><span class=\"function\">getTools</span><span class=\"punctuation\">(</span><span class=\"punctuation\">)</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">prompt</span><span class=\"punctuation\">:</span> <span class=\"string\">'Create an order for Rs. 500'</span><span class=\"punctuation\">,</span>\n  <span class=\"variable\">maxSteps</span><span class=\"punctuation\">:</span> <span class=\"number\">5</span><span class=\"punctuation\">,</span>\n<span class=\"punctuation\">}</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span>\n\n<span class=\"variable\">console</span><span class=\"punctuation\">.</span><span class=\"function\">log</span><span class=\"punctuation\">(</span><span class=\"variable\">result</span><span class=\"punctuation\">.</span><span class=\"variable\">text</span><span class=\"punctuation\">)</span><span class=\"punctuation\">;</span></code></pre>\n      </div>\n\n      <div class=\"result-section\">\n        <h3 class=\"result-title\">Expected Result</h3>\n        <div class=\"code-block\">\n          <pre><code class=\"language-json\"><span class=\"json-punctuation\">{</span>\n  <span class=\"json-property\">\"token\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"&lt;&lt;Redirect Token&gt;&gt;\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"order_id\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"v1-5757575757-aa-hU1rUd\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"redirect_url\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"https://api.pluralonline.com/api/v3/checkout-bff/redirect/checkout?token=&lt;&lt;Redirect Token&gt;&gt;\"</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"response_code\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-number\">200</span><span class=\"json-punctuation\">,</span>\n  <span class=\"json-property\">\"response_message\"</span><span class=\"json-punctuation\">:</span> <span class=\"json-string\">\"Order Creation Successful.\"</span>\n<span class=\"json-punctuation\">}</span></code></pre>\n        </div>\n      </div>\n    </div>\n  </div>\n"
}
[/block]

## Environment Variables

| Variable             | Description                                                 |
| :------------------- | :---------------------------------------------------------- |
| `PINE_CLIENT_ID`     | Client ID from the Pine Labs Online Developer Dashboard     |
| `PINE_CLIENT_SECRET` | Client Secret from the Pine Labs Online Developer Dashboard |

## Environments

| Environment | Constant                         | Base URL                         |
| :---------- | :------------------------------- | :------------------------------- |
| UAT         | `pinelabsEnvironment.UAT`        | `https://pluraluat.v2.pinepg.in` |
| Production  | `pinelabsEnvironment.PRODUCTION` | `https://api.pluralpay.in`       |

## Authentication

Authentication is handled automatically. The toolkit uses your **`PINE_CLIENT_ID`** and **`PINE_CLIENT_SECRET`** to obtain a Bearer token via the Pine Labs Online OAuth2 token API. Tokens are cached and refreshed automatically before expiry — no manual token management required.

## Resources

[block:html]
{
  "html": "\n<style>\n\n.card-link {\n  text-decoration: none !important;\n  color: inherit;\n  display: block;\n}\n\n\n/* Card Grid */\n.card-grid {\n    display: grid;\n    gap: 1.5rem;\n    max-width: 80rem;\n    margin: 0 auto;\n}\n\n@media (min-width: 768px) {\n    .card-grid {\n        grid-template-columns: repeat(2, 1fr);\n    }\n}\n\n/* Card Base Styles */\n.card {\n    position: relative;\n    background-color: #ffffff;\n    border-radius: 1rem;\n    padding: 1.5rem;\n    box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n    transition: all 300ms ease;\n    border: 1px solid #e2e8f0;\n    text-decoration: none;\n    display: block;\n}\n\n.card:hover {\n    box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n    border-color: #cbd5e1;\n    transform: translateY(-0.25rem);\n}\n\n/* Card Header */\n.card-header {\n    display: flex;\n    align-items: flex-start;\n    justify-content: space-between;\n    margin-bottom: 1.5rem;\n}\n\n/* Icon Badge */\n.icon-badge {\n    padding: 0.75rem;\n    border-radius: 0.75rem;\n}\n\n.icon-badge-github {\n    background-color: #d0f6e5;\n}\n\n.icon-badge-npm {\n    background-color: #d0f6e5;\n}\n\n/* Icons */\n.icon-large {\n    width: 22px;\n    height: 22px;\n    color: #003434;\n}\n\n.external-link {\n    width: 1.25rem;\n    height: 1.25rem;\n    color: #94a3b8;\n    transition: color 200ms ease;\n}\n\n.card:hover .external-link {\n    color: #475569;\n}\n\n/* Card Content */\n.card-content {\n    margin-bottom: 0.75rem;\n}\n\n/* npm Badge */\n.npm-badge {\n    display: inline-block;\n    padding: 0.25rem 0.75rem;\n    background-color: #fef2f2;\n    color: #b91c1c;\n    border-radius: 0.5rem;\n    font-size: 0.875rem;\n    margin-bottom: 0.5rem;\n}\n\n/* Card Title */\n.card-title {\n    font-size: 1.5rem;\n    line-height: 2rem;\n    margin-bottom: 0.75rem;\n    color: #0f172a;\n    font-weight: 600;\n}\n\n/* Card Description */\n.card-description {\n    color: #475569;\n    line-height: 1.625;\n}\n\n</style>"
}
[/block]

[block:html]
{
  "html": "    <div class=\"card-grid\">\n        <!-- GitHub Repository Card -->\n        \t<a href=\"https://github.com/plural-pinelabs/Pinelabs-Agentic-SDK/tree/master\" target=\"_blank\" class=\"card-link\">\n\t\t\t\t\t<div class=\"card\">\n            <div class=\"card-header\">\n                <div class=\"icon-badge icon-badge-github\">\n                    <svg class=\"icon-large\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                        <path d=\"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4\"/>\n                        <path d=\"M9 18c-4.51 2-5-2-7-2\"/>\n                    </svg>\n                </div>\n                <svg class=\"external-link\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                    <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/>\n                    <polyline points=\"15 3 21 3 21 9\"/>\n                    <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/>\n                </svg>\n            </div>\n            \n            <h2 class=\"card-title\">\n                GitHub Repository\n            </h2>\n            \n            <p class=\"card-description\">\n                View the source code, report issues, and contribute to the toolkit.\n            </p>\n            \n            <div class=\"card-accent card-accent-github\"></div></div>\n        </a>\n\n        <!-- npm Package Card -->\n\t\t\t\t<a href=\"https://www.npmjs.com/package/@plural_pinelabs/agent-toolkit\" target=\"_blank\" class=\"card-link\">\n        <div class=\"card\">\n            <div class=\"card-header\">\n                <div class=\"icon-badge icon-badge-npm\">\n                    <svg class=\"icon-large\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                        <path d=\"M16.5 9.4 7.55 4.24\"/>\n                        <path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\"/>\n                        <polyline points=\"3.29 7 12 12 20.71 7\"/>\n                        <line x1=\"12\" y1=\"22\" x2=\"12\" y2=\"12\"/>\n                    </svg>\n                </div>\n                <svg class=\"external-link\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                    <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/>\n                    <polyline points=\"15 3 21 3 21 9\"/>\n                    <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/>\n                </svg>\n            </div>\n            \n            <div class=\"card-content\">\n                <h2 class=\"card-title\">\n                    npm Package\n                </h2>\n            </div>\n            \n            <p class=\"card-description\">\n                View the package on npm for installation and version details.\n            </p>\n            \n            <div class=\"card-accent card-accent-npm\"></div>\n        </div></a>\n    </div>"
}
[/block]
