Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: sso login, demo mode & new mindmap support #644

Merged
merged 62 commits into from
Feb 2, 2025
Merged
Changes from 1 commit
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
b2767f9
fix: update .env.example
taprosoft Dec 24, 2024
0603a92
feat: add SSO login
taprosoft Dec 23, 2024
d6abb02
fix: update flowsetting
taprosoft Dec 23, 2024
2d4c847
fix: add requirement
taprosoft Dec 23, 2024
7ad3209
fix: refine UI
taprosoft Dec 24, 2024
a1dbc4e
fix: update group id-based operation
taprosoft Dec 24, 2024
de3cb6c
fix: improve citation logics
taprosoft Dec 24, 2024
9d9f083
fix: UI enhancement
taprosoft Dec 24, 2024
2215843
fix: user_id to string in models
taprosoft Dec 24, 2024
45a0afd
fix: improve chat suggestion UI and flow
taprosoft Dec 24, 2024
ae6144b
fix: improve group id handling
taprosoft Dec 24, 2024
b7f8931
fix: improve chat suggestion
taprosoft Dec 24, 2024
e075b08
fix: secure download for single file
taprosoft Dec 24, 2024
698b3dc
fix: file limiting in docstore
taprosoft Dec 25, 2024
aed2a08
fix: improve chat suggestion logics & language conform
taprosoft Dec 25, 2024
f0279eb
feat: add markmap and select text to highlight function
taprosoft Dec 30, 2024
6da40bc
fix: update Dockerfile
taprosoft Dec 30, 2024
d2c7f5d
fix: user id auto generate
taprosoft Dec 30, 2024
788fdbc
fix: default user id
taprosoft Dec 30, 2024
b575a9f
feat: add demo mode
taprosoft Dec 31, 2024
93ee71f
fix: update flowsetting
taprosoft Dec 31, 2024
a2a5b67
fix: revise default params for demo
taprosoft Dec 31, 2024
5ed2b78
feat: sso_app alternative
taprosoft Dec 31, 2024
fe42443
feat: sso login demo
taprosoft Dec 31, 2024
45f6b3a
feat: demo specific customization
taprosoft Dec 31, 2024
a002fde
feat: add login using API key
taprosoft Jan 2, 2025
ef9c219
fix: disable key-based login
taprosoft Jan 2, 2025
6ba6fba
fix: optimize duplicate upload
taprosoft Jan 2, 2025
4dfacc6
fix: gradio routing
taprosoft Jan 2, 2025
426d1ac
fix: disable arm build for demo
taprosoft Jan 2, 2025
563566f
fix: revise full-text search js logic
taprosoft Jan 2, 2025
f118e21
feat: add rate limit
taprosoft Jan 3, 2025
21e1ef9
fix: update Dockerfile with new launch script
taprosoft Jan 3, 2025
285e27d
fix: update Dockerfile
taprosoft Jan 3, 2025
e422964
fix: update Dockerignore
taprosoft Jan 3, 2025
5b8671b
fix: update ratelimit logic
taprosoft Jan 3, 2025
7a86d2b
fix: user_id in user management page
taprosoft Jan 3, 2025
ea37f0b
fix: rename conv logic
taprosoft Jan 3, 2025
d8dff11
feat: update demo hint
taprosoft Jan 3, 2025
8784c68
fix: minor fix
taprosoft Jan 3, 2025
33a45f1
fix: highlight on long PDF load
taprosoft Jan 4, 2025
0c44e05
feat: add HF paper list
taprosoft Jan 5, 2025
4f6aed2
fix: update HF papers load logic
taprosoft Jan 5, 2025
86dd5e5
feat: fly config
taprosoft Jan 6, 2025
8de8f8b
fix: update fly config
taprosoft Jan 6, 2025
f0ec683
fix: update paper list pull api
taprosoft Jan 7, 2025
5298bf0
fix: minor update root routing
taprosoft Jan 8, 2025
8cf65e4
fix: minor update root routing
taprosoft Jan 8, 2025
da5bdae
fix: simplify login flow & paper list UI
taprosoft Jan 16, 2025
9ee2f7d
feat: add paper recommendation
taprosoft Jan 17, 2025
c468bab
fix: update Dockerfile
taprosoft Jan 20, 2025
95aba5c
fix: update Dockerfile
taprosoft Jan 20, 2025
bff35d0
fix: update default model
taprosoft Jan 21, 2025
24bcf45
feat: add long context Ollama through LCOllama
taprosoft Jan 21, 2025
1faa94b
feat: espose Gradio share to env
taprosoft Jan 21, 2025
e681d13
fix: revert customized changes
taprosoft Jan 27, 2025
906c6fc
fix: list group at app load
taprosoft Feb 1, 2025
9a3c064
fix: relocate share conv button
taprosoft Feb 1, 2025
af6399b
fix: update launch script
taprosoft Feb 2, 2025
f7b0a22
fix: update Docker CI
taprosoft Feb 2, 2025
2246c00
feat: add Ollama model selection at first setup
taprosoft Feb 2, 2025
5f8aa37
docs: update README
taprosoft Feb 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: simplify login flow & paper list UI
taprosoft committed Jan 24, 2025
commit da5bdae906ae783c835dd0e813046bd6b2b0e3e9
136 changes: 66 additions & 70 deletions libs/ktem/ktem/pages/chat/__init__.py
Original file line number Diff line number Diff line change
@@ -271,76 +271,72 @@ def on_building_ui(self):
self.hint_page = HintPage(self._app)

