@smilique/said 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +4 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +53 -10
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +5 -21
- package/dist/main.js.map +1 -1
- package/dist/provider.d.ts +67 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +271 -0
- package/dist/provider.js.map +1 -0
- package/dist/providers/index.d.ts +9 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +172 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/types.d.ts +17 -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/setup.js +58 -55
- package/dist/setup.js.map +1 -1
- package/package.json +1 -1
- package/README.md +0 -132
package/dist/config.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
export type ProviderType = 'openai' | 'anthropic' | 'ollama' | 'opencode' | 'minimax' | 'kimi' | 'zai' | 'openrouter' | 'google';
|
|
1
2
|
export interface AppConfig {
|
|
2
3
|
telegram?: {
|
|
3
4
|
botToken: string;
|
|
4
5
|
};
|
|
5
|
-
provider:
|
|
6
|
+
provider: ProviderType;
|
|
7
|
+
apiKey: string;
|
|
8
|
+
model: string;
|
|
6
9
|
opencode?: {
|
|
7
10
|
baseUrl: string;
|
|
8
11
|
apiKey: string;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,GACN,KAAK,GACL,YAAY,GACZ,QAAQ,CAAC;AAEb,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IAEd,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF;;;;;;OAMG;IACH,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,OAAO,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAID,wBAAgB,UAAU,IAAI,SAAS,CA4FtC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6ClD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
package/dist/config.js
CHANGED
|
@@ -16,26 +16,65 @@ export function loadConfig() {
|
|
|
16
16
|
if (existsSync(envPath)) {
|
|
17
17
|
loadEnv({ path: envPath });
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
// Migration: Check for old config format and convert if needed
|
|
20
|
+
let provider = process.env.SAID_PROVIDER || 'opencode';
|
|
21
|
+
let apiKey = process.env.SAID_API_KEY || '';
|
|
22
|
+
let model = process.env.SAID_MODEL || '';
|
|
23
|
+
// Check for old config format (provider: 'opencode'|'minimax' with separate configs)
|
|
24
|
+
const hasOldOpencodeConfig = process.env.OPENCODE_API_KEY;
|
|
25
|
+
const hasOldMinimaxConfig = process.env.MINIMAX_API_KEY;
|
|
26
|
+
const hasNewConfig = process.env.SAID_API_KEY;
|
|
27
|
+
// If old config exists and no new config, migrate to new format
|
|
28
|
+
if (!hasNewConfig) {
|
|
29
|
+
if (hasOldOpencodeConfig && !hasOldMinimaxConfig) {
|
|
30
|
+
// Migrate from opencode to new format
|
|
31
|
+
provider = 'opencode';
|
|
32
|
+
apiKey = process.env.OPENCODE_API_KEY || '';
|
|
33
|
+
model = process.env.OPENCODE_MODEL || 'minimax-m2.5-free';
|
|
34
|
+
}
|
|
35
|
+
else if (hasOldMinimaxConfig && !hasOldOpencodeConfig) {
|
|
36
|
+
// Migrate from minimax to new format
|
|
37
|
+
provider = 'minimax';
|
|
38
|
+
apiKey = process.env.MINIMAX_API_KEY || '';
|
|
39
|
+
model = process.env.MINIMAX_MODEL || 'MiniMax-Text-01';
|
|
40
|
+
}
|
|
41
|
+
else if (hasOldOpencodeConfig && hasOldMinimaxConfig) {
|
|
42
|
+
// Both exist - prefer the provider that was explicitly set
|
|
43
|
+
const explicitProvider = process.env.SAID_PROVIDER;
|
|
44
|
+
if (explicitProvider === 'minimax') {
|
|
45
|
+
provider = 'minimax';
|
|
46
|
+
apiKey = process.env.MINIMAX_API_KEY || '';
|
|
47
|
+
model = process.env.MINIMAX_MODEL || 'MiniMax-Text-01';
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
provider = 'opencode';
|
|
51
|
+
apiKey = process.env.OPENCODE_API_KEY || '';
|
|
52
|
+
model = process.env.OPENCODE_MODEL || 'minimax-m2.5-free';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
20
56
|
const config = {
|
|
21
57
|
provider,
|
|
58
|
+
apiKey,
|
|
59
|
+
model,
|
|
22
60
|
};
|
|
23
|
-
|
|
24
|
-
config.telegram = {
|
|
25
|
-
botToken: process.env.TELEGRAM_BOT_TOKEN,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
61
|
+
// Also populate legacy configs for backward compatibility
|
|
28
62
|
if (provider === 'opencode') {
|
|
29
63
|
config.opencode = {
|
|
30
64
|
baseUrl: process.env.OPENCODE_BASE_URL || 'https://opencode.ai/zen/v1',
|
|
31
|
-
apiKey:
|
|
32
|
-
model:
|
|
65
|
+
apiKey: apiKey,
|
|
66
|
+
model: model,
|
|
33
67
|
};
|
|
34
68
|
}
|
|
35
69
|
else if (provider === 'minimax') {
|
|
36
70
|
config.minimax = {
|
|
37
|
-
apiKey:
|
|
38
|
-
model:
|
|
71
|
+
apiKey: apiKey,
|
|
72
|
+
model: model,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (process.env.TELEGRAM_BOT_TOKEN) {
|
|
76
|
+
config.telegram = {
|
|
77
|
+
botToken: process.env.TELEGRAM_BOT_TOKEN,
|
|
39
78
|
};
|
|
40
79
|
}
|
|
41
80
|
// Auto-update enabled by default (unless explicitly disabled)
|
|
@@ -66,7 +105,11 @@ export function saveConfig(config) {
|
|
|
66
105
|
lines.push(`SAID_AUTO_UPDATE_AUTO_RESTART=${config.autoUpdate.autoRestart}`);
|
|
67
106
|
lines.push(`SAID_AUTO_UPDATE_PACKAGE=${config.autoUpdate.packageName}`);
|
|
68
107
|
}
|
|
108
|
+
// New unified provider config
|
|
69
109
|
lines.push(`SAID_PROVIDER=${config.provider}`);
|
|
110
|
+
lines.push(`SAID_API_KEY=${config.apiKey}`);
|
|
111
|
+
lines.push(`SAID_MODEL=${config.model}`);
|
|
112
|
+
// Also save legacy configs
|
|
70
113
|
if (config.provider === 'opencode' && config.opencode) {
|
|
71
114
|
lines.push(`OPENCODE_BASE_URL=${config.opencode.baseUrl}`);
|
|
72
115
|
lines.push(`OPENCODE_API_KEY=${config.opencode.apiKey}`);
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
export { Service, type ServiceConfig } from '
|
|
2
|
-
export { loadConfig, saveConfig, clearConfigCache
|
|
1
|
+
export { Service, type ServiceConfig } from '@said/core/service.js';
|
|
2
|
+
export { loadConfig, saveConfig, clearConfigCache } from './config.js';
|
|
3
|
+
export type { AppConfig, ProviderType } from './config.js';
|
|
3
4
|
export { Application, app } from './app.js';
|
|
5
|
+
export { Provider, type ProviderConfig } from './provider.js';
|
|
6
|
+
export type { ChatMessage, ChatCompletionOptions, TokenUsage, LLMProvider, } from './provider.js';
|
|
7
|
+
export { PROVIDERS, getProviderList, fetchModels, type ProviderDefinition, type ModelInfo, type ProviderConfig as ProviderRegistryConfig } from './providers/index.js';
|
|
8
|
+
export type { ProviderType as RegistryProviderType } from './providers/index.js';
|
|
4
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACvE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,UAAU,EACV,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,IAAI,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACvK,YAAY,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export { Service } from '
|
|
1
|
+
export { Service } from '@said/core/service.js';
|
|
2
2
|
export { loadConfig, saveConfig, clearConfigCache } from './config.js';
|
|
3
3
|
export { Application, app } from './app.js';
|
|
4
|
+
// Provider exports
|
|
5
|
+
export { Provider } from './provider.js';
|
|
6
|
+
// Provider registry exports
|
|
7
|
+
export { PROVIDERS, getProviderList, fetchModels } from './providers/index.js';
|
|
4
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsB,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE5C,mBAAmB;AACnB,OAAO,EAAE,QAAQ,EAAuB,MAAM,eAAe,CAAC;AAQ9D,4BAA4B;AAC5B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAA0F,MAAM,sBAAsB,CAAC"}
|
package/dist/main.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
import { Application } from './app.js';
|
|
3
3
|
import { loadConfig } from './config.js';
|
|
4
4
|
import { TelegramAdapter } from './telegram-adapter.js';
|
|
5
|
-
import {
|
|
6
|
-
import { MiniMaxProvider } from './minimax-provider.js';
|
|
5
|
+
import { Provider } from './provider.js';
|
|
7
6
|
import { Agent } from './agent.js';
|
|
8
7
|
import { FileEditSkill } from './skills/file-edit-skill.js';
|
|
9
8
|
import { WebSurfSkill } from './skills/web-surf-skill.js';
|
|
@@ -24,27 +23,12 @@ async function main() {
|
|
|
24
23
|
// Create provider based on config (may be null if not configured)
|
|
25
24
|
let provider = null;
|
|
26
25
|
let providerError = null;
|
|
27
|
-
if (config.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
console.warn(`Warning: ${providerError}`);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
provider = new OpenCodeProvider({ name: 'opencode-provider', ...config.opencode }, eventEmitter);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
else if (config.provider === 'minimax') {
|
|
37
|
-
if (!config.minimax?.apiKey) {
|
|
38
|
-
providerError = 'MiniMax API key not configured. Please run "npm run setup" first.';
|
|
39
|
-
console.warn(`Warning: ${providerError}`);
|
|
40
|
-
}
|
|
41
|
-
else {
|
|
42
|
-
provider = new MiniMaxProvider({ name: 'minimax-provider', ...config.minimax }, eventEmitter);
|
|
43
|
-
}
|
|
26
|
+
if (!config.apiKey) {
|
|
27
|
+
providerError = `${config.provider} API key not configured. Please run "npm run setup" first.`;
|
|
28
|
+
console.warn(`Warning: ${providerError}`);
|
|
44
29
|
}
|
|
45
30
|
else {
|
|
46
|
-
|
|
47
|
-
console.warn(`Warning: ${providerError}`);
|
|
31
|
+
provider = new Provider({ name: 'provider', provider: config.provider, apiKey: config.apiKey, model: config.model }, eventEmitter);
|
|
48
32
|
}
|
|
49
33
|
// Create agent
|
|
50
34
|
const agent = new Agent({ name: 'agent' }, eventEmitter);
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,iDAAiD;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IAExC,kEAAkE;IAClE,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,aAAa,GAAkB,IAAI,CAAC;IAExC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,aAAa,GAAG,GAAG,MAAM,CAAC,QAAQ,4DAA4D,CAAC;QAC/F,OAAO,CAAC,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,QAAQ,CACrB,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAC3F,YAAY,CACb,CAAC;IACJ,CAAC;IAED,eAAe;IACf,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;IACzD,KAAK,CAAC,WAAW,CAAC,QAAe,CAAC,CAAC;IAEnC,2BAA2B;IAC3B,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;IAE1C,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IACnC,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAClC,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAClC,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IAEnC,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;IAE5E,gCAAgC;IAChC,IAAI,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,YAAiC,EAAE;YACrE,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW;YAC1C,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW;SAC3C,CAAC,CAAC;QAEH,SAAS,CAAC,MAAM,CACd,WAAW,EACX,MAAM,CAAC,UAAU,CAAC,QAAQ,EAC1B,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CACxB,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,UAAU,CAAC,WAAW,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;IACnH,CAAC;IAED,wDAAwD;IACxD,IAAI,eAAe,GAA2B,IAAI,CAAC;IACnD,IAAI,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC9B,eAAe,GAAG,IAAI,eAAe,CACnC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAChE,YAAY,CACb,CAAC;QAEF,0BAA0B;QAC1B,eAAe,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAoB,EAA8C,EAAE;YAC3G,2BAA2B;YAC3B,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,EAAE,EAAE,CAAC;YAC7C,CAAC;YACD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,EAAE,QAAQ,EAAE,kEAAkE,EAAE,CAAC;YAC1F,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClE,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;gBACxC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;gBAClD,OAAO,EAAE,QAAQ,EAAE,aAAa,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YAC/F,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;IAC7E,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtB,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAE9B,iCAAiC;IACjC,YAAY,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAiC,EAAE,EAAE;QACtF,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,uFAAuF;QACvF,OAAO,CAAC,GAAG,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;IAC9B,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IACD,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,eAAe,EAAE,CAAC;QACpB,GAAG,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IACD,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/B,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE3B,uBAAuB;IACvB,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;IACvB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IAElB,kBAAkB;IAClB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Service, type ServiceConfig } from '@said/core/service.js';
|
|
2
|
+
import { EventEmitter } from 'eventemitter3';
|
|
3
|
+
import { type ProviderType } from './providers/index.js';
|
|
4
|
+
export interface ChatMessage {
|
|
5
|
+
role: 'system' | 'user' | 'assistant';
|
|
6
|
+
content: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ChatCompletionOptions {
|
|
9
|
+
messages: ChatMessage[];
|
|
10
|
+
model?: string;
|
|
11
|
+
temperature?: number;
|
|
12
|
+
maxTokens?: number;
|
|
13
|
+
stream?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface TokenUsage {
|
|
16
|
+
promptTokens: number;
|
|
17
|
+
completionTokens: number;
|
|
18
|
+
totalTokens: number;
|
|
19
|
+
}
|
|
20
|
+
export interface LLMProvider {
|
|
21
|
+
chatCompletion(options: ChatCompletionOptions): Promise<string>;
|
|
22
|
+
chatCompletionStream(options: ChatCompletionOptions): AsyncIterable<string>;
|
|
23
|
+
getLastTokenUsage(): TokenUsage;
|
|
24
|
+
}
|
|
25
|
+
export interface ProviderConfig extends ServiceConfig {
|
|
26
|
+
provider: ProviderType;
|
|
27
|
+
apiKey: string;
|
|
28
|
+
model: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Unified LLM Provider that supports multiple backends:
|
|
32
|
+
* - OpenAI-compatible APIs (OpenAI, OpenCode, Ollama, Kimi, Z.ai, OpenRouter)
|
|
33
|
+
* - Anthropic (Claude)
|
|
34
|
+
* - Google AI (Gemini)
|
|
35
|
+
* - MiniMax (custom API)
|
|
36
|
+
*/
|
|
37
|
+
export declare class Provider extends Service implements LLMProvider {
|
|
38
|
+
private client;
|
|
39
|
+
private apiKey;
|
|
40
|
+
private model;
|
|
41
|
+
private providerType;
|
|
42
|
+
private lastTokenUsage;
|
|
43
|
+
constructor(config: ProviderConfig, eventEmitter?: EventEmitter);
|
|
44
|
+
initialize(): Promise<void>;
|
|
45
|
+
start(): Promise<void>;
|
|
46
|
+
stop(): Promise<void>;
|
|
47
|
+
getLastTokenUsage(): TokenUsage;
|
|
48
|
+
/**
|
|
49
|
+
* Handle chat completion for OpenAI-compatible APIs
|
|
50
|
+
*/
|
|
51
|
+
private handleOpenAICompletion;
|
|
52
|
+
/**
|
|
53
|
+
* Handle streaming chat completion for OpenAI-compatible APIs
|
|
54
|
+
*/
|
|
55
|
+
private handleOpenAIStream;
|
|
56
|
+
/**
|
|
57
|
+
* Handle chat completion for MiniMax (custom API)
|
|
58
|
+
*/
|
|
59
|
+
private handleMiniMaxCompletion;
|
|
60
|
+
/**
|
|
61
|
+
* Handle streaming chat completion for MiniMax (custom API)
|
|
62
|
+
*/
|
|
63
|
+
private handleMiniMaxStream;
|
|
64
|
+
chatCompletion(options: ChatCompletionOptions): Promise<string>;
|
|
65
|
+
chatCompletionStream(options: ChatCompletionOptions): AsyncIterable<string>;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5E,iBAAiB,IAAI,UAAU,CAAC;CACjC;AAED,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,qBAAa,QAAS,SAAQ,OAAQ,YAAW,WAAW;IAC1D,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,cAAc,CAIpB;gBAEU,MAAM,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,YAAY;IAIzD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IActB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,iBAAiB,IAAI,UAAU;IAI/B;;OAEG;YACW,sBAAsB;IAwBpC;;OAEG;YACY,kBAAkB;IAqCjC;;OAEG;YACW,uBAAuB;IAiDrC;;OAEG;YACY,mBAAmB;IA4E5B,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAe9D,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC;CAcnF"}
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import { Service } from '@said/core/service.js';
|
|
3
|
+
import { loadConfig } from './config.js';
|
|
4
|
+
import { PROVIDERS } from './providers/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Unified LLM Provider that supports multiple backends:
|
|
7
|
+
* - OpenAI-compatible APIs (OpenAI, OpenCode, Ollama, Kimi, Z.ai, OpenRouter)
|
|
8
|
+
* - Anthropic (Claude)
|
|
9
|
+
* - Google AI (Gemini)
|
|
10
|
+
* - MiniMax (custom API)
|
|
11
|
+
*/
|
|
12
|
+
export class Provider extends Service {
|
|
13
|
+
client = null;
|
|
14
|
+
apiKey = '';
|
|
15
|
+
model = 'gpt-4o';
|
|
16
|
+
providerType = 'openai';
|
|
17
|
+
lastTokenUsage = {
|
|
18
|
+
promptTokens: 0,
|
|
19
|
+
completionTokens: 0,
|
|
20
|
+
totalTokens: 0,
|
|
21
|
+
};
|
|
22
|
+
constructor(config, eventEmitter) {
|
|
23
|
+
super(config, eventEmitter);
|
|
24
|
+
}
|
|
25
|
+
async initialize() {
|
|
26
|
+
const config = loadConfig();
|
|
27
|
+
this.providerType = config.provider;
|
|
28
|
+
this.apiKey = config.apiKey;
|
|
29
|
+
this.model = config.model || 'gpt-4o';
|
|
30
|
+
const providerDef = PROVIDERS[this.providerType];
|
|
31
|
+
// Handle providers with custom APIs differently
|
|
32
|
+
if (this.providerType === 'anthropic') {
|
|
33
|
+
// Anthropic uses a different SDK approach
|
|
34
|
+
// For now, we'll use the OpenAI SDK with Anthropic's compatible endpoint
|
|
35
|
+
// This requires using the openai-partial-stream or similar workaround
|
|
36
|
+
console.log(`Provider initialized with type: ${this.providerType} (using custom handling)`);
|
|
37
|
+
}
|
|
38
|
+
else if (this.providerType === 'google') {
|
|
39
|
+
// Google AI uses a custom API structure
|
|
40
|
+
// We'll use OpenAI SDK with Google's compatible endpoint
|
|
41
|
+
console.log(`Provider initialized with type: ${this.providerType} (using custom handling)`);
|
|
42
|
+
}
|
|
43
|
+
else if (this.providerType === 'minimax') {
|
|
44
|
+
// MiniMax has a custom API format
|
|
45
|
+
// Use direct fetch for MiniMax since it has a different response format
|
|
46
|
+
console.log(`Provider initialized with type: ${this.providerType} (using custom handling)`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// OpenAI-compatible APIs
|
|
50
|
+
this.client = new OpenAI({
|
|
51
|
+
baseURL: providerDef.baseUrl,
|
|
52
|
+
apiKey: this.apiKey,
|
|
53
|
+
});
|
|
54
|
+
console.log(`Provider initialized with type: ${this.providerType}, model: ${this.model}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async start() {
|
|
58
|
+
// Test connection for OpenAI-compatible providers
|
|
59
|
+
if (this.client) {
|
|
60
|
+
try {
|
|
61
|
+
await this.client.models.list();
|
|
62
|
+
console.log('Provider connection verified');
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
console.warn('Provider connection test failed:', error);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.log(`Provider started (${this.providerType})`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async stop() {
|
|
73
|
+
console.log('Provider stopped');
|
|
74
|
+
}
|
|
75
|
+
getLastTokenUsage() {
|
|
76
|
+
return { ...this.lastTokenUsage };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Handle chat completion for OpenAI-compatible APIs
|
|
80
|
+
*/
|
|
81
|
+
async handleOpenAICompletion(options) {
|
|
82
|
+
if (!this.client) {
|
|
83
|
+
throw new Error('Provider not initialized');
|
|
84
|
+
}
|
|
85
|
+
const response = await this.client.chat.completions.create({
|
|
86
|
+
model: options.model || this.model,
|
|
87
|
+
messages: options.messages,
|
|
88
|
+
temperature: options.temperature ?? 0.7,
|
|
89
|
+
max_tokens: options.maxTokens,
|
|
90
|
+
});
|
|
91
|
+
// Track token usage
|
|
92
|
+
if (response.usage) {
|
|
93
|
+
this.lastTokenUsage = {
|
|
94
|
+
promptTokens: response.usage.prompt_tokens || 0,
|
|
95
|
+
completionTokens: response.usage.completion_tokens || 0,
|
|
96
|
+
totalTokens: response.usage.total_tokens || 0,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return response.choices[0]?.message?.content || '';
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Handle streaming chat completion for OpenAI-compatible APIs
|
|
103
|
+
*/
|
|
104
|
+
async *handleOpenAIStream(options) {
|
|
105
|
+
if (!this.client) {
|
|
106
|
+
throw new Error('Provider not initialized');
|
|
107
|
+
}
|
|
108
|
+
const stream = await this.client.chat.completions.create({
|
|
109
|
+
model: options.model || this.model,
|
|
110
|
+
messages: options.messages,
|
|
111
|
+
temperature: options.temperature ?? 0.7,
|
|
112
|
+
max_tokens: options.maxTokens,
|
|
113
|
+
stream: true,
|
|
114
|
+
});
|
|
115
|
+
let totalCompletionTokens = 0;
|
|
116
|
+
for await (const chunk of stream) {
|
|
117
|
+
const content = chunk.choices[0]?.delta?.content || '';
|
|
118
|
+
if (content) {
|
|
119
|
+
yield content;
|
|
120
|
+
}
|
|
121
|
+
// Track usage from streaming chunks if available
|
|
122
|
+
if (chunk.usage) {
|
|
123
|
+
totalCompletionTokens += chunk.usage.completion_tokens || 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Update token usage (prompt tokens would be 0 for streaming)
|
|
127
|
+
if (totalCompletionTokens > 0) {
|
|
128
|
+
this.lastTokenUsage = {
|
|
129
|
+
promptTokens: 0,
|
|
130
|
+
completionTokens: totalCompletionTokens,
|
|
131
|
+
totalTokens: totalCompletionTokens,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Handle chat completion for MiniMax (custom API)
|
|
137
|
+
*/
|
|
138
|
+
async handleMiniMaxCompletion(options) {
|
|
139
|
+
const providerDef = PROVIDERS.minimax;
|
|
140
|
+
const request = {
|
|
141
|
+
model: options.model || this.model,
|
|
142
|
+
messages: options.messages,
|
|
143
|
+
temperature: options.temperature ?? 0.7,
|
|
144
|
+
max_tokens: options.maxTokens,
|
|
145
|
+
};
|
|
146
|
+
const response = await fetch(`${providerDef.baseUrl}/text/chatcompletion`, {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
headers: {
|
|
149
|
+
'Content-Type': 'application/json',
|
|
150
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
151
|
+
},
|
|
152
|
+
body: JSON.stringify(request),
|
|
153
|
+
});
|
|
154
|
+
if (!response.ok) {
|
|
155
|
+
const error = await response.text();
|
|
156
|
+
throw new Error(`MiniMax API error: ${response.status} - ${error}`);
|
|
157
|
+
}
|
|
158
|
+
const data = await response.json();
|
|
159
|
+
// Track token usage
|
|
160
|
+
if (data.usage) {
|
|
161
|
+
this.lastTokenUsage = {
|
|
162
|
+
promptTokens: data.usage.prompt_tokens || 0,
|
|
163
|
+
completionTokens: data.usage.completion_tokens || 0,
|
|
164
|
+
totalTokens: data.usage.total_tokens || 0,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return data.choices[0]?.message?.content || '';
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Handle streaming chat completion for MiniMax (custom API)
|
|
171
|
+
*/
|
|
172
|
+
async *handleMiniMaxStream(options) {
|
|
173
|
+
const providerDef = PROVIDERS.minimax;
|
|
174
|
+
const request = {
|
|
175
|
+
model: options.model || this.model,
|
|
176
|
+
messages: options.messages,
|
|
177
|
+
temperature: options.temperature ?? 0.7,
|
|
178
|
+
max_tokens: options.maxTokens,
|
|
179
|
+
stream: true,
|
|
180
|
+
};
|
|
181
|
+
const response = await fetch(`${providerDef.baseUrl}/text/chatcompletion`, {
|
|
182
|
+
method: 'POST',
|
|
183
|
+
headers: {
|
|
184
|
+
'Content-Type': 'application/json',
|
|
185
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
186
|
+
},
|
|
187
|
+
body: JSON.stringify(request),
|
|
188
|
+
});
|
|
189
|
+
if (!response.ok) {
|
|
190
|
+
const error = await response.text();
|
|
191
|
+
throw new Error(`MiniMax API error: ${response.status} - ${error}`);
|
|
192
|
+
}
|
|
193
|
+
if (!response.body) {
|
|
194
|
+
throw new Error('No response body');
|
|
195
|
+
}
|
|
196
|
+
const decoder = new TextDecoder();
|
|
197
|
+
const reader = response.body.getReader();
|
|
198
|
+
let totalCompletionTokens = 0;
|
|
199
|
+
try {
|
|
200
|
+
while (true) {
|
|
201
|
+
const { done, value } = await reader.read();
|
|
202
|
+
if (done)
|
|
203
|
+
break;
|
|
204
|
+
const chunk = decoder.decode(value);
|
|
205
|
+
const lines = chunk.split('\n').filter(line => line.trim() !== '');
|
|
206
|
+
for (const line of lines) {
|
|
207
|
+
if (line.startsWith('data: ')) {
|
|
208
|
+
const data = line.slice(6);
|
|
209
|
+
if (data === '[DONE]') {
|
|
210
|
+
// Update token usage
|
|
211
|
+
if (totalCompletionTokens > 0) {
|
|
212
|
+
this.lastTokenUsage = {
|
|
213
|
+
promptTokens: 0,
|
|
214
|
+
completionTokens: totalCompletionTokens,
|
|
215
|
+
totalTokens: totalCompletionTokens,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
try {
|
|
221
|
+
const parsed = JSON.parse(data);
|
|
222
|
+
const content = parsed.choices?.[0]?.delta?.content || '';
|
|
223
|
+
if (content) {
|
|
224
|
+
yield content;
|
|
225
|
+
}
|
|
226
|
+
// Track completion tokens from streaming
|
|
227
|
+
if (parsed.usage?.completion_tokens) {
|
|
228
|
+
totalCompletionTokens += parsed.usage.completion_tokens;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// Skip invalid JSON
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
finally {
|
|
239
|
+
reader.releaseLock();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
async chatCompletion(options) {
|
|
243
|
+
// Route to appropriate handler based on provider type
|
|
244
|
+
switch (this.providerType) {
|
|
245
|
+
case 'minimax':
|
|
246
|
+
return this.handleMiniMaxCompletion(options);
|
|
247
|
+
case 'anthropic':
|
|
248
|
+
case 'google':
|
|
249
|
+
// For now, throw an error for unsupported custom API providers
|
|
250
|
+
throw new Error(`${this.providerType} provider requires custom implementation`);
|
|
251
|
+
default:
|
|
252
|
+
// Use OpenAI SDK for OpenAI-compatible APIs
|
|
253
|
+
return this.handleOpenAICompletion(options);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async *chatCompletionStream(options) {
|
|
257
|
+
// Route to appropriate handler based on provider type
|
|
258
|
+
switch (this.providerType) {
|
|
259
|
+
case 'minimax':
|
|
260
|
+
yield* this.handleMiniMaxStream(options);
|
|
261
|
+
break;
|
|
262
|
+
case 'anthropic':
|
|
263
|
+
case 'google':
|
|
264
|
+
// For now, throw an error for unsupported custom API providers
|
|
265
|
+
throw new Error(`${this.providerType} provider requires custom implementation`);
|
|
266
|
+
default:
|
|
267
|
+
yield* this.handleOpenAIStream(options);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ProviderType, ModelInfo, ProviderDefinition, ProviderConfig } from './types.js';
|
|
2
|
+
export type { ProviderType, ModelInfo, ProviderDefinition, ProviderConfig };
|
|
3
|
+
export declare const PROVIDERS: Record<ProviderType, ProviderDefinition>;
|
|
4
|
+
export declare function fetchModels(provider: ProviderType, apiKey: string): Promise<ModelInfo[]>;
|
|
5
|
+
export declare function getProviderList(): Array<{
|
|
6
|
+
name: string;
|
|
7
|
+
value: ProviderType;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG9F,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,EAAE,CAAC;AAE5E,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAuD9D,CAAC;AA+DF,wBAAsB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAkD9F;AAED,wBAAgB,eAAe,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC,CAK9E"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
export const PROVIDERS = {
|
|
3
|
+
openai: {
|
|
4
|
+
id: 'openai',
|
|
5
|
+
name: 'OpenAI',
|
|
6
|
+
baseUrl: 'https://api.openai.com/v1',
|
|
7
|
+
apiType: 'openai',
|
|
8
|
+
},
|
|
9
|
+
anthropic: {
|
|
10
|
+
id: 'anthropic',
|
|
11
|
+
name: 'Anthropic',
|
|
12
|
+
baseUrl: 'https://api.anthropic.com',
|
|
13
|
+
apiType: 'anthropic',
|
|
14
|
+
},
|
|
15
|
+
ollama: {
|
|
16
|
+
id: 'ollama',
|
|
17
|
+
name: 'Ollama',
|
|
18
|
+
baseUrl: 'http://localhost:11434/v1',
|
|
19
|
+
apiType: 'openai',
|
|
20
|
+
},
|
|
21
|
+
opencode: {
|
|
22
|
+
id: 'opencode',
|
|
23
|
+
name: 'OpenCode',
|
|
24
|
+
baseUrl: 'https://opencode.ai/zen/v1',
|
|
25
|
+
apiType: 'openai',
|
|
26
|
+
},
|
|
27
|
+
minimax: {
|
|
28
|
+
id: 'minimax',
|
|
29
|
+
name: 'MiniMax',
|
|
30
|
+
baseUrl: 'https://api.minimax.chat/v1',
|
|
31
|
+
apiType: 'custom',
|
|
32
|
+
},
|
|
33
|
+
kimi: {
|
|
34
|
+
id: 'kimi',
|
|
35
|
+
name: 'Kimi (Moonshot)',
|
|
36
|
+
baseUrl: 'https://api.moonshot.ai/v1',
|
|
37
|
+
apiType: 'openai',
|
|
38
|
+
},
|
|
39
|
+
zai: {
|
|
40
|
+
id: 'zai',
|
|
41
|
+
name: 'Z.ai',
|
|
42
|
+
baseUrl: 'https://z.ai/v1',
|
|
43
|
+
apiType: 'openai',
|
|
44
|
+
},
|
|
45
|
+
openrouter: {
|
|
46
|
+
id: 'openrouter',
|
|
47
|
+
name: 'OpenRouter',
|
|
48
|
+
baseUrl: 'https://openrouter.ai/api/v1',
|
|
49
|
+
apiType: 'openai',
|
|
50
|
+
},
|
|
51
|
+
google: {
|
|
52
|
+
id: 'google',
|
|
53
|
+
name: 'Google AI',
|
|
54
|
+
baseUrl: 'https://generativelanguage.googleapis.com/v1',
|
|
55
|
+
apiType: 'custom',
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Fallback models for providers that don't support model listing
|
|
60
|
+
* or require special handling
|
|
61
|
+
*/
|
|
62
|
+
const FALLBACK_MODELS = {
|
|
63
|
+
anthropic: [
|
|
64
|
+
{ id: 'claude-3-5-sonnet-20241022', name: 'Claude 3.5 Sonnet' },
|
|
65
|
+
{ id: 'claude-3-5-sonnet-20240620', name: 'Claude 3.5 Sonnet (June)' },
|
|
66
|
+
{ id: 'claude-3-opus-20240229', name: 'Claude 3 Opus' },
|
|
67
|
+
{ id: 'claude-3-sonnet-20240229', name: 'Claude 3 Sonnet' },
|
|
68
|
+
{ id: 'claude-3-haiku-20240307', name: 'Claude 3 Haiku' },
|
|
69
|
+
],
|
|
70
|
+
google: [
|
|
71
|
+
{ id: 'gemini-1.5-pro', name: 'Gemini 1.5 Pro' },
|
|
72
|
+
{ id: 'gemini-1.5-flash', name: 'Gemini 1.5 Flash' },
|
|
73
|
+
{ id: 'gemini-1.5-flash-8b', name: 'Gemini 1.5 Flash 8B' },
|
|
74
|
+
{ id: 'gemini-pro', name: 'Gemini Pro' },
|
|
75
|
+
],
|
|
76
|
+
minimax: [
|
|
77
|
+
{ id: 'MiniMax-Text-01', name: 'MiniMax Text 01' },
|
|
78
|
+
{ id: 'abab6.5s-chat', name: 'Abab 6.5s Chat' },
|
|
79
|
+
{ id: 'abab6.5g-chat', name: 'Abab 6.5g Chat' },
|
|
80
|
+
],
|
|
81
|
+
kimi: [
|
|
82
|
+
{ id: 'kimi-k2', name: 'Kimi K2' },
|
|
83
|
+
{ id: 'kimi-k2-preview', name: 'Kimi K2 Preview' },
|
|
84
|
+
{ id: 'moonshot-v1-8k', name: 'Moonshot V1 8K' },
|
|
85
|
+
{ id: 'moonshot-v1-32k', name: 'Moonshot V1 32K' },
|
|
86
|
+
{ id: 'moonshot-v1-128k', name: 'Moonshot V1 128K' },
|
|
87
|
+
],
|
|
88
|
+
zai: [
|
|
89
|
+
{ id: 'zai-1', name: 'Z.ai 1' },
|
|
90
|
+
{ id: 'zai-1-preview', name: 'Z.ai 1 Preview' },
|
|
91
|
+
],
|
|
92
|
+
openrouter: [
|
|
93
|
+
{ id: 'openai/gpt-4o', name: 'GPT-4O (via OpenRouter)' },
|
|
94
|
+
{ id: 'openai/gpt-4o-mini', name: 'GPT-4O Mini (via OpenRouter)' },
|
|
95
|
+
{ id: 'anthropic/claude-3.5-sonnet', name: 'Claude 3.5 Sonnet (via OpenRouter)' },
|
|
96
|
+
{ id: 'google/gemini-pro-1.5', name: 'Gemini Pro 1.5 (via OpenRouter)' },
|
|
97
|
+
],
|
|
98
|
+
ollama: [
|
|
99
|
+
{ id: 'llama3.1', name: 'Llama 3.1' },
|
|
100
|
+
{ id: 'llama3', name: 'Llama 3' },
|
|
101
|
+
{ id: 'mistral', name: 'Mistral' },
|
|
102
|
+
{ id: 'mixtral', name: 'Mixtral' },
|
|
103
|
+
{ id: 'codellama', name: 'CodeLlama' },
|
|
104
|
+
],
|
|
105
|
+
opencode: [
|
|
106
|
+
{ id: 'gpt-4o', name: 'GPT-4O' },
|
|
107
|
+
{ id: 'gpt-4o-mini', name: 'GPT-4O Mini' },
|
|
108
|
+
{ id: 'gpt-4-turbo', name: 'GPT-4 Turbo' },
|
|
109
|
+
],
|
|
110
|
+
openai: [
|
|
111
|
+
{ id: 'gpt-4o', name: 'GPT-4O' },
|
|
112
|
+
{ id: 'gpt-4o-mini', name: 'GPT-4O Mini' },
|
|
113
|
+
{ id: 'gpt-4-turbo', name: 'GPT-4 Turbo' },
|
|
114
|
+
{ id: 'gpt-4', name: 'GPT-4' },
|
|
115
|
+
{ id: 'gpt-3.5-turbo', name: 'GPT-3.5 Turbo' },
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
export async function fetchModels(provider, apiKey) {
|
|
119
|
+
const definition = PROVIDERS[provider];
|
|
120
|
+
// Use OpenAI SDK for OpenAI-compatible APIs
|
|
121
|
+
if (definition.apiType === 'openai') {
|
|
122
|
+
try {
|
|
123
|
+
const client = new OpenAI({
|
|
124
|
+
baseURL: definition.baseUrl,
|
|
125
|
+
apiKey: apiKey,
|
|
126
|
+
});
|
|
127
|
+
const response = await client.models.list();
|
|
128
|
+
const models = response.data
|
|
129
|
+
.filter(model => model.id.includes('gpt') || model.id.includes('4o') || model.id.includes('3.5'))
|
|
130
|
+
.slice(0, 20)
|
|
131
|
+
.map(model => ({
|
|
132
|
+
id: model.id,
|
|
133
|
+
name: model.id,
|
|
134
|
+
}));
|
|
135
|
+
return models.length > 0 ? models : FALLBACK_MODELS[provider];
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
console.warn(`Failed to fetch models from ${provider}, using fallback models`);
|
|
139
|
+
return FALLBACK_MODELS[provider];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Anthropic uses a different API structure
|
|
143
|
+
if (provider === 'anthropic') {
|
|
144
|
+
try {
|
|
145
|
+
// Anthropic doesn't have a public models list API, use fallback
|
|
146
|
+
return FALLBACK_MODELS[provider];
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return FALLBACK_MODELS[provider];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Google AI uses a custom API
|
|
153
|
+
if (provider === 'google') {
|
|
154
|
+
try {
|
|
155
|
+
// Google's Generative Language API requires different authentication
|
|
156
|
+
// For now, return fallback models
|
|
157
|
+
return FALLBACK_MODELS[provider];
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return FALLBACK_MODELS[provider];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// For custom providers (MiniMax) and others, use fallback models
|
|
164
|
+
return FALLBACK_MODELS[provider];
|
|
165
|
+
}
|
|
166
|
+
export function getProviderList() {
|
|
167
|
+
return Object.values(PROVIDERS).map(provider => ({
|
|
168
|
+
name: provider.name,
|
|
169
|
+
value: provider.id,
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ProviderType = 'openai' | 'anthropic' | 'ollama' | 'opencode' | 'minimax' | 'kimi' | 'zai' | 'openrouter' | 'google';
|
|
2
|
+
export interface ProviderDefinition {
|
|
3
|
+
id: ProviderType;
|
|
4
|
+
name: string;
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
apiType: 'openai' | 'anthropic' | 'custom';
|
|
7
|
+
}
|
|
8
|
+
export interface ModelInfo {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ProviderConfig {
|
|
13
|
+
type: ProviderType;
|
|
14
|
+
apiKey: string;
|
|
15
|
+
model: string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,UAAU,GACV,SAAS,GACT,MAAM,GACN,KAAK,GACL,YAAY,GACZ,QAAQ,CAAC;AAEb,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;CAC5C;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
|
package/dist/setup.js
CHANGED
|
@@ -3,14 +3,12 @@ import inquirer from 'inquirer';
|
|
|
3
3
|
import { existsSync, writeFileSync } from 'fs';
|
|
4
4
|
import { join } from 'path';
|
|
5
5
|
import { loadConfig } from './config.js';
|
|
6
|
-
|
|
7
|
-
// Basic validation - check format
|
|
8
|
-
return /^\d+:[\w-]+$/.test(token);
|
|
9
|
-
}
|
|
6
|
+
import { getProviderList, fetchModels, PROVIDERS } from './providers/index.js';
|
|
10
7
|
async function runSetup() {
|
|
11
8
|
console.log('\n=== sAId Setup ===\n');
|
|
12
9
|
console.log('This will help you configure your Telegram bot and LLM provider.\n');
|
|
13
10
|
const existingConfig = existsSync(join(process.cwd(), '.env')) ? loadConfig() : null;
|
|
11
|
+
// Step 1: Ask for Telegram Bot Token
|
|
14
12
|
const answers = await inquirer.prompt([
|
|
15
13
|
{
|
|
16
14
|
type: 'input',
|
|
@@ -27,51 +25,65 @@ async function runSetup() {
|
|
|
27
25
|
return true;
|
|
28
26
|
},
|
|
29
27
|
},
|
|
28
|
+
]);
|
|
29
|
+
// Step 2: Ask for provider selection
|
|
30
|
+
const providerAnswers = await inquirer.prompt([
|
|
30
31
|
{
|
|
31
32
|
type: 'list',
|
|
32
33
|
name: 'provider',
|
|
33
34
|
message: 'Select LLM Provider:',
|
|
34
|
-
choices:
|
|
35
|
-
{ name: 'OpenCode (OpenAI-compatible)', value: 'opencode' },
|
|
36
|
-
{ name: 'MiniMax', value: 'minimax' },
|
|
37
|
-
],
|
|
35
|
+
choices: getProviderList(),
|
|
38
36
|
default: existingConfig?.provider || 'opencode',
|
|
39
37
|
},
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
default: existingConfig?.opencode?.baseUrl || 'https://opencode.ai/v1',
|
|
45
|
-
when: (answers) => answers.provider === 'opencode',
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
type: 'password',
|
|
49
|
-
name: 'opencodeApiKey',
|
|
50
|
-
message: 'OpenCode API Key:',
|
|
51
|
-
when: (answers) => answers.provider === 'opencode',
|
|
52
|
-
default: existingConfig?.opencode?.apiKey || '',
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
type: 'input',
|
|
56
|
-
name: 'opencodeModel',
|
|
57
|
-
message: 'OpenCode Model (optional):',
|
|
58
|
-
default: existingConfig?.opencode?.model || 'gpt-4o',
|
|
59
|
-
when: (answers) => answers.provider === 'opencode',
|
|
60
|
-
},
|
|
38
|
+
]);
|
|
39
|
+
answers.provider = providerAnswers.provider;
|
|
40
|
+
// Step 3: Ask for API Key (password input)
|
|
41
|
+
const apiKeyAnswer = await inquirer.prompt([
|
|
61
42
|
{
|
|
62
43
|
type: 'password',
|
|
63
|
-
name: '
|
|
64
|
-
message:
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
type: 'input',
|
|
70
|
-
name: 'minimaxModel',
|
|
71
|
-
message: 'MiniMax Model (optional):',
|
|
72
|
-
default: existingConfig?.minimax?.model || 'MiniMax-Text-01',
|
|
73
|
-
when: (answers) => answers.provider === 'minimax',
|
|
44
|
+
name: 'apiKey',
|
|
45
|
+
message: `${PROVIDERS[answers.provider].name} API Key:`,
|
|
46
|
+
default: existingConfig?.apiKey || '',
|
|
47
|
+
mask: '*',
|
|
74
48
|
},
|
|
49
|
+
]);
|
|
50
|
+
answers.apiKey = apiKeyAnswer.apiKey;
|
|
51
|
+
// Step 4: Fetch available models
|
|
52
|
+
console.log('\nFetching available models...');
|
|
53
|
+
let models = [];
|
|
54
|
+
try {
|
|
55
|
+
models = await fetchModels(answers.provider, answers.apiKey);
|
|
56
|
+
console.log(`Found ${models.length} models.\n`);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.warn('Failed to fetch models from API, will ask for manual input.\n');
|
|
60
|
+
}
|
|
61
|
+
// Step 5 & 6: If models returned, show dropdown; otherwise ask manually
|
|
62
|
+
if (models.length > 0) {
|
|
63
|
+
const modelAnswer = await inquirer.prompt([
|
|
64
|
+
{
|
|
65
|
+
type: 'list',
|
|
66
|
+
name: 'model',
|
|
67
|
+
message: 'Select Model:',
|
|
68
|
+
choices: models.map(m => ({ name: m.name, value: m.id })),
|
|
69
|
+
default: existingConfig?.model || models[0]?.id || '',
|
|
70
|
+
},
|
|
71
|
+
]);
|
|
72
|
+
answers.model = modelAnswer.model;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const modelAnswer = await inquirer.prompt([
|
|
76
|
+
{
|
|
77
|
+
type: 'input',
|
|
78
|
+
name: 'model',
|
|
79
|
+
message: 'Enter Model name:',
|
|
80
|
+
default: existingConfig?.model || '',
|
|
81
|
+
},
|
|
82
|
+
]);
|
|
83
|
+
answers.model = modelAnswer.model;
|
|
84
|
+
}
|
|
85
|
+
// Step 7: Ask for autolaunch options
|
|
86
|
+
const autolaunchAnswers = await inquirer.prompt([
|
|
75
87
|
{
|
|
76
88
|
type: 'confirm',
|
|
77
89
|
name: 'enableAutolaunch',
|
|
@@ -83,27 +95,18 @@ async function runSetup() {
|
|
|
83
95
|
name: 'systemdUser',
|
|
84
96
|
message: 'Systemd service user (e.g., ubuntu):',
|
|
85
97
|
default: 'ubuntu',
|
|
86
|
-
when: (
|
|
98
|
+
when: (ans) => ans.enableAutolaunch,
|
|
87
99
|
},
|
|
88
100
|
]);
|
|
89
|
-
|
|
101
|
+
answers.enableAutolaunch = autolaunchAnswers.enableAutolaunch;
|
|
102
|
+
answers.systemdUser = autolaunchAnswers.systemdUser;
|
|
103
|
+
// Save unified config
|
|
90
104
|
const lines = [
|
|
91
105
|
`TELEGRAM_BOT_TOKEN=${answers.telegramBotToken}`,
|
|
92
106
|
`SAID_PROVIDER=${answers.provider}`,
|
|
107
|
+
`SAID_API_KEY=${answers.apiKey}`,
|
|
108
|
+
`SAID_MODEL=${answers.model}`,
|
|
93
109
|
];
|
|
94
|
-
if (answers.provider === 'opencode') {
|
|
95
|
-
lines.push(`OPENCODE_BASE_URL=${answers.opencodeBaseUrl}`);
|
|
96
|
-
lines.push(`OPENCODE_API_KEY=${answers.opencodeApiKey}`);
|
|
97
|
-
if (answers.opencodeModel && answers.opencodeModel !== 'gpt-4o') {
|
|
98
|
-
lines.push(`OPENCODE_MODEL=${answers.opencodeModel}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
else if (answers.provider === 'minimax') {
|
|
102
|
-
lines.push(`MINIMAX_API_KEY=${answers.minimaxApiKey}`);
|
|
103
|
-
if (answers.minimaxModel && answers.minimaxModel !== 'MiniMax-Text-01') {
|
|
104
|
-
lines.push(`MINIMAX_MODEL=${answers.minimaxModel}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
110
|
// Save .env file
|
|
108
111
|
const envPath = join(process.cwd(), '.env');
|
|
109
112
|
writeFileSync(envPath, lines.join('\n') + '\n', 'utf-8');
|
package/dist/setup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AAEA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AAEA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAY/E,KAAK,UAAU,QAAQ;IACrB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IAElF,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAErF,qCAAqC;IACrC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAe;QAClD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,kDAAkD;YAC3D,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE;YACjD,QAAQ,EAAE,KAAK,EAAE,KAAa,EAAE,EAAE;gBAChC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAClB,OAAO,uBAAuB,CAAC;gBACjC,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAChC,OAAO,4EAA4E,CAAC;gBACtF,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF;KACF,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC5C;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,sBAAsB;YAC/B,OAAO,EAAE,eAAe,EAAE;YAC1B,OAAO,EAAE,cAAc,EAAE,QAAQ,IAAI,UAAU;SAChD;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC;IAE5C,2CAA2C;IAC3C,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACzC;YACE,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,WAAW;YACvD,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,EAAE;YACrC,IAAI,EAAE,GAAG;SACV;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;IAErC,iCAAiC;IACjC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,IAAI,MAAM,GAAgB,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAChF,CAAC;IAED,wEAAwE;IACxE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,eAAe;gBACxB,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzD,OAAO,EAAE,cAAc,EAAE,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE;aACtD;SACF,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,mBAAmB;gBAC5B,OAAO,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE;aACrC;SACF,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;IACpC,CAAC;IAED,qCAAqC;IACrC,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC9C;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,KAAK;SACf;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,sCAAsC;YAC/C,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,gBAAgB;SACpC;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,gBAAgB,CAAC;IAC9D,OAAO,CAAC,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC;IAEpD,sBAAsB;IACtB,MAAM,KAAK,GAAa;QACtB,sBAAsB,OAAO,CAAC,gBAAgB,EAAE;QAChD,iBAAiB,OAAO,CAAC,QAAQ,EAAE;QACnC,gBAAgB,OAAO,CAAC,MAAM,EAAE;QAChC,cAAc,OAAO,CAAC,KAAK,EAAE;KAC9B,CAAC;IAEF,iBAAiB;IACjB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5C,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,6CAA6C;IAC7C,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG;;;;;;OAMpB,OAAO,CAAC,WAAW;mBACP,OAAO,CAAC,GAAG,EAAE;;;;;;CAM/B,CAAC;QACE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACxD,aAAa,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AACrD,CAAC;AAED,2BAA2B;AAC3B,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
package/package.json
CHANGED
package/README.md
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
# sAId - Smart AI Assistant
|
|
2
|
-
|
|
3
|
-
A modular AI agent with Telegram integration, Web UI, job scheduling, and extensible skills system.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- **Telegram Bot** - Chat with the AI assistant via Telegram
|
|
8
|
-
- **Multiple LLM Providers** - OpenCode (MiniMax, GPT, Claude, etc.) or MiniMax
|
|
9
|
-
- **Web UI** - Manage and configure the agent via browser at http://localhost:3000
|
|
10
|
-
- **Job Scheduler** - Schedule recurring tasks
|
|
11
|
-
- **Skills System** - Extensible skills (file edit, web surf, API calls, tool calls)
|
|
12
|
-
|
|
13
|
-
## Installation
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
# Clone and install dependencies
|
|
17
|
-
npm install
|
|
18
|
-
|
|
19
|
-
# Build all packages
|
|
20
|
-
npm run build
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Configuration
|
|
24
|
-
|
|
25
|
-
### Quick Setup
|
|
26
|
-
|
|
27
|
-
Run the interactive setup wizard:
|
|
28
|
-
|
|
29
|
-
```bash
|
|
30
|
-
npm run setup
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
This will prompt you for:
|
|
34
|
-
- Telegram bot token (get from @BotFather on Telegram)
|
|
35
|
-
- LLM provider selection (opencode or minimax)
|
|
36
|
-
- API key for the selected provider
|
|
37
|
-
|
|
38
|
-
### Manual Configuration
|
|
39
|
-
|
|
40
|
-
Edit the `.env` file:
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
# Telegram Bot
|
|
44
|
-
TELEGRAM_BOT_TOKEN=your_bot_token_here
|
|
45
|
-
|
|
46
|
-
# Provider (opencode or minimax)
|
|
47
|
-
SAID_PROVIDER=opencode
|
|
48
|
-
|
|
49
|
-
# OpenCode Configuration
|
|
50
|
-
OPENCODE_BASE_URL=https://opencode.ai/zen/v1
|
|
51
|
-
OPENCODE_API_KEY=your_opencode_api_key
|
|
52
|
-
OPENCODE_MODEL=minimax-m2.5-free
|
|
53
|
-
|
|
54
|
-
# Or MiniMax Configuration
|
|
55
|
-
# MINIMAX_API_KEY=your_minimax_api_key
|
|
56
|
-
# MINIMAX_MODEL=MiniMax-Text-01
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Available Models
|
|
60
|
-
|
|
61
|
-
**OpenCode** (via https://opencode.ai/zen/v1):
|
|
62
|
-
- MiniMax: `minimax-m2.5-free`, `minimax-m2.5`, `minimax-m2.1-free`, `minimax-m2.1`
|
|
63
|
-
- GPT: `gpt-5.3-codex`, `gpt-5.2`, `gpt-5.1`, etc.
|
|
64
|
-
- Claude: `opus-4-6`, `sonnet-4-6`, `haiku-4-5`, etc.
|
|
65
|
-
- Gemini: `gemini-3.1-pro`, `gemini-3-flash`
|
|
66
|
-
- And more...
|
|
67
|
-
|
|
68
|
-
## Usage
|
|
69
|
-
|
|
70
|
-
### Start the Agent
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
npm run start
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
The bot will:
|
|
77
|
-
- Connect to Telegram
|
|
78
|
-
- Start the Web UI at http://localhost:3000
|
|
79
|
-
- Initialize the scheduler
|
|
80
|
-
|
|
81
|
-
### Telegram Commands
|
|
82
|
-
|
|
83
|
-
- Send a message to your bot to chat with the AI
|
|
84
|
-
- The agent maintains conversation context
|
|
85
|
-
|
|
86
|
-
### Web UI
|
|
87
|
-
|
|
88
|
-
Open http://localhost:3000 in your browser to:
|
|
89
|
-
- View agent status
|
|
90
|
-
- Manage configuration
|
|
91
|
-
- View conversation history
|
|
92
|
-
- Manage skills
|
|
93
|
-
- Schedule jobs
|
|
94
|
-
|
|
95
|
-
### Skills
|
|
96
|
-
|
|
97
|
-
The agent includes built-in skills:
|
|
98
|
-
|
|
99
|
-
- **file-edit** - Read, write, and edit files
|
|
100
|
-
- **web-surf** - Fetch URLs and extract content
|
|
101
|
-
- **api-call** - Make HTTP requests to external APIs
|
|
102
|
-
- **tool-call** - Execute custom tools
|
|
103
|
-
|
|
104
|
-
Skills can be invoked using: `[[skill-name:action]]` syntax in messages.
|
|
105
|
-
|
|
106
|
-
## Development
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
# Build all packages
|
|
110
|
-
npm run build
|
|
111
|
-
|
|
112
|
-
# Start in development mode
|
|
113
|
-
npm run start
|
|
114
|
-
|
|
115
|
-
# Run setup wizard
|
|
116
|
-
npm run setup
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
## Architecture
|
|
120
|
-
|
|
121
|
-
```
|
|
122
|
-
packages/
|
|
123
|
-
├── core/ # Base service, config, app framework
|
|
124
|
-
├── adapter-telegram/ # Telegram bot integration
|
|
125
|
-
├── provider-opencode/ # OpenCode LLM provider
|
|
126
|
-
├── provider-minimax/ # MiniMax LLM provider
|
|
127
|
-
├── agent/ # AI agent with skills support
|
|
128
|
-
├── skills/ # Skill framework and implementations
|
|
129
|
-
├── scheduler/ # Job scheduling service
|
|
130
|
-
├── web-ui/ # Web dashboard
|
|
131
|
-
└── main/ # Application entry point
|
|
132
|
-
```
|