mirror of
https://github.com/khoj-ai/khoj.git
synced 2024-11-28 01:45:07 +01:00
Add Github configuration page and success notifications
This commit is contained in:
parent
668135c763
commit
4722a2c16d
6 changed files with 168 additions and 7 deletions
|
@ -14,6 +14,9 @@
|
||||||
<button onclick="window.location.href='/config/content_type/ledger';">
|
<button onclick="window.location.href='/config/content_type/ledger';">
|
||||||
Ledger
|
Ledger
|
||||||
</button>
|
</button>
|
||||||
|
<button onclick="window.location.href='/config/content_type/github';">
|
||||||
|
GitHub
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<h2>Processors</h2>
|
<h2>Processors</h2>
|
||||||
<button onclick="window.location.href='/config/processor/conversation/';">
|
<button onclick="window.location.href='/config/processor/conversation/';">
|
||||||
|
|
99
src/khoj/interface/web/content_type_github_input.html
Normal file
99
src/khoj/interface/web/content_type_github_input.html
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
{% extends "base_data_integration.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<h2>Github</h2>
|
||||||
|
<form id="config-form">
|
||||||
|
<div id="success" style="display: none;"></div>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pat-token">Personal Access Token</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" id="pat-token" name="pat" value="{{ current_config['pat_token'] }}">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="repo-owner">Repository Owner</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" id="repo-owner" name="repo_owner" value="{{ current_config['repo_owner'] }}">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="repo-name">Repository Name</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" id="repo-name" name="repo_name" value="{{ current_config['repo_name'] }}">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="repo-branch">Repository Branch</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" id="repo-branch" name="repo_branch" value="{{ current_config['repo_branch'] }}">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h4>You probably don't need to edit these.</h4>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="compressed-jsonl">Compressed JSONL (Output)</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" id="compressed-jsonl" name="compressed-jsonl" value="{{ current_config['compressed_jsonl'] }}">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="embeddings-file">Embeddings File (Output)</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" id="embeddings-file" name="embeddings-file" value="{{ current_config['embeddings_file'] }}">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<button id="submit" type="submit">Submit</button>
|
||||||
|
</form>
|
||||||
|
<script>
|
||||||
|
submit.addEventListener("click", function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
var compressed_jsonl = document.getElementById("compressed-jsonl").value;
|
||||||
|
var embeddings_file = document.getElementById("embeddings-file").value;
|
||||||
|
var pat_token = document.getElementById("pat-token").value;
|
||||||
|
var repo_owner = document.getElementById("repo-owner").value;
|
||||||
|
var repo_name = document.getElementById("repo-name").value;
|
||||||
|
var repo_branch = document.getElementById("repo-branch").value;
|
||||||
|
|
||||||
|
fetch('/api/config/data/content_type/github', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
"pat_token": pat_token,
|
||||||
|
"repo_owner": repo_owner,
|
||||||
|
"repo_name": repo_name,
|
||||||
|
"repo_branch": repo_branch,
|
||||||
|
"compressed_jsonl": compressed_jsonl,
|
||||||
|
"embeddings_file": embeddings_file,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.then(response => response.json())
|
||||||
|
.then(data => {
|
||||||
|
if (data["status"] == "ok") {
|
||||||
|
document.getElementById("success").innerHTML = "✅ Successfully updated. Go to <a href='/config'>your settings</a> to regenerate your index.";
|
||||||
|
document.getElementById("success").style.display = "block";
|
||||||
|
} else {
|
||||||
|
document.getElementById("success").innerHTML = "⚠️ Failed to update settings.";
|
||||||
|
document.getElementById("success").style.display = "block";
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
|
@ -2,6 +2,7 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2>{{ content_type }}</h2>
|
<h2>{{ content_type }}</h2>
|
||||||
<form id="config-form">
|
<form id="config-form">
|
||||||
|
<div id="success" style="display: none;" ></div>
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
|
@ -136,7 +137,13 @@
|
||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
console.log('Success:', data);
|
if (data["status"] == "ok") {
|
||||||
|
document.getElementById("success").innerHTML = "✅ Successfully updated. Go to <a href='/config'>your settings</a> to regenerate your index.";
|
||||||
|
document.getElementById("success").style.display = "block";
|
||||||
|
} else {
|
||||||
|
document.getElementById("success").innerHTML = "⚠️ Failed to update settings.";
|
||||||
|
document.getElementById("success").style.display = "block";
|
||||||
|
}
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2>Conversation</h2>
|
<h2>Conversation</h2>
|
||||||
<form id="config-form">
|
<form id="config-form">
|
||||||
|
<div id="success" style="display: none;" ></div>
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
|
@ -65,7 +66,13 @@
|
||||||
})
|
})
|
||||||
.then(response => response.json())
|
.then(response => response.json())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
console.log('Success:', data);
|
if (data["status"] == "ok") {
|
||||||
|
document.getElementById("success").innerHTML = "✅ Successfully updated. Go to <a href='/config'>your settings</a> to regenerate your index.";
|
||||||
|
document.getElementById("success").style.display = "block";
|
||||||
|
} else {
|
||||||
|
document.getElementById("success").innerHTML = "⚠️ Failed to update settings.";
|
||||||
|
document.getElementById("success").style.display = "block";
|
||||||
|
}
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -15,7 +15,13 @@ from khoj.processor.conversation.gpt import converse, extract_questions
|
||||||
from khoj.processor.conversation.utils import message_to_log, message_to_prompt
|
from khoj.processor.conversation.utils import message_to_log, message_to_prompt
|
||||||
from khoj.search_type import image_search, text_search
|
from khoj.search_type import image_search, text_search
|
||||||
from khoj.utils.helpers import log_telemetry, timer
|
from khoj.utils.helpers import log_telemetry, timer
|
||||||
from khoj.utils.rawconfig import FullConfig, SearchResponse, TextContentConfig, ConversationProcessorConfig
|
from khoj.utils.rawconfig import (
|
||||||
|
FullConfig,
|
||||||
|
SearchResponse,
|
||||||
|
TextContentConfig,
|
||||||
|
ConversationProcessorConfig,
|
||||||
|
GithubContentConfig,
|
||||||
|
)
|
||||||
from khoj.utils.state import SearchType
|
from khoj.utils.state import SearchType
|
||||||
from khoj.utils import state, constants
|
from khoj.utils import state, constants
|
||||||
from khoj.utils.yaml import save_config_to_file_updated_state
|
from khoj.utils.yaml import save_config_to_file_updated_state
|
||||||
|
@ -66,16 +72,34 @@ async def set_config_data(updated_config: FullConfig):
|
||||||
return state.config
|
return state.config
|
||||||
|
|
||||||
|
|
||||||
@api.post("/config/data/content_type/{content_type}")
|
@api.post("/config/data/content_type/github", status_code=200)
|
||||||
|
async def set_content_config_github_data(updated_config: GithubContentConfig):
|
||||||
|
state.config.content_type.github = updated_config
|
||||||
|
try:
|
||||||
|
save_config_to_file_updated_state()
|
||||||
|
return {"status": "ok"}
|
||||||
|
except Exception as e:
|
||||||
|
return {"status": "error", "message": str(e)}
|
||||||
|
|
||||||
|
|
||||||
|
@api.post("/config/data/content_type/{content_type}", status_code=200)
|
||||||
async def set_content_config_data(content_type: str, updated_config: TextContentConfig):
|
async def set_content_config_data(content_type: str, updated_config: TextContentConfig):
|
||||||
state.config.content_type[content_type] = updated_config
|
state.config.content_type[content_type] = updated_config
|
||||||
|
try:
|
||||||
save_config_to_file_updated_state()
|
save_config_to_file_updated_state()
|
||||||
|
return {"status": "ok"}
|
||||||
|
except Exception as e:
|
||||||
|
return {"status": "error", "message": str(e)}
|
||||||
|
|
||||||
|
|
||||||
@api.post("/config/data/processor/conversation")
|
@api.post("/config/data/processor/conversation", status_code=200)
|
||||||
async def set_processor_conversation_config_data(updated_config: ConversationProcessorConfig):
|
async def set_processor_conversation_config_data(updated_config: ConversationProcessorConfig):
|
||||||
state.config.processor.conversation = updated_config
|
state.config.processor.conversation = updated_config
|
||||||
|
try:
|
||||||
save_config_to_file_updated_state()
|
save_config_to_file_updated_state()
|
||||||
|
return {"status": "ok"}
|
||||||
|
except Exception as e:
|
||||||
|
return {"status": "error", "message": str(e)}
|
||||||
|
|
||||||
|
|
||||||
@api.get("/search", response_model=List[SearchResponse])
|
@api.get("/search", response_model=List[SearchResponse])
|
||||||
|
|
|
@ -30,6 +30,27 @@ def config_page(request: Request):
|
||||||
return templates.TemplateResponse("config.html", context={"request": request})
|
return templates.TemplateResponse("config.html", context={"request": request})
|
||||||
|
|
||||||
|
|
||||||
|
@web_client.get("/config/content_type/github", response_class=HTMLResponse)
|
||||||
|
def github_config_page(request: Request):
|
||||||
|
default_copy = constants.default_config.copy()
|
||||||
|
default_github = default_copy["content-type"]["github"] # type: ignore
|
||||||
|
|
||||||
|
default_config = TextContentConfig(
|
||||||
|
compressed_jsonl=default_github["compressed-jsonl"],
|
||||||
|
embeddings_file=default_github["embeddings-file"],
|
||||||
|
)
|
||||||
|
|
||||||
|
current_config = (
|
||||||
|
state.config.content_type.github if state.config.content_type.github is not None else default_config
|
||||||
|
)
|
||||||
|
|
||||||
|
current_config = json.loads(current_config.json())
|
||||||
|
|
||||||
|
return templates.TemplateResponse(
|
||||||
|
"content_type_github_input.html", context={"request": request, "current_config": current_config}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@web_client.get("/config/content_type/{content_type}", response_class=HTMLResponse)
|
@web_client.get("/config/content_type/{content_type}", response_class=HTMLResponse)
|
||||||
def content_config_page(request: Request, content_type: str):
|
def content_config_page(request: Request, content_type: str):
|
||||||
if content_type not in VALID_CONTENT_TYPES:
|
if content_type not in VALID_CONTENT_TYPES:
|
||||||
|
|
Loading…
Reference in a new issue