Handy/src-tauri/swift/apple_intelligence_stub.swift
Chirag Agggarwal 0cb8ab2162
feat: implement structured outputs for post-processing providers (#706)
* feat: implement structured outputs for Cerebras, OpenRouter, OpenAI, and Apple Intelligence

- Add structured output support with JSON schema in llm_client.rs
- Update actions.rs to use system prompt + user content approach
- Remove legacy ${output} variable substitution for supported providers
- Update Apple Intelligence Swift code to accept system prompts
- All providers now use consistent structured output format
- Remove duplicate check_apple_intelligence_availability function

* wip changes

* fix(structured-outputs): address PR #706 review comments

- Add settings migration to sync supports_structured_output field for existing providers
- Fix fallback behavior: structured output failures now fall through to legacy mode
- Clone api_key to prevent ownership issues in fallback path
- Clean up build_system_prompt(): remove  placeholder entirely
  (instead of replacing with 'the user's message' which reads awkwardly)
- Add warn import from log crate

* refactor(structured-outputs): apply best practice improvements

- Optimize settings migration: use single match instead of double iteration
- Add TRANSCRIPTION_FIELD constant to replace magic strings
- Keep Apple Intelligence behavior unchanged (no API fallback for privacy)

Addresses code review feedback on PR #706:
1. More efficient provider lookup in ensure_post_process_defaults()
2. Eliminates hardcoded 'transcription' string in JSON parsing
3. Maintains privacy-first approach for Apple Intelligence

* fix groq output

---------

Co-authored-by: CJ Pais <cj@cjpais.com>
2026-02-17 12:14:00 +08:00

45 lines
1.5 KiB
Swift

import Foundation
// Stub implementation when FoundationModels is not available
// This file is compiled via Cargo build script when the build environment
// does not support Apple Intelligence (e.g. older Xcode/SDK).
private typealias ResponsePointer = UnsafeMutablePointer<AppleLLMResponse>
@_cdecl("is_apple_intelligence_available")
public func isAppleIntelligenceAvailable() -> Int32 {
return 0
}
@_cdecl("process_text_with_system_prompt_apple")
public func processTextWithSystemPrompt(
_ systemPrompt: UnsafePointer<CChar>,
_ userContent: UnsafePointer<CChar>,
maxTokens: Int32
) -> UnsafeMutablePointer<AppleLLMResponse> {
let responsePtr = ResponsePointer.allocate(capacity: 1)
// Initialize with safe defaults
responsePtr.initialize(to: AppleLLMResponse(response: nil, success: 0, error_message: nil))
let msg = "Apple Intelligence is not available in this build (SDK requirement not met)."
// Duplicate the string for the C caller to own
responsePtr.pointee.error_message = strdup(msg)
return responsePtr
}
@_cdecl("free_apple_llm_response")
public func freeAppleLLMResponse(_ response: UnsafeMutablePointer<AppleLLMResponse>?) {
guard let response = response else { return }
if let responseStr = response.pointee.response {
free(UnsafeMutablePointer(mutating: responseStr))
}
if let errorStr = response.pointee.error_message {
free(UnsafeMutablePointer(mutating: errorStr))
}
response.deallocate()
}