Files

68 lines
3.0 KiB
Swift

// MockAIProvider.swift S3 LLM / mock.
//
// AIProviderID canned .
// S3 SwiftUI / UI AI .
import Foundation
public struct MockAIProvider: AIProvider {
public let id: AIProviderID
public let available: Bool
/// (ms) UI .
public let simulatedLatencyMs: Double
public init(id: AIProviderID = .onDevice, available: Bool = true, simulatedLatencyMs: Double = 120) {
self.id = id
self.available = available
self.simulatedLatencyMs = simulatedLatencyMs
}
public var isAvailable: Bool {
get async { available }
}
public func complete(_ request: AICompletionRequest) async throws -> AICompletionResponse {
guard available else { throw AIProviderError.unavailable(id) }
switch request.task {
case .quickSummarize:
return AICompletionResponse(
text: "요약(mock): 엘보 내경 가공 시 공차 +0.1/-0.0 관리와 최종 치수 검사 기록이 핵심.",
providerUsed: id, confidence: .high, latencyMs: simulatedLatencyMs
)
case .memoAssist:
return AICompletionResponse(
text: "제목 제안(mock): 엘보 발주 확인 / 태그: 발주, 엘보, 업무",
providerUsed: id, confidence: .medium, latencyMs: simulatedLatencyMs
)
case .askSelection:
return AICompletionResponse(
text: "선택 구간 답변(mock): UCS-66 면제 곡선은 재료군과 두께로 MDMT 면제를 판정합니다.",
providerUsed: id, confidence: .high, latencyMs: simulatedLatencyMs
)
case .corpusAsk:
return AICompletionResponse(
text: "충격시험 면제는 UCS-66 면제 곡선으로 판정합니다 [1]. 설계 응력비가 낮으면 UCS-66.1로 MDMT를 더 낮출 수 있습니다 [1].",
providerUsed: .remoteDS,
citations: [
AICitation(n: 1, docId: 4912,
title: "ASME Section VIII Div 1 — Impact Test 요건",
sectionTitle: "2. UCS-66 면제 곡선",
spanText: "재료군과 두께에 따라 MDMT에서의 충격시험 면제 여부를 결정한다.")
],
confidence: .high, latencyMs: 2840
)
case .classify:
return AICompletionResponse(
text: "분류 제안(mock): Engineering / 압력용기",
providerUsed: id, confidence: .medium, latencyMs: simulatedLatencyMs
)
case .vision:
return AICompletionResponse(
text: "비전(mock): 스캔 도면에서 표제란·치수선·용접기호가 식별됨.",
providerUsed: .specialized, confidence: .medium, latencyMs: 900
)
}
}
}