@nice-tools/fake-llm 1.3.0
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.
- package/dist/browser.d.mts +349 -0
- package/dist/browser.d.ts +349 -0
- package/dist/browser.js +607 -0
- package/dist/browser.js.map +1 -0
- package/dist/browser.mjs +591 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/index.d.mts +120 -0
- package/dist/index.d.ts +120 -0
- package/dist/index.js +941 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +899 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapters/base.adapter.ts","../src/engine/nlp-matcher.ts","../src/engine/keyword-resolver.ts","../src/engine/story-resolver.ts","../src/engine/query-builder.ts","../src/engine/response-builder.ts","../src/config/fetch-loader.ts","../src/adapters/http-mock.adapter.ts","../src/mock-llm-engine.ts","../src/browser-mock-llm.ts"],"names":["answer"],"mappings":"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","file":"browser.mjs","sourcesContent":["import { QueryParams } from '../config/types';\n\n/**\n * Base adapter interface for data sources\n */\nexport interface IDataAdapter {\n query(params: QueryParams): Promise<any[]>;\n getById(id: string): Promise<any>;\n}\n\nexport { QueryParams };\n\nexport abstract class BaseAdapter implements IDataAdapter {\n abstract query(params: QueryParams): Promise<any[]>;\n abstract getById(id: string): Promise<any>;\n\n protected buildWhereClause(filters: Record<string, any>): string {\n if (!filters || Object.keys(filters).length === 0) {\n return '';\n }\n\n const conditions = Object.entries(filters).map(([key, value]) => {\n if (typeof value === 'string') {\n return `c.${key} = '${value}'`;\n }\n return `c.${key} = ${value}`;\n });\n\n return 'WHERE ' + conditions.join(' AND ');\n }\n}\n","import nlp from 'compromise';\nimport { Intent } from '../config/types';\n\n// Stop words to remove from extracted terms\nconst STOP_WORDS = new Set([\n 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',\n 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'shall',\n 'should', 'may', 'might', 'must', 'can', 'could', 'let', 'make',\n 'why', 'what', 'how', 'when', 'where', 'who', 'which', 'that',\n 'this', 'these', 'those', 'it', 'its', 'my', 'your', 'his', 'her',\n 'our', 'their', 'me', 'him', 'us', 'them', 'and', 'or', 'but', 'if',\n 'in', 'on', 'at', 'to', 'for', 'of', 'with', 'by', 'from', 'about',\n 'into', 'through', 'during', 'before', 'after', 'above', 'below',\n 'between', 'out', 'off', 'over', 'under', 'again', 'further',\n 'just', 'also', 'not', 'no', 'nor', 'so', 'yet', 'both', 'either',\n]);\n\nexport class NLPMatcher {\n parseQuery(query: string): Intent {\n // Strip punctuation for cleaner NLP processing\n const cleanQuery = query.replace(/[?!.,;:'\"]/g, ' ').trim();\n const doc = nlp(cleanQuery);\n const action = this.extractAction(query);\n const keywords = this.extractKeywords(doc, cleanQuery);\n const filters = this.extractFilters(query);\n const confidence = keywords.length > 0 ? 0.8 : 0.3;\n\n return { action, keywords, filters, confidence };\n }\n\n private extractAction(query: string): Intent['action'] {\n const q = query.toLowerCase();\n if (q.includes('compare') || q.includes('difference')) return 'compare';\n if (q.includes('diff') || q.includes('what changed')) return 'diff';\n if (q.includes('find') || q.includes('search') || q.includes('which')) return 'find';\n if (q.includes('explain') || q.includes('what is') || q.includes('tell me about') || q.startsWith('why')) return 'explain';\n return 'list';\n }\n\n private extractKeywords(doc: any, cleanQuery: string): string[] {\n const nouns = doc.nouns().out('array') as string[];\n const adjectives = doc.adjectives().out('array') as string[];\n\n // Also split noun phrases into individual words\n const allTerms: string[] = [];\n for (const term of [...nouns, ...adjectives]) {\n // Split multi-word noun phrases into individual words\n const parts = term.toLowerCase().split(/\\s+/);\n allTerms.push(...parts);\n }\n\n // Also add individual words from the clean query as fallback\n const queryWords = cleanQuery.toLowerCase().split(/\\s+/);\n allTerms.push(...queryWords);\n\n return [...new Set(allTerms)]\n .map(w => w.toLowerCase().replace(/[^a-z0-9-]/g, ''))\n .filter(w => w.length > 2 && !STOP_WORDS.has(w));\n }\n\n private extractFilters(query: string): Record<string, any> {\n const filters: Record<string, any> = {};\n // Only extract filters from explicit \"field is/= value\" patterns (not question words like \"why\")\n const questionWords = new Set(['why', 'what', 'how', 'when', 'where', 'who', 'which']);\n const pattern = /(?:where|with)\\s+(\\w+)\\s+(?:is|=|equals?)\\s+['\"]?([^'\"\\s]+)['\"]?/gi;\n let match;\n while ((match = pattern.exec(query)) !== null) {\n const [, key, value] = match;\n if (key && value && !questionWords.has(key.toLowerCase())) {\n filters[key] = value;\n }\n }\n return filters;\n }\n}\n","import { KeywordEntry } from '../config/types';\n\nexport class KeywordResolver {\n constructor(private keywords: KeywordEntry[]) {}\n\n resolve(term: string): KeywordEntry | undefined {\n const lowerTerm = term.toLowerCase();\n\n // Try exact keyword match first\n let match = this.keywords.find(kw => kw.keyword.toLowerCase() === lowerTerm);\n\n // Try exact alias match\n if (!match) {\n match = this.keywords.find(kw =>\n kw.aliases.some(alias => alias.toLowerCase() === lowerTerm)\n );\n }\n\n // Try partial: keyword is a substring of the term (e.g. term \"blue sky\" contains keyword \"sky\")\n if (!match) {\n match = this.keywords.find(kw =>\n kw.keyword.length > 2 && lowerTerm.includes(kw.keyword.toLowerCase())\n );\n }\n\n return match;\n }\n\n /**\n * Resolves a list of NLP-extracted terms AND also checks the full original query\n * against all keyword aliases (to handle multi-word alias phrases).\n */\n resolveAll(terms: string[], fullQuery?: string): KeywordEntry[] {\n const resolved = new Map<string, KeywordEntry>();\n\n // Resolve individual NLP terms\n for (const term of terms) {\n const kw = this.resolve(term);\n if (kw) resolved.set(kw.keyword, kw);\n }\n\n // Also check the full query (lowercased, no punctuation) against all aliases\n if (fullQuery) {\n const lowerQuery = fullQuery.toLowerCase().replace(/[?!.,;:'\"]/g, ' ');\n for (const kw of this.keywords) {\n if (!resolved.has(kw.keyword)) {\n const aliasMatch = kw.aliases.some(alias => {\n const lowerAlias = alias.toLowerCase();\n return lowerAlias.length > 3 && lowerQuery.includes(lowerAlias);\n });\n if (aliasMatch) resolved.set(kw.keyword, kw);\n }\n }\n }\n\n return Array.from(resolved.values());\n }\n\n getRelatedKeywords(keyword: KeywordEntry): KeywordEntry[] {\n return this.keywords.filter(kw =>\n kw.category === keyword.category && kw.keyword !== keyword.keyword\n );\n }\n}\n","import { Story, Intent, KeywordEntry } from '../config/types';\n\nexport interface StoryMatch {\n story: Story;\n score: number;\n matchedKeywords: string[];\n}\n\nexport interface StoryScore {\n storyId: string;\n score: number;\n matchedKeywords: string[];\n storyKeywords: string[];\n}\n\nexport const STORY_THRESHOLD = 0.1;\n\nexport class StoryResolver {\n constructor(private stories: Story[]) {}\n\n scoreAll(intent: Intent, resolvedKeywords: KeywordEntry[]): StoryScore[] {\n return this.stories\n .map(story => {\n const score = this.scoreStory(story, intent, resolvedKeywords);\n const matchedKeywords = resolvedKeywords\n .filter(kw => story.keywords.includes(kw.keyword))\n .map(kw => kw.keyword);\n const storyId = (story as any).story_id || (story as any).id || '';\n return { storyId, score, matchedKeywords, storyKeywords: story.keywords };\n })\n .sort((a, b) => b.score - a.score);\n }\n\n findBestStory(intent: Intent, resolvedKeywords: KeywordEntry[]): StoryMatch | undefined {\n const matches = this.stories.map(story => {\n const score = this.scoreStory(story, intent, resolvedKeywords);\n const matchedKeywords = resolvedKeywords\n .filter(kw => story.keywords.includes(kw.keyword))\n .map(kw => kw.keyword);\n return { story, score, matchedKeywords };\n });\n\n matches.sort((a, b) => b.score - a.score);\n const best = matches[0];\n return best && best.score > STORY_THRESHOLD ? best : undefined;\n }\n\n private scoreStory(story: Story, intent: Intent, resolvedKeywords: KeywordEntry[]): number {\n let score = 0;\n const keywordNames = resolvedKeywords.map(kw => kw.keyword);\n const overlap = story.keywords.filter(kw => keywordNames.includes(kw)).length;\n const keywordScore = overlap / Math.max(story.keywords.length, keywordNames.length, 1);\n score += keywordScore * 0.7;\n\n if (intent.action === 'compare' && story.resolution_steps.some(s => s.action === 'compare')) score += 0.2;\n if (intent.action === 'diff' && story.resolution_steps.some(s => s.action === 'diff')) score += 0.2;\n if (overlap === story.keywords.length) score += 0.1;\n\n return Math.min(score, 1.0);\n }\n}\n","import { ResolutionStep, Intent } from '../config/types';\nimport { QueryParams } from '../adapters/base.adapter';\n\nexport class QueryBuilder {\n buildQuery(step: ResolutionStep, intent: Intent): QueryParams {\n return {\n source: step.from_source || '',\n filters: { ...intent.filters }\n };\n }\n\n buildQueryPreview(step: ResolutionStep, intent: Intent, resolvedKeywords: string[] = []): {\n generatedQuery: string;\n searchPattern: string;\n } {\n const filters = intent.filters || {};\n const where = Object.entries(filters).map(([key, value]) =>\n typeof value === 'string' ? `c.${key} = '${value}'` : `c.${key} = ${value}`\n ).join(' AND ');\n const generatedQuery = where\n ? `SELECT * FROM c WHERE ${where}`\n : `SELECT * FROM c /* ${step.from_source || 'source'} */`;\n const terms = [...new Set([...(step.keyword ? [step.keyword] : []), ...resolvedKeywords])];\n const searchPattern = terms.length > 0\n ? `MATCH ${terms.map(term => `\"${term}\"`).join(' OR ')}`\n : `MATCH ${step.from_source || 'source'}*`;\n return { generatedQuery, searchPattern };\n }\n\n buildSQLWhere(filters: Record<string, any>): string {\n if (!filters || Object.keys(filters).length === 0) return '';\n const conditions = Object.entries(filters).map(([key, value]) =>\n typeof value === 'string' ? `c.${key} = '${value}'` : `c.${key} = ${value}`\n );\n return 'WHERE ' + conditions.join(' AND ');\n }\n}\n","import { Answer, Intent, Story } from '../config/types';\n\nexport class ResponseBuilder {\n buildAnswer(\n intent: Intent,\n story: Story | undefined,\n results: any[],\n executionTime: number,\n source: 'mock-llm' | 'fallback-llm'\n ): Answer {\n return {\n intent,\n story,\n results,\n summary: this.buildSummary(intent, results),\n metadata: {\n execution_time_ms: executionTime,\n source\n }\n };\n }\n\n private buildSummary(intent: Intent, results: any[]): string {\n if (results.length === 0) return \"I couldn't find any results for your question.\";\n\n // If a single result has a direct answer field, return it\n if (results.length === 1 && results[0]?.answer) {\n return results[0].answer;\n }\n\n // For explain intent, prefer the answer field from the best match\n if (intent.action === 'explain') {\n const withAnswer = results.find(r => r.answer);\n if (withAnswer) return withAnswer.answer;\n return Object.entries(results[0])\n .filter(([key]) => !key.startsWith('_') && key !== 'id')\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n }\n\n if (intent.action === 'compare') return `Comparing ${results.length} items.`;\n\n // For multiple results, list all answers if available\n const answers = results.filter(r => r.answer).map(r => r.answer);\n if (answers.length > 0) return answers.join(' | ');\n\n return `Found ${results.length} result(s).`;\n }\n}\n","import { KeywordEntry, Story } from './types';\n\nexport interface FetchConfigLoaderOptions {\n /** URL to a pre-aggregated JSON array of all keyword entries, e.g. '/data/keywords.json' */\n keywordsUrl: string;\n /** URL to a pre-aggregated JSON array of all story definitions, e.g. '/data/stories.json' */\n storiesUrl: string;\n}\n\n/**\n * Isomorphic config loader that fetches keyword and story definitions from\n * pre-aggregated JSON files via `fetch()`.\n *\n * Works in both browser and Node.js (≥ 18) environments with no file-system\n * dependencies. Intended for use with `BrowserMockLLM` and static hosting\n * (e.g. GitHub Pages, CDN, or any HTTP server that can serve JSON files).\n *\n * The expected JSON format for each URL is either:\n * - An array: `[{ keyword: \"sky\", ... }, ...]`\n * - A single object: `{ keyword: \"sky\", ... }` (wrapped into a one-element array)\n */\nexport class FetchConfigLoader {\n constructor(private options: FetchConfigLoaderOptions) {}\n\n async loadKeywords(): Promise<KeywordEntry[]> {\n const response = await fetch(this.options.keywordsUrl);\n if (!response.ok) {\n throw new Error(\n `FetchConfigLoader: Failed to fetch keywords from ${this.options.keywordsUrl} (${response.status})`\n );\n }\n const data = await response.json() as unknown;\n return Array.isArray(data) ? (data as KeywordEntry[]) : [data as KeywordEntry];\n }\n\n async loadStories(): Promise<Story[]> {\n const response = await fetch(this.options.storiesUrl);\n if (!response.ok) {\n throw new Error(\n `FetchConfigLoader: Failed to fetch stories from ${this.options.storiesUrl} (${response.status})`\n );\n }\n const data = await response.json() as unknown;\n return Array.isArray(data) ? (data as Story[]) : [data as Story];\n }\n}\n","import { BaseAdapter, QueryParams } from './base.adapter';\n\nexport interface HttpMockAdapterOptions {\n /**\n * Base URL for all data-source JSON files, e.g. `'https://example.com/data'`\n * or `'/data'` for a relative path on the same origin.\n *\n * A query for `source: 'knowledge/science'` fetches\n * `{baseUrl}/knowledge/science.json`.\n */\n baseUrl: string;\n}\n\n/**\n * Isomorphic data adapter that retrieves pre-aggregated JSON from a static\n * HTTP endpoint via `fetch()`.\n *\n * Works in both browser and Node.js (≥ 18) environments with no file-system\n * dependencies. Intended for use with `BrowserMockLLM` and static hosting\n * (e.g. GitHub Pages, CDN, or any HTTP server that can serve JSON files).\n *\n * Filtering and limiting are applied client-side after fetching the full\n * collection, matching the behaviour of `MockCosmosAdapter`.\n */\nexport class HttpMockAdapter extends BaseAdapter {\n constructor(private options: HttpMockAdapterOptions) {\n super();\n }\n\n async query(params: QueryParams): Promise<any[]> {\n // Validate source to prevent path traversal and protocol injection\n if (\n params.source.includes('..') ||\n params.source.startsWith('/') ||\n params.source.includes('://')\n ) {\n throw new Error(`HttpMockAdapter: Invalid source path '${params.source}'`);\n }\n\n const base = this.options.baseUrl.replace(/\\/$/, '');\n const url = `${base}/${params.source}.json`;\n\n const response = await fetch(url);\n if (!response.ok) {\n if (response.status === 404) return [];\n throw new Error(`HttpMockAdapter: Failed to fetch ${url} (${response.status})`);\n }\n\n const data = await response.json() as unknown;\n let items: any[] = Array.isArray(data) ? (data as any[]) : [data];\n\n if (params.filters && Object.keys(params.filters).length > 0) {\n items = items.filter(item => this.matchesFilters(item, params.filters!));\n }\n\n if (params.limit) {\n items = items.slice(0, params.limit);\n }\n\n return items;\n }\n\n async getById(_id: string): Promise<any> {\n throw new Error('HttpMockAdapter.getById is not supported — use query() with a filters object');\n }\n\n private matchesFilters(item: any, filters: Record<string, any>): boolean {\n return Object.entries(filters).every(([key, value]) => {\n const itemValue = this.getNestedValue(item, key);\n return itemValue === value;\n });\n }\n\n private getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => current?.[key], obj);\n }\n}\n","import { Answer, AnswerDebug, AnswerDebugStep, Intent, KeywordEntry, Story } from './config/types';\nimport { NLPMatcher } from './engine/nlp-matcher';\nimport { KeywordResolver } from './engine/keyword-resolver';\nimport { StoryResolver, STORY_THRESHOLD } from './engine/story-resolver';\nimport { QueryBuilder } from './engine/query-builder';\nimport { ResponseBuilder } from './engine/response-builder';\nimport { BaseAdapter } from './adapters/base.adapter';\n\nexport interface QueryOptions {\n debug?: boolean;\n}\n\nexport interface FallbackLLMConfig {\n enabled: boolean;\n endpoint: string;\n apiKey: string;\n model: string;\n}\n\n/**\n * Isomorphic query engine — works in both Node.js and browser environments.\n *\n * Constructed with already-loaded keywords, stories, a data adapter, and an\n * optional fallback-LLM config. Both `MockLLM` (server) and `BrowserMockLLM`\n * (browser) delegate all query logic to this class.\n */\nexport class MockLLMEngine {\n private nlpMatcher: NLPMatcher;\n private keywordResolver: KeywordResolver;\n private storyResolver: StoryResolver;\n private queryBuilder: QueryBuilder;\n private responseBuilder: ResponseBuilder;\n\n constructor(\n private keywords: KeywordEntry[],\n private stories: Story[],\n private adapter: BaseAdapter,\n private fallbackLLM?: FallbackLLMConfig\n ) {\n this.nlpMatcher = new NLPMatcher();\n this.queryBuilder = new QueryBuilder();\n this.responseBuilder = new ResponseBuilder();\n this.keywordResolver = new KeywordResolver(keywords);\n this.storyResolver = new StoryResolver(stories);\n }\n\n // ─── Introspection API ───────────────────────────────────────────────────────\n\n getKeywords(): KeywordEntry[] {\n return this.keywords;\n }\n\n getStories(): Story[] {\n return this.stories;\n }\n\n listDataSources(): string[] {\n const sources = new Set<string>();\n for (const kw of this.keywords) {\n if (kw.data_source) sources.add(kw.data_source);\n }\n for (const story of this.stories) {\n if (story.contract?.sources) {\n for (const source of story.contract.sources) {\n if (source) sources.add(source);\n }\n }\n for (const step of story.resolution_steps) {\n if (step.from_source) sources.add(step.from_source);\n }\n }\n return Array.from(sources);\n }\n\n async getDataSourceSnapshot(source: string, limit = 50): Promise<any[]> {\n return this.adapter.query({ source, limit });\n }\n\n // ─── Query ───────────────────────────────────────────────────────────────────\n\n async query(userQuery: string, opts: QueryOptions = { debug: true }): Promise<Answer> {\n const includeDebug = opts.debug !== false;\n const startTime = Date.now();\n const intent = this.nlpMatcher.parseQuery(userQuery);\n const nlpTerms = intent.keywords;\n const resolvedKeywords = this.keywordResolver.resolveAll(nlpTerms, userQuery);\n const unresolvedTerms = nlpTerms.filter(\n term => !resolvedKeywords.some(kw =>\n kw.keyword.toLowerCase() === term.toLowerCase() ||\n kw.aliases.some(a => a.toLowerCase() === term.toLowerCase())\n )\n );\n const storyCandidates = this.storyResolver.scoreAll(intent, resolvedKeywords);\n const storyMatch = storyCandidates.find(c => c.score > STORY_THRESHOLD);\n const matchedStory = storyMatch\n ? this.stories.find(s => ((s as any).story_id || (s as any).id) === storyMatch.storyId)\n : undefined;\n\n const debugSteps: AnswerDebugStep[] = [];\n\n if (!matchedStory && this.fallbackLLM?.enabled) {\n const debugInfo: AnswerDebug | undefined = includeDebug ? {\n rawQuery: userQuery,\n intent,\n resolvedKeywords,\n unresolvedTerms,\n storyCandidates,\n selectedStory: undefined,\n threshold: STORY_THRESHOLD,\n decision: 'no-story-fallback-llm',\n steps: [],\n totals: { results: 0, durationMs: Date.now() - startTime }\n } : undefined;\n const ans = await this.queryFallbackLLM(userQuery, intent, startTime);\n if (includeDebug && debugInfo) {\n debugInfo.totals.durationMs = Date.now() - startTime;\n debugInfo.decision = ans.metadata.source === 'fallback-llm' && ans.results.length > 0\n ? 'no-story-fallback-llm'\n : 'fallback-llm-error';\n ans.debug = debugInfo;\n }\n return ans;\n }\n\n if (!matchedStory) {\n const answer = this.responseBuilder.buildAnswer(intent, undefined, [], Date.now() - startTime, 'mock-llm');\n if (includeDebug) {\n answer.debug = {\n rawQuery: userQuery,\n intent,\n resolvedKeywords,\n unresolvedTerms,\n storyCandidates,\n selectedStory: undefined,\n threshold: STORY_THRESHOLD,\n decision: 'no-story-no-results',\n steps: [],\n totals: { results: 0, durationMs: Date.now() - startTime }\n };\n }\n return answer;\n }\n\n let results: any[] = [];\n let stepIndex = 0;\n for (const step of matchedStory.resolution_steps) {\n if (step.action === 'fetch') {\n const queryParams = this.queryBuilder.buildQuery(step, intent);\n const builtFilter = this.queryBuilder.buildSQLWhere(queryParams.filters || {});\n const preview = this.queryBuilder.buildQueryPreview(step, intent, resolvedKeywords.map(kw => kw.keyword));\n const data = await this.adapter.query(queryParams);\n if (includeDebug) {\n debugSteps.push({\n step: step.step ?? ++stepIndex,\n action: step.action,\n source: queryParams.source,\n queryParams,\n builtFilter: builtFilter || `GET ${queryParams.source}/*`,\n generatedQuery: preview.generatedQuery,\n searchPattern: preview.searchPattern,\n rowsReturned: data.length,\n sampleRows: data.slice(0, 3)\n });\n }\n results = [...results, ...data];\n }\n }\n\n const answer = this.responseBuilder.buildAnswer(intent, matchedStory, results, Date.now() - startTime, 'mock-llm');\n if (includeDebug) {\n answer.debug = {\n rawQuery: userQuery,\n intent,\n resolvedKeywords,\n unresolvedTerms,\n storyCandidates,\n selectedStory: { storyId: storyMatch!.storyId, score: storyMatch!.score },\n threshold: STORY_THRESHOLD,\n decision: 'matched-story',\n steps: debugSteps,\n totals: { results: results.length, durationMs: Date.now() - startTime }\n };\n }\n return answer;\n }\n\n private async queryFallbackLLM(userQuery: string, intent: Intent, startTime: number): Promise<Answer> {\n const llmConfig = this.fallbackLLM!;\n try {\n const response = await fetch(llmConfig.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${llmConfig.apiKey}`\n },\n body: JSON.stringify({\n model: llmConfig.model,\n messages: [{ role: 'user', content: userQuery }]\n })\n });\n const data = await response.json() as any;\n const llmAnswer = data.choices?.[0]?.message?.content || 'No response from LLM';\n return {\n intent, story: undefined,\n results: [{ answer: llmAnswer }],\n summary: llmAnswer,\n metadata: { execution_time_ms: Date.now() - startTime, source: 'fallback-llm' }\n };\n } catch (error: any) {\n return {\n intent, story: undefined, results: [],\n summary: `Fallback LLM error: ${error.message}`,\n metadata: { execution_time_ms: Date.now() - startTime, source: 'fallback-llm' }\n };\n }\n }\n}\n","import { Answer, KeywordEntry, Story } from './config/types';\nimport { FetchConfigLoader } from './config/fetch-loader';\nimport { HttpMockAdapter } from './adapters/http-mock.adapter';\nimport { MockLLMEngine, QueryOptions, FallbackLLMConfig } from './mock-llm-engine';\n\nexport { QueryOptions } from './mock-llm-engine';\n\nexport interface BrowserMockLLMOptions {\n /** URL to a pre-aggregated JSON array of all keyword entries, e.g. '/data/keywords.json' */\n keywordsUrl: string;\n /** URL to a pre-aggregated JSON array of all story definitions, e.g. '/data/stories.json' */\n storiesUrl: string;\n /**\n * Base URL for data-source JSON files. A query for `source: 'knowledge/science'`\n * fetches `{dataBaseUrl}/knowledge/science.json`.\n */\n dataBaseUrl: string;\n fallbackLLM?: FallbackLLMConfig;\n}\n\n/**\n * Browser-safe orchestrator for the mock-LLM engine.\n *\n * Loads configuration and data via `fetch()` with no file-system dependencies.\n * Import from `@nice-tools/mock-llm/browser` to keep bundlers from pulling in\n * Node.js-only modules (`fs`, `path`, `@google-cloud/storage`, etc.).\n *\n * @example\n * ```ts\n * import { BrowserMockLLM } from '@nice-tools/mock-llm/browser';\n *\n * const llm = new BrowserMockLLM({\n * keywordsUrl: '/data/keywords.json',\n * storiesUrl: '/data/stories.json',\n * dataBaseUrl: '/data',\n * });\n * await llm.initialize();\n * const answer = await llm.query('what is the color of sky');\n * ```\n */\nexport class BrowserMockLLM {\n private engine!: MockLLMEngine;\n\n constructor(private options: BrowserMockLLMOptions) {}\n\n async initialize(): Promise<void> {\n const loader = new FetchConfigLoader({\n keywordsUrl: this.options.keywordsUrl,\n storiesUrl: this.options.storiesUrl,\n });\n const [keywords, stories] = await Promise.all([\n loader.loadKeywords(),\n loader.loadStories(),\n ]);\n const adapter = new HttpMockAdapter({ baseUrl: this.options.dataBaseUrl });\n const fallbackLLM = this.options.fallbackLLM?.enabled\n ? this.options.fallbackLLM\n : undefined;\n this.engine = new MockLLMEngine(keywords, stories, adapter, fallbackLLM);\n }\n\n // ─── Introspection API (mirrors MockLLM) ─────────────────────────────────────\n\n getKeywords(): KeywordEntry[] { return this.engine.getKeywords(); }\n getStories(): Story[] { return this.engine.getStories(); }\n listDataSources(): string[] { return this.engine.listDataSources(); }\n\n async getDataSourceSnapshot(source: string, limit = 50): Promise<any[]> {\n return this.engine.getDataSourceSnapshot(source, limit);\n }\n\n // ─── Query ───────────────────────────────────────────────────────────────────\n\n async query(userQuery: string, opts: QueryOptions = { debug: true }): Promise<Answer> {\n return this.engine.query(userQuery, opts);\n }\n}\n"]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { BaseAdapter, QueryParams, ConfigSource, AdapterConnections, KeywordEntry, Story, QueryOptions, Answer } from './browser.mjs';
|
|
2
|
+
export { AnswerDebug, AnswerDebugStep, BrowserMockLLM, BrowserMockLLMOptions, FallbackLLMConfig, FetchConfigLoader, FetchConfigLoaderOptions, HttpMockAdapter, HttpMockAdapterOptions, IDataAdapter, Intent, KeywordResolver, MockLLMEngine, NLPMatcher, QueryBuilder, Relation, ResolutionStep, ResponseBuilder, STORY_THRESHOLD, StoryContract, StoryMatch, StoryResolver, StoryScore } from './browser.mjs';
|
|
3
|
+
|
|
4
|
+
interface CosmosAdapterOptions {
|
|
5
|
+
endpoint: string;
|
|
6
|
+
key: string;
|
|
7
|
+
databaseId: string;
|
|
8
|
+
}
|
|
9
|
+
declare class CosmosAdapter extends BaseAdapter {
|
|
10
|
+
private options;
|
|
11
|
+
private client;
|
|
12
|
+
private database;
|
|
13
|
+
constructor(options: CosmosAdapterOptions);
|
|
14
|
+
query(params: QueryParams): Promise<any[]>;
|
|
15
|
+
getById(id: string): Promise<any>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface BlobAdapterOptions {
|
|
19
|
+
connectionString?: string;
|
|
20
|
+
sasToken?: string;
|
|
21
|
+
accountName?: string;
|
|
22
|
+
accountKey?: string;
|
|
23
|
+
}
|
|
24
|
+
declare class BlobAdapter extends BaseAdapter {
|
|
25
|
+
private options;
|
|
26
|
+
private blobServiceClient;
|
|
27
|
+
constructor(options: BlobAdapterOptions);
|
|
28
|
+
query(params: QueryParams): Promise<any[]>;
|
|
29
|
+
getById(id: string): Promise<any>;
|
|
30
|
+
private matchesFilters;
|
|
31
|
+
/**
|
|
32
|
+
* Reads blob download response content as a UTF-8 string.
|
|
33
|
+
*
|
|
34
|
+
* The Azure Blob SDK exposes different properties depending on the runtime:
|
|
35
|
+
* - Browser: `blobBody` (`Promise<Blob>`) — uses `Blob.text()`.
|
|
36
|
+
* - Node.js: `readableStreamBody` (`NodeJS.ReadableStream`) — uses stream events.
|
|
37
|
+
*/
|
|
38
|
+
private readDownloadResponse;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface GCSAdapterOptions {
|
|
42
|
+
projectId: string;
|
|
43
|
+
keyFilePath: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Google Cloud Storage adapter for fetching JSON data from GCS buckets.
|
|
47
|
+
*
|
|
48
|
+
* @server-only The `@google-cloud/storage` SDK is Node.js-only and has no
|
|
49
|
+
* browser build. Do not import from `@nice-tools/mock-llm/browser`.
|
|
50
|
+
*/
|
|
51
|
+
declare class GCSAdapter extends BaseAdapter {
|
|
52
|
+
private options;
|
|
53
|
+
private storage;
|
|
54
|
+
constructor(options: GCSAdapterOptions);
|
|
55
|
+
query(params: QueryParams): Promise<any[]>;
|
|
56
|
+
getById(id: string): Promise<any>;
|
|
57
|
+
private matchesFilters;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
interface MockCosmosAdapterOptions {
|
|
61
|
+
basePath: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Mock Cosmos DB adapter that reads from folder structure:
|
|
65
|
+
* basePath/{databaseId}/{containerId}/{id}.json
|
|
66
|
+
*/
|
|
67
|
+
declare class MockCosmosAdapter extends BaseAdapter {
|
|
68
|
+
private options;
|
|
69
|
+
constructor(options: MockCosmosAdapterOptions);
|
|
70
|
+
query(params: QueryParams): Promise<any[]>;
|
|
71
|
+
getById(id: string): Promise<any>;
|
|
72
|
+
private matchesFilters;
|
|
73
|
+
private getNestedValue;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface ImageAnalysisResult {
|
|
77
|
+
format: string;
|
|
78
|
+
size: number;
|
|
79
|
+
base64?: string;
|
|
80
|
+
error?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Simple image adapter for reading and encoding local images as base64.
|
|
84
|
+
*
|
|
85
|
+
* @server-only This adapter uses Node.js `fs` and `path` APIs and cannot run
|
|
86
|
+
* in a browser environment. Do not import from `@nice-tools/mock-llm/browser`.
|
|
87
|
+
*/
|
|
88
|
+
declare class ImageAdapter {
|
|
89
|
+
readImage(imagePath: string): Promise<ImageAnalysisResult>;
|
|
90
|
+
analyzeImage(imagePath: string): Promise<string>;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
interface MockLLMOptions {
|
|
94
|
+
configSource: ConfigSource;
|
|
95
|
+
connections: AdapterConnections;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Server-side (Node.js) orchestrator for the mock-LLM engine.
|
|
99
|
+
*
|
|
100
|
+
* Loads configuration from the local file system via `ConfigLoader` and reads
|
|
101
|
+
* data via `MockCosmosAdapter` or `CosmosAdapter`. All query logic is
|
|
102
|
+
* delegated to the isomorphic `MockLLMEngine`.
|
|
103
|
+
*
|
|
104
|
+
* For browser / edge environments use `BrowserMockLLM` from
|
|
105
|
+
* `@nice-tools/mock-llm/browser` instead.
|
|
106
|
+
*/
|
|
107
|
+
declare class MockLLM {
|
|
108
|
+
private options;
|
|
109
|
+
private configLoader;
|
|
110
|
+
private engine;
|
|
111
|
+
constructor(options: MockLLMOptions);
|
|
112
|
+
initialize(): Promise<void>;
|
|
113
|
+
getKeywords(): KeywordEntry[];
|
|
114
|
+
getStories(): Story[];
|
|
115
|
+
listDataSources(): string[];
|
|
116
|
+
getDataSourceSnapshot(source: string, limit?: number): Promise<any[]>;
|
|
117
|
+
query(userQuery: string, opts?: QueryOptions): Promise<Answer>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { AdapterConnections, Answer, BaseAdapter, BlobAdapter, type BlobAdapterOptions, ConfigSource, CosmosAdapter, type CosmosAdapterOptions, GCSAdapter, type GCSAdapterOptions, ImageAdapter, type ImageAnalysisResult, KeywordEntry, MockCosmosAdapter, type MockCosmosAdapterOptions, MockLLM, type MockLLMOptions, QueryOptions, QueryParams, Story };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { BaseAdapter, QueryParams, ConfigSource, AdapterConnections, KeywordEntry, Story, QueryOptions, Answer } from './browser.js';
|
|
2
|
+
export { AnswerDebug, AnswerDebugStep, BrowserMockLLM, BrowserMockLLMOptions, FallbackLLMConfig, FetchConfigLoader, FetchConfigLoaderOptions, HttpMockAdapter, HttpMockAdapterOptions, IDataAdapter, Intent, KeywordResolver, MockLLMEngine, NLPMatcher, QueryBuilder, Relation, ResolutionStep, ResponseBuilder, STORY_THRESHOLD, StoryContract, StoryMatch, StoryResolver, StoryScore } from './browser.js';
|
|
3
|
+
|
|
4
|
+
interface CosmosAdapterOptions {
|
|
5
|
+
endpoint: string;
|
|
6
|
+
key: string;
|
|
7
|
+
databaseId: string;
|
|
8
|
+
}
|
|
9
|
+
declare class CosmosAdapter extends BaseAdapter {
|
|
10
|
+
private options;
|
|
11
|
+
private client;
|
|
12
|
+
private database;
|
|
13
|
+
constructor(options: CosmosAdapterOptions);
|
|
14
|
+
query(params: QueryParams): Promise<any[]>;
|
|
15
|
+
getById(id: string): Promise<any>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface BlobAdapterOptions {
|
|
19
|
+
connectionString?: string;
|
|
20
|
+
sasToken?: string;
|
|
21
|
+
accountName?: string;
|
|
22
|
+
accountKey?: string;
|
|
23
|
+
}
|
|
24
|
+
declare class BlobAdapter extends BaseAdapter {
|
|
25
|
+
private options;
|
|
26
|
+
private blobServiceClient;
|
|
27
|
+
constructor(options: BlobAdapterOptions);
|
|
28
|
+
query(params: QueryParams): Promise<any[]>;
|
|
29
|
+
getById(id: string): Promise<any>;
|
|
30
|
+
private matchesFilters;
|
|
31
|
+
/**
|
|
32
|
+
* Reads blob download response content as a UTF-8 string.
|
|
33
|
+
*
|
|
34
|
+
* The Azure Blob SDK exposes different properties depending on the runtime:
|
|
35
|
+
* - Browser: `blobBody` (`Promise<Blob>`) — uses `Blob.text()`.
|
|
36
|
+
* - Node.js: `readableStreamBody` (`NodeJS.ReadableStream`) — uses stream events.
|
|
37
|
+
*/
|
|
38
|
+
private readDownloadResponse;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface GCSAdapterOptions {
|
|
42
|
+
projectId: string;
|
|
43
|
+
keyFilePath: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Google Cloud Storage adapter for fetching JSON data from GCS buckets.
|
|
47
|
+
*
|
|
48
|
+
* @server-only The `@google-cloud/storage` SDK is Node.js-only and has no
|
|
49
|
+
* browser build. Do not import from `@nice-tools/mock-llm/browser`.
|
|
50
|
+
*/
|
|
51
|
+
declare class GCSAdapter extends BaseAdapter {
|
|
52
|
+
private options;
|
|
53
|
+
private storage;
|
|
54
|
+
constructor(options: GCSAdapterOptions);
|
|
55
|
+
query(params: QueryParams): Promise<any[]>;
|
|
56
|
+
getById(id: string): Promise<any>;
|
|
57
|
+
private matchesFilters;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
interface MockCosmosAdapterOptions {
|
|
61
|
+
basePath: string;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Mock Cosmos DB adapter that reads from folder structure:
|
|
65
|
+
* basePath/{databaseId}/{containerId}/{id}.json
|
|
66
|
+
*/
|
|
67
|
+
declare class MockCosmosAdapter extends BaseAdapter {
|
|
68
|
+
private options;
|
|
69
|
+
constructor(options: MockCosmosAdapterOptions);
|
|
70
|
+
query(params: QueryParams): Promise<any[]>;
|
|
71
|
+
getById(id: string): Promise<any>;
|
|
72
|
+
private matchesFilters;
|
|
73
|
+
private getNestedValue;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface ImageAnalysisResult {
|
|
77
|
+
format: string;
|
|
78
|
+
size: number;
|
|
79
|
+
base64?: string;
|
|
80
|
+
error?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Simple image adapter for reading and encoding local images as base64.
|
|
84
|
+
*
|
|
85
|
+
* @server-only This adapter uses Node.js `fs` and `path` APIs and cannot run
|
|
86
|
+
* in a browser environment. Do not import from `@nice-tools/mock-llm/browser`.
|
|
87
|
+
*/
|
|
88
|
+
declare class ImageAdapter {
|
|
89
|
+
readImage(imagePath: string): Promise<ImageAnalysisResult>;
|
|
90
|
+
analyzeImage(imagePath: string): Promise<string>;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
interface MockLLMOptions {
|
|
94
|
+
configSource: ConfigSource;
|
|
95
|
+
connections: AdapterConnections;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Server-side (Node.js) orchestrator for the mock-LLM engine.
|
|
99
|
+
*
|
|
100
|
+
* Loads configuration from the local file system via `ConfigLoader` and reads
|
|
101
|
+
* data via `MockCosmosAdapter` or `CosmosAdapter`. All query logic is
|
|
102
|
+
* delegated to the isomorphic `MockLLMEngine`.
|
|
103
|
+
*
|
|
104
|
+
* For browser / edge environments use `BrowserMockLLM` from
|
|
105
|
+
* `@nice-tools/mock-llm/browser` instead.
|
|
106
|
+
*/
|
|
107
|
+
declare class MockLLM {
|
|
108
|
+
private options;
|
|
109
|
+
private configLoader;
|
|
110
|
+
private engine;
|
|
111
|
+
constructor(options: MockLLMOptions);
|
|
112
|
+
initialize(): Promise<void>;
|
|
113
|
+
getKeywords(): KeywordEntry[];
|
|
114
|
+
getStories(): Story[];
|
|
115
|
+
listDataSources(): string[];
|
|
116
|
+
getDataSourceSnapshot(source: string, limit?: number): Promise<any[]>;
|
|
117
|
+
query(userQuery: string, opts?: QueryOptions): Promise<Answer>;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { AdapterConnections, Answer, BaseAdapter, BlobAdapter, type BlobAdapterOptions, ConfigSource, CosmosAdapter, type CosmosAdapterOptions, GCSAdapter, type GCSAdapterOptions, ImageAdapter, type ImageAnalysisResult, KeywordEntry, MockCosmosAdapter, type MockCosmosAdapterOptions, MockLLM, type MockLLMOptions, QueryOptions, QueryParams, Story };
|