Skip to content

Commit 1690c8b

Browse files
authored
fix(page): add doc query when convert thread to page (#4179)
* fix(page): add doc query when convert thread to page * chore(page): always return doc and code query event even no doc or code matched
1 parent 309edd1 commit 1690c8b

File tree

2 files changed

+79
-69
lines changed

2 files changed

+79
-69
lines changed

ee/tabby-db/src/pages.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub struct PageSectionDAO {
3131
}
3232

3333
impl DbConn {
34-
pub async fn create_page(&self, author_id: i64, code_source_id: Option<String>) -> Result<i64> {
34+
pub async fn create_page(&self, author_id: i64, code_source_id: Option<&str>) -> Result<i64> {
3535
let res = query!(
3636
"INSERT INTO pages(author_id, code_source_id) VALUES (?, ?)",
3737
author_id,

ee/tabby-webserver/src/service/page.rs

Lines changed: 78 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,25 @@ impl PageService for PageServiceImpl {
9494
.list_thread_messages(&input.thread_id, None, None, None, None)
9595
.await?;
9696

97+
// use the first message source id for page
98+
let code_source_id = thread_messages
99+
.iter()
100+
.find_map(|m| m.code_source_id.as_deref())
101+
.map(ToOwned::to_owned);
102+
97103
let debug_option = input
98104
.debug_option
99105
.as_ref()
100106
.map(|d| PageRunDebugOptionInput {
101107
return_chat_completion_request: d.return_chat_completion_request,
102108
return_query_request: d.return_query_request,
103109
});
110+
104111
self.page_run(
105112
policy,
106113
author_id,
107114
None,
108-
None,
115+
code_source_id.as_deref(),
109116
None,
110117
Some(&thread_messages),
111118
debug_option.as_ref(),
@@ -119,11 +126,17 @@ impl PageService for PageServiceImpl {
119126
author_id: &ID,
120127
input: &CreatePageRunInput,
121128
) -> Result<PageRunStream> {
129+
let code_source_id = if let Some(code_query) = input.code_query.as_ref() {
130+
get_source_id(self.context.clone(), policy, code_query).await
131+
} else {
132+
None
133+
};
134+
122135
self.page_run(
123136
policy,
124137
author_id,
125138
Some(&input.title_prompt),
126-
input.code_query.as_ref(),
139+
code_source_id.as_deref(),
127140
input.doc_query.as_ref(),
128141
None,
129142
input.debug_option.as_ref(),
@@ -215,7 +228,7 @@ impl PageService for PageServiceImpl {
215228
Some(new_section_prompt),
216229
&existing_page_sections,
217230
&page_title,
218-
code_source_id,
231+
code_source_id.as_deref(),
219232
doc_query.as_ref(),
220233
None,
221234
db,
@@ -356,26 +369,14 @@ impl PageServiceImpl {
356369
policy: &AccessPolicy,
357370
author_id: &ID,
358371
title_prompt: Option<&str>,
359-
code_query: Option<&CodeQueryInput>,
372+
code_source_id: Option<&str>,
360373
doc_query: Option<&DocQueryInput>,
361374
thread_messages: Option<&[Message]>,
362375
debug_option: Option<&PageRunDebugOptionInput>,
363376
) -> Result<PageRunStream> {
364-
let code_source_id = if let Some(code_query) = code_query {
365-
get_source_id(self.context.clone(), policy, code_query).await
366-
} else {
367-
// use the first message source id for page
368-
thread_messages.and_then(|messages| {
369-
messages
370-
.iter()
371-
.find_map(|m| m.code_source_id.as_deref())
372-
.map(ToOwned::to_owned)
373-
})
374-
};
375-
376377
let page_id = self
377378
.db
378-
.create_page(author_id.as_rowid()?, code_source_id.clone())
379+
.create_page(author_id.as_rowid()?, code_source_id)
379380
.await?
380381
.as_id();
381382

@@ -397,6 +398,17 @@ impl PageServiceImpl {
397398
)
398399
.await?;
399400

401+
let code_source_id = code_source_id.map(ToOwned::to_owned);
402+
let doc_query = if let Some(doc_query) = doc_query {
403+
Some(doc_query.to_owned())
404+
} else {
405+
code_source_id.as_ref().map(|code_source_id| DocQueryInput {
406+
content: title_prompt.unwrap_or_else(|| &page_title).to_owned(),
407+
search_public: false,
408+
source_ids: Some(vec![code_source_id.clone()]),
409+
})
410+
};
411+
400412
let db = self.db.clone();
401413
let policy = policy.clone();
402414
let chat = self.chat.clone();
@@ -405,7 +417,6 @@ impl PageServiceImpl {
405417
let retrieval = self.retrieval.clone();
406418
let config = self.config.clone();
407419
let auth = self.auth.clone();
408-
let doc_query = doc_query.map(ToOwned::to_owned);
409420
let page_rowid = page_id.as_rowid()?;
410421
let debug_option = debug_option.map(|x| PageSectionRunDebugOptionInput {
411422
return_chat_completion_request: x.return_chat_completion_request,
@@ -496,7 +507,7 @@ impl PageServiceImpl {
496507
None,
497508
&existed_sections,
498509
&page_title,
499-
code_source_id.clone(),
510+
code_source_id.as_deref(),
500511
doc_query.as_ref(),
501512
thread_messages.as_deref(),
502513
db.clone(),
@@ -719,7 +730,7 @@ async fn generate_section_with_attachments(
719730
section_prompt: Option<String>,
720731
existing_sections: &[PageSection],
721732
page_title: &str,
722-
code_source_id: Option<String>,
733+
code_source_id: Option<&str>,
723734
doc_query: Option<&DocQueryInput>,
724735
thread_messages: Option<&[Message]>,
725736
db: DbConn,
@@ -735,6 +746,7 @@ async fn generate_section_with_attachments(
735746
let page_title = page_title.to_string();
736747
let thread_messages = thread_messages.map(ToOwned::to_owned);
737748
let context_info_helper = context.read(Some(&policy)).await?.helper();
749+
let code_source_id = code_source_id.map(ToOwned::to_owned);
738750
let doc_query = doc_query.map(ToOwned::to_owned);
739751
let debug_chat_request = debug
740752
.map(|d| d.return_chat_completion_request)
@@ -781,31 +793,29 @@ async fn generate_section_with_attachments(
781793
&config.code_search_params,
782794
None,
783795
).await?;
796+
let debug_data = if debug_query_request {
797+
Some(AttachmentCodeQueryDebugData {
798+
source_id: source_id.clone(),
799+
query: query_content,
800+
})
801+
} else {
802+
None
803+
};
784804

785805
attachment.code = hits.iter().map(|x| x.doc.clone().into()).collect::<Vec<_>>();
786806

807+
let hits = hits.into_iter().map(|x| x.into()).collect::<Vec<_>>();
787808
if !hits.is_empty() {
788-
let hits = hits.into_iter().map(|x| x.into()).collect::<Vec<_>>();
789809
db.update_page_section_code_attachments(section_id, &attachment.code.iter().map(|c| c.into()).collect::<Vec<_>>()).await?;
790-
791-
let debug_data = if debug_query_request {
792-
Some(AttachmentCodeQueryDebugData {
793-
source_id: source_id.clone(),
794-
query: query_content,
795-
})
796-
} else {
797-
None
798-
};
799-
800-
yield Ok(SectionRunItem::PageSectionAttachmentCode(
801-
PageSectionAttachmentCode {
802-
id: section_id.as_id(),
803-
codes: hits,
804-
805-
debug_data,
806-
}
807-
));
808810
}
811+
yield Ok(SectionRunItem::PageSectionAttachmentCode(
812+
PageSectionAttachmentCode {
813+
id: section_id.as_id(),
814+
codes: hits,
815+
816+
debug_data,
817+
}
818+
));
809819
}
810820

811821
if let Some(doc_query) = doc_query {
@@ -820,39 +830,39 @@ async fn generate_section_with_attachments(
820830
true
821831
}
822832
}).collect::<Vec<_>>();
823-
824-
if !hits.is_empty() {
825-
let hits = futures::future::join_all(hits.into_iter().map(|x| {
826-
let score = x.score;
827-
let doc = x.doc.clone();
828-
let auth = auth.clone();
829-
async move {
830-
AttachmentDocHit {
831-
score: score as f64,
832-
doc: attachment_doc_from_search(auth, doc).await,
833-
}
833+
let debug_data = if debug_query_request {
834+
Some(AttachmentDocQueryDebugData {
835+
source_ids: doc_query.source_ids.clone().unwrap_or_default(),
836+
query: doc_query.content.clone(),
837+
})
838+
} else {
839+
None
840+
};
841+
842+
let hits = futures::future::join_all(hits.into_iter().map(|x| {
843+
let score = x.score;
844+
let doc = x.doc.clone();
845+
let auth = auth.clone();
846+
async move {
847+
AttachmentDocHit {
848+
score: score as f64,
849+
doc: attachment_doc_from_search(auth, doc).await,
834850
}
835-
})).await;
851+
}
852+
})).await;
853+
if !hits.is_empty() {
836854
attachment.doc = hits.clone().into_iter().map(|x| x.doc).collect::<Vec<_>>();
837855
db.update_page_section_doc_attachments(section_id, &attachment.doc.iter().map(|c| c.into()).collect::<Vec<_>>()).await?;
838-
839-
let debug_data = if debug_query_request {
840-
Some(AttachmentDocQueryDebugData {
841-
source_ids: doc_query.source_ids.clone().unwrap_or_default(),
842-
query: doc_query.content.clone(),
843-
})
844-
} else {
845-
None
846-
};
847-
yield Ok(SectionRunItem::PageSectionAttachmentDoc(
848-
PageSectionAttachmentDoc {
849-
id: section_id.as_id(),
850-
doc: hits,
851-
852-
debug_data,
853-
}
854-
));
855856
}
857+
858+
yield Ok(SectionRunItem::PageSectionAttachmentDoc(
859+
PageSectionAttachmentDoc {
860+
id: section_id.as_id(),
861+
doc: hits,
862+
863+
debug_data,
864+
}
865+
));
856866
}
857867

858868
// Generate section content

0 commit comments

Comments
 (0)