|
|
@ -4,6 +4,7 @@ import EventKit |
|
|
import CoreLocation |
|
|
import CoreLocation |
|
|
import MessageUI |
|
|
import MessageUI |
|
|
import location_service |
|
|
import location_service |
|
|
|
|
|
import user_portrait // 添加这行 |
|
|
|
|
|
|
|
|
/// 结果结构体 |
|
|
/// 结果结构体 |
|
|
public struct Result { |
|
|
public struct Result { |
|
|
@ -65,6 +66,9 @@ public class SystemFunctionHandler: NSObject { |
|
|
// 注册打开录音机功能 |
|
|
// 注册打开录音机功能 |
|
|
registerOpenRecorderFunction(client: client) |
|
|
registerOpenRecorderFunction(client: client) |
|
|
|
|
|
|
|
|
|
|
|
// 注册用户画像更新功能 |
|
|
|
|
|
registerSetUserProfileFieldFunction(client: client) |
|
|
|
|
|
|
|
|
} catch { |
|
|
} catch { |
|
|
// 静默处理错误 |
|
|
// 静默处理错误 |
|
|
} |
|
|
} |
|
|
@ -720,3 +724,78 @@ private class OpenRecorderHandler: FunctionHandler { |
|
|
// private enum LocationError: Error { |
|
|
// private enum LocationError: Error { |
|
|
// ... |
|
|
// ... |
|
|
// } |
|
|
// } |
|
|
|
|
|
|
|
|
|
|
|
/// 注册设置用户画像字段函数 |
|
|
|
|
|
private func registerSetUserProfileFieldFunction(client: MCPClient) { |
|
|
|
|
|
let parameters: [String: Any] = [ |
|
|
|
|
|
"type": "object", |
|
|
|
|
|
"properties": [ |
|
|
|
|
|
"key": [ |
|
|
|
|
|
"type": "string", |
|
|
|
|
|
"description": "画像字段名,例如:age、tone、工作经历、device_preference" |
|
|
|
|
|
], |
|
|
|
|
|
"value": [ |
|
|
|
|
|
"type": "string", |
|
|
|
|
|
"description": "字段对应的值" |
|
|
|
|
|
] |
|
|
|
|
|
], |
|
|
|
|
|
"required": ["key", "value"] |
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
|
|
let handler = SetUserProfileFieldHandler() |
|
|
|
|
|
_ = client.registerLocalFunction( |
|
|
|
|
|
name: "set_user_profile_field", |
|
|
|
|
|
description: "设置或更新用户画像中的某一个字段", |
|
|
|
|
|
parameters: parameters, |
|
|
|
|
|
handler: handler |
|
|
|
|
|
) |
|
|
|
|
|
} |
|
|
|
|
|
/// 设置用户画像字段处理器 |
|
|
|
|
|
private class SetUserProfileFieldHandler: FunctionHandler { |
|
|
|
|
|
func handle(arguments: [String: Any]) async throws -> String { |
|
|
|
|
|
guard let key = arguments["key"] as? String, |
|
|
|
|
|
let value = arguments["value"] as? String else { |
|
|
|
|
|
throw ChatApiException("缺少必要参数:key 和 value") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 验证参数 |
|
|
|
|
|
if key.isEmpty { |
|
|
|
|
|
throw ChatApiException("画像字段名不能为空") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if value.isEmpty { |
|
|
|
|
|
throw ChatApiException("字段值不能为空") |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
let result = await setUserProfileField(key: key, value: value) |
|
|
|
|
|
return "{\"result\": \"\(result.message)\", \"key\": \"\(key)\", \"value\": \"\(value)\"}\"}" |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private func setUserProfileField(key: String, value: String) async -> Result { |
|
|
|
|
|
return await withCheckedContinuation { continuation in |
|
|
|
|
|
DispatchQueue.main.async { |
|
|
|
|
|
do { |
|
|
|
|
|
// 使用 UserPortrait 单例设置画像字段 |
|
|
|
|
|
UserPortrait.shared.set(key: key, value: value) |
|
|
|
|
|
|
|
|
|
|
|
// 发送通知给其他模块 |
|
|
|
|
|
UserPortrait.shared.sendUpdateNotification(key: key, value: value) |
|
|
|
|
|
|
|
|
|
|
|
print("[SetUserProfileFieldHandler] 成功设置用户画像字段: \(key) = \(value)") |
|
|
|
|
|
|
|
|
|
|
|
continuation.resume(returning: Result( |
|
|
|
|
|
success: true, |
|
|
|
|
|
message: "成功设置用户画像字段 \(key) 为 \(value)" |
|
|
|
|
|
)) |
|
|
|
|
|
} catch { |
|
|
|
|
|
print("[SetUserProfileFieldHandler] 设置用户画像字段失败: \(error.localizedDescription)") |
|
|
|
|
|
|
|
|
|
|
|
continuation.resume(returning: Result( |
|
|
|
|
|
success: false, |
|
|
|
|
|
message: "设置用户画像字段失败:\(error.localizedDescription)" |
|
|
|
|
|
)) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|