@astro-minimax/ai 0.2.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/README.md +223 -0
- package/dist/cache/global-cache.d.ts +31 -0
- package/dist/cache/global-cache.d.ts.map +1 -0
- package/dist/cache/global-cache.js +141 -0
- package/dist/cache/index.d.ts +8 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +62 -0
- package/dist/cache/kv-adapter.d.ts +21 -0
- package/dist/cache/kv-adapter.d.ts.map +1 -0
- package/dist/cache/kv-adapter.js +102 -0
- package/dist/cache/memory-adapter.d.ts +24 -0
- package/dist/cache/memory-adapter.d.ts.map +1 -0
- package/dist/cache/memory-adapter.js +95 -0
- package/dist/cache/response-cache.d.ts +45 -0
- package/dist/cache/response-cache.d.ts.map +1 -0
- package/dist/cache/response-cache.js +85 -0
- package/dist/cache/types.d.ts +118 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +16 -0
- package/dist/data/index.d.ts +3 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +1 -0
- package/dist/data/metadata-loader.d.ts +37 -0
- package/dist/data/metadata-loader.d.ts.map +1 -0
- package/dist/data/metadata-loader.js +54 -0
- package/dist/data/types.d.ts +51 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/data/types.js +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/intelligence/citation-guard.d.ts +24 -0
- package/dist/intelligence/citation-guard.d.ts.map +1 -0
- package/dist/intelligence/citation-guard.js +82 -0
- package/dist/intelligence/evidence-analysis.d.ts +29 -0
- package/dist/intelligence/evidence-analysis.d.ts.map +1 -0
- package/dist/intelligence/evidence-analysis.js +88 -0
- package/dist/intelligence/index.d.ts +6 -0
- package/dist/intelligence/index.d.ts.map +1 -0
- package/dist/intelligence/index.js +4 -0
- package/dist/intelligence/intent-detect.d.ts +29 -0
- package/dist/intelligence/intent-detect.d.ts.map +1 -0
- package/dist/intelligence/intent-detect.js +64 -0
- package/dist/intelligence/keyword-extract.d.ts +31 -0
- package/dist/intelligence/keyword-extract.d.ts.map +1 -0
- package/dist/intelligence/keyword-extract.js +114 -0
- package/dist/intelligence/types.d.ts +27 -0
- package/dist/intelligence/types.d.ts.map +1 -0
- package/dist/intelligence/types.js +1 -0
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +1 -0
- package/dist/middleware/rate-limiter.d.ts +26 -0
- package/dist/middleware/rate-limiter.d.ts.map +1 -0
- package/dist/middleware/rate-limiter.js +129 -0
- package/dist/prompt/dynamic-layer.d.ts +7 -0
- package/dist/prompt/dynamic-layer.d.ts.map +1 -0
- package/dist/prompt/dynamic-layer.js +40 -0
- package/dist/prompt/index.d.ts +6 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +4 -0
- package/dist/prompt/prompt-builder.d.ts +11 -0
- package/dist/prompt/prompt-builder.d.ts.map +1 -0
- package/dist/prompt/prompt-builder.js +19 -0
- package/dist/prompt/semi-static-layer.d.ts +7 -0
- package/dist/prompt/semi-static-layer.d.ts.map +1 -0
- package/dist/prompt/semi-static-layer.js +32 -0
- package/dist/prompt/static-layer.d.ts +3 -0
- package/dist/prompt/static-layer.d.ts.map +1 -0
- package/dist/prompt/static-layer.js +78 -0
- package/dist/prompt/types.d.ts +25 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +1 -0
- package/dist/provider-manager/base.d.ts +26 -0
- package/dist/provider-manager/base.d.ts.map +1 -0
- package/dist/provider-manager/base.js +47 -0
- package/dist/provider-manager/config.d.ts +7 -0
- package/dist/provider-manager/config.d.ts.map +1 -0
- package/dist/provider-manager/config.js +134 -0
- package/dist/provider-manager/index.d.ts +8 -0
- package/dist/provider-manager/index.d.ts.map +1 -0
- package/dist/provider-manager/index.js +6 -0
- package/dist/provider-manager/manager.d.ts +18 -0
- package/dist/provider-manager/manager.d.ts.map +1 -0
- package/dist/provider-manager/manager.js +121 -0
- package/dist/provider-manager/mock.d.ts +18 -0
- package/dist/provider-manager/mock.d.ts.map +1 -0
- package/dist/provider-manager/mock.js +56 -0
- package/dist/provider-manager/openai.d.ts +20 -0
- package/dist/provider-manager/openai.d.ts.map +1 -0
- package/dist/provider-manager/openai.js +83 -0
- package/dist/provider-manager/types.d.ts +217 -0
- package/dist/provider-manager/types.d.ts.map +1 -0
- package/dist/provider-manager/types.js +6 -0
- package/dist/provider-manager/workers.d.ts +20 -0
- package/dist/provider-manager/workers.d.ts.map +1 -0
- package/dist/provider-manager/workers.js +74 -0
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/mock.d.ts +14 -0
- package/dist/providers/mock.d.ts.map +1 -0
- package/dist/providers/mock.js +234 -0
- package/dist/search/index.d.ts +5 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +3 -0
- package/dist/search/search-api.d.ts +28 -0
- package/dist/search/search-api.d.ts.map +1 -0
- package/dist/search/search-api.js +110 -0
- package/dist/search/search-index.d.ts +6 -0
- package/dist/search/search-index.d.ts.map +1 -0
- package/dist/search/search-index.js +22 -0
- package/dist/search/search-utils.d.ts +43 -0
- package/dist/search/search-utils.d.ts.map +1 -0
- package/dist/search/search-utils.js +114 -0
- package/dist/search/session-cache.d.ts +19 -0
- package/dist/search/session-cache.d.ts.map +1 -0
- package/dist/search/session-cache.js +92 -0
- package/dist/search/types.d.ts +41 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/search/types.js +1 -0
- package/dist/server/chat-handler.d.ts +3 -0
- package/dist/server/chat-handler.d.ts.map +1 -0
- package/dist/server/chat-handler.js +750 -0
- package/dist/server/dev-server.d.ts +18 -0
- package/dist/server/dev-server.d.ts.map +1 -0
- package/dist/server/dev-server.js +294 -0
- package/dist/server/errors.d.ts +17 -0
- package/dist/server/errors.d.ts.map +1 -0
- package/dist/server/errors.js +41 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +5 -0
- package/dist/server/metadata-init.d.ts +11 -0
- package/dist/server/metadata-init.d.ts.map +1 -0
- package/dist/server/metadata-init.js +45 -0
- package/dist/server/notify.d.ts +25 -0
- package/dist/server/notify.d.ts.map +1 -0
- package/dist/server/notify.js +62 -0
- package/dist/server/types.d.ts +56 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +13 -0
- package/dist/stream/index.d.ts +3 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +2 -0
- package/dist/stream/mock-stream.d.ts +12 -0
- package/dist/stream/mock-stream.d.ts.map +1 -0
- package/dist/stream/mock-stream.js +27 -0
- package/dist/stream/response.d.ts +10 -0
- package/dist/stream/response.d.ts.map +1 -0
- package/dist/stream/response.js +22 -0
- package/dist/utils/i18n.d.ts +18 -0
- package/dist/utils/i18n.d.ts.map +1 -0
- package/dist/utils/i18n.js +148 -0
- package/package.json +93 -0
- package/src/components/AIChatContainer.tsx +30 -0
- package/src/components/AIChatWidget.astro +30 -0
- package/src/components/ChatPanel.tsx +865 -0
- package/src/styles/source.css +2 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const DEFAULT_MAX_ENTRIES = 400;
|
|
2
|
+
const DEFAULT_TTL_SECONDS = 600;
|
|
3
|
+
export class MemoryCacheAdapter {
|
|
4
|
+
name = 'memory';
|
|
5
|
+
cache = new Map();
|
|
6
|
+
maxEntries;
|
|
7
|
+
defaultTtl;
|
|
8
|
+
cleanupTimer;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.maxEntries = options?.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
11
|
+
this.defaultTtl = options?.defaultTtl ?? DEFAULT_TTL_SECONDS;
|
|
12
|
+
if (options?.cleanupInterval) {
|
|
13
|
+
this.cleanupTimer = setInterval(() => this.cleanup(), options.cleanupInterval * 1000);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async get(key, _options) {
|
|
17
|
+
const entry = this.cache.get(key);
|
|
18
|
+
if (!entry)
|
|
19
|
+
return null;
|
|
20
|
+
if (entry.expiresAt && Date.now() > entry.expiresAt) {
|
|
21
|
+
this.cache.delete(key);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
this.cache.delete(key);
|
|
25
|
+
this.cache.set(key, entry);
|
|
26
|
+
return {
|
|
27
|
+
value: entry.value,
|
|
28
|
+
metadata: entry.metadata,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async set(key, value, options) {
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
const ttl = options?.ttl ?? this.defaultTtl;
|
|
34
|
+
const entry = {
|
|
35
|
+
value,
|
|
36
|
+
metadata: {
|
|
37
|
+
createdAt: now,
|
|
38
|
+
updatedAt: now,
|
|
39
|
+
custom: options?.metadata,
|
|
40
|
+
},
|
|
41
|
+
expiresAt: ttl ? now + ttl * 1000 : undefined,
|
|
42
|
+
};
|
|
43
|
+
this.cache.delete(key);
|
|
44
|
+
this.cache.set(key, entry);
|
|
45
|
+
if (this.cache.size > this.maxEntries) {
|
|
46
|
+
this.evictLRU();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async delete(key) {
|
|
50
|
+
return this.cache.delete(key);
|
|
51
|
+
}
|
|
52
|
+
async clear() {
|
|
53
|
+
this.cache.clear();
|
|
54
|
+
}
|
|
55
|
+
async has(key) {
|
|
56
|
+
const entry = this.cache.get(key);
|
|
57
|
+
if (!entry)
|
|
58
|
+
return false;
|
|
59
|
+
if (entry.expiresAt && Date.now() > entry.expiresAt) {
|
|
60
|
+
this.cache.delete(key);
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
async isAvailable() {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
cleanup() {
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
for (const [key, entry] of this.cache) {
|
|
71
|
+
if (entry.expiresAt && now > entry.expiresAt) {
|
|
72
|
+
this.cache.delete(key);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
evictLRU() {
|
|
77
|
+
const overflow = this.cache.size - this.maxEntries;
|
|
78
|
+
if (overflow <= 0)
|
|
79
|
+
return;
|
|
80
|
+
const keys = this.cache.keys();
|
|
81
|
+
for (let i = 0; i < overflow; i++) {
|
|
82
|
+
const next = keys.next();
|
|
83
|
+
if (next.done)
|
|
84
|
+
break;
|
|
85
|
+
this.cache.delete(next.value);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
dispose() {
|
|
89
|
+
if (this.cleanupTimer) {
|
|
90
|
+
clearInterval(this.cleanupTimer);
|
|
91
|
+
this.cleanupTimer = undefined;
|
|
92
|
+
}
|
|
93
|
+
this.cache.clear();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CacheAdapter } from './types.js';
|
|
2
|
+
import type { ArticleContext, ProjectContext } from '../search/types.js';
|
|
3
|
+
import type { PublicQuestionType } from './global-cache.js';
|
|
4
|
+
export interface CachedAIResponse {
|
|
5
|
+
query: string;
|
|
6
|
+
thinking?: string;
|
|
7
|
+
response: string;
|
|
8
|
+
articles: ArticleContext[];
|
|
9
|
+
projects: ProjectContext[];
|
|
10
|
+
lang: string;
|
|
11
|
+
model?: string;
|
|
12
|
+
updatedAt: number;
|
|
13
|
+
}
|
|
14
|
+
export interface ResponseCacheConfig {
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
defaultTtl: number;
|
|
17
|
+
playbackDelayMs: number;
|
|
18
|
+
chunkSize: number;
|
|
19
|
+
thinkingPlaybackDelayMs: number;
|
|
20
|
+
}
|
|
21
|
+
export declare const DEFAULT_RESPONSE_CACHE_CONFIG: ResponseCacheConfig;
|
|
22
|
+
export type ResponseCacheEnv = Record<string, unknown>;
|
|
23
|
+
export declare function getResponseCacheConfig(env: Record<string, unknown>): ResponseCacheConfig;
|
|
24
|
+
export declare function buildResponseCacheKey(type: PublicQuestionType, context?: {
|
|
25
|
+
articleSlug?: string;
|
|
26
|
+
lang?: string;
|
|
27
|
+
}): string;
|
|
28
|
+
export declare function getResponseCache(cache: CacheAdapter, type: PublicQuestionType, context?: {
|
|
29
|
+
articleSlug?: string;
|
|
30
|
+
lang?: string;
|
|
31
|
+
}): Promise<CachedAIResponse | null>;
|
|
32
|
+
export declare function setResponseCache(cache: CacheAdapter, type: PublicQuestionType, data: CachedAIResponse, ttl: number, context?: {
|
|
33
|
+
articleSlug?: string;
|
|
34
|
+
lang?: string;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
export declare function deleteResponseCache(cache: CacheAdapter, type: PublicQuestionType, context?: {
|
|
37
|
+
articleSlug?: string;
|
|
38
|
+
lang?: string;
|
|
39
|
+
}): Promise<boolean>;
|
|
40
|
+
export interface PlaybackChunk {
|
|
41
|
+
type: 'thinking' | 'response';
|
|
42
|
+
text: string;
|
|
43
|
+
}
|
|
44
|
+
export declare function createResponsePlaybackGenerator(cached: CachedAIResponse, config: Pick<ResponseCacheConfig, 'playbackDelayMs' | 'chunkSize' | 'thinkingPlaybackDelayMs'>): AsyncGenerator<PlaybackChunk, void, unknown>;
|
|
45
|
+
//# sourceMappingURL=response-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-cache.d.ts","sourceRoot":"","sources":["../../src/cache/response-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,6BAA6B,EAAE,mBAM3C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB,CAyBxF;AAID,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,kBAAkB,EACxB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,MAAM,CAKR;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,kBAAkB,EACxB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAIlC;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,gBAAgB,EACtB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,IAAI,CAAC,CAGf;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,kBAAkB,EACxB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAAE,iBAAiB,GAAG,WAAW,GAAG,yBAAyB,CAAC,GAC7F,cAAc,CAAC,aAAa,EAAE,IAAI,EAAE,OAAO,CAAC,CA4B9C"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export const DEFAULT_RESPONSE_CACHE_CONFIG = {
|
|
2
|
+
enabled: false,
|
|
3
|
+
defaultTtl: 3600,
|
|
4
|
+
playbackDelayMs: 20,
|
|
5
|
+
chunkSize: 15,
|
|
6
|
+
thinkingPlaybackDelayMs: 5,
|
|
7
|
+
};
|
|
8
|
+
export function getResponseCacheConfig(env) {
|
|
9
|
+
const parseBool = (val) => {
|
|
10
|
+
if (val === undefined)
|
|
11
|
+
return false;
|
|
12
|
+
if (typeof val === 'boolean')
|
|
13
|
+
return val;
|
|
14
|
+
if (typeof val === 'string')
|
|
15
|
+
return val === 'true' || val === '1';
|
|
16
|
+
return false;
|
|
17
|
+
};
|
|
18
|
+
const parseNum = (val, defaultVal) => {
|
|
19
|
+
if (val === undefined)
|
|
20
|
+
return defaultVal;
|
|
21
|
+
if (typeof val === 'number')
|
|
22
|
+
return val;
|
|
23
|
+
if (typeof val === 'string') {
|
|
24
|
+
const num = parseInt(val, 10);
|
|
25
|
+
return isNaN(num) ? defaultVal : num;
|
|
26
|
+
}
|
|
27
|
+
return defaultVal;
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
enabled: parseBool(env.AI_RESPONSE_CACHE_ENABLED),
|
|
31
|
+
defaultTtl: parseNum(env.AI_RESPONSE_CACHE_TTL, 3600),
|
|
32
|
+
playbackDelayMs: parseNum(env.AI_RESPONSE_CACHE_PLAYBACK_DELAY, 20),
|
|
33
|
+
chunkSize: parseNum(env.AI_RESPONSE_CACHE_CHUNK_SIZE, 15),
|
|
34
|
+
thinkingPlaybackDelayMs: parseNum(env.AI_RESPONSE_CACHE_THINKING_DELAY, 5),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const RESPONSE_CACHE_PREFIX = 'response';
|
|
38
|
+
export function buildResponseCacheKey(type, context) {
|
|
39
|
+
const parts = [RESPONSE_CACHE_PREFIX, type];
|
|
40
|
+
if (context?.articleSlug)
|
|
41
|
+
parts.push(context.articleSlug);
|
|
42
|
+
if (context?.lang)
|
|
43
|
+
parts.push(context.lang);
|
|
44
|
+
return parts.join(':');
|
|
45
|
+
}
|
|
46
|
+
export async function getResponseCache(cache, type, context) {
|
|
47
|
+
const key = buildResponseCacheKey(type, context);
|
|
48
|
+
const entry = await cache.get(key);
|
|
49
|
+
return entry?.value ?? null;
|
|
50
|
+
}
|
|
51
|
+
export async function setResponseCache(cache, type, data, ttl, context) {
|
|
52
|
+
const key = buildResponseCacheKey(type, context);
|
|
53
|
+
await cache.set(key, data, { ttl });
|
|
54
|
+
}
|
|
55
|
+
export async function deleteResponseCache(cache, type, context) {
|
|
56
|
+
const key = buildResponseCacheKey(type, context);
|
|
57
|
+
return cache.delete(key);
|
|
58
|
+
}
|
|
59
|
+
export function createResponsePlaybackGenerator(cached, config) {
|
|
60
|
+
const { playbackDelayMs, chunkSize, thinkingPlaybackDelayMs } = config;
|
|
61
|
+
return (async function* () {
|
|
62
|
+
if (cached.thinking) {
|
|
63
|
+
const thinkingChunks = Math.ceil(cached.thinking.length / chunkSize);
|
|
64
|
+
for (let i = 0; i < thinkingChunks; i++) {
|
|
65
|
+
const chunk = cached.thinking.slice(i * chunkSize, (i + 1) * chunkSize);
|
|
66
|
+
if (chunk) {
|
|
67
|
+
yield { type: 'thinking', text: chunk };
|
|
68
|
+
if (i < thinkingChunks - 1 && thinkingPlaybackDelayMs > 0) {
|
|
69
|
+
await new Promise(resolve => setTimeout(resolve, thinkingPlaybackDelayMs));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const responseChunks = Math.ceil(cached.response.length / chunkSize);
|
|
75
|
+
for (let i = 0; i < responseChunks; i++) {
|
|
76
|
+
const chunk = cached.response.slice(i * chunkSize, (i + 1) * chunkSize);
|
|
77
|
+
if (chunk) {
|
|
78
|
+
yield { type: 'response', text: chunk };
|
|
79
|
+
if (i < responseChunks - 1 && playbackDelayMs > 0) {
|
|
80
|
+
await new Promise(resolve => setTimeout(resolve, playbackDelayMs));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
})();
|
|
85
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @astro-minimax/ai
|
|
3
|
+
*
|
|
4
|
+
* Cache abstraction layer for AI conversation system.
|
|
5
|
+
* Supports multiple storage backends (memory, Cloudflare KV).
|
|
6
|
+
*
|
|
7
|
+
* @module cache/types
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Metadata stored alongside cache entries.
|
|
11
|
+
*/
|
|
12
|
+
export interface CacheEntryMetadata {
|
|
13
|
+
/** Timestamp when the entry was created (ms since epoch) */
|
|
14
|
+
createdAt: number;
|
|
15
|
+
/** Timestamp when the entry was last updated (ms since epoch) */
|
|
16
|
+
updatedAt: number;
|
|
17
|
+
/** Custom metadata provided by the caller */
|
|
18
|
+
custom?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A cached entry with its value and metadata.
|
|
22
|
+
*/
|
|
23
|
+
export interface CacheEntry<T> {
|
|
24
|
+
/** The cached value */
|
|
25
|
+
value: T;
|
|
26
|
+
/** Entry metadata */
|
|
27
|
+
metadata: CacheEntryMetadata;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Options for setting a cache entry.
|
|
31
|
+
*/
|
|
32
|
+
export interface CacheSetOptions {
|
|
33
|
+
/** Time-to-live in seconds. If not provided, entry won't expire automatically. */
|
|
34
|
+
ttl?: number;
|
|
35
|
+
/** Custom metadata to store with the entry */
|
|
36
|
+
metadata?: Record<string, unknown>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Options for getting a cache entry.
|
|
40
|
+
*/
|
|
41
|
+
export interface CacheGetOptions {
|
|
42
|
+
/** If true, return null instead of throwing on parse errors */
|
|
43
|
+
silent?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Abstract cache adapter interface.
|
|
47
|
+
* Implementations: MemoryCacheAdapter, KVCacheAdapter.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const cache = new MemoryCacheAdapter();
|
|
52
|
+
* await cache.set('key', { data: 'value' }, { ttl: 600 });
|
|
53
|
+
* const entry = await cache.get<{ data: string }>('key');
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export interface CacheAdapter {
|
|
57
|
+
readonly name: string;
|
|
58
|
+
get<T>(key: string, options?: CacheGetOptions): Promise<CacheEntry<T> | null>;
|
|
59
|
+
set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void>;
|
|
60
|
+
delete(key: string): Promise<boolean>;
|
|
61
|
+
clear(): Promise<void>;
|
|
62
|
+
has(key: string): Promise<boolean>;
|
|
63
|
+
isAvailable(): Promise<boolean>;
|
|
64
|
+
dispose?(): void;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Configuration for cache manager.
|
|
68
|
+
*/
|
|
69
|
+
export interface CacheManagerConfig {
|
|
70
|
+
/** Default TTL for entries (seconds). Default: 600 (10 minutes) */
|
|
71
|
+
defaultTtl?: number;
|
|
72
|
+
/** Maximum number of entries for memory cache. Default: 400 */
|
|
73
|
+
maxEntries?: number;
|
|
74
|
+
/** KV binding name in Cloudflare environment. Default: 'CACHE_KV' */
|
|
75
|
+
kvBindingName?: string;
|
|
76
|
+
/** Enable fallback to memory cache if KV is unavailable. Default: true */
|
|
77
|
+
enableFallback?: boolean;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Environment interface for cache initialization.
|
|
81
|
+
*/
|
|
82
|
+
export interface CacheEnv {
|
|
83
|
+
/** Cloudflare KV namespace binding */
|
|
84
|
+
CACHE_KV?: KVNamespace;
|
|
85
|
+
/** Custom KV binding name (overrides default) */
|
|
86
|
+
CACHE_KV_BINDING?: string;
|
|
87
|
+
/** Disable KV cache (force memory cache) */
|
|
88
|
+
CACHE_DISABLED?: string | boolean;
|
|
89
|
+
/** Default TTL override (seconds) */
|
|
90
|
+
CACHE_TTL?: string | number;
|
|
91
|
+
}
|
|
92
|
+
export type { CachedSearchContext } from '../search/types.js';
|
|
93
|
+
/**
|
|
94
|
+
* Result of a cache operation.
|
|
95
|
+
*/
|
|
96
|
+
export type CacheResult<T> = {
|
|
97
|
+
success: true;
|
|
98
|
+
entry: CacheEntry<T>;
|
|
99
|
+
} | {
|
|
100
|
+
success: false;
|
|
101
|
+
error: Error;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Key builder for cache keys.
|
|
105
|
+
*/
|
|
106
|
+
export interface CacheKeyBuilder {
|
|
107
|
+
/** Build a session-based cache key */
|
|
108
|
+
session(sessionId: string): string;
|
|
109
|
+
/** Build an article-scoped cache key */
|
|
110
|
+
article(sessionId: string, slug: string): string;
|
|
111
|
+
/** Build a custom cache key */
|
|
112
|
+
custom(...parts: string[]): string;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Default cache key builder implementation.
|
|
116
|
+
*/
|
|
117
|
+
export declare const createCacheKeyBuilder: (prefix?: string) => CacheKeyBuilder;
|
|
118
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @astro-minimax/ai
|
|
3
|
+
*
|
|
4
|
+
* Cache abstraction layer for AI conversation system.
|
|
5
|
+
* Supports multiple storage backends (memory, Cloudflare KV).
|
|
6
|
+
*
|
|
7
|
+
* @module cache/types
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Default cache key builder implementation.
|
|
11
|
+
*/
|
|
12
|
+
export const createCacheKeyBuilder = (prefix = 'chat') => ({
|
|
13
|
+
session: (sessionId) => `${prefix}:sid:${sessionId}`,
|
|
14
|
+
article: (sessionId, slug) => `${prefix}:sid:${sessionId}:article:${slug}`,
|
|
15
|
+
custom: (...parts) => `${prefix}:${parts.join(':')}`,
|
|
16
|
+
});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { preloadMetadata, clearMetadataCache, getMetadata, getArticleSummary, getAllSummaries, getAuthorContext, getVoiceProfile, } from './metadata-loader.js';
|
|
2
|
+
export type { AISummariesFile, AuthorContextFile, VoiceProfile, LoadedMetadata, ArticleSummaryData, AuthorPost, } from './types.js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,UAAU,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { preloadMetadata, clearMetadataCache, getMetadata, getArticleSummary, getAllSummaries, getAuthorContext, getVoiceProfile, } from './metadata-loader.js';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AuthorContextFile, VoiceProfile, LoadedMetadata, ArticleSummaryData } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pre-loads metadata synchronously from imported JSON objects.
|
|
4
|
+
* Use this at function initialization time in edge environments.
|
|
5
|
+
*
|
|
6
|
+
* Example (in functions/lib/ai.ts):
|
|
7
|
+
* import summaries from '../../datas/ai-summaries.json' with { type: 'json' };
|
|
8
|
+
* preloadMetadata({ summaries, authorContext, voiceProfile });
|
|
9
|
+
*/
|
|
10
|
+
export declare function preloadMetadata(data: Partial<LoadedMetadata>): void;
|
|
11
|
+
/**
|
|
12
|
+
* Clears the metadata cache (useful for testing).
|
|
13
|
+
*/
|
|
14
|
+
export declare function clearMetadataCache(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Returns the cached metadata. Must call preloadMetadata() first.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getMetadata(): LoadedMetadata;
|
|
19
|
+
/**
|
|
20
|
+
* Returns the AI-generated summary for an article by its slug.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getArticleSummary(slug: string): ArticleSummaryData | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Returns all article summaries as a flat array.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAllSummaries(): Array<{
|
|
27
|
+
slug: string;
|
|
28
|
+
} & ArticleSummaryData>;
|
|
29
|
+
/**
|
|
30
|
+
* Returns the author context (name, site URL, recent posts list).
|
|
31
|
+
*/
|
|
32
|
+
export declare function getAuthorContext(): AuthorContextFile | null;
|
|
33
|
+
/**
|
|
34
|
+
* Returns the author's voice/style profile.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getVoiceProfile(): VoiceProfile | null;
|
|
37
|
+
//# sourceMappingURL=metadata-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-loader.d.ts","sourceRoot":"","sources":["../../src/data/metadata-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKvH;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAMnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,cAAc,CAE5C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAE9E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,kBAAkB,CAAC,CAG9E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Lazy-loaded, memory-cached metadata
|
|
2
|
+
let cachedMetadata = null;
|
|
3
|
+
/**
|
|
4
|
+
* Pre-loads metadata synchronously from imported JSON objects.
|
|
5
|
+
* Use this at function initialization time in edge environments.
|
|
6
|
+
*
|
|
7
|
+
* Example (in functions/lib/ai.ts):
|
|
8
|
+
* import summaries from '../../datas/ai-summaries.json' with { type: 'json' };
|
|
9
|
+
* preloadMetadata({ summaries, authorContext, voiceProfile });
|
|
10
|
+
*/
|
|
11
|
+
export function preloadMetadata(data) {
|
|
12
|
+
cachedMetadata = {
|
|
13
|
+
summaries: data.summaries ?? null,
|
|
14
|
+
authorContext: data.authorContext ?? null,
|
|
15
|
+
voiceProfile: data.voiceProfile ?? null,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Clears the metadata cache (useful for testing).
|
|
20
|
+
*/
|
|
21
|
+
export function clearMetadataCache() {
|
|
22
|
+
cachedMetadata = null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Returns the cached metadata. Must call preloadMetadata() first.
|
|
26
|
+
*/
|
|
27
|
+
export function getMetadata() {
|
|
28
|
+
return cachedMetadata ?? { summaries: null, authorContext: null, voiceProfile: null };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns the AI-generated summary for an article by its slug.
|
|
32
|
+
*/
|
|
33
|
+
export function getArticleSummary(slug) {
|
|
34
|
+
return cachedMetadata?.summaries?.articles[slug]?.data;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns all article summaries as a flat array.
|
|
38
|
+
*/
|
|
39
|
+
export function getAllSummaries() {
|
|
40
|
+
const articles = cachedMetadata?.summaries?.articles ?? {};
|
|
41
|
+
return Object.entries(articles).map(([slug, entry]) => ({ slug, ...entry.data }));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Returns the author context (name, site URL, recent posts list).
|
|
45
|
+
*/
|
|
46
|
+
export function getAuthorContext() {
|
|
47
|
+
return cachedMetadata?.authorContext ?? null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns the author's voice/style profile.
|
|
51
|
+
*/
|
|
52
|
+
export function getVoiceProfile() {
|
|
53
|
+
return cachedMetadata?.voiceProfile ?? null;
|
|
54
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export interface ArticleSummaryData {
|
|
2
|
+
summary: string;
|
|
3
|
+
abstract?: string;
|
|
4
|
+
keyPoints: string[];
|
|
5
|
+
tags: string[];
|
|
6
|
+
readingTime?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ArticleSummaryEntry {
|
|
9
|
+
data: ArticleSummaryData;
|
|
10
|
+
contentHash?: string;
|
|
11
|
+
processedAt?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface AISummariesFile {
|
|
14
|
+
meta: {
|
|
15
|
+
lastUpdated: string;
|
|
16
|
+
model: string;
|
|
17
|
+
totalProcessed: number;
|
|
18
|
+
};
|
|
19
|
+
articles: Record<string, ArticleSummaryEntry>;
|
|
20
|
+
}
|
|
21
|
+
export interface AuthorPost {
|
|
22
|
+
id: string;
|
|
23
|
+
title: string;
|
|
24
|
+
date: string;
|
|
25
|
+
lang: string;
|
|
26
|
+
category: string;
|
|
27
|
+
tags: string[];
|
|
28
|
+
summary: string;
|
|
29
|
+
keyPoints: string[];
|
|
30
|
+
url: string;
|
|
31
|
+
}
|
|
32
|
+
export interface AuthorProfile {
|
|
33
|
+
name: string;
|
|
34
|
+
siteUrl: string;
|
|
35
|
+
description: string;
|
|
36
|
+
}
|
|
37
|
+
export interface AuthorContextFile {
|
|
38
|
+
profile: AuthorProfile;
|
|
39
|
+
posts: AuthorPost[];
|
|
40
|
+
}
|
|
41
|
+
export interface VoiceProfile {
|
|
42
|
+
tone?: string;
|
|
43
|
+
style?: string;
|
|
44
|
+
[key: string]: unknown;
|
|
45
|
+
}
|
|
46
|
+
export interface LoadedMetadata {
|
|
47
|
+
summaries: AISummariesFile | null;
|
|
48
|
+
authorContext: AuthorContextFile | null;
|
|
49
|
+
voiceProfile: VoiceProfile | null;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/data/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,kBAAkB,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE;QACJ,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @astro-minimax/ai
|
|
3
|
+
*
|
|
4
|
+
* Vendor-agnostic AI integration package with full RAG pipeline.
|
|
5
|
+
* Supports OpenAI-compatible APIs and Cloudflare Workers AI.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
export * from './providers/index.js';
|
|
10
|
+
export * from './provider-manager/index.js';
|
|
11
|
+
export * from './middleware/index.js';
|
|
12
|
+
export * from './cache/index.js';
|
|
13
|
+
export * from './search/index.js';
|
|
14
|
+
export * from './intelligence/index.js';
|
|
15
|
+
export * from './prompt/index.js';
|
|
16
|
+
export * from './data/index.js';
|
|
17
|
+
export * from './stream/index.js';
|
|
18
|
+
export * from './server/index.js';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,cAAc,sBAAsB,CAAC;AAGrC,cAAc,6BAA6B,CAAC;AAG5C,cAAc,uBAAuB,CAAC;AAGtC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AAGxC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @astro-minimax/ai
|
|
3
|
+
*
|
|
4
|
+
* Vendor-agnostic AI integration package with full RAG pipeline.
|
|
5
|
+
* Supports OpenAI-compatible APIs and Cloudflare Workers AI.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
// Provider abstractions
|
|
10
|
+
export * from './providers/index.js';
|
|
11
|
+
// Provider Manager (unified multi-provider management)
|
|
12
|
+
export * from './provider-manager/index.js';
|
|
13
|
+
// Middleware (rate limiting)
|
|
14
|
+
export * from './middleware/index.js';
|
|
15
|
+
// Cache abstraction layer
|
|
16
|
+
export * from './cache/index.js';
|
|
17
|
+
// Search API + session cache
|
|
18
|
+
export * from './search/index.js';
|
|
19
|
+
// Intelligence: intent detection, keyword extraction, evidence analysis, citation guard
|
|
20
|
+
export * from './intelligence/index.js';
|
|
21
|
+
// System prompt builder (three layers)
|
|
22
|
+
export * from './prompt/index.js';
|
|
23
|
+
// Build-time metadata loading
|
|
24
|
+
export * from './data/index.js';
|
|
25
|
+
// Stream utilities
|
|
26
|
+
export * from './stream/index.js';
|
|
27
|
+
// Server-side API handlers (chat handler, metadata init)
|
|
28
|
+
export * from './server/index.js';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ArticleContext, ProjectContext } from '../search/types.js';
|
|
2
|
+
import type { CitationGuardPreflight, CitationGuardAction } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Pre-flight check: if the user is asking about something that can be
|
|
5
|
+
* answered directly from the available context without an LLM, return it.
|
|
6
|
+
* This prevents hallucination for specific factual queries.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getCitationGuardPreflight(params: {
|
|
9
|
+
userQuery: string;
|
|
10
|
+
articles: ArticleContext[];
|
|
11
|
+
projects: ProjectContext[];
|
|
12
|
+
}): CitationGuardPreflight | null;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a transform stream that monitors the AI output for hallucinated references.
|
|
15
|
+
* Rewrites or suppresses fabricated article/project links.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createCitationGuardTransform(params: {
|
|
18
|
+
articles: ArticleContext[];
|
|
19
|
+
projects: ProjectContext[];
|
|
20
|
+
onApplied?: (result: {
|
|
21
|
+
actions: CitationGuardAction[];
|
|
22
|
+
}) => void;
|
|
23
|
+
}): (stream: ReadableStream<string>) => ReadableStream<string>;
|
|
24
|
+
//# sourceMappingURL=citation-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"citation-guard.d.ts","sourceRoot":"","sources":["../../src/intelligence/citation-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B,GAAG,sBAAsB,GAAG,IAAI,CA0BhC;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,mBAAmB,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;CAClE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,cAAc,CAAC,MAAM,CAAC,CAuD7D"}
|