@superblocksteam/vite-plugin-file-sync 2.0.69 → 2.0.70-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-service/agent/middleware.d.ts +6 -0
- package/dist/ai-service/agent/middleware.d.ts.map +1 -1
- package/dist/ai-service/agent/middleware.js +11 -0
- package/dist/ai-service/agent/middleware.js.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js +45 -3
- package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.d.ts +2 -0
- package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
- package/dist/ai-service/agent/tool-message-utils.js +40 -0
- package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js +3 -7
- package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js +1 -5
- package/dist/ai-service/agent/tools/apis/build-api-artifact.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/apis/get-api-docs.js +24 -0
- package/dist/ai-service/agent/tools/apis/get-api-docs.js.map +1 -1
- package/dist/ai-service/agent/tools/apis/test-api.js +2 -2
- package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +10 -0
- package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/build-capture-screenshot.js +103 -0
- package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -0
- package/dist/ai-service/agent/tools/build-install-packages.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/build-install-packages.js +36 -29
- package/dist/ai-service/agent/tools/build-install-packages.js.map +1 -1
- package/dist/ai-service/agent/tools/build-multi-edit-file.d.ts +1 -1
- package/dist/ai-service/agent/tools/build-reload-file.d.ts +8 -0
- package/dist/ai-service/agent/tools/build-reload-file.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/build-reload-file.js +57 -0
- package/dist/ai-service/agent/tools/build-reload-file.js.map +1 -0
- package/dist/ai-service/agent/tools/get-console-logs.d.ts +23 -0
- package/dist/ai-service/agent/tools/get-console-logs.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/get-console-logs.js +84 -0
- package/dist/ai-service/agent/tools/get-console-logs.js.map +1 -0
- package/dist/ai-service/agent/tools/get-runtime-errors.d.ts +13 -0
- package/dist/ai-service/agent/tools/get-runtime-errors.d.ts.map +1 -0
- package/dist/ai-service/agent/tools/get-runtime-errors.js +59 -0
- package/dist/ai-service/agent/tools/get-runtime-errors.js.map +1 -0
- package/dist/ai-service/agent/tools/index.d.ts +4 -0
- package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/index.js +4 -0
- package/dist/ai-service/agent/tools/index.js.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +5 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/integrations/execute-request.js +20 -2
- package/dist/ai-service/agent/tools/integrations/execute-request.js.map +1 -1
- package/dist/ai-service/agent/tools/shared-helpers.d.ts +35 -0
- package/dist/ai-service/agent/tools/shared-helpers.d.ts.map +1 -1
- package/dist/ai-service/agent/tools/shared-helpers.js +89 -0
- package/dist/ai-service/agent/tools/shared-helpers.js.map +1 -1
- package/dist/ai-service/agent/tools.d.ts.map +1 -1
- package/dist/ai-service/agent/tools.js +11 -5
- package/dist/ai-service/agent/tools.js.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/access-control.js +8 -0
- package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
- package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/registry.js +3 -3
- package/dist/ai-service/agent/tools2/registry.js.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +38 -10
- package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
- package/dist/ai-service/agent/tools2/types.d.ts +11 -1
- package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
- package/dist/ai-service/agent/tools2/types.js +1 -0
- package/dist/ai-service/agent/tools2/types.js.map +1 -1
- package/dist/ai-service/agent/utils.d.ts.map +1 -1
- package/dist/ai-service/agent/utils.js +33 -1
- package/dist/ai-service/agent/utils.js.map +1 -1
- package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
- package/dist/ai-service/app-interface/shell.js +30 -15
- package/dist/ai-service/app-interface/shell.js.map +1 -1
- package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
- package/dist/ai-service/chat/chat-session-store.js +71 -0
- package/dist/ai-service/chat/chat-session-store.js.map +1 -1
- package/dist/ai-service/chat/extract-history.d.ts.map +1 -1
- package/dist/ai-service/chat/extract-history.js +0 -2
- package/dist/ai-service/chat/extract-history.js.map +1 -1
- package/dist/ai-service/chat/utils.d.ts +2 -0
- package/dist/ai-service/chat/utils.d.ts.map +1 -0
- package/dist/ai-service/chat/utils.js +8 -0
- package/dist/ai-service/chat/utils.js.map +1 -0
- package/dist/ai-service/clark-provider/clark-language-model.d.ts.map +1 -1
- package/dist/ai-service/clark-provider/clark-language-model.js +6 -0
- package/dist/ai-service/clark-provider/clark-language-model.js.map +1 -1
- package/dist/ai-service/clark-provider/clark-provider.d.ts +2 -1
- package/dist/ai-service/clark-provider/clark-provider.d.ts.map +1 -1
- package/dist/ai-service/clark-provider/clark-provider.js.map +1 -1
- package/dist/ai-service/features.d.ts +4 -0
- package/dist/ai-service/features.d.ts.map +1 -1
- package/dist/ai-service/features.js +4 -0
- package/dist/ai-service/features.js.map +1 -1
- package/dist/ai-service/index.d.ts +7 -1
- package/dist/ai-service/index.d.ts.map +1 -1
- package/dist/ai-service/index.js +129 -10
- package/dist/ai-service/index.js.map +1 -1
- package/dist/ai-service/integration-validator.d.ts.map +1 -1
- package/dist/ai-service/integration-validator.js +1 -1
- package/dist/ai-service/integration-validator.js.map +1 -1
- package/dist/ai-service/judge/integration/mcp-client.d.ts +13 -0
- package/dist/ai-service/judge/integration/mcp-client.d.ts.map +1 -1
- package/dist/ai-service/judge/integration/mcp-client.js +15 -0
- package/dist/ai-service/judge/integration/mcp-client.js.map +1 -1
- package/dist/ai-service/judge/tools/playwright-action.d.ts +1 -1
- package/dist/ai-service/llm/client.d.ts +12 -1
- package/dist/ai-service/llm/client.d.ts.map +1 -1
- package/dist/ai-service/llm/client.js +20 -2
- package/dist/ai-service/llm/client.js.map +1 -1
- package/dist/ai-service/llm/context/context.d.ts.map +1 -1
- package/dist/ai-service/llm/context/context.js +1 -1
- package/dist/ai-service/llm/context/context.js.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.d.ts +3 -0
- package/dist/ai-service/llm/context/utils/message-utils.d.ts.map +1 -1
- package/dist/ai-service/llm/context/utils/message-utils.js +53 -1
- package/dist/ai-service/llm/context/utils/message-utils.js.map +1 -1
- package/dist/ai-service/llm/error.d.ts +10 -2
- package/dist/ai-service/llm/error.d.ts.map +1 -1
- package/dist/ai-service/llm/error.js +22 -0
- package/dist/ai-service/llm/error.js.map +1 -1
- package/dist/ai-service/llm/interaction/adapters/vercel.js.map +1 -1
- package/dist/ai-service/llm/interaction/index.d.ts +1 -1
- package/dist/ai-service/llm/interaction/index.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/index.js.map +1 -1
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts +30 -36
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js +123 -223
- package/dist/ai-service/llm/interaction/middlewares/stream-retry.js.map +1 -1
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.d.ts +41 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.js +74 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/abort.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.d.ts +62 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.js +112 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/fallback-chain.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.d.ts +47 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.js +131 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/retries.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.d.ts +30 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.js +36 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/stall-detector.js.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.d.ts +42 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.d.ts.map +1 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.js +208 -0
- package/dist/ai-service/llm/interaction/middlewares/utils/streams.js.map +1 -0
- package/dist/ai-service/llm/interaction/provider.d.ts +2 -0
- package/dist/ai-service/llm/interaction/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/stream-lifecycle.d.ts.map +1 -1
- package/dist/ai-service/llm/interaction/stream-lifecycle.js +21 -3
- package/dist/ai-service/llm/interaction/stream-lifecycle.js.map +1 -1
- package/dist/ai-service/llm/provider.d.ts.map +1 -1
- package/dist/ai-service/llm/provider.js +4 -3
- package/dist/ai-service/llm/provider.js.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.d.ts.map +1 -1
- package/dist/ai-service/llmobs/middleware/stream-text.js +17 -4
- package/dist/ai-service/llmobs/middleware/stream-text.js.map +1 -1
- package/dist/ai-service/mcp/adapter/index.d.ts +8 -0
- package/dist/ai-service/mcp/adapter/index.d.ts.map +1 -0
- package/dist/ai-service/mcp/adapter/index.js +10 -0
- package/dist/ai-service/mcp/adapter/index.js.map +1 -0
- package/dist/ai-service/mcp/adapter/json-schema-to-zod.d.ts +44 -0
- package/dist/ai-service/mcp/adapter/json-schema-to-zod.d.ts.map +1 -0
- package/dist/ai-service/mcp/adapter/json-schema-to-zod.js +231 -0
- package/dist/ai-service/mcp/adapter/json-schema-to-zod.js.map +1 -0
- package/dist/ai-service/mcp/adapter/mcp-tool-adapter.d.ts +118 -0
- package/dist/ai-service/mcp/adapter/mcp-tool-adapter.d.ts.map +1 -0
- package/dist/ai-service/mcp/adapter/mcp-tool-adapter.js +254 -0
- package/dist/ai-service/mcp/adapter/mcp-tool-adapter.js.map +1 -0
- package/dist/ai-service/mcp/index.d.ts +11 -0
- package/dist/ai-service/mcp/index.d.ts.map +1 -0
- package/dist/ai-service/mcp/index.js +11 -0
- package/dist/ai-service/mcp/index.js.map +1 -0
- package/dist/ai-service/mcp/types.d.ts +94 -0
- package/dist/ai-service/mcp/types.d.ts.map +1 -0
- package/dist/ai-service/mcp/types.js +7 -0
- package/dist/ai-service/mcp/types.js.map +1 -0
- package/dist/ai-service/state-machine/clark-fsm.d.ts +6 -1
- package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
- package/dist/ai-service/state-machine/clark-fsm.js +13 -0
- package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.js +1 -1
- package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/idle.js +4 -0
- package/dist/ai-service/state-machine/handlers/idle.js.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
- package/dist/ai-service/state-machine/handlers/llm-generating.js +12 -2
- package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
- package/dist/ai-service/state-machine/helpers/file-read-tracker.d.ts.map +1 -1
- package/dist/ai-service/state-machine/helpers/file-read-tracker.js +12 -3
- package/dist/ai-service/state-machine/helpers/file-read-tracker.js.map +1 -1
- package/dist/ai-service/template-renderer.d.ts.map +1 -1
- package/dist/ai-service/template-renderer.js +4 -2
- package/dist/ai-service/template-renderer.js.map +1 -1
- package/dist/ai-service/test-utils/error-mocks.d.ts.map +1 -1
- package/dist/ai-service/test-utils/error-mocks.js +9 -4
- package/dist/ai-service/test-utils/error-mocks.js.map +1 -1
- package/dist/ai-service/transform/shared.js +1 -1
- package/dist/ai-service/transform/shared.js.map +1 -1
- package/dist/ai-service/util/backoff-strategy.d.ts.map +1 -1
- package/dist/ai-service/util/backoff-strategy.js +14 -1
- package/dist/ai-service/util/backoff-strategy.js.map +1 -1
- package/dist/clark-log-forwarder.d.ts +15 -0
- package/dist/clark-log-forwarder.d.ts.map +1 -0
- package/dist/clark-log-forwarder.js +31 -0
- package/dist/clark-log-forwarder.js.map +1 -0
- package/dist/components-manager.js +1 -1
- package/dist/components-manager.js.map +1 -1
- package/dist/file-sync-vite-plugin.d.ts.map +1 -1
- package/dist/file-sync-vite-plugin.js +11 -0
- package/dist/file-sync-vite-plugin.js.map +1 -1
- package/dist/file-system-manager.d.ts.map +1 -1
- package/dist/file-system-manager.js +3 -3
- package/dist/file-system-manager.js.map +1 -1
- package/dist/socket-manager.d.ts +3 -0
- package/dist/socket-manager.d.ts.map +1 -1
- package/dist/socket-manager.js +23 -0
- package/dist/socket-manager.js.map +1 -1
- package/dist/util/logger.d.ts +5 -10
- package/dist/util/logger.d.ts.map +1 -1
- package/dist/util/logger.js +6 -7
- package/dist/util/logger.js.map +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +0 -2
- package/dist/util.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider fallback chain management for stream retry middleware.
|
|
3
|
+
*
|
|
4
|
+
* Manages the state and logic for cycling through provider/model combinations
|
|
5
|
+
* when stream errors occur. The chain order is:
|
|
6
|
+
* - If starting with opus: provider1/opus → provider2/opus → provider1/sonnet → provider2/sonnet
|
|
7
|
+
* - If starting with sonnet: provider1/sonnet → provider2/sonnet
|
|
8
|
+
*/
|
|
9
|
+
import type { Logger } from "../../../../../util/logger.js";
|
|
10
|
+
import type { Tool } from "../../../../agent/tools2/types.js";
|
|
11
|
+
import type { StreamTextOptions } from "../../middleware.js";
|
|
12
|
+
export type ProviderType = "vertex" | "bedrock";
|
|
13
|
+
export type CoreModelType = "claude-sonnet-4-5" | "claude-opus-4-5";
|
|
14
|
+
export interface FallbackAttempt {
|
|
15
|
+
provider: ProviderType;
|
|
16
|
+
coreModel: CoreModelType;
|
|
17
|
+
}
|
|
18
|
+
export interface FallbackConfig {
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
initialProvider?: ProviderType;
|
|
21
|
+
initialCoreModel?: CoreModelType;
|
|
22
|
+
stallTimeoutMs?: number;
|
|
23
|
+
retryOnStall?: boolean;
|
|
24
|
+
onFallback?: (from: FallbackAttempt, to: FallbackAttempt, reason: "error" | "stall" | "no_output") => void | Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
/** Mutable fallback state tracked across retries */
|
|
27
|
+
export interface FallbackState {
|
|
28
|
+
currentIndex: number;
|
|
29
|
+
chain: FallbackAttempt[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Builds the full fallback chain based on initial provider/model.
|
|
33
|
+
*
|
|
34
|
+
* Chain construction:
|
|
35
|
+
* - Provider order is determined by initialProvider (that provider first, then the other)
|
|
36
|
+
* - If using opus, try opus on all providers first, then sonnet on all providers
|
|
37
|
+
* - If using sonnet, each provider only gets sonnet
|
|
38
|
+
*/
|
|
39
|
+
export declare function buildFallbackChain(initialProvider: ProviderType, initialCoreModel: CoreModelType): FallbackAttempt[];
|
|
40
|
+
/**
|
|
41
|
+
* Creates initial fallback state from config.
|
|
42
|
+
* Returns null if fallback is not enabled.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createFallbackState(config: FallbackConfig | undefined): FallbackState | null;
|
|
45
|
+
/**
|
|
46
|
+
* Gets the current fallback attempt from state.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getCurrentFallback(state: FallbackState): FallbackAttempt;
|
|
49
|
+
/**
|
|
50
|
+
* Advances to the next provider/model in the fallback chain.
|
|
51
|
+
* If already at the end, stays on the last provider (for continued retries).
|
|
52
|
+
*/
|
|
53
|
+
export declare function advanceFallback(state: FallbackState, reason: "error" | "stall" | "no_output", config: FallbackConfig | undefined, logger: Logger): void;
|
|
54
|
+
/**
|
|
55
|
+
* Modifies stream options with current fallback state.
|
|
56
|
+
* Sets forceProvider and coreModel to explicitly tell the server which provider/model to use.
|
|
57
|
+
*
|
|
58
|
+
* On the first attempt (index 0), we don't force anything - let the server use its defaults.
|
|
59
|
+
* On retries (index > 0), we explicitly force the provider and model.
|
|
60
|
+
*/
|
|
61
|
+
export declare function applyFallbackToOptions<TOOLS extends Record<string, Tool>>(options: StreamTextOptions<TOOLS>, state: FallbackState, logger: Logger): StreamTextOptions<TOOLS>;
|
|
62
|
+
//# sourceMappingURL=fallback-chain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback-chain.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/llm/interaction/middlewares/utils/fallback-chain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;AAChD,MAAM,MAAM,aAAa,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,gBAAgB,CAAC,EAAE,aAAa,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,eAAe,EACrB,EAAE,EAAE,eAAe,EACnB,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,WAAW,KACpC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,eAAe,EAAE,YAAY,EAC7B,gBAAgB,EAAE,aAAa,GAC9B,eAAe,EAAE,CAwBnB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,GAAG,SAAS,GACjC,aAAa,GAAG,IAAI,CAYtB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,CAGxE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,WAAW,EACvC,MAAM,EAAE,cAAc,GAAG,SAAS,EAClC,MAAM,EAAE,MAAM,GACb,IAAI,CAoBN;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EACvE,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,EACjC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,GACb,iBAAiB,CAAC,KAAK,CAAC,CA0B1B"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider fallback chain management for stream retry middleware.
|
|
3
|
+
*
|
|
4
|
+
* Manages the state and logic for cycling through provider/model combinations
|
|
5
|
+
* when stream errors occur. The chain order is:
|
|
6
|
+
* - If starting with opus: provider1/opus → provider2/opus → provider1/sonnet → provider2/sonnet
|
|
7
|
+
* - If starting with sonnet: provider1/sonnet → provider2/sonnet
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Builds the full fallback chain based on initial provider/model.
|
|
11
|
+
*
|
|
12
|
+
* Chain construction:
|
|
13
|
+
* - Provider order is determined by initialProvider (that provider first, then the other)
|
|
14
|
+
* - If using opus, try opus on all providers first, then sonnet on all providers
|
|
15
|
+
* - If using sonnet, each provider only gets sonnet
|
|
16
|
+
*/
|
|
17
|
+
export function buildFallbackChain(initialProvider, initialCoreModel) {
|
|
18
|
+
const isOpus = initialCoreModel === "claude-opus-4-5";
|
|
19
|
+
const providerOrder = initialProvider === "bedrock"
|
|
20
|
+
? ["bedrock", "vertex"]
|
|
21
|
+
: ["vertex", "bedrock"];
|
|
22
|
+
const chain = [];
|
|
23
|
+
if (isOpus) {
|
|
24
|
+
// First try opus on all providers
|
|
25
|
+
for (const provider of providerOrder) {
|
|
26
|
+
chain.push({ provider, coreModel: "claude-opus-4-5" });
|
|
27
|
+
}
|
|
28
|
+
// Then try sonnet on all providers
|
|
29
|
+
for (const provider of providerOrder) {
|
|
30
|
+
chain.push({ provider, coreModel: "claude-sonnet-4-5" });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Sonnet only: try on all providers
|
|
35
|
+
for (const provider of providerOrder) {
|
|
36
|
+
chain.push({ provider, coreModel: "claude-sonnet-4-5" });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return chain;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Creates initial fallback state from config.
|
|
43
|
+
* Returns null if fallback is not enabled.
|
|
44
|
+
*/
|
|
45
|
+
export function createFallbackState(config) {
|
|
46
|
+
if (!config?.enabled) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
currentIndex: 0,
|
|
51
|
+
chain: buildFallbackChain(config.initialProvider ?? "vertex", config.initialCoreModel ?? "claude-sonnet-4-5"),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Gets the current fallback attempt from state.
|
|
56
|
+
*/
|
|
57
|
+
export function getCurrentFallback(state) {
|
|
58
|
+
const index = Math.min(state.currentIndex, state.chain.length - 1);
|
|
59
|
+
return state.chain[index];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Advances to the next provider/model in the fallback chain.
|
|
63
|
+
* If already at the end, stays on the last provider (for continued retries).
|
|
64
|
+
*/
|
|
65
|
+
export function advanceFallback(state, reason, config, logger) {
|
|
66
|
+
const currentIndex = Math.min(state.currentIndex, state.chain.length - 1);
|
|
67
|
+
const current = state.chain[currentIndex];
|
|
68
|
+
const nextIndex = Math.min(currentIndex + 1, state.chain.length - 1);
|
|
69
|
+
const next = state.chain[nextIndex];
|
|
70
|
+
const isAdvancing = nextIndex > currentIndex;
|
|
71
|
+
if (isAdvancing) {
|
|
72
|
+
logger.warn(`Switching provider: ${current.provider}/${current.coreModel} -> ${next.provider}/${next.coreModel} | reason=${reason}`);
|
|
73
|
+
void config?.onFallback?.(current, next, reason);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
logger.warn(`Retrying same provider (chain exhausted): ${current.provider}/${current.coreModel} | reason=${reason}`);
|
|
77
|
+
}
|
|
78
|
+
state.currentIndex = nextIndex;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Modifies stream options with current fallback state.
|
|
82
|
+
* Sets forceProvider and coreModel to explicitly tell the server which provider/model to use.
|
|
83
|
+
*
|
|
84
|
+
* On the first attempt (index 0), we don't force anything - let the server use its defaults.
|
|
85
|
+
* On retries (index > 0), we explicitly force the provider and model.
|
|
86
|
+
*/
|
|
87
|
+
export function applyFallbackToOptions(options, state, logger) {
|
|
88
|
+
const currentIndex = Math.min(state.currentIndex, state.chain.length - 1);
|
|
89
|
+
const current = state.chain[currentIndex];
|
|
90
|
+
if (!current) {
|
|
91
|
+
logger.error("No current fallback attempt found");
|
|
92
|
+
return options;
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
...options,
|
|
96
|
+
providerOptions: {
|
|
97
|
+
...options.providerOptions,
|
|
98
|
+
unified: {
|
|
99
|
+
...(options.providerOptions?.unified ||
|
|
100
|
+
{}),
|
|
101
|
+
// On retry (index > 0), explicitly force the provider and model
|
|
102
|
+
...(currentIndex > 0
|
|
103
|
+
? {
|
|
104
|
+
forceProvider: current.provider,
|
|
105
|
+
coreModel: current.coreModel,
|
|
106
|
+
}
|
|
107
|
+
: {}),
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=fallback-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback-chain.js","sourceRoot":"","sources":["../../../../../../src/ai-service/llm/interaction/middlewares/utils/fallback-chain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for retry middleware.
|
|
3
|
+
*
|
|
4
|
+
* Contains error wrapping, retry eligibility checking, and backoff logic.
|
|
5
|
+
*/
|
|
6
|
+
import { LLMProviderError } from "../../../error.js";
|
|
7
|
+
import type { Logger } from "../../../../../util/logger.js";
|
|
8
|
+
import type { BackoffStrategy } from "../../../../util/backoff-strategy.js";
|
|
9
|
+
/**
|
|
10
|
+
* Configuration for retry attempts.
|
|
11
|
+
*/
|
|
12
|
+
export interface RetryConfig {
|
|
13
|
+
maxRetries: number;
|
|
14
|
+
maxRetriesDisplay: string;
|
|
15
|
+
maxTotalRetryTimeMs: number | undefined;
|
|
16
|
+
overallStartTime: number;
|
|
17
|
+
backoffStrategy: BackoffStrategy;
|
|
18
|
+
isRetryable: (error: unknown) => boolean;
|
|
19
|
+
onRetry?: (error: unknown, attempt: number, delayMs: number, totalRetryTimeMs: number) => void | Promise<void>;
|
|
20
|
+
abortSignal?: AbortSignal;
|
|
21
|
+
logger: Logger;
|
|
22
|
+
errorContext: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Wraps an error in LLMProviderError if it isn't already.
|
|
26
|
+
* Also detects NoOutput errors and sets the appropriate type.
|
|
27
|
+
*/
|
|
28
|
+
export declare function wrapError(err: unknown, provider?: string): LLMProviderError;
|
|
29
|
+
/**
|
|
30
|
+
* Default function to determine if an error is retryable.
|
|
31
|
+
* Delegates to LLMProviderError.isRetryable if available.
|
|
32
|
+
*/
|
|
33
|
+
export declare function defaultIsRetryable(error: unknown): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Checks if retry is allowed and executes retry logic.
|
|
36
|
+
* Returns the delay in milliseconds if a retry should be attempted.
|
|
37
|
+
* Throws if no retry is possible.
|
|
38
|
+
*
|
|
39
|
+
* @param error - The error that triggered the retry
|
|
40
|
+
* @param attempt - The current attempt number (1-indexed)
|
|
41
|
+
* @param totalRetryTimeMs - Total time spent on retries so far
|
|
42
|
+
* @param config - Retry configuration
|
|
43
|
+
* @returns The delay before the retry (after waiting)
|
|
44
|
+
* @throws If retry is not allowed (non-retryable error, max retries, timeout)
|
|
45
|
+
*/
|
|
46
|
+
export declare function handleRetryAttempt(error: LLMProviderError, attempt: number, totalRetryTimeMs: number, config: RetryConfig): Promise<number>;
|
|
47
|
+
//# sourceMappingURL=retries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retries.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/llm/interaction/middlewares/utils/retries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IACzC,OAAO,CAAC,EAAE,CACR,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,KACrB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAqB3E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQ1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAuEjB"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for retry middleware.
|
|
3
|
+
*
|
|
4
|
+
* Contains error wrapping, retry eligibility checking, and backoff logic.
|
|
5
|
+
*/
|
|
6
|
+
import { getErrorMeta } from "../../../../../util/logger.js";
|
|
7
|
+
import { LLMProviderError, isNoOutputError } from "../../../error.js";
|
|
8
|
+
/**
|
|
9
|
+
* Wraps an error in LLMProviderError if it isn't already.
|
|
10
|
+
* Also detects NoOutput errors and sets the appropriate type.
|
|
11
|
+
*/
|
|
12
|
+
export function wrapError(err, provider) {
|
|
13
|
+
if (err instanceof LLMProviderError) {
|
|
14
|
+
return err;
|
|
15
|
+
}
|
|
16
|
+
// Check for NoOutput error and wrap with appropriate type
|
|
17
|
+
if (isNoOutputError(err)) {
|
|
18
|
+
return new LLMProviderError({
|
|
19
|
+
provider: provider,
|
|
20
|
+
message: err instanceof Error ? err.message : "No output generated by model",
|
|
21
|
+
type: "no_output",
|
|
22
|
+
isRetryable: true,
|
|
23
|
+
cause: err,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return new LLMProviderError({
|
|
27
|
+
provider: provider,
|
|
28
|
+
cause: err,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Default function to determine if an error is retryable.
|
|
33
|
+
* Delegates to LLMProviderError.isRetryable if available.
|
|
34
|
+
*/
|
|
35
|
+
export function defaultIsRetryable(error) {
|
|
36
|
+
if (LLMProviderError.isInstance(error)) {
|
|
37
|
+
return error.isRetryable;
|
|
38
|
+
}
|
|
39
|
+
// For thrown errors or unstructured errors, be permissive and retry
|
|
40
|
+
// These might be network issues, timeouts, or other transient problems
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Checks if retry is allowed and executes retry logic.
|
|
45
|
+
* Returns the delay in milliseconds if a retry should be attempted.
|
|
46
|
+
* Throws if no retry is possible.
|
|
47
|
+
*
|
|
48
|
+
* @param error - The error that triggered the retry
|
|
49
|
+
* @param attempt - The current attempt number (1-indexed)
|
|
50
|
+
* @param totalRetryTimeMs - Total time spent on retries so far
|
|
51
|
+
* @param config - Retry configuration
|
|
52
|
+
* @returns The delay before the retry (after waiting)
|
|
53
|
+
* @throws If retry is not allowed (non-retryable error, max retries, timeout)
|
|
54
|
+
*/
|
|
55
|
+
export async function handleRetryAttempt(error, attempt, totalRetryTimeMs, config) {
|
|
56
|
+
config.logger.debug(`totalRetryTimeMs: ${totalRetryTimeMs}`);
|
|
57
|
+
// Check abort signal
|
|
58
|
+
if (config.abortSignal?.aborted) {
|
|
59
|
+
const abortError = new LLMProviderError({
|
|
60
|
+
provider: error.provider,
|
|
61
|
+
message: "Request aborted",
|
|
62
|
+
type: "aborted",
|
|
63
|
+
isRetryable: false,
|
|
64
|
+
});
|
|
65
|
+
config.logger.info("Request aborted, stopping retry attempts");
|
|
66
|
+
throw abortError;
|
|
67
|
+
}
|
|
68
|
+
// Check retry conditions
|
|
69
|
+
const withinMaxRetries = attempt <= config.maxRetries;
|
|
70
|
+
const withinTimeLimit = !config.maxTotalRetryTimeMs ||
|
|
71
|
+
totalRetryTimeMs < config.maxTotalRetryTimeMs;
|
|
72
|
+
const errorIsRetryable = config.isRetryable(error);
|
|
73
|
+
const canRetry = errorIsRetryable && withinMaxRetries && withinTimeLimit;
|
|
74
|
+
if (!canRetry) {
|
|
75
|
+
if (errorIsRetryable) {
|
|
76
|
+
const reason = !withinMaxRetries
|
|
77
|
+
? `after ${config.maxRetriesDisplay} retries`
|
|
78
|
+
: `total retry time exceeded ${config.maxTotalRetryTimeMs}ms`;
|
|
79
|
+
config.logger.error(`Exceeded retry limits: ${reason}`, getErrorMeta(error));
|
|
80
|
+
throw new LLMProviderError({
|
|
81
|
+
provider: error.provider,
|
|
82
|
+
message: `${config.errorContext} ${reason}`,
|
|
83
|
+
type: "retries_exhausted",
|
|
84
|
+
isRetryable: false,
|
|
85
|
+
cause: error,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
config.logger.error("Non-retryable error encountered", getErrorMeta(error));
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
const delay = config.backoffStrategy.getNextDelay(attempt);
|
|
92
|
+
config.logger.warn(`${config.errorContext} (type: ${error.type}). Attempt ${attempt}/${config.maxRetriesDisplay}. Retrying in ${delay}ms... Error: ${JSON.stringify(error)}`);
|
|
93
|
+
if (config.onRetry) {
|
|
94
|
+
await config.onRetry(error, attempt, delay, totalRetryTimeMs);
|
|
95
|
+
}
|
|
96
|
+
// Wait before retry, but allow immediate cancellation via abort signal
|
|
97
|
+
await abortableDelay(delay, config.abortSignal);
|
|
98
|
+
// Check if aborted during delay
|
|
99
|
+
if (config.abortSignal?.aborted) {
|
|
100
|
+
const abortError = new LLMProviderError({
|
|
101
|
+
provider: error.provider,
|
|
102
|
+
message: "Request aborted during retry delay",
|
|
103
|
+
type: "aborted",
|
|
104
|
+
isRetryable: false,
|
|
105
|
+
});
|
|
106
|
+
config.logger.info("Request aborted during retry delay");
|
|
107
|
+
throw abortError;
|
|
108
|
+
}
|
|
109
|
+
return delay;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Returns a promise that resolves after the specified delay,
|
|
113
|
+
* but can be interrupted early by an abort signal.
|
|
114
|
+
*
|
|
115
|
+
* @param delayMs - The delay in milliseconds
|
|
116
|
+
* @param abortSignal - Optional abort signal to cancel the delay
|
|
117
|
+
*/
|
|
118
|
+
function abortableDelay(delayMs, abortSignal) {
|
|
119
|
+
return new Promise((resolve) => {
|
|
120
|
+
if (abortSignal?.aborted) {
|
|
121
|
+
resolve();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const timeoutId = setTimeout(resolve, delayMs);
|
|
125
|
+
abortSignal?.addEventListener("abort", () => {
|
|
126
|
+
clearTimeout(timeoutId);
|
|
127
|
+
resolve();
|
|
128
|
+
}, { once: true });
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=retries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retries.js","sourceRoot":"","sources":["../../../../../../src/ai-service/llm/interaction/middlewares/utils/retries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA0BtE;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,QAAiB;IACvD,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,0DAA0D;IAC1D,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,gBAAgB,CAAC;YAC1B,QAAQ,EAAE,QAAwC;YAClD,OAAO,EACL,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B;YACrE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,gBAAgB,CAAC;QAC1B,QAAQ,EAAE,QAAwC;QAClD,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,IAAI,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,WAAW,CAAC;IAC3B,CAAC;IAED,oEAAoE;IACpE,uEAAuE;IACvE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAuB,EACvB,OAAe,EACf,gBAAwB,EACxB,MAAmB;IAEnB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,gBAAgB,EAAE,CAAC,CAAC;IAE7D,qBAAqB;IACrB,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC;YACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,iBAAiB;YAC1B,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC/D,MAAM,UAAU,CAAC;IACnB,CAAC;IAED,yBAAyB;IACzB,MAAM,gBAAgB,GAAG,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC;IACtD,MAAM,eAAe,GACnB,CAAC,MAAM,CAAC,mBAAmB;QAC3B,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAChD,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAG,gBAAgB,IAAI,gBAAgB,IAAI,eAAe,CAAC;IAEzE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,CAAC,gBAAgB;gBAC9B,CAAC,CAAC,SAAS,MAAM,CAAC,iBAAiB,UAAU;gBAC7C,CAAC,CAAC,6BAA6B,MAAM,CAAC,mBAAmB,IAAI,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,KAAK,CACjB,0BAA0B,MAAM,EAAE,EAClC,YAAY,CAAC,KAAK,CAAC,CACpB,CAAC;YACF,MAAM,IAAI,gBAAgB,CAAC;gBACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,OAAO,EAAE,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,EAAE;gBAC3C,IAAI,EAAE,mBAAmB;gBACzB,WAAW,EAAE,KAAK;gBAClB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5E,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAE3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,GAAG,MAAM,CAAC,YAAY,WAAW,KAAK,CAAC,IAAI,cAAc,OAAO,IAAI,MAAM,CAAC,iBAAiB,iBAAiB,KAAK,gBAAgB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC1J,CAAC;IAEF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAChE,CAAC;IAED,uEAAuE;IACvE,MAAM,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAEhD,gCAAgC;IAChC,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC;YACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,oCAAoC;YAC7C,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACzD,MAAM,UAAU,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CACrB,OAAe,EACf,WAAyB;IAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE/C,WAAW,EAAE,gBAAgB,CAC3B,OAAO,EACP,GAAG,EAAE;YACH,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { LLMProviderError } from "../../../error.js";
|
|
2
|
+
export interface StallDetectorConfig {
|
|
3
|
+
stallTimeoutMs: number;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Result of waiting for the next chunk with stall detection.
|
|
8
|
+
*/
|
|
9
|
+
export type StallDetectorResult<T> = {
|
|
10
|
+
type: "chunk";
|
|
11
|
+
value: IteratorResult<T>;
|
|
12
|
+
} | {
|
|
13
|
+
type: "stall";
|
|
14
|
+
durationMs: number;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Waits for the next chunk from an iterator with a timeout.
|
|
18
|
+
* If the timeout expires before a chunk arrives, returns a stall result.
|
|
19
|
+
*
|
|
20
|
+
* @param iterator - The async iterator to get the next chunk from
|
|
21
|
+
* @param config - Stall detector configuration
|
|
22
|
+
* @param lastChunkTime - Timestamp of the last received chunk (for duration calculation)
|
|
23
|
+
* @returns Either the chunk result or a stall indication
|
|
24
|
+
*/
|
|
25
|
+
export declare function waitForNextChunkWithStallDetection<T>(iterator: AsyncIterator<T>, config: StallDetectorConfig, lastChunkTime: number): Promise<StallDetectorResult<T>>;
|
|
26
|
+
/**
|
|
27
|
+
* Creates an LLMProviderError for a stream stall.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createStallError(stallDurationMs: number): LLMProviderError;
|
|
30
|
+
//# sourceMappingURL=stall-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stall-detector.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/llm/interaction/middlewares/utils/stall-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAC7B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C;;;;;;;;GAQG;AACH,wBAAsB,kCAAkC,CAAC,CAAC,EACxD,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAC1B,MAAM,EAAE,mBAAmB,EAC3B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAmBjC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,gBAAgB,CAO1E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { LLMProviderError } from "../../../error.js";
|
|
2
|
+
/**
|
|
3
|
+
* Waits for the next chunk from an iterator with a timeout.
|
|
4
|
+
* If the timeout expires before a chunk arrives, returns a stall result.
|
|
5
|
+
*
|
|
6
|
+
* @param iterator - The async iterator to get the next chunk from
|
|
7
|
+
* @param config - Stall detector configuration
|
|
8
|
+
* @param lastChunkTime - Timestamp of the last received chunk (for duration calculation)
|
|
9
|
+
* @returns Either the chunk result or a stall indication
|
|
10
|
+
*/
|
|
11
|
+
export async function waitForNextChunkWithStallDetection(iterator, config, lastChunkTime) {
|
|
12
|
+
if (!config.enabled) {
|
|
13
|
+
// Stall detection disabled - just wait for the chunk
|
|
14
|
+
const result = await iterator.next();
|
|
15
|
+
return { type: "chunk", value: result };
|
|
16
|
+
}
|
|
17
|
+
const timeoutPromise = new Promise((resolve) => setTimeout(() => resolve("stall"), config.stallTimeoutMs));
|
|
18
|
+
const raceResult = await Promise.race([iterator.next(), timeoutPromise]);
|
|
19
|
+
if (raceResult === "stall") {
|
|
20
|
+
const stallDuration = Date.now() - lastChunkTime;
|
|
21
|
+
return { type: "stall", durationMs: stallDuration };
|
|
22
|
+
}
|
|
23
|
+
return { type: "chunk", value: raceResult };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Creates an LLMProviderError for a stream stall.
|
|
27
|
+
*/
|
|
28
|
+
export function createStallError(stallDurationMs) {
|
|
29
|
+
return new LLMProviderError({
|
|
30
|
+
provider: "unified",
|
|
31
|
+
message: `Stream stalled for ${stallDurationMs}ms`,
|
|
32
|
+
type: "stream_stall",
|
|
33
|
+
isRetryable: true,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=stall-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stall-detector.js","sourceRoot":"","sources":["../../../../../../src/ai-service/llm/interaction/middlewares/utils/stall-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAcrD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,QAA0B,EAC1B,MAA2B,EAC3B,aAAqB;IAErB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,qDAAqD;QACrD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE,CACtD,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC,CAC1D,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IAEzE,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;QACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAA+B,EAAE,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,eAAuB;IACtD,OAAO,IAAI,gBAAgB,CAAC;QAC1B,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,sBAAsB,eAAe,IAAI;QAClD,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,IAAI;KAClB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retrying async iterable stream for stream retry middleware.
|
|
3
|
+
*
|
|
4
|
+
* This module creates an AsyncIterableStream that automatically retries
|
|
5
|
+
* on consumption errors, with optional stall detection and provider fallback.
|
|
6
|
+
*/
|
|
7
|
+
import type { FallbackState, FallbackConfig } from "./fallback-chain.js";
|
|
8
|
+
import type { Logger } from "../../../../../util/logger.js";
|
|
9
|
+
import type { BackoffStrategy } from "../../../../util/backoff-strategy.js";
|
|
10
|
+
import type { AsyncIterableStream, TextStreamPart } from "ai";
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for creating a retrying async iterable.
|
|
13
|
+
*/
|
|
14
|
+
export interface RetryingStreamConfig {
|
|
15
|
+
maxRetries: number;
|
|
16
|
+
maxRetriesDisplay: string;
|
|
17
|
+
maxTotalRetryTimeMs: number | undefined;
|
|
18
|
+
overallStartTime: number;
|
|
19
|
+
backoffStrategy: BackoffStrategy;
|
|
20
|
+
isRetryable: (error: unknown) => boolean;
|
|
21
|
+
onRetry?: (error: unknown, attempt: number, delayMs: number, totalRetryTimeMs: number) => void | Promise<void>;
|
|
22
|
+
abortSignal?: AbortSignal;
|
|
23
|
+
logger: Logger;
|
|
24
|
+
fallbackState: FallbackState | null;
|
|
25
|
+
fallbackConfig: FallbackConfig | undefined;
|
|
26
|
+
stallTimeoutMs: number;
|
|
27
|
+
retryOnStall: boolean;
|
|
28
|
+
/** Called when stream completes successfully (after any retries) */
|
|
29
|
+
onStreamComplete?: () => void | Promise<void>;
|
|
30
|
+
/** Called when stream fails and all retries are exhausted */
|
|
31
|
+
onStreamFailed?: (error: unknown) => void | Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Creates an AsyncIterableStream that retries on consumption errors,
|
|
35
|
+
* with optional stall detection for fallback.
|
|
36
|
+
*
|
|
37
|
+
* @param getStream - Function to get a fresh stream for each attempt
|
|
38
|
+
* @param config - Retry and fallback configuration
|
|
39
|
+
* @returns An AsyncIterableStream that automatically retries on errors
|
|
40
|
+
*/
|
|
41
|
+
export declare function createRetryingAsyncIterable<T extends string | TextStreamPart<any>>(getStream: (isInitial: boolean, abortSignal?: AbortSignal) => Promise<AsyncIterableStream<T>>, config: RetryingStreamConfig): AsyncIterableStream<T>;
|
|
42
|
+
//# sourceMappingURL=streams.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../../../../../src/ai-service/llm/interaction/middlewares/utils/streams.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IACzC,OAAO,CAAC,EAAE,CACR,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,KACrB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IAEtB,oEAAoE;IACpE,gBAAgB,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C,6DAA6D;IAC7D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAqCD;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACzC,CAAC,SAAS,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,EAEtC,SAAS,EAAE,CACT,SAAS,EAAE,OAAO,EAClB,WAAW,CAAC,EAAE,WAAW,KACtB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EACpC,MAAM,EAAE,oBAAoB,GAC3B,mBAAmB,CAAC,CAAC,CAAC,CAkNxB"}
|