@narrative-os/cli 0.1.8 → 0.1.10
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/commands/config.d.ts +3 -3
- package/dist/commands/config.js +104 -18
- package/package.json +2 -2
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
interface ModelConfig {
|
|
2
2
|
name: string;
|
|
3
|
-
provider: 'openai' | 'deepseek';
|
|
3
|
+
provider: 'openai' | 'deepseek' | 'alibaba' | 'ark';
|
|
4
4
|
apiKey: string;
|
|
5
5
|
baseURL?: string;
|
|
6
6
|
model: string;
|
|
7
|
-
purpose: 'reasoning' | 'chat' | 'fast';
|
|
7
|
+
purpose: 'reasoning' | 'chat' | 'fast' | 'embedding';
|
|
8
8
|
}
|
|
9
9
|
interface MultiModelConfig {
|
|
10
10
|
models: ModelConfig[];
|
|
11
11
|
defaultModel: string;
|
|
12
12
|
}
|
|
13
13
|
interface LegacyConfig {
|
|
14
|
-
provider: 'openai' | 'deepseek';
|
|
14
|
+
provider: 'openai' | 'deepseek' | 'alibaba' | 'ark';
|
|
15
15
|
apiKey: string;
|
|
16
16
|
model: string;
|
|
17
17
|
}
|
package/dist/commands/config.js
CHANGED
|
@@ -11,6 +11,8 @@ const CONFIG_FILE = (0, path_1.join)(CONFIG_DIR, 'config.json');
|
|
|
11
11
|
const PROVIDERS = [
|
|
12
12
|
{ name: 'OpenAI', value: 'openai', models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo'] },
|
|
13
13
|
{ name: 'DeepSeek', value: 'deepseek', models: ['deepseek-chat', 'deepseek-reasoner'] },
|
|
14
|
+
{ name: 'Alibaba Cloud (Qwen)', value: 'alibaba', models: ['qwen-max', 'qwen-plus', 'qwen-turbo', 'text-embedding-v3'] },
|
|
15
|
+
{ name: 'ByteDance Ark', value: 'ark', models: ['doubao-pro-128k', 'doubao-lite-128k', 'doubao-embedding'] },
|
|
14
16
|
];
|
|
15
17
|
function loadConfig() {
|
|
16
18
|
if (!(0, fs_1.existsSync)(CONFIG_FILE))
|
|
@@ -91,32 +93,104 @@ async function configCommand(showOnly = false) {
|
|
|
91
93
|
choices: providerInfo.models.map(m => ({ name: m, value: m })),
|
|
92
94
|
default: provider === 'deepseek' ? 'deepseek-chat' : 'gpt-4o-mini',
|
|
93
95
|
});
|
|
94
|
-
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
{
|
|
106
|
-
|
|
96
|
+
// Determine if provider supports embeddings natively
|
|
97
|
+
const supportsEmbeddings = provider === 'alibaba' || provider === 'ark' || provider === 'openai';
|
|
98
|
+
const needsSeparateEmbedding = provider === 'deepseek';
|
|
99
|
+
let embeddingConfig;
|
|
100
|
+
if (needsSeparateEmbedding) {
|
|
101
|
+
// DeepSeek doesn't support embeddings, ask for alternative
|
|
102
|
+
const useOpenAIEmbeddings = await confirm({
|
|
103
|
+
message: 'Use OpenAI for embeddings? (DeepSeek does not support embeddings)',
|
|
104
|
+
default: true,
|
|
105
|
+
});
|
|
106
|
+
if (useOpenAIEmbeddings) {
|
|
107
|
+
const openAIEmbedKey = await password({
|
|
108
|
+
message: 'Enter OpenAI API key (for embeddings):',
|
|
109
|
+
mask: '*',
|
|
110
|
+
});
|
|
111
|
+
embeddingConfig = {
|
|
112
|
+
name: 'embedding',
|
|
113
|
+
provider: 'openai',
|
|
114
|
+
apiKey: openAIEmbedKey,
|
|
115
|
+
model: 'text-embedding-3-small',
|
|
116
|
+
purpose: 'embedding',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else if (supportsEmbeddings) {
|
|
121
|
+
// Provider supports embeddings, ask if they want to use it
|
|
122
|
+
const useProviderEmbeddings = await confirm({
|
|
123
|
+
message: `Use ${provider === 'alibaba' ? 'Alibaba Cloud' : provider === 'ark' ? 'ByteDance Ark' : 'OpenAI'} for embeddings?`,
|
|
124
|
+
default: true,
|
|
125
|
+
});
|
|
126
|
+
if (useProviderEmbeddings) {
|
|
127
|
+
const embedModel = provider === 'alibaba'
|
|
128
|
+
? 'text-embedding-v3'
|
|
129
|
+
: provider === 'ark'
|
|
130
|
+
? 'doubao-embedding'
|
|
131
|
+
: 'text-embedding-3-small';
|
|
132
|
+
embeddingConfig = {
|
|
133
|
+
name: 'embedding',
|
|
107
134
|
provider: provider,
|
|
108
135
|
apiKey,
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
136
|
+
model: embedModel,
|
|
137
|
+
purpose: 'embedding',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Set baseURL based on provider
|
|
142
|
+
let baseURL;
|
|
143
|
+
switch (provider) {
|
|
144
|
+
case 'deepseek':
|
|
145
|
+
baseURL = 'https://api.deepseek.com';
|
|
146
|
+
break;
|
|
147
|
+
case 'alibaba':
|
|
148
|
+
baseURL = 'https://dashscope.aliyuncs.com/compatible-mode/v1';
|
|
149
|
+
break;
|
|
150
|
+
case 'ark':
|
|
151
|
+
baseURL = 'https://ark.cn-beijing.volces.com/api/v3';
|
|
152
|
+
break;
|
|
153
|
+
default:
|
|
154
|
+
baseURL = undefined;
|
|
155
|
+
}
|
|
156
|
+
const models = [
|
|
157
|
+
{
|
|
158
|
+
name: 'reasoning',
|
|
159
|
+
provider: provider,
|
|
160
|
+
apiKey,
|
|
161
|
+
baseURL,
|
|
162
|
+
model: reasoningModel,
|
|
163
|
+
purpose: 'reasoning',
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
name: 'chat',
|
|
167
|
+
provider: provider,
|
|
168
|
+
apiKey,
|
|
169
|
+
baseURL,
|
|
170
|
+
model: chatModel,
|
|
171
|
+
purpose: 'chat',
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
if (embeddingConfig) {
|
|
175
|
+
models.push(embeddingConfig);
|
|
176
|
+
}
|
|
177
|
+
const config = {
|
|
178
|
+
models,
|
|
114
179
|
defaultModel: 'chat',
|
|
115
180
|
};
|
|
116
181
|
saveConfig(config);
|
|
117
182
|
console.log(`\n✅ Multi-model configuration saved!`);
|
|
118
183
|
console.log(` Reasoning: ${reasoningModel}`);
|
|
119
184
|
console.log(` Chat: ${chatModel}`);
|
|
185
|
+
if (embeddingConfig) {
|
|
186
|
+
const embedProvider = embeddingConfig.provider === 'alibaba' ? 'Alibaba Cloud'
|
|
187
|
+
: embeddingConfig.provider === 'ark' ? 'ByteDance Ark'
|
|
188
|
+
: 'OpenAI';
|
|
189
|
+
console.log(` Embeddings: ${embedProvider} (${embeddingConfig.model})`);
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
console.log(` Embeddings: Mock (no API configured)`);
|
|
193
|
+
}
|
|
120
194
|
}
|
|
121
195
|
else {
|
|
122
196
|
// Single model configuration (legacy)
|
|
@@ -159,6 +233,12 @@ function applyConfig() {
|
|
|
159
233
|
else if (model.provider === 'deepseek') {
|
|
160
234
|
process.env.DEEPSEEK_API_KEY = model.apiKey;
|
|
161
235
|
}
|
|
236
|
+
else if (model.provider === 'alibaba') {
|
|
237
|
+
process.env.ALIBABA_API_KEY = model.apiKey;
|
|
238
|
+
}
|
|
239
|
+
else if (model.provider === 'ark') {
|
|
240
|
+
process.env.ARK_API_KEY = model.apiKey;
|
|
241
|
+
}
|
|
162
242
|
}
|
|
163
243
|
}
|
|
164
244
|
else {
|
|
@@ -171,5 +251,11 @@ function applyConfig() {
|
|
|
171
251
|
else if (config.provider === 'deepseek') {
|
|
172
252
|
process.env.DEEPSEEK_API_KEY = config.apiKey;
|
|
173
253
|
}
|
|
254
|
+
else if (config.provider === 'alibaba') {
|
|
255
|
+
process.env.ALIBABA_API_KEY = config.apiKey;
|
|
256
|
+
}
|
|
257
|
+
else if (config.provider === 'ark') {
|
|
258
|
+
process.env.ARK_API_KEY = config.apiKey;
|
|
259
|
+
}
|
|
174
260
|
}
|
|
175
261
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@narrative-os/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
4
4
|
"description": "AI-native narrative engine for long-form story generation",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@inquirer/prompts": "^8.3.0",
|
|
42
|
-
"@narrative-os/engine": "0.1.
|
|
42
|
+
"@narrative-os/engine": "0.1.7",
|
|
43
43
|
"commander": "^12.0.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|