Skip to content

Commit d0d6e4b

Browse files
committed
init simpler
1 parent 1fdedf4 commit d0d6e4b

File tree

6 files changed

+188
-11
lines changed

6 files changed

+188
-11
lines changed

.env.example

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
VERCEL_OIDC_TOKEN="create with vercel cli"
1+
# API keys (set via 'bun run scripts/secrets.ts set VERCEL_OIDC_TOKEN')
2+
# Note: API keys are stored in OS credential manager for security
3+
# No .env file needed - use the secrets CLI instead

AGENTS.md

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ AI SDK benchmarking tool built with Vercel AI SDK and Bun runtime. Tests AI agen
88
# Install dependencies (runs patch-package automatically)
99
bun install
1010

11-
# Run the main benchmark (discovers and runs all tests)
11+
# Run main benchmark (discovers and runs all tests)
1212
bun run index.ts
1313

1414
# Verify reference implementations against test suites
@@ -22,6 +22,11 @@ bun run generate-report.ts results/result-2024-12-07-14-30-45.json
2222

2323
# Run TypeScript type checking
2424
bun tsc --noEmit
25+
26+
# Secrets management
27+
bun run secrets # Show token status
28+
bun run secrets set VERCEL_OIDC_TOKEN <value> # Store Vercel token
29+
bun run secrets get VERCEL_OIDC_TOKEN # Get Vercel token
2530
```
2631

2732
## Environment Variables
@@ -106,10 +111,28 @@ MCP_SERVER_URL=
106111

107112
### Required API Keys
108113

109-
- `ANTHROPIC_API_KEY`: Required when using `anthropic/*` models
110-
- `OPENAI_API_KEY`: Required when using `openai/*` models (get at https://platform.openai.com/api-keys)
111-
- `OPENROUTER_API_KEY`: Required when using `openrouter/*` models (get at https://openrouter.ai/keys)
112-
- No API key required for `lmstudio/*` models (runs locally)
114+
- `VERCEL_OIDC_TOKEN`: Required for Vercel AI Gateway (stored in bun.secrets)
115+
- Other API keys (Anthropic, OpenAI, OpenRouter) are configured in Vercel dashboard when using AI Gateway
116+
117+
### Secrets Management
118+
119+
The tool uses Bun's secure credential storage for the Vercel OIDC token:
120+
121+
```bash
122+
# Store Vercel OIDC token
123+
bun run secrets set VERCEL_OIDC_TOKEN your_token_here
124+
125+
# Check if token is stored
126+
bun run secrets
127+
128+
# Get the stored token
129+
bun run secrets get VERCEL_OIDC_TOKEN
130+
```
131+
132+
**Security Benefits:**
133+
- Encrypted storage using OS credential manager (Keychain, libsecret, Windows Credential Manager)
134+
- No plaintext tokens in files
135+
- User-level access control
113136

114137
### Provider Routing
115138

README.md

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,40 @@ bun install
1212

1313
## Setup
1414

15-
Configure your API keys in `.env`:
15+
Configure your Vercel OIDC token using bun.secrets:
1616

1717
1. Install Vercel CLI if you haven't already
1818
2. Run `bun run vercel:link` and link the benchmark to a project that has AI Gateway enabled
19-
3. Run the benchmark with "bun run dev"
19+
3. Store your VERCEL_OIDC_TOKEN securely:
20+
```bash
21+
# Get your token from Vercel project settings
22+
bun run secrets set VERCEL_OIDC_TOKEN your_token_here
23+
```
2024

2125
### Required API Keys
2226

23-
You'll need at least one API key for the providers you want to test:
27+
- `VERCEL_OIDC_TOKEN`: Required for Vercel AI Gateway (stored in bun.secrets)
28+
- Other API keys (Anthropic, OpenAI, OpenRouter) are configured in the Vercel dashboard when using AI Gateway
2429

25-
- `VERCEL_OIDC_TOKEN`: The OIDC token for vercel AI gateway
30+
## Secrets Management
31+
32+
API keys are stored securely using your OS credential manager:
33+
34+
```bash
35+
# Check if token is set
36+
bun run secrets
37+
38+
# Set token
39+
bun run secrets set VERCEL_OIDC_TOKEN your_token_here
40+
41+
# Get token
42+
bun run secrets get VERCEL_OIDC_TOKEN
43+
```
44+
45+
**Security Benefits:**
46+
- Encrypted storage using OS credential manager (Keychain, libsecret, Windows Credential Manager)
47+
- No plaintext API keys in files
48+
- User-level access control
2649

2750
## Usage
2851

index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import {
4343
note,
4444
} from "@clack/prompts";
4545
import { gateway } from "ai";
46+
import { loadTokenToEnv } from "./scripts/secrets.ts";
4647

4748
interface PricingValidationResult {
4849
enabled: boolean;
@@ -500,6 +501,9 @@ async function runSingleTest(
500501

501502
// Main execution
502503
async function main() {
504+
// Load VERCEL_OIDC_TOKEN from bun.secrets
505+
await loadTokenToEnv();
506+
503507
const { models, mcp, testingTool, pricing } = await selectOptions();
504508

505509
// Get MCP server URL/command from environment (optional)

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"tsc": "tsc --noEmit",
1414
"test:self": "bun vitest run lib/*.test.ts",
1515
"vercel:link": "vercel link",
16-
"vercel:env:pull": "vercel env pull .env.local --yes"
16+
"vercel:env:pull": "vercel env pull .env.local --yes",
17+
"secrets": "bun run scripts/secrets.ts"
1718
},
1819
"devDependencies": {
1920
"@sveltejs/vite-plugin-svelte": "^5.0.3",

scripts/secrets.ts

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
#!/usr/bin/env bun
2+
/**
3+
* Simple CLI tool for managing VERCEL_OIDC_TOKEN using bun.secrets
4+
*
5+
* Usage:
6+
* bun run secrets set VERCEL_OIDC_TOKEN <value> # Set the token
7+
* bun run secrets get VERCEL_OIDC_TOKEN # Get the token
8+
* bun run secrets # Show status
9+
*/
10+
11+
import { secrets } from "bun";
12+
13+
async function showStatus() {
14+
console.log("\n🔐 Vercel OIDC Token Status");
15+
console.log("─".repeat(40));
16+
17+
const token = await secrets.get({
18+
service: "svelte-ai",
19+
name: "VERCEL_OIDC_TOKEN"
20+
});
21+
22+
if (token) {
23+
const masked = token.slice(0, 12) + "..." + token.slice(-8);
24+
console.log(`✅ VERCEL_OIDC_TOKEN: ${masked}`);
25+
} else {
26+
console.log("❌ VERCEL_OIDC_TOKEN: Not set");
27+
console.log("\n💡 Run 'bun run secrets set VERCEL_OIDC_TOKEN <value>' to set it");
28+
}
29+
}
30+
31+
async function setToken(value: string) {
32+
if (!value) {
33+
// Empty value means delete the token
34+
await secrets.delete({
35+
service: "svelte-ai",
36+
name: "VERCEL_OIDC_TOKEN"
37+
});
38+
console.log("🗑️ VERCEL_OIDC_TOKEN deleted from OS credential manager");
39+
return;
40+
}
41+
42+
if (value.length < 20) {
43+
console.error("❌ Invalid token: VERCEL_OIDC_TOKEN appears to be too short");
44+
process.exit(1);
45+
}
46+
47+
await secrets.set({
48+
service: "svelte-ai",
49+
name: "VERCEL_OIDC_TOKEN",
50+
value,
51+
});
52+
53+
console.log("✅ VERCEL_OIDC_TOKEN stored securely in OS credential manager");
54+
}
55+
56+
async function getToken() {
57+
const token = await secrets.get({
58+
service: "svelte-ai",
59+
name: "VERCEL_OIDC_TOKEN"
60+
});
61+
62+
if (token) {
63+
console.log(`VERCEL_OIDC_TOKEN: ${token}`);
64+
} else {
65+
console.log("❌ VERCEL_OIDC_TOKEN not found");
66+
process.exit(1);
67+
}
68+
}
69+
70+
async function loadTokenToEnv() {
71+
const token = await secrets.get({
72+
service: "svelte-ai",
73+
name: "VERCEL_OIDC_TOKEN"
74+
});
75+
76+
if (token) {
77+
process.env.VERCEL_OIDC_TOKEN = token;
78+
console.log("✅ VERCEL_OIDC_TOKEN loaded from bun.secrets");
79+
}
80+
}
81+
82+
// Export for use in main application
83+
export { loadTokenToEnv };
84+
85+
// CLI logic
86+
if (import.meta.main) {
87+
const command = process.argv[2];
88+
const arg1 = process.argv[3];
89+
const arg2 = process.argv[4];
90+
91+
switch (command) {
92+
case "set":
93+
if (arg1 !== "VERCEL_OIDC_TOKEN") {
94+
console.error("Usage: bun run secrets set VERCEL_OIDC_TOKEN <value>");
95+
process.exit(1);
96+
}
97+
// Empty arg2 means delete, otherwise set the value
98+
await setToken(arg2 || "");
99+
break;
100+
101+
case "get":
102+
if (arg1 !== "VERCEL_OIDC_TOKEN") {
103+
console.error("Usage: bun run secrets get VERCEL_OIDC_TOKEN");
104+
process.exit(1);
105+
}
106+
await getToken();
107+
break;
108+
109+
case "load":
110+
// Internal command used by main app
111+
await loadTokenToEnv();
112+
break;
113+
114+
case undefined:
115+
case "status":
116+
await showStatus();
117+
break;
118+
119+
default:
120+
console.error(`Unknown command: ${command}`);
121+
console.error("Available commands: status, set VERCEL_OIDC_TOKEN <value>, get VERCEL_OIDC_TOKEN");
122+
process.exit(1);
123+
}
124+
}

0 commit comments

Comments
 (0)