specweave 0.30.10 → 0.30.12
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/plugins/specweave-ado/lib/ado-client-v2.d.ts.map +1 -1
- package/dist/plugins/specweave-ado/lib/ado-client-v2.js +46 -12
- package/dist/plugins/specweave-ado/lib/ado-client-v2.js.map +1 -1
- package/dist/src/cli/commands/init.d.ts.map +1 -1
- package/dist/src/cli/commands/init.js +12 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts +5 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/living-docs-preflight.js +80 -28
- package/dist/src/cli/helpers/init/living-docs-preflight.js.map +1 -1
- package/dist/src/cli/helpers/init/repository-setup.d.ts.map +1 -1
- package/dist/src/cli/helpers/init/repository-setup.js +64 -2
- package/dist/src/cli/helpers/init/repository-setup.js.map +1 -1
- package/dist/src/cli/helpers/project-count-fetcher.js +33 -2
- package/dist/src/cli/helpers/project-count-fetcher.js.map +1 -1
- package/dist/src/cli/workers/brownfield-worker.d.ts +13 -0
- package/dist/src/cli/workers/brownfield-worker.d.ts.map +1 -1
- package/dist/src/cli/workers/brownfield-worker.js +154 -0
- package/dist/src/cli/workers/brownfield-worker.js.map +1 -1
- package/dist/src/cli/workers/living-docs-worker.js +272 -11
- package/dist/src/cli/workers/living-docs-worker.js.map +1 -1
- package/dist/src/core/background/brownfield-launcher.d.ts +2 -1
- package/dist/src/core/background/brownfield-launcher.d.ts.map +1 -1
- package/dist/src/core/background/brownfield-launcher.js.map +1 -1
- package/dist/src/core/background/types.d.ts +10 -2
- package/dist/src/core/background/types.d.ts.map +1 -1
- package/dist/src/core/discrepancy/brownfield-types.d.ts +3 -1
- package/dist/src/core/discrepancy/brownfield-types.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.d.ts +39 -0
- package/dist/src/core/living-docs/feature-archiver.d.ts.map +1 -1
- package/dist/src/core/living-docs/feature-archiver.js +197 -0
- package/dist/src/core/living-docs/feature-archiver.js.map +1 -1
- package/dist/src/core/llm/availability-messages.d.ts +33 -0
- package/dist/src/core/llm/availability-messages.d.ts.map +1 -0
- package/dist/src/core/llm/availability-messages.js +170 -0
- package/dist/src/core/llm/availability-messages.js.map +1 -0
- package/dist/src/core/llm/index.d.ts +34 -0
- package/dist/src/core/llm/index.d.ts.map +1 -0
- package/dist/src/core/llm/index.js +35 -0
- package/dist/src/core/llm/index.js.map +1 -0
- package/dist/src/core/llm/provider-factory.d.ts +48 -0
- package/dist/src/core/llm/provider-factory.d.ts.map +1 -0
- package/dist/src/core/llm/provider-factory.js +274 -0
- package/dist/src/core/llm/provider-factory.js.map +1 -0
- package/dist/src/core/llm/providers/anthropic-provider.d.ts +66 -0
- package/dist/src/core/llm/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/anthropic-provider.js +195 -0
- package/dist/src/core/llm/providers/anthropic-provider.js.map +1 -0
- package/dist/src/core/llm/providers/azure-openai-provider.d.ts +47 -0
- package/dist/src/core/llm/providers/azure-openai-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/azure-openai-provider.js +116 -0
- package/dist/src/core/llm/providers/azure-openai-provider.js.map +1 -0
- package/dist/src/core/llm/providers/bedrock-provider.d.ts +44 -0
- package/dist/src/core/llm/providers/bedrock-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/bedrock-provider.js +149 -0
- package/dist/src/core/llm/providers/bedrock-provider.js.map +1 -0
- package/dist/src/core/llm/providers/claude-code-provider.d.ts +115 -0
- package/dist/src/core/llm/providers/claude-code-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/claude-code-provider.js +379 -0
- package/dist/src/core/llm/providers/claude-code-provider.js.map +1 -0
- package/dist/src/core/llm/providers/ollama-provider.d.ts +40 -0
- package/dist/src/core/llm/providers/ollama-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/ollama-provider.js +116 -0
- package/dist/src/core/llm/providers/ollama-provider.js.map +1 -0
- package/dist/src/core/llm/providers/openai-provider.d.ts +44 -0
- package/dist/src/core/llm/providers/openai-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/openai-provider.js +119 -0
- package/dist/src/core/llm/providers/openai-provider.js.map +1 -0
- package/dist/src/core/llm/providers/vertex-ai-provider.d.ts +46 -0
- package/dist/src/core/llm/providers/vertex-ai-provider.d.ts.map +1 -0
- package/dist/src/core/llm/providers/vertex-ai-provider.js +123 -0
- package/dist/src/core/llm/providers/vertex-ai-provider.js.map +1 -0
- package/dist/src/core/llm/types.d.ts +181 -0
- package/dist/src/core/llm/types.d.ts.map +1 -0
- package/dist/src/core/llm/types.js +56 -0
- package/dist/src/core/llm/types.js.map +1 -0
- package/dist/src/importers/item-converter.d.ts.map +1 -1
- package/dist/src/importers/item-converter.js +69 -12
- package/dist/src/importers/item-converter.js.map +1 -1
- package/dist/src/integrations/ado/ado-client.d.ts +22 -0
- package/dist/src/integrations/ado/ado-client.d.ts.map +1 -1
- package/dist/src/integrations/ado/ado-client.js +89 -37
- package/dist/src/integrations/ado/ado-client.js.map +1 -1
- package/dist/src/living-docs/enterprise-analyzer.d.ts +160 -0
- package/dist/src/living-docs/enterprise-analyzer.d.ts.map +1 -0
- package/dist/src/living-docs/enterprise-analyzer.js +836 -0
- package/dist/src/living-docs/enterprise-analyzer.js.map +1 -0
- package/dist/src/living-docs/fs-id-allocator.d.ts +5 -0
- package/dist/src/living-docs/fs-id-allocator.d.ts.map +1 -1
- package/dist/src/living-docs/fs-id-allocator.js +12 -5
- package/dist/src/living-docs/fs-id-allocator.js.map +1 -1
- package/package.json +1 -1
- package/plugins/specweave/commands/specweave-archive.md +69 -2
- package/plugins/specweave-ado/lib/ado-client-v2.js +43 -8
- package/plugins/specweave-ado/lib/ado-client-v2.ts +52 -12
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider Abstraction Layer
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified interface for multiple LLM providers:
|
|
5
|
+
* - Anthropic Claude (claude-sonnet, claude-opus, claude-haiku)
|
|
6
|
+
* - OpenAI GPT (gpt-4o, gpt-4o-mini, o1)
|
|
7
|
+
* - Azure OpenAI (enterprise deployments)
|
|
8
|
+
* - AWS Bedrock (Claude, Titan)
|
|
9
|
+
* - Google Vertex AI (Gemini)
|
|
10
|
+
* - Ollama (local models)
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { loadLLMConfig, createProvider } from './core/llm/index.js';
|
|
15
|
+
*
|
|
16
|
+
* const config = loadLLMConfig(projectPath);
|
|
17
|
+
* if (config) {
|
|
18
|
+
* const provider = await createProvider(config);
|
|
19
|
+
* const result = await provider.analyze('Explain this code...');
|
|
20
|
+
* console.log(result.content);
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export { MODEL_PRICING, RECOMMENDED_MODELS, } from './types.js';
|
|
25
|
+
// Factory
|
|
26
|
+
export { loadLLMConfig, hasLLMConfig, createProvider, getAvailableProviders, validateLLMConfig, } from './provider-factory.js';
|
|
27
|
+
// Providers (for direct instantiation if needed)
|
|
28
|
+
export { ClaudeCodeProvider, isClaudeCodeAvailable } from './providers/claude-code-provider.js';
|
|
29
|
+
export { AnthropicProvider } from './providers/anthropic-provider.js';
|
|
30
|
+
export { OpenAIProvider } from './providers/openai-provider.js';
|
|
31
|
+
export { AzureOpenAIProvider } from './providers/azure-openai-provider.js';
|
|
32
|
+
export { OllamaProvider } from './providers/ollama-provider.js';
|
|
33
|
+
export { BedrockProvider } from './providers/bedrock-provider.js';
|
|
34
|
+
export { VertexAIProvider } from './providers/vertex-ai-provider.js';
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/llm/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAeH,OAAO,EACL,aAAa,EACb,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,UAAU;AACV,OAAO,EACL,aAAa,EACb,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAE/B,iDAAiD;AACjD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates appropriate LLM provider instance from configuration.
|
|
5
|
+
* Supports lazy loading of provider SDKs to avoid unnecessary dependencies.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMConfig, LLMProvider, LLMProviderType } from './types.js';
|
|
8
|
+
import { isClaudeCodeAvailable, getClaudeCodeStatus } from './providers/claude-code-provider.js';
|
|
9
|
+
import { Logger } from '../../utils/logger.js';
|
|
10
|
+
export { isClaudeCodeAvailable, getClaudeCodeStatus };
|
|
11
|
+
/**
|
|
12
|
+
* Provider factory options
|
|
13
|
+
*/
|
|
14
|
+
export interface ProviderFactoryOptions {
|
|
15
|
+
logger?: Logger;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Load LLM configuration from project
|
|
19
|
+
*
|
|
20
|
+
* @param projectPath - Path to project root
|
|
21
|
+
* @returns LLM config or null if not configured
|
|
22
|
+
*/
|
|
23
|
+
export declare function loadLLMConfig(projectPath: string): LLMConfig | null;
|
|
24
|
+
/**
|
|
25
|
+
* Check if LLM is configured for a project
|
|
26
|
+
*/
|
|
27
|
+
export declare function hasLLMConfig(projectPath: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Create LLM provider from configuration
|
|
30
|
+
*
|
|
31
|
+
* @param config - LLM configuration
|
|
32
|
+
* @param options - Factory options
|
|
33
|
+
* @returns LLM provider instance
|
|
34
|
+
* @throws Error if provider type not supported or SDK not installed
|
|
35
|
+
*/
|
|
36
|
+
export declare function createProvider(config: LLMConfig, options?: ProviderFactoryOptions): Promise<LLMProvider>;
|
|
37
|
+
/**
|
|
38
|
+
* Get list of available providers (based on installed SDKs and env vars)
|
|
39
|
+
*/
|
|
40
|
+
export declare function getAvailableProviders(): Promise<LLMProviderType[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Validate LLM configuration
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateLLMConfig(config: LLMConfig): {
|
|
45
|
+
valid: boolean;
|
|
46
|
+
errors: string[];
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=provider-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-factory.d.ts","sourceRoot":"","sources":["../../../../src/core/llm/provider-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AACjG,OAAO,EAAE,MAAM,EAAiB,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAanE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,WAAW,CAAC,CA4BtB;AA6KD;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA6DxE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BzF"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Provider Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates appropriate LLM provider instance from configuration.
|
|
5
|
+
* Supports lazy loading of provider SDKs to avoid unnecessary dependencies.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from '../../utils/fs-native.js';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { isClaudeCodeAvailable, getClaudeCodeStatus } from './providers/claude-code-provider.js';
|
|
10
|
+
import { consoleLogger } from '../../utils/logger.js';
|
|
11
|
+
// Re-export for convenience
|
|
12
|
+
export { isClaudeCodeAvailable, getClaudeCodeStatus };
|
|
13
|
+
/**
|
|
14
|
+
* Load LLM configuration from project
|
|
15
|
+
*
|
|
16
|
+
* @param projectPath - Path to project root
|
|
17
|
+
* @returns LLM config or null if not configured
|
|
18
|
+
*/
|
|
19
|
+
export function loadLLMConfig(projectPath) {
|
|
20
|
+
const configPath = path.join(projectPath, '.specweave', 'config.json');
|
|
21
|
+
if (!fs.existsSync(configPath)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
26
|
+
return config.llm || null;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if LLM is configured for a project
|
|
34
|
+
*/
|
|
35
|
+
export function hasLLMConfig(projectPath) {
|
|
36
|
+
const config = loadLLMConfig(projectPath);
|
|
37
|
+
return config !== null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Create LLM provider from configuration
|
|
41
|
+
*
|
|
42
|
+
* @param config - LLM configuration
|
|
43
|
+
* @param options - Factory options
|
|
44
|
+
* @returns LLM provider instance
|
|
45
|
+
* @throws Error if provider type not supported or SDK not installed
|
|
46
|
+
*/
|
|
47
|
+
export async function createProvider(config, options = {}) {
|
|
48
|
+
const logger = options.logger ?? consoleLogger;
|
|
49
|
+
switch (config.provider) {
|
|
50
|
+
case 'claude-code':
|
|
51
|
+
return createClaudeCodeProvider(config, logger);
|
|
52
|
+
case 'anthropic':
|
|
53
|
+
return createAnthropicProvider(config, logger);
|
|
54
|
+
case 'openai':
|
|
55
|
+
return createOpenAIProvider(config, logger);
|
|
56
|
+
case 'azure-openai':
|
|
57
|
+
return createAzureOpenAIProvider(config, logger);
|
|
58
|
+
case 'ollama':
|
|
59
|
+
return createOllamaProvider(config, logger);
|
|
60
|
+
case 'bedrock':
|
|
61
|
+
return createBedrockProvider(config, logger);
|
|
62
|
+
case 'vertex-ai':
|
|
63
|
+
return createVertexAIProvider(config, logger);
|
|
64
|
+
default:
|
|
65
|
+
throw new Error(`Unsupported LLM provider: ${config.provider}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create Claude Code native provider (uses MAX subscription!)
|
|
70
|
+
*
|
|
71
|
+
* This is the RECOMMENDED provider for Claude MAX subscribers.
|
|
72
|
+
* Uses `claude --print` CLI command with cached authentication.
|
|
73
|
+
* NO API KEY NEEDED - uses your existing MAX subscription!
|
|
74
|
+
*/
|
|
75
|
+
async function createClaudeCodeProvider(config, logger) {
|
|
76
|
+
const { ClaudeCodeProvider } = await import('./providers/claude-code-provider.js');
|
|
77
|
+
// Check if Claude Code CLI is available
|
|
78
|
+
const available = await isClaudeCodeAvailable();
|
|
79
|
+
if (!available) {
|
|
80
|
+
throw new Error('Claude Code CLI not available or not authenticated. ' +
|
|
81
|
+
'Run `claude` interactively first to authenticate with your MAX subscription.');
|
|
82
|
+
}
|
|
83
|
+
return new ClaudeCodeProvider({
|
|
84
|
+
model: config.model || 'opus', // Opus 4.5 by default for best analysis quality
|
|
85
|
+
maxTokens: config.maxTokensPerRequest,
|
|
86
|
+
logger,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Create Anthropic provider (lazy load SDK)
|
|
91
|
+
*/
|
|
92
|
+
async function createAnthropicProvider(config, logger) {
|
|
93
|
+
// Dynamic import to avoid requiring SDK if not used
|
|
94
|
+
const { AnthropicProvider } = await import('./providers/anthropic-provider.js');
|
|
95
|
+
const apiKey = config.apiKeyEnv ? process.env[config.apiKeyEnv] : process.env.ANTHROPIC_API_KEY;
|
|
96
|
+
if (!apiKey) {
|
|
97
|
+
throw new Error(`Anthropic API key not found. Set ${config.apiKeyEnv || 'ANTHROPIC_API_KEY'} environment variable.`);
|
|
98
|
+
}
|
|
99
|
+
return new AnthropicProvider({
|
|
100
|
+
apiKey,
|
|
101
|
+
model: config.model || 'claude-sonnet-4-20250514',
|
|
102
|
+
maxTokens: config.maxTokensPerRequest,
|
|
103
|
+
temperature: config.temperature,
|
|
104
|
+
logger,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create OpenAI provider (lazy load SDK)
|
|
109
|
+
*/
|
|
110
|
+
async function createOpenAIProvider(config, logger) {
|
|
111
|
+
const { OpenAIProvider } = await import('./providers/openai-provider.js');
|
|
112
|
+
const apiKey = config.apiKeyEnv ? process.env[config.apiKeyEnv] : process.env.OPENAI_API_KEY;
|
|
113
|
+
if (!apiKey) {
|
|
114
|
+
throw new Error(`OpenAI API key not found. Set ${config.apiKeyEnv || 'OPENAI_API_KEY'} environment variable.`);
|
|
115
|
+
}
|
|
116
|
+
return new OpenAIProvider({
|
|
117
|
+
apiKey,
|
|
118
|
+
model: config.model || 'gpt-4o',
|
|
119
|
+
maxTokens: config.maxTokensPerRequest,
|
|
120
|
+
temperature: config.temperature,
|
|
121
|
+
logger,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Create Azure OpenAI provider
|
|
126
|
+
*/
|
|
127
|
+
async function createAzureOpenAIProvider(config, logger) {
|
|
128
|
+
const { AzureOpenAIProvider } = await import('./providers/azure-openai-provider.js');
|
|
129
|
+
const apiKey = config.apiKeyEnv
|
|
130
|
+
? process.env[config.apiKeyEnv]
|
|
131
|
+
: process.env.AZURE_OPENAI_API_KEY;
|
|
132
|
+
if (!apiKey) {
|
|
133
|
+
throw new Error(`Azure OpenAI API key not found. Set ${config.apiKeyEnv || 'AZURE_OPENAI_API_KEY'} environment variable.`);
|
|
134
|
+
}
|
|
135
|
+
if (!config.baseUrl) {
|
|
136
|
+
throw new Error('Azure OpenAI requires baseUrl (endpoint) in config');
|
|
137
|
+
}
|
|
138
|
+
return new AzureOpenAIProvider({
|
|
139
|
+
apiKey,
|
|
140
|
+
endpoint: config.baseUrl,
|
|
141
|
+
deployment: config.azureDeployment || config.model,
|
|
142
|
+
apiVersion: config.azureApiVersion || '2024-02-15-preview',
|
|
143
|
+
maxTokens: config.maxTokensPerRequest,
|
|
144
|
+
temperature: config.temperature,
|
|
145
|
+
logger,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create Ollama provider (local)
|
|
150
|
+
*/
|
|
151
|
+
async function createOllamaProvider(config, logger) {
|
|
152
|
+
const { OllamaProvider } = await import('./providers/ollama-provider.js');
|
|
153
|
+
return new OllamaProvider({
|
|
154
|
+
baseUrl: config.baseUrl || 'http://localhost:11434',
|
|
155
|
+
model: config.model || 'llama3.1:8b',
|
|
156
|
+
maxTokens: config.maxTokensPerRequest,
|
|
157
|
+
temperature: config.temperature,
|
|
158
|
+
logger,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Create AWS Bedrock provider
|
|
163
|
+
*/
|
|
164
|
+
async function createBedrockProvider(config, logger) {
|
|
165
|
+
const { BedrockProvider } = await import('./providers/bedrock-provider.js');
|
|
166
|
+
return new BedrockProvider({
|
|
167
|
+
region: config.awsRegion || process.env.AWS_REGION || 'us-east-1',
|
|
168
|
+
model: config.model || 'anthropic.claude-3-5-sonnet-20241022-v2:0',
|
|
169
|
+
maxTokens: config.maxTokensPerRequest,
|
|
170
|
+
temperature: config.temperature,
|
|
171
|
+
logger,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create Google Vertex AI provider
|
|
176
|
+
*/
|
|
177
|
+
async function createVertexAIProvider(config, logger) {
|
|
178
|
+
const { VertexAIProvider } = await import('./providers/vertex-ai-provider.js');
|
|
179
|
+
return new VertexAIProvider({
|
|
180
|
+
projectId: process.env.GOOGLE_CLOUD_PROJECT,
|
|
181
|
+
location: process.env.GOOGLE_CLOUD_LOCATION || 'us-central1',
|
|
182
|
+
model: config.model || 'gemini-1.5-pro',
|
|
183
|
+
maxTokens: config.maxTokensPerRequest,
|
|
184
|
+
temperature: config.temperature,
|
|
185
|
+
logger,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get list of available providers (based on installed SDKs and env vars)
|
|
190
|
+
*/
|
|
191
|
+
export async function getAvailableProviders() {
|
|
192
|
+
const available = [];
|
|
193
|
+
// Check Claude Code (RECOMMENDED - uses MAX subscription!)
|
|
194
|
+
try {
|
|
195
|
+
if (await isClaudeCodeAvailable()) {
|
|
196
|
+
available.push('claude-code');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
// Claude Code not available
|
|
201
|
+
}
|
|
202
|
+
// Check Anthropic API
|
|
203
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
204
|
+
try {
|
|
205
|
+
await import('@anthropic-ai/sdk');
|
|
206
|
+
available.push('anthropic');
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
// SDK not installed
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Check OpenAI
|
|
213
|
+
if (process.env.OPENAI_API_KEY) {
|
|
214
|
+
try {
|
|
215
|
+
await import('openai');
|
|
216
|
+
available.push('openai');
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// SDK not installed
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Check Azure OpenAI
|
|
223
|
+
if (process.env.AZURE_OPENAI_API_KEY && process.env.AZURE_OPENAI_ENDPOINT) {
|
|
224
|
+
available.push('azure-openai');
|
|
225
|
+
}
|
|
226
|
+
// Ollama is always "available" if URL is reachable
|
|
227
|
+
try {
|
|
228
|
+
const response = await fetch('http://localhost:11434/api/tags', {
|
|
229
|
+
method: 'GET',
|
|
230
|
+
signal: AbortSignal.timeout(2000),
|
|
231
|
+
});
|
|
232
|
+
if (response.ok) {
|
|
233
|
+
available.push('ollama');
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Ollama not running
|
|
238
|
+
}
|
|
239
|
+
// Check Bedrock (requires AWS credentials)
|
|
240
|
+
if (process.env.AWS_ACCESS_KEY_ID || process.env.AWS_PROFILE) {
|
|
241
|
+
available.push('bedrock');
|
|
242
|
+
}
|
|
243
|
+
// Check Vertex AI
|
|
244
|
+
if (process.env.GOOGLE_APPLICATION_CREDENTIALS || process.env.GOOGLE_CLOUD_PROJECT) {
|
|
245
|
+
available.push('vertex-ai');
|
|
246
|
+
}
|
|
247
|
+
return available;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Validate LLM configuration
|
|
251
|
+
*/
|
|
252
|
+
export function validateLLMConfig(config) {
|
|
253
|
+
const errors = [];
|
|
254
|
+
if (!config.provider) {
|
|
255
|
+
errors.push('provider is required');
|
|
256
|
+
}
|
|
257
|
+
if (!config.model) {
|
|
258
|
+
errors.push('model is required');
|
|
259
|
+
}
|
|
260
|
+
if (config.provider === 'azure-openai' && !config.baseUrl) {
|
|
261
|
+
errors.push('baseUrl (endpoint) is required for Azure OpenAI');
|
|
262
|
+
}
|
|
263
|
+
if (config.maxTokensPerRequest && config.maxTokensPerRequest > 100000) {
|
|
264
|
+
errors.push('maxTokensPerRequest exceeds maximum (100000)');
|
|
265
|
+
}
|
|
266
|
+
if (config.temperature !== undefined && (config.temperature < 0 || config.temperature > 2)) {
|
|
267
|
+
errors.push('temperature must be between 0 and 2');
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
valid: errors.length === 0,
|
|
271
|
+
errors,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=provider-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-factory.js","sourceRoot":"","sources":["../../../../src/core/llm/provider-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Claude Provider
|
|
3
|
+
*
|
|
4
|
+
* Implements LLMProvider interface for Anthropic's Claude models.
|
|
5
|
+
* Uses @anthropic-ai/sdk for API calls.
|
|
6
|
+
*/
|
|
7
|
+
import type { LLMProvider, AnalyzeOptions, AnalyzeResult, StructuredOptions } from '../types.js';
|
|
8
|
+
import { Logger } from '../../../utils/logger.js';
|
|
9
|
+
/**
|
|
10
|
+
* Anthropic provider configuration
|
|
11
|
+
*/
|
|
12
|
+
export interface AnthropicProviderConfig {
|
|
13
|
+
apiKey: string;
|
|
14
|
+
model?: string;
|
|
15
|
+
maxTokens?: number;
|
|
16
|
+
temperature?: number;
|
|
17
|
+
baseUrl?: string;
|
|
18
|
+
logger?: Logger;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Anthropic Claude provider implementation
|
|
22
|
+
*/
|
|
23
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
24
|
+
readonly name: "anthropic";
|
|
25
|
+
readonly defaultModel: string;
|
|
26
|
+
private apiKey;
|
|
27
|
+
private maxTokens;
|
|
28
|
+
private temperature;
|
|
29
|
+
private baseUrl;
|
|
30
|
+
private logger;
|
|
31
|
+
private client;
|
|
32
|
+
constructor(config: AnthropicProviderConfig);
|
|
33
|
+
/**
|
|
34
|
+
* Get or create SDK client (lazy initialization)
|
|
35
|
+
*/
|
|
36
|
+
private getClient;
|
|
37
|
+
/**
|
|
38
|
+
* Analyze text with Claude
|
|
39
|
+
*/
|
|
40
|
+
analyze(prompt: string, options?: AnalyzeOptions): Promise<AnalyzeResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Analyze with structured JSON output
|
|
43
|
+
*/
|
|
44
|
+
analyzeStructured<T>(prompt: string, options: StructuredOptions<T>): Promise<{
|
|
45
|
+
data: T;
|
|
46
|
+
usage: AnalyzeResult['usage'];
|
|
47
|
+
estimatedCost: number;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* Estimate cost for a request
|
|
51
|
+
*/
|
|
52
|
+
estimateCost(inputTokens: number, outputTokens: number, model?: string): number;
|
|
53
|
+
/**
|
|
54
|
+
* Check if provider is available
|
|
55
|
+
*/
|
|
56
|
+
isAvailable(): Promise<boolean>;
|
|
57
|
+
/**
|
|
58
|
+
* Get provider status
|
|
59
|
+
*/
|
|
60
|
+
getStatus(): Promise<{
|
|
61
|
+
available: boolean;
|
|
62
|
+
latencyMs?: number;
|
|
63
|
+
error?: string;
|
|
64
|
+
}>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=anthropic-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../../../../src/core/llm/providers/anthropic-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EAElB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,MAAM,EAAiB,MAAM,0BAA0B,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAM;gBAER,MAAM,EAAE,uBAAuB;IAS3C;;OAEG;YACW,SAAS;IAYvB;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAwEnF;;OAEG;IACG,iBAAiB,CAAC,CAAC,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAkD7E;;OAEG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAU/E;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAuBvF"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Claude Provider
|
|
3
|
+
*
|
|
4
|
+
* Implements LLMProvider interface for Anthropic's Claude models.
|
|
5
|
+
* Uses @anthropic-ai/sdk for API calls.
|
|
6
|
+
*/
|
|
7
|
+
import { MODEL_PRICING } from '../types.js';
|
|
8
|
+
import { consoleLogger } from '../../../utils/logger.js';
|
|
9
|
+
/**
|
|
10
|
+
* Anthropic Claude provider implementation
|
|
11
|
+
*/
|
|
12
|
+
export class AnthropicProvider {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.name = 'anthropic';
|
|
15
|
+
this.apiKey = config.apiKey;
|
|
16
|
+
this.defaultModel = config.model || 'claude-sonnet-4-20250514';
|
|
17
|
+
this.maxTokens = config.maxTokens || 4096;
|
|
18
|
+
this.temperature = config.temperature ?? 0.3;
|
|
19
|
+
this.baseUrl = config.baseUrl || 'https://api.anthropic.com';
|
|
20
|
+
this.logger = config.logger || consoleLogger;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get or create SDK client (lazy initialization)
|
|
24
|
+
*/
|
|
25
|
+
async getClient() {
|
|
26
|
+
if (!this.client) {
|
|
27
|
+
// Dynamic import to avoid requiring SDK if not used
|
|
28
|
+
const Anthropic = (await import('@anthropic-ai/sdk')).default;
|
|
29
|
+
this.client = new Anthropic({
|
|
30
|
+
apiKey: this.apiKey,
|
|
31
|
+
baseURL: this.baseUrl,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return this.client;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Analyze text with Claude
|
|
38
|
+
*/
|
|
39
|
+
async analyze(prompt, options = {}) {
|
|
40
|
+
const startTime = Date.now();
|
|
41
|
+
const model = options.model || this.defaultModel;
|
|
42
|
+
const maxTokens = options.maxTokens || this.maxTokens;
|
|
43
|
+
const temperature = options.temperature ?? this.temperature;
|
|
44
|
+
const retries = options.retries ?? 2;
|
|
45
|
+
const timeout = options.timeout ?? 60000;
|
|
46
|
+
let lastError = null;
|
|
47
|
+
let wasRetry = false;
|
|
48
|
+
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
49
|
+
try {
|
|
50
|
+
const client = await this.getClient();
|
|
51
|
+
const messages = [
|
|
52
|
+
{ role: 'user', content: prompt },
|
|
53
|
+
];
|
|
54
|
+
const response = await client.messages.create({
|
|
55
|
+
model,
|
|
56
|
+
max_tokens: maxTokens,
|
|
57
|
+
temperature,
|
|
58
|
+
system: options.systemPrompt,
|
|
59
|
+
messages,
|
|
60
|
+
});
|
|
61
|
+
const content = response.content
|
|
62
|
+
.filter((block) => block.type === 'text')
|
|
63
|
+
.map((block) => block.text)
|
|
64
|
+
.join('\n');
|
|
65
|
+
const usage = {
|
|
66
|
+
inputTokens: response.usage?.input_tokens || 0,
|
|
67
|
+
outputTokens: response.usage?.output_tokens || 0,
|
|
68
|
+
totalTokens: (response.usage?.input_tokens || 0) + (response.usage?.output_tokens || 0),
|
|
69
|
+
};
|
|
70
|
+
return {
|
|
71
|
+
content,
|
|
72
|
+
usage,
|
|
73
|
+
estimatedCost: this.estimateCost(usage.inputTokens, usage.outputTokens, model),
|
|
74
|
+
model,
|
|
75
|
+
durationMs: Date.now() - startTime,
|
|
76
|
+
wasRetry,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
lastError = error;
|
|
81
|
+
wasRetry = true;
|
|
82
|
+
// Don't retry on auth errors
|
|
83
|
+
if (error.status === 401 || error.status === 403) {
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
// Don't retry on validation errors
|
|
87
|
+
if (error.status === 400) {
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
// Retry on rate limits and server errors
|
|
91
|
+
if (attempt < retries) {
|
|
92
|
+
const delay = Math.min(1000 * Math.pow(2, attempt), 10000);
|
|
93
|
+
this.logger.warn(`Anthropic request failed, retrying in ${delay}ms...`);
|
|
94
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
throw lastError || new Error('Anthropic request failed after retries');
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Analyze with structured JSON output
|
|
102
|
+
*/
|
|
103
|
+
async analyzeStructured(prompt, options) {
|
|
104
|
+
// Add JSON instruction to prompt
|
|
105
|
+
const jsonPrompt = `${prompt}
|
|
106
|
+
|
|
107
|
+
IMPORTANT: Respond with valid JSON matching this schema:
|
|
108
|
+
${JSON.stringify(options.schema, null, 2)}
|
|
109
|
+
|
|
110
|
+
Return ONLY the JSON object, no markdown formatting or explanation.`;
|
|
111
|
+
const result = await this.analyze(jsonPrompt, {
|
|
112
|
+
...options,
|
|
113
|
+
temperature: options.temperature ?? 0.1, // Lower temp for structured output
|
|
114
|
+
});
|
|
115
|
+
try {
|
|
116
|
+
// Extract JSON from response (handle markdown code blocks)
|
|
117
|
+
let jsonContent = result.content.trim();
|
|
118
|
+
// Remove markdown code block if present
|
|
119
|
+
if (jsonContent.startsWith('```json')) {
|
|
120
|
+
jsonContent = jsonContent.slice(7);
|
|
121
|
+
}
|
|
122
|
+
else if (jsonContent.startsWith('```')) {
|
|
123
|
+
jsonContent = jsonContent.slice(3);
|
|
124
|
+
}
|
|
125
|
+
if (jsonContent.endsWith('```')) {
|
|
126
|
+
jsonContent = jsonContent.slice(0, -3);
|
|
127
|
+
}
|
|
128
|
+
jsonContent = jsonContent.trim();
|
|
129
|
+
const data = JSON.parse(jsonContent);
|
|
130
|
+
return {
|
|
131
|
+
data,
|
|
132
|
+
usage: result.usage,
|
|
133
|
+
estimatedCost: result.estimatedCost,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch (parseError) {
|
|
137
|
+
if (options.strict) {
|
|
138
|
+
throw new Error(`Failed to parse structured response: ${parseError.message}`);
|
|
139
|
+
}
|
|
140
|
+
// Return raw content wrapped in error structure
|
|
141
|
+
return {
|
|
142
|
+
data: { error: 'parse_failed', raw: result.content },
|
|
143
|
+
usage: result.usage,
|
|
144
|
+
estimatedCost: result.estimatedCost,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Estimate cost for a request
|
|
150
|
+
*/
|
|
151
|
+
estimateCost(inputTokens, outputTokens, model) {
|
|
152
|
+
const modelId = model || this.defaultModel;
|
|
153
|
+
const pricing = MODEL_PRICING[modelId] || { inputPer1M: 3, outputPer1M: 15 };
|
|
154
|
+
const inputCost = (inputTokens / 1000000) * pricing.inputPer1M;
|
|
155
|
+
const outputCost = (outputTokens / 1000000) * pricing.outputPer1M;
|
|
156
|
+
return inputCost + outputCost;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check if provider is available
|
|
160
|
+
*/
|
|
161
|
+
async isAvailable() {
|
|
162
|
+
try {
|
|
163
|
+
const status = await this.getStatus();
|
|
164
|
+
return status.available;
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get provider status
|
|
172
|
+
*/
|
|
173
|
+
async getStatus() {
|
|
174
|
+
const startTime = Date.now();
|
|
175
|
+
try {
|
|
176
|
+
const client = await this.getClient();
|
|
177
|
+
// Simple ping - count tokens for minimal text
|
|
178
|
+
await client.messages.count_tokens({
|
|
179
|
+
model: this.defaultModel,
|
|
180
|
+
messages: [{ role: 'user', content: 'ping' }],
|
|
181
|
+
});
|
|
182
|
+
return {
|
|
183
|
+
available: true,
|
|
184
|
+
latencyMs: Date.now() - startTime,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
return {
|
|
189
|
+
available: false,
|
|
190
|
+
error: error.message || 'Unknown error',
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=anthropic-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-provider.js","sourceRoot":"","sources":["../../../../../src/core/llm/providers/anthropic-provider.ts"],"names":[],"mappings":"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"}
|