Skip to content

Commit f79ca16

Browse files
Peter MarreckPeter Marreck
authored andcommitted
feat: support CODESCAN_EMBEDDING_API_KEY env var for oMLX auth
Env var overrides embedding_api_key in config. Avoids hardcoding API keys in per-project config files. Init and error messages updated to mention the env var.
1 parent da0be02 commit f79ca16

1 file changed

Lines changed: 18 additions & 5 deletions

File tree

src/main.zig

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ pub fn main() !void {
182182
var stderr_buf: [4096]u8 = undefined;
183183
var stderr_writer = std.fs.File.stderr().writer(&stderr_buf);
184184
const se = &stderr_writer.interface;
185-
_ = se.print("error: embedding_api=openai requires embedding_api_key to be set in config\n", .{}) catch {};
185+
_ = se.print("error: embedding_api=openai requires an API key.\n" ++
186+
" Set CODESCAN_EMBEDDING_SERVER_API_KEY env var or embedding_api_key in .codescan/config.ini\n", .{}) catch {};
186187
std.process.exit(1);
187188
}
188189

@@ -298,9 +299,11 @@ pub fn main() !void {
298299
} else {
299300
if (d.default_model) |dm| {
300301
_ = stderr.print(" Found oMLX on {s} with model '{s}'.\n" ++
301-
" Set embedding_api_key in .codescan/config.ini then run 'codescan index'.\n", .{ d.url, dm }) catch {};
302+
" Set CODESCAN_EMBEDDING_SERVER_API_KEY env var (or embedding_api_key in config)\n" ++
303+
" then run 'codescan index'.\n", .{ d.url, dm }) catch {};
302304
} else {
303-
_ = stderr.print(" Found oMLX on {s}. Configure embedding_api_key in .codescan/config.ini\n" ++
305+
_ = stderr.print(" Found oMLX on {s}.\n" ++
306+
" Set CODESCAN_EMBEDDING_SERVER_API_KEY env var (or embedding_api_key in config)\n" ++
304307
" then run 'codescan index' for semantic search.\n", .{d.url}) catch {};
305308
}
306309
}
@@ -1442,6 +1445,14 @@ fn resolveSettings(allocator: std.mem.Allocator, parsed: cli.Parsed, cfg: config
14421445
else => return err,
14431446
}
14441447

1448+
var env_api_key: ?[]u8 = null;
1449+
if (std.process.getEnvVarOwned(allocator, "CODESCAN_EMBEDDING_SERVER_API_KEY")) |value| {
1450+
env_api_key = value;
1451+
} else |err| switch (err) {
1452+
error.EnvironmentVariableNotFound => {},
1453+
else => return err,
1454+
}
1455+
14451456
if (cfg.output) |value| settings.output = value;
14461457
if (cfg.top_n) |value| settings.top_n = value;
14471458
if (cfg.root_path) |value| settings.root_path = value;
@@ -1546,8 +1557,10 @@ fn resolveSettings(allocator: std.mem.Allocator, parsed: cli.Parsed, cfg: config
15461557
}
15471558
}
15481559

1549-
// Format Bearer token from api key
1550-
if (cfg.embedding_api_key) |key| {
1560+
// Format Bearer token from api key (env var overrides config)
1561+
const api_key = env_api_key orelse cfg.embedding_api_key;
1562+
defer if (env_api_key) |k| allocator.free(k); // always free owned env string
1563+
if (api_key) |key| {
15511564
settings.embedding_auth_header = try std.fmt.allocPrint(allocator, "Bearer {s}", .{key});
15521565
settings.embedding_auth_header_owned = true;
15531566
}

0 commit comments

Comments
 (0)