From 6650b15c643c2904b5a394ef15f1d3688f135350 Mon Sep 17 00:00:00 2001 From: "Tuan Anh Nguyen Dang (Tadashi_Cin)" Date: Thu, 5 Dec 2024 19:55:59 +0700 Subject: [PATCH] feat: add citation style quick setting (#554) bump:patch --- .../kotaemon/llms/chats/langchain_based.py | 9 ++++++++ libs/ktem/ktem/assets/css/main.css | 21 +++++++++++++++---- libs/ktem/ktem/assets/js/main.js | 2 ++ libs/ktem/ktem/pages/chat/__init__.py | 5 ++--- .../prompt_optimization/decompose_question.py | 16 +++++++++++--- libs/ktem/ktem/reasoning/simple.py | 6 +++--- 6 files changed, 46 insertions(+), 13 deletions(-) diff --git a/libs/kotaemon/kotaemon/llms/chats/langchain_based.py b/libs/kotaemon/kotaemon/llms/chats/langchain_based.py index e28116f..bb98332 100644 --- a/libs/kotaemon/kotaemon/llms/chats/langchain_based.py +++ b/libs/kotaemon/kotaemon/llms/chats/langchain_based.py @@ -296,6 +296,15 @@ class LCGeminiChat(LCChatMixin, ChatLLM): # type: ignore required=True, ) + def _get_tool_call_kwargs(self): + return { + "tool_config": { + "function_calling_config": { + "mode": "ANY", + } + } + } + def __init__( self, api_key: str | None = None, diff --git a/libs/ktem/ktem/assets/css/main.css b/libs/ktem/ktem/assets/css/main.css index 6c2e87c..ed3f221 100644 --- a/libs/ktem/ktem/assets/css/main.css +++ b/libs/ktem/ktem/assets/css/main.css @@ -208,7 +208,12 @@ mark { position: absolute; top: 6px; right: -10px; - z-index: 10; + z-index: 1; +} + +#quick-setting-labels { + margin-top: 5px; + margin-bottom: -10px; } #use-mindmap-checkbox { @@ -218,6 +223,14 @@ mark { right: 25px; } +#citation-dropdown { + width: min(25%, 100px); + position: absolute; + top: 2px; + left: 120px; + height: 35px; +} + #quick-url textarea { resize: none; background: transparent; @@ -262,7 +275,7 @@ pdfjs-viewer-element { .modal { display: none; position: relative; - z-index: 1; + z-index: 2; left: 0; top: 0; width: 100%; @@ -351,11 +364,11 @@ pdfjs-viewer-element { /* Bot animation */ .message.bot { - animation: fadein 1.5s ease-in-out forwards; + animation: fadein 1.0s ease-in-out forwards; } details.evidence { - animation: fadein 0.5s ease-in-out forwards; + animation: fadein 0.3s ease-in-out forwards; } @keyframes fadein { diff --git a/libs/ktem/ktem/assets/js/main.js b/libs/ktem/ktem/assets/js/main.js index ec6ea53..beab6d9 100644 --- a/libs/ktem/ktem/assets/js/main.js +++ b/libs/ktem/ktem/assets/js/main.js @@ -41,8 +41,10 @@ function run() { // move use mind-map checkbox let mindmap_checkbox = document.getElementById("use-mindmap-checkbox"); + let citation_dropdown = document.getElementById("citation-dropdown"); let chat_setting_panel = document.getElementById("chat-settings-expand"); chat_setting_panel.insertBefore(mindmap_checkbox, chat_setting_panel.childNodes[2]); + chat_setting_panel.insertBefore(citation_dropdown, mindmap_checkbox); // create slider toggle const is_public_checkbox = document.getElementById("is-public-checkbox"); diff --git a/libs/ktem/ktem/pages/chat/__init__.py b/libs/ktem/ktem/pages/chat/__init__.py index 8e3dbc0..326a000 100644 --- a/libs/ktem/ktem/pages/chat/__init__.py +++ b/libs/ktem/ktem/pages/chat/__init__.py @@ -185,12 +185,10 @@ class ChatPage(BasePage): elem_id="chat-settings-expand", open=False, ): - # a quick switch for reasoning type option - with gr.Row(): + with gr.Row(elem_id="quick-setting-labels"): gr.HTML("Reasoning method") gr.HTML("Model") gr.HTML("Language") - gr.HTML("Citation") with gr.Row(): reasoning_type_values = [ @@ -236,6 +234,7 @@ class ChatPage(BasePage): container=False, show_label=False, interactive=True, + elem_id="citation-dropdown", ) self.use_mindmap = gr.State(value=DEFAULT_SETTING) diff --git a/libs/ktem/ktem/reasoning/prompt_optimization/decompose_question.py b/libs/ktem/ktem/reasoning/prompt_optimization/decompose_question.py index 8108b3c..04ec6a8 100644 --- a/libs/ktem/ktem/reasoning/prompt_optimization/decompose_question.py +++ b/libs/ktem/ktem/reasoning/prompt_optimization/decompose_question.py @@ -69,11 +69,21 @@ class DecomposeQuestionPipeline(RewriteQuestionPipeline): sub_queries = [] if tool_calls: for tool_call in tool_calls: + if "function" in tool_call: + # openai and cohere format + function_output = tool_call["function"]["arguments"] + else: + # anthropic format + function_output = tool_call["args"] + + if isinstance(function_output, str): + sub_query = SubQuery.parse_raw(function_output).sub_query + else: + sub_query = SubQuery.parse_obj(function_output).sub_query + sub_queries.append( Document( - content=SubQuery.parse_raw( - tool_call["function"]["arguments"] - ).sub_query + content=sub_query, ) ) diff --git a/libs/ktem/ktem/reasoning/simple.py b/libs/ktem/ktem/reasoning/simple.py index ab7ebf2..f90b39c 100644 --- a/libs/ktem/ktem/reasoning/simple.py +++ b/libs/ktem/ktem/reasoning/simple.py @@ -411,9 +411,9 @@ class FullQAPipeline(BaseReasoning): "value": "highlight", "component": "radio", "choices": [ - ("highlight (long answer)", "highlight"), - ("inline (precise answer)", "inline"), - ("off", "off"), + ("highlight (verbose)", "highlight"), + ("inline (concise)", "inline"), + ("no citation", "off"), ], }, "create_mindmap": {