cae59b589e
- workflow.yaml supports config section (maxDepth, extract provider) - ExtractProviderConfig with env: prefix for apiKey resolution - getExtractProvider(storageRoot) returns LlmProvider from config - workflowAsAgent uses config maxDepth (fallback 3) - Registry read/write preserves config - 158 tests passing Fixes #43
88 lines
2.6 KiB
TypeScript
88 lines
2.6 KiB
TypeScript
import { describe, expect, test } from "bun:test";
|
|
import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
|
|
import { getExtractProvider } from "../src/extract-provider.js";
|
|
|
|
describe("getExtractProvider", () => {
|
|
test("returns provider when config.extract is present", async () => {
|
|
const root = await mkdtemp(join(tmpdir(), "wf-ext-prov-ok-"));
|
|
try {
|
|
await mkdir(root, { recursive: true });
|
|
await writeFile(
|
|
join(root, "workflow.yaml"),
|
|
`config:
|
|
maxDepth: 3
|
|
extract:
|
|
baseUrl: https://dashscope.aliyuncs.com/compatible-mode/v1
|
|
model: qwen-plus
|
|
apiKey: literal-key
|
|
workflows: {}
|
|
`,
|
|
"utf8",
|
|
);
|
|
const r = await getExtractProvider(root);
|
|
expect(r.ok).toBe(true);
|
|
if (!r.ok) {
|
|
return;
|
|
}
|
|
expect(r.value.baseUrl).toBe("https://dashscope.aliyuncs.com/compatible-mode/v1");
|
|
expect(r.value.model).toBe("qwen-plus");
|
|
expect(r.value.apiKey).toBe("literal-key");
|
|
} finally {
|
|
await rm(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("errs when registry has no config section", async () => {
|
|
const root = await mkdtemp(join(tmpdir(), "wf-ext-prov-missing-"));
|
|
try {
|
|
await mkdir(root, { recursive: true });
|
|
await writeFile(join(root, "workflow.yaml"), "workflows: {}\n", "utf8");
|
|
const r = await getExtractProvider(root);
|
|
expect(r.ok).toBe(false);
|
|
if (r.ok) {
|
|
return;
|
|
}
|
|
expect(r.error).toContain("no global config");
|
|
} finally {
|
|
await rm(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test("resolves apiKey from env at registry read time", async () => {
|
|
const root = await mkdtemp(join(tmpdir(), "wf-ext-prov-env-"));
|
|
const prev = process.env.WF_GET_EXTRACT_PROVIDER_KEY;
|
|
process.env.WF_GET_EXTRACT_PROVIDER_KEY = "resolved-secret";
|
|
try {
|
|
await mkdir(root, { recursive: true });
|
|
await writeFile(
|
|
join(root, "workflow.yaml"),
|
|
`config:
|
|
maxDepth: 1
|
|
extract:
|
|
baseUrl: https://example.com
|
|
model: m
|
|
apiKey: env:WF_GET_EXTRACT_PROVIDER_KEY
|
|
workflows: {}
|
|
`,
|
|
"utf8",
|
|
);
|
|
const r = await getExtractProvider(root);
|
|
expect(r.ok).toBe(true);
|
|
if (!r.ok) {
|
|
return;
|
|
}
|
|
expect(r.value.apiKey).toBe("resolved-secret");
|
|
} finally {
|
|
if (prev === undefined) {
|
|
delete process.env.WF_GET_EXTRACT_PROVIDER_KEY;
|
|
} else {
|
|
process.env.WF_GET_EXTRACT_PROVIDER_KEY = prev;
|
|
}
|
|
await rm(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
});
|