refactor: remove unused files

improve-workflow
Meng Zhang 2023-06-12 06:46:35 -07:00
parent 19053d6923
commit 795c34e9c4
28 changed files with 0 additions and 29277 deletions

View File

@ -1,37 +0,0 @@
import streamlit as st
from utils.service_info import ServiceInfo
from utils.streamlit import set_page_config
SERVICES = [
ServiceInfo(label="server", health_url="http://localhost:8081"),
ServiceInfo(label="triton", health_url="http://localhost:8002/metrics"),
ServiceInfo(label="vector", health_url="http://localhost:8686/health"),
ServiceInfo(label="dagu", health_url="http://localhost:8083"),
]
def make_badge_markdown(x: ServiceInfo):
return f"![{x.label}]({x.badge_url})"
set_page_config(page_title="Home")
badges = " ".join(map(make_badge_markdown, SERVICES))
st.markdown(
"""
## Tabby [![github star](https://img.shields.io/github/stars/TabbyML/tabby?style=social)](http://github.com/TabbyML/tabby)
{badges}
---
**Congrats, your server is live!**
### Clients
* [Vim](https://github.com/TabbyML/tabby/tree/main/clients/vim)
* [VSCode](https://marketplace.visualstudio.com/items?itemName=TabbyML.vscode-tabby)
""".replace(
"{badges}", badges
)
)

View File

@ -1,48 +0,0 @@
import os
import streamlit.components.v1 as components
_RELEASE = __name__ != "__main__"
# Declare a Streamlit component. `declare_component` returns a function
if not _RELEASE:
_editor_func = components.declare_component(
# We give the component a simple, descriptive name ("my_component"
# does not fit this bill, so please choose something better for your
# own component :)
"streamlit-monaco",
# Pass `url` here to tell Streamlit that the component will be served
# by the local dev server that you run via `npm run start`.
# (This is useful while your component is in development.)
url="http://localhost:3001",
)
else:
# When we're distributing a production version of the component, we'll
# replace the `url` param with `path`, and point it to to the component's
# build directory:
parent_dir = os.path.dirname(os.path.abspath(__file__))
build_dir = os.path.join(parent_dir, "frontend/build")
_editor_func = components.declare_component("streamlit-monaco", path=build_dir)
# Create a wrapper function for the component. This is an optional
# best practice - we could simply expose the component function returned by
# `declare_component` and call it done. The wrapper allows us to customize
# our component's API: we can pre-process its input args, post-process its
# output value, and add a docstring for users.
def st_monaco(key, tabby_server_url=None, code=None, height=400):
_editor_func(tabby_server_url=tabby_server_url, code=code, height=height, key=key)
# Add some test code to play with the component while it's in development.
# During development, we can run this just as we would any other Streamlit
# app: `$ streamlit run my_component/__init__.py`
if not _RELEASE:
import streamlit as st
code = st.text_input("code")
set_code = st.button("Set code")
if set_code:
st_monaco(code=code, key="1")
else:
st_monaco(key="1")

View File

@ -1,6 +0,0 @@
# Run the component's dev server on :3001
# (The Streamlit dev server already runs on :3000)
PORT=3001
# Don't automatically open the web browser on `npm run start`.
BROWSER=none

View File

@ -1 +0,0 @@
node_modules

View File

@ -1,5 +0,0 @@
{
"endOfLine": "lf",
"semi": false,
"trailingComma": "es5"
}

View File

@ -1,9 +0,0 @@
{
"files": {
"main.js": "./static/js/main.c928cca6.js",
"index.html": "./index.html"
},
"entrypoints": [
"static/js/main.c928cca6.js"
]
}

File diff suppressed because it is too large Load Diff

View File

@ -1 +0,0 @@
<!doctype html><html lang="en"><head><title>Streamlit Component</title><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Streamlit Component"/><link rel="stylesheet" href="bootstrap.min.css"/><script defer="defer" src="./static/js/main.c928cca6.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>

File diff suppressed because one or more lines are too long

View File

