* 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>
45 lines
1.5 KiB
Swift
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()
|
|
}
|