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.
@@ -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. Set GOOGLE_API_KEY (Gemini), OPENAI_API_KEY (OpenAI), or ANTHROPIC_API_KEY (Anthropic)."`,
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(" Set GOOGLE_API_KEY (Gemini, preferred) or OPENAI_API_KEY (OpenAI).")`,
435
- ` print(" Example: export GOOGLE_API_KEY='your-key-here'")`,
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 localEnvPath = null;
86
- if (targetFilePath && existsSync(targetFilePath)) {
87
- const absTarget = resolve(targetFilePath);
108
+ let localEnv = {};
109
+ const cwdEnvPath = join(process.cwd(), '.env');
110
+ let localEnvPath = cwdEnvPath;
111
+ if (existsSync(cwdEnvPath)) {
88
112
  try {
89
- const dir = statSync(absTarget).isDirectory() ? absTarget : dirname(absTarget);
90
- localEnvPath = join(dir, '.env');
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
- let localEnv = {};
99
- if (localEnvPath && existsSync(localEnvPath)) {
117
+ if (targetFilePath && existsSync(targetFilePath)) {
118
+ const absTarget = resolve(targetFilePath);
100
119
  try {
101
- localEnv = parseDotEnv(readFileSync(localEnvPath, 'utf-8'));
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 global credentials or create a local .env file.`);
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 global credentials or create a local .env file.`);
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 global credentials or create a local .env file.`);
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
- if (!process.env.GOOGLE_API_KEY && !process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY && result.ir.agents.length > 0) {
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 global credentials or create a local .env file.`);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openagentflow",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "An open, portable specification for describing AI agent workflows using a human-readable text language.",
5
5
  "type": "module",
6
6
  "main": "compiler/index.js",