@chatcops/core 0.4.0 → 0.6.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/agent/chat.d.ts +13 -0
- package/dist/agent/chat.d.ts.map +1 -0
- package/dist/agent/chat.js +42 -0
- package/dist/agent/chat.js.map +1 -0
- package/dist/agent/errors.d.ts +14 -0
- package/dist/agent/errors.d.ts.map +1 -0
- package/dist/agent/errors.js +24 -0
- package/dist/agent/errors.js.map +1 -0
- package/dist/agent/index.d.ts +5 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +5 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/run-turn.d.ts +79 -0
- package/dist/agent/run-turn.d.ts.map +1 -0
- package/dist/agent/run-turn.js +400 -0
- package/dist/agent/run-turn.js.map +1 -0
- package/dist/agent/tool-registry.d.ts +30 -0
- package/dist/agent/tool-registry.d.ts.map +1 -0
- package/dist/agent/tool-registry.js +66 -0
- package/dist/agent/tool-registry.js.map +1 -0
- package/dist/analytics/collector.d.ts +2 -0
- package/dist/analytics/collector.d.ts.map +1 -1
- package/dist/analytics/collector.js +16 -10
- package/dist/analytics/collector.js.map +1 -1
- package/dist/analytics/index.d.ts +2 -0
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +2 -0
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/names.d.ts +21 -0
- package/dist/analytics/names.d.ts.map +1 -0
- package/dist/analytics/names.js +41 -0
- package/dist/analytics/names.js.map +1 -0
- package/dist/analytics/sink.d.ts +27 -0
- package/dist/analytics/sink.d.ts.map +1 -0
- package/dist/analytics/sink.js +109 -0
- package/dist/analytics/sink.js.map +1 -0
- package/dist/conversation/index.d.ts +1 -0
- package/dist/conversation/index.d.ts.map +1 -1
- package/dist/conversation/index.js.map +1 -1
- package/dist/conversation/manager.d.ts +65 -6
- package/dist/conversation/manager.d.ts.map +1 -1
- package/dist/conversation/manager.js +110 -34
- package/dist/conversation/manager.js.map +1 -1
- package/dist/conversation/store.d.ts +6 -5
- package/dist/conversation/store.d.ts.map +1 -1
- package/dist/conversation/store.js +4 -0
- package/dist/conversation/store.js.map +1 -1
- package/dist/index.d.ts +21 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/knowledge/base.d.ts +8 -0
- package/dist/knowledge/base.d.ts.map +1 -1
- package/dist/knowledge/tokenize.d.ts.map +1 -1
- package/dist/knowledge/tokenize.js +4 -4
- package/dist/knowledge/tokenize.js.map +1 -1
- package/dist/limits/budget.d.ts +84 -0
- package/dist/limits/budget.d.ts.map +1 -0
- package/dist/limits/budget.js +114 -0
- package/dist/limits/budget.js.map +1 -0
- package/dist/limits/rate-limit.d.ts +53 -0
- package/dist/limits/rate-limit.d.ts.map +1 -0
- package/dist/limits/rate-limit.js +68 -0
- package/dist/limits/rate-limit.js.map +1 -0
- package/dist/logger.d.ts +36 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +40 -0
- package/dist/logger.js.map +1 -0
- package/dist/parts.d.ts +9 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +17 -0
- package/dist/parts.js.map +1 -0
- package/dist/protocol/ai-sdk.d.ts +27 -0
- package/dist/protocol/ai-sdk.d.ts.map +1 -0
- package/dist/protocol/ai-sdk.js +127 -0
- package/dist/protocol/ai-sdk.js.map +1 -0
- package/dist/protocol/errors.d.ts +10 -0
- package/dist/protocol/errors.d.ts.map +1 -0
- package/dist/protocol/errors.js +42 -0
- package/dist/protocol/errors.js.map +1 -0
- package/dist/protocol/index.d.ts +9 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +6 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/legacy.d.ts +18 -0
- package/dist/protocol/legacy.d.ts.map +1 -0
- package/dist/protocol/legacy.js +41 -0
- package/dist/protocol/legacy.js.map +1 -0
- package/dist/protocol/sse.d.ts +10 -0
- package/dist/protocol/sse.d.ts.map +1 -0
- package/dist/protocol/sse.js +15 -0
- package/dist/protocol/sse.js.map +1 -0
- package/dist/protocol/v1.d.ts +140 -0
- package/dist/protocol/v1.d.ts.map +1 -0
- package/dist/protocol/v1.js +15 -0
- package/dist/protocol/v1.js.map +1 -0
- package/dist/providers/base.d.ts +13 -28
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +36 -47
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/claude.d.ts +41 -6
- package/dist/providers/claude.d.ts.map +1 -1
- package/dist/providers/claude.js +223 -96
- package/dist/providers/claude.js.map +1 -1
- package/dist/providers/gemini.d.ts +18 -3
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +208 -91
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/history.d.ts +52 -0
- package/dist/providers/history.d.ts.map +1 -0
- package/dist/providers/history.js +212 -0
- package/dist/providers/history.js.map +1 -0
- package/dist/providers/index.d.ts +5 -5
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +5 -4
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.d.ts +28 -6
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +213 -113
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/registry.d.ts +7 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +12 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/schema.d.ts +16 -0
- package/dist/providers/schema.d.ts.map +1 -0
- package/dist/providers/schema.js +80 -0
- package/dist/providers/schema.js.map +1 -0
- package/dist/providers/tool-execution.d.ts +13 -0
- package/dist/providers/tool-execution.d.ts.map +1 -1
- package/dist/providers/tool-execution.js +49 -13
- package/dist/providers/tool-execution.js.map +1 -1
- package/dist/providers/types.d.ts +89 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/retrieval/citations.d.ts +44 -0
- package/dist/retrieval/citations.d.ts.map +1 -0
- package/dist/retrieval/citations.js +97 -0
- package/dist/retrieval/citations.js.map +1 -0
- package/dist/retrieval/cohere-reranker.d.ts +13 -0
- package/dist/retrieval/cohere-reranker.d.ts.map +1 -0
- package/dist/retrieval/cohere-reranker.js +33 -0
- package/dist/retrieval/cohere-reranker.js.map +1 -0
- package/dist/retrieval/gemini-embedder.d.ts +26 -0
- package/dist/retrieval/gemini-embedder.d.ts.map +1 -0
- package/dist/retrieval/gemini-embedder.js +36 -0
- package/dist/retrieval/gemini-embedder.js.map +1 -0
- package/dist/retrieval/http.d.ts +20 -0
- package/dist/retrieval/http.d.ts.map +1 -0
- package/dist/retrieval/http.js +68 -0
- package/dist/retrieval/http.js.map +1 -0
- package/dist/retrieval/index.d.ts +14 -0
- package/dist/retrieval/index.d.ts.map +1 -0
- package/dist/retrieval/index.js +13 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/knowledge.d.ts +16 -0
- package/dist/retrieval/knowledge.d.ts.map +1 -0
- package/dist/retrieval/knowledge.js +21 -0
- package/dist/retrieval/knowledge.js.map +1 -0
- package/dist/retrieval/openai-embedder.d.ts +25 -0
- package/dist/retrieval/openai-embedder.d.ts.map +1 -0
- package/dist/retrieval/openai-embedder.js +30 -0
- package/dist/retrieval/openai-embedder.js.map +1 -0
- package/dist/retrieval/query.d.ts +8 -0
- package/dist/retrieval/query.d.ts.map +1 -0
- package/dist/retrieval/query.js +19 -0
- package/dist/retrieval/query.js.map +1 -0
- package/dist/retrieval/retrievers.d.ts +30 -0
- package/dist/retrieval/retrievers.d.ts.map +1 -0
- package/dist/retrieval/retrievers.js +89 -0
- package/dist/retrieval/retrievers.js.map +1 -0
- package/dist/retrieval/sources.d.ts +16 -0
- package/dist/retrieval/sources.d.ts.map +1 -0
- package/dist/retrieval/sources.js +37 -0
- package/dist/retrieval/sources.js.map +1 -0
- package/dist/retrieval/types.d.ts +50 -0
- package/dist/retrieval/types.d.ts.map +1 -0
- package/dist/retrieval/types.js +2 -0
- package/dist/retrieval/types.js.map +1 -0
- package/dist/retrieval/voyage-embedder.d.ts +33 -0
- package/dist/retrieval/voyage-embedder.d.ts.map +1 -0
- package/dist/retrieval/voyage-embedder.js +33 -0
- package/dist/retrieval/voyage-embedder.js.map +1 -0
- package/dist/retrieval/voyage-reranker.d.ts +13 -0
- package/dist/retrieval/voyage-reranker.d.ts.map +1 -0
- package/dist/retrieval/voyage-reranker.js +38 -0
- package/dist/retrieval/voyage-reranker.js.map +1 -0
- package/dist/retrieval/workers-ai-embedder.d.ts +21 -0
- package/dist/retrieval/workers-ai-embedder.d.ts.map +1 -0
- package/dist/retrieval/workers-ai-embedder.js +42 -0
- package/dist/retrieval/workers-ai-embedder.js.map +1 -0
- package/dist/retrieval/workers-ai-reranker.d.ts +11 -0
- package/dist/retrieval/workers-ai-reranker.d.ts.map +1 -0
- package/dist/retrieval/workers-ai-reranker.js +54 -0
- package/dist/retrieval/workers-ai-reranker.js.map +1 -0
- package/dist/storage/adapt.d.ts +15 -0
- package/dist/storage/adapt.d.ts.map +1 -0
- package/dist/storage/adapt.js +83 -0
- package/dist/storage/adapt.js.map +1 -0
- package/dist/storage/errors.d.ts +18 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/errors.js +28 -0
- package/dist/storage/errors.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/memory-vectors.d.ts +22 -0
- package/dist/storage/memory-vectors.d.ts.map +1 -0
- package/dist/storage/memory-vectors.js +140 -0
- package/dist/storage/memory-vectors.js.map +1 -0
- package/dist/storage/memory.d.ts +24 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +265 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/types.d.ts +188 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/testing/conformance.d.ts +30 -0
- package/dist/testing/conformance.d.ts.map +1 -0
- package/dist/testing/conformance.js +505 -0
- package/dist/testing/conformance.js.map +1 -0
- package/dist/testing/index.d.ts +3 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/provider.d.ts +47 -0
- package/dist/testing/provider.d.ts.map +1 -0
- package/dist/testing/provider.js +83 -0
- package/dist/testing/provider.js.map +1 -0
- package/dist/tools/base.d.ts +14 -4
- package/dist/tools/base.d.ts.map +1 -1
- package/dist/tools/base.js +4 -2
- package/dist/tools/base.js.map +1 -1
- package/dist/tools/lead-capture.d.ts +4 -2
- package/dist/tools/lead-capture.d.ts.map +1 -1
- package/dist/tools/lead-capture.js +7 -2
- package/dist/tools/lead-capture.js.map +1 -1
- package/dist/types.d.ts +146 -7
- package/dist/types.d.ts.map +1 -1
- package/package.json +51 -3
|
@@ -1,56 +1,132 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { consoleLogger } from '../logger.js';
|
|
2
|
+
import { warnOnce } from '../providers/base.js';
|
|
3
|
+
import { DEFAULT_MAX_HISTORY_TOKENS, trimHistory } from '../providers/history.js';
|
|
4
|
+
import { isLegacyConversationStore, withAppend } from '../storage/adapt.js';
|
|
5
|
+
import { memoryStorage } from '../storage/memory.js';
|
|
6
|
+
/**
|
|
7
|
+
* Reads and writes conversations through a store. Writes are appends, so two
|
|
8
|
+
* server instances answering the same conversation don't overwrite each
|
|
9
|
+
* other's messages, as long as the store implements `append`.
|
|
10
|
+
*/
|
|
2
11
|
export class ConversationManager {
|
|
3
12
|
store;
|
|
13
|
+
kv;
|
|
4
14
|
maxMessages;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
15
|
+
maxHistoryTokens;
|
|
16
|
+
localTurns = new Set();
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
const store = options.storage?.conversations ?? options.store ?? memoryStorage().conversations;
|
|
19
|
+
if (isLegacyConversationStore(store)) {
|
|
20
|
+
warnOnce(options.logger ?? consoleLogger(), 'legacy-conversation-store', "The conversation store has no append(), so each write saves the whole conversation. That's fine on one server, but two instances writing the same conversation can lose a message. The store packages (@chatcops/store-*) have append().");
|
|
21
|
+
}
|
|
22
|
+
this.store = withAppend(store);
|
|
23
|
+
this.kv = options.storage?.kv;
|
|
24
|
+
this.maxMessages = options.maxMessages ?? 100;
|
|
25
|
+
this.maxHistoryTokens = options.maxHistoryTokens ?? DEFAULT_MAX_HISTORY_TOKENS;
|
|
8
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* The stored conversation, or a new empty one. A new conversation isn't
|
|
29
|
+
* saved until its first message is added.
|
|
30
|
+
*/
|
|
9
31
|
async getOrCreate(id) {
|
|
10
32
|
const existing = await this.store.get(id);
|
|
11
33
|
if (existing)
|
|
12
34
|
return existing;
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
messages: [],
|
|
16
|
-
createdAt: Date.now(),
|
|
17
|
-
updatedAt: Date.now(),
|
|
18
|
-
};
|
|
19
|
-
await this.store.save(conversation);
|
|
20
|
-
return conversation;
|
|
35
|
+
const time = Date.now();
|
|
36
|
+
return { id, messages: [], version: 0, createdAt: time, updatedAt: time };
|
|
21
37
|
}
|
|
38
|
+
/** Adds one message and returns the conversation as stored afterwards. */
|
|
22
39
|
async addMessage(conversationId, message) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return
|
|
40
|
+
await this.appendMessages(conversationId, [message]);
|
|
41
|
+
return this.getOrCreate(conversationId);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Adds messages atomically and returns the new version. Pass
|
|
45
|
+
* `expectedVersion` to fail with a `ConflictError` when another request
|
|
46
|
+
* wrote first.
|
|
47
|
+
*/
|
|
48
|
+
async appendMessages(conversationId, messages, options) {
|
|
49
|
+
const result = await this.store.append(conversationId, messages, options);
|
|
50
|
+
await this.enforceMaxMessages(conversationId);
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
/** Replaces a stored message with the same id. Resolves `false` when there's none. */
|
|
54
|
+
updateMessage(conversationId, message) {
|
|
55
|
+
return this.store.updateMessage(conversationId, message);
|
|
39
56
|
}
|
|
40
57
|
async getMessages(conversationId) {
|
|
41
58
|
const conversation = await this.store.get(conversationId);
|
|
42
59
|
return conversation?.messages ?? [];
|
|
43
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* The messages to send to the model: user and assistant turns within the
|
|
63
|
+
* token budget, keeping the first user message and the newest ones.
|
|
64
|
+
*/
|
|
65
|
+
async getHistory(conversationId) {
|
|
66
|
+
return trimHistory(await this.getMessages(conversationId), this.maxHistoryTokens);
|
|
67
|
+
}
|
|
44
68
|
async removeMessage(conversationId, messageId) {
|
|
45
|
-
|
|
46
|
-
if (!conversation)
|
|
47
|
-
return;
|
|
48
|
-
conversation.messages = conversation.messages.filter((message) => message.id !== messageId);
|
|
49
|
-
conversation.updatedAt = Date.now();
|
|
50
|
-
await this.store.save(conversation);
|
|
69
|
+
await this.store.removeMessage(conversationId, messageId);
|
|
51
70
|
}
|
|
52
71
|
async deleteConversation(id) {
|
|
53
72
|
await this.store.delete(id);
|
|
54
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Makes sure only one reply is generated for a conversation at a time.
|
|
76
|
+
* Resolves a release function, or `null` when another turn holds the lock.
|
|
77
|
+
* The lock expires after `ttlMs` in case a server dies mid-turn.
|
|
78
|
+
*
|
|
79
|
+
* With `storage.kv` (and `setIfAbsent`) the lock holds across instances;
|
|
80
|
+
* otherwise only within this process.
|
|
81
|
+
*/
|
|
82
|
+
async acquireTurn(conversationId, ttlMs = 120_000) {
|
|
83
|
+
const key = `turn:${conversationId}`;
|
|
84
|
+
const kv = this.kv;
|
|
85
|
+
if (kv?.setIfAbsent) {
|
|
86
|
+
const token = crypto.randomUUID();
|
|
87
|
+
if (!(await kv.setIfAbsent(key, token, { ttlMs })))
|
|
88
|
+
return null;
|
|
89
|
+
let released = false;
|
|
90
|
+
return async () => {
|
|
91
|
+
if (released)
|
|
92
|
+
return;
|
|
93
|
+
released = true;
|
|
94
|
+
// Only delete the lock if it's still ours; it may have expired and
|
|
95
|
+
// been taken by another turn.
|
|
96
|
+
if ((await kv.get(key)) === token)
|
|
97
|
+
await kv.delete(key);
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (this.localTurns.has(key))
|
|
101
|
+
return null;
|
|
102
|
+
this.localTurns.add(key);
|
|
103
|
+
const timer = setTimeout(() => this.localTurns.delete(key), ttlMs);
|
|
104
|
+
timer.unref?.();
|
|
105
|
+
let released = false;
|
|
106
|
+
return async () => {
|
|
107
|
+
if (released)
|
|
108
|
+
return;
|
|
109
|
+
released = true;
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
this.localTurns.delete(key);
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Removes the oldest non-system messages past `maxMessages`, one atomic
|
|
116
|
+
* remove each, then any assistant turns left at the front, so the stored
|
|
117
|
+
* history still opens with the visitor (Gemini rejects one that doesn't).
|
|
118
|
+
*/
|
|
119
|
+
async enforceMaxMessages(conversationId) {
|
|
120
|
+
const messages = await this.getMessages(conversationId);
|
|
121
|
+
if (messages.length <= this.maxMessages)
|
|
122
|
+
return;
|
|
123
|
+
const turns = messages.filter((m) => m.role !== 'system');
|
|
124
|
+
let cut = messages.length - this.maxMessages;
|
|
125
|
+
while (cut < turns.length && turns[cut].role === 'assistant')
|
|
126
|
+
cut++;
|
|
127
|
+
for (const message of turns.slice(0, cut)) {
|
|
128
|
+
await this.store.removeMessage(conversationId, message.id);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
55
131
|
}
|
|
56
132
|
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/conversation/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAe,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAoC,yBAAyB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAwBrD;;;;GAIG;AACH,MAAM,OAAO,mBAAmB;IACb,KAAK,CAA8B;IACnC,EAAE,CAA4B;IAC9B,WAAW,CAAS;IACpB,gBAAgB,CAAS;IACzB,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhD,YAAY,UAAsC,EAAE;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,aAAa,IAAI,OAAO,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC,aAAa,CAAC;QAC/F,IAAI,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,QAAQ,CACN,OAAO,CAAC,MAAM,IAAI,aAAa,EAAE,EACjC,2BAA2B,EAC3B,0OAA0O,CAC3O,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC;QAC9C,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;IACjF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC5E,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,UAAU,CAAC,cAAsB,EAAE,OAAoB;QAC3D,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAClB,cAAsB,EACtB,QAAuB,EACvB,OAAuB;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1E,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,sFAAsF;IACtF,aAAa,CAAC,cAAsB,EAAE,OAAoB;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAAsB;QACtC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC1D,OAAO,YAAY,EAAE,QAAQ,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,cAAsB;QACrC,OAAO,WAAW,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACpF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,cAAsB,EAAE,SAAiB;QAC3D,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,EAAU;QACjC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,CAAC,cAAsB,EAAE,KAAK,GAAG,OAAO;QACvD,MAAM,GAAG,GAAG,QAAQ,cAAc,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAEnB,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,OAAO,KAAK,IAAI,EAAE;gBAChB,IAAI,QAAQ;oBAAE,OAAO;gBACrB,QAAQ,GAAG,IAAI,CAAC;gBAChB,mEAAmE;gBACnE,8BAA8B;gBAC9B,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAS,GAAG,CAAC,CAAC,KAAK,KAAK;oBAAE,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAClE,KAAgC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,OAAO,KAAK,IAAI,EAAE;YAChB,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,kBAAkB,CAAC,cAAsB;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACxD,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAEhD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QAC1D,IAAI,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAC7C,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,GAAG,EAAE,CAAC;QACpE,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { Conversation } from '../types.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import type { ConversationStore } from '../storage/types.js';
|
|
3
|
+
export type { ConversationStore } from '../storage/types.js';
|
|
4
|
+
/**
|
|
5
|
+
* The 0.4 in-memory store. Unbounded and without `append`; `memoryStorage()`
|
|
6
|
+
* replaces it.
|
|
7
|
+
*/
|
|
7
8
|
export declare class MemoryStore implements ConversationStore {
|
|
8
9
|
private store;
|
|
9
10
|
get(id: string): Promise<Conversation | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/conversation/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/conversation/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,qBAAa,WAAY,YAAW,iBAAiB;IACnD,OAAO,CAAC,KAAK,CAAmC;IAE1C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAI7C,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/conversation/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/conversation/store.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEhD,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,YAA0B;QACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,30 @@
|
|
|
1
|
-
export type { ChatMessage, Conversation, ChatRequest, ChatResponse, PageContext, LeadData, ToolParameter, ToolDefinition, ToolResult, ProviderToolCall, ProviderToolExecutor, WebhookConfig, ProviderConfig, ProviderEffort, ProviderChatParams, AnalyticsEvent, LocaleStrings, } from './types.js';
|
|
2
|
-
export
|
|
3
|
-
export {
|
|
1
|
+
export type { ChatMessage, Conversation, ChatRequest, ChatResponse, PageContext, LeadData, ToolParameter, ToolDefinition, ToolAnnotations, ToolContext, ToolResult, ProviderToolCall, ProviderToolExecutor, WebhookConfig, ProviderConfig, ProviderEffort, ProviderChatParams, AnalyticsEvent, LocaleStrings, TokenUsage, ProviderMetadata, JSONSchema, ToolExecutor, ToolCallState, MessagePart, TextPart, ReasoningPart, SourcePart, ToolCallPart, ToolResultPart, LeadCapturedPart, HandoffPart, } from './types.js';
|
|
2
|
+
export { partsOf, messageText } from './parts.js';
|
|
3
|
+
export { consoleLogger, jsonLogger, silentLogger, type Logger, type LogFields, type JsonLoggerOptions } from './logger.js';
|
|
4
|
+
export { PROTOCOL_VERSION, encodeSSE, SSE_PING, SSE_DONE, SSE_HEADERS, statusForError, errorBody, describeInvalidRequest, toLegacyChunk, aiSdkEncoder, fromAiSdkRequest, AI_SDK_STREAM_HEADER } from './protocol/index.js';
|
|
5
|
+
export type { AiSdkChunk, LegacyChunk, WirePart, WirePartType, WireErrorCode, WireFinishReason, WireAgent, WireErrorBody, ChatRequestV1, ClientToolManifest, } from './protocol/index.js';
|
|
6
|
+
export type { AIProvider, NormalizedMessage, NormalizedTurn, TurnPart, FinishReason, ProviderEvent, ProviderStepParams, } from './providers/index.js';
|
|
7
|
+
export { createProvider, isAIProvider, normalizeHistory, normalizeTurns, trimHistory, estimateTokens } from './providers/index.js';
|
|
8
|
+
export { registerProvider, type ProviderFactory } from './providers/registry.js';
|
|
9
|
+
export { toolInputSchema, legacyParametersToSchema, validateTools, ToolDefinitionError } from './providers/index.js';
|
|
10
|
+
export { runTurn, DEFAULT_MAX_STEPS, toolRegistry, executorRegistry, toolOutput, MAX_TOOL_OUTPUT_CHARS, RefusalError, ContentFilterError, MaxStepsError, } from './agent/index.js';
|
|
11
|
+
export type { RunTurnOptions, TurnResult, ToolRegistry, ToolRunContext } from './agent/index.js';
|
|
4
12
|
export type { ChatTool, LeadCaptureCallback } from './tools/index.js';
|
|
5
13
|
export { toolToDefinition, LeadCaptureTool } from './tools/index.js';
|
|
6
14
|
export type { KnowledgeSource, FAQPair } from './knowledge/index.js';
|
|
7
15
|
export { TextKnowledgeSource, FAQKnowledgeSource } from './knowledge/index.js';
|
|
16
|
+
export type { Embedder, RetrievedChunk, RetrievalQuery, Retriever, Reranker, OpenAIEmbedderOptions, GeminiEmbedderOptions, VoyageEmbedderOptions, VoyageRerankerOptions, CohereRerankerOptions, WorkersAiBinding, WorkersAiEmbedderOptions, WorkersAiRerankerOptions, RetrieverKnowledgeOptions, VectorRetrieverOptions, HybridRetrieverOptions, } from './retrieval/index.js';
|
|
17
|
+
export { openaiEmbedder, geminiEmbedder, voyageEmbedder, voyageReranker, cohereReranker, workersAiEmbedder, workersAiReranker, retrieverKnowledge, formatSources, uniqueChunks, SOURCES_INSTRUCTION, vectorRetriever, hybridRetriever, reciprocalRankFusion, retrievalQueryText, CitationParser, parseCitations, sourcePart, sourcesContext, CITE_INSTRUCTION, NATIVE_SOURCES_INSTRUCTION, } from './retrieval/index.js';
|
|
8
18
|
export type { ConversationStore } from './conversation/index.js';
|
|
9
19
|
export { ConversationManager, MemoryStore } from './conversation/index.js';
|
|
10
|
-
export {
|
|
20
|
+
export type { ConversationManagerOptions, ReleaseTurn } from './conversation/index.js';
|
|
21
|
+
export type { AppendOptions, ChatCopsStorage, ConversationSummary, CounterStore, CounterValue, EventCount, EventQuery, EventSink, KeyValueStore, ListQuery, MemoryStorageOptions, ConversationStoreWithAppend, KeywordQuery, MetadataFilter, MetadataValue, ScoredRecord, VectorQuery, VectorRecord, VectorSource, VectorStore, MemoryVectorsOptions, } from './storage/index.js';
|
|
22
|
+
export { ConflictError, isConflictError, CONFLICT_ERROR_CODE, memoryStorage, memoryVectors, matchesFilter, segmentWords, withAppend, isLegacyConversationStore, } from './storage/index.js';
|
|
23
|
+
export { createBudgetGuard, BudgetExceededError, DEFAULT_BUDGETS, withDefaultBudgets } from './limits/budget.js';
|
|
24
|
+
export type { Budgets, BudgetLimit, BudgetContext, BudgetGuard, BudgetScope } from './limits/budget.js';
|
|
25
|
+
export { createRateLimiter } from './limits/rate-limit.js';
|
|
26
|
+
export type { RateLimitRule, RateLimitResult, RateLimiterOptions } from './limits/rate-limit.js';
|
|
27
|
+
export { AnalyticsCollector, BufferedEventSink, statsFromSink, ANALYTICS_EVENTS } from './analytics/index.js';
|
|
11
28
|
export type { AnalyticsStats } from './analytics/index.js';
|
|
12
29
|
export { getLocale, getAvailableLocales } from './i18n/index.js';
|
|
13
30
|
export { en, es, hi, fr, de, ja, zh, ar } from './i18n/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,23 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { partsOf, messageText } from './parts.js';
|
|
2
|
+
export { consoleLogger, jsonLogger, silentLogger } from './logger.js';
|
|
3
|
+
// Wire protocol
|
|
4
|
+
export { PROTOCOL_VERSION, encodeSSE, SSE_PING, SSE_DONE, SSE_HEADERS, statusForError, errorBody, describeInvalidRequest, toLegacyChunk, aiSdkEncoder, fromAiSdkRequest, AI_SDK_STREAM_HEADER } from './protocol/index.js';
|
|
5
|
+
export { createProvider, isAIProvider, normalizeHistory, normalizeTurns, trimHistory, estimateTokens } from './providers/index.js';
|
|
6
|
+
export { registerProvider } from './providers/registry.js';
|
|
7
|
+
export { toolInputSchema, legacyParametersToSchema, validateTools, ToolDefinitionError } from './providers/index.js';
|
|
8
|
+
// Turn engine
|
|
9
|
+
export { runTurn, DEFAULT_MAX_STEPS, toolRegistry, executorRegistry, toolOutput, MAX_TOOL_OUTPUT_CHARS, RefusalError, ContentFilterError, MaxStepsError, } from './agent/index.js';
|
|
2
10
|
export { toolToDefinition, LeadCaptureTool } from './tools/index.js';
|
|
3
11
|
export { TextKnowledgeSource, FAQKnowledgeSource } from './knowledge/index.js';
|
|
12
|
+
export { openaiEmbedder, geminiEmbedder, voyageEmbedder, voyageReranker, cohereReranker, workersAiEmbedder, workersAiReranker, retrieverKnowledge, formatSources, uniqueChunks, SOURCES_INSTRUCTION, vectorRetriever, hybridRetriever, reciprocalRankFusion, retrievalQueryText, CitationParser, parseCitations, sourcePart, sourcesContext, CITE_INSTRUCTION, NATIVE_SOURCES_INSTRUCTION, } from './retrieval/index.js';
|
|
4
13
|
export { ConversationManager, MemoryStore } from './conversation/index.js';
|
|
14
|
+
export { ConflictError, isConflictError, CONFLICT_ERROR_CODE, memoryStorage, memoryVectors, matchesFilter, segmentWords, withAppend, isLegacyConversationStore, } from './storage/index.js';
|
|
15
|
+
// Budgets
|
|
16
|
+
export { createBudgetGuard, BudgetExceededError, DEFAULT_BUDGETS, withDefaultBudgets } from './limits/budget.js';
|
|
17
|
+
// Rate limiting
|
|
18
|
+
export { createRateLimiter } from './limits/rate-limit.js';
|
|
5
19
|
// Analytics
|
|
6
|
-
export { AnalyticsCollector } from './analytics/index.js';
|
|
20
|
+
export { AnalyticsCollector, BufferedEventSink, statsFromSink, ANALYTICS_EVENTS } from './analytics/index.js';
|
|
7
21
|
// i18n
|
|
8
22
|
export { getLocale, getAvailableLocales } from './i18n/index.js';
|
|
9
23
|
export { en, es, hi, fr, de, ja, zh, ar } from './i18n/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmCA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAuD,MAAM,aAAa,CAAC;AAE3H,gBAAgB;AAChB,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,sBAAsB,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAwB3N,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACnI,OAAO,EAAE,gBAAgB,EAAwB,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAErH,cAAc;AACd,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAIrE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAqB/E,OAAO,EACL,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA2B3E,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,EACV,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAE5B,UAAU;AACV,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGjH,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,YAAY;AACZ,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG9G,OAAO;AACP,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/knowledge/base.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
import type { RetrievalQuery, RetrievedChunk } from '../retrieval/types.js';
|
|
1
2
|
export interface KnowledgeSource {
|
|
2
3
|
type: string;
|
|
4
|
+
/** Text added to the model's context for a message. */
|
|
3
5
|
getContext(query: string): Promise<string>;
|
|
6
|
+
/**
|
|
7
|
+
* The matching chunks themselves, with the conversation so far for
|
|
8
|
+
* follow-up questions. When a source has this, the server uses it instead
|
|
9
|
+
* of `getContext`, so answers can say which page they came from.
|
|
10
|
+
*/
|
|
11
|
+
retrieve?(query: RetrievalQuery): Promise<RetrievedChunk[]>;
|
|
4
12
|
}
|
|
5
13
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/knowledge/base.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/knowledge/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC7D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../src/knowledge/tokenize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../src/knowledge/tokenize.ts"],"names":[],"mappings":"AAKA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { segmentWords } from '../storage/memory-vectors.js';
|
|
2
|
+
const CJK_SCRIPTS = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}]/u;
|
|
3
|
+
const PARTICLE = /^\p{Script=Hiragana}$/u;
|
|
1
4
|
export function tokenize(query) {
|
|
2
|
-
return query
|
|
3
|
-
.toLowerCase()
|
|
4
|
-
.split(/[^\p{L}\p{N}]+/u)
|
|
5
|
-
.filter((w) => w.length > 2);
|
|
5
|
+
return segmentWords(query).filter((w) => !PARTICLE.test(w) && (w.length > 2 || CJK_SCRIPTS.test(w)));
|
|
6
6
|
}
|
|
7
7
|
//# sourceMappingURL=tokenize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/knowledge/tokenize.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/knowledge/tokenize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,WAAW,GAAG,0EAA0E,CAAC;AAC/F,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAE1C,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvG,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { CounterStore } from '../storage/types.js';
|
|
2
|
+
import type { TokenUsage } from '../types.js';
|
|
3
|
+
/** How much a scope may use. Unset limits don't apply. */
|
|
4
|
+
export interface BudgetLimit {
|
|
5
|
+
/** Input plus output tokens, counted at face value (cached input included). */
|
|
6
|
+
tokens?: number;
|
|
7
|
+
/** Replies. */
|
|
8
|
+
messages?: number;
|
|
9
|
+
}
|
|
10
|
+
/** `false` turns a scope off, including its default. */
|
|
11
|
+
export interface Budgets {
|
|
12
|
+
/** Over a conversation's lifetime (counters kept 30 days). */
|
|
13
|
+
perConversation?: BudgetLimit | false;
|
|
14
|
+
/** Per visitor IP, per UTC day. Skipped for requests without a known IP. */
|
|
15
|
+
perIpPerDay?: BudgetLimit | false;
|
|
16
|
+
/** Everything together, per UTC day: the backstop for a bill you didn't expect. */
|
|
17
|
+
globalPerDay?: (BudgetLimit & {
|
|
18
|
+
/** Dollars, priced with `price`. */
|
|
19
|
+
usd?: number;
|
|
20
|
+
}) | false;
|
|
21
|
+
/**
|
|
22
|
+
* What a step cost in dollars, for `globalPerDay.usd`. Price cached input
|
|
23
|
+
* at its discount here; token budgets count it in full.
|
|
24
|
+
*/
|
|
25
|
+
price?: (usage: TokenUsage) => number;
|
|
26
|
+
}
|
|
27
|
+
/** Who a reply is for. */
|
|
28
|
+
export interface BudgetContext {
|
|
29
|
+
conversationId: string;
|
|
30
|
+
ip?: string;
|
|
31
|
+
}
|
|
32
|
+
export type BudgetScope = 'conversation' | 'ip' | 'global';
|
|
33
|
+
/** A budget is used up. The reply ends with `budget_exceeded`. */
|
|
34
|
+
export declare class BudgetExceededError extends Error {
|
|
35
|
+
readonly scope: BudgetScope;
|
|
36
|
+
readonly code = "budget_exceeded";
|
|
37
|
+
constructor(scope: BudgetScope);
|
|
38
|
+
}
|
|
39
|
+
export interface BudgetGuard {
|
|
40
|
+
/**
|
|
41
|
+
* Checks the budgets before a model request. Throws `BudgetExceededError`
|
|
42
|
+
* when one is used up. Resolves the most tokens left in any token budget,
|
|
43
|
+
* so the caller can cap the reply length.
|
|
44
|
+
*/
|
|
45
|
+
before(context: BudgetContext, step: number): Promise<{
|
|
46
|
+
tokensLeft?: number;
|
|
47
|
+
}>;
|
|
48
|
+
/** Charges a model request's usage. */
|
|
49
|
+
after(context: BudgetContext, usage: TokenUsage): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* What applies when a scope isn't set. Replies, not tokens, per conversation:
|
|
53
|
+
* the widget keeps a conversation across visits, and a token count there
|
|
54
|
+
* would grow with the size of your system prompt. Tokens per IP per day are
|
|
55
|
+
* the cost backstop, since a script can start new conversations at will.
|
|
56
|
+
* There's no global default, because no number fits every site.
|
|
57
|
+
*/
|
|
58
|
+
export declare const DEFAULT_BUDGETS: {
|
|
59
|
+
readonly perConversation: {
|
|
60
|
+
readonly messages: 200;
|
|
61
|
+
};
|
|
62
|
+
readonly perIpPerDay: {
|
|
63
|
+
readonly tokens: 2000000;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Fills the scopes you didn't set with `DEFAULT_BUDGETS`. A scope you set
|
|
68
|
+
* replaces its default whole; `false` turns it off. `false` for the whole
|
|
69
|
+
* option turns budgets off and resolves `undefined`.
|
|
70
|
+
*/
|
|
71
|
+
export declare function withDefaultBudgets(budgets?: Budgets | false): {
|
|
72
|
+
budgets: Budgets;
|
|
73
|
+
defaulted: BudgetScope[];
|
|
74
|
+
} | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Token, reply and dollar budgets on a `CounterStore`, so they hold across
|
|
77
|
+
* server instances. Checked before each model request and charged after it,
|
|
78
|
+
* so a reply can go over by at most one request.
|
|
79
|
+
*/
|
|
80
|
+
export declare function createBudgetGuard(counters: CounterStore, budgets: Budgets, options?: {
|
|
81
|
+
prefix?: string;
|
|
82
|
+
now?: () => number;
|
|
83
|
+
}): BudgetGuard;
|
|
84
|
+
//# sourceMappingURL=budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/limits/budget.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wDAAwD;AACxD,MAAM,WAAW,OAAO;IACtB,8DAA8D;IAC9D,eAAe,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IACtC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAClC,mFAAmF;IACnF,YAAY,CAAC,EACT,CAAC,WAAW,GAAG;QACb,oCAAoC;QACpC,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC,GACF,KAAK,CAAC;IACV;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC;CACvC;AAED,0BAA0B;AAC1B,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,IAAI,GAAG,QAAQ,CAAC;AAE3D,kEAAkE;AAClE,qBAAa,mBAAoB,SAAQ,KAAK;IAGhC,QAAQ,CAAC,KAAK,EAAE,WAAW;IAFvC,QAAQ,CAAC,IAAI,qBAAqB;gBAEb,KAAK,EAAE,WAAW;CAIxC;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,uCAAuC;IACvC,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;;;;;;;CAGA,CAAC;AAI7B;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,WAAW,EAAE,CAAA;CAAE,GAAG,SAAS,CAaxH;AAYD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GACpD,WAAW,CAgEb"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/** A budget is used up. The reply ends with `budget_exceeded`. */
|
|
2
|
+
export class BudgetExceededError extends Error {
|
|
3
|
+
scope;
|
|
4
|
+
code = 'budget_exceeded';
|
|
5
|
+
constructor(scope) {
|
|
6
|
+
super(`The ${scope} budget is used up.`);
|
|
7
|
+
this.scope = scope;
|
|
8
|
+
this.name = 'BudgetExceededError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* What applies when a scope isn't set. Replies, not tokens, per conversation:
|
|
13
|
+
* the widget keeps a conversation across visits, and a token count there
|
|
14
|
+
* would grow with the size of your system prompt. Tokens per IP per day are
|
|
15
|
+
* the cost backstop, since a script can start new conversations at will.
|
|
16
|
+
* There's no global default, because no number fits every site.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_BUDGETS = {
|
|
19
|
+
perConversation: { messages: 200 },
|
|
20
|
+
perIpPerDay: { tokens: 2_000_000 },
|
|
21
|
+
};
|
|
22
|
+
const SCOPE_KEYS = ['perConversation', 'perIpPerDay', 'globalPerDay'];
|
|
23
|
+
/**
|
|
24
|
+
* Fills the scopes you didn't set with `DEFAULT_BUDGETS`. A scope you set
|
|
25
|
+
* replaces its default whole; `false` turns it off. `false` for the whole
|
|
26
|
+
* option turns budgets off and resolves `undefined`.
|
|
27
|
+
*/
|
|
28
|
+
export function withDefaultBudgets(budgets) {
|
|
29
|
+
if (budgets === false)
|
|
30
|
+
return undefined;
|
|
31
|
+
const out = { ...budgets };
|
|
32
|
+
const defaulted = [];
|
|
33
|
+
if (out.perConversation === undefined) {
|
|
34
|
+
out.perConversation = DEFAULT_BUDGETS.perConversation;
|
|
35
|
+
defaulted.push('conversation');
|
|
36
|
+
}
|
|
37
|
+
if (out.perIpPerDay === undefined) {
|
|
38
|
+
out.perIpPerDay = DEFAULT_BUDGETS.perIpPerDay;
|
|
39
|
+
defaulted.push('ip');
|
|
40
|
+
}
|
|
41
|
+
return SCOPE_KEYS.some((key) => out[key]) ? { budgets: out, defaulted } : undefined;
|
|
42
|
+
}
|
|
43
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
44
|
+
const CONVERSATION_TTL_MS = 30 * DAY_MS;
|
|
45
|
+
/**
|
|
46
|
+
* Token, reply and dollar budgets on a `CounterStore`, so they hold across
|
|
47
|
+
* server instances. Checked before each model request and charged after it,
|
|
48
|
+
* so a reply can go over by at most one request.
|
|
49
|
+
*/
|
|
50
|
+
export function createBudgetGuard(counters, budgets, options = {}) {
|
|
51
|
+
const prefix = options.prefix ?? 'budget';
|
|
52
|
+
const now = options.now ?? Date.now;
|
|
53
|
+
if (budgets.globalPerDay && budgets.globalPerDay.usd !== undefined && !budgets.price) {
|
|
54
|
+
throw new Error('budgets.globalPerDay.usd needs budgets.price to know what a request costs.');
|
|
55
|
+
}
|
|
56
|
+
for (const name of SCOPE_KEYS) {
|
|
57
|
+
const limit = budgets[name];
|
|
58
|
+
if (limit === undefined || limit === false)
|
|
59
|
+
continue;
|
|
60
|
+
if (typeof limit !== 'object' || limit === null)
|
|
61
|
+
throw new Error(`budgets.${name} must be an object or false.`);
|
|
62
|
+
for (const [field, value] of Object.entries(limit)) {
|
|
63
|
+
if (typeof value !== 'number' || !(value > 0))
|
|
64
|
+
throw new Error(`budgets.${name}.${field} must be a positive number.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function scopes(context) {
|
|
68
|
+
const day = Math.floor(now() / DAY_MS);
|
|
69
|
+
const out = [];
|
|
70
|
+
if (budgets.perConversation) {
|
|
71
|
+
out.push({ scope: 'conversation', limit: budgets.perConversation, key: `${prefix}:c:${context.conversationId}`, ttlMs: CONVERSATION_TTL_MS });
|
|
72
|
+
}
|
|
73
|
+
if (budgets.perIpPerDay && context.ip) {
|
|
74
|
+
out.push({ scope: 'ip', limit: budgets.perIpPerDay, key: `${prefix}:ip:${context.ip}:${day}`, ttlMs: 2 * DAY_MS });
|
|
75
|
+
}
|
|
76
|
+
if (budgets.globalPerDay) {
|
|
77
|
+
out.push({ scope: 'global', limit: budgets.globalPerDay, key: `${prefix}:g:${day}`, ttlMs: 2 * DAY_MS });
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
const used = async (key) => (await counters.get(key))?.value ?? 0;
|
|
82
|
+
return {
|
|
83
|
+
async before(context, step) {
|
|
84
|
+
let tokensLeft;
|
|
85
|
+
for (const { scope, limit, key, ttlMs } of scopes(context)) {
|
|
86
|
+
if (limit.messages !== undefined && step === 1) {
|
|
87
|
+
// Counted when the reply starts, atomically, so a burst can't all pass.
|
|
88
|
+
const { value } = await counters.increment(`${key}:messages`, 1, ttlMs);
|
|
89
|
+
if (value > limit.messages)
|
|
90
|
+
throw new BudgetExceededError(scope);
|
|
91
|
+
}
|
|
92
|
+
if (limit.tokens !== undefined) {
|
|
93
|
+
const left = limit.tokens - (await used(`${key}:tokens`));
|
|
94
|
+
if (left <= 0)
|
|
95
|
+
throw new BudgetExceededError(scope);
|
|
96
|
+
tokensLeft = Math.min(tokensLeft ?? left, left);
|
|
97
|
+
}
|
|
98
|
+
if (limit.usd !== undefined && (await used(`${key}:usd`)) >= limit.usd) {
|
|
99
|
+
throw new BudgetExceededError(scope);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return tokensLeft === undefined ? {} : { tokensLeft };
|
|
103
|
+
},
|
|
104
|
+
async after(context, usage) {
|
|
105
|
+
const tokens = usage.inputTokens + usage.outputTokens;
|
|
106
|
+
const usd = budgets.price ? budgets.price(usage) : 0;
|
|
107
|
+
await Promise.all(scopes(context).flatMap(({ limit, key, ttlMs }) => [
|
|
108
|
+
...(limit.tokens !== undefined && tokens > 0 ? [counters.increment(`${key}:tokens`, tokens, ttlMs)] : []),
|
|
109
|
+
...(limit.usd !== undefined && usd > 0 ? [counters.increment(`${key}:usd`, usd, ttlMs)] : []),
|
|
110
|
+
]));
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/limits/budget.ts"],"names":[],"mappings":"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"}
|