openvibers/openvibe.report Commits

Keep market measurements on their exact routed endpoints (#166)

OP OpenVibers committed 4 days ago · 30238b8db2 · 2 files, +10 −2

Changes

ddiff --git a/server/data/ai-market.js b/server/data/ai-market.js
iindex 823b570..941c413 100644
---- a/server/data/ai-market.js
++++ b/server/data/ai-market.js
@@@ -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.
ddiff --git a/test/ai-market.test.js b/test/ai-market.test.js
iindex 8cf4212..33d0664 100644
---- a/test/ai-market.test.js
++++ b/test/ai-market.test.js
@@@ -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.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));