diff --git a/packages/sdk/bun.lock b/packages/sdk/bun.lock index 1c4482e9c2..ef3dd9e1dc 100644 --- a/packages/sdk/bun.lock +++ b/packages/sdk/bun.lock @@ -1,12 +1,11 @@ { "lockfileVersion": 1, - "configVersion": 0, "workspaces": { "": { "name": "@qvac/sdk", "dependencies": { "@qvac/decoder-audio": "^0.3.7", - "@qvac/diffusion-cpp": "0.1.3", + "@qvac/diffusion-cpp": "^0.1.3", "@qvac/dl-filesystem": "^0.2.1", "@qvac/embed-llamacpp": "^0.13.4", "@qvac/error": "^0.1.1", @@ -18,7 +17,7 @@ "@qvac/registry-client": "^0.4.0", "@qvac/transcription-parakeet": "^0.3.1", "@qvac/transcription-whispercpp": "^0.6.1", - "@qvac/translation-nmtcpp": "^0.6.10", + "@qvac/translation-nmtcpp": "^1.0.1", "@qvac/tts-onnx": "^0.8.2", "fast-safe-stringify": "2.1.1", "which-runtime": "^1.3.2", @@ -545,7 +544,7 @@ "@qvac/transcription-whispercpp": ["@qvac/transcription-whispercpp@0.6.1", "", { "dependencies": { "@qvac/decoder-audio": "^0.3.3", "@qvac/error": "^0.1.0", "@qvac/infer-base": "^0.4.0", "@qvac/logging": "^0.1.0", "bare-channel": "^5.2.2", "bare-ffmpeg": "^1.0.0-32", "bare-node-worker-threads": "^1.0.0", "bare-path": "^3.0.0", "bare-stream": "^2.7.0", "bare-worker": "^4.1.0", "path": "npm:bare-path", "process": "npm:bare-process@^4.2.2", "stream": "npm:bare-node-stream", "worker_threads": "npm:bare-node-worker-threads@^1.0.0" } }, "sha512-GrOKYjtCAJGVnCssDpoKgMD2S7O6zdOG2rFnR1+Almc5/+924U08peR3eQEuvTiP0+No6X5Aa0CIx0lGsOFBig=="], - "@qvac/translation-nmtcpp": ["@qvac/translation-nmtcpp@0.6.10", "", { "dependencies": { "@qvac/dl-hyperdrive": "^0.1.0", "@qvac/error": "^0.1.0", "@qvac/infer-base": "^0.2.0", "bare-path": "^3.0.0" } }, "sha512-lCySo8lzwyb1Wzv1xnN4ziTgTadA6UibWVS792fRGlNSkLcPYeS5Z5x7apzEyUNdE07SxPry/CrUZD56ZUc/VA=="], + "@qvac/translation-nmtcpp": ["@qvac/translation-nmtcpp@1.0.1", "", { "dependencies": { "@qvac/dl-hyperdrive": "^0.1.0", "@qvac/error": "^0.1.0", "@qvac/infer-base": "^0.2.0", "bare-path": "^3.0.0" } }, "sha512-KMF/8A2b7SxSMTsHxSZWH/YTFDyW1LSUEKs/x7f4P/zZTrqJYzZqOkEvxe9IS27kiz7dRAh7i3Q1hyvCnLdzIg=="], "@qvac/tts-onnx": ["@qvac/tts-onnx@0.8.2", "", { "dependencies": { "@qvac/error": "^0.1.0", "@qvac/infer-base": "^0.4.0", "@qvac/onnx": "^0.14.0", "bare-fs": "^4.5.1", "bare-path": "^3.0.0" } }, "sha512-/x6T4aGrHnBpndBZZN9W9FHQmjb+X7uXp1AQv+mi4dJai4XNxhahh7tK8OCS5Z3HdB/Iv/6YZ2PL0wnVf+OgVQ=="], diff --git a/packages/sdk/examples/plugins.ts b/packages/sdk/examples/plugins.ts index affab18741..5b66dfc532 100644 --- a/packages/sdk/examples/plugins.ts +++ b/packages/sdk/examples/plugins.ts @@ -67,7 +67,7 @@ const { loadModel, unloadModel, LLAMA_3_2_1B_INST_Q4_0, - MARIAN_OPUS_EN_IT_Q4_0, + BERGAMOT_EN_ES, GTE_LARGE_FP16, } = await import("@qvac/sdk"); @@ -110,12 +110,12 @@ console.log("2. Translation (nmtcpp-translation plugin)"); try { const nmtModelId = await loadModel({ - modelSrc: MARIAN_OPUS_EN_IT_Q4_0, + modelSrc: BERGAMOT_EN_ES, modelType: "nmt", modelConfig: { - engine: "Opus", + engine: "Bergamot", from: "en", - to: "it", + to: "es", }, onProgress: (p) => console.log(` Loading NMT: ${p.percentage.toFixed(1)}%`), diff --git a/packages/sdk/examples/translation/translation-opus.ts b/packages/sdk/examples/translation/translation-opus.ts deleted file mode 100644 index ae6f000873..0000000000 --- a/packages/sdk/examples/translation/translation-opus.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - loadModel, - translate, - unloadModel, - MARIAN_OPUS_EN_IT_Q4_0, -} from "@qvac/sdk"; - -try { - const modelId = await loadModel({ - modelSrc: MARIAN_OPUS_EN_IT_Q4_0, - modelType: "nmt", - modelConfig: { - engine: "Opus", - from: "en", - to: "it", - temperature: 0.2, - norepeatngramsize: 3, - lengthpenalty: 1.2, - }, - onProgress: (progress) => { - console.log(progress); - }, - }); - - console.log(`✅ Model loaded: ${modelId}`); - - const text = "Hello, how are you today?"; - const result = translate({ - modelId, - text, - modelType: "nmt", - stream: false, - }); - - const translatedText = await result.text; - console.log(`Translated text EN -> IT: ${text} -> "${translatedText}"`); - - await unloadModel({ modelId }); -} catch (error) { - console.error("❌ Error:", error); - process.exit(1); -} diff --git a/packages/sdk/examples/translation/translation-stream.ts b/packages/sdk/examples/translation/translation-stream.ts index 731acba927..75cb9bff92 100644 --- a/packages/sdk/examples/translation/translation-stream.ts +++ b/packages/sdk/examples/translation/translation-stream.ts @@ -2,17 +2,17 @@ import { loadModel, translate, unloadModel, - MARIAN_OPUS_EN_IT_Q4_0, + BERGAMOT_EN_ES, } from "@qvac/sdk"; try { const modelId = await loadModel({ - modelSrc: MARIAN_OPUS_EN_IT_Q4_0, + modelSrc: BERGAMOT_EN_ES, modelType: "nmt", modelConfig: { - engine: "Opus", + engine: "Bergamot", from: "en", - to: "it", + to: "es", }, }); @@ -29,7 +29,7 @@ try { stream: true, }); - process.stdout.write("Translated text EN -> IT: "); + process.stdout.write("Translated text EN -> ES: "); for await (const token of streamResult.tokenStream) { process.stdout.write(token); } diff --git a/packages/sdk/models/update-models/naming.ts b/packages/sdk/models/update-models/naming.ts index 7ba23075d9..05e1d5c1b7 100644 --- a/packages/sdk/models/update-models/naming.ts +++ b/packages/sdk/models/update-models/naming.ts @@ -242,9 +242,6 @@ function generateNmtName(input: BaseNameInput): string { ) { return generateNmtIndictransName(input); } - if (lowerPath.includes("opus") || lowerFilename.includes("opus")) { - return generateNmtOpusName(input); - } if (lowerPath.includes("bergamot") || lowerFilename.includes("bergamot")) { return generateNmtBergamotName(input); } @@ -282,34 +279,6 @@ function generateNmtIndictransName({ return `MARIAN_${nameParts.map(cleanPart).join("_")}`; } -function generateNmtOpusName({ - filename, - quantization, - tagExtra, -}: BaseNameInput): string { - const langMatch = filename.match(/-([a-z]{2,3})-([a-z]{2,3})\./i); - let langPair = ""; - if (langMatch) { - langPair = `${langMatch[1]!.toUpperCase()}_${langMatch[2]!.toUpperCase()}`; - } else { - const tagLang = tagExtra || ""; - if (tagLang.match(/^[a-z]{2}-[a-z]{2}$/i)) { - const [src, tgt] = tagLang.split("-"); - langPair = `${src!.toUpperCase()}_${tgt!.toUpperCase()}`; - } - } - - if (!langPair) { - const roaMatch = filename.match(/-([a-z]{2,3})-([a-z]{2,3})-f16/i); - if (roaMatch) { - langPair = `${roaMatch[1]!.toUpperCase()}_${roaMatch[2]!.toUpperCase()}`; - } - } - - const nameParts = [langPair, quantization].filter((p) => p && p !== ""); - return `MARIAN_OPUS_${nameParts.map(cleanPart).join("_")}`; -} - function generateNmtBergamotName({ filename }: BaseNameInput): string { const langMatch = filename.match(/[.]([a-z]{2,4})[.]/i); let langPair = ""; diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 2cca82ef2d..6d30ebd4b1 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -185,7 +185,7 @@ "@qvac/registry-client": "^0.4.0", "@qvac/transcription-parakeet": "^0.3.1", "@qvac/transcription-whispercpp": "^0.6.1", - "@qvac/translation-nmtcpp": "^0.6.10", + "@qvac/translation-nmtcpp": "^1.0.1", "@qvac/tts-onnx": "^0.8.2", "fast-safe-stringify": "2.1.1", "which-runtime": "^1.3.2", diff --git a/packages/sdk/schemas/translation-config.ts b/packages/sdk/schemas/translation-config.ts index edcd781912..7c070353c8 100644 --- a/packages/sdk/schemas/translation-config.ts +++ b/packages/sdk/schemas/translation-config.ts @@ -1,9 +1,6 @@ import { z } from "zod"; import { modelSrcInputSchema } from "./model-src-utils"; -// Marian/Opus model languages -export const MARIAN_LANGUAGES = ["en", "de", "es", "it", "ru", "ja"] as const; - // Bergamot supports many more language pairs export const BERGAMOT_LANGUAGES = [ "en", @@ -88,12 +85,11 @@ export const AFRICAN_LANGUAGES_MAP = new Map([ // Union of all NMT languages (for general type usage) export const NMT_LANGUAGES = [ - ...MARIAN_LANGUAGES, ...BERGAMOT_LANGUAGES, ...INDICTRANS_LANGUAGES, ] as const; -export const NMT_ENGINES = ["Opus", "Bergamot", "IndicTrans"] as const; +export const NMT_ENGINES = ["Bergamot", "IndicTrans"] as const; export type NmtEngine = (typeof NMT_ENGINES)[number]; // Common generation parameters (without language fields) @@ -109,13 +105,6 @@ const nmtGenerationParamsSchema = z.object({ topp: z.number().optional(), }); -// Opus engine config (Marian-based) - supports MARIAN_LANGUAGES -const opusConfigSchema = nmtGenerationParamsSchema.extend({ - engine: z.literal("Opus"), - from: z.enum(MARIAN_LANGUAGES), - to: z.enum(MARIAN_LANGUAGES), -}); - // Pivot model configuration for Bergamot (for translation via intermediate language) const bergamotPivotModelSchema = nmtGenerationParamsSchema .extend({ @@ -146,7 +135,6 @@ const indicTransConfigSchema = nmtGenerationParamsSchema.extend({ // Discriminated union of all engine configs export const nmtConfigBaseSchema = z.discriminatedUnion("engine", [ - opusConfigSchema, bergamotConfigSchema, indicTransConfigSchema, ]); @@ -165,7 +153,6 @@ export const nmtConfigSchema = nmtConfigBaseSchema.transform((data) => ({ topp: data.topp ?? 1.0, })); -export type MarianLanguage = (typeof MARIAN_LANGUAGES)[number]; export type BergamotLanguage = (typeof BERGAMOT_LANGUAGES)[number]; export type IndicTransLanguage = (typeof INDICTRANS_LANGUAGES)[number]; export type NmtLanguage = (typeof NMT_LANGUAGES)[number]; diff --git a/packages/sdk/test/unit/update-models-naming.test.ts b/packages/sdk/test/unit/update-models-naming.test.ts index 2c4b48165f..fbfbc77068 100644 --- a/packages/sdk/test/unit/update-models-naming.test.ts +++ b/packages/sdk/test/unit/update-models-naming.test.ts @@ -708,42 +708,6 @@ test("nmt: Indictrans en-indic 1B q0f16 — full field mapping", (t: any) => { t.is(exportName, "MARIAN_EN_HI_INDIC_1B_Q0F16"); }); -// --------------------------------------------------------------------------- -// NMT: Opus en-ru -// --------------------------------------------------------------------------- - -test("nmt: Opus en-ru q0f16 — full field mapping", (t: any) => { - const coreKey = Buffer.from("33".repeat(32), "hex"); - - const { model, exportName } = processAndName({ - path: "qvac_models_compiled/ggml/marian/q0f16/ggml-opus-en-ru/2025-11-09/ggml-opus-en-ru.bin", - source: "s3", - engine: "@qvac/translation-nmtcpp", - license: "Apache-2.0", - name: "", - sizeBytes: 120000000, - sha256: "33333333223344553333333322334455333333332233445533333333aabbccdd", - quantization: "q0f16", - params: "", - tags: ["translation", "opus", "marian", "en-ru"], - blobBinding: { - coreKey, - blockOffset: 13000, - blockLength: 100, - byteOffset: 120000000, - byteLength: 120000000, - }, - }); - - t.is(model.engine, "nmtcpp-translation"); - t.is(model.addon, "nmt"); - t.is(model.blobCoreKey, "33".repeat(32)); - t.is(model.blobBlockOffset, 13000); - t.is(model.expectedSize, 120000000); - - t.is(exportName, "MARIAN_OPUS_EN_RU_Q0F16"); -}); - // --------------------------------------------------------------------------- // NMT: Bergamot model file // --------------------------------------------------------------------------- diff --git a/packages/sdk/tests-qvac/tests/desktop/consumer.ts b/packages/sdk/tests-qvac/tests/desktop/consumer.ts index dd18c9ec88..682ce12ff1 100644 --- a/packages/sdk/tests-qvac/tests/desktop/consumer.ts +++ b/packages/sdk/tests-qvac/tests/desktop/consumer.ts @@ -8,9 +8,6 @@ import { VAD_SILERO_5_1_2, QWEN3_1_7B_INST_Q4, OCR_LATIN_RECOGNIZER_1, - MARIAN_OPUS_DE_EN_Q4_0, - MARIAN_OPUS_EN_ES_Q4_0, - MARIAN_OPUS_ES_EN_Q4_0, BERGAMOT_EN_FR, BERGAMOT_EN_ES, BERGAMOT_ES_EN, @@ -132,51 +129,6 @@ resources.define("sharded-embeddings", { skipPreDownload: true, }); -resources.define("marian-de-en", { - constant: MARIAN_OPUS_DE_EN_Q4_0, - type: "nmt", - config: { - engine: "Opus", - from: "de", - to: "en", - beamsize: 4, - lengthpenalty: 1.0, - maxlength: 512, - temperature: 0.3, - norepeatngramsize: 3, - }, -}); - -resources.define("marian-en-es", { - constant: MARIAN_OPUS_EN_ES_Q4_0, - type: "nmt", - config: { - engine: "Opus", - from: "en", - to: "es", - beamsize: 4, - lengthpenalty: 1.0, - maxlength: 512, - temperature: 0.3, - norepeatngramsize: 3, - }, -}); - -resources.define("marian-es-en", { - constant: MARIAN_OPUS_ES_EN_Q4_0, - type: "nmt", - config: { - engine: "Opus", - from: "es", - to: "en", - beamsize: 4, - lengthpenalty: 1.0, - maxlength: 512, - temperature: 0.3, - norepeatngramsize: 3, - }, -}); - resources.define("indictrans-en-hi", { constant: MARIAN_EN_HI_INDIC_200M_Q4_0, type: "nmt", diff --git a/packages/sdk/tests-qvac/tests/mobile/consumer.ts b/packages/sdk/tests-qvac/tests/mobile/consumer.ts index f91b4124bd..c7f135449b 100644 --- a/packages/sdk/tests-qvac/tests/mobile/consumer.ts +++ b/packages/sdk/tests-qvac/tests/mobile/consumer.ts @@ -9,9 +9,6 @@ import { VAD_SILERO_5_1_2, QWEN3_1_7B_INST_Q4, OCR_LATIN_RECOGNIZER_1, - MARIAN_OPUS_DE_EN_Q4_0, - MARIAN_OPUS_EN_ES_Q4_0, - MARIAN_OPUS_ES_EN_Q4_0, BERGAMOT_EN_FR, BERGAMOT_EN_ES, BERGAMOT_ES_EN, @@ -123,51 +120,6 @@ resources.define("sharded-embeddings", { skipPreDownload: true, }); -resources.define("marian-de-en", { - constant: MARIAN_OPUS_DE_EN_Q4_0, - type: "nmt", - config: { - engine: "Opus", - from: "de", - to: "en", - beamsize: 4, - lengthpenalty: 1.0, - maxlength: 512, - temperature: 0.3, - norepeatngramsize: 3, - }, -}); - -resources.define("marian-en-es", { - constant: MARIAN_OPUS_EN_ES_Q4_0, - type: "nmt", - config: { - engine: "Opus", - from: "en", - to: "es", - beamsize: 4, - lengthpenalty: 1.0, - maxlength: 512, - temperature: 0.3, - norepeatngramsize: 3, - }, -}); - -resources.define("marian-es-en", { - constant: MARIAN_OPUS_ES_EN_Q4_0, - type: "nmt", - config: { - engine: "Opus", - from: "es", - to: "en", - beamsize: 4, - lengthpenalty: 1.0, - maxlength: 512, - temperature: 0.3, - norepeatngramsize: 3, - }, -}); - resources.define("indictrans-en-hi", { constant: MARIAN_EN_HI_INDIC_200M_Q4_0, type: "nmt", diff --git a/packages/sdk/tests-qvac/tests/shared/executors/translation-executor.ts b/packages/sdk/tests-qvac/tests/shared/executors/translation-executor.ts index 1fff579f4f..8323812424 100644 --- a/packages/sdk/tests-qvac/tests/shared/executors/translation-executor.ts +++ b/packages/sdk/tests-qvac/tests/shared/executors/translation-executor.ts @@ -5,7 +5,6 @@ import { type Expectation, } from "@tetherto/qvac-test-suite"; import { AbstractModelExecutor } from "./abstract-model-executor.js"; -import { translationMarianTests } from "../../translation-marian-tests.js"; import { translationIndicTransTests } from "../../translation-indictrans-tests.js"; import { translationBergamotTests } from "../../translation-bergamot-tests.js"; import { translationLlmTests } from "../../translation-llm-tests.js"; @@ -21,7 +20,6 @@ interface TranslateTestParams { } const allTests = [ - ...translationMarianTests, ...translationIndicTransTests, ...translationBergamotTests, ...translationLlmTests, @@ -30,7 +28,7 @@ const allTests = [ ]; export class TranslationExecutor extends AbstractModelExecutor { - pattern = /^translation-(marian|indictrans|bergamot|llm|salamandra|afriquegemma)-/; + pattern = /^translation-(indictrans|bergamot|llm|salamandra|afriquegemma)-/; protected handlers = Object.fromEntries( allTests.map((test) => { diff --git a/packages/sdk/tests-qvac/tests/test-definitions.ts b/packages/sdk/tests-qvac/tests/test-definitions.ts index 95cedb499c..854753576f 100644 --- a/packages/sdk/tests-qvac/tests/test-definitions.ts +++ b/packages/sdk/tests-qvac/tests/test-definitions.ts @@ -4,7 +4,6 @@ import { completionTests } from "./completion-tests.js"; import { transcriptionTests } from "./transcription-tests.js"; import { embeddingTests } from "./embedding-tests.js"; import { ragTests } from "./rag-tests.js"; -import { translationMarianTests } from "./translation-marian-tests.js"; import { translationIndicTransTests } from "./translation-indictrans-tests.js"; import { translationBergamotTests } from "./translation-bergamot-tests.js"; import { translationLlmTests } from "./translation-llm-tests.js"; @@ -169,9 +168,6 @@ export const tests = [ // RAG tests ...ragTests, - // Translation: Marian Opus (DE↔EN, EN↔FR, FR↔EN) - ...translationMarianTests, - // Translation: IndicTrans2 (EN↔HI) ...translationIndicTransTests, diff --git a/packages/sdk/tests-qvac/tests/translation-marian-tests.ts b/packages/sdk/tests-qvac/tests/translation-marian-tests.ts deleted file mode 100644 index 6cc3b15e3c..0000000000 --- a/packages/sdk/tests-qvac/tests/translation-marian-tests.ts +++ /dev/null @@ -1,211 +0,0 @@ -import type { TestDefinition, Expectation } from "@tetherto/qvac-test-suite"; - -const createMarianTest = ( - testId: string, - text: string, - resource: string, - expectation: Expectation, - estimatedDurationMs: number = 15000, - suites?: string[], -): TestDefinition => ({ - testId, - params: { text, resource }, - expectation, - ...(suites && { suites }), - metadata: { category: "translation-marian", dependency: resource, estimatedDurationMs }, -}); - -// --- DE → EN (marian-de-en) --- - -export const marianDeEnBasic = createMarianTest( - "translation-marian-de-en-basic", - "Hallo, wie geht es dir heute?", - "marian-de-en", - { validation: "contains-any", contains: ["hello", "how", "are", "you", "today"] }, - 15000, - ["smoke"], -); - -export const marianDeEnLongText = createMarianTest( - "translation-marian-de-en-long-text", - "Der schnelle braune Fuchs springt über den faulen Hund. Dieser Satz enthält viele häufige Buchstaben. Die maschinelle Übersetzung hat in den letzten Jahren große Fortschritte gemacht, wobei neuronale maschinelle Übersetzungsmodelle beeindruckende Ergebnisse erzielen.", - "marian-de-en", - { validation: "contains-any", contains: ["fox", "dog", "translation", "machine", "neural"] }, - 20000, -); - -export const marianDeEnShortText = createMarianTest( - "translation-marian-de-en-short-text", - "Ja", - "marian-de-en", - { validation: "contains-any", contains: ["yes", "yeah"] }, - 10000, -); - -export const marianDeEnSpecialChars = createMarianTest( - "translation-marian-de-en-special-chars", - "Hallo! Wie geht's dir? Das kostet 50€ - nicht $60!", - "marian-de-en", - { validation: "contains-any", contains: ["hello", "how", "cost", "50"] }, -); - -export const marianDeEnNumbers = createMarianTest( - "translation-marian-de-en-numbers", - "Das Treffen ist um 10:30 Uhr. Wir haben 25 Teilnehmer.", - "marian-de-en", - { validation: "contains-any", contains: ["meeting", "10:30", "25", "participant"] }, -); - -export const marianDeEnQuestion = createMarianTest( - "translation-marian-de-en-question", - "Können Sie mir bitte sagen, wo der Bahnhof ist? Wie weit ist es von hier?", - "marian-de-en", - { validation: "contains-any", contains: ["station", "where", "far", "tell"] }, -); - -export const marianDeEnFormal = createMarianTest( - "translation-marian-de-en-formal", - "Sehr geehrte Damen und Herren, hiermit möchte ich mich für die Stelle bewerben.", - "marian-de-en", - { validation: "contains-any", contains: ["dear", "sir", "madam", "apply", "position"] }, -); - -export const marianDeEnEmptyText: TestDefinition = { - testId: "translation-marian-de-en-empty-text", - params: { text: "", resource: "marian-de-en" }, - expectation: { validation: "type", expectedType: "string" }, - metadata: { category: "translation-marian", dependency: "marian-de-en", estimatedDurationMs: 10000 }, -}; - -export const marianDeEnStreaming = createMarianTest( - "translation-marian-de-en-streaming", - "Guten Tag, wie geht es Ihnen?", - "marian-de-en", - { validation: "contains-any", contains: ["good", "day", "how", "are"] }, - 15000, - ["smoke"], -); - -export const marianDeEnStats = createMarianTest( - "translation-marian-de-en-stats", - "Hallo Welt", - "marian-de-en", - { validation: "contains-any", contains: ["hello", "world"] }, -); - -export const marianDeEnBatchBasic: TestDefinition = { - testId: "translation-marian-de-en-batch-basic", - params: { texts: ["Guten Morgen", "Gute Nacht"], resource: "marian-de-en" }, - expectation: { validation: "contains-any", contains: ["morning", "night", "good"] }, - suites: ["smoke"], - metadata: { category: "translation-marian", dependency: "marian-de-en", estimatedDurationMs: 15000 }, -}; - -export const marianDeEnBatchMultiple: TestDefinition = { - testId: "translation-marian-de-en-batch-multiple", - params: { - texts: ["Wie geht es dir?", "Das Wetter ist schön.", "Ich habe Hunger.", "Auf Wiedersehen.", "Vielen Dank."], - resource: "marian-de-en", - }, - expectation: { validation: "contains-any", contains: ["how", "weather", "hunger", "goodbye", "thank"] }, - metadata: { category: "translation-marian", dependency: "marian-de-en", estimatedDurationMs: 25000 }, -}; - -// --- EN → ES (marian-en-es) --- - -export const marianEnEsBasic = createMarianTest( - "translation-marian-en-es-basic", - "Hello, how are you today?", - "marian-en-es", - { validation: "contains-any", contains: ["hola", "cómo", "estás", "hoy"] }, - 15000, - ["smoke"], -); - -export const marianEnEsLongText = createMarianTest( - "translation-marian-en-es-long-text", - "The weather is beautiful today. I decided to go for a walk in the park. The birds are singing and the flowers are blooming.", - "marian-en-es", - { validation: "contains-any", contains: ["tiempo", "parque", "pájaros", "flores", "hermoso"] }, - 20000, -); - -export const marianEnEsShortText = createMarianTest( - "translation-marian-en-es-short-text", - "Thank you very much", - "marian-en-es", - { validation: "contains-any", contains: ["gracias", "muchas"] }, - 10000, -); - -export const marianEnEsSpecialChars = createMarianTest( - "translation-marian-en-es-special-chars", - "What's your name? I'm John!", - "marian-en-es", - { validation: "contains-any", contains: ["nombre", "cómo", "llam"] }, -); - -export const marianEnEsQuestion = createMarianTest( - "translation-marian-en-es-question", - "Can you tell me where the train station is?", - "marian-en-es", - { validation: "contains-any", contains: ["estación", "tren", "dónde", "decir"] }, -); - -export const marianEnEsStreaming = createMarianTest( - "translation-marian-en-es-streaming", - "Good morning, how are you?", - "marian-en-es", - { validation: "contains-any", contains: ["buenos", "días", "cómo"] }, -); - -// --- ES → EN (marian-es-en) --- - -export const marianEsEnBasic = createMarianTest( - "translation-marian-es-en-basic", - "Hola, ¿cómo estás hoy?", - "marian-es-en", - { validation: "contains-any", contains: ["hello", "how", "are", "you", "today"] }, -); - -export const marianEsEnLongText = createMarianTest( - "translation-marian-es-en-long-text", - "El tiempo es hermoso hoy. Decidí ir a dar un paseo por el parque. Los pájaros cantan y las flores están floreciendo.", - "marian-es-en", - { validation: "contains-any", contains: ["weather", "park", "birds", "flowers", "beautiful"] }, - 20000, -); - -export const marianEsEnQuestion = createMarianTest( - "translation-marian-es-en-question", - "¿Puede decirme dónde está la estación de tren?", - "marian-es-en", - { validation: "contains-any", contains: ["station", "train", "where", "tell"] }, -); - -export const translationMarianTests = [ - // DE → EN - marianDeEnBasic, - marianDeEnLongText, - marianDeEnShortText, - marianDeEnSpecialChars, - marianDeEnNumbers, - marianDeEnQuestion, - marianDeEnFormal, - marianDeEnEmptyText, - marianDeEnStreaming, - marianDeEnStats, - marianDeEnBatchBasic, - marianDeEnBatchMultiple, - // EN → ES - marianEnEsBasic, - marianEnEsLongText, - marianEnEsShortText, - marianEnEsSpecialChars, - marianEnEsQuestion, - marianEnEsStreaming, - // ES → EN - marianEsEnBasic, - marianEsEnLongText, - marianEsEnQuestion, -];