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

@@ -21,6 +21,7 @@ import { SubtitleTimingTracker } from './subtitle-timing-tracker';
import { MediaGenerator } from './media-generator';
import path from 'path';
import {
AiConfig,
AnkiConnectConfig,
KikuDuplicateCardInfo,
KikuFieldGroupingChoice,
@@ -135,6 +136,7 @@ export class AnkiIntegration {
private noteUpdateWorkflow: NoteUpdateWorkflow;
private fieldGroupingWorkflow: FieldGroupingWorkflow;
private runtime: AnkiIntegrationRuntime;
private aiConfig: AiConfig;
constructor(
config: AnkiConnectConfig,
@@ -147,8 +149,10 @@ export class AnkiIntegration {
duplicate: KikuDuplicateCardInfo;
}) => Promise<KikuFieldGroupingChoice>,
knownWordCacheStatePath?: string,
aiConfig: AiConfig = {},
) {
this.config = normalizeAnkiIntegrationConfig(config);
this.aiConfig = { ...aiConfig };
this.client = new AnkiConnectClient(this.config.url!);
this.mediaGenerator = new MediaGenerator();
this.timingTracker = timingTracker;
@@ -253,6 +257,7 @@ export class AnkiIntegration {
private createCardCreationService(): CardCreationService {
return new CardCreationService({
getConfig: () => this.config,
getAiConfig: () => this.aiConfig,
getTimingTracker: () => this.timingTracker,
getMpvClient: () => this.mpvClient,
getDeck: () => this.config.deck,
@@ -1096,7 +1101,10 @@ export class AnkiIntegration {
return requiredFields.every((fieldName) => this.hasFieldValue(noteInfo, fieldName));
}
applyRuntimeConfigPatch(patch: Partial<AnkiConnectConfig>): void {
applyRuntimeConfigPatch(patch: Partial<AnkiConnectConfig>, aiConfig?: AiConfig): void {
if (aiConfig) {
this.aiConfig = { ...aiConfig };
}
this.runtime.applyRuntimeConfigPatch(patch);
}