Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
13c2d11
fix: generate config schema to project root instead of docs/
valdis Apr 15, 2026
f528309
chore: add OpenTelemetry observability to review pipeline
valdis Apr 15, 2026
6f41260
fix(deps): declare transitive OTel dependencies explicitly
valdis Apr 15, 2026
028908e
fix(tracing): don't stomp global TracerProvider
valdis Apr 15, 2026
08bd22a
perf(tracing): use BatchSpanProcessor for OTLP path
valdis Apr 15, 2026
631b74e
refactor(attributes): make production tag configurable
valdis Apr 15, 2026
0f070a1
refactor(all-command): extract withSpan helper and add judge span
valdis Apr 15, 2026
b9019b9
fix(agentic): move span end to finally block to prevent leak
valdis Apr 15, 2026
30b5f80
refactor(agentic): use config model instead of magic 'claude' fallback
valdis Apr 15, 2026
9eac54e
refactor(evals): use setTraceAttributes in eval runner
valdis Apr 15, 2026
c49d35f
fix(evals): restore goldenDetails in trace metadata
valdis Apr 15, 2026
39d7875
fix(tracing): fix TracerProvider guard and improve init test
valdis Apr 15, 2026
2331ec0
chore: remove redundant OTel comment from provider bridge
valdis Apr 15, 2026
d094869
refactor: reduce nesting and use active spans for context propagation
valdis Apr 15, 2026
f22a720
refactor(evals): hoist inline requires to module scope
valdis Apr 15, 2026
35269e9
fix(evals): use ROOT_CONTEXT for concurrent eval trace isolation
valdis Apr 15, 2026
866e370
fix(agentic): clear currentTurnSpan before reassigning on assistant m…
valdis Apr 15, 2026
cdcb02d
refactor(evals): convert run-eval.js to TypeScript
valdis Apr 15, 2026
5ab6c7c
feat(observability): add full pipeline span visibility and credential…
valdis Apr 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 22 additions & 29 deletions evals/src/qualops-bridge/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { AnthropicProvider } from '@/ai/providers/anthropic';
import { OpenAIProvider } from '@/ai/providers/openai';
import { BedrockProvider } from '@/ai/providers/bedrock';
import type { AIProvider } from '@/ai/providers/provider';
import { AgenticExecutor } from '@/stages/review/agentic/agentic-executor';
import { FileReviewer } from '@/stages/review/processors/file-reviewer';
import { PipelineExecutor } from '@/stages/review/processors/pipeline-executor';
import { setCurrentSession } from '@/shared/runtime/session-context';
Expand Down Expand Up @@ -164,39 +165,31 @@ async function runAgenticReview(
);
}

// Try to load an agentic job from the qualopsrc config
const configuredJobs = ConfigLoader.getInstance().getEnabledJobs();
const agenticJob = configuredJobs.find((j) => j.mode === 'agentic');

const job: PipelineJob = agenticJob || {
name: 'eval-agentic',
enabled: true,
mode: 'agentic',
agentic: {
maxTurns: 50,
maxBudgetUsd: 5.0,
contextMode: 'auto',
},
passes: [],
};
const agenticJobs = configuredJobs.filter((j) => j.job.mode === 'agentic');

const jobsToRun: PipelineJob[] = agenticJobs.length > 0
? agenticJobs.map((j) => j.job)
: [{
name: 'eval-agentic',
enabled: true,
mode: 'agentic',
agentic: {
maxTurns: 50,
maxBudgetUsd: 5.0,
contextMode: 'auto',
},
passes: [],
}];

const { AgenticExecutor } = await import('@/stages/review/agentic/agentic-executor');
const cwd = resolveSafeCwd(config.cwd);

// Resolve model: CLI override > qualopsrc > undefined (SDK default)
let model = config.model;
if (!model) {
try {
model = ConfigService.getInstance().getAIStageConfig('review').model;
} catch {
// catch is required because createProvider crashes when no .qualopsrc.json exists
// The config-missing warning is already emitted by ConfigService.loadRawConfig
// this get's run for every eval
}
const allIssues: ReviewIssue[] = [];
for (const job of jobsToRun) {
const executor = new AgenticExecutor(job, cwd, config.model);
const issues = await executor.execute(files);
allIssues.push(...issues);
}

const executor = new AgenticExecutor(job, cwd, model);
return executor.execute(files);
return allIssues;
}

function evalCaseToFileInfo(evalCase: EvalCase): FileInfo {
Expand Down
15 changes: 0 additions & 15 deletions evals/src/reviewer.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,6 @@ async function ensureInit() {
if (_initialized) return;
loadEnv();

try {
require('ts-node').register({
transpileOnly: true,
project: path.join(QUALOPS_ROOT, 'tsconfig.base.json'),
});
} catch {}

try {
const { register } = require('tsconfig-paths');
register({
baseUrl: QUALOPS_ROOT,
paths: { '@/*': ['src/*'], '@evals/*': ['evals/src/qualops-bridge/*'] },
});
} catch {}

if (!fs.existsSync(path.join(process.cwd(), '.qualops/.qualopsrc.json'))) {
process.chdir(QUALOPS_ROOT);
}
Expand Down
Loading
Loading