@smilique/said 1.0.2 → 1.0.4
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 +171 -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 +61 -56
- package/dist/setup.js.map +1 -1
- package/package.json +1 -1
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":"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;AA+CrC,IAAI,YAAY,GAAqB,IAAI,CAAC;AAE1C,MAAM,UAAU,UAAU;IACxB,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,gDAAgD;IAChD,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAChC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;QAC7E,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED,0CAA0C;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,+DAA+D;IAC/D,IAAI,QAAQ,GAAkB,OAAO,CAAC,GAAG,CAAC,aAA8B,IAAI,UAAU,CAAC;IACvF,IAAI,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;IAC5C,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;IAEzC,qFAAqF;IACrF,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC1D,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACxD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAE9C,gEAAgE;IAChE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,IAAI,oBAAoB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACjD,sCAAsC;YACtC,QAAQ,GAAG,UAAU,CAAC;YACtB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;YAC5C,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,mBAAmB,CAAC;QAC5D,CAAC;aAAM,IAAI,mBAAmB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACxD,qCAAqC;YACrC,QAAQ,GAAG,SAAS,CAAC;YACrB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;YAC3C,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,iBAAiB,CAAC;QACzD,CAAC;aAAM,IAAI,oBAAoB,IAAI,mBAAmB,EAAE,CAAC;YACvD,2DAA2D;YAC3D,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;YACnD,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACnC,QAAQ,GAAG,SAAS,CAAC;gBACrB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;gBAC3C,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,iBAAiB,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,UAAU,CAAC;gBACtB,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;gBAC5C,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,mBAAmB,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAc;QACxB,QAAQ;QACR,MAAM;QACN,KAAK;KACN,CAAC;IAEF,0DAA0D;IAC1D,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC5B,MAAM,CAAC,QAAQ,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,4BAA4B;YACtE,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,KAAK;SACb,CAAC;IACJ,CAAC;SAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,OAAO,GAAG;YACf,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,KAAK;SACb,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QACnC,MAAM,CAAC,QAAQ,GAAG;YAChB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;SACzC,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,OAAO,EAAE,CAAC;QAC7C,MAAM,CAAC,UAAU,GAAG;YAClB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,WAAW;YAC9D,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,OAAO;YAClE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,YAAY;SAClE,CAAC;IACJ,CAAC;IAED,YAAY,GAAG,MAAM,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAiB;IAC1C,oBAAoB;IACpB,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAChC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;QAC7E,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7E,KAAK,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAEzC,2BAA2B;IAC3B,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAEhD,uBAAuB;IACvB,YAAY,GAAG,MAAM,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
|
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":"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"}
|
|
@@ -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,CAiD9F;AAED,wBAAgB,eAAe,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC,CAK9E"}
|
|
@@ -0,0 +1,171 @@
|
|
|
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
|
+
.slice(0, 100)
|
|
130
|
+
.map(model => ({
|
|
131
|
+
id: model.id,
|
|
132
|
+
name: model.id,
|
|
133
|
+
}));
|
|
134
|
+
return models.length > 0 ? models : FALLBACK_MODELS[provider];
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
console.warn(`Failed to fetch models from ${provider}, using fallback models`);
|
|
138
|
+
return FALLBACK_MODELS[provider];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Anthropic uses a different API structure
|
|
142
|
+
if (provider === 'anthropic') {
|
|
143
|
+
try {
|
|
144
|
+
// Anthropic doesn't have a public models list API, use fallback
|
|
145
|
+
return FALLBACK_MODELS[provider];
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return FALLBACK_MODELS[provider];
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Google AI uses a custom API
|
|
152
|
+
if (provider === 'google') {
|
|
153
|
+
try {
|
|
154
|
+
// Google's Generative Language API requires different authentication
|
|
155
|
+
// For now, return fallback models
|
|
156
|
+
return FALLBACK_MODELS[provider];
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return FALLBACK_MODELS[provider];
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// For custom providers (MiniMax) and others, use fallback models
|
|
163
|
+
return FALLBACK_MODELS[provider];
|
|
164
|
+
}
|
|
165
|
+
export function getProviderList() {
|
|
166
|
+
return Object.values(PROVIDERS).map(provider => ({
|
|
167
|
+
name: provider.name,
|
|
168
|
+
value: provider.id,
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
//# 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
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
import inquirer from 'inquirer';
|
|
3
3
|
import { existsSync, writeFileSync } from 'fs';
|
|
4
4
|
import { join } from 'path';
|
|
5
|
-
import { loadConfig } from './config.js';
|
|
6
|
-
|
|
7
|
-
// Basic validation - check format
|
|
8
|
-
return /^\d+:[\w-]+$/.test(token);
|
|
9
|
-
}
|
|
5
|
+
import { loadConfig, clearConfigCache } from './config.js';
|
|
6
|
+
import { getProviderList, fetchModels, PROVIDERS } from './providers/index.js';
|
|
10
7
|
async function runSetup() {
|
|
8
|
+
// Clear config cache to ensure we load fresh values
|
|
9
|
+
clearConfigCache();
|
|
11
10
|
console.log('\n=== sAId Setup ===\n');
|
|
12
11
|
console.log('This will help you configure your Telegram bot and LLM provider.\n');
|
|
13
12
|
const existingConfig = existsSync(join(process.cwd(), '.env')) ? loadConfig() : null;
|
|
13
|
+
// Step 1: Ask for Telegram Bot Token
|
|
14
14
|
const answers = await inquirer.prompt([
|
|
15
15
|
{
|
|
16
16
|
type: 'input',
|
|
@@ -27,51 +27,65 @@ async function runSetup() {
|
|
|
27
27
|
return true;
|
|
28
28
|
},
|
|
29
29
|
},
|
|
30
|
+
]);
|
|
31
|
+
// Step 2: Ask for provider selection
|
|
32
|
+
const providerAnswers = await inquirer.prompt([
|
|
30
33
|
{
|
|
31
34
|
type: 'list',
|
|
32
35
|
name: 'provider',
|
|
33
36
|
message: 'Select LLM Provider:',
|
|
34
|
-
choices:
|
|
35
|
-
{ name: 'OpenCode (OpenAI-compatible)', value: 'opencode' },
|
|
36
|
-
{ name: 'MiniMax', value: 'minimax' },
|
|
37
|
-
],
|
|
37
|
+
choices: getProviderList(),
|
|
38
38
|
default: existingConfig?.provider || 'opencode',
|
|
39
39
|
},
|
|
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
|
-
},
|
|
40
|
+
]);
|
|
41
|
+
answers.provider = providerAnswers.provider;
|
|
42
|
+
// Step 3: Ask for API Key (password input)
|
|
43
|
+
const apiKeyAnswer = await inquirer.prompt([
|
|
61
44
|
{
|
|
62
45
|
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',
|
|
46
|
+
name: 'apiKey',
|
|
47
|
+
message: `${PROVIDERS[answers.provider].name} API Key:`,
|
|
48
|
+
default: existingConfig?.apiKey || '',
|
|
49
|
+
mask: '*',
|
|
74
50
|
},
|
|
51
|
+
]);
|
|
52
|
+
answers.apiKey = apiKeyAnswer.apiKey;
|
|
53
|
+
// Step 4: Fetch available models
|
|
54
|
+
console.log('\nFetching available models...');
|
|
55
|
+
let models = [];
|
|
56
|
+
try {
|
|
57
|
+
models = await fetchModels(answers.provider, answers.apiKey);
|
|
58
|
+
console.log(`Found ${models.length} models.\n`);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.warn('Failed to fetch models from API, will ask for manual input.\n');
|
|
62
|
+
}
|
|
63
|
+
// Step 5 & 6: If models returned, show dropdown; otherwise ask manually
|
|
64
|
+
if (models.length > 0) {
|
|
65
|
+
const modelAnswer = await inquirer.prompt([
|
|
66
|
+
{
|
|
67
|
+
type: 'list',
|
|
68
|
+
name: 'model',
|
|
69
|
+
message: 'Select Model:',
|
|
70
|
+
choices: models.map(m => ({ name: m.name, value: m.id })),
|
|
71
|
+
default: existingConfig?.model || models[0]?.id || '',
|
|
72
|
+
},
|
|
73
|
+
]);
|
|
74
|
+
answers.model = modelAnswer.model;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const modelAnswer = await inquirer.prompt([
|
|
78
|
+
{
|
|
79
|
+
type: 'input',
|
|
80
|
+
name: 'model',
|
|
81
|
+
message: 'Enter Model name:',
|
|
82
|
+
default: existingConfig?.model || '',
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
answers.model = modelAnswer.model;
|
|
86
|
+
}
|
|
87
|
+
// Step 7: Ask for autolaunch options
|
|
88
|
+
const autolaunchAnswers = await inquirer.prompt([
|
|
75
89
|
{
|
|
76
90
|
type: 'confirm',
|
|
77
91
|
name: 'enableAutolaunch',
|
|
@@ -83,27 +97,18 @@ async function runSetup() {
|
|
|
83
97
|
name: 'systemdUser',
|
|
84
98
|
message: 'Systemd service user (e.g., ubuntu):',
|
|
85
99
|
default: 'ubuntu',
|
|
86
|
-
when: (
|
|
100
|
+
when: (ans) => ans.enableAutolaunch,
|
|
87
101
|
},
|
|
88
102
|
]);
|
|
89
|
-
|
|
103
|
+
answers.enableAutolaunch = autolaunchAnswers.enableAutolaunch;
|
|
104
|
+
answers.systemdUser = autolaunchAnswers.systemdUser;
|
|
105
|
+
// Save unified config
|
|
90
106
|
const lines = [
|
|
91
107
|
`TELEGRAM_BOT_TOKEN=${answers.telegramBotToken}`,
|
|
92
108
|
`SAID_PROVIDER=${answers.provider}`,
|
|
109
|
+
`SAID_API_KEY=${answers.apiKey}`,
|
|
110
|
+
`SAID_MODEL=${answers.model}`,
|
|
93
111
|
];
|
|
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
112
|
// Save .env file
|
|
108
113
|
const envPath = join(process.cwd(), '.env');
|
|
109
114
|
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":"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"}
|