Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions macos/Onit/Data/Fetching/ChatEndpointMessagesBuilder.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import Foundation
*/
struct ChatEndpointMessagesBuilder {

static func user(instructions: [String], inputs: [Input?], files: [[URL]], autoContexts: [[String: String]], webSearchContexts: [[(title: String, content: String, source: String, url: URL?)]]) -> [String] {
static func user(instructions: [String], inputs: [[Input]], files: [[URL]], autoContexts: [[String: String]], webSearchContexts: [[(title: String, content: String, source: String, url: URL?)]]) -> [String] {
var userMessages: [String] = []
for (index, instruction) in instructions.enumerated() {
var message = ""
Expand Down Expand Up @@ -46,13 +46,18 @@ struct ChatEndpointMessagesBuilder {
message += "\n\(webSearchContext.content)"
}
}

if !inputs[index].isEmpty {
let pendingInputs = inputs[index]

if let input = inputs[index], !input.selectedText.isEmpty {
message += "\n\nUse the following selected text as context. When present, selected text should take priority over other context."
if let application = input.application {
message += "\n\nSelected Text from \(application): \(input.selectedText)"
} else {
message += "\n\nSelected Text: \(input.selectedText)"

for input in pendingInputs {
if let application = input.application {
message += "\n\nSelected Text from \(application): \(input.selectedText)"
} else {
message += "\n\nSelected Text: \(input.selectedText)"
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions macos/Onit/Data/Fetching/FetchingClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ actor FetchingClient {
func chat(
systemMessage: String,
instructions: [String],
inputs: [Input?],
inputs: [[Input]],
files: [[URL]],
images: [[URL]],
autoContexts: [[String: String]],
Expand Down Expand Up @@ -75,7 +75,7 @@ actor FetchingClient {
func localChat(
systemMessage: String,
instructions: [String],
inputs: [Input?],
inputs: [[Input]],
files: [[URL]],
images: [[URL]],
autoContexts: [[String: String]],
Expand Down
4 changes: 2 additions & 2 deletions macos/Onit/Data/Fetching/Streaming/StreamingClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ actor StreamingClient {

func chat(systemMessage: String,
instructions: [String],
inputs: [Input?],
inputs: [[Input]],
files: [[URL]],
images: [[URL]],
autoContexts: [[String: String]],
Expand Down Expand Up @@ -56,7 +56,7 @@ actor StreamingClient {

func localChat(systemMessage: String,
instructions: [String],
inputs: [Input?],
inputs: [[Input]],
files: [[URL]],
images: [[URL]],
autoContexts: [[String: String]],
Expand Down
6 changes: 3 additions & 3 deletions macos/Onit/Data/Persistence/Prompt.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import SwiftData

var instruction: String
var timestamp: Date
var input: Input?
var inputs: [Input]
var contextList: [Context] = []

// @Relationship(deleteRule: .cascade, inverse: \Response.prompt)
Expand All @@ -30,12 +30,12 @@ import SwiftData
var generationIndex = -1

init(
instruction: String, timestamp: Date, input: Input? = nil,
instruction: String, timestamp: Date, inputs: [Input] = [],
contextList: [Context] = [], responses: [Response] = []
) {
self.instruction = instruction
self.timestamp = timestamp
self.input = input
self.inputs = inputs
self.contextList = contextList
self.responses = responses
self.generationState = GenerationState.done
Expand Down
16 changes: 12 additions & 4 deletions macos/Onit/UI/Panels/State/OnitPanelState+Chat.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,18 @@ import SwiftData
extension OnitPanelState {

func createAndSavePrompt(accountId: Int?) {
var inputs = pinnedPendingInputs

if let unpinnedPendingInput = unpinnedPendingInput,
!inputs.contains(unpinnedPendingInput)
{
inputs.append(unpinnedPendingInput)
}

let prompt = Prompt(
instruction: pendingInstruction,
timestamp: .now,
input: pendingInput,
inputs: inputs,
contextList: pendingContextList
)

Expand Down Expand Up @@ -62,7 +70,7 @@ extension OnitPanelState {
currentChat?.prompts.append(prompt)
currentPrompts?.append(prompt)
pendingInstruction = ""
pendingInput = nil
clearHighlightedTextStates()

do {
try container.mainContext.save()
Expand Down Expand Up @@ -91,7 +99,7 @@ extension OnitPanelState {
let curInstruction = prompt.instruction

var filesHistory: [[URL]] = [prompt.contextList.files]
var inputsHistory: [Input?] = [prompt.input]
var inputsHistory: [[Input]] = [prompt.inputs]
var imagesHistory: [[URL]] = [prompt.contextList.images]
var instructionsHistory: [String] = [curInstruction]
var autoContextsHistory: [[String: String]] = [prompt.contextList.autoContexts]
Expand All @@ -110,7 +118,7 @@ extension OnitPanelState {

if response.type != .error {
instructionsHistory.insert(currentPrompt!.instruction, at: 0)
inputsHistory.insert(currentPrompt!.input, at: 0)
inputsHistory.insert(currentPrompt!.inputs, at: 0)
filesHistory.insert(currentPrompt!.contextList.files, at: 0)
imagesHistory.insert(currentPrompt!.contextList.images, at: 0)
autoContextsHistory.insert(currentPrompt!.contextList.autoContexts, at: 0)
Expand Down
2 changes: 1 addition & 1 deletion macos/Onit/UI/Panels/State/OnitPanelState+Input.swift
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ extension OnitPanelState {
pendingInstruction = ""
if (clearContext) {
pendingContextList.removeAll()
pendingInput = nil
clearHighlightedTextStates()
}
focusText()

Expand Down
20 changes: 16 additions & 4 deletions macos/Onit/UI/Panels/State/OnitPanelState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -124,13 +124,25 @@ class OnitPanelState: NSObject {
notifyDelegateInputsChange()
}
}
var pendingInput: Input? = nil {

var selectedPendingInput: Input? = nil

var trackedPendingInput: Input? = nil

var unpinnedPendingInput: Input? = nil {
didSet {
notifyDelegateInputsChange()
}
}

var trackedPendingInput: Input? = nil

var pinnedPendingInputs: [Input] = []

func clearHighlightedTextStates() {
selectedPendingInput = nil
trackedPendingInput = nil
unpinnedPendingInput = nil
pinnedPendingInputs = []
}

var systemPromptId: String = SystemPrompt.outputOnly.id

Expand Down Expand Up @@ -219,7 +231,7 @@ class OnitPanelState: NSObject {
delegate.userInputsDidChange(
instruction: pendingInstruction,
contexts: pendingContextList,
input: pendingInput
input: unpinnedPendingInput
)
}
}
Expand Down