@astro-minimax/ai 0.9.0 → 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/README.md +108 -18
- package/dist/cache/global-cache.d.ts +6 -2
- package/dist/cache/global-cache.d.ts.map +1 -1
- package/dist/cache/global-cache.js +24 -9
- package/dist/cache/index.d.ts +7 -6
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +12 -4
- package/dist/cache/injection-cache.d.ts +36 -0
- package/dist/cache/injection-cache.d.ts.map +1 -0
- package/dist/cache/injection-cache.js +90 -0
- package/dist/cache/kv-adapter.d.ts.map +1 -1
- package/dist/cache/kv-adapter.js +2 -1
- package/dist/cache/memory-adapter.d.ts.map +1 -1
- package/dist/cache/memory-adapter.js +2 -1
- package/dist/cache/response-cache.d.ts +10 -5
- package/dist/cache/response-cache.d.ts.map +1 -1
- package/dist/cache/response-cache.js +18 -6
- package/dist/components/AIChatContainer.d.ts +2 -2
- package/dist/components/AIChatContainer.d.ts.map +1 -1
- package/dist/components/AIChatContainer.js +8 -920
- package/dist/components/ChatInput.d.ts +15 -0
- package/dist/components/ChatInput.d.ts.map +1 -0
- package/dist/components/ChatInput.js +72 -0
- package/dist/components/ChatPanel.d.ts +1 -1
- package/dist/components/ChatPanel.d.ts.map +1 -1
- package/dist/components/ChatPanel.js +210 -672
- package/dist/components/CodeBlock.d.ts +31 -0
- package/dist/components/CodeBlock.d.ts.map +1 -0
- package/dist/components/CodeBlock.js +143 -0
- package/dist/components/MarkmapBlock.d.ts +4 -0
- package/dist/components/MarkmapBlock.d.ts.map +1 -0
- package/dist/components/MarkmapBlock.js +180 -0
- package/dist/components/MermaidBlock.d.ts +4 -0
- package/dist/components/MermaidBlock.d.ts.map +1 -0
- package/dist/components/MermaidBlock.js +193 -0
- package/dist/components/MessageBubble.d.ts +21 -0
- package/dist/components/MessageBubble.d.ts.map +1 -0
- package/dist/components/MessageBubble.js +233 -0
- package/dist/components/ReasoningBlock.d.ts +6 -0
- package/dist/components/ReasoningBlock.d.ts.map +1 -0
- package/dist/components/ReasoningBlock.js +11 -0
- package/dist/components/RichText.d.ts +41 -0
- package/dist/components/RichText.d.ts.map +1 -0
- package/dist/components/RichText.js +202 -0
- package/dist/components/VizShared.d.ts +57 -0
- package/dist/components/VizShared.d.ts.map +1 -0
- package/dist/components/VizShared.js +233 -0
- package/dist/components/tool-auto-continue.d.ts +5 -0
- package/dist/components/tool-auto-continue.d.ts.map +1 -0
- package/dist/components/tool-auto-continue.js +33 -0
- package/dist/constants.d.ts +61 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +72 -0
- package/dist/data/index.d.ts +4 -3
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +4 -10
- package/dist/data/knowledge-types.d.ts +8 -0
- package/dist/data/knowledge-types.d.ts.map +1 -0
- package/dist/data/knowledge-types.js +14 -0
- package/dist/data/metadata-loader.d.ts +4 -28
- package/dist/data/metadata-loader.d.ts.map +1 -1
- package/dist/data/metadata-loader.js +11 -34
- package/dist/data/types.d.ts +17 -2
- package/dist/data/types.d.ts.map +1 -1
- package/dist/extensions/index.d.ts +5 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +24 -0
- package/dist/extensions/injector.d.ts +14 -0
- package/dist/extensions/injector.d.ts.map +1 -0
- package/dist/extensions/injector.js +146 -0
- package/dist/extensions/loader.d.ts +5 -0
- package/dist/extensions/loader.d.ts.map +1 -0
- package/dist/extensions/loader.js +45 -0
- package/dist/extensions/registry.d.ts +4 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +144 -0
- package/dist/extensions/types.d.ts +126 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +0 -0
- package/dist/fact-registry/prompt-injector.d.ts +1 -1
- package/dist/fact-registry/prompt-injector.d.ts.map +1 -1
- package/dist/fact-registry/prompt-injector.js +2 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/intelligence/citation-guard.d.ts +2 -13
- package/dist/intelligence/citation-guard.d.ts.map +1 -1
- package/dist/intelligence/citation-guard.js +52 -23
- package/dist/intelligence/evidence-analysis.d.ts +24 -16
- package/dist/intelligence/evidence-analysis.d.ts.map +1 -1
- package/dist/intelligence/evidence-analysis.js +118 -20
- package/dist/intelligence/evidence-budget.d.ts +13 -0
- package/dist/intelligence/evidence-budget.d.ts.map +1 -0
- package/dist/intelligence/evidence-budget.js +49 -0
- package/dist/intelligence/index.d.ts +10 -4
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/index.js +27 -3
- package/dist/intelligence/keyword-extract.d.ts +1 -1
- package/dist/intelligence/keyword-extract.d.ts.map +1 -1
- package/dist/intelligence/keyword-extract.js +5 -9
- package/dist/intelligence/request-interpretation.d.ts +40 -0
- package/dist/intelligence/request-interpretation.d.ts.map +1 -0
- package/dist/intelligence/request-interpretation.js +71 -0
- package/dist/intelligence/response-templates.d.ts +1 -0
- package/dist/intelligence/response-templates.d.ts.map +1 -1
- package/dist/intelligence/response-templates.js +13 -0
- package/dist/prompt/dynamic-layer.d.ts +1 -5
- package/dist/prompt/dynamic-layer.d.ts.map +1 -1
- package/dist/prompt/dynamic-layer.js +145 -9
- package/dist/prompt/prompt-builder.d.ts +1 -1
- package/dist/prompt/prompt-builder.d.ts.map +1 -1
- package/dist/prompt/prompt-builder.js +5 -1
- package/dist/prompt/semi-static-layer.d.ts +1 -1
- package/dist/prompt/semi-static-layer.d.ts.map +1 -1
- package/dist/prompt/semi-static-layer.js +22 -12
- package/dist/prompt/static-layer.d.ts.map +1 -1
- package/dist/prompt/static-layer.js +37 -4
- package/dist/prompt/types.d.ts +9 -4
- package/dist/prompt/types.d.ts.map +1 -1
- package/dist/provider-manager/base.d.ts +5 -1
- package/dist/provider-manager/base.d.ts.map +1 -1
- package/dist/provider-manager/base.js +22 -2
- package/dist/provider-manager/config.d.ts.map +1 -1
- package/dist/provider-manager/config.js +3 -2
- package/dist/provider-manager/index.d.ts +1 -1
- package/dist/provider-manager/index.d.ts.map +1 -1
- package/dist/provider-manager/index.js +1 -2
- package/dist/provider-manager/manager.d.ts +10 -1
- package/dist/provider-manager/manager.d.ts.map +1 -1
- package/dist/provider-manager/manager.js +26 -10
- package/dist/provider-manager/openai.d.ts +2 -2
- package/dist/provider-manager/openai.d.ts.map +1 -1
- package/dist/provider-manager/openai.js +19 -4
- package/dist/provider-manager/types.d.ts +18 -38
- package/dist/provider-manager/types.d.ts.map +1 -1
- package/dist/provider-manager/workers.d.ts +2 -2
- package/dist/provider-manager/workers.d.ts.map +1 -1
- package/dist/provider-manager/workers.js +15 -4
- package/dist/query/followup.d.ts +7 -0
- package/dist/query/followup.d.ts.map +1 -0
- package/dist/query/followup.js +46 -0
- package/dist/query/intent.d.ts +6 -0
- package/dist/query/intent.d.ts.map +1 -0
- package/dist/query/intent.js +137 -0
- package/dist/query/types.d.ts +8 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +0 -0
- package/dist/search/hybrid-search.d.ts +111 -0
- package/dist/search/hybrid-search.d.ts.map +1 -0
- package/dist/search/hybrid-search.js +326 -0
- package/dist/search/index.d.ts +11 -9
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +46 -10
- package/dist/search/scoring.d.ts +18 -0
- package/dist/search/scoring.d.ts.map +1 -0
- package/dist/search/{search-utils.js → scoring.js} +14 -27
- package/dist/search/search-api.d.ts +16 -1
- package/dist/search/search-api.d.ts.map +1 -1
- package/dist/search/search-api.js +118 -15
- package/dist/search/search-index.d.ts +2 -2
- package/dist/search/search-index.d.ts.map +1 -1
- package/dist/search/search-index.js +4 -2
- package/dist/search/session-cache.d.ts +4 -10
- package/dist/search/session-cache.d.ts.map +1 -1
- package/dist/search/session-cache.js +12 -45
- package/dist/search/types.d.ts +28 -0
- package/dist/search/types.d.ts.map +1 -1
- package/dist/search/vector-reranker.d.ts +3 -3
- package/dist/search/vector-reranker.d.ts.map +1 -1
- package/dist/search/vector-reranker.js +14 -2
- package/dist/server/chat-handler.d.ts +86 -1
- package/dist/server/chat-handler.d.ts.map +1 -1
- package/dist/server/chat-handler.js +835 -401
- package/dist/server/chat-message-utils.d.ts +6 -0
- package/dist/server/chat-message-utils.d.ts.map +1 -0
- package/dist/server/chat-message-utils.js +40 -0
- package/dist/server/chat-utils.d.ts +30 -0
- package/dist/server/chat-utils.d.ts.map +1 -0
- package/dist/server/chat-utils.js +88 -0
- package/dist/server/dev-server.js +238 -101
- package/dist/server/env-config.d.ts +22 -0
- package/dist/server/env-config.d.ts.map +1 -0
- package/dist/server/env-config.js +25 -0
- package/dist/server/errors.d.ts +1 -0
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/errors.js +14 -7
- package/dist/server/index.d.ts +2 -4
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -25
- package/dist/server/metadata-init.d.ts +10 -5
- package/dist/server/metadata-init.d.ts.map +1 -1
- package/dist/server/metadata-init.js +78 -34
- package/dist/server/notify.d.ts +12 -11
- package/dist/server/notify.d.ts.map +1 -1
- package/dist/server/notify.js +46 -48
- package/dist/server/prompt-runtime.d.ts +60 -0
- package/dist/server/prompt-runtime.d.ts.map +1 -0
- package/dist/server/prompt-runtime.js +284 -0
- package/dist/server/stream-helpers.d.ts +30 -16
- package/dist/server/stream-helpers.d.ts.map +1 -1
- package/dist/server/stream-helpers.js +152 -15
- package/dist/server/types.d.ts +47 -12
- package/dist/server/types.d.ts.map +1 -1
- package/dist/structured-output/generator.d.ts +6 -0
- package/dist/structured-output/generator.d.ts.map +1 -0
- package/dist/structured-output/generator.js +164 -0
- package/dist/structured-output/index.d.ts +4 -0
- package/dist/structured-output/index.d.ts.map +1 -0
- package/dist/structured-output/index.js +6 -0
- package/dist/structured-output/schemas/evidence.d.ts +88 -0
- package/dist/structured-output/schemas/evidence.d.ts.map +1 -0
- package/dist/structured-output/schemas/evidence.js +65 -0
- package/dist/structured-output/types.d.ts +69 -0
- package/dist/structured-output/types.d.ts.map +1 -0
- package/dist/structured-output/types.js +0 -0
- package/dist/tools/action-tools.d.ts +63 -0
- package/dist/tools/action-tools.d.ts.map +1 -0
- package/dist/tools/action-tools.js +158 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +30 -0
- package/dist/utils/i18n.d.ts +1 -1
- package/dist/utils/i18n.d.ts.map +1 -1
- package/dist/utils/i18n.js +1 -1
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +36 -0
- package/dist/utils/text.d.ts +11 -0
- package/dist/utils/text.d.ts.map +1 -0
- package/dist/utils/text.js +87 -0
- package/dist/utils/url.d.ts +19 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +13 -0
- package/package.json +46 -12
- package/dist/intelligence/intent-detect.d.ts +0 -40
- package/dist/intelligence/intent-detect.d.ts.map +0 -1
- package/dist/intelligence/intent-detect.js +0 -93
- package/dist/providers/index.d.ts +0 -2
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -5
- package/dist/search/search-utils.d.ts +0 -47
- package/dist/search/search-utils.d.ts.map +0 -1
- package/dist/stream/index.d.ts +0 -3
- package/dist/stream/index.d.ts.map +0 -1
- package/dist/stream/index.js +0 -8
- package/dist/stream/mock-stream.d.ts +0 -12
- package/dist/stream/mock-stream.d.ts.map +0 -1
- package/dist/stream/mock-stream.js +0 -26
- package/dist/stream/response.d.ts +0 -10
- package/dist/stream/response.d.ts.map +0 -1
- package/dist/stream/response.js +0 -21
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ProviderAdapter, ProviderManagerEnv, ProviderManagerOptions, ProviderStatus, StreamTextOptions, StreamTextResult } from './types.js';
|
|
2
|
+
import { MockAdapter } from './mock.js';
|
|
2
3
|
export declare class ProviderManager {
|
|
3
4
|
private providers;
|
|
4
5
|
private mockAdapter;
|
|
@@ -12,7 +13,15 @@ export declare class ProviderManager {
|
|
|
12
13
|
hasProviders(): boolean;
|
|
13
14
|
getProviderCount(): number;
|
|
14
15
|
getAvailableAdapter(): Promise<ProviderAdapter | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Returns all available adapters in priority order.
|
|
18
|
+
* Used for implementing multi-provider failover in streaming contexts.
|
|
19
|
+
*/
|
|
20
|
+
getAvailableAdapters(): Promise<ProviderAdapter[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Returns the mock adapter for fallback scenarios.
|
|
23
|
+
*/
|
|
24
|
+
getMockAdapter(): MockAdapter;
|
|
15
25
|
}
|
|
16
26
|
export declare function getProviderManager(env: ProviderManagerEnv, options?: ProviderManagerOptions): ProviderManager;
|
|
17
|
-
export declare function resetProviderManager(): void;
|
|
18
27
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/provider-manager/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEf,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAGjB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/provider-manager/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEf,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,OAAO,CAA0L;gBAE7L,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,sBAAsB;IAcrE,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,aAAa;IAWf,oBAAoB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IASvD,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2CvE,iBAAiB,IAAI,cAAc,EAAE;IAWrC,YAAY,IAAI,OAAO;IAIvB,gBAAgB,IAAI,MAAM;IAIpB,mBAAmB,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAI5D;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAUxD;;OAEG;IACH,cAAc,IAAI,WAAW;CAG9B;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,kBAAkB,EACvB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,eAAe,CAEjB"}
|
|
@@ -60,11 +60,16 @@ class ProviderManager {
|
|
|
60
60
|
let lastProviderId = null;
|
|
61
61
|
let lastError = null;
|
|
62
62
|
for (const provider of this.providers) {
|
|
63
|
+
const wasInRecovery = provider.isInRecovery?.() ?? false;
|
|
63
64
|
const isAvailable = await provider.isAvailable();
|
|
64
65
|
if (!isAvailable) continue;
|
|
65
66
|
try {
|
|
66
67
|
const result = await provider.streamText(options);
|
|
67
68
|
provider.recordSuccess();
|
|
69
|
+
if (wasInRecovery) {
|
|
70
|
+
provider.markAsRecovered?.();
|
|
71
|
+
this.options.onHealthChange?.(provider.id, true);
|
|
72
|
+
}
|
|
68
73
|
if (lastProviderId && lastProviderId !== provider.id) {
|
|
69
74
|
this.options.onProviderSwitch?.(lastProviderId, provider.id, "fallback success");
|
|
70
75
|
}
|
|
@@ -104,19 +109,30 @@ class ProviderManager {
|
|
|
104
109
|
async getAvailableAdapter() {
|
|
105
110
|
return this.getAvailableProvider();
|
|
106
111
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
+
/**
|
|
113
|
+
* Returns all available adapters in priority order.
|
|
114
|
+
* Used for implementing multi-provider failover in streaming contexts.
|
|
115
|
+
*/
|
|
116
|
+
async getAvailableAdapters() {
|
|
117
|
+
const available = [];
|
|
118
|
+
for (const provider of this.providers) {
|
|
119
|
+
if (await provider.isAvailable()) {
|
|
120
|
+
available.push(provider);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return available;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Returns the mock adapter for fallback scenarios.
|
|
127
|
+
*/
|
|
128
|
+
getMockAdapter() {
|
|
129
|
+
return this.mockAdapter;
|
|
112
130
|
}
|
|
113
|
-
return managerInstance;
|
|
114
131
|
}
|
|
115
|
-
function
|
|
116
|
-
|
|
132
|
+
function getProviderManager(env, options) {
|
|
133
|
+
return new ProviderManager(env, options);
|
|
117
134
|
}
|
|
118
135
|
export {
|
|
119
136
|
ProviderManager,
|
|
120
|
-
getProviderManager
|
|
121
|
-
resetProviderManager
|
|
137
|
+
getProviderManager
|
|
122
138
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { OpenAIProviderConfig, StreamTextOptions, StreamTextResult } from
|
|
2
|
-
import { BaseProviderAdapter } from
|
|
1
|
+
import type { OpenAIProviderConfig, StreamTextOptions, StreamTextResult } from "./types.js";
|
|
2
|
+
import { BaseProviderAdapter } from "./base.js";
|
|
3
3
|
export declare class OpenAIAdapter extends BaseProviderAdapter {
|
|
4
4
|
readonly id: string;
|
|
5
5
|
readonly type: "openai";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/provider-manager/openai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/provider-manager/openai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AA0DhD,qBAAa,aAAc,SAAQ,mBAAmB;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,QAAQ,CAA4C;IAC5D,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,oBAAoB;IAuBlC,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoDvE,SAAS,IAAI,oBAAoB;IAIjC,WAAW,IAAI;QAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE;CAGzD"}
|
|
@@ -14,14 +14,19 @@ async function setupGlobalProxy() {
|
|
|
14
14
|
try {
|
|
15
15
|
const undici = await import("undici");
|
|
16
16
|
if (typeof undici.setGlobalDispatcher !== "function" || typeof undici.ProxyAgent !== "function") {
|
|
17
|
-
console.log(
|
|
17
|
+
console.log(
|
|
18
|
+
"[OpenAIAdapter] undici APIs not available, skipping proxy setup (likely Edge Runtime)"
|
|
19
|
+
);
|
|
18
20
|
return;
|
|
19
21
|
}
|
|
20
22
|
undici.setGlobalDispatcher(new undici.ProxyAgent(proxyUrl));
|
|
21
23
|
console.log("[OpenAIAdapter] Global proxy dispatcher set:", proxyUrl);
|
|
22
24
|
proxyInitialized = true;
|
|
23
25
|
} catch (e) {
|
|
24
|
-
console.log(
|
|
26
|
+
console.log(
|
|
27
|
+
"[OpenAIAdapter] Proxy setup skipped:",
|
|
28
|
+
e instanceof Error ? e.message : String(e)
|
|
29
|
+
);
|
|
25
30
|
}
|
|
26
31
|
}
|
|
27
32
|
let proxySetupPromise = null;
|
|
@@ -43,7 +48,7 @@ class OpenAIAdapter extends BaseProviderAdapter {
|
|
|
43
48
|
config;
|
|
44
49
|
constructor(config) {
|
|
45
50
|
super({
|
|
46
|
-
unhealthyThreshold: config.
|
|
51
|
+
unhealthyThreshold: config.unhealthyThreshold ?? 3
|
|
47
52
|
});
|
|
48
53
|
this.id = config.id;
|
|
49
54
|
this.weight = config.weight ?? 100;
|
|
@@ -63,7 +68,16 @@ class OpenAIAdapter extends BaseProviderAdapter {
|
|
|
63
68
|
}
|
|
64
69
|
async streamText(options) {
|
|
65
70
|
await ensureProxySetup();
|
|
66
|
-
const {
|
|
71
|
+
const {
|
|
72
|
+
system,
|
|
73
|
+
messages,
|
|
74
|
+
temperature = 0.7,
|
|
75
|
+
maxOutputTokens,
|
|
76
|
+
topP,
|
|
77
|
+
abortSignal,
|
|
78
|
+
onError,
|
|
79
|
+
tools
|
|
80
|
+
} = options;
|
|
67
81
|
const abortController = new AbortController();
|
|
68
82
|
const timeoutId = setTimeout(() => abortController.abort(), this.timeout);
|
|
69
83
|
if (abortSignal) {
|
|
@@ -77,6 +91,7 @@ class OpenAIAdapter extends BaseProviderAdapter {
|
|
|
77
91
|
temperature,
|
|
78
92
|
maxOutputTokens,
|
|
79
93
|
topP,
|
|
94
|
+
tools,
|
|
80
95
|
abortSignal: abortController.signal,
|
|
81
96
|
onError: ({ error }) => {
|
|
82
97
|
onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
@@ -3,28 +3,24 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Supports multiple provider types with priority-based fallback.
|
|
5
5
|
*/
|
|
6
|
-
import type { UIMessage } from
|
|
6
|
+
import type { UIMessage, ToolSet } from "ai";
|
|
7
7
|
/**
|
|
8
8
|
* Base configuration shared by all provider types.
|
|
9
9
|
*/
|
|
10
10
|
export interface BaseProviderConfig {
|
|
11
|
-
/** Unique identifier for this provider instance */
|
|
12
11
|
id: string;
|
|
13
|
-
|
|
14
|
-
type: 'openai' | 'workers';
|
|
15
|
-
/** Priority weight (higher = more preferred). Default: 100 */
|
|
12
|
+
type: "openai" | "workers";
|
|
16
13
|
weight?: number;
|
|
17
|
-
/** Default model for chat */
|
|
18
14
|
model: string;
|
|
19
|
-
/** Model for keyword extraction (optional, defaults to model) */
|
|
20
15
|
keywordModel?: string;
|
|
21
|
-
/** Model for evidence analysis (optional, defaults to keywordModel) */
|
|
22
16
|
evidenceModel?: string;
|
|
23
|
-
/** Request timeout in milliseconds. Default: 30000 */
|
|
24
17
|
timeout?: number;
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Number of consecutive failures before marking provider unhealthy.
|
|
20
|
+
* Default: 3. Note: This is NOT retry count - provider will be skipped
|
|
21
|
+
* after this many failures, not retried.
|
|
22
|
+
*/
|
|
23
|
+
unhealthyThreshold?: number;
|
|
28
24
|
enabled?: boolean;
|
|
29
25
|
}
|
|
30
26
|
/**
|
|
@@ -32,7 +28,7 @@ export interface BaseProviderConfig {
|
|
|
32
28
|
* Supports DeepSeek, Moonshot, Qwen, OpenAI, and any OpenAI-compatible API.
|
|
33
29
|
*/
|
|
34
30
|
export interface OpenAIProviderConfig extends BaseProviderConfig {
|
|
35
|
-
type:
|
|
31
|
+
type: "openai";
|
|
36
32
|
/** API base URL (e.g., https://api.deepseek.com/v1) */
|
|
37
33
|
baseURL: string;
|
|
38
34
|
/** API key */
|
|
@@ -43,7 +39,7 @@ export interface OpenAIProviderConfig extends BaseProviderConfig {
|
|
|
43
39
|
* Uses AI binding directly from the Cloudflare environment.
|
|
44
40
|
*/
|
|
45
41
|
export interface WorkersAIProviderConfig extends BaseProviderConfig {
|
|
46
|
-
type:
|
|
42
|
+
type: "workers";
|
|
47
43
|
/** AI binding name in Cloudflare environment. Default: 'minimaxAI' */
|
|
48
44
|
bindingName: string;
|
|
49
45
|
}
|
|
@@ -95,7 +91,7 @@ export interface ProviderStatus {
|
|
|
95
91
|
/** Provider ID */
|
|
96
92
|
id: string;
|
|
97
93
|
/** Provider type */
|
|
98
|
-
type:
|
|
94
|
+
type: string;
|
|
99
95
|
/** Priority weight */
|
|
100
96
|
weight: number;
|
|
101
97
|
/** Whether the provider is enabled */
|
|
@@ -127,6 +123,8 @@ export interface StreamTextOptions {
|
|
|
127
123
|
userQuestion?: string;
|
|
128
124
|
/** Callback for errors during streaming */
|
|
129
125
|
onError?: (error: Error) => void;
|
|
126
|
+
/** Tools for function calling */
|
|
127
|
+
tools?: ToolSet;
|
|
130
128
|
}
|
|
131
129
|
/**
|
|
132
130
|
* Result from streamText operation.
|
|
@@ -175,39 +173,21 @@ export interface ProviderManagerOptions {
|
|
|
175
173
|
* All provider types must implement this interface.
|
|
176
174
|
*/
|
|
177
175
|
export interface ProviderAdapter {
|
|
178
|
-
/** Provider identifier */
|
|
179
176
|
readonly id: string;
|
|
180
|
-
|
|
181
|
-
readonly type: 'openai' | 'workers' | 'mock';
|
|
182
|
-
/** Priority weight */
|
|
177
|
+
readonly type: string;
|
|
183
178
|
readonly weight: number;
|
|
184
|
-
/** Default model */
|
|
185
179
|
readonly model: string;
|
|
186
|
-
/** Model for keyword extraction */
|
|
187
180
|
readonly keywordModel: string;
|
|
188
|
-
/** Model for evidence analysis */
|
|
189
181
|
readonly evidenceModel: string;
|
|
190
|
-
/** Request timeout in ms */
|
|
191
182
|
readonly timeout: number;
|
|
192
|
-
/**
|
|
193
|
-
* Check if this provider is currently available and healthy.
|
|
194
|
-
*/
|
|
195
183
|
isAvailable(): Promise<boolean>;
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
184
|
+
isInRecovery?(): boolean;
|
|
185
|
+
canAttemptRecovery?(): boolean;
|
|
186
|
+
markAsRecovered?(): void;
|
|
187
|
+
resetHealth?(): void;
|
|
199
188
|
streamText(options: StreamTextOptions): Promise<StreamTextResult>;
|
|
200
|
-
/**
|
|
201
|
-
* Get current health status.
|
|
202
|
-
*/
|
|
203
189
|
getHealth(): ProviderHealth;
|
|
204
|
-
/**
|
|
205
|
-
* Record a successful request.
|
|
206
|
-
*/
|
|
207
190
|
recordSuccess(): void;
|
|
208
|
-
/**
|
|
209
|
-
* Record a failed request.
|
|
210
|
-
*/
|
|
211
191
|
recordFailure(error: Error): void;
|
|
212
192
|
getProvider(): {
|
|
213
193
|
chatModel: (model: string) => unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/provider-manager/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/provider-manager/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { WorkersAIProviderConfig, StreamTextOptions, StreamTextResult, ProviderManagerEnv } from
|
|
2
|
-
import { BaseProviderAdapter } from
|
|
1
|
+
import type { WorkersAIProviderConfig, StreamTextOptions, StreamTextResult, ProviderManagerEnv } from "./types.js";
|
|
2
|
+
import { BaseProviderAdapter } from "./base.js";
|
|
3
3
|
export declare class WorkersAIAdapter extends BaseProviderAdapter {
|
|
4
4
|
readonly id: string;
|
|
5
5
|
readonly type: "workers";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../src/provider-manager/workers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workers.d.ts","sourceRoot":"","sources":["../../src/provider-manager/workers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,EAAE,uBAAuB,EAAE,GAAG,EAAE,kBAAkB;IAwB9D,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoDvE,SAAS,IAAI,uBAAuB;IAIpC,WAAW,IAAI;QAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;KAAE;CAMzD"}
|
|
@@ -9,12 +9,11 @@ class WorkersAIAdapter extends BaseProviderAdapter {
|
|
|
9
9
|
keywordModel;
|
|
10
10
|
evidenceModel;
|
|
11
11
|
timeout;
|
|
12
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
12
|
provider;
|
|
14
13
|
config;
|
|
15
14
|
constructor(config, env) {
|
|
16
15
|
super({
|
|
17
|
-
unhealthyThreshold: config.
|
|
16
|
+
unhealthyThreshold: config.unhealthyThreshold ?? 3
|
|
18
17
|
});
|
|
19
18
|
this.id = config.id;
|
|
20
19
|
this.weight = config.weight ?? 90;
|
|
@@ -25,12 +24,23 @@ class WorkersAIAdapter extends BaseProviderAdapter {
|
|
|
25
24
|
this.config = config;
|
|
26
25
|
const binding = env[config.bindingName];
|
|
27
26
|
if (!binding) {
|
|
28
|
-
throw new Error(
|
|
27
|
+
throw new Error(
|
|
28
|
+
`Workers AI binding '${config.bindingName}' not found in environment`
|
|
29
|
+
);
|
|
29
30
|
}
|
|
30
31
|
this.provider = createWorkersAI({ binding });
|
|
31
32
|
}
|
|
32
33
|
async streamText(options) {
|
|
33
|
-
const {
|
|
34
|
+
const {
|
|
35
|
+
system,
|
|
36
|
+
messages,
|
|
37
|
+
temperature = 0.7,
|
|
38
|
+
maxOutputTokens,
|
|
39
|
+
topP,
|
|
40
|
+
abortSignal,
|
|
41
|
+
onError,
|
|
42
|
+
tools
|
|
43
|
+
} = options;
|
|
34
44
|
const abortController = new AbortController();
|
|
35
45
|
const timeoutId = setTimeout(() => abortController.abort(), this.timeout);
|
|
36
46
|
if (abortSignal) {
|
|
@@ -45,6 +55,7 @@ class WorkersAIAdapter extends BaseProviderAdapter {
|
|
|
45
55
|
temperature,
|
|
46
56
|
maxOutputTokens,
|
|
47
57
|
topP,
|
|
58
|
+
tools,
|
|
48
59
|
abortSignal: abortController.signal,
|
|
49
60
|
onError: ({ error }) => {
|
|
50
61
|
onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SearchContextReuseParams } from "./types.js";
|
|
2
|
+
export declare function isLikelyFollowUp(message: string): boolean;
|
|
3
|
+
export declare function hasNewSignificantTokens(currentQuery: string, cachedQuery: string): boolean;
|
|
4
|
+
export declare function hasQueryOverlap(currentQuery: string, cachedQuery: string): boolean;
|
|
5
|
+
export declare function shouldReuseSearchContext(params: SearchContextReuseParams): boolean;
|
|
6
|
+
export declare function buildLocalSearchQuery(latestText: string): string;
|
|
7
|
+
//# sourceMappingURL=followup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"followup.d.ts","sourceRoot":"","sources":["../../src/query/followup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAI3D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAUzD;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAOT;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAKT;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAST;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { tokenize, normalizeText } from "../utils/text.js";
|
|
2
|
+
import { CACHE } from "../constants.js";
|
|
3
|
+
const MAX_FOLLOW_UP_LENGTH = 48;
|
|
4
|
+
function isLikelyFollowUp(message) {
|
|
5
|
+
const text = message.trim();
|
|
6
|
+
if (!text || text.length > MAX_FOLLOW_UP_LENGTH) return false;
|
|
7
|
+
const hasTerminalPunctuation = /[??!!。.…]$/.test(text);
|
|
8
|
+
const wordCount = text.split(/\s+/).filter(Boolean).length;
|
|
9
|
+
if (text.length <= 16) return true;
|
|
10
|
+
if (!/\s/.test(text) && text.length <= 24) return true;
|
|
11
|
+
return hasTerminalPunctuation && wordCount <= 6 && text.length <= 36;
|
|
12
|
+
}
|
|
13
|
+
function hasNewSignificantTokens(currentQuery, cachedQuery) {
|
|
14
|
+
const currentTokens = new Set(tokenize(currentQuery));
|
|
15
|
+
const cachedTokens = new Set(tokenize(cachedQuery));
|
|
16
|
+
const newTokens = [...currentTokens].filter(
|
|
17
|
+
(t) => !cachedTokens.has(t) && t.length >= 2
|
|
18
|
+
);
|
|
19
|
+
return newTokens.length > 0;
|
|
20
|
+
}
|
|
21
|
+
function hasQueryOverlap(currentQuery, cachedQuery) {
|
|
22
|
+
const currentTokens = tokenize(currentQuery);
|
|
23
|
+
const cachedNorm = normalizeText(cachedQuery);
|
|
24
|
+
if (!currentTokens.length || !cachedNorm) return false;
|
|
25
|
+
return currentTokens.some((t) => cachedNorm.includes(t));
|
|
26
|
+
}
|
|
27
|
+
function shouldReuseSearchContext(params) {
|
|
28
|
+
const { latestText, cachedContext, userTurnCount, now } = params;
|
|
29
|
+
if (!cachedContext) return false;
|
|
30
|
+
if (userTurnCount <= 1) return false;
|
|
31
|
+
if (now - cachedContext.updatedAt > CACHE.SESSION_TTL * 1e3) return false;
|
|
32
|
+
if (!isLikelyFollowUp(latestText)) return false;
|
|
33
|
+
if (!hasQueryOverlap(latestText, cachedContext.query)) return false;
|
|
34
|
+
if (hasNewSignificantTokens(latestText, cachedContext.query)) return false;
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
function buildLocalSearchQuery(latestText) {
|
|
38
|
+
return tokenize(latestText).join(" ");
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
buildLocalSearchQuery,
|
|
42
|
+
hasNewSignificantTokens,
|
|
43
|
+
hasQueryOverlap,
|
|
44
|
+
isLikelyFollowUp,
|
|
45
|
+
shouldReuseSearchContext
|
|
46
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ArticleContext } from "../search/types.js";
|
|
2
|
+
import type { QueryIntentCategory } from "./types.js";
|
|
3
|
+
export declare function classifyIntent(query: string): QueryIntentCategory;
|
|
4
|
+
export declare function rankArticlesByIntent(query: string, articles: ArticleContext[]): ArticleContext[];
|
|
5
|
+
export declare function rankArticlesByCategory(intent: QueryIntentCategory, articles: ArticleContext[]): ArticleContext[];
|
|
6
|
+
//# sourceMappingURL=intent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/query/intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA+FtD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAoBjE;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,EAAE,GACzB,cAAc,EAAE,CAGlB;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,cAAc,EAAE,GACzB,cAAc,EAAE,CAgClB"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
const INTENT_KEYWORDS = {
|
|
2
|
+
setup: [
|
|
3
|
+
"\u642D\u5EFA",
|
|
4
|
+
"\u521B\u5EFA",
|
|
5
|
+
"\u5B89\u88C5",
|
|
6
|
+
"install",
|
|
7
|
+
"setup",
|
|
8
|
+
"create",
|
|
9
|
+
"init",
|
|
10
|
+
"scaffold",
|
|
11
|
+
"\u65B0\u5EFA",
|
|
12
|
+
"\u5F00\u59CB"
|
|
13
|
+
],
|
|
14
|
+
config: [
|
|
15
|
+
"\u914D\u7F6E",
|
|
16
|
+
"\u8BBE\u7F6E",
|
|
17
|
+
"config",
|
|
18
|
+
"settings",
|
|
19
|
+
"\u73AF\u5883\u53D8\u91CF",
|
|
20
|
+
".env",
|
|
21
|
+
"wrangler",
|
|
22
|
+
"tsconfig",
|
|
23
|
+
"\u4E3B\u9898\u8272",
|
|
24
|
+
"\u989C\u8272"
|
|
25
|
+
],
|
|
26
|
+
content: [
|
|
27
|
+
"\u6587\u7AE0",
|
|
28
|
+
"\u535A\u5BA2",
|
|
29
|
+
"\u5199\u4F5C",
|
|
30
|
+
"markdown",
|
|
31
|
+
"mdx",
|
|
32
|
+
"\u6807\u7B7E",
|
|
33
|
+
"\u5206\u7C7B",
|
|
34
|
+
"\u6458\u8981",
|
|
35
|
+
"\u5C01\u9762",
|
|
36
|
+
"\u7FFB\u8BD1"
|
|
37
|
+
],
|
|
38
|
+
feature: [
|
|
39
|
+
"\u529F\u80FD",
|
|
40
|
+
"\u7279\u6027",
|
|
41
|
+
"feature",
|
|
42
|
+
"\u652F\u6301",
|
|
43
|
+
"AI",
|
|
44
|
+
"RAG",
|
|
45
|
+
"\u641C\u7D22",
|
|
46
|
+
"\u8BC4\u8BBA",
|
|
47
|
+
"RSS",
|
|
48
|
+
"\u6697\u8272",
|
|
49
|
+
"\u6DF1\u8272"
|
|
50
|
+
],
|
|
51
|
+
deployment: [
|
|
52
|
+
"\u90E8\u7F72",
|
|
53
|
+
"deploy",
|
|
54
|
+
"cloudflare",
|
|
55
|
+
"vercel",
|
|
56
|
+
"netlify",
|
|
57
|
+
"build",
|
|
58
|
+
"\u6784\u5EFA",
|
|
59
|
+
"CI",
|
|
60
|
+
"CD"
|
|
61
|
+
],
|
|
62
|
+
troubleshooting: [
|
|
63
|
+
"\u62A5\u9519",
|
|
64
|
+
"\u9519\u8BEF",
|
|
65
|
+
"error",
|
|
66
|
+
"bug",
|
|
67
|
+
"\u95EE\u9898",
|
|
68
|
+
"\u4E0D\u5DE5\u4F5C",
|
|
69
|
+
"\u5931\u8D25",
|
|
70
|
+
"fail",
|
|
71
|
+
"\u4FEE\u590D",
|
|
72
|
+
"fix"
|
|
73
|
+
],
|
|
74
|
+
general: []
|
|
75
|
+
};
|
|
76
|
+
function countKeywordHits(text, keywords) {
|
|
77
|
+
if (!text) return 0;
|
|
78
|
+
const lower = text.toLowerCase();
|
|
79
|
+
return keywords.reduce(
|
|
80
|
+
(hits, kw) => hits + (lower.includes(kw.toLowerCase()) ? 1 : 0),
|
|
81
|
+
0
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
function isRecent(dateTime) {
|
|
85
|
+
if (!dateTime || !Number.isFinite(dateTime)) return false;
|
|
86
|
+
return Date.now() - dateTime <= 365 * 24 * 60 * 60 * 1e3;
|
|
87
|
+
}
|
|
88
|
+
function classifyIntent(query) {
|
|
89
|
+
const q = query.toLowerCase();
|
|
90
|
+
const scores = {};
|
|
91
|
+
for (const [intent, keywords] of Object.entries(INTENT_KEYWORDS)) {
|
|
92
|
+
if (intent === "general") continue;
|
|
93
|
+
const score = keywords.reduce(
|
|
94
|
+
(acc, kw) => acc + (q.includes(kw.toLowerCase()) ? 1 : 0),
|
|
95
|
+
0
|
|
96
|
+
);
|
|
97
|
+
if (score > 0) scores[intent] = score;
|
|
98
|
+
}
|
|
99
|
+
const sorted = Object.entries(scores).sort(
|
|
100
|
+
(a, b) => b[1] - a[1]
|
|
101
|
+
);
|
|
102
|
+
return sorted[0]?.[0] || "general";
|
|
103
|
+
}
|
|
104
|
+
function rankArticlesByIntent(query, articles) {
|
|
105
|
+
const intent = classifyIntent(query);
|
|
106
|
+
return rankArticlesByCategory(intent, articles);
|
|
107
|
+
}
|
|
108
|
+
function rankArticlesByCategory(intent, articles) {
|
|
109
|
+
if (intent === "general" || articles.length <= 1) return articles;
|
|
110
|
+
const keywords = INTENT_KEYWORDS[intent];
|
|
111
|
+
if (!keywords.length) return articles;
|
|
112
|
+
const scored = articles.map((article, index) => {
|
|
113
|
+
const titleHit = countKeywordHits(article.title, keywords) > 0 ? 3 : 0;
|
|
114
|
+
const categoryHit = (article.categories ?? []).some(
|
|
115
|
+
(c) => countKeywordHits(c, keywords) > 0
|
|
116
|
+
) ? 2 : 0;
|
|
117
|
+
const summaryHit = countKeywordHits(article.summary, keywords) > 0 ? 2 : 0;
|
|
118
|
+
const keyPointHit = article.keyPoints.some(
|
|
119
|
+
(kp) => countKeywordHits(kp, keywords) > 0
|
|
120
|
+
) ? 1 : 0;
|
|
121
|
+
const recentHit = isRecent(article.dateTime) ? 1 : 0;
|
|
122
|
+
return {
|
|
123
|
+
article,
|
|
124
|
+
index,
|
|
125
|
+
score: titleHit + categoryHit + summaryHit + keyPointHit + recentHit
|
|
126
|
+
};
|
|
127
|
+
});
|
|
128
|
+
const maxScore = Math.max(...scored.map((s) => s.score), 0);
|
|
129
|
+
if (maxScore === 0) return articles;
|
|
130
|
+
scored.sort((a, b) => b.score - a.score || a.index - b.index);
|
|
131
|
+
return scored.map((s) => s.article);
|
|
132
|
+
}
|
|
133
|
+
export {
|
|
134
|
+
classifyIntent,
|
|
135
|
+
rankArticlesByCategory,
|
|
136
|
+
rankArticlesByIntent
|
|
137
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type QueryIntentCategory = "setup" | "config" | "content" | "feature" | "deployment" | "troubleshooting" | "general";
|
|
2
|
+
export interface SearchContextReuseParams {
|
|
3
|
+
latestText: string;
|
|
4
|
+
cachedContext: import("../search/types.js").CachedSearchContext | undefined;
|
|
5
|
+
userTurnCount: number;
|
|
6
|
+
now: number;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,QAAQ,GACR,SAAS,GACT,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,SAAS,CAAC;AAEd,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,oBAAoB,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb"}
|
|
File without changes
|