(_ inputText: String, overrideSystemPrompt: String?, dictationSlot: SettingsStore.DictationShortcutSlot?, streamHandler: PrivateAIStreamHandler?)
| 1791 | // MARK: - Modular AI Processing |
| 1792 | |
| 1793 | private func processTextWithAI( |
| 1794 | _ inputText: String, |
| 1795 | overrideSystemPrompt: String? = nil, |
| 1796 | dictationSlot: SettingsStore.DictationShortcutSlot? = nil, |
| 1797 | streamHandler: PrivateAIStreamHandler? = nil |
| 1798 | ) async throws -> String { |
| 1799 | let appInfo = self.recordingAppInfo ?? self.getCurrentAppInfo() |
| 1800 | let route = DictationProviderRoute.resolve( |
| 1801 | settings: SettingsStore.shared, |
| 1802 | dictationSlot: dictationSlot, |
| 1803 | appBundleID: appInfo.bundleId |
| 1804 | ) |
| 1805 | let currentSelectedProviderID = route.providerID |
| 1806 | let derivedCurrentProvider = route.providerKey |
| 1807 | let derivedBaseURL = route.baseURL |
| 1808 | let derivedSelectedModel = route.model |
| 1809 | |
| 1810 | guard !derivedCurrentProvider.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { |
| 1811 | throw AIProcessingError.noVerifiedProvider |
| 1812 | } |
| 1813 | if derivedSelectedModel.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { |
| 1814 | throw AIProcessingError.missingModel(provider: derivedCurrentProvider) |
| 1815 | } |
| 1816 | |
| 1817 | DebugLogger.shared.debug("processTextWithAI using provider=\(derivedCurrentProvider), model=\(derivedSelectedModel)", source: "ContentView") |
| 1818 | |
| 1819 | let isDictationCall = overrideSystemPrompt != nil || dictationSlot != nil |
| 1820 | let isPrivateAIProvider = route.usesPrivateAI |
| 1821 | let usePrivateAIProvider = overrideSystemPrompt == nil && |
| 1822 | isDictationCall && |
| 1823 | (isPrivateAIProvider || PrivateAIIntegrationService.shouldHandleDictation(model: derivedSelectedModel)) |
| 1824 | |
| 1825 | if usePrivateAIProvider { |
| 1826 | if self.shouldTracePromptProcessing { |
| 1827 | self.logDictationPromptTrace("Private AI Provider task", value: "dictationEnhancement") |
| 1828 | self.logDictationPromptTrace("Input transcription (Q)", value: inputText) |
| 1829 | self.logDictationPromptTrace("Selected context text", value: "<none (dictation mode)>") |
| 1830 | } |
| 1831 | |
| 1832 | let response = try await PrivateAIIntegrationService.shared.enhanceDictation( |
| 1833 | inputText, |
| 1834 | runtime: PrivateAIIntegrationService.RuntimeConfiguration( |
| 1835 | selectedProviderID: currentSelectedProviderID, |
| 1836 | providerKey: derivedCurrentProvider, |
| 1837 | baseURL: derivedBaseURL, |
| 1838 | model: derivedSelectedModel, |
| 1839 | apiKey: route.apiKey, |
| 1840 | localModelPath: PrivateAIIntegrationService.configuredLocalModelPath, |
| 1841 | usesStablePromptPrefixKVCache: SettingsStore.shared.privateAIPrefixKVCacheEnabled, |
| 1842 | usesFluid1Boost: SettingsStore.shared.privateAIBoostEnabled, |
| 1843 | contextTokenLimit: SettingsStore.shared.privateAIContextTokenLimit |
| 1844 | ), |
| 1845 | context: PrivateAIIntegrationService.AppContext( |
| 1846 | appName: appInfo.name, |
| 1847 | bundleID: appInfo.bundleId, |
| 1848 | windowTitle: appInfo.windowTitle, |
| 1849 | appVersion: Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String |
| 1850 | ), |
no test coverage detected