SynThera SDK for iOS and macOS
The SynThera Apple SDK brings advanced clinical AI capabilities to iOS and macOS applications. Built with Swift and designed for seamless integration with Apple's health frameworks, enabling powerful healthcare apps with on-device processing and cloud-based clinical intelligence.
Native Swift SDK with full HealthKit integration and comprehensive clinical AI features.
dependencies: [
.package(
url: "https://github.com/synthera/synthera-ios-sdk",
from: "1.0.0"
)
]
Add package dependency in Xcode:
File → Add Package Dependencies → https://github.com/synthera/synthera-ios-sdk
import SynTheraSDK
import HealthKit
class ClinicalAnalysisManager {
private let syntheraClient: SynTheraClient
private let healthStore = HKHealthStore()
init() {
// Initialize SynThera client
syntheraClient = SynTheraClient(
apiKey: "your-api-key-here",
environment: .production,
region: .usEast1
)
}
func analyzePatientData() async throws -> ClinicalAnalysis {
// Create patient data from HealthKit
let patientData = PatientData(
demographics: Demographics(
age: 45,
biologicalSex: .female,
bloodType: .aPositive
),
vitals: try await getVitalsFromHealthKit(),
symptoms: ["chest pain", "shortness of breath"],
medicalHistory: ["hypertension", "diabetes"]
)
// Perform clinical analysis
let analysis = try await syntheraClient.clinical.analyze(patientData)
print("Risk Score: (analysis.riskScore)")
print("Primary Diagnosis: (analysis.primaryDiagnosis)")
print("Recommendations: (analysis.recommendations)")
return analysis
}
private func getVitalsFromHealthKit() async throws -> Vitals {
// Request HealthKit authorization
let typesToRead: Set = [
HKObjectType.quantityType(forIdentifier: .heartRate)!,
HKObjectType.quantityType(forIdentifier: .bloodPressureSystolic)!,
HKObjectType.quantityType(forIdentifier: .bloodPressureDiastolic)!,
HKObjectType.quantityType(forIdentifier: .bodyTemperature)!
]
try await healthStore.requestAuthorization(toShare: [], read: typesToRead)
// Fetch latest vitals
let heartRate = try await getLatestQuantity(for: .heartRate)
let systolic = try await getLatestQuantity(for: .bloodPressureSystolic)
let diastolic = try await getLatestQuantity(for: .bloodPressureDiastolic)
let temperature = try await getLatestQuantity(for: .bodyTemperature)
return Vitals(
heartRate: heartRate?.doubleValue(for: .count().unitDivided(by: .minute())),
bloodPressure: BloodPressure(
systolic: systolic?.doubleValue(for: .millimeterOfMercury()),
diastolic: diastolic?.doubleValue(for: .millimeterOfMercury())
),
temperature: temperature?.doubleValue(for: .degreeFahrenheit())
)
}
}
This example demonstrates integration with HealthKit and basic clinical analysis. The SDK provides native Swift async/await support.
// Seamless HealthKit data analysis
let healthKitManager = SynTheraHealthKit()
// Analyze health trends
let analysis = try await healthKitManager
.analyzeHealthTrends(
startDate: Date().addingTimeInterval(-30*24*3600),
endDate: Date()
)
// Get risk assessment
let riskScore = analysis.cardiovascularRisk
let recommendations = analysis.recommendations
// Real-time medical transcription
let voiceProcessor = syntheraClient.voice
// Start streaming transcription
let stream = try await voiceProcessor
.startStreaming(
language: .english,
specialty: .cardiology
)
stream.onTranscription { transcription in
print("Transcribed: (transcription.text)")
// Extract medical entities
let entities = transcription.medicalEntities
print("Entities: (entities)")
}
import SwiftUI
import SynTheraSDK
struct ClinicalAnalysisView: View {
@StateObject private var analysisManager = ClinicalAnalysisManager()
@State private var analysis: ClinicalAnalysis?
@State private var isAnalyzing = false
@State private var errorMessage: String?
var body: some View {
NavigationView {
VStack(spacing: 20) {
// Patient Data Input
PatientDataForm(patientData: $analysisManager.patientData)
// Analysis Button
Button(action: performAnalysis) {
HStack {
if isAnalyzing {
ProgressView()
.progressViewStyle(CircularProgressViewStyle())
.scaleEffect(0.8)
}
Text(isAnalyzing ? "Analyzing..." : "Analyze Patient")
}
}
.disabled(isAnalyzing)
.buttonStyle(PrimaryButtonStyle())
// Analysis Results
if let analysis = analysis {
AnalysisResultsView(analysis: analysis)
}
// Error Display
if let errorMessage = errorMessage {
Text(errorMessage)
.foregroundColor(.red)
.padding()
}
Spacer()
}
.padding()
.navigationTitle("Clinical Analysis")
}
}
private func performAnalysis() {
isAnalyzing = true
errorMessage = nil
Task {
do {
let result = try await analysisManager.analyzePatient()
await MainActor.run {
self.analysis = result
self.isAnalyzing = false
}
} catch {
await MainActor.run {
self.errorMessage = error.localizedDescription
self.isAnalyzing = false
}
}
}
}
}
struct AnalysisResultsView: View {
let analysis: ClinicalAnalysis
var body: some View {
VStack(alignment: .leading, spacing: 16) {
Text("Analysis Results")
.font(.headline)
// Risk Score
HStack {
Text("Risk Score:")
.fontWeight(.medium)
Spacer()
Text("(analysis.riskScore, specifier: "%.1f")")
.foregroundColor(riskColor(for: analysis.riskScore))
.fontWeight(.bold)
}
// Primary Diagnosis
VStack(alignment: .leading, spacing: 8) {
Text("Primary Diagnosis:")
.fontWeight(.medium)
Text(analysis.primaryDiagnosis)
.padding()
.background(Color.blue.opacity(0.1))
.cornerRadius(8)
}
// Recommendations
VStack(alignment: .leading, spacing: 8) {
Text("Recommendations:")
.fontWeight(.medium)
ForEach(analysis.recommendations, id: .self) { recommendation in
HStack {
Image(systemName: "checkmark.circle.fill")
.foregroundColor(.green)
Text(recommendation)
}
.padding(.vertical, 2)
}
}
}
.padding()
.background(Color(.systemGray6))
.cornerRadius(12)
}
private func riskColor(for score: Double) -> Color {
switch score {
case 0..<3: return .green
case 3..<7: return .orange
default: return .red
}
}
}
import UIKit
import SynTheraSDK
class ClinicalAnalysisViewController: UIViewController {
private let syntheraClient = SynTheraClient(
apiKey: "your-api-key",
environment: .production
)
@IBOutlet weak var patientDataTextView: UITextView!
@IBOutlet weak var analyzeButton: UIButton!
@IBOutlet weak var resultsLabel: UILabel!
@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
title = "Clinical Analysis"
analyzeButton.layer.cornerRadius = 8
resultsLabel.numberOfLines = 0
}
@IBAction func analyzeButtonTapped(_ sender: UIButton) {
performAnalysis()
}
private func performAnalysis() {
setLoadingState(true)
// Parse patient data from text view
guard let patientDataText = patientDataTextView.text,
!patientDataText.isEmpty else {
showError("Please enter patient data")
setLoadingState(false)
return
}
Task {
do {
// Create patient data object
let patientData = try parsePatientData(from: patientDataText)
// Perform analysis
let analysis = try await syntheraClient.clinical.analyze(patientData)
await MainActor.run {
displayResults(analysis)
setLoadingState(false)
}
} catch {
await MainActor.run {
showError(error.localizedDescription)
setLoadingState(false)
}
}
}
}
private func displayResults(_ analysis: ClinicalAnalysis) {
let resultsText = """
Risk Score: (analysis.riskScore)
Primary Diagnosis:
(analysis.primaryDiagnosis)
Recommendations:
(analysis.recommendations.joined(separator: "
• "))
Confidence: (analysis.confidenceScore)%
"""
resultsLabel.text = resultsText
}
private func setLoadingState(_ isLoading: Bool) {
analyzeButton.isEnabled = !isLoading
if isLoading {
activityIndicator.startAnimating()
analyzeButton.setTitle("Analyzing...", for: .normal)
} else {
activityIndicator.stopAnimating()
analyzeButton.setTitle("Analyze Patient", for: .normal)
}
}
private func showError(_ message: String) {
let alert = UIAlertController(
title: "Error",
message: message,
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true)
}
private func parsePatientData(from text: String) throws -> PatientData {
// Implementation for parsing patient data from text
// This could be JSON parsing or custom format
// For demo purposes, creating sample data
return PatientData(
demographics: Demographics(age: 45, biologicalSex: .female),
vitals: Vitals(
heartRate: 88,
bloodPressure: BloodPressure(systolic: 140, diastolic: 90),
temperature: 98.6
),
symptoms: ["chest pain", "shortness of breath"],
medicalHistory: ["hypertension"]
)
}
}
clinical.analyze(_:)
clinical.riskScore(_:)
clinical.drugInteractions(_:)
clinical.guidelines(for:)
voice.transcribe(_:)
voice.startStreaming(_:)
voice.generateSOAP(_:)
voice.extractEntities(_:)
imaging.analyze(_:)
imaging.detectAnomalies(_:)
imaging.measure(_:)
imaging.compare(_:with:)
healthKit.requestAuthorization()
healthKit.fetchVitals()
healthKit.analyzeHealthTrends()
healthKit.syncWithSynThera()
fhir.patient(_:)
fhir.observation(_:)
fhir.condition(_:)
fhir.medication(_:)
utils.validateData(_:)
utils.anonymize(_:)
utils.exportReport(_:)
utils.healthCheck()
Complete API reference
Source code and examples
Complete iOS app examples
Get help from other developers