opencode-rag-plugin 1.4.2 → 1.5.2

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.
@@ -0,0 +1,167 @@
1
+ import { postJson } from "../embedder/http.js";
2
+ const RETRYABLE_STATUSES = new Set([408, 429, 500, 502, 503, 504]);
3
+ export class AnthropicDescriptionProvider {
4
+ config;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async generateDescription(chunk) {
9
+ const messages = [
10
+ { role: "user", content: buildUserMessage(chunk) },
11
+ ];
12
+ return this.chatRequest(messages, this.config.timeoutMs ?? 60000);
13
+ }
14
+ async generateBatchDescriptions(chunks) {
15
+ if (chunks.length === 1) {
16
+ const desc = await this.generateDescription(chunks[0]);
17
+ return new Map([[chunks[0].id, desc]]);
18
+ }
19
+ const batchMaxChunks = this.config.batchMaxChunks ?? 25;
20
+ const batches = [];
21
+ for (let i = 0; i < chunks.length; i += batchMaxChunks) {
22
+ batches.push(chunks.slice(i, i + batchMaxChunks));
23
+ }
24
+ const result = new Map();
25
+ for (const batch of batches) {
26
+ try {
27
+ const batchResult = await this.executeBatch(batch);
28
+ for (const [id, desc] of batchResult) {
29
+ result.set(id, desc);
30
+ }
31
+ }
32
+ catch {
33
+ // Batch failed — individual fallback below handles missing chunks
34
+ }
35
+ }
36
+ for (let i = 0; i < chunks.length; i++) {
37
+ const chunk = chunks[i];
38
+ if (!result.has(chunk.id)) {
39
+ try {
40
+ const desc = await this.generateDescription(chunk);
41
+ result.set(chunk.id, desc);
42
+ }
43
+ catch {
44
+ // skip — caller will fall back to content
45
+ }
46
+ }
47
+ }
48
+ return result;
49
+ }
50
+ async executeBatch(chunks) {
51
+ const messages = [
52
+ { role: "user", content: buildBatchUserMessage(chunks) },
53
+ ];
54
+ const timeoutMs = this.config.batchTimeoutMs ?? 120000;
55
+ const responseText = await this.chatRequest(messages, timeoutMs);
56
+ return parseBatchResponse(responseText, chunks);
57
+ }
58
+ async chatRequest(messages, timeoutMs) {
59
+ const baseUrl = this.config.baseUrl.replace(/\/+$/, "");
60
+ const apiKey = this.config.apiKey ?? "";
61
+ const systemPrompt = this.config.systemPrompt;
62
+ const body = {
63
+ model: this.config.model,
64
+ max_tokens: 4096,
65
+ messages: [{ role: "user", content: systemPrompt + "\n\n" + messages.map((m) => `${m.role}: ${m.content}`).join("\n\n") + "\n\nassistant:" }],
66
+ };
67
+ const headers = {
68
+ "x-api-key": apiKey,
69
+ "anthropic-version": "2023-06-01",
70
+ "Content-Type": "application/json",
71
+ };
72
+ const retryMax = this.config.retryMax ?? 3;
73
+ const retryBaseDelayMs = this.config.retryBaseDelayMs ?? 1000;
74
+ let lastError;
75
+ for (let attempt = 0; attempt <= retryMax; attempt++) {
76
+ const response = await postJson(`${baseUrl}/messages`, body, headers, timeoutMs, this.config.proxy);
77
+ if (response.ok) {
78
+ const json = (await response.json());
79
+ const text = json.content?.[0]?.text;
80
+ if (text && text.trim().length > 0) {
81
+ return text.trim();
82
+ }
83
+ throw new Error(`Anthropic returned empty response: ${JSON.stringify(json)}`);
84
+ }
85
+ const text = await response.text();
86
+ const error = new Error(`Anthropic LLM request failed (${response.status}): ${text}`);
87
+ if (!RETRYABLE_STATUSES.has(response.status) || attempt === retryMax) {
88
+ throw error;
89
+ }
90
+ lastError = error;
91
+ const delayMs = retryBaseDelayMs * Math.pow(2, attempt);
92
+ await sleep(delayMs);
93
+ }
94
+ throw lastError ?? new Error("Anthropic LLM request failed: unknown error");
95
+ }
96
+ }
97
+ function sleep(ms) {
98
+ return new Promise((resolve) => setTimeout(resolve, ms));
99
+ }
100
+ function buildUserMessage(chunk) {
101
+ const parts = [];
102
+ if (chunk.metadata.filePath) {
103
+ parts.push(`File: ${chunk.metadata.filePath}`);
104
+ }
105
+ if (chunk.metadata.language) {
106
+ parts.push(`Language: ${chunk.metadata.language}`);
107
+ }
108
+ parts.push(`Lines: ${chunk.metadata.startLine}-${chunk.metadata.endLine}`);
109
+ parts.push("");
110
+ parts.push("```" + (chunk.metadata.language || ""));
111
+ parts.push(chunk.content);
112
+ parts.push("```");
113
+ return parts.join("\n");
114
+ }
115
+ function buildBatchUserMessage(chunks) {
116
+ const first = chunks[0];
117
+ const parts = [];
118
+ if (first.metadata.filePath) {
119
+ parts.push(`File: ${first.metadata.filePath}`);
120
+ }
121
+ if (first.metadata.language) {
122
+ parts.push(`Language: ${first.metadata.language}`);
123
+ }
124
+ parts.push(`Chunks: ${chunks.length}`);
125
+ parts.push("");
126
+ for (let i = 0; i < chunks.length; i++) {
127
+ const chunk = chunks[i];
128
+ const lang = chunk.metadata.language || "";
129
+ parts.push(`=== CHUNK ${i} (lines ${chunk.metadata.startLine}-${chunk.metadata.endLine}) ===`);
130
+ parts.push("```" + lang);
131
+ parts.push(chunk.content);
132
+ parts.push("```");
133
+ parts.push("");
134
+ }
135
+ return parts.join("\n");
136
+ }
137
+ function parseBatchResponse(text, chunks) {
138
+ const result = new Map();
139
+ const chunkPattern = /^CHUNK\s+(\d+)\s*[):-]?\s*/i;
140
+ const lines = text.split("\n");
141
+ let currentIndex = null;
142
+ let currentDesc = [];
143
+ for (const line of lines) {
144
+ const match = chunkPattern.exec(line.trim());
145
+ if (match) {
146
+ if (currentIndex !== null && currentDesc.length > 0) {
147
+ const desc = currentDesc.join(" ").trim();
148
+ if (desc.length > 0 && currentIndex >= 0 && currentIndex < chunks.length) {
149
+ result.set(chunks[currentIndex].id, desc);
150
+ }
151
+ }
152
+ currentIndex = parseInt(match[1], 10);
153
+ currentDesc = [line.slice(match[0].length).trim()];
154
+ }
155
+ else if (currentIndex !== null) {
156
+ currentDesc.push(line.trim());
157
+ }
158
+ }
159
+ if (currentIndex !== null && currentDesc.length > 0) {
160
+ const desc = currentDesc.join(" ").trim();
161
+ if (desc.length > 0 && currentIndex >= 0 && currentIndex < chunks.length) {
162
+ result.set(chunks[currentIndex].id, desc);
163
+ }
164
+ }
165
+ return result;
166
+ }
167
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/describer/anthropic.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,19 @@
1
1
  import { LLMDescriptionProvider } from "./describer.js";
