openvibers/openvibe.report Commits
Keep market measurements on their exact routed endpoints (#166)
Changes
@@@ -2,6 +2,7 @@const { bare, findCatalogModel } = require('./ai-join');// The first offer supplies the displayed prices: lowest known own-page output price,// then input price. Unknown prices sort last; never turn null into a free price.++const sameEndpoint = (a, b) => String(a).toLowerCase() === String(b).toLowerCase();const amount = v => v == null || !Number.isFinite(Number(v)) ? Infinity : Number(v);function mergeMarket(catalogue, market) {if (!market || !Array.isArray(market.offers)) return catalogue;@@@ -17,7 +18,7 @@ function mergeMarket(catalogue, market) {field_sources: offer.field_sources, routed: false, uncensored: false, offers: [] };models.set(key, model);}-- const measured = offer.routed && cat?.offers?.find(o => o.provider === offer.provider && bare(o.model) === bare(offer.provider_model));++ const measured = offer.routed && cat?.offers?.find(o => o.provider === offer.provider && sameEndpoint(o.model, offer.provider_model));model.offers.push({ ...(measured || {}), ...offer, model: offer.provider_model, license: offer.licence,source: { name: 'Provider price page', url: offer.price_source, date: offer.price_checked_at, sample_size: measured?.requests_7d ?? null } });model.routed ||= offer.routed; model.uncensored ||= offer.uncensored;@@@ -32,7 +33,7 @@ function mergeMarket(catalogue, market) {}for (const offer of cat.offers || []) {model.routed = true;-- const matched = model.offers.find(o => o.provider === offer.provider && bare(o.model) === bare(offer.model));++ const matched = model.offers.find(o => o.provider === offer.provider && sameEndpoint(o.model, offer.model));if (matched) { Object.assign(matched, { ...offer, ...matched, routed: true }); continue; }// A routed endpoint may not have a pricebook observation yet. Keep its measurements,// but only a sourced page price may compete with the market's advertised prices.@@@ -30,6 +30,13 @@ const catalogue = { models:[{ slug:'openai/gpt-5-nano', offers:[{provider:'openaassert(model.routed);assert.strictEqual(model.offers[0].provider,'cheap');assert.strictEqual(model.offers.find(o=>o.provider==='openai').speed.p50_ms,1234);});++ await check('metadata aliases do not borrow measurements from a different routed endpoint',()=>{++ const result=mergeMarket(catalogue,{...market,offers:[{...market.offers[0],provider_model:'gpt-5-nano-latest',routed:false}]});++ const offers=result.models[0].offers;++ assert.strictEqual(offers.find(o=>o.model==='gpt-5-nano-latest').routed,false);++ assert.strictEqual(offers.find(o=>o.model==='gpt-5-nano-latest').speed,undefined);++ assert.strictEqual(offers.find(o=>o.model==='gpt-5-nano').routed,true);++ });const source=stubFetch();const t=await boot({env:{OV_AI_INTERNAL_URL:'http://127.0.0.1:5231',OV_BENCH_INTERNAL_URL:'http://127.0.0.1:5230'},fetchImpl:async(url,opts)=>{const u=new URL(String(url));
@@ -2,6 +2,7 @@
@@ -2,6 +2,7 @@
const { bare, findCatalogModel } = require('./ai-join');
const { bare, findCatalogModel } = require('./ai-join');
// The first offer supplies the displayed prices: lowest known own-page output price,
// The first offer supplies the displayed prices: lowest known own-page output price,
// then input price. Unknown prices sort last; never turn null into a free price.
// then input price. Unknown prices sort last; never turn null into a free price.
+const sameEndpoint = (a, b) => String(a).toLowerCase() === String(b).toLowerCase();
const amount = v => v == null || !Number.isFinite(Number(v)) ? Infinity : Number(v);
const amount = v => v == null || !Number.isFinite(Number(v)) ? Infinity : Number(v);
function mergeMarket(catalogue, market) {
function mergeMarket(catalogue, market) {
if (!market || !Array.isArray(market.offers)) return catalogue;
if (!market || !Array.isArray(market.offers)) return catalogue;
@@ -17,7 +18,7 @@ function mergeMarket(catalogue, market) {
@@ -17,7 +18,7 @@ function mergeMarket(catalogue, market) {
field_sources: offer.field_sources, routed: false, uncensored: false, offers: [] };
field_sources: offer.field_sources, routed: false, uncensored: false, offers: [] };
models.set(key, model);
models.set(key, model);
}
}
- const measured = offer.routed && cat?.offers?.find(o => o.provider === offer.provider && bare(o.model) === bare(offer.provider_model));
+ const measured = offer.routed && cat?.offers?.find(o => o.provider === offer.provider && sameEndpoint(o.model, offer.provider_model));
model.offers.push({ ...(measured || {}), ...offer, model: offer.provider_model, license: offer.licence,
model.offers.push({ ...(measured || {}), ...offer, model: offer.provider_model, license: offer.licence,
source: { name: 'Provider price page', url: offer.price_source, date: offer.price_checked_at, sample_size: measured?.requests_7d ?? null } });
source: { name: 'Provider price page', url: offer.price_source, date: offer.price_checked_at, sample_size: measured?.requests_7d ?? null } });
model.routed ||= offer.routed; model.uncensored ||= offer.uncensored;
model.routed ||= offer.routed; model.uncensored ||= offer.uncensored;
@@ -32,7 +33,7 @@ function mergeMarket(catalogue, market) {
@@ -32,7 +33,7 @@ function mergeMarket(catalogue, market) {
}
}
for (const offer of cat.offers || []) {
for (const offer of cat.offers || []) {
model.routed = true;
model.routed = true;
- const matched = model.offers.find(o => o.provider === offer.provider && bare(o.model) === bare(offer.model));
+ const matched = model.offers.find(o => o.provider === offer.provider && sameEndpoint(o.model, offer.model));
if (matched) { Object.assign(matched, { ...offer, ...matched, routed: true }); continue; }
if (matched) { Object.assign(matched, { ...offer, ...matched, routed: true }); continue; }
// A routed endpoint may not have a pricebook observation yet. Keep its measurements,
// A routed endpoint may not have a pricebook observation yet. Keep its measurements,
// but only a sourced page price may compete with the market's advertised prices.
// but only a sourced page price may compete with the market's advertised prices.
@@ -30,6 +30,13 @@ const catalogue = { models:[{ slug:'openai/gpt-5-nano', offers:[{provider:'opena
@@ -30,6 +30,13 @@ const catalogue = { models:[{ slug:'openai/gpt-5-nano', offers:[{provider:'opena
assert(model.routed);assert.strictEqual(model.offers[0].provider,'cheap');
assert(model.routed);assert.strictEqual(model.offers[0].provider,'cheap');
assert.strictEqual(model.offers.find(o=>o.provider==='openai').speed.p50_ms,1234);
assert.strictEqual(model.offers.find(o=>o.provider==='openai').speed.p50_ms,1234);
});
});
+ await check('metadata aliases do not borrow measurements from a different routed endpoint',()=>{
+ const result=mergeMarket(catalogue,{...market,offers:[{...market.offers[0],provider_model:'gpt-5-nano-latest',routed:false}]});
+ const offers=result.models[0].offers;
+ assert.strictEqual(offers.find(o=>o.model==='gpt-5-nano-latest').routed,false);
+ assert.strictEqual(offers.find(o=>o.model==='gpt-5-nano-latest').speed,undefined);
+ assert.strictEqual(offers.find(o=>o.model==='gpt-5-nano').routed,true);
+ });
const source=stubFetch();
const source=stubFetch();
const t=await boot({env:{OV_AI_INTERNAL_URL:'http://127.0.0.1:5231',OV_BENCH_INTERNAL_URL:'http://127.0.0.1:5230'},fetchImpl:async(url,opts)=>{
const t=await boot({env:{OV_AI_INTERNAL_URL:'http://127.0.0.1:5231',OV_BENCH_INTERNAL_URL:'http://127.0.0.1:5230'},fetchImpl:async(url,opts)=>{
const u=new URL(String(url));
const u=new URL(String(url));