import type { SpendGuard } from '../spend-guard'; import { type FrameworkAdapterOptions } from './common'; /** * LangChain.js callback handler that runs `guard.decide()` before every LLM / * chat-model call and settles real token usage after it completes. * * Hook point: LangChain's `BaseCallbackHandler` lifecycle methods * `handleChatModelStart` / `handleLLMStart` (preflight, may throw * AgentGuardBlockedError) and `handleLLMEnd` (usage settlement). We do NOT * extend the real BaseCallbackHandler (that would force a peer-dep import at * module load); LangChain duck-types handlers by these method names, and we set * `awaitHandlers = true` so a thrown block aborts the call. * * This adapter reuses the shared framework core (createFrameworkGuard + * preflightFrameworkCall + settleFrameworkCall). It never proxies prompts, * completions, or provider keys — only redacted request shape leaves for the * signed receipt. * * @example * import { ChatOpenAI } from '@langchain/openai'; * import { createLangChainHandler } from '@agentguard-run/spend/frameworks/langchain'; * * const handler = createLangChainHandler({ policy, scope }); * const llm = new ChatOpenAI({ callbacks: [handler] }); * await llm.invoke('hello'); // throws AgentGuardBlockedError if a cap blocks */ export interface LangChainAdapterOptions extends FrameworkAdapterOptions { framework?: 'langchain'; } interface LangChainSerialized { id?: string[]; kwargs?: Record; [key: string]: unknown; } export declare class AgentGuardLangChainHandler { readonly name = "agentguard_spend"; /** Ensures LangChain awaits the handler so a thrown block actually aborts. */ readonly awaitHandlers = true; readonly guard: SpendGuard; private readonly opts; private readonly pending; constructor(opts: LangChainAdapterOptions); handleChatModelStart(llm: LangChainSerialized, messages: unknown[][], runId: string, _parentRunId?: string, extraParams?: Record, _tags?: string[], metadata?: Record): Promise; handleLLMStart(llm: LangChainSerialized, prompts: unknown[], runId: string, _parentRunId?: string, extraParams?: Record, _tags?: string[], metadata?: Record): Promise; handleLLMEnd(output: unknown, runId: string): Promise; handleLLMError(_error: unknown, runId: string): Promise; private start; } export declare function createLangChainHandler(opts: LangChainAdapterOptions): AgentGuardLangChainHandler; export declare const agentguardLangChainHandler: typeof createLangChainHandler; export {}; //# sourceMappingURL=langchain.d.ts.map