Mirrors the button on the settings page, for verifying a deployment from
the host before anyone signs in, and for watching the cache work.
Measured against the live service, which settles a question the spec had
guessed at: a short phrase takes between 4.6 and 10.7 seconds, because
the endpoint really does start a Claude Code process. The ten-second
timeout the spec assumed would have failed intermittently on exactly the
kind of message this shop writes. Thirty seconds stands.
Cached answers come back in 3 milliseconds, so the cache is worth
roughly three thousand times its complexity.
Quality checked on real phrasing: times and dates survive unchanged
("Ouverture retardée à 14:00" to "Delayed opening at 14:00 today"),
which is what the prompt asks for and what the screen needs.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012cSY9pVhZmJUKNN7wf1Myd
57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
/**
|
|
* Round-trips a phrase through the translation service.
|
|
*
|
|
* npm run translate:test ["texte à traduire"]
|
|
*
|
|
* The settings page has the same button; this exists to check a deployment
|
|
* from the host, before anyone signs in, and to see the cache working.
|
|
*/
|
|
|
|
import 'dotenv/config';
|
|
|
|
import { prisma } from '../lib/db';
|
|
import { defaultProvider, translateToEnglish } from '../lib/translation/service';
|
|
|
|
async function main(): Promise<void> {
|
|
const text = process.argv[2] ?? 'Fermeture exceptionnelle jeudi après-midi';
|
|
const provider = defaultProvider();
|
|
|
|
if (!provider) {
|
|
console.error('Service non configuré : renseignez TRANSLATION_API_URL et TRANSLATION_API_KEY.');
|
|
process.exitCode = 1;
|
|
return;
|
|
}
|
|
|
|
console.log(`Modèle : ${provider.model}`);
|
|
console.log(`Français : ${text}`);
|
|
|
|
const started = Date.now();
|
|
const first = await translateToEnglish(text, provider);
|
|
const elapsed = Date.now() - started;
|
|
|
|
if (!first.ok) {
|
|
console.error(`Échec : ${first.error}`);
|
|
process.exitCode = 1;
|
|
return;
|
|
}
|
|
|
|
console.log(`Anglais : ${first.text}`);
|
|
console.log(`Durée : ${elapsed} ms (cache : ${first.cached ? 'oui' : 'non'})`);
|
|
|
|
// Second pass proves the cache: it must not touch the network at all.
|
|
const again = Date.now();
|
|
const second = await translateToEnglish(text, provider);
|
|
console.log(
|
|
`2e appel : ${Date.now() - again} ms (cache : ${second.ok && second.cached ? 'oui' : 'non'})`,
|
|
);
|
|
}
|
|
|
|
main()
|
|
.catch((error: unknown) => {
|
|
console.error(error);
|
|
process.exitCode = 1;
|
|
})
|
|
.finally(() => {
|
|
void prisma.$disconnect();
|
|
});
|