feat(ai): split shared provider config from Anki runtime

This commit is contained in:
2026-03-08 16:10:51 -07:00
parent f10e905dbd
commit 9e46176519
19 changed files with 457 additions and 133 deletions

View File

@@ -0,0 +1,64 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { resolveSentenceBackText } from './ai';
test('resolveSentenceBackText returns secondary subtitle when ai is disabled', async () => {
const result = await resolveSentenceBackText(
{
sentence: '日本語',
secondarySubText: 'existing translation',
aiEnabled: false,
aiConfig: {},
},
{
logWarning: () => undefined,
},
);
assert.equal(result, 'existing translation');
});
test('resolveSentenceBackText uses shared ai config when enabled', async () => {
const result = await resolveSentenceBackText(
{
sentence: '日本語',
secondarySubText: '',
aiEnabled: true,
aiConfig: {
enabled: true,
apiKey: 'abc',
model: 'openai/gpt-4o-mini',
},
},
{
logWarning: () => undefined,
translateSentence: async (request) => {
assert.equal(request.apiKey, 'abc');
assert.equal(request.model, 'openai/gpt-4o-mini');
return 'translated';
},
},
);
assert.equal(result, 'translated');
});
test('resolveSentenceBackText falls back to sentence when ai translation fails with no secondary subtitle', async () => {
const result = await resolveSentenceBackText(
{
sentence: '日本語',
aiEnabled: true,
aiConfig: {
enabled: true,
apiKey: 'abc',
},
},
{
logWarning: () => undefined,
translateSentence: async () => null,
},
);
assert.equal(result, '日本語');
});