exa_process.ts•1.61 kB
import {
	ErrorType,
	ProcessingProvider,
	ProcessingResult,
	ProviderError,
} from '../../common/types.js';
import { ExaContentsProvider } from '../processing/exa_contents/index.js';
import { ExaSimilarProvider } from '../processing/exa_similar/index.js';
export type ExaProcessMode = 'contents' | 'similar';
export interface UnifiedExaProcessingProvider {
	name: string;
	description: string;
	process_content(
		url: string | string[],
		extract_depth?: 'basic' | 'advanced',
		mode?: ExaProcessMode,
	): Promise<ProcessingResult>;
}
export class UnifiedExaProcessProvider
	implements UnifiedExaProcessingProvider
{
	name = 'exa_process';
	description =
		'Extract content with Exa. Modes: contents (full content from result IDs), similar (find similar pages).';
	private providers: Map<ExaProcessMode, ProcessingProvider> =
		new Map();
	constructor() {
		this.providers.set('contents', new ExaContentsProvider());
		this.providers.set('similar', new ExaSimilarProvider());
	}
	async process_content(
		url: string | string[],
		extract_depth: 'basic' | 'advanced' = 'basic',
		mode: ExaProcessMode = 'contents',
	): Promise<ProcessingResult> {
		if (!mode) {
			throw new ProviderError(
				ErrorType.INVALID_INPUT,
				'Mode parameter is required',
				this.name,
			);
		}
		const selectedProvider = this.providers.get(mode);
		if (!selectedProvider) {
			throw new ProviderError(
				ErrorType.INVALID_INPUT,
				`Invalid mode: ${mode}. Valid options: ${Array.from(this.providers.keys()).join(', ')}`,
				this.name,
			);
		}
		return selectedProvider.process_content(url, extract_depth);
	}
}