f512d94c74
git-subtree-dir: clients/ds-app git-subtree-mainline:a24e3e6f22git-subtree-split:5206cf3b0c
68 lines
3.0 KiB
Swift
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
|
|
)
|
|
}
|
|
}
|
|
}
|