scrapex 1.0.0-alpha.1 → 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +164 -5
  2. package/dist/enhancer-ByjRD-t5.mjs +769 -0
  3. package/dist/enhancer-ByjRD-t5.mjs.map +1 -0
  4. package/dist/enhancer-j0xqKDJm.cjs +847 -0
  5. package/dist/enhancer-j0xqKDJm.cjs.map +1 -0
  6. package/dist/index-CDgcRnig.d.cts +268 -0
  7. package/dist/index-CDgcRnig.d.cts.map +1 -0
  8. package/dist/index-piS5wtki.d.mts +268 -0
  9. package/dist/index-piS5wtki.d.mts.map +1 -0
  10. package/dist/index.cjs +1192 -37
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +318 -2
  13. package/dist/index.d.cts.map +1 -1
  14. package/dist/index.d.mts +318 -2
  15. package/dist/index.d.mts.map +1 -1
  16. package/dist/index.mjs +1164 -6
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/llm/index.cjs +250 -232
  19. package/dist/llm/index.cjs.map +1 -1
  20. package/dist/llm/index.d.cts +132 -85
  21. package/dist/llm/index.d.cts.map +1 -1
  22. package/dist/llm/index.d.mts +132 -85
  23. package/dist/llm/index.d.mts.map +1 -1
  24. package/dist/llm/index.mjs +243 -236
  25. package/dist/llm/index.mjs.map +1 -1
  26. package/dist/parsers/index.cjs +10 -199
  27. package/dist/parsers/index.d.cts +2 -133
  28. package/dist/parsers/index.d.mts +2 -133
  29. package/dist/parsers/index.mjs +2 -191
  30. package/dist/parsers-Bneuws8x.cjs +569 -0
  31. package/dist/parsers-Bneuws8x.cjs.map +1 -0
  32. package/dist/parsers-CwkYnyWY.mjs +482 -0
  33. package/dist/parsers-CwkYnyWY.mjs.map +1 -0
  34. package/dist/types-CadAXrme.d.mts +674 -0
  35. package/dist/types-CadAXrme.d.mts.map +1 -0
  36. package/dist/types-DPEtPihB.d.cts +674 -0
  37. package/dist/types-DPEtPihB.d.cts.map +1 -0
  38. package/package.json +15 -16
  39. package/dist/enhancer-Q6CSc1gA.mjs +0 -220
  40. package/dist/enhancer-Q6CSc1gA.mjs.map +0 -1
  41. package/dist/enhancer-oM4BhYYS.cjs +0 -268
  42. package/dist/enhancer-oM4BhYYS.cjs.map +0 -1
  43. package/dist/parsers/index.cjs.map +0 -1
  44. package/dist/parsers/index.d.cts.map +0 -1
  45. package/dist/parsers/index.d.mts.map +0 -1
  46. package/dist/parsers/index.mjs.map +0 -1
  47. package/dist/types-CNQZVW36.d.mts +0 -150
  48. package/dist/types-CNQZVW36.d.mts.map +0 -1
  49. package/dist/types-D0HYR95H.d.cts +0 -150
  50. package/dist/types-D0HYR95H.d.cts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["DEFAULT_MODEL","DEFAULT_MAX_TOKENS","ScrapeError","zodToJsonSchema","properties: Record<string, object>","ScrapeError","messages: Array<{ role: 'system' | 'user'; content: string }>","properties: Record<string, object>","required: string[]"],"sources":["../../src/llm/anthropic.ts","../../src/llm/openai.ts"],"sourcesContent":["import type { z } from 'zod';\nimport { ScrapeError } from '@/core/errors.js';\nimport type { AnthropicConfig, CompletionOptions, LLMProvider } from './types.js';\n\nconst DEFAULT_MODEL = 'claude-3-5-haiku-20241022';\nconst DEFAULT_MAX_TOKENS = 1024;\n\n/**\n * Anthropic Claude provider\n *\n * Requires @anthropic-ai/sdk as a peer dependency.\n *\n * @example\n * ```ts\n * const provider = new AnthropicProvider({ apiKey: 'sk-...' });\n * const result = await scrape(url, { llm: provider, enhance: ['summarize'] });\n * ```\n */\nexport class AnthropicProvider implements LLMProvider {\n readonly name = 'anthropic';\n private client: unknown;\n private model: string;\n\n constructor(config: AnthropicConfig = {}) {\n const apiKey = config.apiKey ?? process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new ScrapeError(\n 'Anthropic API key required. Set ANTHROPIC_API_KEY env var or pass apiKey in config.',\n 'LLM_ERROR'\n );\n }\n\n this.model = config.model ?? DEFAULT_MODEL;\n\n // Dynamic import to avoid requiring the SDK if not used\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { Anthropic } = require('@anthropic-ai/sdk') as typeof import('@anthropic-ai/sdk');\n this.client = new Anthropic({\n apiKey,\n baseURL: config.baseUrl,\n });\n } catch {\n throw new ScrapeError(\n '@anthropic-ai/sdk is required for Anthropic provider. Install with: npm install @anthropic-ai/sdk',\n 'LLM_ERROR'\n );\n }\n }\n\n async complete(prompt: string, options: CompletionOptions = {}): Promise<string> {\n try {\n const client = this.client as import('@anthropic-ai/sdk').Anthropic;\n const response = await client.messages.create({\n model: this.model,\n max_tokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,\n messages: [{ role: 'user', content: prompt }],\n system: options.systemPrompt,\n temperature: options.temperature,\n });\n\n const content = response.content[0];\n if (content?.type === 'text' && content.text) {\n return content.text;\n }\n\n throw new ScrapeError('Unexpected or empty response from Anthropic', 'LLM_ERROR');\n } catch (error) {\n if (error instanceof ScrapeError) throw error;\n throw new ScrapeError(\n `Anthropic API error: ${error instanceof Error ? error.message : String(error)}`,\n 'LLM_ERROR',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n async completeJSON<T>(\n prompt: string,\n schema: z.ZodType<T>,\n options: CompletionOptions = {}\n ): Promise<T> {\n const jsonPrompt = `${prompt}\n\nRespond ONLY with valid JSON matching this schema:\n${JSON.stringify(zodToJsonSchema(schema), null, 2)}\n\nDo not include any explanation or markdown formatting. Just the JSON object.`;\n\n const response = await this.complete(jsonPrompt, {\n ...options,\n systemPrompt:\n options.systemPrompt ?? 'You are a helpful assistant that responds only with valid JSON.',\n });\n\n try {\n // Try to extract JSON from the response\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('No JSON object found in response');\n }\n\n const parsed = JSON.parse(jsonMatch[0]);\n return schema.parse(parsed);\n } catch (error) {\n throw new ScrapeError(\n `Failed to parse LLM response as JSON: ${error instanceof Error ? error.message : String(error)}`,\n 'VALIDATION_ERROR',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n}\n\n/**\n * Convert a Zod schema to a simple JSON Schema representation\n * (simplified version for prompt engineering)\n */\nfunction zodToJsonSchema(schema: z.ZodType<unknown>): object {\n const def = (schema as z.ZodType<unknown> & { _def: { typeName: string } })._def;\n\n switch (def.typeName) {\n case 'ZodObject': {\n const shape = (schema as z.ZodObject<z.ZodRawShape>).shape;\n const properties: Record<string, object> = {};\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value as z.ZodType<unknown>);\n }\n return { type: 'object', properties };\n }\n case 'ZodArray': {\n const arrayDef = def as unknown as { type: z.ZodType<unknown> };\n return { type: 'array', items: zodToJsonSchema(arrayDef.type) };\n }\n case 'ZodString':\n return { type: 'string' };\n case 'ZodNumber':\n return { type: 'number' };\n case 'ZodBoolean':\n return { type: 'boolean' };\n case 'ZodEnum': {\n const enumDef = def as unknown as { values: string[] };\n return { type: 'string', enum: enumDef.values };\n }\n default:\n return { type: 'string' };\n }\n}\n","import type { z } from 'zod';\nimport { ScrapeError } from '@/core/errors.js';\nimport type { CompletionOptions, LLMProvider, OpenAICompatibleConfig } from './types.js';\n\nconst DEFAULT_MODEL = 'gpt-4o-mini';\nconst DEFAULT_MAX_TOKENS = 1024;\nconst DEFAULT_BASE_URL = 'https://api.openai.com/v1';\n\n/**\n * OpenAI-compatible provider\n *\n * Works with:\n * - OpenAI API\n * - Ollama (http://localhost:11434/v1)\n * - LM Studio (http://localhost:1234/v1)\n * - LocalAI\n * - vLLM\n * - Any OpenAI-compatible API\n *\n * Requires `openai` as a peer dependency.\n *\n * @example\n * ```ts\n * // OpenAI\n * const provider = new OpenAIProvider({ apiKey: 'sk-...' });\n *\n * // Ollama\n * const provider = new OpenAIProvider({\n * baseUrl: 'http://localhost:11434/v1',\n * model: 'llama3.2',\n * apiKey: 'ollama' // Ollama doesn't require a real key\n * });\n *\n * // LM Studio\n * const provider = new OpenAIProvider({\n * baseUrl: 'http://localhost:1234/v1',\n * model: 'local-model',\n * apiKey: 'lm-studio'\n * });\n * ```\n */\nexport class OpenAIProvider implements LLMProvider {\n readonly name = 'openai';\n private client: unknown;\n private model: string;\n\n constructor(config: OpenAICompatibleConfig = {}) {\n const apiKey = config.apiKey ?? process.env.OPENAI_API_KEY;\n const baseUrl = config.baseUrl ?? DEFAULT_BASE_URL;\n\n // Only require API key for OpenAI (not for local providers)\n if (!apiKey && baseUrl === DEFAULT_BASE_URL) {\n throw new ScrapeError(\n 'OpenAI API key required. Set OPENAI_API_KEY env var or pass apiKey in config.',\n 'LLM_ERROR'\n );\n }\n\n this.model = config.model ?? DEFAULT_MODEL;\n\n // Dynamic import to avoid requiring the SDK if not used\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { OpenAI } = require('openai') as typeof import('openai');\n this.client = new OpenAI({\n apiKey: apiKey ?? 'local', // Use 'local' as placeholder for local providers\n baseURL: baseUrl,\n });\n } catch {\n throw new ScrapeError(\n 'openai package is required for OpenAI provider. Install with: npm install openai',\n 'LLM_ERROR'\n );\n }\n }\n\n async complete(prompt: string, options: CompletionOptions = {}): Promise<string> {\n try {\n const client = this.client as import('openai').OpenAI;\n const messages: Array<{ role: 'system' | 'user'; content: string }> = [];\n\n if (options.systemPrompt) {\n messages.push({ role: 'system', content: options.systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const response = await client.chat.completions.create({\n model: this.model,\n max_tokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,\n messages,\n temperature: options.temperature,\n });\n\n const content = response.choices[0]?.message?.content;\n if (!content) {\n throw new ScrapeError('Empty response from OpenAI', 'LLM_ERROR');\n }\n\n return content;\n } catch (error) {\n if (error instanceof ScrapeError) throw error;\n throw new ScrapeError(\n `OpenAI API error: ${error instanceof Error ? error.message : String(error)}`,\n 'LLM_ERROR',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n\n async completeJSON<T>(\n prompt: string,\n schema: z.ZodType<T>,\n options: CompletionOptions = {}\n ): Promise<T> {\n const client = this.client as import('openai').OpenAI;\n\n try {\n // Use JSON mode for structured outputs\n const messages: Array<{ role: 'system' | 'user'; content: string }> = [\n {\n role: 'system',\n content:\n options.systemPrompt ??\n 'You are a helpful assistant that extracts information from content.',\n },\n { role: 'user', content: prompt },\n ];\n\n const response = await client.chat.completions.create({\n model: this.model,\n max_tokens: options.maxTokens ?? DEFAULT_MAX_TOKENS,\n messages,\n temperature: options.temperature,\n response_format: { type: 'json_object' },\n });\n\n const content = response.choices[0]?.message?.content;\n if (!content) {\n throw new ScrapeError('Empty response from OpenAI', 'LLM_ERROR');\n }\n\n const parsed = JSON.parse(content);\n return schema.parse(parsed);\n } catch (error) {\n // Fallback to regular completion with JSON instruction\n if (error instanceof ScrapeError) throw error;\n\n // If structured output failed, try regular completion\n const jsonPrompt = `${prompt}\n\nRespond ONLY with valid JSON matching this schema:\n${JSON.stringify(zodToJsonSchema(schema), null, 2)}\n\nDo not include any explanation or markdown formatting. Just the JSON object.`;\n\n const response = await this.complete(jsonPrompt, {\n ...options,\n systemPrompt: 'You respond only with valid JSON.',\n });\n\n try {\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error('No JSON object found in response');\n }\n\n const parsed = JSON.parse(jsonMatch[0]);\n return schema.parse(parsed);\n } catch (parseError) {\n throw new ScrapeError(\n `Failed to parse LLM response as JSON: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n 'VALIDATION_ERROR',\n undefined,\n parseError instanceof Error ? parseError : undefined\n );\n }\n }\n }\n}\n\n/**\n * Convert a Zod schema to JSON Schema for structured outputs\n */\nfunction zodToJsonSchema(schema: z.ZodType<unknown>): object {\n const def = (schema as z.ZodType<unknown> & { _def: { typeName: string } })._def;\n\n switch (def.typeName) {\n case 'ZodObject': {\n const shape = (schema as z.ZodObject<z.ZodRawShape>).shape;\n const properties: Record<string, object> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value as z.ZodType<unknown>);\n // Assume all fields are required unless wrapped in ZodOptional\n const valueDef = (value as z.ZodType<unknown> & { _def: { typeName: string } })._def;\n if (valueDef.typeName !== 'ZodOptional') {\n required.push(key);\n }\n }\n return { type: 'object', properties, required };\n }\n case 'ZodArray': {\n const arrayDef = def as unknown as { type: z.ZodType<unknown> };\n return { type: 'array', items: zodToJsonSchema(arrayDef.type) };\n }\n case 'ZodString':\n return { type: 'string' };\n case 'ZodNumber':\n return { type: 'number' };\n case 'ZodBoolean':\n return { type: 'boolean' };\n case 'ZodEnum': {\n const enumDef = def as unknown as { values: string[] };\n return { type: 'string', enum: enumDef.values };\n }\n case 'ZodOptional': {\n const optionalDef = def as unknown as { innerType: z.ZodType<unknown> };\n return zodToJsonSchema(optionalDef.innerType);\n }\n default:\n return { type: 'string' };\n }\n}\n\n// Convenience factory functions\n\n/**\n * Create an OpenAI provider with default settings\n */\nexport function createOpenAI(config?: OpenAICompatibleConfig): OpenAIProvider {\n return new OpenAIProvider(config);\n}\n\n/**\n * Create an Ollama provider\n *\n * @example\n * ```ts\n * const provider = createOllama({ model: 'llama3.2' });\n * ```\n */\nexport function createOllama(\n config: { model: string; port?: number } = { model: 'llama3.2' }\n): OpenAIProvider {\n return new OpenAIProvider({\n baseUrl: `http://localhost:${config.port ?? 11434}/v1`,\n model: config.model,\n apiKey: 'ollama',\n });\n}\n\n/**\n * Create an LM Studio provider\n *\n * @example\n * ```ts\n * const provider = createLMStudio({ model: 'local-model' });\n * ```\n */\nexport function createLMStudio(\n config: { model: string; port?: number } = { model: 'local-model' }\n): OpenAIProvider {\n return new OpenAIProvider({\n baseUrl: `http://localhost:${config.port ?? 1234}/v1`,\n model: config.model,\n apiKey: 'lm-studio',\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["BaseHttpProvider","messages: Array<{ role: string; content: string }>","request: Record<string, unknown>","ScrapeError","z","properties: Record<string, object>","required: string[]","headers: Record<string, string>"],"sources":["../../src/llm/http.ts","../../src/llm/presets.ts"],"sourcesContent":["/**\n * HTTP-based LLM Provider using native fetch.\n * Provides a unified interface for any REST-based LLM API.\n */\n\nimport { z } from 'zod';\nimport { type BaseHttpConfig, BaseHttpProvider } from '../common/http-base.js';\nimport { ScrapeError } from '../core/errors.js';\nimport type { CompletionOptions, LLMProvider } from './types.js';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\n/**\n * HTTP LLM provider configuration.\n */\nexport interface HttpLLMConfig<TRequest = unknown, TResponse = unknown, TError = unknown>\n extends BaseHttpConfig<TError> {\n /**\n * Build request body from prompt and options.\n * @default OpenAI-compatible format with messages array\n */\n requestBuilder?: (prompt: string, options: CompletionOptions) => TRequest;\n /**\n * Extract completion text from response.\n * @default (res) => res.choices[0].message.content\n */\n responseMapper?: (response: TResponse) => string;\n /**\n * Enable JSON mode - adds response_format to request.\n * For OpenAI-compatible APIs, this adds { response_format: { type: \"json_object\" } }\n */\n jsonMode?: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────\n// HTTP LLM Provider\n// ─────────────────────────────────────────────────────────────\n\n/**\n * HTTP-based LLM provider.\n * Works with any REST API using native fetch.\n */\nexport class HttpLLMProvider<TRequest = unknown, TResponse = unknown, TError = unknown>\n extends BaseHttpProvider<TError>\n implements LLMProvider\n{\n readonly name: string;\n\n private readonly requestBuilder: (prompt: string, options: CompletionOptions) => TRequest;\n private readonly responseMapper: (response: TResponse) => string;\n private readonly jsonMode: boolean;\n\n constructor(config: HttpLLMConfig<TRequest, TResponse, TError>) {\n super(config);\n this.name = 'http-llm';\n this.jsonMode = config.jsonMode ?? false;\n\n // Default request builder: OpenAI-compatible format\n this.requestBuilder =\n config.requestBuilder ??\n ((prompt: string, opts: CompletionOptions) => {\n const messages: Array<{ role: string; content: string }> = [];\n\n if (opts.systemPrompt) {\n messages.push({ role: 'system', content: opts.systemPrompt });\n }\n messages.push({ role: 'user', content: prompt });\n\n const request: Record<string, unknown> = {\n model: this.model,\n messages,\n };\n\n if (opts.temperature !== undefined) {\n request.temperature = opts.temperature;\n }\n if (opts.maxTokens !== undefined) {\n request.max_tokens = opts.maxTokens;\n }\n\n return request as TRequest;\n });\n\n // Default response mapper: OpenAI-compatible format\n this.responseMapper =\n config.responseMapper ??\n ((response: TResponse) => {\n const resp = response as Record<string, unknown>;\n\n // OpenAI format: { choices: [{ message: { content: \"...\" } }] }\n if (Array.isArray(resp.choices) && resp.choices.length > 0) {\n const choice = resp.choices[0] as { message?: { content?: string } };\n if (choice.message?.content) {\n return choice.message.content;\n }\n }\n\n // Anthropic format: { content: [{ type: \"text\", text: \"...\" }] }\n if (Array.isArray(resp.content)) {\n const textBlock = resp.content.find((c: { type?: string }) => c.type === 'text') as\n | { text?: string }\n | undefined;\n if (textBlock?.text) {\n return textBlock.text;\n }\n }\n\n throw new ScrapeError(\n 'Unable to parse LLM response. Provide a custom responseMapper.',\n 'VALIDATION_ERROR'\n );\n });\n }\n\n /**\n * Generate a text completion.\n */\n async complete(prompt: string, options: CompletionOptions = {}): Promise<string> {\n let body = this.requestBuilder(prompt, options);\n\n // Add JSON mode if enabled\n if (this.jsonMode && typeof body === 'object' && body !== null) {\n body = {\n ...body,\n response_format: { type: 'json_object' },\n } as TRequest;\n }\n\n const { data } = await this.fetch<TResponse>(this.baseUrl, { body });\n\n const content = this.responseMapper(data);\n if (!content) {\n throw new ScrapeError('Empty response from LLM', 'LLM_ERROR');\n }\n\n return content;\n }\n\n /**\n * Generate a structured JSON completion with Zod validation.\n */\n async completeJSON<T>(\n prompt: string,\n schema: z.ZodType<T>,\n options: CompletionOptions = {}\n ): Promise<T> {\n // Build a prompt that requests JSON output\n const jsonPrompt = `${prompt}\n\nRespond ONLY with valid JSON matching this schema:\n${JSON.stringify(zodToJsonSchema(schema), null, 2)}\n\nDo not include any explanation or markdown formatting. Just the JSON object.`;\n\n // Use JSON mode if available\n const useJsonMode = this.jsonMode;\n let body = this.requestBuilder(jsonPrompt, {\n ...options,\n systemPrompt:\n options.systemPrompt ?? 'You are a helpful assistant that responds only with valid JSON.',\n });\n\n if (useJsonMode && typeof body === 'object' && body !== null) {\n body = {\n ...body,\n response_format: { type: 'json_object' },\n } as TRequest;\n }\n\n const { data } = await this.fetch<TResponse>(this.baseUrl, { body });\n const content = this.responseMapper(data);\n\n if (!content) {\n throw new ScrapeError('Empty response from LLM', 'LLM_ERROR');\n }\n\n try {\n const trimmed = content.trim();\n try {\n return schema.parse(JSON.parse(trimmed));\n } catch {\n // Fall back to extracting JSON from markdown or surrounding text\n }\n\n const jsonMatch = content.match(/[[{][\\s\\S]*[\\]}]/);\n if (!jsonMatch) {\n throw new Error('No JSON found in response');\n }\n\n const parsed = JSON.parse(jsonMatch[0]);\n return schema.parse(parsed);\n } catch (error) {\n throw new ScrapeError(\n `Failed to parse LLM response as JSON: ${error instanceof Error ? error.message : String(error)}`,\n 'VALIDATION_ERROR',\n undefined,\n error instanceof Error ? error : undefined\n );\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Utilities\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Convert a Zod schema to a JSON Schema representation.\n * Uses Zod's built-in toJSONSchema method (Zod 4+).\n * Used for prompting LLMs to return structured data.\n */\nexport function zodToJsonSchema(schema: z.ZodType<unknown>): object {\n // Zod 4+ has built-in static toJSONSchema method\n if (typeof z.toJSONSchema === 'function') {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema key as it's not needed for LLM prompting\n const { $schema, ...rest } = jsonSchema as { $schema?: string; [key: string]: unknown };\n return rest;\n }\n\n // Fallback for older Zod versions using _def.type\n const def = (schema as z.ZodType<unknown> & { _def: { type: string } })._def;\n const type = def.type;\n\n switch (type) {\n case 'object': {\n const shape = (schema as z.ZodObject<z.ZodRawShape>).shape;\n const properties: Record<string, object> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n properties[key] = zodToJsonSchema(value as z.ZodType<unknown>);\n const valueDef = (value as z.ZodType<unknown> & { _def: { type: string } })._def;\n if (valueDef.type !== 'optional') {\n required.push(key);\n }\n }\n return { type: 'object', properties, required };\n }\n case 'array': {\n const arrayDef = def as unknown as { element: z.ZodType<unknown> };\n return { type: 'array', items: zodToJsonSchema(arrayDef.element) };\n }\n case 'string':\n return { type: 'string' };\n case 'number':\n return { type: 'number' };\n case 'boolean':\n return { type: 'boolean' };\n case 'enum': {\n const enumDef = def as unknown as { entries: Record<string, string> };\n return { type: 'string', enum: Object.values(enumDef.entries) };\n }\n case 'optional': {\n const optionalDef = def as unknown as { innerType: z.ZodType<unknown> };\n return zodToJsonSchema(optionalDef.innerType);\n }\n default:\n return { type: 'string' };\n }\n}\n\n// Re-export types for convenience\nexport type { ZodType } from 'zod';\n","/**\n * Preset factory functions for common LLM providers.\n * All presets use the HttpLLMProvider with appropriate configuration.\n */\n\nimport { type HttpLLMConfig, HttpLLMProvider } from './http.js';\nimport type { LLMProvider } from './types.js';\n\n// ─────────────────────────────────────────────────────────────\n// OpenAI\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create an OpenAI LLM provider.\n *\n * @example\n * ```ts\n * const provider = createOpenAI({ apiKey: 'sk-...' });\n * const result = await scrape(url, { llm: provider, enhance: ['summarize'] });\n * ```\n */\nexport function createOpenAI(options?: {\n apiKey?: string;\n model?: string;\n baseUrl?: string;\n}): LLMProvider {\n const apiKey = options?.apiKey ?? process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new Error('OpenAI API key required. Set OPENAI_API_KEY env var or pass apiKey option.');\n }\n\n return new HttpLLMProvider({\n baseUrl: options?.baseUrl ?? 'https://api.openai.com/v1/chat/completions',\n model: options?.model ?? 'gpt-4o-mini',\n headers: { Authorization: `Bearer ${apiKey}` },\n jsonMode: true,\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Anthropic\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Anthropic API response shape.\n */\ninterface AnthropicResponse {\n content: Array<{ type: string; text?: string }>;\n}\n\n/**\n * Create an Anthropic Claude LLM provider.\n *\n * @example\n * ```ts\n * const provider = createAnthropic({ apiKey: 'sk-...' });\n * const result = await scrape(url, { llm: provider, enhance: ['summarize'] });\n * ```\n */\nexport function createAnthropic(options?: { apiKey?: string; model?: string }): LLMProvider {\n const apiKey = options?.apiKey ?? process.env.ANTHROPIC_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Anthropic API key required. Set ANTHROPIC_API_KEY env var or pass apiKey option.'\n );\n }\n\n const model = options?.model ?? 'claude-3-5-haiku-20241022';\n\n return new HttpLLMProvider<unknown, AnthropicResponse>({\n baseUrl: 'https://api.anthropic.com/v1/messages',\n model,\n headers: {\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n requestBuilder: (prompt, opts) => ({\n model,\n max_tokens: opts.maxTokens ?? 1024,\n messages: [{ role: 'user', content: prompt }],\n ...(opts.systemPrompt && { system: opts.systemPrompt }),\n ...(opts.temperature !== undefined && { temperature: opts.temperature }),\n }),\n responseMapper: (res) => res.content.find((item) => item.type === 'text')?.text ?? '',\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Groq\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create a Groq LLM provider.\n * Groq provides fast inference for open-source models.\n *\n * @example\n * ```ts\n * const provider = createGroq({ model: 'llama-3.1-70b-versatile' });\n * ```\n */\nexport function createGroq(options?: { apiKey?: string; model?: string }): LLMProvider {\n const apiKey = options?.apiKey ?? process.env.GROQ_API_KEY;\n if (!apiKey) {\n throw new Error('Groq API key required. Set GROQ_API_KEY env var or pass apiKey option.');\n }\n\n return new HttpLLMProvider({\n baseUrl: 'https://api.groq.com/openai/v1/chat/completions',\n model: options?.model ?? 'llama-3.1-70b-versatile',\n headers: { Authorization: `Bearer ${apiKey}` },\n jsonMode: true,\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Ollama (Local)\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create an Ollama LLM provider for local models.\n *\n * @example\n * ```ts\n * const provider = createOllama({ model: 'llama3.2' });\n * ```\n */\nexport function createOllama(options: { model: string; baseUrl?: string }): LLMProvider {\n return new HttpLLMProvider({\n baseUrl: options.baseUrl ?? 'http://localhost:11434/v1/chat/completions',\n model: options.model,\n requireHttps: false,\n allowPrivate: true,\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// LM Studio (Local)\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create an LM Studio LLM provider for local models.\n *\n * @example\n * ```ts\n * const provider = createLMStudio({ model: 'local-model' });\n * ```\n */\nexport function createLMStudio(options: { model: string; baseUrl?: string }): LLMProvider {\n return new HttpLLMProvider({\n baseUrl: options.baseUrl ?? 'http://localhost:1234/v1/chat/completions',\n model: options.model,\n requireHttps: false,\n allowPrivate: true,\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Together AI\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create a Together AI LLM provider.\n *\n * @example\n * ```ts\n * const provider = createTogether({ model: 'meta-llama/Llama-3.2-3B-Instruct-Turbo' });\n * ```\n */\nexport function createTogether(options?: { apiKey?: string; model?: string }): LLMProvider {\n const apiKey = options?.apiKey ?? process.env.TOGETHER_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'Together API key required. Set TOGETHER_API_KEY env var or pass apiKey option.'\n );\n }\n\n return new HttpLLMProvider({\n baseUrl: 'https://api.together.xyz/v1/chat/completions',\n model: options?.model ?? 'meta-llama/Llama-3.2-3B-Instruct-Turbo',\n headers: { Authorization: `Bearer ${apiKey}` },\n jsonMode: true,\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// OpenRouter\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create an OpenRouter LLM provider.\n * OpenRouter provides access to many models through a unified API.\n *\n * @example\n * ```ts\n * const provider = createOpenRouter({\n * model: 'anthropic/claude-3.5-sonnet',\n * });\n * ```\n */\nexport function createOpenRouter(options: {\n apiKey?: string;\n model: string;\n siteUrl?: string;\n siteName?: string;\n}): LLMProvider {\n const apiKey = options.apiKey ?? process.env.OPENROUTER_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'OpenRouter API key required. Set OPENROUTER_API_KEY env var or pass apiKey option.'\n );\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n };\n\n if (options.siteUrl) {\n headers['HTTP-Referer'] = options.siteUrl;\n }\n if (options.siteName) {\n headers['X-Title'] = options.siteName;\n }\n\n return new HttpLLMProvider({\n baseUrl: 'https://openrouter.ai/api/v1/chat/completions',\n model: options.model,\n headers,\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Generic HTTP Provider\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create a generic HTTP LLM provider.\n * Use this for any OpenAI-compatible API.\n *\n * @example\n * ```ts\n * const provider = createHttpLLM({\n * baseUrl: 'https://my-api.com/v1/chat/completions',\n * model: 'my-model',\n * headers: { Authorization: 'Bearer ...' },\n * });\n * ```\n */\nexport function createHttpLLM<TRequest = unknown, TResponse = unknown, TError = unknown>(\n config: HttpLLMConfig<TRequest, TResponse, TError>\n): LLMProvider {\n return new HttpLLMProvider(config);\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { h as ScrapedData, r as EnhancementType, s as ExtractionSchema } from "../types-D0HYR95H.cjs";
1
+ import { B as BaseHttpProvider, h as ScrapedData, r as EnhancementType, s as ExtractionSchema, z as BaseHttpConfig } from "../types-DPEtPihB.cjs";
2
2
  import { z } from "zod";
3
3
 
4
4
  //#region src/llm/types.d.ts
@@ -24,23 +24,6 @@ interface LLMProvider {
24
24
  */
25
25
  completeJSON<T>(prompt: string, schema: z.ZodType<T>, options?: CompletionOptions): Promise<T>;
26
26
  }
27
- /**
28
- * Provider configuration for Anthropic
29
- */
30
- interface AnthropicConfig {
31
- apiKey?: string;
32
- model?: string;
33
- baseUrl?: string;
34
- }
35
- /**
36
- * Provider configuration for OpenAI-compatible APIs
37
- * Works with: OpenAI, Ollama, LM Studio, LocalAI, vLLM, etc.
38
- */
39
- interface OpenAICompatibleConfig {
40
- apiKey?: string;
41
- model?: string;
42
- baseUrl?: string;
43
- }
44
27
  /**
45
28
  * Enhancement result types
46
29
  */
@@ -91,27 +74,6 @@ declare const ClassifySchema: z.ZodObject<{
91
74
  confidence: z.ZodNumber;
92
75
  }, z.core.$strip>;
93
76
  //#endregion
94
- //#region src/llm/anthropic.d.ts
95
- /**
96
- * Anthropic Claude provider
97
- *
98
- * Requires @anthropic-ai/sdk as a peer dependency.
99
- *
100
- * @example
101
- * ```ts
102
- * const provider = new AnthropicProvider({ apiKey: 'sk-...' });
103
- * const result = await scrape(url, { llm: provider, enhance: ['summarize'] });
104
- * ```
105
- */
106
- declare class AnthropicProvider implements LLMProvider {
107
- readonly name = "anthropic";
108
- private client;
109
- private model;
110
- constructor(config?: AnthropicConfig);
111
- complete(prompt: string, options?: CompletionOptions): Promise<string>;
112
- completeJSON<T>(prompt: string, schema: z.ZodType<T>, options?: CompletionOptions): Promise<T>;
113
- }
114
- //#endregion
115
77
  //#region src/llm/enhancer.d.ts
116
78
  /**
117
79
  * Enhance scraped data with LLM-powered features
@@ -136,76 +98,161 @@ declare function ask(data: ScrapedData, provider: LLMProvider, prompt: string, o
136
98
  */
137
99
  declare function extract<T>(data: ScrapedData, provider: LLMProvider, schema: ExtractionSchema, promptTemplate?: string): Promise<T>;
138
100
  //#endregion
139
- //#region src/llm/openai.d.ts
101
+ //#region src/llm/http.d.ts
140
102
  /**
141
- * OpenAI-compatible provider
142
- *
143
- * Works with:
144
- * - OpenAI API
145
- * - Ollama (http://localhost:11434/v1)
146
- * - LM Studio (http://localhost:1234/v1)
147
- * - LocalAI
148
- * - vLLM
149
- * - Any OpenAI-compatible API
150
- *
151
- * Requires `openai` as a peer dependency.
103
+ * HTTP LLM provider configuration.
104
+ */
105
+ interface HttpLLMConfig<TRequest = unknown, TResponse = unknown, TError = unknown> extends BaseHttpConfig<TError> {
106
+ /**
107
+ * Build request body from prompt and options.
108
+ * @default OpenAI-compatible format with messages array
109
+ */
110
+ requestBuilder?: (prompt: string, options: CompletionOptions) => TRequest;
111
+ /**
112
+ * Extract completion text from response.
113
+ * @default (res) => res.choices[0].message.content
114
+ */
115
+ responseMapper?: (response: TResponse) => string;
116
+ /**
117
+ * Enable JSON mode - adds response_format to request.
118
+ * For OpenAI-compatible APIs, this adds { response_format: { type: "json_object" } }
119
+ */
120
+ jsonMode?: boolean;
121
+ }
122
+ /**
123
+ * HTTP-based LLM provider.
124
+ * Works with any REST API using native fetch.
125
+ */
126
+ declare class HttpLLMProvider<TRequest = unknown, TResponse = unknown, TError = unknown> extends BaseHttpProvider<TError> implements LLMProvider {
127
+ readonly name: string;
128
+ private readonly requestBuilder;
129
+ private readonly responseMapper;
130
+ private readonly jsonMode;
131
+ constructor(config: HttpLLMConfig<TRequest, TResponse, TError>);
132
+ /**
133
+ * Generate a text completion.
134
+ */
135
+ complete(prompt: string, options?: CompletionOptions): Promise<string>;
136
+ /**
137
+ * Generate a structured JSON completion with Zod validation.
138
+ */
139
+ completeJSON<T>(prompt: string, schema: z.ZodType<T>, options?: CompletionOptions): Promise<T>;
140
+ }
141
+ /**
142
+ * Convert a Zod schema to a JSON Schema representation.
143
+ * Uses Zod's built-in toJSONSchema method (Zod 4+).
144
+ * Used for prompting LLMs to return structured data.
145
+ */
146
+ declare function zodToJsonSchema(schema: z.ZodType<unknown>): object;
147
+ //#endregion
148
+ //#region src/llm/presets.d.ts
149
+ /**
150
+ * Create an OpenAI LLM provider.
152
151
  *
153
152
  * @example
154
153
  * ```ts
155
- * // OpenAI
156
- * const provider = new OpenAIProvider({ apiKey: 'sk-...' });
157
- *
158
- * // Ollama
159
- * const provider = new OpenAIProvider({
160
- * baseUrl: 'http://localhost:11434/v1',
161
- * model: 'llama3.2',
162
- * apiKey: 'ollama' // Ollama doesn't require a real key
163
- * });
154
+ * const provider = createOpenAI({ apiKey: 'sk-...' });
155
+ * const result = await scrape(url, { llm: provider, enhance: ['summarize'] });
156
+ * ```
157
+ */
158
+ declare function createOpenAI(options?: {
159
+ apiKey?: string;
160
+ model?: string;
161
+ baseUrl?: string;
162
+ }): LLMProvider;
163
+ /**
164
+ * Create an Anthropic Claude LLM provider.
164
165
  *
165
- * // LM Studio
166
- * const provider = new OpenAIProvider({
167
- * baseUrl: 'http://localhost:1234/v1',
168
- * model: 'local-model',
169
- * apiKey: 'lm-studio'
170
- * });
166
+ * @example
167
+ * ```ts
168
+ * const provider = createAnthropic({ apiKey: 'sk-...' });
169
+ * const result = await scrape(url, { llm: provider, enhance: ['summarize'] });
171
170
  * ```
172
171
  */
173
- declare class OpenAIProvider implements LLMProvider {
174
- readonly name = "openai";
175
- private client;
176
- private model;
177
- constructor(config?: OpenAICompatibleConfig);
178
- complete(prompt: string, options?: CompletionOptions): Promise<string>;
179
- completeJSON<T>(prompt: string, schema: z.ZodType<T>, options?: CompletionOptions): Promise<T>;
180
- }
172
+ declare function createAnthropic(options?: {
173
+ apiKey?: string;
174
+ model?: string;
175
+ }): LLMProvider;
181
176
  /**
182
- * Create an OpenAI provider with default settings
177
+ * Create a Groq LLM provider.
178
+ * Groq provides fast inference for open-source models.
179
+ *
180
+ * @example
181
+ * ```ts
182
+ * const provider = createGroq({ model: 'llama-3.1-70b-versatile' });
183
+ * ```
183
184
  */
184
- declare function createOpenAI(config?: OpenAICompatibleConfig): OpenAIProvider;
185
+ declare function createGroq(options?: {
186
+ apiKey?: string;
187
+ model?: string;
188
+ }): LLMProvider;
185
189
  /**
186
- * Create an Ollama provider
190
+ * Create an Ollama LLM provider for local models.
187
191
  *
188
192
  * @example
189
193
  * ```ts
190
194
  * const provider = createOllama({ model: 'llama3.2' });
191
195
  * ```
192
196
  */
193
- declare function createOllama(config?: {
197
+ declare function createOllama(options: {
194
198
  model: string;
195
- port?: number;
196
- }): OpenAIProvider;
199
+ baseUrl?: string;
200
+ }): LLMProvider;
197
201
  /**
198
- * Create an LM Studio provider
202
+ * Create an LM Studio LLM provider for local models.
199
203
  *
200
204
  * @example
201
205
  * ```ts
202
206
  * const provider = createLMStudio({ model: 'local-model' });
203
207
  * ```
204
208
  */
205
- declare function createLMStudio(config?: {
209
+ declare function createLMStudio(options: {
206
210
  model: string;
207
- port?: number;
208
- }): OpenAIProvider;
211
+ baseUrl?: string;
212
+ }): LLMProvider;
213
+ /**
214
+ * Create a Together AI LLM provider.
215
+ *
216
+ * @example
217
+ * ```ts
218
+ * const provider = createTogether({ model: 'meta-llama/Llama-3.2-3B-Instruct-Turbo' });
219
+ * ```
220
+ */
221
+ declare function createTogether(options?: {
222
+ apiKey?: string;
223
+ model?: string;
224
+ }): LLMProvider;
225
+ /**
226
+ * Create an OpenRouter LLM provider.
227
+ * OpenRouter provides access to many models through a unified API.
228
+ *
229
+ * @example
230
+ * ```ts
231
+ * const provider = createOpenRouter({
232
+ * model: 'anthropic/claude-3.5-sonnet',
233
+ * });
234
+ * ```
235
+ */
236
+ declare function createOpenRouter(options: {
237
+ apiKey?: string;
238
+ model: string;
239
+ siteUrl?: string;
240
+ siteName?: string;
241
+ }): LLMProvider;
242
+ /**
243
+ * Create a generic HTTP LLM provider.
244
+ * Use this for any OpenAI-compatible API.
245
+ *
246
+ * @example
247
+ * ```ts
248
+ * const provider = createHttpLLM({
249
+ * baseUrl: 'https://my-api.com/v1/chat/completions',
250
+ * model: 'my-model',
251
+ * headers: { Authorization: 'Bearer ...' },
252
+ * });
253
+ * ```
254
+ */
255
+ declare function createHttpLLM<TRequest = unknown, TResponse = unknown, TError = unknown>(config: HttpLLMConfig<TRequest, TResponse, TError>): LLMProvider;
209
256
  //#endregion
210
- export { type AnthropicConfig, AnthropicProvider, type AskOptions, type ClassifyResult, ClassifySchema, type CompletionOptions, type EntitiesResult, EntitiesSchema, type LLMProvider, type OpenAICompatibleConfig, OpenAIProvider, type SummaryResult, SummarySchema, type TagsResult, TagsSchema, ask, createLMStudio, createOllama, createOpenAI, enhance, extract };
257
+ export { type AskOptions, type ClassifyResult, ClassifySchema, type CompletionOptions, type EntitiesResult, EntitiesSchema, type HttpLLMConfig, HttpLLMProvider, type LLMProvider, type SummaryResult, SummarySchema, type TagsResult, TagsSchema, ask, createAnthropic, createGroq, createHttpLLM, createLMStudio, createOllama, createOpenAI, createOpenRouter, createTogether, enhance, extract, zodToJsonSchema };
211
258
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/llm/types.ts","../../src/llm/anthropic.ts","../../src/llm/enhancer.ts","../../src/llm/openai.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/llm/types.ts","../../src/llm/enhancer.ts","../../src/llm/http.ts","../../src/llm/presets.ts"],"sourcesContent":[],"mappings":"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"}