Skip to content

Commit 50006b2

Browse files
authored
Merge branch 'main' into lforst/add-responses-flavor
2 parents 53f200c + 50f01b1 commit 50006b2

81 files changed

Lines changed: 4903 additions & 346 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.changeset/fuzzy-evals-warn.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"braintrust": patch
3+
---
4+
5+
fix: Correct the eval file extension shown in CLI directory warnings

.changeset/short-moles-punch.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"braintrust": minor
3+
---
4+
5+
feat: Add @cursor/sdk instrumentation

.changeset/yellow-crabs-attend.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"braintrust": minor
3+
---
4+
5+
(feat) Add experiment dataset filters to experiment metadata

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ BRAINTRUST_API_KEY=
22
OPENAI_API_KEY=
33
ANTHROPIC_API_KEY=
44
GEMINI_API_KEY=
5+
CURSOR_API_KEY=
56
OPENROUTER_API_KEY=
67
MISTRAL_API_KEY=
78
HUGGINGFACE_API_KEY=

.github/workflows/checks.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,6 @@ jobs:
459459
- js-test
460460
- js-build
461461
- e2e-hermetic
462-
- js-api-compatibility
463462
- js-smoke-discover
464463
- js-smoke-test
465464
- temporal-js
@@ -492,7 +491,6 @@ jobs:
492491
check_result "js-test" "${{ needs.js-test.result }}"
493492
check_result "js-build" "${{ needs.js-build.result }}"
494493
check_result "e2e-hermetic" "${{ needs.e2e-hermetic.result }}"
495-
check_result "js-api-compatibility" "${{ needs.js-api-compatibility.result }}"
496494
check_result "js-smoke-discover" "${{ needs.js-smoke-discover.result }}"
497495
check_result "js-smoke-test" "${{ needs.js-smoke-test.result }}"
498496
check_result "temporal-js" "${{ needs.temporal-js.result }}"

.github/workflows/e2e-canary.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ jobs:
3535
BRAINTRUST_E2E_PROJECT_NAME: ${{ vars.BRAINTRUST_E2E_PROJECT_NAME }}
3636
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
3737
COHERE_API_KEY: ${{ secrets.COHERE_API_KEY }}
38+
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
3839
GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
3940
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
4041
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}

.github/workflows/integration-tests.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ jobs:
2929
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
3030
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
3131
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
32+
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
3233
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
3334
MISTRAL_API_KEY: ${{ secrets.MISTRAL_API_KEY }}
3435
HUGGINGFACE_API_KEY: ${{ secrets.HUGGINGFACE_API_KEY }}
@@ -58,6 +59,7 @@ jobs:
5859
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
5960
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
6061
COHERE_API_KEY: ${{ secrets.COHERE_API_KEY }}
62+
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
6163
GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
6264
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
6365
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}
@@ -110,6 +112,7 @@ jobs:
110112
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
111113
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
112114
COHERE_API_KEY: ${{ secrets.COHERE_API_KEY }}
115+
CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
113116
GROQ_API_KEY: ${{ secrets.GROQ_API_KEY }}
114117
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
115118
OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }}

e2e/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ Non-hermetic scenarios require provider credentials in addition to the mock Brai
115115
- `OPENAI_API_KEY`
116116
- `ANTHROPIC_API_KEY`
117117
- `GEMINI_API_KEY` or `GOOGLE_API_KEY`
118+
- `CURSOR_API_KEY`
118119
- `OPENROUTER_API_KEY`
119120
- `MISTRAL_API_KEY`
120121
- `HUGGINGFACE_API_KEY`

e2e/config/pr-comment-scenarios.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,11 @@
133133
"label": "v0.2.81"
134134
}
135135
]
136+
},
137+
{
138+
"scenarioDirName": "cursor-sdk-instrumentation",
139+
"label": "Cursor SDK Instrumentation",
140+
"metadataScenario": "cursor-sdk-instrumentation",
141+
"variants": [{ "variantKey": "cursor-sdk-v1", "label": "v1" }]
136142
}
137143
]

e2e/helpers/scenario-installer.ts

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const INSTALL_SECRET_ENV_VARS = [
2222
"ANTHROPIC_API_KEY",
2323
"BRAINTRUST_API_KEY",
2424
"COHERE_API_KEY",
25+
"CURSOR_API_KEY",
2526
"GEMINI_API_KEY",
2627
"GITHUB_TOKEN",
2728
"GH_TOKEN",
@@ -37,10 +38,9 @@ let cleanupRegistered = false;
3738

3839
type CanaryDependencyRule = {
3940
packageName: string;
40-
query: string;
41+
version: string;
4142
};
4243

43-
const canaryVersionCache = new Map<string, string>();
4444
const HELPERS_DIR = path.dirname(fileURLToPath(import.meta.url));
4545
const E2E_ROOT = path.resolve(HELPERS_DIR, "..");
4646

@@ -155,32 +155,6 @@ function packageSpecifier(
155155
: `npm:${packageName}@${version}`;
156156
}
157157

158-
async function resolveCanaryVersion(
159-
rule: CanaryDependencyRule,
160-
): Promise<string> {
161-
const cacheKey = rule.query;
162-
const cached = canaryVersionCache.get(cacheKey);
163-
if (cached) {
164-
return cached;
165-
}
166-
167-
const output = await spawnOrThrow(
168-
PNPM_COMMAND,
169-
["view", rule.query, "version", "--json"],
170-
process.cwd(),
171-
installEnv(),
172-
);
173-
const parsed = JSON.parse(output) as string | string[];
174-
const version = Array.isArray(parsed) ? parsed.at(-1) : parsed;
175-
176-
if (typeof version !== "string") {
177-
throw new Error(`Could not resolve canary version for ${rule.query}`);
178-
}
179-
180-
canaryVersionCache.set(cacheKey, version);
181-
return version;
182-
}
183-
184158
function parseCanaryDependencyRule(
185159
dependencyName: string,
186160
rawRule: string,
@@ -195,7 +169,7 @@ function parseCanaryDependencyRule(
195169
if (rawRule === "latest") {
196170
return {
197171
packageName: dependencyName,
198-
query: dependencyName,
172+
version: "latest",
199173
};
200174
}
201175

@@ -208,7 +182,7 @@ function parseCanaryDependencyRule(
208182

209183
return {
210184
packageName: rawRule.slice(0, versionSeparator),
211-
query: rawRule,
185+
version: rawRule.slice(versionSeparator + 1),
212186
};
213187
}
214188

@@ -230,11 +204,10 @@ async function rewriteManifestForCanary(scenarioDir: string): Promise<void> {
230204
rawRule,
231205
scenarioDir,
232206
);
233-
const version = await resolveCanaryVersion(rule);
234207
dependencies[dependencyName] = packageSpecifier(
235208
dependencyName,
236209
rule.packageName,
237-
version,
210+
rule.version,
238211
);
239212
updated = true;
240213
}

0 commit comments

Comments
 (0)