openvibe 0.58.3 → 0.60.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/CHANGELOG.md +50 -3019
- package/README.md +267 -98
- package/dist/core/agent-modes.d.ts +16 -0
- package/dist/core/agent-modes.d.ts.map +1 -0
- package/dist/core/agent-modes.js +88 -0
- package/dist/core/agent-modes.js.map +1 -0
- package/dist/core/agent-session.d.ts +26 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +84 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/context-architecture.d.ts +12 -0
- package/dist/core/context-architecture.d.ts.map +1 -0
- package/dist/core/context-architecture.js +14 -0
- package/dist/core/context-architecture.js.map +1 -0
- package/dist/core/context-manager.d.ts +162 -0
- package/dist/core/context-manager.d.ts.map +1 -0
- package/dist/core/context-manager.js +311 -0
- package/dist/core/context-manager.js.map +1 -0
- package/dist/core/context-provider-interface.d.ts +134 -0
- package/dist/core/context-provider-interface.d.ts.map +1 -0
- package/dist/core/context-provider-interface.js +6 -0
- package/dist/core/context-provider-interface.js.map +1 -0
- package/dist/core/context-provider-registry.d.ts +78 -0
- package/dist/core/context-provider-registry.d.ts.map +1 -0
- package/dist/core/context-provider-registry.js +164 -0
- package/dist/core/context-provider-registry.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/large-context-provider.d.ts +87 -0
- package/dist/core/large-context-provider.d.ts.map +1 -0
- package/dist/core/large-context-provider.js +391 -0
- package/dist/core/large-context-provider.js.map +1 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +52 -5
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts +6 -4
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +129 -63
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/skills-selector.d.ts +13 -0
- package/dist/modes/interactive/components/skills-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/skills-selector.js +49 -0
- package/dist/modes/interactive/components/skills-selector.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +2 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +44 -37
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/system-prompt-template.md +176 -0
- package/examples/skills/README.md +93 -0
- package/examples/skills/api-design/SKILL.md +80 -0
- package/examples/skills/code-review/SKILL.md +68 -0
- package/examples/skills/git-workflow/SKILL.md +108 -0
- package/examples/skills/testing/SKILL.md +94 -0
- package/package.json +2 -2
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Manager - Independent Architecture for Large Context Support
|
|
3
|
+
* Provides 1M context window support through a third-party architecture
|
|
4
|
+
* Works transparently with all models without modifying prompts
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync } from "fs";
|
|
7
|
+
import { join } from "path";
|
|
8
|
+
import { getAgentDir } from "../config.js";
|
|
9
|
+
/**
|
|
10
|
+
* Default configuration
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_CONFIG = {
|
|
13
|
+
enabled: true,
|
|
14
|
+
defaultContextWindow: 1000000, // 1M tokens
|
|
15
|
+
defaultMaxTokens: 65536,
|
|
16
|
+
providers: [],
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Known large context models with their configurations
|
|
20
|
+
*/
|
|
21
|
+
export const LARGE_CONTEXT_MODELS = {
|
|
22
|
+
// OpenAI
|
|
23
|
+
"gpt-4-turbo": { contextWindow: 128000, maxTokens: 4096 },
|
|
24
|
+
"gpt-4-turbo-preview": { contextWindow: 128000, maxTokens: 4096 },
|
|
25
|
+
"gpt-4o": { contextWindow: 128000, maxTokens: 16384 },
|
|
26
|
+
"gpt-4o-mini": { contextWindow: 128000, maxTokens: 16384 },
|
|
27
|
+
// Anthropic
|
|
28
|
+
"claude-3-opus": { contextWindow: 200000, maxTokens: 4096 },
|
|
29
|
+
"claude-3-sonnet": { contextWindow: 200000, maxTokens: 4096 },
|
|
30
|
+
"claude-3-haiku": { contextWindow: 200000, maxTokens: 4096 },
|
|
31
|
+
"claude-3-5-sonnet": { contextWindow: 200000, maxTokens: 8192 },
|
|
32
|
+
"claude-3-5-haiku": { contextWindow: 200000, maxTokens: 8192 },
|
|
33
|
+
"claude-sonnet-4": { contextWindow: 200000, maxTokens: 16384 },
|
|
34
|
+
// Google
|
|
35
|
+
"gemini-1.5-pro": { contextWindow: 1000000, maxTokens: 8192 },
|
|
36
|
+
"gemini-1.5-flash": { contextWindow: 1000000, maxTokens: 8192 },
|
|
37
|
+
"gemini-2.0-flash": { contextWindow: 1000000, maxTokens: 8192 },
|
|
38
|
+
// DeepSeek
|
|
39
|
+
"deepseek-chat": { contextWindow: 64000, maxTokens: 4096 },
|
|
40
|
+
"deepseek-coder": { contextWindow: 64000, maxTokens: 4096 },
|
|
41
|
+
"deepseek-reasoner": { contextWindow: 64000, maxTokens: 8192 },
|
|
42
|
+
// Mistral
|
|
43
|
+
"mistral-large": { contextWindow: 128000, maxTokens: 8192 },
|
|
44
|
+
"mistral-medium": { contextWindow: 32000, maxTokens: 8192 },
|
|
45
|
+
// Meta Llama
|
|
46
|
+
"llama-3.1-405b": { contextWindow: 128000, maxTokens: 16384 },
|
|
47
|
+
"llama-3.1-70b": { contextWindow: 128000, maxTokens: 16384 },
|
|
48
|
+
"llama-3.1-8b": { contextWindow: 128000, maxTokens: 16384 },
|
|
49
|
+
// Qwen
|
|
50
|
+
"qwen-2.5-72b": { contextWindow: 131072, maxTokens: 8192 },
|
|
51
|
+
"qwen-2.5-32b": { contextWindow: 131072, maxTokens: 8192 },
|
|
52
|
+
"qwen-max": { contextWindow: 1000000, maxTokens: 65536 },
|
|
53
|
+
// Moonshot (Kimi)
|
|
54
|
+
"moonshot-v1-8k": { contextWindow: 8192, maxTokens: 4096 },
|
|
55
|
+
"moonshot-v1-32k": { contextWindow: 32768, maxTokens: 4096 },
|
|
56
|
+
"moonshot-v1-128k": { contextWindow: 131072, maxTokens: 4096 },
|
|
57
|
+
// Yi
|
|
58
|
+
"yi-lightning": { contextWindow: 16384, maxTokens: 4096 },
|
|
59
|
+
"yi-large": { contextWindow: 32768, maxTokens: 4096 },
|
|
60
|
+
"yi-large-turbo": { contextWindow: 16384, maxTokens: 4096 },
|
|
61
|
+
// GLM
|
|
62
|
+
"glm-4": { contextWindow: 128000, maxTokens: 4096 },
|
|
63
|
+
"glm-4-plus": { contextWindow: 128000, maxTokens: 4096 },
|
|
64
|
+
// Default large context for unknown models
|
|
65
|
+
"default-large": { contextWindow: 1000000, maxTokens: 65536 },
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Context Manager
|
|
69
|
+
* Manages context window configuration for all models
|
|
70
|
+
*/
|
|
71
|
+
export class ContextManager {
|
|
72
|
+
config;
|
|
73
|
+
configPath;
|
|
74
|
+
static instance = null;
|
|
75
|
+
constructor() {
|
|
76
|
+
this.configPath = join(getAgentDir(), "context-config.json");
|
|
77
|
+
this.config = this.loadConfig();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get the singleton instance
|
|
81
|
+
*/
|
|
82
|
+
static getInstance() {
|
|
83
|
+
if (!ContextManager.instance) {
|
|
84
|
+
ContextManager.instance = new ContextManager();
|
|
85
|
+
}
|
|
86
|
+
return ContextManager.instance;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Load configuration from file
|
|
90
|
+
*/
|
|
91
|
+
loadConfig() {
|
|
92
|
+
try {
|
|
93
|
+
if (existsSync(this.configPath)) {
|
|
94
|
+
const content = readFileSync(this.configPath, "utf-8");
|
|
95
|
+
const loaded = JSON.parse(content);
|
|
96
|
+
return { ...DEFAULT_CONFIG, ...loaded };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error("Failed to load context config:", error);
|
|
101
|
+
}
|
|
102
|
+
return { ...DEFAULT_CONFIG };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Save configuration to file
|
|
106
|
+
*/
|
|
107
|
+
saveConfig() {
|
|
108
|
+
try {
|
|
109
|
+
const agentDir = getAgentDir();
|
|
110
|
+
if (!existsSync(agentDir)) {
|
|
111
|
+
const { mkdirSync } = require("fs");
|
|
112
|
+
mkdirSync(agentDir, { recursive: true });
|
|
113
|
+
}
|
|
114
|
+
writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error("Failed to save context config:", error);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get current configuration
|
|
122
|
+
*/
|
|
123
|
+
getConfig() {
|
|
124
|
+
return { ...this.config };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Update configuration
|
|
128
|
+
*/
|
|
129
|
+
updateConfig(updates) {
|
|
130
|
+
this.config = { ...this.config, ...updates };
|
|
131
|
+
this.saveConfig();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get context configuration for a model
|
|
135
|
+
*/
|
|
136
|
+
getContextForModel(modelId) {
|
|
137
|
+
// Check model overrides first
|
|
138
|
+
if (this.config.modelOverrides?.[modelId]) {
|
|
139
|
+
return this.config.modelOverrides[modelId];
|
|
140
|
+
}
|
|
141
|
+
// Check known models
|
|
142
|
+
const normalizedId = modelId.toLowerCase();
|
|
143
|
+
for (const [pattern, config] of Object.entries(LARGE_CONTEXT_MODELS)) {
|
|
144
|
+
if (normalizedId.includes(pattern.toLowerCase()) || pattern.toLowerCase().includes(normalizedId)) {
|
|
145
|
+
return config;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Check provider defaults
|
|
149
|
+
for (const provider of this.config.providers) {
|
|
150
|
+
if (provider.models?.[modelId]) {
|
|
151
|
+
return provider.models[modelId];
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Return default large context
|
|
155
|
+
return {
|
|
156
|
+
contextWindow: this.config.defaultContextWindow,
|
|
157
|
+
maxTokens: this.config.defaultMaxTokens,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Set context configuration for a specific model
|
|
162
|
+
*/
|
|
163
|
+
setContextForModel(modelId, config) {
|
|
164
|
+
if (!this.config.modelOverrides) {
|
|
165
|
+
this.config.modelOverrides = {};
|
|
166
|
+
}
|
|
167
|
+
this.config.modelOverrides[modelId] = config;
|
|
168
|
+
this.saveConfig();
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Register a provider with context configuration
|
|
172
|
+
*/
|
|
173
|
+
registerProvider(providerConfig) {
|
|
174
|
+
const existingIndex = this.config.providers.findIndex((p) => p.provider === providerConfig.provider);
|
|
175
|
+
if (existingIndex >= 0) {
|
|
176
|
+
this.config.providers[existingIndex] = providerConfig;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
this.config.providers.push(providerConfig);
|
|
180
|
+
}
|
|
181
|
+
this.saveConfig();
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Enhance a model with context configuration
|
|
185
|
+
* This is the main entry point for the third-party architecture
|
|
186
|
+
*/
|
|
187
|
+
enhanceModel(model) {
|
|
188
|
+
if (!this.config.enabled) {
|
|
189
|
+
return model;
|
|
190
|
+
}
|
|
191
|
+
const contextConfig = this.getContextForModel(model.id);
|
|
192
|
+
return {
|
|
193
|
+
...model,
|
|
194
|
+
contextWindow: contextConfig.contextWindow,
|
|
195
|
+
maxTokens: contextConfig.maxTokens,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Calculate optimal chunk size based on context window
|
|
200
|
+
*/
|
|
201
|
+
calculateChunkSize(contextWindow) {
|
|
202
|
+
// Aim for 10% of context window as chunk size
|
|
203
|
+
// But cap at 32K tokens for efficiency
|
|
204
|
+
const targetChunkSize = Math.floor(contextWindow * 0.1);
|
|
205
|
+
return Math.min(targetChunkSize, 32768);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get context stats
|
|
209
|
+
*/
|
|
210
|
+
getStats(tokensUsed, modelId) {
|
|
211
|
+
const config = this.getContextForModel(modelId);
|
|
212
|
+
const utilization = (tokensUsed / config.contextWindow) * 100;
|
|
213
|
+
return {
|
|
214
|
+
tokensUsed,
|
|
215
|
+
contextWindow: config.contextWindow,
|
|
216
|
+
utilization: Math.min(utilization, 100),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Check if model supports large context
|
|
221
|
+
*/
|
|
222
|
+
isLargeContextModel(modelId) {
|
|
223
|
+
const config = this.getContextForModel(modelId);
|
|
224
|
+
return config.contextWindow >= 100000;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get recommended settings for a model
|
|
228
|
+
*/
|
|
229
|
+
getRecommendedSettings(modelId) {
|
|
230
|
+
const config = this.getContextForModel(modelId);
|
|
231
|
+
const chunkSize = this.calculateChunkSize(config.contextWindow);
|
|
232
|
+
return {
|
|
233
|
+
contextWindow: config.contextWindow,
|
|
234
|
+
maxTokens: config.maxTokens,
|
|
235
|
+
chunkSize,
|
|
236
|
+
enableChunking: config.enableChunking ?? config.contextWindow >= 200000,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Context middleware for request interception
|
|
242
|
+
*/
|
|
243
|
+
export class ContextMiddleware {
|
|
244
|
+
manager;
|
|
245
|
+
constructor() {
|
|
246
|
+
this.manager = ContextManager.getInstance();
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Process context before sending to API
|
|
250
|
+
*/
|
|
251
|
+
processContext(messages, modelId) {
|
|
252
|
+
const config = this.manager.getContextForModel(modelId);
|
|
253
|
+
// Estimate token count (rough estimation: 1 token ≈ 4 characters)
|
|
254
|
+
const messageStr = JSON.stringify(messages);
|
|
255
|
+
const estimatedTokens = Math.ceil(messageStr.length / 4);
|
|
256
|
+
// Check if truncation is needed
|
|
257
|
+
const truncated = estimatedTokens > config.contextWindow;
|
|
258
|
+
return {
|
|
259
|
+
messages,
|
|
260
|
+
truncated,
|
|
261
|
+
originalTokens: estimatedTokens,
|
|
262
|
+
contextWindow: config.contextWindow,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Initialize the context manager with default configuration
|
|
268
|
+
*/
|
|
269
|
+
export function initializeContextManager() {
|
|
270
|
+
const manager = ContextManager.getInstance();
|
|
271
|
+
// Register default providers with large context support
|
|
272
|
+
manager.registerProvider({
|
|
273
|
+
provider: "google",
|
|
274
|
+
defaultContext: {
|
|
275
|
+
contextWindow: 1000000,
|
|
276
|
+
maxTokens: 8192,
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
manager.registerProvider({
|
|
280
|
+
provider: "anthropic",
|
|
281
|
+
defaultContext: {
|
|
282
|
+
contextWindow: 200000,
|
|
283
|
+
maxTokens: 16384,
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
manager.registerProvider({
|
|
287
|
+
provider: "openai",
|
|
288
|
+
defaultContext: {
|
|
289
|
+
contextWindow: 128000,
|
|
290
|
+
maxTokens: 16384,
|
|
291
|
+
},
|
|
292
|
+
});
|
|
293
|
+
manager.registerProvider({
|
|
294
|
+
provider: "deepseek",
|
|
295
|
+
defaultContext: {
|
|
296
|
+
contextWindow: 64000,
|
|
297
|
+
maxTokens: 8192,
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
manager.registerProvider({
|
|
301
|
+
provider: "qwen",
|
|
302
|
+
defaultContext: {
|
|
303
|
+
contextWindow: 131072,
|
|
304
|
+
maxTokens: 8192,
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
return manager;
|
|
308
|
+
}
|
|
309
|
+
// Export singleton getter
|
|
310
|
+
export const getContextManager = () => ContextManager.getInstance();
|
|
311
|
+
//# sourceMappingURL=context-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/core/context-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Manager - Independent Architecture for Large Context Support\n * Provides 1M context window support through a third-party architecture\n * Works transparently with all models without modifying prompts\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { getAgentDir } from \"../config.js\";\n\n/**\n * Context configuration for models\n */\nexport interface ContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\t/** Whether to enable chunking for large contexts */\n\tenableChunking?: boolean;\n\t/** Chunk size for processing (default: auto-calculated) */\n\tchunkSize?: number;\n\t/** Overlap between chunks (default: 2000 tokens) */\n\tchunkOverlap?: number;\n\t/** Enable context caching */\n\tenableCaching?: boolean;\n\t/** Cache TTL in seconds */\n\tcacheTTL?: number;\n}\n\n/**\n * Provider-level context configuration\n */\nexport interface ProviderContextConfig {\n\t/** Provider name */\n\tprovider: string;\n\t/** Base URL override */\n\tbaseUrl?: string;\n\t/** Default context for all models under this provider */\n\tdefaultContext?: Partial<ContextConfig>;\n\t/** Per-model context overrides */\n\tmodels?: Record<string, ContextConfig>;\n}\n\n/**\n * Global context configuration\n */\nexport interface GlobalContextConfig {\n\t/** Enable large context support globally */\n\tenabled: boolean;\n\t/** Default context window (used when model doesn't specify) */\n\tdefaultContextWindow: number;\n\t/** Default max output tokens */\n\tdefaultMaxTokens: number;\n\t/** Provider configurations */\n\tproviders: ProviderContextConfig[];\n\t/** Model-specific overrides */\n\tmodelOverrides?: Record<string, ContextConfig>;\n}\n\n/**\n * Context stats for monitoring\n */\nexport interface ContextStats {\n\t/** Total context tokens used */\n\ttokensUsed: number;\n\t/** Context window size */\n\tcontextWindow: number;\n\t/** Utilization percentage */\n\tutilization: number;\n\t/** Number of chunks processed */\n\tchunksProcessed?: number;\n\t/** Cache hit rate */\n\tcacheHitRate?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: GlobalContextConfig = {\n\tenabled: true,\n\tdefaultContextWindow: 1000000, // 1M tokens\n\tdefaultMaxTokens: 65536,\n\tproviders: [],\n};\n\n/**\n * Known large context models with their configurations\n */\nexport const LARGE_CONTEXT_MODELS: Record<string, ContextConfig> = {\n\t// OpenAI\n\t\"gpt-4-turbo\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"gpt-4-turbo-preview\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"gpt-4o\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"gpt-4o-mini\": { contextWindow: 128000, maxTokens: 16384 },\n\n\t// Anthropic\n\t\"claude-3-opus\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-sonnet\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-haiku\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-5-sonnet\": { contextWindow: 200000, maxTokens: 8192 },\n\t\"claude-3-5-haiku\": { contextWindow: 200000, maxTokens: 8192 },\n\t\"claude-sonnet-4\": { contextWindow: 200000, maxTokens: 16384 },\n\n\t// Google\n\t\"gemini-1.5-pro\": { contextWindow: 1000000, maxTokens: 8192 },\n\t\"gemini-1.5-flash\": { contextWindow: 1000000, maxTokens: 8192 },\n\t\"gemini-2.0-flash\": { contextWindow: 1000000, maxTokens: 8192 },\n\n\t// DeepSeek\n\t\"deepseek-chat\": { contextWindow: 64000, maxTokens: 4096 },\n\t\"deepseek-coder\": { contextWindow: 64000, maxTokens: 4096 },\n\t\"deepseek-reasoner\": { contextWindow: 64000, maxTokens: 8192 },\n\n\t// Mistral\n\t\"mistral-large\": { contextWindow: 128000, maxTokens: 8192 },\n\t\"mistral-medium\": { contextWindow: 32000, maxTokens: 8192 },\n\n\t// Meta Llama\n\t\"llama-3.1-405b\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"llama-3.1-70b\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"llama-3.1-8b\": { contextWindow: 128000, maxTokens: 16384 },\n\n\t// Qwen\n\t\"qwen-2.5-72b\": { contextWindow: 131072, maxTokens: 8192 },\n\t\"qwen-2.5-32b\": { contextWindow: 131072, maxTokens: 8192 },\n\t\"qwen-max\": { contextWindow: 1000000, maxTokens: 65536 },\n\n\t// Moonshot (Kimi)\n\t\"moonshot-v1-8k\": { contextWindow: 8192, maxTokens: 4096 },\n\t\"moonshot-v1-32k\": { contextWindow: 32768, maxTokens: 4096 },\n\t\"moonshot-v1-128k\": { contextWindow: 131072, maxTokens: 4096 },\n\n\t// Yi\n\t\"yi-lightning\": { contextWindow: 16384, maxTokens: 4096 },\n\t\"yi-large\": { contextWindow: 32768, maxTokens: 4096 },\n\t\"yi-large-turbo\": { contextWindow: 16384, maxTokens: 4096 },\n\n\t// GLM\n\t\"glm-4\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"glm-4-plus\": { contextWindow: 128000, maxTokens: 4096 },\n\n\t// Default large context for unknown models\n\t\"default-large\": { contextWindow: 1000000, maxTokens: 65536 },\n};\n\n/**\n * Context Manager\n * Manages context window configuration for all models\n */\nexport class ContextManager {\n\tprivate config: GlobalContextConfig;\n\tprivate configPath: string;\n\tprivate static instance: ContextManager | null = null;\n\n\tprivate constructor() {\n\t\tthis.configPath = join(getAgentDir(), \"context-config.json\");\n\t\tthis.config = this.loadConfig();\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextManager {\n\t\tif (!ContextManager.instance) {\n\t\t\tContextManager.instance = new ContextManager();\n\t\t}\n\t\treturn ContextManager.instance;\n\t}\n\n\t/**\n\t * Load configuration from file\n\t */\n\tprivate loadConfig(): GlobalContextConfig {\n\t\ttry {\n\t\t\tif (existsSync(this.configPath)) {\n\t\t\t\tconst content = readFileSync(this.configPath, \"utf-8\");\n\t\t\t\tconst loaded = JSON.parse(content) as Partial<GlobalContextConfig>;\n\t\t\t\treturn { ...DEFAULT_CONFIG, ...loaded };\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to load context config:\", error);\n\t\t}\n\t\treturn { ...DEFAULT_CONFIG };\n\t}\n\n\t/**\n\t * Save configuration to file\n\t */\n\tsaveConfig(): void {\n\t\ttry {\n\t\t\tconst agentDir = getAgentDir();\n\t\t\tif (!existsSync(agentDir)) {\n\t\t\t\tconst { mkdirSync } = require(\"fs\");\n\t\t\t\tmkdirSync(agentDir, { recursive: true });\n\t\t\t}\n\t\t\twriteFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to save context config:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Get current configuration\n\t */\n\tgetConfig(): GlobalContextConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Update configuration\n\t */\n\tupdateConfig(updates: Partial<GlobalContextConfig>): void {\n\t\tthis.config = { ...this.config, ...updates };\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Get context configuration for a model\n\t */\n\tgetContextForModel(modelId: string): ContextConfig {\n\t\t// Check model overrides first\n\t\tif (this.config.modelOverrides?.[modelId]) {\n\t\t\treturn this.config.modelOverrides[modelId];\n\t\t}\n\n\t\t// Check known models\n\t\tconst normalizedId = modelId.toLowerCase();\n\t\tfor (const [pattern, config] of Object.entries(LARGE_CONTEXT_MODELS)) {\n\t\t\tif (normalizedId.includes(pattern.toLowerCase()) || pattern.toLowerCase().includes(normalizedId)) {\n\t\t\t\treturn config;\n\t\t\t}\n\t\t}\n\n\t\t// Check provider defaults\n\t\tfor (const provider of this.config.providers) {\n\t\t\tif (provider.models?.[modelId]) {\n\t\t\t\treturn provider.models[modelId];\n\t\t\t}\n\t\t}\n\n\t\t// Return default large context\n\t\treturn {\n\t\t\tcontextWindow: this.config.defaultContextWindow,\n\t\t\tmaxTokens: this.config.defaultMaxTokens,\n\t\t};\n\t}\n\n\t/**\n\t * Set context configuration for a specific model\n\t */\n\tsetContextForModel(modelId: string, config: ContextConfig): void {\n\t\tif (!this.config.modelOverrides) {\n\t\t\tthis.config.modelOverrides = {};\n\t\t}\n\t\tthis.config.modelOverrides[modelId] = config;\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Register a provider with context configuration\n\t */\n\tregisterProvider(providerConfig: ProviderContextConfig): void {\n\t\tconst existingIndex = this.config.providers.findIndex((p) => p.provider === providerConfig.provider);\n\t\tif (existingIndex >= 0) {\n\t\t\tthis.config.providers[existingIndex] = providerConfig;\n\t\t} else {\n\t\t\tthis.config.providers.push(providerConfig);\n\t\t}\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): Model<API> {\n\t\tif (!this.config.enabled) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst contextConfig = this.getContextForModel(model.id);\n\n\t\treturn {\n\t\t\t...model,\n\t\t\tcontextWindow: contextConfig.contextWindow,\n\t\t\tmaxTokens: contextConfig.maxTokens,\n\t\t};\n\t}\n\n\t/**\n\t * Calculate optimal chunk size based on context window\n\t */\n\tcalculateChunkSize(contextWindow: number): number {\n\t\t// Aim for 10% of context window as chunk size\n\t\t// But cap at 32K tokens for efficiency\n\t\tconst targetChunkSize = Math.floor(contextWindow * 0.1);\n\t\treturn Math.min(targetChunkSize, 32768);\n\t}\n\n\t/**\n\t * Get context stats\n\t */\n\tgetStats(tokensUsed: number, modelId: string): ContextStats {\n\t\tconst config = this.getContextForModel(modelId);\n\t\tconst utilization = (tokensUsed / config.contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokensUsed,\n\t\t\tcontextWindow: config.contextWindow,\n\t\t\tutilization: Math.min(utilization, 100),\n\t\t};\n\t}\n\n\t/**\n\t * Check if model supports large context\n\t */\n\tisLargeContextModel(modelId: string): boolean {\n\t\tconst config = this.getContextForModel(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Get recommended settings for a model\n\t */\n\tgetRecommendedSettings(modelId: string): {\n\t\tcontextWindow: number;\n\t\tmaxTokens: number;\n\t\tchunkSize: number;\n\t\tenableChunking: boolean;\n\t} {\n\t\tconst config = this.getContextForModel(modelId);\n\t\tconst chunkSize = this.calculateChunkSize(config.contextWindow);\n\n\t\treturn {\n\t\t\tcontextWindow: config.contextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t\tchunkSize,\n\t\t\tenableChunking: config.enableChunking ?? config.contextWindow >= 200000,\n\t\t};\n\t}\n}\n\n/**\n * Context middleware for request interception\n */\nexport class ContextMiddleware {\n\tprivate manager: ContextManager;\n\n\tconstructor() {\n\t\tthis.manager = ContextManager.getInstance();\n\t}\n\n\t/**\n\t * Process context before sending to API\n\t */\n\tprocessContext(messages: unknown[], modelId: string): {\n\t\tmessages: unknown[];\n\t\ttruncated: boolean;\n\t\toriginalTokens: number;\n\t\tcontextWindow: number;\n\t} {\n\t\tconst config = this.manager.getContextForModel(modelId);\n\n\t\t// Estimate token count (rough estimation: 1 token ≈ 4 characters)\n\t\tconst messageStr = JSON.stringify(messages);\n\t\tconst estimatedTokens = Math.ceil(messageStr.length / 4);\n\n\t\t// Check if truncation is needed\n\t\tconst truncated = estimatedTokens > config.contextWindow;\n\n\t\treturn {\n\t\t\tmessages,\n\t\t\ttruncated,\n\t\t\toriginalTokens: estimatedTokens,\n\t\t\tcontextWindow: config.contextWindow,\n\t\t};\n\t}\n}\n\n/**\n * Initialize the context manager with default configuration\n */\nexport function initializeContextManager(): ContextManager {\n\tconst manager = ContextManager.getInstance();\n\n\t// Register default providers with large context support\n\tmanager.registerProvider({\n\t\tprovider: \"google\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"anthropic\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 200000,\n\t\t\tmaxTokens: 16384,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"openai\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 128000,\n\t\t\tmaxTokens: 16384,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"deepseek\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 64000,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"qwen\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 131072,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\treturn manager;\n}\n\n// Export singleton getter\nexport const getContextManager = () => ContextManager.getInstance();\n"]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Provider Interface
|
|
3
|
+
* Defines the contract for context providers in the third-party architecture
|
|
4
|
+
*/
|
|
5
|
+
import type { Api, Model } from "@mariozechner/pi-ai";
|
|
6
|
+
/**
|
|
7
|
+
* Context provider interface
|
|
8
|
+
* Third-party implementations should implement this interface
|
|
9
|
+
*/
|
|
10
|
+
export interface IContextProvider {
|
|
11
|
+
/** Provider name */
|
|
12
|
+
readonly name: string;
|
|
13
|
+
/** Provider version */
|
|
14
|
+
readonly version: string;
|
|
15
|
+
/**
|
|
16
|
+
* Check if this provider supports a given model
|
|
17
|
+
*/
|
|
18
|
+
supportsModel(modelId: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Get context window for a model
|
|
21
|
+
*/
|
|
22
|
+
getContextWindow(modelId: string): number;
|
|
23
|
+
/**
|
|
24
|
+
* Get max output tokens for a model
|
|
25
|
+
*/
|
|
26
|
+
getMaxTokens(modelId: string): number;
|
|
27
|
+
/**
|
|
28
|
+
* Get full context configuration for a model
|
|
29
|
+
*/
|
|
30
|
+
getContextConfig(modelId: string): IModelContextConfig;
|
|
31
|
+
/**
|
|
32
|
+
* Process messages before sending to API
|
|
33
|
+
* Returns processed messages and metadata
|
|
34
|
+
*/
|
|
35
|
+
processMessages?(messages: unknown[], modelId: string): IProcessedContext;
|
|
36
|
+
/**
|
|
37
|
+
* Handle context overflow
|
|
38
|
+
* Called when context exceeds the window
|
|
39
|
+
*/
|
|
40
|
+
handleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Model context configuration
|
|
44
|
+
*/
|
|
45
|
+
export interface IModelContextConfig {
|
|
46
|
+
/** Context window size in tokens */
|
|
47
|
+
contextWindow: number;
|
|
48
|
+
/** Maximum output tokens */
|
|
49
|
+
maxTokens: number;
|
|
50
|
+
/** Supports streaming */
|
|
51
|
+
supportsStreaming: boolean;
|
|
52
|
+
/** Supports vision/image input */
|
|
53
|
+
supportsVision: boolean;
|
|
54
|
+
/** Supports function calling */
|
|
55
|
+
supportsFunctions: boolean;
|
|
56
|
+
/** Custom model-specific settings */
|
|
57
|
+
customSettings?: Record<string, unknown>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Processed context result
|
|
61
|
+
*/
|
|
62
|
+
export interface IProcessedContext {
|
|
63
|
+
/** Processed messages */
|
|
64
|
+
messages: unknown[];
|
|
65
|
+
/** Token count */
|
|
66
|
+
tokenCount: number;
|
|
67
|
+
/** Whether context was modified */
|
|
68
|
+
modified: boolean;
|
|
69
|
+
/** Processing metadata */
|
|
70
|
+
metadata?: {
|
|
71
|
+
chunksUsed?: number;
|
|
72
|
+
cacheHits?: number;
|
|
73
|
+
truncated?: boolean;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Overflow handling result
|
|
78
|
+
*/
|
|
79
|
+
export interface IOverflowResult {
|
|
80
|
+
/** Action to take */
|
|
81
|
+
action: "truncate" | "summarize" | "chunk" | "reject";
|
|
82
|
+
/** Processed messages (if action is truncate/summarize/chunk) */
|
|
83
|
+
messages?: unknown[];
|
|
84
|
+
/** Error message (if action is reject) */
|
|
85
|
+
error?: string;
|
|
86
|
+
/** Additional metadata */
|
|
87
|
+
metadata?: Record<string, unknown>;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Context provider registry
|
|
91
|
+
* Manages multiple context providers
|
|
92
|
+
*/
|
|
93
|
+
export interface IContextProviderRegistry {
|
|
94
|
+
/**
|
|
95
|
+
* Register a context provider
|
|
96
|
+
*/
|
|
97
|
+
register(provider: IContextProvider): void;
|
|
98
|
+
/**
|
|
99
|
+
* Unregister a context provider
|
|
100
|
+
*/
|
|
101
|
+
unregister(name: string): void;
|
|
102
|
+
/**
|
|
103
|
+
* Get a provider by name
|
|
104
|
+
*/
|
|
105
|
+
get(name: string): IContextProvider | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Get all registered providers
|
|
108
|
+
*/
|
|
109
|
+
getAll(): IContextProvider[];
|
|
110
|
+
/**
|
|
111
|
+
* Find the best provider for a model
|
|
112
|
+
*/
|
|
113
|
+
findProvider(modelId: string): IContextProvider | undefined;
|
|
114
|
+
/**
|
|
115
|
+
* Get context configuration from any provider
|
|
116
|
+
*/
|
|
117
|
+
getContextConfig(modelId: string): IModelContextConfig;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Context enhancement result
|
|
121
|
+
*/
|
|
122
|
+
export interface IContextEnhancement<API extends Api> {
|
|
123
|
+
/** Enhanced model */
|
|
124
|
+
model: Model<API>;
|
|
125
|
+
/** Provider that enhanced the model */
|
|
126
|
+
provider: IContextProvider;
|
|
127
|
+
/** Enhancement metadata */
|
|
128
|
+
metadata: {
|
|
129
|
+
originalContextWindow: number;
|
|
130
|
+
enhancedContextWindow: number;
|
|
131
|
+
enhanced: boolean;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=context-provider-interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-provider-interface.d.ts","sourceRoot":"","sources":["../../src/core/context-provider-interface.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Provider Interface\n * Defines the contract for context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\n\n/**\n * Context provider interface\n * Third-party implementations should implement this interface\n */\nexport interface IContextProvider {\n\t/** Provider name */\n\treadonly name: string;\n\n\t/** Provider version */\n\treadonly version: string;\n\n\t/**\n\t * Check if this provider supports a given model\n\t */\n\tsupportsModel(modelId: string): boolean;\n\n\t/**\n\t * Get context window for a model\n\t */\n\tgetContextWindow(modelId: string): number;\n\n\t/**\n\t * Get max output tokens for a model\n\t */\n\tgetMaxTokens(modelId: string): number;\n\n\t/**\n\t * Get full context configuration for a model\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n\n\t/**\n\t * Process messages before sending to API\n\t * Returns processed messages and metadata\n\t */\n\tprocessMessages?(messages: unknown[], modelId: string): IProcessedContext;\n\n\t/**\n\t * Handle context overflow\n\t * Called when context exceeds the window\n\t */\n\thandleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;\n}\n\n/**\n * Model context configuration\n */\nexport interface IModelContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\n\t/** Supports streaming */\n\tsupportsStreaming: boolean;\n\n\t/** Supports vision/image input */\n\tsupportsVision: boolean;\n\n\t/** Supports function calling */\n\tsupportsFunctions: boolean;\n\n\t/** Custom model-specific settings */\n\tcustomSettings?: Record<string, unknown>;\n}\n\n/**\n * Processed context result\n */\nexport interface IProcessedContext {\n\t/** Processed messages */\n\tmessages: unknown[];\n\n\t/** Token count */\n\ttokenCount: number;\n\n\t/** Whether context was modified */\n\tmodified: boolean;\n\n\t/** Processing metadata */\n\tmetadata?: {\n\t\tchunksUsed?: number;\n\t\tcacheHits?: number;\n\t\ttruncated?: boolean;\n\t};\n}\n\n/**\n * Overflow handling result\n */\nexport interface IOverflowResult {\n\t/** Action to take */\n\taction: \"truncate\" | \"summarize\" | \"chunk\" | \"reject\";\n\n\t/** Processed messages (if action is truncate/summarize/chunk) */\n\tmessages?: unknown[];\n\n\t/** Error message (if action is reject) */\n\terror?: string;\n\n\t/** Additional metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Context provider registry\n * Manages multiple context providers\n */\nexport interface IContextProviderRegistry {\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void;\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void;\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined;\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[];\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined;\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n}\n\n/**\n * Context enhancement result\n */\nexport interface IContextEnhancement<API extends Api> {\n\t/** Enhanced model */\n\tmodel: Model<API>;\n\n\t/** Provider that enhanced the model */\n\tprovider: IContextProvider;\n\n\t/** Enhancement metadata */\n\tmetadata: {\n\t\toriginalContextWindow: number;\n\t\tenhancedContextWindow: number;\n\t\tenhanced: boolean;\n\t};\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-provider-interface.js","sourceRoot":"","sources":["../../src/core/context-provider-interface.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * Context Provider Interface\n * Defines the contract for context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\n\n/**\n * Context provider interface\n * Third-party implementations should implement this interface\n */\nexport interface IContextProvider {\n\t/** Provider name */\n\treadonly name: string;\n\n\t/** Provider version */\n\treadonly version: string;\n\n\t/**\n\t * Check if this provider supports a given model\n\t */\n\tsupportsModel(modelId: string): boolean;\n\n\t/**\n\t * Get context window for a model\n\t */\n\tgetContextWindow(modelId: string): number;\n\n\t/**\n\t * Get max output tokens for a model\n\t */\n\tgetMaxTokens(modelId: string): number;\n\n\t/**\n\t * Get full context configuration for a model\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n\n\t/**\n\t * Process messages before sending to API\n\t * Returns processed messages and metadata\n\t */\n\tprocessMessages?(messages: unknown[], modelId: string): IProcessedContext;\n\n\t/**\n\t * Handle context overflow\n\t * Called when context exceeds the window\n\t */\n\thandleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;\n}\n\n/**\n * Model context configuration\n */\nexport interface IModelContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\n\t/** Supports streaming */\n\tsupportsStreaming: boolean;\n\n\t/** Supports vision/image input */\n\tsupportsVision: boolean;\n\n\t/** Supports function calling */\n\tsupportsFunctions: boolean;\n\n\t/** Custom model-specific settings */\n\tcustomSettings?: Record<string, unknown>;\n}\n\n/**\n * Processed context result\n */\nexport interface IProcessedContext {\n\t/** Processed messages */\n\tmessages: unknown[];\n\n\t/** Token count */\n\ttokenCount: number;\n\n\t/** Whether context was modified */\n\tmodified: boolean;\n\n\t/** Processing metadata */\n\tmetadata?: {\n\t\tchunksUsed?: number;\n\t\tcacheHits?: number;\n\t\ttruncated?: boolean;\n\t};\n}\n\n/**\n * Overflow handling result\n */\nexport interface IOverflowResult {\n\t/** Action to take */\n\taction: \"truncate\" | \"summarize\" | \"chunk\" | \"reject\";\n\n\t/** Processed messages (if action is truncate/summarize/chunk) */\n\tmessages?: unknown[];\n\n\t/** Error message (if action is reject) */\n\terror?: string;\n\n\t/** Additional metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Context provider registry\n * Manages multiple context providers\n */\nexport interface IContextProviderRegistry {\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void;\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void;\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined;\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[];\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined;\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n}\n\n/**\n * Context enhancement result\n */\nexport interface IContextEnhancement<API extends Api> {\n\t/** Enhanced model */\n\tmodel: Model<API>;\n\n\t/** Provider that enhanced the model */\n\tprovider: IContextProvider;\n\n\t/** Enhancement metadata */\n\tmetadata: {\n\t\toriginalContextWindow: number;\n\t\tenhancedContextWindow: number;\n\t\tenhanced: boolean;\n\t};\n}\n"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Provider Registry
|
|
3
|
+
* Central registry for managing context providers in the third-party architecture
|
|
4
|
+
*/
|
|
5
|
+
import type { Api, Model } from "@mariozechner/pi-ai";
|
|
6
|
+
import type { IContextProvider, IContextProviderRegistry, IContextEnhancement, IModelContextConfig } from "./context-provider-interface.js";
|
|
7
|
+
/**
|
|
8
|
+
* Context Provider Registry Implementation
|
|
9
|
+
* Manages multiple context providers and routes requests to the appropriate one
|
|
10
|
+
*/
|
|
11
|
+
export declare class ContextProviderRegistry implements IContextProviderRegistry {
|
|
12
|
+
private providers;
|
|
13
|
+
private defaultProvider;
|
|
14
|
+
private static instance;
|
|
15
|
+
private constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Get the singleton instance
|
|
18
|
+
*/
|
|
19
|
+
static getInstance(): ContextProviderRegistry;
|
|
20
|
+
/**
|
|
21
|
+
* Register a context provider
|
|
22
|
+
*/
|
|
23
|
+
register(provider: IContextProvider): void;
|
|
24
|
+
/**
|
|
25
|
+
* Unregister a context provider
|
|
26
|
+
*/
|
|
27
|
+
unregister(name: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Get a provider by name
|
|
30
|
+
*/
|
|
31
|
+
get(name: string): IContextProvider | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Get all registered providers
|
|
34
|
+
*/
|
|
35
|
+
getAll(): IContextProvider[];
|
|
36
|
+
/**
|
|
37
|
+
* Find the best provider for a model
|
|
38
|
+
*/
|
|
39
|
+
findProvider(modelId: string): IContextProvider | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Get context configuration from any provider
|
|
42
|
+
*/
|
|
43
|
+
getContextConfig(modelId: string): IModelContextConfig;
|
|
44
|
+
/**
|
|
45
|
+
* Enhance a model with context configuration
|
|
46
|
+
* This is the main entry point for the third-party architecture
|
|
47
|
+
*/
|
|
48
|
+
enhanceModel<API extends Api>(model: Model<API>): IContextEnhancement<API>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if a model has large context support
|
|
51
|
+
*/
|
|
52
|
+
hasLargeContext(modelId: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Check if a model has 1M context
|
|
55
|
+
*/
|
|
56
|
+
hasMillionContext(modelId: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get all models with 1M context
|
|
59
|
+
*/
|
|
60
|
+
getMillionContextModels(): string[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Singleton getter
|
|
64
|
+
*/
|
|
65
|
+
export declare const getContextProviderRegistry: () => ContextProviderRegistry;
|
|
66
|
+
/**
|
|
67
|
+
* Convenience function to enhance a model with context configuration
|
|
68
|
+
*/
|
|
69
|
+
export declare function enhanceModelContext<API extends Api>(model: Model<API>): Model<API>;
|
|
70
|
+
/**
|
|
71
|
+
* Convenience function to get context configuration for a model
|
|
72
|
+
*/
|
|
73
|
+
export declare function getModelContextConfig(modelId: string): IModelContextConfig;
|
|
74
|
+
/**
|
|
75
|
+
* Initialize the context provider registry
|
|
76
|
+
*/
|
|
77
|
+
export declare function initializeContextProviders(): ContextProviderRegistry;
|
|
78
|
+
//# sourceMappingURL=context-provider-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-provider-registry.d.ts","sourceRoot":"","sources":["../../src/core/context-provider-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EACX,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,MAAM,iCAAiC,CAAC;AAGzC;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,wBAAwB;IACvE,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwC;IAE/D,OAAO,eAIN;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,uBAAuB,CAK5C;IAED;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAEzC;IAED;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM7B;IAED;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE9C;IAED;;OAEG;IACH,MAAM,IAAI,gBAAgB,EAAE,CAE3B;IAED;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAW1D;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAcrD;IAED;;;OAGG;IACH,YAAY,CAAC,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAsBzE;IAED;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGxC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1C;IAED;;OAEG;IACH,uBAAuB,IAAI,MAAM,EAAE,CAWlC;CACD;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,+BAA8C,CAAC;AAEtF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAIlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAG1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,uBAAuB,CAEpE","sourcesContent":["/**\n * Context Provider Registry\n * Central registry for managing context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport type {\n\tIContextProvider,\n\tIContextProviderRegistry,\n\tIContextEnhancement,\n\tIModelContextConfig,\n} from \"./context-provider-interface.js\";\nimport { getLargeContextProvider, LargeContextProvider } from \"./large-context-provider.js\";\n\n/**\n * Context Provider Registry Implementation\n * Manages multiple context providers and routes requests to the appropriate one\n */\nexport class ContextProviderRegistry implements IContextProviderRegistry {\n\tprivate providers: Map<string, IContextProvider> = new Map();\n\tprivate defaultProvider: IContextProvider;\n\tprivate static instance: ContextProviderRegistry | null = null;\n\n\tprivate constructor() {\n\t\t// Register the large context provider as default\n\t\tthis.defaultProvider = getLargeContextProvider();\n\t\tthis.register(this.defaultProvider);\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextProviderRegistry {\n\t\tif (!ContextProviderRegistry.instance) {\n\t\t\tContextProviderRegistry.instance = new ContextProviderRegistry();\n\t\t}\n\t\treturn ContextProviderRegistry.instance;\n\t}\n\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void {\n\t\tthis.providers.set(provider.name, provider);\n\t}\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void {\n\t\tif (name === this.defaultProvider.name) {\n\t\t\tconsole.warn(`Cannot unregister default provider: ${name}`);\n\t\t\treturn;\n\t\t}\n\t\tthis.providers.delete(name);\n\t}\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined {\n\t\treturn this.providers.get(name);\n\t}\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[] {\n\t\treturn Array.from(this.providers.values());\n\t}\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined {\n\t\t// Check all providers for explicit support\n\t\tconst providers = Array.from(this.providers.values());\n\t\tfor (const provider of providers) {\n\t\t\tif (provider.supportsModel(modelId)) {\n\t\t\t\treturn provider;\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to default provider\n\t\treturn this.defaultProvider;\n\t}\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig {\n\t\tconst provider = this.findProvider(modelId);\n\t\tif (provider) {\n\t\t\treturn provider.getContextConfig(modelId);\n\t\t}\n\n\t\t// Default 1M context configuration\n\t\treturn {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 65536,\n\t\t\tsupportsStreaming: true,\n\t\t\tsupportsVision: true,\n\t\t\tsupportsFunctions: true,\n\t\t};\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): IContextEnhancement<API> {\n\t\tconst provider = this.findProvider(model.id);\n\t\tconst config = this.getContextConfig(model.id);\n\n\t\tconst originalContextWindow = model.contextWindow ?? 0;\n\t\tconst enhancedContextWindow = config.contextWindow;\n\n\t\tconst enhancedModel: Model<API> = {\n\t\t\t...model,\n\t\t\tcontextWindow: enhancedContextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t};\n\n\t\treturn {\n\t\t\tmodel: enhancedModel,\n\t\t\tprovider: provider ?? this.defaultProvider,\n\t\t\tmetadata: {\n\t\t\t\toriginalContextWindow,\n\t\t\t\tenhancedContextWindow,\n\t\t\t\tenhanced: originalContextWindow !== enhancedContextWindow,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Check if a model has large context support\n\t */\n\thasLargeContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Check if a model has 1M context\n\t */\n\thasMillionContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 1000000;\n\t}\n\n\t/**\n\t * Get all models with 1M context\n\t */\n\tgetMillionContextModels(): string[] {\n\t\tconst models: string[] = [];\n\t\tconst providers = Array.from(this.providers.values());\n\n\t\tfor (const provider of providers) {\n\t\t\tif (provider instanceof LargeContextProvider) {\n\t\t\t\tmodels.push(...provider.getKnownModels().filter((id) => provider.isMillionContextModel(id)));\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(new Set(models));\n\t}\n}\n\n/**\n * Singleton getter\n */\nexport const getContextProviderRegistry = () => ContextProviderRegistry.getInstance();\n\n/**\n * Convenience function to enhance a model with context configuration\n */\nexport function enhanceModelContext<API extends Api>(model: Model<API>): Model<API> {\n\tconst registry = ContextProviderRegistry.getInstance();\n\tconst enhancement = registry.enhanceModel(model);\n\treturn enhancement.model;\n}\n\n/**\n * Convenience function to get context configuration for a model\n */\nexport function getModelContextConfig(modelId: string): IModelContextConfig {\n\tconst registry = ContextProviderRegistry.getInstance();\n\treturn registry.getContextConfig(modelId);\n}\n\n/**\n * Initialize the context provider registry\n */\nexport function initializeContextProviders(): ContextProviderRegistry {\n\treturn ContextProviderRegistry.getInstance();\n}\n"]}
|