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';">
|
||||
Ledger
|
||||
</button>
|
||||
<button onclick="window.location.href='/config/content_type/github';">
|
||||
GitHub
|
||||
</button>
|
||||
</div>
|
||||
<h2>Processors</h2>
|
||||
<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 %}
|
||||
<h2>{{ content_type }}</h2>
|
||||
<form id="config-form">
|
||||
<div id="success" style="display: none;" ></div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
|
@ -136,7 +137,13 @@
|
|||
})
|
||||
.then(response => response.json())
|
||||
.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>
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
{% block content %}
|
||||
<h2>Conversation</h2>
|
||||
<form id="config-form">
|
||||
<div id="success" style="display: none;" ></div>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
|
@ -65,7 +66,13 @@
|
|||
})
|
||||
.then(response => response.json())
|
||||
.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>
|
||||
|
|
|
@ -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.search_type import image_search, text_search
|
||||
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 import state, constants
|
||||
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
|
||||
|
||||
|
||||
@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):
|
||||
state.config.content_type[content_type] = 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/processor/conversation")
|
||||
@api.post("/config/data/processor/conversation", status_code=200)
|
||||
async def set_processor_conversation_config_data(updated_config: ConversationProcessorConfig):
|
||||
state.config.processor.conversation = updated_config
|
||||
try:
|
||||
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])
|
||||
|
|
|
@ -30,6 +30,27 @@ def config_page(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)
|
||||
def content_config_page(request: Request, content_type: str):
|
||||
if content_type not in VALID_CONTENT_TYPES:
|
||||
|
|
Loading…
Reference in a new issue