mdcontext 0.1.0 → 0.2.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/.changeset/config.json +9 -9
- package/.claude/settings.local.json +25 -0
- package/.github/workflows/claude-code-review.yml +44 -0
- package/.github/workflows/claude.yml +85 -0
- package/CONTRIBUTING.md +186 -0
- package/NOTES/NOTES +44 -0
- package/README.md +206 -3
- package/biome.json +1 -1
- package/dist/chunk-23UPXDNL.js +3044 -0
- package/dist/chunk-2W7MO2DL.js +1366 -0
- package/dist/chunk-3NUAZGMA.js +1689 -0
- package/dist/chunk-7TOWB2XB.js +366 -0
- package/dist/chunk-7XOTOADQ.js +3065 -0
- package/dist/chunk-AH2PDM2K.js +3042 -0
- package/dist/chunk-BNXWSZ63.js +3742 -0
- package/dist/chunk-BTL5DJVU.js +3222 -0
- package/dist/chunk-HDHYG7E4.js +104 -0
- package/dist/chunk-HLR4KZBP.js +3234 -0
- package/dist/chunk-IP3FRFEB.js +1045 -0
- package/dist/chunk-KHU56VDO.js +3042 -0
- package/dist/chunk-KRYIFLQR.js +85 -89
- package/dist/chunk-LBSDNLEM.js +287 -0
- package/dist/chunk-MNTQ7HCP.js +2643 -0
- package/dist/chunk-MUJELQQ6.js +1387 -0
- package/dist/chunk-MXJGMSLV.js +2199 -0
- package/dist/chunk-N6QJGC3Z.js +2636 -0
- package/dist/chunk-OBELGBPM.js +1713 -0
- package/dist/chunk-OT7R5XTA.js +3192 -0
- package/dist/chunk-P7X4RA2T.js +106 -0
- package/dist/chunk-PIDUQNC2.js +3185 -0
- package/dist/chunk-POGCDIH4.js +3187 -0
- package/dist/chunk-PSIEOQGZ.js +3043 -0
- package/dist/chunk-PVRT3IHA.js +3238 -0
- package/dist/chunk-QNN4TT23.js +1430 -0
- package/dist/chunk-RE3R45RJ.js +3042 -0
- package/dist/chunk-S7E6TFX6.js +718 -657
- package/dist/chunk-SG6GLU4U.js +1378 -0
- package/dist/chunk-SJCDV2ST.js +274 -0
- package/dist/chunk-SYE5XLF3.js +104 -0
- package/dist/chunk-T5VLYBZD.js +103 -0
- package/dist/chunk-TOQB7VWU.js +3238 -0
- package/dist/chunk-VFNMZ4ZQ.js +3228 -0
- package/dist/chunk-VVTGZNBT.js +1533 -1423
- package/dist/chunk-W7Q4RFEV.js +104 -0
- package/dist/chunk-XTYYVRLO.js +3190 -0
- package/dist/chunk-Y6MDYVJD.js +3063 -0
- package/dist/cli/main.js +4072 -629
- package/dist/index.d.ts +420 -33
- package/dist/index.js +8 -15
- package/dist/mcp/server.js +103 -7
- package/dist/schema-BAWSG7KY.js +22 -0
- package/dist/schema-E3QUPL26.js +20 -0
- package/dist/schema-EHL7WUT6.js +20 -0
- package/docs/019-USAGE.md +44 -5
- package/docs/020-current-implementation.md +8 -8
- package/docs/021-DOGFOODING-FINDINGS.md +1 -1
- package/docs/CONFIG.md +1123 -0
- package/docs/ERRORS.md +383 -0
- package/docs/summarization.md +320 -0
- package/justfile +40 -0
- package/package.json +39 -33
- package/research/INDEX.md +315 -0
- package/research/code-review/README.md +90 -0
- package/research/code-review/cli-error-handling-review.md +979 -0
- package/research/code-review/code-review-validation-report.md +464 -0
- package/research/code-review/main-ts-review.md +1128 -0
- package/research/config-docs/SUMMARY.md +357 -0
- package/research/config-docs/TEST-RESULTS.md +776 -0
- package/research/config-docs/TODO.md +542 -0
- package/research/config-docs/analysis.md +744 -0
- package/research/config-docs/fix-validation.md +502 -0
- package/research/config-docs/help-audit.md +264 -0
- package/research/config-docs/help-system-analysis.md +890 -0
- package/research/frontmatter/COMMENTS-ARE-SKIPPED.md +149 -0
- package/research/frontmatter/LLM-CODE-NAVIGATION.md +276 -0
- package/research/issue-review.md +603 -0
- package/research/llm-summarization/agent-cli-tools-2026.md +1082 -0
- package/research/llm-summarization/alternative-providers-2026.md +1428 -0
- package/research/llm-summarization/anthropic-2026.md +367 -0
- package/research/llm-summarization/claude-cli-integration.md +1706 -0
- package/research/llm-summarization/cli-integration-patterns.md +3155 -0
- package/research/llm-summarization/openai-2026.md +473 -0
- package/research/llm-summarization/openai-compatible-providers-2026.md +1022 -0
- package/research/llm-summarization/opencode-cli-integration.md +1552 -0
- package/research/llm-summarization/prompt-engineering-2026.md +1426 -0
- package/research/llm-summarization/prototype-results.md +56 -0
- package/research/llm-summarization/provider-switching-patterns-2026.md +2153 -0
- package/research/llm-summarization/typescript-llm-libraries-2026.md +2436 -0
- package/research/mdcontext-pudding/00-EXECUTIVE-SUMMARY.md +282 -0
- package/research/mdcontext-pudding/01-index-embed.md +956 -0
- package/research/mdcontext-pudding/02-search-COMMANDS.md +142 -0
- package/research/mdcontext-pudding/02-search-SUMMARY.md +146 -0
- package/research/mdcontext-pudding/02-search.md +970 -0
- package/research/mdcontext-pudding/03-context.md +779 -0
- package/research/mdcontext-pudding/04-navigation-and-analytics.md +803 -0
- package/research/mdcontext-pudding/04-tree.md +704 -0
- package/research/mdcontext-pudding/05-config.md +1038 -0
- package/research/mdcontext-pudding/06-links-summary.txt +87 -0
- package/research/mdcontext-pudding/06-links.md +679 -0
- package/research/mdcontext-pudding/07-stats.md +693 -0
- package/research/mdcontext-pudding/BUG-FIX-PLAN.md +388 -0
- package/research/mdcontext-pudding/P0-BUG-VALIDATION.md +167 -0
- package/research/mdcontext-pudding/README.md +168 -0
- package/research/mdcontext-pudding/TESTING-SUMMARY.md +128 -0
- package/research/research-quality-review.md +834 -0
- package/research/semantic-search/embedding-text-analysis.md +156 -0
- package/research/semantic-search/multi-word-failure-reproduction.md +171 -0
- package/research/semantic-search/query-processing-analysis.md +207 -0
- package/research/semantic-search/root-cause-and-solution.md +114 -0
- package/research/semantic-search/threshold-validation-report.md +69 -0
- package/research/semantic-search/vector-search-analysis.md +63 -0
- package/research/test-path-issues.md +276 -0
- package/review/ALP-76/1-error-type-design.md +962 -0
- package/review/ALP-76/2-error-handling-patterns.md +906 -0
- package/review/ALP-76/3-error-presentation.md +624 -0
- package/review/ALP-76/4-test-coverage.md +625 -0
- package/review/ALP-76/5-migration-completeness.md +440 -0
- package/review/ALP-76/6-effect-best-practices.md +755 -0
- package/scripts/apply-branch-protection.sh +47 -0
- package/scripts/branch-protection-templates.json +79 -0
- package/scripts/prototype-summarization.ts +346 -0
- package/scripts/rebuild-hnswlib.js +32 -37
- package/scripts/setup-branch-protection.sh +64 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/active-provider.json +7 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.json +541 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/bm25.meta.json +5 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/config.json +8 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/documents.json +60 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/links.json +13 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/.mdcontext/indexes/sections.json +1197 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/configuration-management.md +99 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/distributed-systems.md +92 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/error-handling.md +78 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/failure-automation.md +55 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/job-context.md +69 -0
- package/src/__tests__/fixtures/semantic-search/multi-word-corpus/process-orchestration.md +99 -0
- package/src/cli/argv-preprocessor.test.ts +2 -2
- package/src/cli/cli.test.ts +230 -33
- package/src/cli/commands/config-cmd.ts +642 -0
- package/src/cli/commands/context.ts +97 -9
- package/src/cli/commands/duplicates.ts +122 -0
- package/src/cli/commands/embeddings.ts +529 -0
- package/src/cli/commands/index-cmd.ts +210 -30
- package/src/cli/commands/index.ts +3 -0
- package/src/cli/commands/search.ts +894 -64
- package/src/cli/commands/stats.ts +3 -0
- package/src/cli/commands/tree.ts +26 -5
- package/src/cli/config-layer.ts +176 -0
- package/src/cli/error-handler.test.ts +235 -0
- package/src/cli/error-handler.ts +655 -0
- package/src/cli/flag-schemas.ts +66 -0
- package/src/cli/help.ts +209 -7
- package/src/cli/main.ts +348 -58
- package/src/cli/options.ts +10 -0
- package/src/cli/shared-error-handling.ts +199 -0
- package/src/cli/utils.ts +150 -17
- package/src/config/file-provider.test.ts +320 -0
- package/src/config/file-provider.ts +273 -0
- package/src/config/index.ts +72 -0
- package/src/config/integration.test.ts +667 -0
- package/src/config/precedence.test.ts +277 -0
- package/src/config/precedence.ts +451 -0
- package/src/config/schema.test.ts +414 -0
- package/src/config/schema.ts +603 -0
- package/src/config/service.test.ts +320 -0
- package/src/config/service.ts +243 -0
- package/src/config/testing.test.ts +264 -0
- package/src/config/testing.ts +110 -0
- package/src/core/types.ts +6 -33
- package/src/duplicates/detector.test.ts +183 -0
- package/src/duplicates/detector.ts +414 -0
- package/src/duplicates/index.ts +18 -0
- package/src/embeddings/embedding-namespace.test.ts +300 -0
- package/src/embeddings/embedding-namespace.ts +947 -0
- package/src/embeddings/heading-boost.test.ts +222 -0
- package/src/embeddings/hnsw-build-options.test.ts +198 -0
- package/src/embeddings/hyde.test.ts +272 -0
- package/src/embeddings/hyde.ts +264 -0
- package/src/embeddings/index.ts +2 -0
- package/src/embeddings/openai-provider.ts +332 -83
- package/src/embeddings/pricing.json +22 -0
- package/src/embeddings/provider-constants.ts +204 -0
- package/src/embeddings/provider-errors.test.ts +967 -0
- package/src/embeddings/provider-errors.ts +565 -0
- package/src/embeddings/provider-factory.test.ts +240 -0
- package/src/embeddings/provider-factory.ts +225 -0
- package/src/embeddings/provider-integration.test.ts +788 -0
- package/src/embeddings/query-preprocessing.test.ts +187 -0
- package/src/embeddings/semantic-search-threshold.test.ts +508 -0
- package/src/embeddings/semantic-search.ts +780 -93
- package/src/embeddings/types.ts +293 -16
- package/src/embeddings/vector-store.ts +486 -77
- package/src/embeddings/voyage-provider.ts +313 -0
- package/src/errors/errors.test.ts +845 -0
- package/src/errors/index.ts +533 -0
- package/src/index/ignore-patterns.test.ts +354 -0
- package/src/index/ignore-patterns.ts +305 -0
- package/src/index/indexer.ts +286 -48
- package/src/index/storage.ts +94 -30
- package/src/index/types.ts +40 -2
- package/src/index/watcher.ts +67 -9
- package/src/index.ts +22 -0
- package/src/integration/search-keyword.test.ts +678 -0
- package/src/mcp/server.ts +135 -6
- package/src/parser/parser.ts +18 -19
- package/src/parser/section-filter.test.ts +277 -0
- package/src/parser/section-filter.ts +125 -3
- package/src/search/__tests__/hybrid-search.test.ts +650 -0
- package/src/search/bm25-store.ts +366 -0
- package/src/search/cross-encoder.test.ts +253 -0
- package/src/search/cross-encoder.ts +406 -0
- package/src/search/fuzzy-search.test.ts +419 -0
- package/src/search/fuzzy-search.ts +273 -0
- package/src/search/hybrid-search.ts +448 -0
- package/src/search/path-matcher.test.ts +276 -0
- package/src/search/path-matcher.ts +33 -0
- package/src/search/searcher.test.ts +99 -1
- package/src/search/searcher.ts +189 -67
- package/src/search/wink-bm25.d.ts +30 -0
- package/src/summarization/cli-providers/claude.ts +202 -0
- package/src/summarization/cli-providers/detection.test.ts +273 -0
- package/src/summarization/cli-providers/detection.ts +118 -0
- package/src/summarization/cli-providers/index.ts +8 -0
- package/src/summarization/cost.test.ts +139 -0
- package/src/summarization/cost.ts +102 -0
- package/src/summarization/error-handler.test.ts +127 -0
- package/src/summarization/error-handler.ts +111 -0
- package/src/summarization/index.ts +102 -0
- package/src/summarization/pipeline.test.ts +498 -0
- package/src/summarization/pipeline.ts +231 -0
- package/src/summarization/prompts.test.ts +269 -0
- package/src/summarization/prompts.ts +133 -0
- package/src/summarization/provider-factory.test.ts +396 -0
- package/src/summarization/provider-factory.ts +178 -0
- package/src/summarization/types.ts +184 -0
- package/src/summarize/summarizer.ts +104 -35
- package/src/types/huggingface-transformers.d.ts +66 -0
- package/tests/fixtures/cli/.mdcontext/active-provider.json +7 -0
- package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.bin +0 -0
- package/tests/fixtures/cli/.mdcontext/embeddings/openai_text-embedding-3-small_512/vectors.meta.bin +0 -0
- package/tests/fixtures/cli/.mdcontext/indexes/documents.json +4 -4
- package/tests/fixtures/cli/.mdcontext/indexes/sections.json +14 -0
- package/tests/integration/embed-index.test.ts +712 -0
- package/tests/integration/search-context.test.ts +469 -0
- package/tests/integration/search-semantic.test.ts +522 -0
- package/vitest.config.ts +1 -6
- package/AGENTS.md +0 -46
- package/tests/fixtures/cli/.mdcontext/vectors.bin +0 -0
- package/tests/fixtures/cli/.mdcontext/vectors.meta.json +0 -1264
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Constants
|
|
3
|
+
*
|
|
4
|
+
* Centralized constants for embedding providers to avoid duplication
|
|
5
|
+
* and maintain a single source of truth.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { EmbeddingProvider } from '../config/schema.js'
|
|
9
|
+
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Model Dimension Defaults
|
|
12
|
+
// ============================================================================
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Native embedding dimensions for each model.
|
|
16
|
+
*
|
|
17
|
+
* OpenAI models support Matryoshka Representation Learning (MRL) which allows
|
|
18
|
+
* dimension reduction. Ollama models have fixed native dimensions.
|
|
19
|
+
*
|
|
20
|
+
* Key:
|
|
21
|
+
* - OpenAI: Supports dimension reduction (e.g., 1536 → 512)
|
|
22
|
+
* - Ollama: Fixed native dimensions only
|
|
23
|
+
*/
|
|
24
|
+
export const MODEL_DIMENSIONS: Record<string, number> = {
|
|
25
|
+
// OpenAI models (support MRL dimension reduction)
|
|
26
|
+
'text-embedding-3-small': 1536, // Native: 1536, supports reduction
|
|
27
|
+
'text-embedding-3-large': 3072, // Native: 3072, supports reduction
|
|
28
|
+
'text-embedding-ada-002': 1536, // Native: 1536, does NOT support reduction
|
|
29
|
+
|
|
30
|
+
// Ollama models (fixed native dimensions)
|
|
31
|
+
'nomic-embed-text': 768,
|
|
32
|
+
'mxbai-embed-large': 1024,
|
|
33
|
+
'bge-m3': 1024,
|
|
34
|
+
'all-minilm': 384,
|
|
35
|
+
'snowflake-arctic-embed': 1024,
|
|
36
|
+
|
|
37
|
+
// Voyage AI models (fixed native dimensions)
|
|
38
|
+
'voyage-3.5-lite': 1024, // Best value: $0.02/1M tokens
|
|
39
|
+
'voyage-3': 1024, // Higher quality: $0.06/1M tokens
|
|
40
|
+
'voyage-code-3': 1024, // Code-optimized: $0.18/1M tokens
|
|
41
|
+
'voyage-2': 1024,
|
|
42
|
+
'voyage-large-2': 1536,
|
|
43
|
+
'voyage-code-2': 1536,
|
|
44
|
+
} as const
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Models that support Matryoshka dimension reduction.
|
|
48
|
+
* These models can be reduced to smaller dimensions without re-training.
|
|
49
|
+
*/
|
|
50
|
+
export const MATRYOSHKA_MODELS = new Set([
|
|
51
|
+
'text-embedding-3-small',
|
|
52
|
+
'text-embedding-3-large',
|
|
53
|
+
])
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Check if a model supports dimension reduction via Matryoshka.
|
|
57
|
+
*/
|
|
58
|
+
export const supportsMatryoshka = (model: string): boolean =>
|
|
59
|
+
MATRYOSHKA_MODELS.has(model)
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get the native dimensions for a model.
|
|
63
|
+
*
|
|
64
|
+
* @param model - Model name
|
|
65
|
+
* @returns Native dimensions, or undefined if unknown
|
|
66
|
+
*/
|
|
67
|
+
export const getModelNativeDimensions = (model: string): number | undefined =>
|
|
68
|
+
MODEL_DIMENSIONS[model]
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Get recommended dimensions for a model.
|
|
72
|
+
*
|
|
73
|
+
* For Matryoshka models: returns 512 (research-backed optimal balance)
|
|
74
|
+
* For native-only models: returns native dimensions
|
|
75
|
+
* For unknown models: returns undefined
|
|
76
|
+
*
|
|
77
|
+
* @param model - Model name
|
|
78
|
+
* @returns Recommended dimensions, or undefined if unknown
|
|
79
|
+
*/
|
|
80
|
+
export const getRecommendedDimensions = (model: string): number | undefined => {
|
|
81
|
+
if (supportsMatryoshka(model)) {
|
|
82
|
+
// Research shows 512 is optimal balance of speed/accuracy for OpenAI models
|
|
83
|
+
// See: research/semantic-search/002-research-embedding-models.md
|
|
84
|
+
return 512
|
|
85
|
+
}
|
|
86
|
+
return MODEL_DIMENSIONS[model]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Validate if requested dimensions are valid for a model.
|
|
91
|
+
*
|
|
92
|
+
* @param model - Model name
|
|
93
|
+
* @param dimensions - Requested dimensions
|
|
94
|
+
* @returns Object with isValid flag and optional warning message
|
|
95
|
+
*/
|
|
96
|
+
export const validateModelDimensions = (
|
|
97
|
+
model: string,
|
|
98
|
+
dimensions: number,
|
|
99
|
+
): { isValid: boolean; warning?: string } => {
|
|
100
|
+
const nativeDims = MODEL_DIMENSIONS[model]
|
|
101
|
+
|
|
102
|
+
// Unknown model - allow any dimensions, user takes responsibility
|
|
103
|
+
if (nativeDims === undefined) {
|
|
104
|
+
return { isValid: true }
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Can't exceed native dimensions
|
|
108
|
+
if (dimensions > nativeDims) {
|
|
109
|
+
return {
|
|
110
|
+
isValid: false,
|
|
111
|
+
warning: `Model '${model}' has ${nativeDims} native dimensions, cannot use ${dimensions}`,
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Non-Matryoshka models must use native dimensions
|
|
116
|
+
if (!supportsMatryoshka(model) && dimensions !== nativeDims) {
|
|
117
|
+
return {
|
|
118
|
+
isValid: false,
|
|
119
|
+
warning: `Model '${model}' does not support dimension reduction, must use ${nativeDims}`,
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return { isValid: true }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ============================================================================
|
|
127
|
+
// Provider Base URLs
|
|
128
|
+
// ============================================================================
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Default base URLs for each embedding provider.
|
|
132
|
+
*
|
|
133
|
+
* - openai: Uses SDK default (https://api.openai.com/v1)
|
|
134
|
+
* - ollama: Local Ollama server
|
|
135
|
+
* - lm-studio: Local LM Studio server
|
|
136
|
+
* - openrouter: OpenRouter API gateway
|
|
137
|
+
* - voyage: Voyage AI API (uses native SDK, not OpenAI-compatible)
|
|
138
|
+
*/
|
|
139
|
+
export const PROVIDER_BASE_URLS: Record<EmbeddingProvider, string | undefined> =
|
|
140
|
+
{
|
|
141
|
+
openai: undefined, // Use OpenAI SDK default
|
|
142
|
+
ollama: 'http://localhost:11434/v1',
|
|
143
|
+
'lm-studio': 'http://localhost:1234/v1',
|
|
144
|
+
openrouter: 'https://openrouter.ai/api/v1',
|
|
145
|
+
voyage: 'https://api.voyageai.com/v1', // Native API, handled by VoyageProvider
|
|
146
|
+
} as const
|
|
147
|
+
|
|
148
|
+
// ============================================================================
|
|
149
|
+
// Port Detection Utilities
|
|
150
|
+
// ============================================================================
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Extract port number from a URL string.
|
|
154
|
+
* Returns the port if found, undefined otherwise.
|
|
155
|
+
*/
|
|
156
|
+
const extractPortFromUrl = (url: string): number | undefined => {
|
|
157
|
+
const match = url.match(/:(\d+)\//)
|
|
158
|
+
if (!match?.[1]) return undefined
|
|
159
|
+
return parseInt(match[1], 10)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Provider port mappings derived from PROVIDER_BASE_URLS.
|
|
164
|
+
* Used to detect which provider an error originated from based on port number.
|
|
165
|
+
*/
|
|
166
|
+
export const PROVIDER_PORTS: Record<string, number> = (() => {
|
|
167
|
+
const ports: Record<string, number> = {}
|
|
168
|
+
for (const [provider, url] of Object.entries(PROVIDER_BASE_URLS)) {
|
|
169
|
+
if (url) {
|
|
170
|
+
const port = extractPortFromUrl(url)
|
|
171
|
+
if (port) ports[provider] = port
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return ports
|
|
175
|
+
})()
|
|
176
|
+
|
|
177
|
+
// ============================================================================
|
|
178
|
+
// Provider Inference
|
|
179
|
+
// ============================================================================
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Infer the provider name from a base URL.
|
|
183
|
+
* Uses PROVIDER_BASE_URLS as the source of truth.
|
|
184
|
+
*
|
|
185
|
+
* @param baseURL - The base URL to check
|
|
186
|
+
* @returns The inferred provider name, or 'openai' as default
|
|
187
|
+
*/
|
|
188
|
+
export const inferProviderFromUrl = (
|
|
189
|
+
baseURL: string | undefined,
|
|
190
|
+
): EmbeddingProvider => {
|
|
191
|
+
if (!baseURL) return 'openai'
|
|
192
|
+
|
|
193
|
+
// Check each provider's base URL
|
|
194
|
+
for (const [provider, providerUrl] of Object.entries(PROVIDER_BASE_URLS)) {
|
|
195
|
+
if (providerUrl && baseURL.includes(providerUrl.replace('/v1', ''))) {
|
|
196
|
+
return provider as EmbeddingProvider
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Fallback check for partial URL matches (e.g., custom ports)
|
|
201
|
+
if (baseURL.includes('openrouter')) return 'openrouter'
|
|
202
|
+
|
|
203
|
+
return 'openai'
|
|
204
|
+
}
|