with gr.Column(scale=6, elem_id="chat-area"):
self.chat_panel = ChatPanel(self._app)

if KH_DEMO_MODE:
self.paper_list = PaperListPage(self._app)

self.chat_panel = ChatPanel(self._app)

with gr.Row():
with gr.Accordion(
label="Chat settings",
elem_id="chat-settings-expand",
open=False,
):
with gr.Row(elem_id="quick-setting-labels"):
gr.HTML("Reasoning method")
gr.HTML("Model", visible=not KH_DEMO_MODE)
gr.HTML("Language")

with gr.Row():
reasoning_setting = (
self._app.default_settings.reasoning.settings["use"]
)
model_setting = (
self._app.default_settings.reasoning.options[
"simple"
].settings["llm"]
)
language_setting = (
self._app.default_settings.reasoning.settings["lang"]
)
citation_setting = (
self._app.default_settings.reasoning.options[
"simple"
].settings["highlight_citation"]
)
with gr.Accordion(
label="Chat settings",
elem_id="chat-settings-expand",
open=False,
visible=not KH_DEMO_MODE,
) as self.chat_settings:
with gr.Row(elem_id="quick-setting-labels"):
gr.HTML("Reasoning method")
gr.HTML("Model", visible=not KH_DEMO_MODE)
gr.HTML("Language")

with gr.Row():
reasoning_setting = (
self._app.default_settings.reasoning.settings["use"]
)
model_setting = self._app.default_settings.reasoning.options[
"simple"
].settings["llm"]
language_setting = (
self._app.default_settings.reasoning.settings["lang"]
)
citation_setting = self._app.default_settings.reasoning.options[
"simple"
].settings["highlight_citation"]

self.reasoning_type = gr.Dropdown(
choices=reasoning_setting.choices[:REASONING_LIMITS],
value=reasoning_setting.value,
container=False,
show_label=False,
)
self.model_type = gr.Dropdown(
choices=model_setting.choices,
value=model_setting.value,
container=False,
show_label=False,
visible=not KH_DEMO_MODE,
)
self.language = gr.Dropdown(
choices=language_setting.choices,
value=language_setting.value,
container=False,
show_label=False,
)
self.reasoning_type = gr.Dropdown(
choices=reasoning_setting.choices[:REASONING_LIMITS],
value=reasoning_setting.value,
container=False,
show_label=False,
)
self.model_type = gr.Dropdown(
choices=model_setting.choices,
value=model_setting.value,
container=False,
show_label=False,
visible=not KH_DEMO_MODE,
)
self.language = gr.Dropdown(
choices=language_setting.choices,
value=language_setting.value,
container=False,
show_label=False,
)

self.citation = gr.Dropdown(
choices=citation_setting.choices,
value=citation_setting.value,
container=False,
show_label=False,
interactive=True,
elem_id="citation-dropdown",
)
self.citation = gr.Dropdown(
choices=citation_setting.choices,
value=citation_setting.value,
container=False,
show_label=False,
interactive=True,
elem_id="citation-dropdown",
)

self.use_mindmap = gr.State(value=True)
self.use_mindmap_check = gr.Checkbox(
label="Mindmap (on)",
container=False,
elem_id="use-mindmap-checkbox",
value=True,
)
self.use_mindmap = gr.State(value=True)
self.use_mindmap_check = gr.Checkbox(
label="Mindmap (on)",
container=False,
elem_id="use-mindmap-checkbox",
value=True,
)

