import type { LanguageModelV3Middleware } from '@ai-sdk/provider';
import type { CompactToolsOptions } from './types.ts';
import { transformParams } from './transform-params.ts';
import { wrapGenerate } from './wrap-generate.ts';
import { wrapStream } from './wrap-stream.ts';
export type { CompactToolsOptions };
export { ToolReduceParseError } from './parser.ts';
export { renderSignature, planTools, isFlatObject } from './signature.ts';
/**
* `compactTools()` — replace JSON tool calls with a compact `name k=v` syntax.
*
* Supports two encoding styles:
* - `wire` (default): `getWeather location=Austin units=metric`
* - `json`: `getWeather {"location":"Austin","units":"metric"}`
*
* Plug into AI SDK v6 via `wrapLanguageModel`:
*
* ```ts
* import { wrapLanguageModel } from 'ai';
* import { compactTools } from 'ai-sdk-wire-middleware';
*
* const model = wrapLanguageModel({
* model: anthropic('claude-sonnet-4-5'),
* middleware: compactTools({ fallbackToJson: 'complex' }),
* });
* ```
*/
export function compactTools(options: CompactToolsOptions = {}): LanguageModelV3Middleware {
const opts = {
syntax: options.syntax ?? 'wire',
fallbackToJson: options.fallbackToJson ?? 'complex',
placement: options.placement ?? 'last',
manualHeader: options.manualHeader,
debug: options.debug ?? false,
} as const;
return {
specificationVersion: 'v3',
transformParams: async ({ params }) => transformParams(params, opts),
wrapGenerate: async ({ doGenerate, params }) => wrapGenerate(params, doGenerate),
wrapStream: async ({ doStream, params }) => wrapStream(params, doStream),
};
}