@erode-app/core 0.9.2 → 0.9.3
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/analysis/prompts/drift-analysis.md +17 -0
- package/dist/analysis/section-formatters.d.ts.map +1 -1
- package/dist/analysis/section-formatters.js +10 -1
- package/dist/analysis/section-formatters.js.map +1 -1
- package/dist/providers/anthropic/models.d.ts +2 -2
- package/dist/providers/anthropic/models.js +2 -2
- package/dist/providers/anthropic/models.js.map +1 -1
- package/dist/providers/anthropic/provider.d.ts +2 -1
- package/dist/providers/anthropic/provider.d.ts.map +1 -1
- package/dist/providers/anthropic/provider.js +10 -3
- package/dist/providers/anthropic/provider.js.map +1 -1
- package/dist/providers/base-provider.d.ts +3 -2
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +32 -8
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/gemini/provider.d.ts +2 -1
- package/dist/providers/gemini/provider.d.ts.map +1 -1
- package/dist/providers/gemini/provider.js +66 -2
- package/dist/providers/gemini/provider.js.map +1 -1
- package/dist/providers/generation-profile.d.ts +14 -0
- package/dist/providers/generation-profile.d.ts.map +1 -0
- package/dist/providers/generation-profile.js +34 -0
- package/dist/providers/generation-profile.js.map +1 -0
- package/dist/providers/openai/models.d.ts +2 -2
- package/dist/providers/openai/models.js +2 -2
- package/dist/providers/openai/models.js.map +1 -1
- package/dist/providers/openai/provider.d.ts +2 -1
- package/dist/providers/openai/provider.d.ts.map +1 -1
- package/dist/providers/openai/provider.js +74 -14
- package/dist/providers/openai/provider.js.map +1 -1
- package/package.json +5 -5
|
@@ -64,6 +64,23 @@ These are ALL relationships currently declared in the architecture model:
|
|
|
64
64
|
|
|
65
65
|
Cross-reference the dependency changes above against the architecture model and assess:
|
|
66
66
|
|
|
67
|
+
### Dependency Coverage
|
|
68
|
+
|
|
69
|
+
For every ADDED dependency in the DEPENDENCY CHANGES DETECTED section, account for it
|
|
70
|
+
explicitly. Classify each dependency as one of:
|
|
71
|
+
|
|
72
|
+
- Already declared in the model
|
|
73
|
+
- New relationship to add
|
|
74
|
+
- New component plus relationship to add
|
|
75
|
+
- External package or third-party dependency that should not be modeled
|
|
76
|
+
- Ignored with a brief reason
|
|
77
|
+
|
|
78
|
+
If an existing modeled component gains a dependency on a newly introduced component,
|
|
79
|
+
include both the new component and that relationship. If a newly introduced component
|
|
80
|
+
depends on an existing modeled component, include both the new component and that
|
|
81
|
+
relationship. Do not let one dependency that created a new component hide other
|
|
82
|
+
relationships to or from that component.
|
|
83
|
+
|
|
67
84
|
### 1. New Dependencies NOT in Model (Potential Drift)
|
|
68
85
|
|
|
69
86
|
- Are there new dependencies that aren't in the allowed dependencies list?
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"section-formatters.d.ts","sourceRoot":"","sources":["../../src/analysis/section-formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,KAAK,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,wBAAgB,yBAAyB,CAAC,aAAa,EAAE;IACvD,aAAa,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC3C,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjF,GAAG,MAAM,CAoBT;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,CAIrF;AAED,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,0BAA0B,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"section-formatters.d.ts","sourceRoot":"","sources":["../../src/analysis/section-formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,KAAK,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,wBAAgB,yBAAyB,CAAC,aAAa,EAAE;IACvD,aAAa,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC3C,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjF,GAAG,MAAM,CAoBT;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,CAIrF;AAED,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,0BAA0B,GAAG,MAAM,CAwCxF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAKT;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE;IACV,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,EAAE,GACF,MAAM,CAWR;AAED,wBAAgB,sBAAsB,CACpC,aAAa,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GACjF,MAAM,CAWR;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAK/D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAOA"}
|
|
@@ -43,7 +43,16 @@ export function formatDependencyChanges(dependencies) {
|
|
|
43
43
|
if (items && items.length > 0) {
|
|
44
44
|
section += `**${label} Dependencies:**\n`;
|
|
45
45
|
section += items
|
|
46
|
-
.map((dep) =>
|
|
46
|
+
.map((dep) => {
|
|
47
|
+
const trimmedCode = dep.code.trim();
|
|
48
|
+
const evidence = trimmedCode
|
|
49
|
+
? `\n Evidence:\n${trimmedCode
|
|
50
|
+
.split('\n')
|
|
51
|
+
.map((line) => ` ${line}`)
|
|
52
|
+
.join('\n')}`
|
|
53
|
+
: '';
|
|
54
|
+
return `- ${dep.dependency} (${dep.file})\n ${dep.description}${evidence}`;
|
|
55
|
+
})
|
|
47
56
|
.join('\n');
|
|
48
57
|
section += '\n\n';
|
|
49
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"section-formatters.js","sourceRoot":"","sources":["../../src/analysis/section-formatters.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"section-formatters.js","sourceRoot":"","sources":["../../src/analysis/section-formatters.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/providers/anthropic/models.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/providers/anthropic/models.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,kBAAkB;IACxB,QAAQ,EAAE,mBAAmB;CACrB,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { BaseProvider, type ProviderConfig } from '../base-provider.js';
|
|
2
2
|
import type { AnalysisPhase } from '../analysis-phase.js';
|
|
3
|
+
import { type GenerationProfile } from '../generation-profile.js';
|
|
3
4
|
export declare class AnthropicProvider extends BaseProvider {
|
|
4
5
|
private readonly client;
|
|
5
6
|
constructor(config: ProviderConfig);
|
|
6
|
-
protected callModel(model: string, prompt: string, phase: AnalysisPhase,
|
|
7
|
+
protected callModel(model: string, prompt: string, phase: AnalysisPhase, generationProfile: GenerationProfile): Promise<string>;
|
|
7
8
|
}
|
|
8
9
|
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,0BAA0B,CAAC;AASlC,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEvB,MAAM,EAAE,cAAc;cAelB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,iBAAiB,EAAE,iBAAiB,GACnC,OAAO,CAAC,MAAM,CAAC;CAgDnB"}
|
|
@@ -2,7 +2,13 @@ import Anthropic from '@anthropic-ai/sdk';
|
|
|
2
2
|
import { BaseProvider } from '../base-provider.js';
|
|
3
3
|
import { ApiError, ErodeError, ErrorCode } from '../../errors.js';
|
|
4
4
|
import { ENV_VAR_NAMES, RC_FILENAME } from '../../utils/config.js';
|
|
5
|
+
import { resolveOutputTokenLimit, } from '../generation-profile.js';
|
|
5
6
|
import { ANTHROPIC_MODELS } from './models.js';
|
|
7
|
+
const MAX_TOKENS_BY_OUTPUT_SIZE = {
|
|
8
|
+
small: 600,
|
|
9
|
+
medium: 1500,
|
|
10
|
+
large: 8192,
|
|
11
|
+
};
|
|
6
12
|
export class AnthropicProvider extends BaseProvider {
|
|
7
13
|
client;
|
|
8
14
|
constructor(config) {
|
|
@@ -15,11 +21,12 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
15
21
|
});
|
|
16
22
|
this.client = new Anthropic({ apiKey: config.apiKey });
|
|
17
23
|
}
|
|
18
|
-
async callModel(model, prompt, phase,
|
|
24
|
+
async callModel(model, prompt, phase, generationProfile) {
|
|
25
|
+
const outputTokenLimit = resolveOutputTokenLimit(generationProfile, MAX_TOKENS_BY_OUTPUT_SIZE);
|
|
19
26
|
try {
|
|
20
27
|
const response = await this.client.messages.create({
|
|
21
28
|
model,
|
|
22
|
-
max_tokens:
|
|
29
|
+
max_tokens: outputTokenLimit,
|
|
23
30
|
messages: [{ role: 'user', content: prompt }],
|
|
24
31
|
});
|
|
25
32
|
if (response.stop_reason === 'refusal') {
|
|
@@ -31,7 +38,7 @@ export class AnthropicProvider extends BaseProvider {
|
|
|
31
38
|
throw new ErodeError('Anthropic returned an empty response', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The Anthropic API returned no content', { model, phase });
|
|
32
39
|
}
|
|
33
40
|
if (response.stop_reason === 'max_tokens') {
|
|
34
|
-
throw new ErodeError('Anthropic response was cut short (max_tokens reached)', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The
|
|
41
|
+
throw new ErodeError('Anthropic response was cut short (max_tokens reached)', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The Anthropic response used the available output budget before completion. Try a smaller change or tune the provider output budget.', { model, phase, outputTokenLimit });
|
|
35
42
|
}
|
|
36
43
|
return text;
|
|
37
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/anthropic/provider.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAuB,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IAChC,MAAM,CAAY;IAEnC,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,UAAU,CAClB,gCAAgC,EAChC,SAAS,CAAC,gBAAgB,EAC1B,mCAAmC,aAAa,CAAC,eAAe,2BAA2B,WAAW,GAAG,CAC1G,CAAC;QACJ,CAAC;QACD,KAAK,CAAC;YACJ,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,gBAAgB,CAAC,IAAI;YACpD,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,gBAAgB,CAAC,QAAQ;SACjE,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,CAAC;IAES,KAAK,CAAC,SAAS,CACvB,KAAa,EACb,MAAc,EACd,KAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/anthropic/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type { AIProvider } from './ai-provider.js';
|
|
|
2
2
|
import type { DependencyExtractionPromptData, ComponentSelectionPromptData, DriftAnalysisPromptData, DriftAnalysisResult } from '../analysis/analysis-types.js';
|
|
3
3
|
import type { DependencyExtractionResult } from '../schemas/dependency-extraction.schema.js';
|
|
4
4
|
import { AnalysisPhase } from './analysis-phase.js';
|
|
5
|
+
import { type GenerationProfile } from './generation-profile.js';
|
|
5
6
|
export interface ProviderConfig {
|
|
6
7
|
apiKey: string;
|
|
7
8
|
fastModel?: string;
|
|
@@ -25,10 +26,10 @@ export declare abstract class BaseProvider implements AIProvider {
|
|
|
25
26
|
* @param model - The model identifier to use
|
|
26
27
|
* @param prompt - The prompt text to send
|
|
27
28
|
* @param phase - The analysis phase (for error context)
|
|
28
|
-
* @param
|
|
29
|
+
* @param generationProfile - Provider-agnostic output intent
|
|
29
30
|
* @returns The text content of the model response
|
|
30
31
|
*/
|
|
31
|
-
protected abstract callModel(model: string, prompt: string, phase: AnalysisPhase,
|
|
32
|
+
protected abstract callModel(model: string, prompt: string, phase: AnalysisPhase, generationProfile: GenerationProfile): Promise<string>;
|
|
32
33
|
selectComponent(data: ComponentSelectionPromptData): Promise<string | null>;
|
|
33
34
|
extractDependencies(data: DependencyExtractionPromptData): Promise<DependencyExtractionResult>;
|
|
34
35
|
analyzeDrift(data: DriftAnalysisPromptData): Promise<DriftAnalysisResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-provider.d.ts","sourceRoot":"","sources":["../../src/providers/base-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,8BAA8B,EAC9B,4BAA4B,EAC5B,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAO7F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"base-provider.d.ts","sourceRoot":"","sources":["../../src/providers/base-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EACV,8BAA8B,EAC9B,4BAA4B,EAC5B,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAO7F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,yBAAyB,CAAC;AAgBjC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,8BAAsB,YAAa,YAAW,UAAU;IACtD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAE7B,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IAKhE;;;;;;;OAOG;IACH,SAAS,CAAC,QAAQ,CAAC,SAAS,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,iBAAiB,EAAE,iBAAiB,GACnC,OAAO,CAAC,MAAM,CAAC;IAEZ,eAAe,CAAC,IAAI,EAAE,4BAA4B,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA+B3E,mBAAmB,CACvB,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,0BAA0B,CAAC;IAUhC,YAAY,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiBzE,UAAU,CACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,EACvB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC;YA2BJ,YAAY;IAuC1B,OAAO,CAAC,gBAAgB;CAGzB"}
|
|
@@ -6,11 +6,19 @@ import { ErodeError, ErrorCode, ApiError } from '../errors.js';
|
|
|
6
6
|
import { withRetry } from '../utils/retry.js';
|
|
7
7
|
import { AnalysisPhase } from './analysis-phase.js';
|
|
8
8
|
import { CONFIG } from '../utils/config.js';
|
|
9
|
+
import { getGenerationProfileForModelPatch, getGenerationProfileForPhase, } from './generation-profile.js';
|
|
9
10
|
function debugLog(msg, data) {
|
|
10
11
|
if (CONFIG.debug.verbose) {
|
|
11
12
|
console.error(`[AI] ${msg}`, data !== undefined ? JSON.stringify(data) : '');
|
|
12
13
|
}
|
|
13
14
|
}
|
|
15
|
+
function formatDuration(startedAt) {
|
|
16
|
+
const elapsedMs = Number(process.hrtime.bigint() - startedAt) / 1_000_000;
|
|
17
|
+
if (elapsedMs < 1000) {
|
|
18
|
+
return `${String(Math.round(elapsedMs))}ms`;
|
|
19
|
+
}
|
|
20
|
+
return `${(elapsedMs / 1000).toFixed(2)}s`;
|
|
21
|
+
}
|
|
14
22
|
/**
|
|
15
23
|
* Abstract base class for AI providers.
|
|
16
24
|
*
|
|
@@ -26,10 +34,13 @@ export class BaseProvider {
|
|
|
26
34
|
}
|
|
27
35
|
async selectComponent(data) {
|
|
28
36
|
const prompt = PromptBuilder.buildComponentSelectionPrompt(data);
|
|
29
|
-
|
|
37
|
+
debugLog('selectComponent using model', this.fastModel);
|
|
38
|
+
const startedAt = process.hrtime.bigint();
|
|
39
|
+
const responseText = await withRetry(() => this.callModel(this.fastModel, prompt, AnalysisPhase.COMPONENT_RESOLUTION, getGenerationProfileForPhase(AnalysisPhase.COMPONENT_RESOLUTION)), {
|
|
30
40
|
retries: 2,
|
|
31
41
|
shouldRetry: (error) => this.isRetryableError(error),
|
|
32
42
|
});
|
|
43
|
+
debugLog('selectComponent completed in', formatDuration(startedAt));
|
|
33
44
|
if (!responseText) {
|
|
34
45
|
return null;
|
|
35
46
|
}
|
|
@@ -45,7 +56,6 @@ export class BaseProvider {
|
|
|
45
56
|
prompt: PromptBuilder.buildDependencyExtractionPrompt(data),
|
|
46
57
|
schema: DependencyExtractionResultSchema,
|
|
47
58
|
schemaName: 'DependencyExtractionResult',
|
|
48
|
-
maxTokens: 4096,
|
|
49
59
|
});
|
|
50
60
|
}
|
|
51
61
|
async analyzeDrift(data) {
|
|
@@ -55,7 +65,6 @@ export class BaseProvider {
|
|
|
55
65
|
prompt: PromptBuilder.buildDriftAnalysisPrompt(data),
|
|
56
66
|
schema: DriftAnalysisResponseSchema,
|
|
57
67
|
schemaName: 'DriftAnalysisResponse',
|
|
58
|
-
maxTokens: 8192,
|
|
59
68
|
});
|
|
60
69
|
return {
|
|
61
70
|
...analysisResponse,
|
|
@@ -70,21 +79,26 @@ export class BaseProvider {
|
|
|
70
79
|
linesToInsert,
|
|
71
80
|
modelFormat,
|
|
72
81
|
});
|
|
73
|
-
// Estimate tokens: ~4 chars per token, add 20% headroom for inserted lines
|
|
74
|
-
const estimatedTokens = Math.ceil(fileContent.length / 4) + linesToInsert.length * 50;
|
|
75
|
-
const maxTokens = Math.max(4096, Math.ceil(estimatedTokens * 1.2));
|
|
76
82
|
debugLog('patchModel using model', this.fastModel);
|
|
77
|
-
|
|
83
|
+
const startedAt = process.hrtime.bigint();
|
|
84
|
+
return withRetry(() => this.callModel(this.fastModel, prompt, AnalysisPhase.MODEL_UPDATE, getGenerationProfileForModelPatch(fileContent, linesToInsert)), {
|
|
78
85
|
retries: 2,
|
|
79
86
|
shouldRetry: (error) => this.isRetryableError(error),
|
|
87
|
+
})
|
|
88
|
+
.then((response) => unwrapModelPatchResponse(response))
|
|
89
|
+
.finally(() => {
|
|
90
|
+
debugLog('patchModel completed in', formatDuration(startedAt));
|
|
80
91
|
});
|
|
81
92
|
}
|
|
82
93
|
async executeStage(config) {
|
|
83
94
|
debugLog(`executeStage ${config.phase} using model`, config.model);
|
|
84
|
-
const
|
|
95
|
+
const generationProfile = config.generationProfile ?? getGenerationProfileForPhase(config.phase);
|
|
96
|
+
const startedAt = process.hrtime.bigint();
|
|
97
|
+
const responseText = await withRetry(() => this.callModel(config.model, config.prompt, config.phase, generationProfile), {
|
|
85
98
|
retries: 2,
|
|
86
99
|
shouldRetry: (error) => this.isRetryableError(error),
|
|
87
100
|
});
|
|
101
|
+
debugLog(`executeStage ${config.phase} completed in`, formatDuration(startedAt));
|
|
88
102
|
const jsonStr = PromptBuilder.extractJson(responseText);
|
|
89
103
|
if (!jsonStr) {
|
|
90
104
|
debugLog(`extractJson returned null for ${config.phase}, raw response (first 500 chars)`, responseText.slice(0, 500));
|
|
@@ -97,4 +111,14 @@ export class BaseProvider {
|
|
|
97
111
|
return error instanceof ApiError && (error.isRateLimited || error.isTimeout);
|
|
98
112
|
}
|
|
99
113
|
}
|
|
114
|
+
function unwrapModelPatchResponse(response) {
|
|
115
|
+
const trimmed = response.trim();
|
|
116
|
+
const lines = trimmed.split(/\r?\n/);
|
|
117
|
+
const firstLine = lines[0];
|
|
118
|
+
const lastLine = lines.at(-1);
|
|
119
|
+
if (firstLine?.startsWith('```') && lastLine === '```') {
|
|
120
|
+
return lines.slice(1, -1).join('\n');
|
|
121
|
+
}
|
|
122
|
+
return response;
|
|
123
|
+
}
|
|
100
124
|
//# sourceMappingURL=base-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-provider.js","sourceRoot":"","sources":["../../src/providers/base-provider.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AAC9F,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"base-provider.js","sourceRoot":"","sources":["../../src/providers/base-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { BaseProvider, type ProviderConfig } from '../base-provider.js';
|
|
2
2
|
import type { AnalysisPhase } from '../analysis-phase.js';
|
|
3
|
+
import { type GenerationProfile } from '../generation-profile.js';
|
|
3
4
|
export declare class GeminiProvider extends BaseProvider {
|
|
4
5
|
private readonly client;
|
|
5
6
|
constructor(config: ProviderConfig);
|
|
6
|
-
protected callModel(model: string, prompt: string, phase: AnalysisPhase,
|
|
7
|
+
protected callModel(model: string, prompt: string, phase: AnalysisPhase, generationProfile: GenerationProfile): Promise<string>;
|
|
7
8
|
}
|
|
8
9
|
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAEL,KAAK,iBAAiB,EAGvB,MAAM,0BAA0B,CAAC;AASlC,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;gBAEzB,MAAM,EAAE,cAAc;cAelB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,iBAAiB,EAAE,iBAAiB,GACnC,OAAO,CAAC,MAAM,CAAC;CA0HnB"}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import { FinishReason, GoogleGenAI } from '@google/genai';
|
|
1
|
+
import { FinishReason, GoogleGenAI, ThinkingLevel } from '@google/genai';
|
|
2
2
|
import { BaseProvider } from '../base-provider.js';
|
|
3
3
|
import { ApiError, ErodeError, ErrorCode } from '../../errors.js';
|
|
4
4
|
import { ENV_VAR_NAMES, RC_FILENAME } from '../../utils/config.js';
|
|
5
|
+
import { resolveOutputTokenLimit, } from '../generation-profile.js';
|
|
5
6
|
import { GEMINI_MODELS } from './models.js';
|
|
7
|
+
const MAX_OUTPUT_TOKENS_BY_OUTPUT_SIZE = {
|
|
8
|
+
small: 1500,
|
|
9
|
+
medium: 3000,
|
|
10
|
+
large: 6000,
|
|
11
|
+
};
|
|
6
12
|
export class GeminiProvider extends BaseProvider {
|
|
7
13
|
client;
|
|
8
14
|
constructor(config) {
|
|
@@ -15,16 +21,22 @@ export class GeminiProvider extends BaseProvider {
|
|
|
15
21
|
});
|
|
16
22
|
this.client = new GoogleGenAI({ apiKey: config.apiKey });
|
|
17
23
|
}
|
|
18
|
-
async callModel(model, prompt, phase,
|
|
24
|
+
async callModel(model, prompt, phase, generationProfile) {
|
|
25
|
+
const maxOutputTokens = resolveOutputTokenLimit(generationProfile, MAX_OUTPUT_TOKENS_BY_OUTPUT_SIZE);
|
|
26
|
+
const thinkingConfig = getThinkingConfig(model, generationProfile.reasoningEffort);
|
|
19
27
|
try {
|
|
20
28
|
const response = await this.client.models.generateContent({
|
|
21
29
|
model,
|
|
22
30
|
contents: prompt,
|
|
31
|
+
config: { maxOutputTokens, thinkingConfig },
|
|
23
32
|
});
|
|
24
33
|
const candidate = response.candidates?.[0];
|
|
25
34
|
if (candidate?.finishReason === FinishReason.SAFETY) {
|
|
26
35
|
throw new ErodeError('Gemini safety filters blocked the response', ErrorCode.PROVIDER_SAFETY_BLOCK, 'Content was blocked by the AI provider safety filters. Try simplifying the input.', { model, phase });
|
|
27
36
|
}
|
|
37
|
+
if (candidate?.finishReason === FinishReason.MAX_TOKENS) {
|
|
38
|
+
throw new ErodeError('Gemini response was cut short by the output token limit', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The Gemini response used the available output budget before completion. Try a smaller change or tune the provider output budget.', { model, phase, maxOutputTokens, outputSize: generationProfile.outputSize });
|
|
39
|
+
}
|
|
28
40
|
const text = response.text;
|
|
29
41
|
if (!text) {
|
|
30
42
|
throw new ErodeError('Gemini returned an empty response', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The Gemini API returned no content', { model, phase });
|
|
@@ -37,6 +49,58 @@ export class GeminiProvider extends BaseProvider {
|
|
|
37
49
|
}
|
|
38
50
|
throw ApiError.fromGeminiError(error);
|
|
39
51
|
}
|
|
52
|
+
function getThinkingConfig(thinkingModel, reasoningIntent) {
|
|
53
|
+
if (isGemini25Model(thinkingModel)) {
|
|
54
|
+
return getGemini25ThinkingConfig(thinkingModel, reasoningIntent);
|
|
55
|
+
}
|
|
56
|
+
if (isGemini3Model(thinkingModel)) {
|
|
57
|
+
return getGemini3ThinkingConfig(thinkingModel, reasoningIntent);
|
|
58
|
+
}
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
function getGemini25ThinkingConfig(thinkingModel, reasoningIntent) {
|
|
62
|
+
if (isGemini25ProModel(thinkingModel)) {
|
|
63
|
+
return { thinkingBudget: -1 };
|
|
64
|
+
}
|
|
65
|
+
switch (reasoningIntent) {
|
|
66
|
+
case 'high':
|
|
67
|
+
case 'medium':
|
|
68
|
+
return { thinkingBudget: -1 };
|
|
69
|
+
case 'low':
|
|
70
|
+
case undefined:
|
|
71
|
+
return { thinkingBudget: 0 };
|
|
72
|
+
default:
|
|
73
|
+
return { thinkingBudget: 0 };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function getGemini3ThinkingConfig(thinkingModel, reasoningIntent) {
|
|
77
|
+
switch (reasoningIntent) {
|
|
78
|
+
case 'high':
|
|
79
|
+
return { thinkingLevel: ThinkingLevel.HIGH };
|
|
80
|
+
case 'medium':
|
|
81
|
+
if (isLegacyGemini3ProModel(thinkingModel)) {
|
|
82
|
+
return { thinkingLevel: ThinkingLevel.HIGH };
|
|
83
|
+
}
|
|
84
|
+
return { thinkingLevel: ThinkingLevel.MEDIUM };
|
|
85
|
+
case 'low':
|
|
86
|
+
case undefined:
|
|
87
|
+
return { thinkingLevel: ThinkingLevel.LOW };
|
|
88
|
+
default:
|
|
89
|
+
return { thinkingLevel: ThinkingLevel.LOW };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function isGemini25Model(thinkingModel) {
|
|
93
|
+
return thinkingModel.startsWith('gemini-2.5-');
|
|
94
|
+
}
|
|
95
|
+
function isGemini25ProModel(thinkingModel) {
|
|
96
|
+
return thinkingModel.startsWith('gemini-2.5-pro');
|
|
97
|
+
}
|
|
98
|
+
function isGemini3Model(thinkingModel) {
|
|
99
|
+
return thinkingModel.startsWith('gemini-3-') || thinkingModel.startsWith('gemini-3.');
|
|
100
|
+
}
|
|
101
|
+
function isLegacyGemini3ProModel(thinkingModel) {
|
|
102
|
+
return thinkingModel.startsWith('gemini-3-pro');
|
|
103
|
+
}
|
|
40
104
|
}
|
|
41
105
|
}
|
|
42
106
|
//# sourceMappingURL=provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/gemini/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/gemini/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AnalysisPhase } from './analysis-phase.js';
|
|
2
|
+
export type OutputSize = 'small' | 'medium' | 'large';
|
|
3
|
+
export type ReasoningEffort = 'low' | 'medium' | 'high';
|
|
4
|
+
export interface GenerationProfile {
|
|
5
|
+
outputSize: OutputSize;
|
|
6
|
+
reasoningEffort?: ReasoningEffort;
|
|
7
|
+
outputContentHint?: {
|
|
8
|
+
characters: number;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function getGenerationProfileForPhase(phase: AnalysisPhase): GenerationProfile;
|
|
12
|
+
export declare function getGenerationProfileForModelPatch(fileContent: string, linesToInsert: string[]): GenerationProfile;
|
|
13
|
+
export declare function resolveOutputTokenLimit(profile: GenerationProfile, sizeTable: Record<OutputSize, number>): number;
|
|
14
|
+
//# sourceMappingURL=generation-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-profile.d.ts","sourceRoot":"","sources":["../../src/providers/generation-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AACtD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,iBAAiB,CAAC,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,aAAa,GAAG,iBAAiB,CAYpF;AAED,wBAAgB,iCAAiC,CAC/C,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,GACtB,iBAAiB,CAYnB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GACpC,MAAM,CAOR"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AnalysisPhase } from './analysis-phase.js';
|
|
2
|
+
export function getGenerationProfileForPhase(phase) {
|
|
3
|
+
switch (phase) {
|
|
4
|
+
case AnalysisPhase.COMPONENT_RESOLUTION:
|
|
5
|
+
case AnalysisPhase.DEPENDENCY_SCAN:
|
|
6
|
+
return { outputSize: 'small', reasoningEffort: 'low' };
|
|
7
|
+
case AnalysisPhase.MODEL_UPDATE:
|
|
8
|
+
return { outputSize: 'medium', reasoningEffort: 'medium' };
|
|
9
|
+
case AnalysisPhase.CHANGE_ANALYSIS:
|
|
10
|
+
return { outputSize: 'large', reasoningEffort: 'low' };
|
|
11
|
+
default:
|
|
12
|
+
return { outputSize: 'small', reasoningEffort: 'low' };
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function getGenerationProfileForModelPatch(fileContent, linesToInsert) {
|
|
16
|
+
const insertedLineCharacters = linesToInsert.length * 200;
|
|
17
|
+
const estimatedCharacters = Math.ceil((fileContent.length + insertedLineCharacters) * 1.2);
|
|
18
|
+
const minimumCharacters = 4096 * 4;
|
|
19
|
+
return {
|
|
20
|
+
outputSize: 'medium',
|
|
21
|
+
reasoningEffort: 'medium',
|
|
22
|
+
outputContentHint: {
|
|
23
|
+
characters: Math.max(minimumCharacters, estimatedCharacters),
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function resolveOutputTokenLimit(profile, sizeTable) {
|
|
28
|
+
const profileLimit = sizeTable[profile.outputSize];
|
|
29
|
+
const hintedLimit = profile.outputContentHint
|
|
30
|
+
? Math.ceil(profile.outputContentHint.characters / 4)
|
|
31
|
+
: 0;
|
|
32
|
+
return Math.max(profileLimit, hintedLimit);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=generation-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation-profile.js","sourceRoot":"","sources":["../../src/providers/generation-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAapD,MAAM,UAAU,4BAA4B,CAAC,KAAoB;IAC/D,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,aAAa,CAAC,oBAAoB,CAAC;QACxC,KAAK,aAAa,CAAC,eAAe;YAChC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;QACzD,KAAK,aAAa,CAAC,YAAY;YAC7B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QAC7D,KAAK,aAAa,CAAC,eAAe;YAChC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;QACzD;YACE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,WAAmB,EACnB,aAAuB;IAEvB,MAAM,sBAAsB,GAAG,aAAa,CAAC,MAAM,GAAG,GAAG,CAAC;IAC1D,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,sBAAsB,CAAC,GAAG,GAAG,CAAC,CAAC;IAC3F,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC;IAEnC,OAAO;QACL,UAAU,EAAE,QAAQ;QACpB,eAAe,EAAE,QAAQ;QACzB,iBAAiB,EAAE;YACjB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;SAC7D;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,OAA0B,EAC1B,SAAqC;IAErC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB;QAC3C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,UAAU,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/providers/openai/models.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/providers/openai/models.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,OAAO;CACT,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { BaseProvider, type ProviderConfig } from '../base-provider.js';
|
|
2
2
|
import type { AnalysisPhase } from '../analysis-phase.js';
|
|
3
|
+
import { type GenerationProfile } from '../generation-profile.js';
|
|
3
4
|
export declare class OpenAIProvider extends BaseProvider {
|
|
4
5
|
private readonly client;
|
|
5
6
|
constructor(config: ProviderConfig);
|
|
6
|
-
protected callModel(model: string, prompt: string, phase: AnalysisPhase,
|
|
7
|
+
protected callModel(model: string, prompt: string, phase: AnalysisPhase, generationProfile: GenerationProfile): Promise<string>;
|
|
7
8
|
}
|
|
8
9
|
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAEL,KAAK,iBAAiB,EAGvB,MAAM,0BAA0B,CAAC;AAWlC,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,cAAc;cAelB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,iBAAiB,EAAE,iBAAiB,GACnC,OAAO,CAAC,MAAM,CAAC;CAwInB"}
|
|
@@ -2,7 +2,13 @@ import OpenAI from 'openai';
|
|
|
2
2
|
import { BaseProvider } from '../base-provider.js';
|
|
3
3
|
import { ErodeError, ErrorCode, ApiError } from '../../errors.js';
|
|
4
4
|
import { ENV_VAR_NAMES, RC_FILENAME } from '../../utils/config.js';
|
|
5
|
+
import { resolveOutputTokenLimit, } from '../generation-profile.js';
|
|
5
6
|
import { OPENAI_MODELS } from './models.js';
|
|
7
|
+
const MAX_OUTPUT_TOKENS_BY_OUTPUT_SIZE = {
|
|
8
|
+
small: 1500,
|
|
9
|
+
medium: 6000,
|
|
10
|
+
large: 10000,
|
|
11
|
+
};
|
|
6
12
|
export class OpenAIProvider extends BaseProvider {
|
|
7
13
|
client;
|
|
8
14
|
constructor(config) {
|
|
@@ -15,27 +21,23 @@ export class OpenAIProvider extends BaseProvider {
|
|
|
15
21
|
});
|
|
16
22
|
this.client = new OpenAI({ apiKey: config.apiKey });
|
|
17
23
|
}
|
|
18
|
-
async callModel(model, prompt, phase,
|
|
24
|
+
async callModel(model, prompt, phase, generationProfile) {
|
|
25
|
+
const maxOutputTokens = resolveOutputTokenLimit(generationProfile, MAX_OUTPUT_TOKENS_BY_OUTPUT_SIZE);
|
|
26
|
+
const reasoningEffort = getOpenAIReasoningEffort(generationProfile.reasoningEffort);
|
|
19
27
|
try {
|
|
20
|
-
const response = await this.client.
|
|
28
|
+
const response = await this.client.responses.create({
|
|
21
29
|
model,
|
|
22
|
-
|
|
23
|
-
|
|
30
|
+
input: prompt,
|
|
31
|
+
max_output_tokens: maxOutputTokens,
|
|
32
|
+
...(supportsReasoningEffort(model) ? { reasoning: { effort: reasoningEffort } } : {}),
|
|
24
33
|
});
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
throw new ErodeError('OpenAI returned an empty response', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The OpenAI API returned no content', { model, phase });
|
|
28
|
-
}
|
|
29
|
-
if (choice.finish_reason === 'content_filter') {
|
|
30
|
-
throw new ErodeError('OpenAI safety filters blocked the response', ErrorCode.PROVIDER_SAFETY_BLOCK, 'Content was blocked by the AI provider safety filters. Try simplifying the input.', { model, phase });
|
|
34
|
+
if (response.status === 'incomplete') {
|
|
35
|
+
handleIncompleteResponse(response, model, phase, maxOutputTokens, generationProfile, reasoningEffort);
|
|
31
36
|
}
|
|
32
|
-
const text =
|
|
37
|
+
const text = extractText(response);
|
|
33
38
|
if (!text) {
|
|
34
39
|
throw new ErodeError('OpenAI returned an empty response', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The OpenAI API returned no content', { model, phase });
|
|
35
40
|
}
|
|
36
|
-
if (choice.finish_reason === 'length') {
|
|
37
|
-
throw new ErodeError('OpenAI response was cut short (max_tokens reached)', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The AI response was truncated. The output may be partial.', { model, phase, maxTokens });
|
|
38
|
-
}
|
|
39
41
|
return text;
|
|
40
42
|
}
|
|
41
43
|
catch (error) {
|
|
@@ -44,6 +46,64 @@ export class OpenAIProvider extends BaseProvider {
|
|
|
44
46
|
}
|
|
45
47
|
throw ApiError.fromOpenAIError(error);
|
|
46
48
|
}
|
|
49
|
+
function handleIncompleteResponse(response, incompleteModel, incompletePhase, incompleteMaxOutputTokens, incompleteGenerationProfile, incompleteReasoningEffort) {
|
|
50
|
+
if (response.incomplete_details?.reason === 'max_output_tokens') {
|
|
51
|
+
throw new ErodeError('Model ran out of output budget before producing a complete response', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The AI response used the available output budget before completion. Try a smaller change or tune the provider output budget or reasoning effort.', {
|
|
52
|
+
model: incompleteModel,
|
|
53
|
+
phase: incompletePhase,
|
|
54
|
+
maxOutputTokens: incompleteMaxOutputTokens,
|
|
55
|
+
outputSize: incompleteGenerationProfile.outputSize,
|
|
56
|
+
reasoningEffort: incompleteGenerationProfile.reasoningEffort,
|
|
57
|
+
providerReasoningEffort: incompleteReasoningEffort,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (response.incomplete_details?.reason === 'content_filter') {
|
|
61
|
+
throw new ErodeError('OpenAI safety filters blocked the response', ErrorCode.PROVIDER_SAFETY_BLOCK, 'Content was blocked by the AI provider safety filters. Try simplifying the input.', { model: incompleteModel, phase: incompletePhase });
|
|
62
|
+
}
|
|
63
|
+
throw new ErodeError('OpenAI returned an incomplete response', ErrorCode.PROVIDER_INVALID_RESPONSE, 'The OpenAI response was incomplete for an unknown provider reason. Try again or tune the provider output budget.', {
|
|
64
|
+
model: incompleteModel,
|
|
65
|
+
phase: incompletePhase,
|
|
66
|
+
reason: response.incomplete_details?.reason,
|
|
67
|
+
maxOutputTokens: incompleteMaxOutputTokens,
|
|
68
|
+
outputSize: incompleteGenerationProfile.outputSize,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function extractText(response) {
|
|
72
|
+
if (response.output_text.length > 0) {
|
|
73
|
+
return response.output_text;
|
|
74
|
+
}
|
|
75
|
+
return response.output
|
|
76
|
+
.filter((item) => item.type === 'message')
|
|
77
|
+
.flatMap((item) => item.content)
|
|
78
|
+
.filter((content) => content.type === 'output_text')
|
|
79
|
+
.map((content) => content.text)
|
|
80
|
+
.join('');
|
|
81
|
+
}
|
|
82
|
+
function supportsReasoningEffort(reasoningModel) {
|
|
83
|
+
if (reasoningModel.includes('chat')) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
if (reasoningModel.startsWith('gpt-5')) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
return ['o1', 'o3', 'o4'].some((prefix) => {
|
|
90
|
+
return reasoningModel === prefix || reasoningModel.startsWith(`${prefix}-`);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function getOpenAIReasoningEffort(reasoningIntent) {
|
|
94
|
+
switch (reasoningIntent) {
|
|
95
|
+
case 'high':
|
|
96
|
+
return 'high';
|
|
97
|
+
case 'medium':
|
|
98
|
+
return 'medium';
|
|
99
|
+
case 'low':
|
|
100
|
+
return 'low';
|
|
101
|
+
case undefined:
|
|
102
|
+
return 'minimal';
|
|
103
|
+
default:
|
|
104
|
+
return 'minimal';
|
|
105
|
+
}
|
|
106
|
+
}
|
|
47
107
|
}
|
|
48
108
|
}
|
|
49
109
|
//# sourceMappingURL=provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/openai/provider.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAuB,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/openai/provider.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@erode-app/core",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.3",
|
|
4
4
|
"description": "Architecture erosion detection",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -55,12 +55,12 @@
|
|
|
55
55
|
"node": ">=24.0.0"
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"@anthropic-ai/sdk": "^0.
|
|
58
|
+
"@anthropic-ai/sdk": "^0.92.0",
|
|
59
59
|
"@gitbeaker/rest": "^43.8.0",
|
|
60
|
-
"@google/genai": "^1.
|
|
60
|
+
"@google/genai": "^1.51.0",
|
|
61
61
|
"@octokit/rest": "^22.0.1",
|
|
62
62
|
"dotenv": "^17.4.2",
|
|
63
|
-
"likec4": "^1.
|
|
63
|
+
"likec4": "^1.56.0",
|
|
64
64
|
"minimatch": "^10.2.5",
|
|
65
65
|
"openai": "^6.35.0",
|
|
66
66
|
"zod": "^4.4.1"
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"@types/node": "^24.12.2",
|
|
71
71
|
"@vitest/coverage-v8": "^4.1.5",
|
|
72
72
|
"concurrently": "^9.2.1",
|
|
73
|
-
"eslint": "^10.
|
|
73
|
+
"eslint": "^10.3.0",
|
|
74
74
|
"prettier": "^3.8.3",
|
|
75
75
|
"rimraf": "^6.1.2",
|
|
76
76
|
"tsx": "^4.21.0",
|