@leanlabsinnov/codegraph 0.1.4 → 0.1.6

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/bin.js CHANGED
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  buildProgram,
4
4
  renderError
5
- } from "./chunk-64OLVRK3.js";
6
- import "./chunk-WXBYICTK.js";
7
- import "./chunk-AVQNLB4I.js";
8
- import "./chunk-POGEFB23.js";
5
+ } from "./chunk-OJ2SQ3YV.js";
6
+ import "./chunk-WDIPIIA4.js";
7
+ import "./chunk-JJGCCH3V.js";
8
+ import "./chunk-W5VPP2CN.js";
9
9
 
10
10
  // src/bin.ts
11
11
  import { CommanderError } from "commander";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  namespaceToString
3
- } from "./chunk-POGEFB23.js";
3
+ } from "./chunk-W5VPP2CN.js";
4
4
 
5
5
  // ../llm-router/src/router.ts
6
6
  import { embedMany, generateText } from "ai";
@@ -16,6 +16,17 @@ async function createLlmRouter(opts) {
16
16
  };
17
17
  const generationModel = await buildGenerationModel(opts.config, env);
18
18
  const embeddingModel = await buildEmbeddingModel(opts.config.embeddings, env, opts.config.baseUrl);
19
+ let localModel = null;
20
+ if (opts.config.localReasoning) {
21
+ try {
22
+ localModel = await buildGenerationModel(
23
+ { ...opts.config, generation: opts.config.localReasoning },
24
+ env
25
+ );
26
+ } catch {
27
+ localModel = null;
28
+ }
29
+ }
19
30
  async function doEmbed(texts) {
20
31
  if (texts.length === 0) return [];
21
32
  const { embeddings } = await embedMany({ model: embeddingModel, values: texts });
@@ -31,10 +42,23 @@ async function createLlmRouter(opts) {
31
42
  });
32
43
  return text;
33
44
  }
45
+ async function doLocalGenerate(options) {
46
+ const model = localModel ?? generationModel;
47
+ const { text } = await generateText({
48
+ model,
49
+ ...options.system !== void 0 ? { system: options.system } : {},
50
+ messages: options.messages,
51
+ ...options.temperature !== void 0 ? { temperature: options.temperature } : {},
52
+ ...options.maxTokens !== void 0 ? { maxTokens: options.maxTokens } : {}
53
+ });
54
+ return text;
55
+ }
34
56
  const router = {
35
57
  config: resolved,
36
58
  embed: doEmbed,
37
59
  generate: doGenerate,
60
+ localGenerate: doLocalGenerate,
61
+ hasLocalTier: () => localModel !== null,
38
62
  async selfTest() {
39
63
  const embedStart = Date.now();
40
64
  const embeds = await doEmbed(["codegraph self-test"]);
@@ -46,11 +70,24 @@ async function createLlmRouter(opts) {
46
70
  temperature: 0
47
71
  });
48
72
  const generateLatencyMs = Date.now() - genStart;
73
+ const localStart = Date.now();
74
+ let localOut = "";
75
+ try {
76
+ localOut = await doLocalGenerate({
77
+ messages: [{ role: "user", content: "Reply with the single word ok." }],
78
+ maxTokens: 5,
79
+ temperature: 0
80
+ });
81
+ } catch {
82
+ }
83
+ const localGenerateLatencyMs = Date.now() - localStart;
49
84
  return {
50
85
  embedDims: embeds[0]?.length ?? 0,
51
86
  generationOk: typeof out === "string" && out.length > 0,
87
+ localGenerationOk: typeof localOut === "string" && localOut.length > 0,
52
88
  embedLatencyMs,
53
- generateLatencyMs
89
+ generateLatencyMs,
90
+ localGenerateLatencyMs
54
91
  };
55
92
  }
56
93
  };
@@ -139,4 +176,4 @@ export {
139
176
  createLlmRouter,
140
177
  namespaceLabel
141
178
  };
