File size: 2,784 Bytes
d58afdb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import assert from 'node:assert/strict';
import { readFile } from 'node:fs/promises';
import { test } from 'node:test';

const contractSource = await readFile(new URL('../static/contract.js', import.meta.url));
const queueSource = await readFile(new URL('../static/queue-client.js', import.meta.url));
const {validateServingResult} = await import(
  `data:text/javascript;base64,${contractSource.toString('base64')}`
);
const {queuedPrediction} = await import(
  `data:text/javascript;base64,${queueSource.toString('base64')}`
);

const wire = 'decision-kai';
const canonical = 'llm-semantic-router/Decision-1.0-Kai-0.6B';
const manifest = 'a'.repeat(64);
const info = {id: wire, repo_id: canonical, manifest_sha256: manifest};
const questions = {
  beta: {type:'noul',instructions:'Is beta true?'},
  alpha: {type:'noul',instructions:'Is alpha true?'},
};
const answers = {
  alpha: {type:'noul',noul:0.2},
  beta: {type:'noul',noul:0.8},
};

test('Studio queue accepts a strict canonical single and batch after queued/running polls', async () => {
  const originalFetch = globalThis.fetch;
  try {
    for(const batch of [false,true]) {
      const payload = batch
        ? {model:wire,states:[{id:'one',state:'First'},{id:'two',state:'Second'}],questions}
        : {model:wire,state:'One request',questions};
      const usage = {input_tokens:12,output_tokens:0};
      const result = batch
        ? {model:canonical,results:[{id:'one',answers,usage},{id:'two',answers,usage}],usage:{input_tokens:24,output_tokens:0}}
        : {model:canonical,answers,usage};
      const accepted = {id:'job-1',model:wire,manifest_sha256:manifest,status:'queued'};
      const phases = [];
      const calls = [];
      const documents = [
        accepted,
        {...accepted,status:'queued'},
        {...accepted,status:'running'},
        {...accepted,status:'succeeded',result},
      ];
      globalThis.fetch = async (url, options={}) => {
        calls.push({url,options});
        return {ok:true,json:async()=>documents.shift()};
      };
      const completed = await queuedPrediction(payload,new AbortController(),info,{
        onProgress: phase=>phases.push(phase),
        validateCompletion: value=>validateServingResult(value,payload,canonical,'pull_queue'),
        pause:async()=>{},
      });
      assert.deepEqual(completed,result);
      assert.deepEqual(phases,['queued','running']);
      assert.equal(calls[0].url,'/api/jobs');
      assert.equal(calls[0].options.method,'POST');
      assert.deepEqual(JSON.parse(calls[0].options.body),payload);
      assert.deepEqual(calls.slice(1).map(call=>call.url),Array(3).fill('/api/jobs/job-1?model=decision-kai'));
      assert.equal(documents.length,0);
    }
  } finally {
    globalThis.fetch = originalFetch;
  }
});