with gr.Column(
scale=INFO_PANEL_SCALES[False], elem_id="chat-info-panel"
@@ -523,8 +519,8 @@ def on_register_events(self):
]
+ self._indices_input,
).then(
lambda: gr.update(visible=False),
outputs=[self.paper_list.accordion],
lambda: (gr.update(visible=False), gr.update(visible=True)),
outputs=[self.paper_list.accordion, self.chat_settings],
).then(
fn=None,
inputs=None,
@@ -678,8 +674,8 @@ def on_register_events(self):

if KH_DEMO_MODE:
onConvSelect = onConvSelect.then(
lambda: gr.update(visible=False),
outputs=[self.paper_list.accordion],
lambda: (gr.update(visible=False), gr.update(visible=True)),
outputs=[self.paper_list.accordion, self.chat_settings],
)

onConvSelect = (
@@ -804,8 +800,8 @@ def raise_error_on_state(state):
outputs=[self.quick_urls],
show_progress="hidden",
).then(
lambda: gr.update(visible=False),
outputs=[self.paper_list.accordion],
lambda: (gr.update(visible=False), gr.update(visible=True)),
outputs=[self.paper_list.accordion, self.chat_settings],
).then(
fn=None,
inputs=None,
9 changes: 8 additions & 1 deletion libs/ktem/ktem/pages/chat/control.py
Original file line number Diff line number Diff line change
@@ -159,12 +159,19 @@ def on_building_ui(self):
with gr.Row():
self.btn_demo_login = gr.Button(
"Sign-in to create new chat",
link="/login-app/",
min_width=120,
size="sm",
scale=1,
variant="primary",
)
_js_redirect = """
() => {
url = '/login' + window.location.search;
window.open(url, '_blank');
}
"""
self.btn_demo_login.click(None, js=_js_redirect)

self.btn_demo_logout = gr.Button(
"Sign-out",
min_width=120,
63 changes: 0 additions & 63 deletions sso_app_demo.py
Original file line number Diff line number Diff line change
@@ -5,7 +5,6 @@
from decouple import config
from fastapi import FastAPI, Request
from fastapi.responses import FileResponse
from ktem.assets import KotaemonTheme
from starlette.config import Config
from starlette.middleware.sessions import SessionMiddleware
from starlette.responses import RedirectResponse
@@ -25,30 +24,6 @@
SECRET_KEY = config("SECRET_KEY", default="default-secret-key")


save_api_key_js = """
function(api_key) {
setStorage('google_api_key', api_key);
window.location.href = "/app";
}
"""

global_js = """
function () {
// store info in local storage
globalThis.setStorage = (key, value) => {
localStorage.setItem(key, value)
}
globalThis.getStorage = (key, value) => {
item = localStorage.getItem(key);
return item ? item : value;
}
globalThis.removeFromStorage = (key) => {
localStorage.removeItem(key)
}
}
"""


def add_session_middleware(app):
config_data = {
"GOOGLE_CLIENT_ID": GOOGLE_CLIENT_ID,
@@ -98,11 +73,6 @@ async def logout(request: Request):
async def login(request: Request):
root_url = gr.route_utils.get_root_url(request, "/login", None)
redirect_uri = f"{root_url}/auth"
# If your app is running on https, you should ensure that the
# `redirect_uri` is https, e.g. uncomment the following lines:
#
# from urllib.parse import urlparse, urlunparse
# redirect_uri = urlunparse(urlparse(str(redirect_uri))._replace(scheme='https'))
return await oauth.google.authorize_redirect(request, redirect_uri)


@@ -116,39 +86,6 @@ async def auth(request: Request):
return RedirectResponse(url="/")


with gr.Blocks(
theme=KotaemonTheme(),
css=gradio_app._css,
js=global_js,
) as login_demo:
with gr.Column(elem_id="login-row"):
gr.Markdown("<h1 style='text-align:center;'>Welcome to Kotaemon</h1>")
gr.Button(
"Login with Google",
link="/login",
variant="primary",
elem_id="google-login",
)
# with gr.Accordion(
# "Or use your own Gemini API key",
# elem_id="user-api-key-wrapper",
# open=False,
# ):
# api_key_input = gr.Textbox(
# placeholder="API Key",
# label="Enter your Gemini API key",
# )
# api_key_save_btn = gr.Button(
# "Save",
# )

# api_key_save_btn.click(
# fn=lambda _: True,
# inputs=[api_key_input],
# js=save_api_key_js,
# )

app = gr.mount_gradio_app(app, login_demo, path="/login-app")
app = gr.mount_gradio_app(
app,
main_demo,