Files

93 lines
2.8 KiB
Swift

// LLMHelper.swift - Interface with macOS native Apple Intelligence FoundationModels
import Foundation
import FoundationModels
struct Options {
var prompt: String = ""
var systemPrompt: String? = nil
var check: Bool = false
}
func parseArguments() -> Options {
var options = Options()
var arguments = Array(CommandLine.arguments.dropFirst())
while let argument = arguments.first {
arguments.removeFirst()
switch argument {
case "--prompt":
if !arguments.isEmpty { options.prompt = arguments.removeFirst() }
case "--system":
if !arguments.isEmpty { options.systemPrompt = arguments.removeFirst() }
case "--check":
options.check = true
default:
if options.prompt.isEmpty && !argument.hasPrefix("--") {
options.prompt = argument
}
}
}
return options
}
func emit(_ payload: [String: Any]) {
if let data = try? JSONSerialization.data(withJSONObject: payload, options: [.sortedKeys]),
let str = String(data: data, encoding: .utf8) {
print(str)
fflush(stdout)
}
}
func fail(_ message: String) -> Never {
emit(["error": message])
exit(1)
}
@main
@available(macOS 26.0, *)
struct LLMHelperApp {
static func main() async {
let options = parseArguments()
let model = SystemLanguageModel.default
let isAvailable = model.isAvailable
if options.check {
var attemptError: String = ""
do {
let session = LanguageModelSession(model: model)
_ = try await session.respond(to: "test")
} catch {
attemptError = error.localizedDescription
}
emit([
"available": isAvailable,
"model": "macOS SystemLanguageModel",
"attemptError": attemptError,
"reason": isAvailable ? "macOS Apple Intelligence model available" : "SystemLanguageModel isAvailable returned false (\(attemptError))"
])
exit(0)
}
guard !options.prompt.isEmpty else {
fail("no prompt provided")
}
do {
let instructions = options.systemPrompt ?? ""
let session: LanguageModelSession
if !instructions.isEmpty {
session = LanguageModelSession(model: model, instructions: instructions)
} else {
session = LanguageModelSession(model: model)
}
let response = try await session.respond(to: options.prompt)
let resultText = String(describing: response)
emit(["done": true, "text": resultText])
} catch {
fail("LanguageModel error: \(error.localizedDescription)")
}
}
}