提供用于构建基于聊天应用程序的 UI 组件。
SpeziChat 模块提供了可用于实现基于聊天用例的视图,例如消息视图或语音输入字段。
![]() ![]() |
![]() ![]() |
![]() ![]() |
---|---|---|
ChatView |
ChatView |
ChatView |
您需要将 Spezi Chat Swift 包添加到 Xcode 中的应用 或 Swift 包中。
重要提示
如果您的应用程序尚未配置为使用 Spezi,请按照 Spezi 设置文章 来设置核心 Spezi 基础设施。
由于 SpeziChat 在底层使用了 SpeziSpeech 模块来实现语音交互功能,因此需要确保您的应用程序具有麦克风访问和语音识别的必要权限。 请按照以下步骤在您的 Xcode 项目中配置目标属性
Custom iOS Target Properties
(即 Info.plist
文件) 中,以提供描述您的应用为何需要这些权限的原因。Privacy - Microphone Usage Description
的键,并提供一个字符串值,用于描述您的应用程序需要访问麦克风的原因。 当应用程序首次请求麦克风访问权限时,此描述将显示给用户。Privacy - Speech Recognition Usage Description
的键,并提供一个字符串值,用于解释您的应用程序为何需要语音识别功能。 当应用程序首次尝试执行语音识别时,将向用户显示此内容。这些条目对于使用麦克风和语音识别功能的应用程序是强制性的。 如果未能提供它们,将导致您的应用程序无法访问这些功能。
SpeziChat 的底层数据模型是 Chat
。 它表示用户和系统之间典型的基于文本的聊天内容。Chat
只是一个有序的 ChatEntity
数组,其中包含各个消息的内容。 ChatEntity
由一个 ChatEntity/Role
、一个唯一标识符、一个时间戳以及一个基于 String
的内容组成,该内容可以包含 Markdown 格式的文本。 此外,一个标志指示 ChatEntity
是否完整,是否不会添加更多内容。
注意
ChatEntity
能够存储基于 Markdown 的内容,该内容又在 ChatView
、MessagesView
和 MessageView
中呈现为样式文本。
ChatView
提供了一个基本的、可重用的聊天视图,其中包括一个消息输入字段。 可以通过 iOS 键盘输入,也可以通过语音输入并转录为书面文本。 它接受一个额外的 messagePendingAnimation
参数来控制是否为当前正在编写的消息显示聊天气泡动画。 默认情况下,messagePendingAnimation
的值为 nil
并且不显示。 此外,ChatView
提供了通过共享表单(或活动视图)将可视化的 Chat
导出为 PDF 文档、JSON 表示或文本 UTF-8 文件(参见 ChatView/ChatExportFormat
)的功能。
struct ChatTestView: View {
@State private var chat: Chat = [
ChatEntity(role: .assistant, content: "Assistant Message!")
]
var body: some View {
ChatView($chat, exportFormat: .pdf)
.navigationTitle("SpeziChat")
}
}
注意
ChatView
通过 SpeziSpeech
模块开箱即用地提供了语音转文本(识别)以及文本转语音(合成)的辅助功能,从而促进与 ChatView
内容的无缝交互。
MessagesView
以典型的聊天方式显示一个 Chat
,其中包含多个具有不同 ChatEntity/Role
的 ChatEntity
。 View
会自动向下滚动到添加到传入的 Chat
SwiftUI Binding
的最新消息。 typingIndicator
参数控制何时在屏幕上显示传入 Chat
的键入指示器。
struct MessagesViewTestView: View {
@State private var chat: Chat = [
ChatEntity(role: .user, content: "User Message!"),
ChatEntity(role: .assistant, content: "Assistant Message!")
]
var body: some View {
MessagesView($chat)
}
}
MessageView
是一个可重用的 SwiftUI View
,用于在典型的聊天消息气泡中显示 ChatEntity
的内容。 此气泡根据关联的 ChatEntity/Role
正确对齐。
struct MessageViewTestView: View {
var body: some View {
VStack {
MessageView(ChatEntity(role: .user, content: "User Message!"))
MessageView(ChatEntity(role: .assistant, content: "Assistant Message!"))
MessageView(ChatEntity(role: .hidden(type: .unknown), content: "System Message (hidden)!"))
}
.padding()
}
}
MessageInputView
是一个可重用的 SwiftUI View
,用于处理基于文本或基于语音的用户输入。 提供的消息通过 SwiftUI Binding
附加到传入的 Chat
。
struct MessageInputTestView: View {
@State private var chat: Chat = []
@State private var disableInput = false
var body: some View {
VStack {
Spacer()
MessageInputView($chat, messagePlaceholder: "TestMessage")
.disabled(disableInput)
/// Get the height of the `MessageInputView` via a SwiftUI `PreferenceKey`
.onPreferenceChange(MessageInputViewHeightKey.self) { newValue in
let messageInputHeight: CGFloat = newValue
// ...
}
}
}
}
有关更多信息,请参阅 API 文档。
HealthGPT 和 LLMonFHIR 提供了使用 SpeziChat
模块的绝佳起点和示例。
欢迎为本项目做出贡献。 请务必先阅读贡献指南和贡献者盟约行为准则。
本项目基于 MIT 许可证。 有关更多信息,请参阅许可证。