@narrative-os/cli 0.1.9 → 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.
@@ -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
  }
@@ -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,26 +93,66 @@ 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
- // Ask for embedding provider (DeepSeek doesn't support embeddings)
95
- const useOpenAIEmbeddings = await confirm({
96
- message: 'Use OpenAI for embeddings? (DeepSeek does not support embeddings)',
97
- default: provider !== 'deepseek',
98
- });
96
+ // Determine if provider supports embeddings natively
97
+ const supportsEmbeddings = provider === 'alibaba' || provider === 'ark' || provider === 'openai';
98
+ const needsSeparateEmbedding = provider === 'deepseek';
99
99
  let embeddingConfig;
100
- if (useOpenAIEmbeddings) {
101
- const openAIEmbedKey = await password({
102
- message: 'Enter OpenAI API key (for embeddings):',
103
- mask: '*',
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,
104
105
  });
105
- embeddingConfig = {
106
- name: 'embedding',
107
- provider: 'openai',
108
- apiKey: openAIEmbedKey,
109
- model: 'text-embedding-3-small',
110
- purpose: 'fast',
111
- };
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',
134
+ provider: provider,
135
+ apiKey,
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;
112
155
  }
113
- const baseURL = provider === 'deepseek' ? 'https://api.deepseek.com' : undefined;
114
156
  const models = [
115
157
  {
116
158
  name: 'reasoning',
@@ -141,7 +183,10 @@ async function configCommand(showOnly = false) {
141
183
  console.log(` Reasoning: ${reasoningModel}`);
142
184
  console.log(` Chat: ${chatModel}`);
143
185
  if (embeddingConfig) {
144
- console.log(` Embeddings: OpenAI (text-embedding-3-small)`);
186
+ const embedProvider = embeddingConfig.provider === 'alibaba' ? 'Alibaba Cloud'
187
+ : embeddingConfig.provider === 'ark' ? 'ByteDance Ark'
188
+ : 'OpenAI';
189
+ console.log(` Embeddings: ${embedProvider} (${embeddingConfig.model})`);
145
190
  }
146
191
  else {
147
192
  console.log(` Embeddings: Mock (no API configured)`);
@@ -188,6 +233,12 @@ function applyConfig() {
188
233
  else if (model.provider === 'deepseek') {
189
234
  process.env.DEEPSEEK_API_KEY = model.apiKey;
190
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
+ }
191
242
  }
192
243
  }
193
244
  else {
@@ -200,5 +251,11 @@ function applyConfig() {
200
251
  else if (config.provider === 'deepseek') {
201
252
  process.env.DEEPSEEK_API_KEY = config.apiKey;
202
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
+ }
203
260
  }
204
261
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@narrative-os/cli",
3
- "version": "0.1.9",
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.6",
42
+ "@narrative-os/engine": "0.1.7",
43
43
  "commander": "^12.0.0"
44
44
  },
45
45
  "devDependencies": {