2
+ import { AnthropicDescriptionProvider } from "./anthropic.js";
3
+ import { GeminiDescriptionProvider } from "./gemini.js";
2
4
  export function createDescriptionProvider(config) {
5
+ if (config.provider === "anthropic") {
6
+ if (!config.apiKey) {
7
+ throw new Error("Anthropic provider requires an apiKey");
8
+ }
9
+ return new AnthropicDescriptionProvider(config);
10
+ }
11
+ if (config.provider === "google") {
12
+ if (!config.apiKey) {
13
+ throw new Error("Google Gemini provider requires an apiKey");
14
+ }
15
+ return new GeminiDescriptionProvider(config);
16
+ }
3
17
  return new LLMDescriptionProvider(config);
4
18
  }
5
19
  //# sourceMappingURL=factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/describer/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,UAAU,yBAAyB,CACvC,MAAyB;IAEzB,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/describer/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,UAAU,yBAAyB,CACvC,MAAyB;IAEzB,IAAI,MAAM,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Chunk, DescriptionProvider } from "../core/interfaces.js";
2
+ import type { DescriptionConfig } from "../core/config.js";
3
+ export declare class GeminiDescriptionProvider implements DescriptionProvider {
4
+ private readonly config;
5
+ constructor(config: DescriptionConfig);
6
+ generateDescription(chunk: Chunk): Promise<string>;
7
+ generateBatchDescriptions(chunks: Chunk[]): Promise<Map<string, string>>;
8
+ private executeBatch;
9
+ private chatRequest;
10
+ }
@@ -0,0 +1,177 @@
1
+ import { postJson } from "../embedder/http.js";
2
+ const RETRYABLE_STATUSES = new Set([408, 429, 500, 502, 503, 504]);
3
+ export class GeminiDescriptionProvider {
4
+ config;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ async generateDescription(chunk) {
9
+ const contents = [
10
+ {
11
+ role: "user",
12
+ parts: [{ text: buildUserMessage(chunk) }],
13
+ },
14
+ ];
15
+ return this.chatRequest(contents, this.config.timeoutMs ?? 60000);
16
+ }
17
+ async generateBatchDescriptions(chunks) {
18
+ if (chunks.length === 1) {
19
+ const desc = await this.generateDescription(chunks[0]);
20
+ return new Map([[chunks[0].id, desc]]);
21
+ }
22
+ const batchMaxChunks = this.config.batchMaxChunks ?? 25;
23
+ const batches = [];
24
+ for (let i = 0; i < chunks.length; i += batchMaxChunks) {
25
+ batches.push(chunks.slice(i, i + batchMaxChunks));
26
+ }
27
+ const result = new Map();
28
+ for (const batch of batches) {
29
+ try {
30
+ const batchResult = await this.executeBatch(batch);
31
+ for (const [id, desc] of batchResult) {
32
+ result.set(id, desc);
33
+ }
34
+ }
35
+ catch {
36
+ // Batch failed — individual fallback below handles missing chunks
37
+ }
38
+ }
39
+ for (let i = 0; i < chunks.length; i++) {
40
+ const chunk = chunks[i];
41
+ if (!result.has(chunk.id)) {
42
+ try {
43
+ const desc = await this.generateDescription(chunk);
44
+ result.set(chunk.id, desc);
45
+ }
46
+ catch {
47
+ // skip — caller will fall back to content
48
+ }
49
+ }
50
+ }
51
+ return result;
52
+ }
53
+ async executeBatch(chunks) {
54
+ const contents = [
55
+ {
56
+ role: "user",
57
+ parts: [{ text: buildBatchUserMessage(chunks) }],
58
+ },
59
+ ];
60
+ const timeoutMs = this.config.batchTimeoutMs ?? 120000;
61
+ const responseText = await this.chatRequest(contents, timeoutMs);
62
+ return parseBatchResponse(responseText, chunks);
63
+ }
64
+ async chatRequest(contents, timeoutMs) {
65
+ const baseUrl = this.config.baseUrl.replace(/\/+$/, "");
66
+ const apiKey = this.config.apiKey ?? "";
67
+ const model = this.config.model;
68
+ const systemPrompt = this.config.systemPrompt;
69
+ const allParts = [{ text: systemPrompt }];
70
+ for (const c of contents) {
71
+ allParts.push(...c.parts);
72
+ }
73
+ const body = {
74
+ contents: [{ role: "user", parts: allParts }],
75
+ };
76
+ const headers = {
77
+ "Content-Type": "application/json",
78
+ };
79
+ const url = apiKey
80
+ ? `${baseUrl}/models/${model}:generateContent?key=${apiKey}`
81
+ : `${baseUrl}/models/${model}:generateContent`;
82
+ const retryMax = this.config.retryMax ?? 3;
83
+ const retryBaseDelayMs = this.config.retryBaseDelayMs ?? 1000;
84
+ let lastError;
85
+ for (let attempt = 0; attempt <= retryMax; attempt++) {
86
+ const response = await postJson(url, body, headers, timeoutMs);
87
+ if (response.ok) {
88
+ const json = (await response.json());
89
+ const text = json.candidates?.[0]?.content?.parts?.[0]?.text;
90
+ if (text && text.trim().length > 0) {
91
+ return text.trim();
92
+ }
93
+ throw new Error(`Gemini returned empty response: ${JSON.stringify(json)}`);
94
+ }
95
+ const text = await response.text();
96
+ const error = new Error(`Gemini LLM request failed (${response.status}): ${text}`);
97
+ if (!RETRYABLE_STATUSES.has(response.status) || attempt === retryMax) {
98
+ throw error;
99
+ }
100
+ lastError = error;
101
+ const delayMs = retryBaseDelayMs * Math.pow(2, attempt);
102
+ await sleep(delayMs);
103
+ }
104
+ throw lastError ?? new Error("Gemini LLM request failed: unknown error");
105
+ }
106
+ }
107
+ function sleep(ms) {
108
+ return new Promise((resolve) => setTimeout(resolve, ms));
109
+ }
110
+ function buildUserMessage(chunk) {
111
+ const parts = [];
112
+ if (chunk.metadata.filePath) {
113
+ parts.push(`File: ${chunk.metadata.filePath}`);
114
+ }
115
+ if (chunk.metadata.language) {
116
+ parts.push(`Language: ${chunk.metadata.language}`);
117
+ }
118
+ parts.push(`Lines: ${chunk.metadata.startLine}-${chunk.metadata.endLine}`);
119
+ parts.push("");
120
+ parts.push("```" + (chunk.metadata.language || ""));
121
+ parts.push(chunk.content);
122
+ parts.push("```");
123
+ return parts.join("\n");
124
+ }
125
+ function buildBatchUserMessage(chunks) {
126
+ const first = chunks[0];
127
+ const parts = [];
128
+ if (first.metadata.filePath) {
129
+ parts.push(`File: ${first.metadata.filePath}`);
130
+ }
131
+ if (first.metadata.language) {
132
+ parts.push(`Language: ${first.metadata.language}`);
133
+ }
134
+ parts.push(`Chunks: ${chunks.length}`);
135
+ parts.push("");
136
+ for (let i = 0; i < chunks.length; i++) {
137
+ const chunk = chunks[i];
138
+ const lang = chunk.metadata.language || "";
139
+ parts.push(`=== CHUNK ${i} (lines ${chunk.metadata.startLine}-${chunk.metadata.endLine}) ===`);
140
+ parts.push("```" + lang);
141
+ parts.push(chunk.content);
142
+ parts.push("```");
143
+ parts.push("");
144
+ }
145
+ return parts.join("\n");
146
+ }
147
+ function parseBatchResponse(text, chunks) {
148
+ const result = new Map();
149
+ const chunkPattern = /^CHUNK\s+(\d+)\s*[):-]?\s*/i;
150
+ const lines = text.split("\n");
151
+ let currentIndex = null;
152
+ let currentDesc = [];
153
+ for (const line of lines) {
154
+ const match = chunkPattern.exec(line.trim());
155
+ if (match) {
156
+ if (currentIndex !== null && currentDesc.length > 0) {
157
+ const desc = currentDesc.join(" ").trim();
158
+ if (desc.length > 0 && currentIndex >= 0 && currentIndex < chunks.length) {
159
+ result.set(chunks[currentIndex].id, desc);
160
+ }
161
+ }
162
+ currentIndex = parseInt(match[1], 10);
163
+ currentDesc = [line.slice(match[0].length).trim()];
164
+ }
165
+ else if (currentIndex !== null) {
166
+ currentDesc.push(line.trim());
167
+ }
168
+ }
169
+ if (currentIndex !== null && currentDesc.length > 0) {
170
+ const desc = currentDesc.join(" ").trim();
171
+ if (desc.length > 0 && currentIndex >= 0 && currentIndex < chunks.length) {
172
+ result.set(chunks[currentIndex].id, desc);
173
+ }
174
+ }
175
+ return result;
176
+ }
177
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/describer/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { EmbeddingProvider } from "../core/interfaces.js";
2
+ import type { ProxyConfig } from "../core/config.js";
3
+ export declare class CohereProvider implements EmbeddingProvider {
4
+ readonly name = "cohere";
5
+ private baseUrl;
6
+ private model;
7
+ private apiKey;
8
+ private timeoutMs;
9
+ private proxy?;
10
+ constructor(baseUrl: string, model: string, apiKey: string, timeoutMs?: number, proxy?: ProxyConfig);
11
+ embed(texts: string[], purpose?: "query" | "document"): Promise<number[][]>;
12
+ }
@@ -0,0 +1,35 @@
1
+ import { postJson } from "./http.js";
2
+ export class CohereProvider {
3
+ name = "cohere";
4
+ baseUrl;
5
+ model;
6
+ apiKey;
7
+ timeoutMs;
8
+ proxy;
9
+ constructor(baseUrl, model, apiKey, timeoutMs = 30000, proxy) {
10
+ this.baseUrl = baseUrl.replace(/\/+$/, "");
11
+ this.model = model;
12
+ this.apiKey = apiKey;
13
+ this.timeoutMs = timeoutMs;
14
+ this.proxy = proxy;
15
+ }
16
+ async embed(texts, purpose) {
17
+ const inputType = purpose === "query" ? "search_query" : "search_document";
18
+ const body = {
19
+ texts,
20
+ model: this.model,
21
+ input_type: inputType,
22
+ };
23
+ const response = await postJson(`${this.baseUrl}/embed`, body, { Authorization: `Bearer ${this.apiKey}` }, this.timeoutMs, this.proxy);
24
+ if (!response.ok) {
25
+ const body = await response.text();
26
+ throw new Error(`Cohere embedding failed (${response.status}): ${body}`);
27
+ }
28
+ const json = (await response.json());
29
+ if (!json.embeddings || !Array.isArray(json.embeddings)) {
30
+ throw new Error(`Cohere: unexpected response: ${JSON.stringify(json)}`);
31
+ }
32
+ return json.embeddings;
33
+ }
34
+ }
35
+ //# sourceMappingURL=cohere.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cohere.js","sourceRoot":"","sources":["../../src/embedder/cohere.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IAEjB,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,KAAK,CAAe;IAE5B,YAAY,OAAe,EAAE,KAAa,EAAE,MAAc,EAAE,YAAoB,KAAK,EAAE,KAAmB;QACxG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAe,EAAE,OAA8B;QACzD,MAAM,SAAS,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC3E,MAAM,IAAI,GAA4B;YACpC,KAAK;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,SAAS;SACtB,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,GAAG,IAAI,CAAC,OAAO,QAAQ,EACvB,IAAI,EACJ,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,EAC1C,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,KAAK,CACX,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
@@ -1,19 +1,26 @@
1
+ import { isOpenAiCompatible } from "../core/provider-defaults.js";
1
2
  import { OllamaProvider } from "./ollama.js";
