feat: add per-cron-job model tier selection

Allow cron jobs to specify a `model_tier` field that controls which LLM
tier handles the job, without needing separate agent configs. Precedence:
cron job model_tier > agent config > global primary_tier > 'default'.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
William Valentin
2026-02-10 22:31:18 -08:00
parent 6761dca1c2
commit 60b214e7c4
6 changed files with 66 additions and 8 deletions
+26
View File
@@ -121,6 +121,32 @@ describe('CronScheduler', () => {
warnSpy.mockRestore();
});
it('triggerJob includes model_tier in metadata when configured', () => {
const jobs = [makeCronJob({ model_tier: 'fast' })];
scheduler = new CronScheduler(jobs, mockChannelRegistry as any);
const messages: InboundMessage[] = [];
scheduler.onMessage((msg: InboundMessage) => messages.push(msg));
scheduler.triggerJob('test-job');
expect(messages).toHaveLength(1);
expect(messages[0].metadata?.modelTier).toBe('fast');
});
it('triggerJob metadata.modelTier is undefined when not configured', () => {
const jobs = [makeCronJob()];
scheduler = new CronScheduler(jobs, mockChannelRegistry as any);
const messages: InboundMessage[] = [];
scheduler.onMessage((msg: InboundMessage) => messages.push(msg));
scheduler.triggerJob('test-job');
expect(messages).toHaveLength(1);
expect(messages[0].metadata?.modelTier).toBeUndefined();
});
it('lists registered job names', () => {
const jobs = [
makeCronJob({ name: 'job-a' }),
+1 -1
View File
@@ -90,7 +90,7 @@ export class CronScheduler implements ChannelAdapter {
senderName: `cron:${jobName}`,
text: job.message,
timestamp: Date.now(),
metadata: { cronJob: jobName, scheduled: true },
metadata: { cronJob: jobName, scheduled: true, modelTier: job.model_tier },
};
this.messageHandler?.(msg);