142
- //# sourceMappingURL=chunk-WXBYICTK.js.map
179
+ //# sourceMappingURL=chunk-JJGCCH3V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../llm-router/src/router.ts"],"sourcesContent":["import type { EmbeddingModel, LanguageModel } from \"ai\";\nimport { embedMany, generateText } from \"ai\";\nimport type { LlmConfig, LlmEmbeddingConfig, LlmProviderConfig } from \"@codegraph/shared\";\nimport { namespaceToString } from \"@codegraph/shared\";\nimport type { GenerateOptions, LlmRouter, ResolvedLlmConfig } from \"./types.js\";\n\nexport interface CreateRouterOptions {\n config: LlmConfig;\n env?: NodeJS.ProcessEnv;\n}\n\nexport async function createLlmRouter(opts: CreateRouterOptions): Promise<LlmRouter> {\n const env = opts.env ?? process.env;\n const resolved: ResolvedLlmConfig = {\n ...opts.config,\n embeddingNamespace: {\n provider: opts.config.embeddings.provider,\n model: opts.config.embeddings.model,\n dimension: opts.config.embeddings.dimension,\n },\n };\n\n const generationModel = await buildGenerationModel(opts.config, env);\n const embeddingModel = await buildEmbeddingModel(opts.config.embeddings, env, opts.config.baseUrl);\n\n // Build a separate local reasoning model when configured. We attempt the build eagerly\n // so connectivity problems surface at startup (via selfTest) rather than mid-request.\n // On failure we fall back gracefully to the primary generation model.\n let localModel: LanguageModel | null = null;\n if (opts.config.localReasoning) {\n try {\n localModel = await buildGenerationModel(\n { ...opts.config, generation: opts.config.localReasoning },\n env,\n );\n } catch {\n // Non-fatal — local tier is optional. Tools fall back to primary generate().\n localModel = null;\n }\n }\n\n async function doEmbed(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n const { embeddings } = await embedMany({ model: embeddingModel, values: texts });\n return embeddings;\n }\n\n async function doGenerate(options: GenerateOptions): Promise<string> {\n const { text } = await generateText({\n model: generationModel,\n ...(options.system !== undefined ? { system: options.system } : {}),\n messages: options.messages,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options.maxTokens !== undefined ? { maxTokens: options.maxTokens } : {}),\n });\n return text;\n }\n\n async function doLocalGenerate(options: GenerateOptions): Promise<string> {\n const model = localModel ?? generationModel;\n const { text } = await generateText({\n model,\n ...(options.system !== undefined ? { system: options.system } : {}),\n messages: options.messages,\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n ...(options.maxTokens !== undefined ? { maxTokens: options.maxTokens } : {}),\n });\n return text;\n }\n\n const router: LlmRouter = {\n config: resolved,\n embed: doEmbed,\n generate: doGenerate,\n localGenerate: doLocalGenerate,\n hasLocalTier: () => localModel !== null,\n async selfTest() {\n const embedStart = Date.now();\n const embeds = await doEmbed([\"codegraph self-test\"]);\n const embedLatencyMs = Date.now() - embedStart;\n\n const genStart = Date.now();\n const out = await doGenerate({\n messages: [{ role: \"user\", content: \"Reply with the single word ok.\" }],\n maxTokens: 5,\n temperature: 0,\n });\n const generateLatencyMs = Date.now() - genStart;\n\n const localStart = Date.now();\n let localOut = \"\";\n try {\n localOut = await doLocalGenerate({\n messages: [{ role: \"user\", content: \"Reply with the single word ok.\" }],\n maxTokens: 5,\n temperature: 0,\n });\n } catch {\n // Local tier failure is non-fatal in selfTest.\n }\n const localGenerateLatencyMs = Date.now() - localStart;\n\n return {\n embedDims: embeds[0]?.length ?? 0,\n generationOk: typeof out === \"string\" && out.length > 0,\n localGenerationOk: typeof localOut === \"string\" && localOut.length > 0,\n embedLatencyMs,\n generateLatencyMs,\n localGenerateLatencyMs,\n };\n },\n };\n return router;\n}\n\n/**\n * Used by the CLI's `config llm` printer; surfaces the resolved namespace\n * tag without forcing a provider import upstream.\n */\nexport function namespaceLabel(config: LlmConfig): string {\n return namespaceToString({\n provider: config.embeddings.provider,\n model: config.embeddings.model,\n dimension: config.embeddings.dimension,\n });\n}\n\nasync function buildGenerationModel(\n config: LlmConfig,\n env: NodeJS.ProcessEnv,\n): Promise<LanguageModel> {\n const provider = config.generation.provider;\n if (provider === \"openai\") return openaiText(config.generation, env, config.baseUrl);\n if (provider === \"anthropic\") return anthropicText(config.generation, env, config.baseUrl);\n if (provider === \"google\") return googleText(config.generation, env, config.baseUrl);\n if (provider === \"ollama\") return ollamaText(config.generation, env, config.baseUrl);\n throw new Error(`Unsupported generation provider: ${provider}`);\n}\n\nasync function buildEmbeddingModel(\n config: LlmEmbeddingConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<EmbeddingModel<string>> {\n if (config.provider === \"openai\") return openaiEmbedding(config, env, baseUrl);\n if (config.provider === \"google\") return googleEmbedding(config, env);\n if (config.provider === \"ollama\") return ollamaEmbedding(config, env);\n if (config.provider === \"anthropic\") {\n // Anthropic has no embedding endpoint; fall back to OpenAI so the\n // pipeline keeps working when generation is anthropic.\n return openaiEmbedding(\n { provider: \"openai\", model: \"text-embedding-3-small\", dimension: 1536 },\n env,\n );\n }\n throw new Error(`Unsupported embedding provider: ${config.provider}`);\n}\n\nasync function openaiText(\n config: LlmProviderConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<LanguageModel> {\n const { createOpenAI } = await import(\"@ai-sdk/openai\");\n const openai = createOpenAI({\n ...(env.OPENAI_API_KEY ? { apiKey: env.OPENAI_API_KEY } : {}),\n ...(baseUrl ? { baseURL: baseUrl } : {}),\n });\n return openai(config.model);\n}\n\nasync function openaiEmbedding(\n config: LlmEmbeddingConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<EmbeddingModel<string>> {\n const { createOpenAI } = await import(\"@ai-sdk/openai\");\n const openai = createOpenAI({\n ...(env.OPENAI_API_KEY ? { apiKey: env.OPENAI_API_KEY } : {}),\n ...(baseUrl ? { baseURL: baseUrl } : {}),\n });\n return openai.embedding(config.model);\n}\n\nasync function anthropicText(\n config: LlmProviderConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<LanguageModel> {\n const { createAnthropic } = await import(\"@ai-sdk/anthropic\");\n const anthropic = createAnthropic({\n ...(env.ANTHROPIC_API_KEY ? { apiKey: env.ANTHROPIC_API_KEY } : {}),\n ...(baseUrl ? { baseURL: baseUrl } : {}),\n });\n return anthropic(config.model);\n}\n\nasync function googleText(\n config: LlmProviderConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<LanguageModel> {\n const { createGoogleGenerativeAI } = await import(\"@ai-sdk/google\");\n const google = createGoogleGenerativeAI({\n ...(env.GOOGLE_GENERATIVE_AI_API_KEY\n ? { apiKey: env.GOOGLE_GENERATIVE_AI_API_KEY }\n : {}),\n ...(baseUrl ? { baseURL: baseUrl } : {}),\n });\n return google(config.model);\n}\n\nasync function googleEmbedding(\n config: LlmEmbeddingConfig,\n env: NodeJS.ProcessEnv,\n): Promise<EmbeddingModel<string>> {\n const { createGoogleGenerativeAI } = await import(\"@ai-sdk/google\");\n const google = createGoogleGenerativeAI(\n env.GOOGLE_GENERATIVE_AI_API_KEY\n ? { apiKey: env.GOOGLE_GENERATIVE_AI_API_KEY }\n : {},\n );\n return google.textEmbeddingModel(config.model);\n}\n\nasync function ollamaText(\n config: LlmProviderConfig,\n env: NodeJS.ProcessEnv,\n baseUrl?: string,\n): Promise<LanguageModel> {\n const { createOllama } = await import(\"ollama-ai-provider\");\n const base = baseUrl ?? env.OLLAMA_BASE_URL;\n const ollama = createOllama(base ? { baseURL: `${base.replace(/\\/$/, \"\")}/api` } : {});\n return ollama(config.model);\n}\n\nasync function ollamaEmbedding(\n config: LlmEmbeddingConfig,\n env: NodeJS.ProcessEnv,\n): Promise<EmbeddingModel<string>> {\n const { createOllama } = await import(\"ollama-ai-provider\");\n const base = env.OLLAMA_BASE_URL;\n const ollama = createOllama(base ? { baseURL: `${base.replace(/\\/$/, \"\")}/api` } : {});\n return ollama.embedding(config.model);\n}\n"],"mappings":"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","names":[]}