2
3
  import { OpenAIProvider } from "./openai.js";
4
+ import { CohereProvider } from "./cohere.js";
3
5
  export function createEmbedder(config) {
4
6
  const { provider, baseUrl, model, apiKey, proxy, timeoutMs } = config.embedding;
5
7
  const effectiveTimeoutMs = timeoutMs ?? 30000;
6
- switch (provider) {
7
- case "ollama":
8
- return new OllamaProvider(baseUrl, model, apiKey, effectiveTimeoutMs, proxy);
9
- case "openai":
10
- if (!apiKey) {
11
- throw new Error("OpenAI provider requires an apiKey");
12
- }
13
- return new OpenAIProvider(baseUrl, model, apiKey, effectiveTimeoutMs, proxy);
14
- default:
15
- throw new Error(`Unknown embedding provider: ${provider}`);
8
+ if (provider === "ollama") {
9
+ return new OllamaProvider(baseUrl, model, apiKey, effectiveTimeoutMs, proxy);
16
10
  }
11
+ if (provider === "cohere") {
12
+ if (!apiKey) {
13
+ throw new Error("Cohere provider requires an apiKey");
14
+ }
15
+ return new CohereProvider(baseUrl, model, apiKey, effectiveTimeoutMs, proxy);
16
+ }
17
+ if (isOpenAiCompatible(provider)) {
18
+ if (!apiKey) {
19
+ throw new Error(`${provider} provider requires an apiKey`);
20
+ }
21
+ return new OpenAIProvider(baseUrl, model, apiKey, effectiveTimeoutMs, proxy);
22
+ }
23
+ throw new Error(`Unknown embedding provider: ${provider}`);
17
24
  }
18
25
  export async function embedBatch(embedder, texts, batchSize = 10, purpose) {
19
26
  const results = [];
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/embedder/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAChF,MAAM,kBAAkB,GAAG,SAAS,IAAI,KAAK,CAAC;IAE9C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC/E,KAAK,QAAQ;YACX,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC/E;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAA2B,EAC3B,KAAe,EACf,YAAoB,EAAE,EACtB,OAA8B;IAE9B,MAAM,OAAO,GAAe,EAAE,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/embedder/factory.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAChF,MAAM,kBAAkB,GAAG,SAAS,IAAI,KAAK,CAAC;IAE9C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,8BAA8B,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAA2B,EAC3B,KAAe,EACf,YAAoB,EAAE,EACtB,OAA8B;IAE9B,MAAM,OAAO,GAAe,EAAE,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -7,6 +7,13 @@ export declare class OpenAIProvider implements EmbeddingProvider {
7
7
  private apiKey;
8
8
  private timeoutMs;
9
9
  private proxy?;
10
+ private provider;
10
11
  constructor(baseUrl: string, model: string, apiKey: string, timeoutMs?: number, proxy?: ProxyConfig);
12
+ /**
13
+ * Convert the generic purpose to the provider-specific input_type value.
14
+ * - OpenAI: document → "document", query → "query" (already correct)
15
+ * - NVIDIA: document → "passage", query → "query" (NVIDIA uses "passage" not "document")
16
+ */
17
+ private toInputType;
11
18
  embed(texts: string[], purpose?: "query" | "document"): Promise<number[][]>;
12
19
  }
@@ -1,4 +1,15 @@
1
1
  import { postJson } from "./http.js";
2
+ /**
3
+ * Map of provider base URLs to their OpenAI-compatible API hostnames.
4
+ * Used to determine provider-specific API quirks like input_type values.
5
+ */
6
+ function inferProviderName(baseUrl) {
7
+ const host = baseUrl.toLowerCase();
8
+ if (host.includes("nvidia") || host.includes("api.nvidia.com") || host.includes("integrate.api.nvidia.com")) {
9
+ return "nvidia";
10
+ }
11
+ return "openai"; // default — most providers follow OpenAI conventions
12
+ }
2
13
  export class OpenAIProvider {
3
14
  name = "openai";
4
15
  baseUrl;
@@ -6,17 +17,30 @@ export class OpenAIProvider {
6
17
  apiKey;
7
18
  timeoutMs;
8
19
  proxy;
20
+ provider;
9
21
  constructor(baseUrl, model, apiKey, timeoutMs = 30000, proxy) {
10
22
  this.baseUrl = baseUrl.replace(/\/+$/, "");
11
23
  this.model = model;
12
24
  this.apiKey = apiKey;
13
25
  this.timeoutMs = timeoutMs;
14
26
  this.proxy = proxy;
27
+ this.provider = inferProviderName(this.baseUrl);
28
+ }
29
+ /**
30
+ * Convert the generic purpose to the provider-specific input_type value.
31
+ * - OpenAI: document → "document", query → "query" (already correct)
32
+ * - NVIDIA: document → "passage", query → "query" (NVIDIA uses "passage" not "document")
33
+ */
34
+ toInputType(purpose) {
35
+ if (this.provider === "nvidia") {
36
+ return purpose === "document" ? "passage" : "query";
37
+ }
38
+ return purpose;
15
39
  }
16
40
  async embed(texts, purpose) {
17
41
  const body = { model: this.model, input: texts };
18
42
  if (purpose) {
19
- body.input_type = purpose;
43
+ body.input_type = this.toInputType(purpose);
20
44
  }
21
45
  const response = await postJson(`${this.baseUrl}/embeddings`, body, { Authorization: `Bearer ${this.apiKey}` }, this.timeoutMs, this.proxy);
22
46
  if (!response.ok) {
@@ -1 +1 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embedder/openai.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IAEjB,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,KAAK,CAAe;IAE5B,YAAY,OAAe,EAAE,KAAa,EAAE,MAAc,EAAE,YAAoB,KAAK,EAAE,KAAmB;QACxG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAe,EAAE,OAA8B;QACzD,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1E,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC5B,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,GAAG,IAAI,CAAC,OAAO,aAAa,EAC5B,IAAI,EACJ,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,EAC1C,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,KAAK,CACX,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CACxD,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACb,OAAO,CAAC,CAAC;QACX,CAAC,CAAC;aACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embedder/openai.ts"],"names":[],"mappings":"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"}
package/dist/indexer.js CHANGED
@@ -222,7 +222,9 @@ export async function runIndexPass(options) {
222
222
  }
223
223
  else {
224
224
  for (const chunk of chunks) {
225
- textToEmbed.push(docPrefix + chunk.content);
225
+ const relPath = path.relative(options.cwd, chunk.metadata.filePath).replace(/\\/g, "/");
226
+ chunk.description = `${relPath}, lines ${chunk.metadata.startLine}-${chunk.metadata.endLine}`;
227
+ textToEmbed.push(docPrefix + chunk.description + "\n\n" + chunk.content);
226
228
  }
227
229
  }
228
230
  const embeddings = await embedBatch(options.embedder, textToEmbed, undefined, "document");