Visual_Novel_iOS/crush/Crush/Src/API/AICowApi.swift

201 lines
11 KiB
Swift
Raw Normal View History

2025-10-09 10:29:35 +00:00
//
// AICowApi.swift
// Crush
//
// Created by Leon on 2025/8/8.
//
import Moya
let AICowProvider = APIConfig.useMock && AICowAPI.useMock
? MoyaProvider<AICowAPI>(endpointClosure: myEndpointClosure, stubClosure: { target in
let data = target.sampleData
if data.count > 0 {
return .delayed(seconds: 0.7)
} else {
return .never
}
})
: MoyaProvider<AICowAPI>(requestClosure: myRequestClosure)
enum AICowAPI {
static let useMock: Bool = true
///
/**
GEN_PROFILE_BY_NON AI一键生成人物基础信息 AI自行创作
GEN_PROFILE_BY_CONTENT AI一键生成人物基础信息 AI根据用户输入进行创作
GEN_DIALOG_STYLE_BY_NON AI一键生成对话风格 AI自行创作
GEN_DIALOG_STYLE_BY_CONTENT AI一键生成对话风格 AI根据用户输入进行创作
GEN_PROLOGUE_BY_NON AI一键生成开场白 AI自行创作
GEN_PROLOGUE_BY_CONTENT AI一键生成开场白 AI根据用户输入进行创作
GEN_INTRODUCTION AI一键生成人物简介 AI总结
IMAGE_REFERENCE_V2 -prompt
TEXT_TO_IMAGE_PROMPT_V2 -6prompt
IMAGE_REFERENCE -prompt
TXT_TO_IMAGE_PROMPT -6prompt
*/
case aiContentGenerate(params: [String: Any])
// MARK: AI Pics
case imageGenerateCreateTask(params: [String: Any])
case imageGeneratedQuery(batchNo: String)
// MARK: AI Audio
case voiceAICallRtcToken(roomId: String)
///
case voiceCallOperate(params: [String: Any])
///
case voiceAsr(voiceBase64: String)
/// v2, urls3 mp3
case voiceAsr2(url: String, aiId: Int)
///
case voiceTts(params:[String: Any])
// MARK: Chat text suggestions
case supChatContent(aiId : Int)
///
case aiMessageDel(params:[String: Any])
}
extension AICowAPI: TargetType {
var baseURL: URL {
return URL(string: APIConfig.cow)!
}
var path: String {
switch self {
case .aiContentGenerate:
return "/web/gen/user-content-v1"
case .imageGenerateCreateTask:
return "/web/gen/image-ct"
case .imageGeneratedQuery:
return "/web/gen/image-pl"
case .voiceAICallRtcToken:
return "/web/voice-chat/gen-rtc-tk"
case .voiceCallOperate:
return "/web/voice-chat/opt"
case .voiceAsr:
return "/web/voice/asr"
case .voiceAsr2:
return "/web/voice/asr-v2"
case .voiceTts:
return "/web/voice/tts-v2"
case .supChatContent :
return "/web/gen/sup-content-v2"
case .aiMessageDel:
return "/web/ai-message/del"
}
}
var method: Moya.Method {
return .post
}
var task: Task {
var mParams = [String: Any]()
switch self {
case let .aiContentGenerate(params):
mParams = params
case let .imageGenerateCreateTask(params):
mParams = params
case let .imageGeneratedQuery(batchNo):
mParams.updateValue(batchNo, forKey: "batchNo")
case let .voiceAICallRtcToken(roomId):
mParams.updateValue(roomId, forKey: "roomId")
case let .voiceCallOperate(params):
mParams = params
case .voiceAsr(let voiceBase64):
mParams.updateValue(voiceBase64, forKey: "data")
case .voiceAsr2(let url, let aiId):
mParams.updateValue(url, forKey: "url")
mParams.updateValue(aiId, forKey: "aiId")
case .voiceTts(let params):
mParams = params
case .supChatContent(let aiId):
mParams.updateValue(aiId, forKey: "aiId")
case .aiMessageDel(let params):
mParams = params
}
mParams.updateValue("IOS", forKey: "appClient")
mParams.updateValue(UIDevice.UUID, forKey: "deviceCode")
return .requestParameters(parameters: mParams, encoding: JSONEncoding.default)
}
var headers: [String: String]? {
return APIConfig.apiHeaders()
}
var sampleData: Data {
switch self {
case .aiContentGenerate:
let content = """
{
"content":仿穿线沿"
}
"""
return .okContent(string: content)
// Rt17nP54sd72Hz65Jy34
// dB17Hk54Ww78Of60pj48
// Zr17Tf56yN38Uj92TX81 2025-8-28
// Em17xx58Cj76KM15ue60 9-25 Lumi
// Ct17xT58EJ88AF33Dt73 9-26
// ok17in58XN88Oe39Io01
// 🔥
case .imageGenerateCreateTask:
let content = """
{
"batchNo": "ok17in58XN88Oe39Io01"
}
"""
return .okContent(string: content)
// PENDINGCOMPLETED
// case .imageGeneratedQuery:
// let content = """
// [
// {
// "status": "COMPLETED",
// "imageUrl": "https://hhb.crushlevel.ai/dev/role/17563893218387148.jpg"
// },
// {
// "status": "FAILED",
// "imageUrl": "https://hhb.crushlevel.ai/dev/role/17563893314246930.jpg"
// },
// {
// "status": "COMPLETED",
// "imageUrl": "https://hhb.crushlevel.ai/dev/role/1756389326156188.jpg"
// },
// {
// "status": "COMPLETED",
// "imageUrl": "https://hhb.crushlevel.ai/dev/role/17563893094825005.jpg"
// },
// {
// "status": "COMPLETED",
// "imageUrl": "https://hhb.crushlevel.ai/dev/role/175638931389095.jpg"
// },
// {
// "status": "COMPLETED",
// "imageUrl": "https://hhb.crushlevel.ai/dev/role/17563893179815838.jpg"
// }
// ]
// """
// return .okContent(string: content)
// case .voiceAICallRtcToken:
// let content = """
// {
// "token": "QEWRFQF1234fase"
// }
// """
// return .okContent(string: content)
default:
return Data()
}
}
}