mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-07 09:21:24 +08:00
feat: adopt new backend api for attachment (#13336)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Introduced a new query for applying document updates using AI, allowing merged markdown responses. * Added support for an optional file upload field when creating chat messages. * **Improvements** * Enhanced recent Copilot sessions query with pagination by adding an offset parameter. * Refined attachment handling in chat responses to better distinguish between single and multiple file uploads, improving reliability. * **Bug Fixes** * Minor update to error handling for clearer messaging. * **Chores** * Cleaned up and updated iOS project configuration files for improved build consistency. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
+54
@@ -0,0 +1,54 @@
|
||||
// @generated
|
||||
// This file was automatically generated and should not be edited.
|
||||
|
||||
@_exported import ApolloAPI
|
||||
|
||||
public class ApplyDocUpdatesQuery: GraphQLQuery {
|
||||
public static let operationName: String = "applyDocUpdates"
|
||||
public static let operationDocument: ApolloAPI.OperationDocument = .init(
|
||||
definition: .init(
|
||||
#"query applyDocUpdates($workspaceId: String!, $docId: String!, $op: String!, $updates: String!) { applyDocUpdates( workspaceId: $workspaceId docId: $docId op: $op updates: $updates ) }"#
|
||||
))
|
||||
|
||||
public var workspaceId: String
|
||||
public var docId: String
|
||||
public var op: String
|
||||
public var updates: String
|
||||
|
||||
public init(
|
||||
workspaceId: String,
|
||||
docId: String,
|
||||
op: String,
|
||||
updates: String
|
||||
) {
|
||||
self.workspaceId = workspaceId
|
||||
self.docId = docId
|
||||
self.op = op
|
||||
self.updates = updates
|
||||
}
|
||||
|
||||
public var __variables: Variables? { [
|
||||
"workspaceId": workspaceId,
|
||||
"docId": docId,
|
||||
"op": op,
|
||||
"updates": updates
|
||||
] }
|
||||
|
||||
public struct Data: AffineGraphQL.SelectionSet {
|
||||
public let __data: DataDict
|
||||
public init(_dataDict: DataDict) { __data = _dataDict }
|
||||
|
||||
public static var __parentType: any ApolloAPI.ParentType { AffineGraphQL.Objects.Query }
|
||||
public static var __selections: [ApolloAPI.Selection] { [
|
||||
.field("applyDocUpdates", String.self, arguments: [
|
||||
"workspaceId": .variable("workspaceId"),
|
||||
"docId": .variable("docId"),
|
||||
"op": .variable("op"),
|
||||
"updates": .variable("updates")
|
||||
]),
|
||||
] }
|
||||
|
||||
/// Apply updates to a doc using LLM and return the merged markdown.
|
||||
public var applyDocUpdates: String { __data["applyDocUpdates"] }
|
||||
}
|
||||
}
|
||||
+12
-4
@@ -7,24 +7,28 @@ public class GetCopilotRecentSessionsQuery: GraphQLQuery {
|
||||
public static let operationName: String = "getCopilotRecentSessions"
|
||||
public static let operationDocument: ApolloAPI.OperationDocument = .init(
|
||||
definition: .init(
|
||||
#"query getCopilotRecentSessions($workspaceId: String!, $limit: Int = 10) { currentUser { __typename copilot(workspaceId: $workspaceId) { __typename chats( pagination: { first: $limit } options: { fork: false, sessionOrder: desc, withMessages: false } ) { __typename ...PaginatedCopilotChats } } } }"#,
|
||||
#"query getCopilotRecentSessions($workspaceId: String!, $limit: Int = 10, $offset: Int = 0) { currentUser { __typename copilot(workspaceId: $workspaceId) { __typename chats( pagination: { first: $limit, offset: $offset } options: { action: false, fork: false, sessionOrder: desc, withMessages: false } ) { __typename ...PaginatedCopilotChats } } } }"#,
|
||||
fragments: [CopilotChatHistory.self, CopilotChatMessage.self, PaginatedCopilotChats.self]
|
||||
))
|
||||
|
||||
public var workspaceId: String
|
||||
public var limit: GraphQLNullable<Int>
|
||||
public var offset: GraphQLNullable<Int>
|
||||
|
||||
public init(
|
||||
workspaceId: String,
|
||||
limit: GraphQLNullable<Int> = 10
|
||||
limit: GraphQLNullable<Int> = 10,
|
||||
offset: GraphQLNullable<Int> = 0
|
||||
) {
|
||||
self.workspaceId = workspaceId
|
||||
self.limit = limit
|
||||
self.offset = offset
|
||||
}
|
||||
|
||||
public var __variables: Variables? { [
|
||||
"workspaceId": workspaceId,
|
||||
"limit": limit
|
||||
"limit": limit,
|
||||
"offset": offset
|
||||
] }
|
||||
|
||||
public struct Data: AffineGraphQL.SelectionSet {
|
||||
@@ -65,8 +69,12 @@ public class GetCopilotRecentSessionsQuery: GraphQLQuery {
|
||||
public static var __selections: [ApolloAPI.Selection] { [
|
||||
.field("__typename", String.self),
|
||||
.field("chats", Chats.self, arguments: [
|
||||
"pagination": ["first": .variable("limit")],
|
||||
"pagination": [
|
||||
"first": .variable("limit"),
|
||||
"offset": .variable("offset")
|
||||
],
|
||||
"options": [
|
||||
"action": false,
|
||||
"fork": false,
|
||||
"sessionOrder": "desc",
|
||||
"withMessages": false
|
||||
|
||||
+7
@@ -12,6 +12,7 @@ public struct CreateChatMessageInput: InputObject {
|
||||
|
||||
public init(
|
||||
attachments: GraphQLNullable<[String]> = nil,
|
||||
blob: GraphQLNullable<Upload> = nil,
|
||||
blobs: GraphQLNullable<[Upload]> = nil,
|
||||
content: GraphQLNullable<String> = nil,
|
||||
params: GraphQLNullable<JSON> = nil,
|
||||
@@ -19,6 +20,7 @@ public struct CreateChatMessageInput: InputObject {
|
||||
) {
|
||||
__data = InputDict([
|
||||
"attachments": attachments,
|
||||
"blob": blob,
|
||||
"blobs": blobs,
|
||||
"content": content,
|
||||
"params": params,
|
||||
@@ -31,6 +33,11 @@ public struct CreateChatMessageInput: InputObject {
|
||||
set { __data["attachments"] = newValue }
|
||||
}
|
||||
|
||||
public var blob: GraphQLNullable<Upload> {
|
||||
get { __data["blob"] }
|
||||
set { __data["blob"] = newValue }
|
||||
}
|
||||
|
||||
public var blobs: GraphQLNullable<[Upload]> {
|
||||
get { __data["blobs"] }
|
||||
set { __data["blobs"] = newValue }
|
||||
|
||||
+8
-9
@@ -167,8 +167,12 @@ private extension ChatManager {
|
||||
"files": [String](), // attachment in context, keep nil for now
|
||||
"searchMode": editorData.isSearchEnabled ? "MUST" : "AUTO",
|
||||
]
|
||||
let attachmentFieldName = "options.blobs"
|
||||
var uploadableAttachments: [GraphQLFile] = [
|
||||
let hasMultipleAttachmentBlobs = [
|
||||
editorData.fileAttachments.count,
|
||||
editorData.documentAttachments.count,
|
||||
].reduce(0, +) > 1
|
||||
let attachmentFieldName = hasMultipleAttachmentBlobs ? "options.blobs" : "options.blob"
|
||||
let uploadableAttachments: [GraphQLFile] = [
|
||||
editorData.fileAttachments.map { file -> GraphQLFile in
|
||||
.init(fieldName: attachmentFieldName, originalName: file.name, data: file.data ?? .init())
|
||||
},
|
||||
@@ -177,15 +181,10 @@ private extension ChatManager {
|
||||
},
|
||||
].flatMap(\.self)
|
||||
assert(uploadableAttachments.allSatisfy { !($0.data?.isEmpty ?? true) })
|
||||
// in Apollo, filed name is handled as attached object to field when there is only one attachment
|
||||
// to use array on our server, we need to append a dummy attachment
|
||||
// which is ignored if data is empty and name is empty
|
||||
if uploadableAttachments.count == 1 {
|
||||
uploadableAttachments.append(.init(fieldName: attachmentFieldName, originalName: "", data: .init()))
|
||||
}
|
||||
guard let input = try? CreateChatMessageInput(
|
||||
attachments: [],
|
||||
blobs: .some([]), // must have the placeholder
|
||||
blob: hasMultipleAttachmentBlobs ? .none : "",
|
||||
blobs: hasMultipleAttachmentBlobs ? .some([]) : .none,
|
||||
content: .some(contextSnippet.isEmpty ? editorData.text : "\(contextSnippet)\n\(editorData.text)"),
|
||||
params: .some(AffineGraphQL.JSON(_jsonValue: messageParameters)),
|
||||
sessionId: sessionId
|
||||
|
||||
+1
-1
@@ -62,7 +62,7 @@ public class IntelligentContext {
|
||||
"Login required: \(reason)"
|
||||
case let .sessionCreationFailed(reason):
|
||||
"Session creation failed: \(reason)"
|
||||
case let .featureClosed:
|
||||
case .featureClosed:
|
||||
"Intelligent feature closed"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user