New version v2.3.6
This commit is contained in:
@@ -640,7 +640,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
case "/memory":
|
||||
if let arg = args.first?.lowercased() {
|
||||
memoryEnabled = arg == "on"
|
||||
showSystemMessage("Memory \(memoryEnabled ? "enabled" : "disabled")")
|
||||
showSystemMessage(memoryEnabled ? "Memory enabled" : "Memory disabled")
|
||||
} else {
|
||||
showSystemMessage("Usage: /memory on|off")
|
||||
}
|
||||
@@ -648,7 +648,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
case "/online":
|
||||
if let arg = args.first?.lowercased() {
|
||||
onlineMode = arg == "on"
|
||||
showSystemMessage("Online mode \(onlineMode ? "enabled" : "disabled")")
|
||||
showSystemMessage(onlineMode ? "Online mode enabled" : "Online mode disabled")
|
||||
} else {
|
||||
showSystemMessage("Usage: /online on|off")
|
||||
}
|
||||
@@ -881,6 +881,13 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
finalSystemPrompt = summariesText + "\n\n---\n\n" + effectiveSystemPrompt
|
||||
}
|
||||
|
||||
let reasoningConfig: ReasoningConfig? = {
|
||||
guard settings.reasoningEnabled,
|
||||
selectedModel?.capabilities.thinking == true,
|
||||
!isImageGen else { return nil }
|
||||
return ReasoningConfig(effort: settings.reasoningEffort, exclude: settings.reasoningExclude)
|
||||
}()
|
||||
|
||||
let chatRequest = ChatRequest(
|
||||
messages: contextWindow.messages,
|
||||
model: modelId,
|
||||
@@ -891,7 +898,8 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
systemPrompt: finalSystemPrompt,
|
||||
tools: nil,
|
||||
onlineMode: onlineMode,
|
||||
imageGeneration: isImageGen
|
||||
imageGeneration: isImageGen,
|
||||
reasoning: reasoningConfig
|
||||
)
|
||||
|
||||
if isImageGen {
|
||||
@@ -934,6 +942,8 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
} else {
|
||||
// Regular text: stream response
|
||||
var fullContent = ""
|
||||
var fullThinking = ""
|
||||
var collectedImages: [Data] = []
|
||||
var totalTokens: ChatResponse.Usage? = nil
|
||||
var wasCancelled = false
|
||||
|
||||
@@ -943,6 +953,13 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
break
|
||||
}
|
||||
|
||||
if let thinking = chunk.delta.thinking {
|
||||
fullThinking += thinking
|
||||
if let index = messages.firstIndex(where: { $0.id == messageId }) {
|
||||
messages[index].thinkingContent = fullThinking
|
||||
}
|
||||
}
|
||||
|
||||
if let content = chunk.deltaContent {
|
||||
fullContent += content
|
||||
if let index = messages.firstIndex(where: { $0.id == messageId }) {
|
||||
@@ -950,6 +967,10 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
}
|
||||
}
|
||||
|
||||
if let images = chunk.delta.images {
|
||||
collectedImages.append(contentsOf: images)
|
||||
}
|
||||
|
||||
if let usage = chunk.usage {
|
||||
totalTokens = usage
|
||||
}
|
||||
@@ -968,6 +989,9 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
messages[index].isStreaming = false
|
||||
messages[index].responseTime = responseTime
|
||||
messages[index].wasInterrupted = wasCancelled
|
||||
if !collectedImages.isEmpty {
|
||||
messages[index].generatedImages = collectedImages
|
||||
}
|
||||
|
||||
if let usage = totalTokens {
|
||||
messages[index].tokens = usage.completionTokens
|
||||
@@ -1151,7 +1175,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
mcpEnabled = true
|
||||
settings.mcpEnabled = true
|
||||
mcpStatus = "MCP"
|
||||
showSystemMessage("MCP enabled (\(mcp.allowedFolders.count) folder\(mcp.allowedFolders.count == 1 ? "" : "s") registered)")
|
||||
showSystemMessage("MCP enabled (^[\(mcp.allowedFolders.count) folder](inflect: true) registered)")
|
||||
|
||||
case "off":
|
||||
mcpEnabled = false
|
||||
@@ -1165,7 +1189,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
if let error = mcp.addFolder(path) {
|
||||
showSystemMessage("MCP: \(error)")
|
||||
} else {
|
||||
showSystemMessage("MCP: Added folder — \(mcp.allowedFolders.count) folder\(mcp.allowedFolders.count == 1 ? "" : "s") registered")
|
||||
showSystemMessage("MCP: Added folder — ^[\(mcp.allowedFolders.count) folder](inflect: true) registered")
|
||||
}
|
||||
} else {
|
||||
showSystemMessage("Usage: /mcp add <path>")
|
||||
@@ -1230,7 +1254,7 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
if settings.mcpCanCreateDirectories { perms.append("mkdir") }
|
||||
if settings.mcpCanMoveFiles { perms.append("move/copy") }
|
||||
let permStr = perms.isEmpty ? "read-only" : "read + \(perms.joined(separator: ", "))"
|
||||
showSystemMessage("MCP: \(enabled), \(folders) folder\(folders == 1 ? "" : "s"), \(permStr), gitignore: \(settings.mcpRespectGitignore ? "on" : "off")")
|
||||
showSystemMessage("MCP: \(enabled), ^[\(folders) folder](inflect: true), \(permStr), gitignore: \(settings.mcpRespectGitignore ? "on" : "off")")
|
||||
|
||||
default:
|
||||
showSystemMessage("MCP subcommands: on, off, status, add, remove, list, write")
|
||||
@@ -1525,10 +1549,10 @@ Don't narrate future actions ("Let me...") - just use the tools.
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
private func showSystemMessage(_ text: String) -> UUID {
|
||||
private func showSystemMessage(_ text: String.LocalizationValue) -> UUID {
|
||||
let message = Message(
|
||||
role: .system,
|
||||
content: text,
|
||||
content: String(localized: text),
|
||||
tokens: nil,
|
||||
cost: nil,
|
||||
timestamp: Date(),
|
||||
|
||||
Reference in New Issue
Block a user