openagentflow 0.1.4 → 0.1.5
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/adapters/langgraph/templates.js +3 -3
- package/cli/env.js +37 -13
- package/cli/index.js +13 -9
- package/package.json +1 -1
|
@@ -224,7 +224,7 @@ export function generateLlmHelperTemplate({ defaultModel, defaultTemperature })
|
|
|
224
224
|
` raise RuntimeError("Missing package: pip install langchain-anthropic")`,
|
|
225
225
|
` else:`,
|
|
226
226
|
` raise RuntimeError(`,
|
|
227
|
-
` "No LLM provider available or configured.
|
|
227
|
+
` "No LLM provider available or configured. Run 'npx openagentflow auth' to set up credentials, or set GOOGLE_API_KEY / OPENAI_API_KEY / ANTHROPIC_API_KEY in your local .env file."`,
|
|
228
228
|
` )`,
|
|
229
229
|
``,
|
|
230
230
|
`def _parse_llm_output(raw_content, outputs):`,
|
|
@@ -431,8 +431,8 @@ export function generateMainTemplate({ workflowName, initialStateFields, require
|
|
|
431
431
|
` # Ensure at least one API key is set`,
|
|
432
432
|
` if not _LLM_PROVIDER:`,
|
|
433
433
|
` print("Error: No LLM provider configured.")`,
|
|
434
|
-
` print("
|
|
435
|
-
` print("
|
|
434
|
+
` print(" Run 'npx openagentflow auth' to configure credentials or edit your local .env file.")`,
|
|
435
|
+
` print(" Or set manually: export GOOGLE_API_KEY='AIza...'")`,
|
|
436
436
|
` exit(1)`,
|
|
437
437
|
``,
|
|
438
438
|
` print(f"Default fallback provider: {_LLM_PROVIDER}")`,
|
package/cli/env.js
CHANGED
|
@@ -55,6 +55,29 @@ export function parseDotEnv(content) {
|
|
|
55
55
|
return result;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Check if an environment variable value is a dummy placeholder string or unset.
|
|
60
|
+
* Returns true if val is null, undefined, empty, or contains typical template placeholder markers.
|
|
61
|
+
*/
|
|
62
|
+
export function isPlaceholder(val) {
|
|
63
|
+
if (val === null || val === undefined || typeof val !== 'string') {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
const trimmed = val.trim();
|
|
67
|
+
if (trimmed === '') {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
const lower = trimmed.toLowerCase();
|
|
71
|
+
return (
|
|
72
|
+
lower.startsWith('your_') ||
|
|
73
|
+
lower.startsWith('your-') ||
|
|
74
|
+
lower.includes('_here') ||
|
|
75
|
+
lower.includes('-here') ||
|
|
76
|
+
lower === 'todo' ||
|
|
77
|
+
lower === 'placeholder'
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
58
81
|
/**
|
|
59
82
|
* Resolve environment variables across the 4-tier hierarchy:
|
|
60
83
|
* 1. Inline CLI overrides & System Environment Variables (already in process.env)
|
|
@@ -82,23 +105,24 @@ export function resolveEnvHierarchy(targetFilePath = null) {
|
|
|
82
105
|
} catch (err) {}
|
|
83
106
|
}
|
|
84
107
|
|
|
85
|
-
let
|
|
86
|
-
|
|
87
|
-
|
|
108
|
+
let localEnv = {};
|
|
109
|
+
const cwdEnvPath = join(process.cwd(), '.env');
|
|
110
|
+
let localEnvPath = cwdEnvPath;
|
|
111
|
+
if (existsSync(cwdEnvPath)) {
|
|
88
112
|
try {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
} catch (err) {
|
|
92
|
-
localEnvPath = join(process.cwd(), '.env');
|
|
93
|
-
}
|
|
94
|
-
} else {
|
|
95
|
-
localEnvPath = join(process.cwd(), '.env');
|
|
113
|
+
localEnv = parseDotEnv(readFileSync(cwdEnvPath, 'utf-8'));
|
|
114
|
+
} catch (err) {}
|
|
96
115
|
}
|
|
97
116
|
|
|
98
|
-
|
|
99
|
-
|
|
117
|
+
if (targetFilePath && existsSync(targetFilePath)) {
|
|
118
|
+
const absTarget = resolve(targetFilePath);
|
|
100
119
|
try {
|
|
101
|
-
|
|
120
|
+
const dir = statSync(absTarget).isDirectory() ? absTarget : dirname(absTarget);
|
|
121
|
+
const targetEnvPath = join(dir, '.env');
|
|
122
|
+
if (resolve(targetEnvPath) !== resolve(cwdEnvPath) && existsSync(targetEnvPath)) {
|
|
123
|
+
localEnvPath = targetEnvPath;
|
|
124
|
+
Object.assign(localEnv, parseDotEnv(readFileSync(targetEnvPath, 'utf-8')));
|
|
125
|
+
}
|
|
102
126
|
} catch (err) {}
|
|
103
127
|
}
|
|
104
128
|
|
package/cli/index.js
CHANGED
|
@@ -25,7 +25,7 @@ import os from 'os';
|
|
|
25
25
|
import { Compiler } from '../compiler/compiler.js';
|
|
26
26
|
import { VERSION } from '../compiler/version.js';
|
|
27
27
|
import { LangGraphAdapter } from '../adapters/langgraph/index.js';
|
|
28
|
-
import { resolveEnvHierarchy, setupAuth } from './env.js';
|
|
28
|
+
import { resolveEnvHierarchy, setupAuth, isPlaceholder } from './env.js';
|
|
29
29
|
|
|
30
30
|
// ─── ANSI Colors ───────────────────────────────────────────────────────────────
|
|
31
31
|
|
|
@@ -333,44 +333,48 @@ function cmdRun(filePath, flags, positional = []) {
|
|
|
333
333
|
else if (targetModel.startsWith('gemini-') || targetModel.startsWith('gemma-')) provider = 'gemini';
|
|
334
334
|
}
|
|
335
335
|
|
|
336
|
-
if (provider === 'anthropic' && !process.env.ANTHROPIC_API_KEY) {
|
|
336
|
+
if (provider === 'anthropic' && (!process.env.ANTHROPIC_API_KEY || isPlaceholder(process.env.ANTHROPIC_API_KEY))) {
|
|
337
337
|
console.error(`${colors.red}Error:${colors.reset} Missing required API key "ANTHROPIC_API_KEY" for agent "${agent.id}" (provider: anthropic).`);
|
|
338
338
|
console.error(`Looked in order of priority:`);
|
|
339
339
|
console.error(` 1. Inline CLI overrides`);
|
|
340
340
|
console.error(` 2. Local Project .env`);
|
|
341
341
|
console.error(` 3. System Environment Variables`);
|
|
342
342
|
console.error(` 4. Global OAF Store (~/.oaf/.env)`);
|
|
343
|
-
console.error(`Run \`oaf auth\` to set up your
|
|
343
|
+
console.error(`Run \`npx openagentflow auth\` (or \`oaf auth\` if globally installed) to set up your credentials or edit your local .env file.`);
|
|
344
344
|
process.exit(1);
|
|
345
|
-
} else if (provider === 'openai' && !process.env.OPENAI_API_KEY) {
|
|
345
|
+
} else if (provider === 'openai' && (!process.env.OPENAI_API_KEY || isPlaceholder(process.env.OPENAI_API_KEY))) {
|
|
346
346
|
console.error(`${colors.red}Error:${colors.reset} Missing required API key "OPENAI_API_KEY" for agent "${agent.id}" (provider: openai).`);
|
|
347
347
|
console.error(`Looked in order of priority:`);
|
|
348
348
|
console.error(` 1. Inline CLI overrides`);
|
|
349
349
|
console.error(` 2. Local Project .env`);
|
|
350
350
|
console.error(` 3. System Environment Variables`);
|
|
351
351
|
console.error(` 4. Global OAF Store (~/.oaf/.env)`);
|
|
352
|
-
console.error(`Run \`oaf auth\` to set up your
|
|
352
|
+
console.error(`Run \`npx openagentflow auth\` (or \`oaf auth\` if globally installed) to set up your credentials or edit your local .env file.`);
|
|
353
353
|
process.exit(1);
|
|
354
|
-
} else if (provider === 'gemini' && !process.env.GOOGLE_API_KEY) {
|
|
354
|
+
} else if (provider === 'gemini' && (!process.env.GOOGLE_API_KEY || isPlaceholder(process.env.GOOGLE_API_KEY))) {
|
|
355
355
|
console.error(`${colors.red}Error:${colors.reset} Missing required API key "GOOGLE_API_KEY" for agent "${agent.id}" (provider: gemini).`);
|
|
356
356
|
console.error(`Looked in order of priority:`);
|
|
357
357
|
console.error(` 1. Inline CLI overrides`);
|
|
358
358
|
console.error(` 2. Local Project .env`);
|
|
359
359
|
console.error(` 3. System Environment Variables`);
|
|
360
360
|
console.error(` 4. Global OAF Store (~/.oaf/.env)`);
|
|
361
|
-
console.error(`Run \`oaf auth\` to set up your
|
|
361
|
+
console.error(`Run \`npx openagentflow auth\` (or \`oaf auth\` if globally installed) to set up your credentials or edit your local .env file.`);
|
|
362
362
|
process.exit(1);
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
365
|
|
|
366
|
-
|
|
366
|
+
const hasValidGoogle = process.env.GOOGLE_API_KEY && !isPlaceholder(process.env.GOOGLE_API_KEY);
|
|
367
|
+
const hasValidOpenAI = process.env.OPENAI_API_KEY && !isPlaceholder(process.env.OPENAI_API_KEY);
|
|
368
|
+
const hasValidAnthropic = process.env.ANTHROPIC_API_KEY && !isPlaceholder(process.env.ANTHROPIC_API_KEY);
|
|
369
|
+
|
|
370
|
+
if (!hasValidGoogle && !hasValidOpenAI && !hasValidAnthropic && result.ir.agents.length > 0) {
|
|
367
371
|
console.error(`${colors.red}Error:${colors.reset} No LLM API key configured. Set GOOGLE_API_KEY (Gemini), OPENAI_API_KEY (OpenAI), or ANTHROPIC_API_KEY (Anthropic) to execute workflows.`);
|
|
368
372
|
console.error(`Looked in order of priority:`);
|
|
369
373
|
console.error(` 1. Inline CLI overrides`);
|
|
370
374
|
console.error(` 2. Local Project .env`);
|
|
371
375
|
console.error(` 3. System Environment Variables`);
|
|
372
376
|
console.error(` 4. Global OAF Store (~/.oaf/.env)`);
|
|
373
|
-
console.error(`Run \`oaf auth\` to set up your
|
|
377
|
+
console.error(`Run \`npx openagentflow auth\` (or \`oaf auth\` if globally installed) to set up your credentials or edit your local .env file.`);
|
|
374
378
|
process.exit(1);
|
|
375
379
|
}
|
|
376
380
|
}
|
package/package.json
CHANGED