@ -1,82 +0,0 @@
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
/**
* @license
* Copyright 2018-2021 Streamlit Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @license React
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react-jsx-runtime.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/**
* @license React
* scheduler.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.13.1
* react-is.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
/** @license React v16.14.0
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

View File

@ -1,16 +0,0 @@
module.exports = {
webpack: {
configure: {
module: {
rules: [
{
test: /\.m?js$/,
resolve: {
fullySpecified: false,
},
},
],
},
},
},
}

View File

@ -1,38 +0,0 @@
{
"name": "streamlit-monaco",
"version": "1.0.3",
"private": true,
"dependencies": {
"@monaco-editor/react": "^4.4.6",
"axios": "^1.3.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "^5.0.1",
"streamlit-component-lib-react-hooks": "^1.0.3"
},
"devDependencies": {
"@craco/craco": "^7.1.0"
},
"scripts": {
"start": "craco start",
"build": "GENERATE_SOURCEMAP=false craco build",
"test": "craco test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"homepage": "."
}

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Streamlit Component</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Streamlit Component" />
<link rel="stylesheet" href="bootstrap.min.css" />
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>

View File

@ -1,172 +0,0 @@
import axios from "axios"
import { useRenderData } from "streamlit-component-lib-react-hooks"
import React, { useRef, useEffect } from "react"
import Editor, { useMonaco } from "@monaco-editor/react"
let TabbyServerURL = "http://localhost:5000"
export default function MonacoEditor() {
const renderData = useRenderData()
if (renderData.args.tabby_server_url) {
TabbyServerURL = renderData.args.tabby_server_url
} else {
TabbyServerURL = `${window.location.protocol}//${window.location.host}`
}
const monaco = useMonaco()
useEffect(() => {
if (!monaco) return
monaco.languages.registerInlineCompletionsProvider(
{ pattern: "**" },
new CompletionProvider(monaco)
)
monaco.editor.registerCommand(
"acceptTabbyCompletion",
(accessor, id, index) => {
logAction(id, index, "select")
}
)
}, [monaco])
const editorRef = useRef(null)
useEffect(() => {
if (renderData.args.code && editorRef.current) {
editorRef.current.getModel().setValue(renderData.args.code)
}
}, [renderData.args.code, editorRef])
return (
<div style={{ height: renderData.args.height }}>
<Editor
theme="vs-dark"
defaultLanguage="python"
onMount={(editor) => (editorRef.current = editor)}
/>
</div>
)
}
class CompletionProvider {
constructor(monaco: Monaco) {
this.monaco = monaco
this.latestTimestamp = 0
}
async provideInlineCompletions(document, position, context, token) {
const prompt = this.getPrompt(document, position)
const emptyResponse = Promise.resolve({ items: [] })
if (this.isNil(prompt)) {
console.debug("Prompt is empty, skipping")
return emptyResponse
}
const currentTimestamp = Date.now()
this.latestTimestamp = currentTimestamp
await this.sleep(500)
if (this.pendingRequest) await this.pendingRequest
if (currentTimestamp < this.latestTimestamp) {
return emptyResponse
}
let response
try {
response = await this.callTabbyApi(currentTimestamp, prompt)
} catch (err) {
console.error("error", err)
return emptyResponse
}
const hasSuffixParen = this.hasSuffixParen(document, position)
const replaceRange = hasSuffixParen
? new this.monaco.Range(
position.lineNumber,
position.column,
position.lineNumber,
position.column + 1
)
: new this.monaco.Range(
position.lineNumber,
position.column,
position.lineNumber,
position.column
)
const items = this.toInlineCompletions(response.data, replaceRange)
return Promise.resolve({ data: response.data, items })
}
handleItemDidShow(completions, item) {
logAction(completions.data.id, item.choice.index, "view")
}
freeInlineCompletions() {}
getPrompt(document, position) {
const firstLine = Math.max(position.lineNumber - 120, 0)
const range = new this.monaco.Range(
firstLine,
0,
position.lineNumber,
position.column
)
return document.getValueInRange(range)
}
isNil(value) {
return value === undefined || value === null || value.length === 0
}
sleep(milliseconds) {
return new Promise((r) => setTimeout(r, milliseconds))
}
async callTabbyApi(timestamp, prompt) {
const request = (this.pendingRequest = axios.post(
`${TabbyServerURL}/v1/completions`,
{
language: "python",
prompt,
}
))
const response = await request
this.pendingRequest = null
return response
}
toInlineCompletions(value, range) {
return (
value.choices.map((choice) => ({
range,
text: choice.text,
choice,
command: {
id: "acceptTabbyCompletion",
arguments: [value.id, choice.index],
},
})) || []
)
}
hasSuffixParen(document, position) {
const suffix = document.getValueInRange(
new this.monaco.Range(
position.lineNumber,
position.column,
position.lineNumber,
position.column + 1
)
)
return ")]}".indexOf(suffix) > -1
}
}
function logAction(completion_id, choice_index, type) {
axios.post(`${TabbyServerURL}/v1/events`, {
type,
completion_id,
choice_index,
})
}

View File

@ -1,15 +0,0 @@
import React from "react"
import ReactDOM from "react-dom/client"
import { StreamlitProvider } from "streamlit-component-lib-react-hooks"
import Monaco from "./Monaco"
const rootElement = document.getElementById("root")
const root = ReactDOM.createRoot(rootElement)
root.render(
<React.StrictMode>
<StreamlitProvider>
<Monaco />
</StreamlitProvider>
</React.StrictMode>
)

File diff suppressed because it is too large Load Diff

View File

@ -1,38 +0,0 @@
import streamlit as st
from components import monaco
from utils.streamlit import set_page_config
set_page_config(page_title="Editor")
SNIPPETS = {
"Clear": "# Write some code ...",
"Fibonacci": "def fib(n):",
"Parse JSON": """def parse_json_lines(filename: str) -> List[Any]:
output = []
with open(filename, "r", encoding="utf-8") as f:
""",
"Data ORM": """import birdchirp
from birdchirp.model.chirp import chirp
from birdchirp.db.mysql import MysqlDb
class User:
def __init__(self, user_id):
self.user_id = user_id
self.db = MysqlDb()
def get_avatar""",
}
def code_presets():
code = ""
cols = st.columns(len(SNIPPETS))
for col, (k, v) in zip(cols, SNIPPETS.items()):
with col:
if st.button(k):
code = v
return code
monaco.st_monaco(key="default", code=code_presets(), height=600)

View File

@ -1,64 +0,0 @@
import os
import duckdb
import streamlit as st
from utils.streamlit import set_page_config
set_page_config(page_title="Metrics")
def query_data():
filepath = os.environ.get("DB_FILE", "/data/logs/duckdb/duck.db")
if not os.path.isfile(filepath):
return []
conn = duckdb.connect(filepath)
df = conn.sql(
"""
SELECT
date_trunc('day', to_timestamp(CAST(created AS int64))) AS Date,
SUM(IF(view, 1, 0)) as "Views",
SUM(IF("select", 1, 0)) as "Acceptances"
FROM completion_events
GROUP BY 1;
"""
).df()
conn.close()
return df
df = query_data()
def plot_summary():
sum_views = int(sum(df.Views))
sum_acceptances = int(sum(df.Acceptances))
ratio = (sum_acceptances / sum_views) * 100
col1, col2, col3 = st.columns(3)
with col1:
st.metric("Views", sum_views)
with col2:
st.metric("Acceptances", sum_acceptances)
with col3:
st.metric("Accept Rate", f"{round(ratio)} %")
def plot_charts():
st.markdown("### Completion Events")
st.line_chart(df, x="Date")
st.markdown("### Accept Rate")
df["Acceptance Rate"] = df["Acceptances"] / df["Views"]
st.line_chart(df, x="Date", y="Acceptance Rate")
if len(df) > 0:
plot_summary()
st.write("---")
plot_charts()
else:
st.markdown("No data available")

View File

@ -1,72 +0,0 @@
import os
from pathlib import Path
import pandas as pd
import streamlit as st
import toml
from datasets import load_from_disk
from git import Repo
from utils.streamlit import set_page_config
set_page_config(page_title="Projects")
dataset_dir = os.environ.get("DATASET_DIR", None)
git_repositories_dir = os.environ.get("GIT_REPOSITORIES_DIR", None)
config_file = os.environ.get("CONFIG_FILE", None)
config = toml.load(config_file)
projects = config.get("projects", {})
def count_by_language(dataset):
key = "language"
df = (
pd.DataFrame(dataset[key], columns=[key])
.groupby([key])
.size()
.to_frame("# Files")
)
return df
def dataset_info():
if not Path(dataset_dir).is_dir():
st.write("*n/a*")
return
dataset = load_from_disk(dataset_dir)
col1, col2 = st.columns(2)
with col1:
st.metric("Total files", len(dataset))
with col2:
st.bar_chart(count_by_language(dataset))
df = pd.DataFrame(dataset)
del df["id"]
st.dataframe(df, use_container_width=True, height=600)
def project_list():
if len(projects) <= 0:
st.write("Your project list is empty")
st.write(f"Edit `{config_file}` to add projects")
return
for k, v in projects.items():
st.subheader(k)
st.write(f'Git: {v["git_url"]}')
git_repository = Path(git_repositories_dir, k)
if not git_repository.is_dir():
st.write(f"Status: *Before Initialization*")
continue
repo = Repo(git_repository)
sha = repo.active_branch.commit.hexsha
st.write(f"Status: `{sha}`")
project_list()
st.write("---")
dataset_info()

View File

@ -1,26 +0,0 @@
from dataclasses import dataclass
import requests
from requests.exceptions import ConnectionError
@dataclass
class ServiceInfo:
label: str
health_url: str
@property
def is_health(self) -> bool:
try:
return requests.get(self.health_url).status_code == 200
except ConnectionError:
return False
@property
def badge_url(self) -> str:
is_health = self.is_health
label = self.label.replace("-", "--")
message = "live" if is_health else "down"
color = "green" if is_health else "red"
return f"https://img.shields.io/badge/{label}-{message}-{color}"

View File

@ -1,16 +0,0 @@
import os
import streamlit as st
hide_streamlit_menu = os.environ.get("STREAMLIT_HIDE_MENU", "True") == "True"
def set_page_config(page_title, **kwargs):
st.set_page_config(
page_title=f"Tabby Admin - {page_title}", layout="wide", **kwargs
)
if hide_streamlit_menu:
hide_streamlit_style = (
"<style>#MainMenu {visibility: hidden;}footer {visibility: hidden;}</style>"
)
st.markdown(hide_streamlit_style, unsafe_allow_html=True)

View File

@ -1,8 +0,0 @@
{
http_port 5000
}
:5000 {
reverse_proxy localhost:8081
reverse_proxy /_admin* localhost:8082
}

View File

@ -1,32 +0,0 @@
[api]
enabled = true
address = "0.0.0.0:8686"
[sources.tabby_server_logs]
type = "file"
include = ["/data/logs/tabby-server/events.*.log"]
[transforms.process_tabby_server_events]
type = "remap"
inputs = [ "tabby_server_logs" ]
source = """
record = parse_json!(.message).record
id = {
"process_id": record.process.id,
"thread_id": record.thread.id,
"timestamp": record.time.timestamp
}
. = {
"id": id,
"data": parse_json!(record.message)
}
"""
[sinks.write_tabby_server_events]
type = "file"
inputs = [ "process_tabby_server_events" ]
encoding = { codec = "json" }
framing = { method = "newline_delimited" }
path = "/data/logs/events/tabby-server/%Y-%m-%d.json"

View File

@ -1,3 +0,0 @@
### Experimental feature flags ###
### Released feature flags ###

View File

@ -1,94 +0,0 @@
#!/bin/bash
set -e
# import flags
SCRIPT_DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
source "$SCRIPT_DIR/flags.sh"
# INPUT ENVIRONMENT ARGS
export DATA_DIR="${DATA_DIR:-/data}"
export MODEL_NAME="${MODEL_NAME:-TabbyML/J-350M}"
export MODEL_BACKEND="${MODEL_BACKEND:-python}"
# Shared environment variables
export LOGS_DIR="$DATA_DIR/logs"
export DB_FILE="$LOGS_DIR/duckdb/duck.db"
export CONFIG_FILE="$DATA_DIR/config/tabby.toml"
# projects
export GIT_REPOSITORIES_DIR="$DATA_DIR/repositories"
export DATASET_DIR="$DATA_DIR/dataset"
# dagu
export DAGU_DAGS="tabby/tasks"
init() {
if [ ! -f $CONFIG_FILE ]; then
mkdir -p $(dirname $CONFIG_FILE)
touch $CONFIG_FILE
fi
# Disable safe directory check
git config --global --add safe.directory '*'
python -m tabby.tools.download_models --repo_id=$MODEL_NAME
}
program:triton() {
if [[ "$MODEL_BACKEND" == "triton" ]]
then
cat <<EOF
[program:triton]
command=./tabby/scripts/triton.sh
EOF
fi
}
program:caddy() {
if [[ "$CADDY_WATCH_CONFIG" == "true" ]]
then
local CADDY_ARGS=" --watch"
fi
cat <<EOF
[program:caddy]
command=caddy run --config tabby/config/Caddyfile $CADDY_ARGS
EOF
}
supervisor() {
# Create logs dir if not exists.
mkdir -p ${LOGS_DIR}
supervisord -n -c <(cat <<EOF
[supervisord]
logfile = ${LOGS_DIR}/supervisord.log
loglevel = debug
[program:server]
command=uvicorn tabby.server:app --port 8081
[program:admin]
command=streamlit run tabby/admin/Home.py --server.port 8082 --server.baseUrlPath=/_admin --theme.base=dark
[program:vector]
command=vector --config-toml tabby/config/vector.toml
[program:dagu_scheduler]
command=dagu scheduler
[program:dagu_server]
command=dagu server --host 0.0.0.0 --port 8083
$(program:triton)
$(program:caddy)
EOF
)
}
init
supervisor

View File

@ -1,27 +0,0 @@
#!/bin/bash
set -e
MODEL_REPLICA=${MODEL_REPLICA:-1}
if [ -d "$MODEL_NAME" ]; then
MODEL_DIR="$MODEL_NAME"
else
# Get model dir.
MODEL_DIR=$(python3 <<EOF
from huggingface_hub import snapshot_download
print(snapshot_download(repo_id='$MODEL_NAME', allow_patterns='triton/**/*', local_files_only=True))
EOF
)
fi
# Set model dir in triton config.
sed -i 's@${MODEL_DIR}@'$MODEL_DIR'@g' $MODEL_DIR/triton/fastertransformer/config.pbtxt
# SET model replica in triton config.
sed -i "s/count: [[:digit:]]\+/count: $MODEL_REPLICA/g" $MODEL_DIR/triton/fastertransformer/config.pbtxt
# Start triton server.
mpirun -n 1 \
/opt/tritonserver/bin/tritonserver \
--model-repository=$MODEL_DIR/triton