use std::ffi::{c_char, c_int, c_void};
pub type SwiftPtr = *mut c_void;
pub type ChunkCallback = extern "C" fn(*mut c_void, *const c_char);
pub type DoneCallback = extern "C" fn(*mut c_void);
pub type ErrorCallback = extern "C" fn(*mut c_void, c_int, *const c_char);
pub type ToolCallback = extern "C" fn(*mut c_void, *const c_char, *const c_char) -> *mut c_char;
unsafe extern "C" {
pub fn fm_model_default(error_out: *mut SwiftPtr) -> SwiftPtr;
pub fn fm_model_is_available(model: SwiftPtr) -> bool;
pub fn fm_model_availability(model: SwiftPtr) -> c_int;
pub fn fm_model_token_usage_for(
model: SwiftPtr,
prompt: *const c_char,
error_out: *mut SwiftPtr,
) -> i64;
pub fn fm_model_token_usage_for_tools(
model: SwiftPtr,
instructions: *const c_char,
tools_json: *const c_char,
error_out: *mut SwiftPtr,
) -> i64;
pub fn fm_model_free(model: SwiftPtr);
pub fn fm_session_create(
model: SwiftPtr,
instructions: *const c_char,
tools_json: *const c_char,
user_data: *mut c_void,
tool_callback: ToolCallback,
error_out: *mut SwiftPtr,
) -> SwiftPtr;
pub fn fm_session_from_transcript(
model: SwiftPtr,
transcript_json: *const c_char,
error_out: *mut SwiftPtr,
) -> SwiftPtr;
pub fn fm_session_free(session: SwiftPtr);
pub fn fm_session_respond(
session: SwiftPtr,
prompt: *const c_char,
options_json: *const c_char,
error_out: *mut SwiftPtr,
) -> *mut c_char;
pub fn fm_session_respond_with_timeout(
session: SwiftPtr,
prompt: *const c_char,
options_json: *const c_char,
timeout_ms: u64,
error_out: *mut SwiftPtr,
) -> *mut c_char;
pub fn fm_session_stream(
session: SwiftPtr,
prompt: *const c_char,
options_json: *const c_char,
user_data: *mut c_void,
on_chunk: ChunkCallback,
on_done: DoneCallback,
on_error: ErrorCallback,
);
pub fn fm_session_cancel(session: SwiftPtr);
pub fn fm_session_is_responding(session: SwiftPtr) -> bool;
pub fn fm_session_get_transcript(session: SwiftPtr, error_out: *mut SwiftPtr) -> *mut c_char;
pub fn fm_session_prewarm(session: SwiftPtr, prompt_prefix: *const c_char);
pub fn fm_session_respond_json(
session: SwiftPtr,
prompt: *const c_char,
schema_json: *const c_char,
options_json: *const c_char,
error_out: *mut SwiftPtr,
) -> *mut c_char;
pub fn fm_session_stream_json(
session: SwiftPtr,
prompt: *const c_char,
schema_json: *const c_char,
options_json: *const c_char,
user_data: *mut c_void,
on_chunk: ChunkCallback,
on_done: DoneCallback,
on_error: ErrorCallback,
);
pub fn fm_error_code(error: SwiftPtr) -> c_int;
pub fn fm_error_message(error: SwiftPtr) -> *const c_char;
pub fn fm_error_tool_name(error: SwiftPtr) -> *const c_char;
pub fn fm_error_tool_arguments(error: SwiftPtr) -> *const c_char;
pub fn fm_error_free(error: SwiftPtr);
pub fn fm_string_free(s: *mut c_char);
}
#[repr(i32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AvailabilityCode {
Available = 0,
DeviceNotEligible = 1,
AppleIntelligenceNotEnabled = 2,
ModelNotReady = 3,
Unknown = 4,
}
impl From<c_int> for AvailabilityCode {
fn from(value: c_int) -> Self {
match value {
0 => AvailabilityCode::Available,
1 => AvailabilityCode::DeviceNotEligible,
2 => AvailabilityCode::AppleIntelligenceNotEnabled,
3 => AvailabilityCode::ModelNotReady,
_ => AvailabilityCode::Unknown,
}
}
}
#[repr(i32)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ErrorCode {
Unknown = 0,
ModelNotAvailable = 1,
GenerationFailed = 2,
Cancelled = 3,
ToolError = 4,
InvalidInput = 5,
Timeout = 6,
}
impl From<c_int> for ErrorCode {
fn from(value: c_int) -> Self {
match value {
1 => ErrorCode::ModelNotAvailable,
2 => ErrorCode::GenerationFailed,
3 => ErrorCode::Cancelled,
4 => ErrorCode::ToolError,
5 => ErrorCode::InvalidInput,
6 => ErrorCode::Timeout,
_ => ErrorCode::Unknown,
}
}
}