Added selected text for assistant prompt
This commit is contained in:
parent
df29146676
commit
9b64652f87
@ -13,14 +13,16 @@ enum AIPrompts {
|
|||||||
|
|
||||||
static let assistantMode = """
|
static let assistantMode = """
|
||||||
<SYSTEM_INSTRUCTIONS>
|
<SYSTEM_INSTRUCTIONS>
|
||||||
Give a helpful and informative response to the user's query. Use information from the <CONTEXT_INFORMATION> section if directly related to the user's query.
|
You are a powerful AI assistant. Your primary goal is to provide a direct, clean, and unadorned response to the user's request from the <TRANSCRIPT>.
|
||||||
Remember to:
|
|
||||||
1. ALWAYS provide ONLY the direct answer to the user's query.
|
YOUR RESPONSE MUST BE PURE. This means:
|
||||||
2. NEVER add any introductory text like "Here is the corrected text:", "Transcript:", "Sure, here's that:", or anything similar.
|
- NO commentary.
|
||||||
3. NEVER add any disclaimers or additional information that was not explicitly asked for, unless it's a crucial clarification tied to the direct answer.
|
- NO introductory phrases like "Here is the result:" or "Sure, here's the text:".
|
||||||
4. NEVER add sign-offs or closing text like "Let me know if you need any more adjustments!", or anything like that.
|
- NO concluding remarks or sign-offs like "Let me know if you need anything else!".
|
||||||
5. Your response must be directly address the user's request.
|
- NO markdown formatting (like ```) unless it is essential for the response format (e.g., code).
|
||||||
6. Maintain a friendly, casual tone.
|
- ONLY provide the direct answer or the modified text that was requested.
|
||||||
|
|
||||||
|
Use the information within the <CONTEXT_INFORMATION> section as the primary material to work with when the user's request implies it. Your main instruction is always the user's <TRANSCRIPT>.
|
||||||
</SYSTEM_INSTRUCTIONS>
|
</SYSTEM_INSTRUCTIONS>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
@ -126,6 +126,17 @@ class AIEnhancementService: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func getSystemMessage(for mode: EnhancementPrompt) -> String {
|
private func getSystemMessage(for mode: EnhancementPrompt) -> String {
|
||||||
|
let selectedText = SelectedTextService.fetchSelectedText()
|
||||||
|
|
||||||
|
if let activePrompt = activePrompt,
|
||||||
|
activePrompt.id == PredefinedPrompts.assistantPromptId,
|
||||||
|
let selectedText = selectedText, !selectedText.isEmpty {
|
||||||
|
|
||||||
|
let selectedTextContext = "\n\nSelected Text: \(selectedText)"
|
||||||
|
let contextSection = "\n\n\(AIPrompts.contextInstructions)\n\n<CONTEXT_INFORMATION>\(selectedTextContext)\n</CONTEXT_INFORMATION>"
|
||||||
|
return activePrompt.promptText + contextSection
|
||||||
|
}
|
||||||
|
|
||||||
let clipboardContext = if useClipboardContext,
|
let clipboardContext = if useClipboardContext,
|
||||||
let clipboardText = NSPasteboard.general.string(forType: .string),
|
let clipboardText = NSPasteboard.general.string(forType: .string),
|
||||||
!clipboardText.isEmpty {
|
!clipboardText.isEmpty {
|
||||||
|
|||||||
51
VoiceInk/Services/SelectedTextService.swift
Normal file
51
VoiceInk/Services/SelectedTextService.swift
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import Foundation
|
||||||
|
import AppKit
|
||||||
|
|
||||||
|
class SelectedTextService {
|
||||||
|
static func fetchSelectedText() -> String? {
|
||||||
|
guard let frontmostApp = NSWorkspace.shared.frontmostApplication,
|
||||||
|
frontmostApp.bundleIdentifier != "com.prakashjoshipax.VoiceInk" else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
let systemWideElement = AXUIElementCreateSystemWide()
|
||||||
|
var focusedElement: CFTypeRef?
|
||||||
|
|
||||||
|
guard AXUIElementCopyAttributeValue(systemWideElement, kAXFocusedUIElementAttribute as CFString, &focusedElement) == .success,
|
||||||
|
let element = focusedElement else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return findSelectedText(in: element as! AXUIElement)
|
||||||
|
}
|
||||||
|
|
||||||
|
private static func findSelectedText(in element: AXUIElement) -> String? {
|
||||||
|
var selectedTextValue: CFTypeRef?
|
||||||
|
if AXUIElementCopyAttributeValue(element, kAXSelectedTextAttribute as CFString, &selectedTextValue) == .success {
|
||||||
|
if let selectedText = selectedTextValue as? String, !selectedText.isEmpty {
|
||||||
|
return selectedText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback for apps that use kAXValueAttribute for selected text (like some Electron apps)
|
||||||
|
var value: CFTypeRef?
|
||||||
|
if AXUIElementCopyAttributeValue(element, kAXValueAttribute as CFString, &value) == .success {
|
||||||
|
if let selectedText = value as? String, !selectedText.isEmpty {
|
||||||
|
return selectedText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var children: CFTypeRef?
|
||||||
|
if AXUIElementCopyAttributeValue(element, kAXChildrenAttribute as CFString, &children) == .success {
|
||||||
|
if let axChildren = children as? [AXUIElement] {
|
||||||
|
for child in axChildren {
|
||||||
|
if let foundText = findSelectedText(in: child) {
|
||||||
|
return foundText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user