refactor: Cleanup

This commit is contained in:
Aleksander Grygier 2026-02-08 23:44:38 +01:00
parent 3c3d4f28f3
commit 70f67140ae
1 changed files with 111 additions and 9 deletions

View File

@ -115,46 +115,51 @@ class ChatStore {
} }
} }
} }
registerMessageUpdateCallback(
callback: (messageId: string, updates: Partial<DatabaseMessage>) => void
): void {
this.messageUpdateCallback = callback;
}
clearUIState(): void { clearUIState(): void {
this.isLoading = false; this.isLoading = false;
this.currentResponse = ''; this.currentResponse = '';
this.isStreamingActive = false; this.isStreamingActive = false;
} }
setActiveProcessingConversation(conversationId: string | null): void { setActiveProcessingConversation(conversationId: string | null): void {
this.activeConversationId = conversationId; this.activeConversationId = conversationId;
this.activeProcessingState = conversationId this.activeProcessingState = conversationId
? this.processingStates.get(conversationId) || null ? this.processingStates.get(conversationId) || null
: null; : null;
} }
getProcessingState(conversationId: string): ApiProcessingState | null { getProcessingState(conversationId: string): ApiProcessingState | null {
return this.processingStates.get(conversationId) || null; return this.processingStates.get(conversationId) || null;
} }
private setProcessingState(conversationId: string, state: ApiProcessingState | null): void { private setProcessingState(conversationId: string, state: ApiProcessingState | null): void {
if (state === null) this.processingStates.delete(conversationId); if (state === null) this.processingStates.delete(conversationId);
else this.processingStates.set(conversationId, state); else this.processingStates.set(conversationId, state);
if (conversationId === this.activeConversationId) this.activeProcessingState = state; if (conversationId === this.activeConversationId) this.activeProcessingState = state;
} }
clearProcessingState(conversationId: string): void { clearProcessingState(conversationId: string): void {
this.processingStates.delete(conversationId); this.processingStates.delete(conversationId);
if (conversationId === this.activeConversationId) this.activeProcessingState = null; if (conversationId === this.activeConversationId) this.activeProcessingState = null;
} }
getActiveProcessingState(): ApiProcessingState | null { getActiveProcessingState(): ApiProcessingState | null {
return this.activeProcessingState; return this.activeProcessingState;
} }
getCurrentProcessingStateSync(): ApiProcessingState | null { getCurrentProcessingStateSync(): ApiProcessingState | null {
return this.activeProcessingState; return this.activeProcessingState;
} }
private setStreamingActive(active: boolean): void { private setStreamingActive(active: boolean): void {
this.isStreamingActive = active; this.isStreamingActive = active;
} }
isStreaming(): boolean { isStreaming(): boolean {
return this.isStreamingActive; return this.isStreamingActive;
} }
private getOrCreateAbortController(convId: string): AbortController { private getOrCreateAbortController(convId: string): AbortController {
let c = this.abortControllers.get(convId); let c = this.abortControllers.get(convId);
if (!c || c.signal.aborted) { if (!c || c.signal.aborted) {
@ -163,6 +168,7 @@ class ChatStore {
} }
return c; return c;
} }
private abortRequest(convId?: string): void { private abortRequest(convId?: string): void {
if (convId) { if (convId) {
const c = this.abortControllers.get(convId); const c = this.abortControllers.get(convId);
@ -175,33 +181,42 @@ class ChatStore {
this.abortControllers.clear(); this.abortControllers.clear();
} }
} }
private showErrorDialog(state: ErrorDialogState | null): void { private showErrorDialog(state: ErrorDialogState | null): void {
this.errorDialogState = state; this.errorDialogState = state;
} }
dismissErrorDialog(): void { dismissErrorDialog(): void {
this.errorDialogState = null; this.errorDialogState = null;
} }
clearEditMode(): void { clearEditMode(): void {
this.isEditModeActive = false; this.isEditModeActive = false;
this.addFilesHandler = null; this.addFilesHandler = null;
} }
isEditing(): boolean { isEditing(): boolean {
return this.isEditModeActive; return this.isEditModeActive;
} }
setEditModeActive(handler: (files: File[]) => void): void { setEditModeActive(handler: (files: File[]) => void): void {
this.isEditModeActive = true; this.isEditModeActive = true;
this.addFilesHandler = handler; this.addFilesHandler = handler;
} }
getAddFilesHandler(): ((files: File[]) => void) | null { getAddFilesHandler(): ((files: File[]) => void) | null {
return this.addFilesHandler; return this.addFilesHandler;
} }
clearPendingEditMessageId(): void { clearPendingEditMessageId(): void {
this.pendingEditMessageId = null; this.pendingEditMessageId = null;
} }
savePendingDraft(message: string, files: ChatUploadedFile[]): void { savePendingDraft(message: string, files: ChatUploadedFile[]): void {
this._pendingDraftMessage = message; this._pendingDraftMessage = message;
this._pendingDraftFiles = [...files]; this._pendingDraftFiles = [...files];
} }
consumePendingDraft(): { message: string; files: ChatUploadedFile[] } | null { consumePendingDraft(): { message: string; files: ChatUploadedFile[] } | null {
if (!this._pendingDraftMessage && this._pendingDraftFiles.length === 0) return null; if (!this._pendingDraftMessage && this._pendingDraftFiles.length === 0) return null;
const d = { message: this._pendingDraftMessage, files: [...this._pendingDraftFiles] }; const d = { message: this._pendingDraftMessage, files: [...this._pendingDraftFiles] };
@ -209,24 +224,31 @@ class ChatStore {
this._pendingDraftFiles = []; this._pendingDraftFiles = [];
return d; return d;
} }
hasPendingDraft(): boolean { hasPendingDraft(): boolean {
return Boolean(this._pendingDraftMessage) || this._pendingDraftFiles.length > 0; return Boolean(this._pendingDraftMessage) || this._pendingDraftFiles.length > 0;
} }
getAllLoadingChats(): string[] { getAllLoadingChats(): string[] {
return Array.from(this.chatLoadingStates.keys()); return Array.from(this.chatLoadingStates.keys());
} }
getAllStreamingChats(): string[] { getAllStreamingChats(): string[] {
return Array.from(this.chatStreamingStates.keys()); return Array.from(this.chatStreamingStates.keys());
} }
getChatStreamingPublic(convId: string): { response: string; messageId: string } | undefined { getChatStreamingPublic(convId: string): { response: string; messageId: string } | undefined {
return this.getChatStreaming(convId); return this.getChatStreaming(convId);
} }
isChatLoadingPublic(convId: string): boolean { isChatLoadingPublic(convId: string): boolean {
return this.chatLoadingStates.get(convId) || false; return this.chatLoadingStates.get(convId) || false;
} }
private isChatLoadingInternal(convId: string): boolean { private isChatLoadingInternal(convId: string): boolean {
return this.chatStreamingStates.has(convId); return this.chatStreamingStates.has(convId);
} }
private touchConversationState(convId: string): void { private touchConversationState(convId: string): void {
this.conversationStateTimestamps.set(convId, { lastAccessed: Date.now() }); this.conversationStateTimestamps.set(convId, { lastAccessed: Date.now() });
} }
@ -940,6 +962,7 @@ class ChatStore {
if (!messageTypes.includes('assistant response')) messageTypes.push('assistant response'); if (!messageTypes.includes('assistant response')) messageTypes.push('assistant response');
} }
} }
return { totalCount: allToDelete.length, userMessages, assistantMessages, messageTypes }; return { totalCount: allToDelete.length, userMessages, assistantMessages, messageTypes };
} }
@ -986,31 +1009,40 @@ class ChatStore {
const activeConv = conversationsStore.activeConversation; const activeConv = conversationsStore.activeConversation;
if (!activeConv || this.isChatLoadingInternal(activeConv.id)) return; if (!activeConv || this.isChatLoadingInternal(activeConv.id)) return;
const result = this.getMessageByIdWithRole(messageId, MessageRole.ASSISTANT); const result = this.getMessageByIdWithRole(messageId, MessageRole.ASSISTANT);
if (!result) return; if (!result) return;
const { message: msg, index: idx } = result; const { message: msg, index: idx } = result;
try { try {
this.showErrorDialog(null); this.showErrorDialog(null);
this.setChatLoading(activeConv.id, true); this.setChatLoading(activeConv.id, true);
this.clearChatStreaming(activeConv.id); this.clearChatStreaming(activeConv.id);
const allMessages = await conversationsStore.getConversationMessages(activeConv.id); const allMessages = await conversationsStore.getConversationMessages(activeConv.id);
const dbMessage = allMessages.find((m) => m.id === messageId); const dbMessage = allMessages.find((m) => m.id === messageId);
if (!dbMessage) { if (!dbMessage) {
this.setChatLoading(activeConv.id, false); this.setChatLoading(activeConv.id, false);
return; return;
} }
const originalContent = dbMessage.content; const originalContent = dbMessage.content;
const conversationContext = conversationsStore.activeMessages.slice(0, idx); const conversationContext = conversationsStore.activeMessages.slice(0, idx);
const contextWithContinue = [ const contextWithContinue = [
...conversationContext, ...conversationContext,
{ role: MessageRole.ASSISTANT as const, content: originalContent } { role: MessageRole.ASSISTANT as const, content: originalContent }
]; ];
let appendedContent = '', let appendedContent = '',
hasReceivedContent = false, hasReceivedContent = false,
isReasoningOpen = hasUnclosedReasoningTag(originalContent); isReasoningOpen = hasUnclosedReasoningTag(originalContent);
const updateStreamingContent = (fullContent: string) => { const updateStreamingContent = (fullContent: string) => {
this.setChatStreaming(msg.convId, fullContent, msg.id); this.setChatStreaming(msg.convId, fullContent, msg.id);
conversationsStore.updateMessageAtIndex(idx, { content: fullContent }); conversationsStore.updateMessageAtIndex(idx, { content: fullContent });
}; };
const appendContentChunk = (chunk: string) => { const appendContentChunk = (chunk: string) => {
if (isReasoningOpen) { if (isReasoningOpen) {
appendedContent += REASONING_TAGS.END; appendedContent += REASONING_TAGS.END;
@ -1020,6 +1052,7 @@ class ChatStore {
hasReceivedContent = true; hasReceivedContent = true;
updateStreamingContent(originalContent + appendedContent); updateStreamingContent(originalContent + appendedContent);
}; };
const appendReasoningChunk = (chunk: string) => { const appendReasoningChunk = (chunk: string) => {
if (!isReasoningOpen) { if (!isReasoningOpen) {
appendedContent += REASONING_TAGS.START; appendedContent += REASONING_TAGS.START;
@ -1029,13 +1062,16 @@ class ChatStore {
hasReceivedContent = true; hasReceivedContent = true;
updateStreamingContent(originalContent + appendedContent); updateStreamingContent(originalContent + appendedContent);
}; };
const finalizeReasoning = () => { const finalizeReasoning = () => {
if (isReasoningOpen) { if (isReasoningOpen) {
appendedContent += REASONING_TAGS.END; appendedContent += REASONING_TAGS.END;
isReasoningOpen = false; isReasoningOpen = false;
} }
}; };
const abortController = this.getOrCreateAbortController(msg.convId); const abortController = this.getOrCreateAbortController(msg.convId);
await ChatService.sendMessage( await ChatService.sendMessage(
contextWithContinue, contextWithContinue,
{ {
@ -1065,21 +1101,26 @@ class ChatStore {
timings?: ChatMessageTimings timings?: ChatMessageTimings
) => { ) => {
finalizeReasoning(); finalizeReasoning();
const appendedFromCompletion = hasReceivedContent const appendedFromCompletion = hasReceivedContent
? appendedContent ? appendedContent
: wrapReasoningContent(finalContent || '', reasoningContent); : wrapReasoningContent(finalContent || '', reasoningContent);
const fullContent = originalContent + appendedFromCompletion; const fullContent = originalContent + appendedFromCompletion;
await DatabaseService.updateMessage(msg.id, { await DatabaseService.updateMessage(msg.id, {
content: fullContent, content: fullContent,
timestamp: Date.now(), timestamp: Date.now(),
timings timings
}); });
conversationsStore.updateMessageAtIndex(idx, { conversationsStore.updateMessageAtIndex(idx, {
content: fullContent, content: fullContent,
timestamp: Date.now(), timestamp: Date.now(),
timings timings
}); });
conversationsStore.updateConversationTimestamp(); conversationsStore.updateConversationTimestamp();
this.setChatLoading(msg.convId, false); this.setChatLoading(msg.convId, false);
this.clearChatStreaming(msg.convId); this.clearChatStreaming(msg.convId);
this.setProcessingState(msg.convId, null); this.setProcessingState(msg.convId, null);
@ -1091,19 +1132,25 @@ class ChatStore {
content: originalContent + appendedContent, content: originalContent + appendedContent,
timestamp: Date.now() timestamp: Date.now()
}); });
conversationsStore.updateMessageAtIndex(idx, { conversationsStore.updateMessageAtIndex(idx, {
content: originalContent + appendedContent, content: originalContent + appendedContent,
timestamp: Date.now() timestamp: Date.now()
}); });
} }
this.setChatLoading(msg.convId, false); this.setChatLoading(msg.convId, false);
this.clearChatStreaming(msg.convId); this.clearChatStreaming(msg.convId);
this.setProcessingState(msg.convId, null); this.setProcessingState(msg.convId, null);
return; return;
} }
console.error('Continue generation error:', error); console.error('Continue generation error:', error);
conversationsStore.updateMessageAtIndex(idx, { content: originalContent }); conversationsStore.updateMessageAtIndex(idx, { content: originalContent });
await DatabaseService.updateMessage(msg.id, { content: originalContent }); await DatabaseService.updateMessage(msg.id, { content: originalContent });
this.setChatLoading(msg.convId, false); this.setChatLoading(msg.convId, false);
this.clearChatStreaming(msg.convId); this.clearChatStreaming(msg.convId);
this.setProcessingState(msg.convId, null); this.setProcessingState(msg.convId, null);
@ -1114,6 +1161,7 @@ class ChatStore {
}); });
} }
}, },
msg.convId, msg.convId,
abortController.signal abortController.signal
); );
@ -1130,9 +1178,12 @@ class ChatStore {
): Promise<void> { ): Promise<void> {
const activeConv = conversationsStore.activeConversation; const activeConv = conversationsStore.activeConversation;
if (!activeConv || this.isChatLoadingInternal(activeConv.id)) return; if (!activeConv || this.isChatLoadingInternal(activeConv.id)) return;
const result = this.getMessageByIdWithRole(messageId, MessageRole.ASSISTANT); const result = this.getMessageByIdWithRole(messageId, MessageRole.ASSISTANT);
if (!result) return; if (!result) return;
const { message: msg, index: idx } = result; const { message: msg, index: idx } = result;
try { try {
if (shouldBranch) { if (shouldBranch) {
const newMessage = await DatabaseService.createMessageBranch( const newMessage = await DatabaseService.createMessageBranch(
@ -1148,13 +1199,16 @@ class ChatStore {
}, },
msg.parent! msg.parent!
); );
await conversationsStore.updateCurrentNode(newMessage.id); await conversationsStore.updateCurrentNode(newMessage.id);
} else { } else {
await DatabaseService.updateMessage(msg.id, { content: newContent }); await DatabaseService.updateMessage(msg.id, { content: newContent });
await conversationsStore.updateCurrentNode(msg.id); await conversationsStore.updateCurrentNode(msg.id);
conversationsStore.updateMessageAtIndex(idx, { content: newContent }); conversationsStore.updateMessageAtIndex(idx, { content: newContent });
} }
conversationsStore.updateConversationTimestamp(); conversationsStore.updateConversationTimestamp();
await conversationsStore.refreshActiveMessages(); await conversationsStore.refreshActiveMessages();
} catch (error) { } catch (error) {
console.error('Failed to edit assistant message:', error); console.error('Failed to edit assistant message:', error);
@ -1168,21 +1222,30 @@ class ChatStore {
): Promise<void> { ): Promise<void> {
const activeConv = conversationsStore.activeConversation; const activeConv = conversationsStore.activeConversation;
if (!activeConv) return; if (!activeConv) return;
const result = this.getMessageByIdWithRole(messageId, MessageRole.USER); const result = this.getMessageByIdWithRole(messageId, MessageRole.USER);
if (!result) return; if (!result) return;
const { message: msg, index: idx } = result; const { message: msg, index: idx } = result;
try { try {
const updateData: Partial<DatabaseMessage> = { content: newContent }; const updateData: Partial<DatabaseMessage> = { content: newContent };
if (newExtras !== undefined) updateData.extra = JSON.parse(JSON.stringify(newExtras)); if (newExtras !== undefined) updateData.extra = JSON.parse(JSON.stringify(newExtras));
await DatabaseService.updateMessage(messageId, updateData); await DatabaseService.updateMessage(messageId, updateData);
conversationsStore.updateMessageAtIndex(idx, updateData); conversationsStore.updateMessageAtIndex(idx, updateData);
const allMessages = await conversationsStore.getConversationMessages(activeConv.id); const allMessages = await conversationsStore.getConversationMessages(activeConv.id);
const rootMessage = allMessages.find((m) => m.type === 'root' && m.parent === null); const rootMessage = allMessages.find((m) => m.type === 'root' && m.parent === null);
if (rootMessage && msg.parent === rootMessage.id && newContent.trim())
if (rootMessage && msg.parent === rootMessage.id && newContent.trim()) {
await conversationsStore.updateConversationTitleWithConfirmation( await conversationsStore.updateConversationTitleWithConfirmation(
activeConv.id, activeConv.id,
newContent.trim() newContent.trim()
); );
}
conversationsStore.updateConversationTimestamp(); conversationsStore.updateConversationTimestamp();
} catch (error) { } catch (error) {
console.error('Failed to edit user message:', error); console.error('Failed to edit user message:', error);
@ -1244,9 +1307,11 @@ class ChatStore {
private async generateResponseForMessage(userMessageId: string): Promise<void> { private async generateResponseForMessage(userMessageId: string): Promise<void> {
const activeConv = conversationsStore.activeConversation; const activeConv = conversationsStore.activeConversation;
if (!activeConv) return; if (!activeConv) return;
this.showErrorDialog(null); this.showErrorDialog(null);
this.setChatLoading(activeConv.id, true); this.setChatLoading(activeConv.id, true);
this.clearChatStreaming(activeConv.id); this.clearChatStreaming(activeConv.id);
try { try {
const allMessages = await conversationsStore.getConversationMessages(activeConv.id); const allMessages = await conversationsStore.getConversationMessages(activeConv.id);
const conversationPath = filterByLeafNodeId( const conversationPath = filterByLeafNodeId(
@ -1267,7 +1332,9 @@ class ChatStore {
}, },
userMessageId userMessageId
); );
conversationsStore.addMessageToActive(assistantMessage); conversationsStore.addMessageToActive(assistantMessage);
await this.streamChatCompletion(conversationPath, assistantMessage); await this.streamChatCompletion(conversationPath, assistantMessage);
} catch (error) { } catch (error) {
console.error('Failed to generate response:', error); console.error('Failed to generate response:', error);
@ -1284,10 +1351,16 @@ class ChatStore {
if (isRouterMode()) { if (isRouterMode()) {
const modelContextSize = selectedModelContextSize(); const modelContextSize = selectedModelContextSize();
if (typeof modelContextSize === 'number' && modelContextSize > 0) return modelContextSize;
if (typeof modelContextSize === 'number' && modelContextSize > 0) {
return modelContextSize;
}
} else { } else {
const propsContextSize = contextSize(); const propsContextSize = contextSize();
if (typeof propsContextSize === 'number' && propsContextSize > 0) return propsContextSize;
if (typeof propsContextSize === 'number' && propsContextSize > 0) {
return propsContextSize;
}
} }
return null; return null;
@ -1305,12 +1378,16 @@ class ChatStore {
conversationId?: string conversationId?: string
): void { ): void {
const processingState = this.parseTimingData(timingData); const processingState = this.parseTimingData(timingData);
if (processingState === null) { if (processingState === null) {
console.warn('Failed to parse timing data - skipping update'); console.warn('Failed to parse timing data - skipping update');
return; return;
} }
const targetId = conversationId || this.activeConversationId; const targetId = conversationId || this.activeConversationId;
if (targetId) this.setProcessingState(targetId, processingState); if (targetId) {
this.setProcessingState(targetId, processingState);
}
} }
private parseTimingData(timingData: Record<string, unknown>): ApiProcessingState | null { private parseTimingData(timingData: Record<string, unknown>): ApiProcessingState | null {
@ -1389,47 +1466,72 @@ class ChatStore {
const hasValue = (value: unknown): boolean => const hasValue = (value: unknown): boolean =>
value !== undefined && value !== null && value !== ''; value !== undefined && value !== null && value !== '';
const apiOptions: Record<string, unknown> = { stream: true, timings_per_token: true }; const apiOptions: Record<string, unknown> = { stream: true, timings_per_token: true };
if (isRouterMode()) { if (isRouterMode()) {
const modelName = selectedModelName(); const modelName = selectedModelName();
if (modelName) apiOptions.model = modelName; if (modelName) apiOptions.model = modelName;
} }
if (currentConfig.systemMessage) apiOptions.systemMessage = currentConfig.systemMessage; if (currentConfig.systemMessage) apiOptions.systemMessage = currentConfig.systemMessage;
if (currentConfig.disableReasoningParsing) apiOptions.disableReasoningParsing = true; if (currentConfig.disableReasoningParsing) apiOptions.disableReasoningParsing = true;
if (hasValue(currentConfig.temperature)) if (hasValue(currentConfig.temperature))
apiOptions.temperature = Number(currentConfig.temperature); apiOptions.temperature = Number(currentConfig.temperature);
if (hasValue(currentConfig.max_tokens)) if (hasValue(currentConfig.max_tokens))
apiOptions.max_tokens = Number(currentConfig.max_tokens); apiOptions.max_tokens = Number(currentConfig.max_tokens);
if (hasValue(currentConfig.dynatemp_range)) if (hasValue(currentConfig.dynatemp_range))
apiOptions.dynatemp_range = Number(currentConfig.dynatemp_range); apiOptions.dynatemp_range = Number(currentConfig.dynatemp_range);
if (hasValue(currentConfig.dynatemp_exponent)) if (hasValue(currentConfig.dynatemp_exponent))
apiOptions.dynatemp_exponent = Number(currentConfig.dynatemp_exponent); apiOptions.dynatemp_exponent = Number(currentConfig.dynatemp_exponent);
if (hasValue(currentConfig.top_k)) apiOptions.top_k = Number(currentConfig.top_k); if (hasValue(currentConfig.top_k)) apiOptions.top_k = Number(currentConfig.top_k);
if (hasValue(currentConfig.top_p)) apiOptions.top_p = Number(currentConfig.top_p); if (hasValue(currentConfig.top_p)) apiOptions.top_p = Number(currentConfig.top_p);
if (hasValue(currentConfig.min_p)) apiOptions.min_p = Number(currentConfig.min_p); if (hasValue(currentConfig.min_p)) apiOptions.min_p = Number(currentConfig.min_p);
if (hasValue(currentConfig.xtc_probability)) if (hasValue(currentConfig.xtc_probability))
apiOptions.xtc_probability = Number(currentConfig.xtc_probability); apiOptions.xtc_probability = Number(currentConfig.xtc_probability);
if (hasValue(currentConfig.xtc_threshold)) if (hasValue(currentConfig.xtc_threshold))
apiOptions.xtc_threshold = Number(currentConfig.xtc_threshold); apiOptions.xtc_threshold = Number(currentConfig.xtc_threshold);
if (hasValue(currentConfig.typ_p)) apiOptions.typ_p = Number(currentConfig.typ_p); if (hasValue(currentConfig.typ_p)) apiOptions.typ_p = Number(currentConfig.typ_p);
if (hasValue(currentConfig.repeat_last_n)) if (hasValue(currentConfig.repeat_last_n))
apiOptions.repeat_last_n = Number(currentConfig.repeat_last_n); apiOptions.repeat_last_n = Number(currentConfig.repeat_last_n);
if (hasValue(currentConfig.repeat_penalty)) if (hasValue(currentConfig.repeat_penalty))
apiOptions.repeat_penalty = Number(currentConfig.repeat_penalty); apiOptions.repeat_penalty = Number(currentConfig.repeat_penalty);
if (hasValue(currentConfig.presence_penalty)) if (hasValue(currentConfig.presence_penalty))
apiOptions.presence_penalty = Number(currentConfig.presence_penalty); apiOptions.presence_penalty = Number(currentConfig.presence_penalty);
if (hasValue(currentConfig.frequency_penalty)) if (hasValue(currentConfig.frequency_penalty))
apiOptions.frequency_penalty = Number(currentConfig.frequency_penalty); apiOptions.frequency_penalty = Number(currentConfig.frequency_penalty);
if (hasValue(currentConfig.dry_multiplier)) if (hasValue(currentConfig.dry_multiplier))
apiOptions.dry_multiplier = Number(currentConfig.dry_multiplier); apiOptions.dry_multiplier = Number(currentConfig.dry_multiplier);
if (hasValue(currentConfig.dry_base)) apiOptions.dry_base = Number(currentConfig.dry_base); if (hasValue(currentConfig.dry_base)) apiOptions.dry_base = Number(currentConfig.dry_base);
if (hasValue(currentConfig.dry_allowed_length)) if (hasValue(currentConfig.dry_allowed_length))
apiOptions.dry_allowed_length = Number(currentConfig.dry_allowed_length); apiOptions.dry_allowed_length = Number(currentConfig.dry_allowed_length);
if (hasValue(currentConfig.dry_penalty_last_n)) if (hasValue(currentConfig.dry_penalty_last_n))
apiOptions.dry_penalty_last_n = Number(currentConfig.dry_penalty_last_n); apiOptions.dry_penalty_last_n = Number(currentConfig.dry_penalty_last_n);
if (currentConfig.samplers) apiOptions.samplers = currentConfig.samplers; if (currentConfig.samplers) apiOptions.samplers = currentConfig.samplers;
if (currentConfig.backend_sampling) if (currentConfig.backend_sampling)
apiOptions.backend_sampling = currentConfig.backend_sampling; apiOptions.backend_sampling = currentConfig.backend_sampling;
if (currentConfig.custom) apiOptions.custom = currentConfig.custom; if (currentConfig.custom) apiOptions.custom = currentConfig.custom;
return apiOptions; return apiOptions;
} }
} }