Spaces:
Running
Running
github-actions[bot]
commited on
Commit
·
a044259
0
Parent(s):
Commit
Browse files- Dockerfile +39 -0
- README.md +100 -0
- __init__.py +0 -0
- citation.js +48 -0
- deploy_to_hf.sh +45 -0
- docs_index.py +188 -0
- eval_viewer.py +149 -0
- frame_listener.js +24 -0
- gen/bm25_retriever/corpus.jsonl +0 -0
- gen/bm25_retriever/corpus.mmindex.json +1 -0
- gen/bm25_retriever/data.csc.index.npy +0 -0
- gen/bm25_retriever/indices.csc.index.npy +0 -0
- gen/bm25_retriever/indptr.csc.index.npy +0 -0
- gen/bm25_retriever/params.index.json +11 -0
- gen/bm25_retriever/retriever.json +4 -0
- gen/bm25_retriever/vocab.index.json +1 -0
- gen/default__vector_store.json +0 -0
- gen/docstore.json +0 -0
- gen/graph_store.json +1 -0
- gen/image__vector_store.json +1 -0
- gen/index_store.json +1 -0
- main.py +643 -0
- pyproject.toml +31 -0
- recorder.py +130 -0
- requirements.txt +374 -0
- scrollable.js +21 -0
- uv.lock +0 -0
Dockerfile
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.10.15-bullseye
|
| 2 |
+
|
| 3 |
+
RUN apt-get update && \
|
| 4 |
+
apt-get install -y \
|
| 5 |
+
# General dependencies
|
| 6 |
+
locales \
|
| 7 |
+
locales-all && \
|
| 8 |
+
# Clean local repository of package files since they won't be needed anymore.
|
| 9 |
+
# Make sure this line is called after all apt-get update/install commands have
|
| 10 |
+
# run.
|
| 11 |
+
apt-get clean && \
|
| 12 |
+
# Also delete the index files which we also don't need anymore.
|
| 13 |
+
rm -rf /var/lib/apt/lists/*
|
| 14 |
+
|
| 15 |
+
ENV LC_ALL en_US.UTF-8
|
| 16 |
+
ENV LANG en_US.UTF-8
|
| 17 |
+
ENV LANGUAGE en_US.UTF-8
|
| 18 |
+
|
| 19 |
+
# Create and activate virtual environment
|
| 20 |
+
RUN python -m venv /opt/venv
|
| 21 |
+
ENV PATH="/opt/venv/bin:$PATH"
|
| 22 |
+
|
| 23 |
+
# Install dependencies
|
| 24 |
+
COPY requirements.txt .
|
| 25 |
+
RUN pip install -r requirements.txt
|
| 26 |
+
|
| 27 |
+
# Create non-root user and give write access to /opt/venv
|
| 28 |
+
RUN groupadd -g 900 mesop && \
|
| 29 |
+
useradd -u 900 -s /bin/bash -g mesop mesop && \
|
| 30 |
+
chown -R mesop:mesop /opt/venv && chmod -R 777 /opt/venv
|
| 31 |
+
|
| 32 |
+
USER mesop
|
| 33 |
+
|
| 34 |
+
# Add app code here
|
| 35 |
+
COPY . /srv/mesop-app
|
| 36 |
+
WORKDIR /srv/mesop-app
|
| 37 |
+
|
| 38 |
+
# Run Mesop through gunicorn. Should be available at localhost:8080
|
| 39 |
+
CMD ["gunicorn", "--bind", "0.0.0.0:8080", "main:me"]
|
README.md
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: Mesop Doc Bot
|
| 3 |
+
emoji: 👓
|
| 4 |
+
colorFrom: red
|
| 5 |
+
colorTo: yellow
|
| 6 |
+
sdk: docker
|
| 7 |
+
pinned: false
|
| 8 |
+
license: apache-2.0
|
| 9 |
+
app_port: 8080
|
| 10 |
+
---
|
| 11 |
+
|
| 12 |
+
# Docbot
|
| 13 |
+
|
| 14 |
+
Answers questions grounded based on docs
|
| 15 |
+
|
| 16 |
+
## Setup
|
| 17 |
+
|
| 18 |
+
From workspace root:
|
| 19 |
+
|
| 20 |
+
```sh
|
| 21 |
+
rm -rf ai/docbot/venv && \
|
| 22 |
+
virtualenv --python python3 ai/docbot/venv && \
|
| 23 |
+
source ai/docbot/venv/bin/activate && \
|
| 24 |
+
pip install -r ai/docbot/requirements.txt
|
| 25 |
+
```
|
| 26 |
+
|
| 27 |
+
## How to use
|
| 28 |
+
|
| 29 |
+
**Run app**:
|
| 30 |
+
|
| 31 |
+
```sh
|
| 32 |
+
mesop chat.py
|
| 33 |
+
```
|
| 34 |
+
|
| 35 |
+
**Create index**:
|
| 36 |
+
|
| 37 |
+
```sh
|
| 38 |
+
python docs_index.py --build-index
|
| 39 |
+
```
|
| 40 |
+
|
| 41 |
+
**Load (or create, if it doesn't exist yet) index**:
|
| 42 |
+
|
| 43 |
+
```sh
|
| 44 |
+
python docs_index.py
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
## Evals
|
| 48 |
+
|
| 49 |
+
**Record eval results**
|
| 50 |
+
|
| 51 |
+
```py
|
| 52 |
+
$ python recorder.py --out-dir gen/evals/one_source
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
**View eval results**
|
| 56 |
+
|
| 57 |
+
```py
|
| 58 |
+
$ EVAL_DIR=gen/evals/no_source_1 EVAL_DIR_2=gen/evals/one_source mesop eval_viewer.py
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
## Roadmap
|
| 62 |
+
|
| 63 |
+
TODOs:
|
| 64 |
+
|
| 65 |
+
- Respect dark themes into frame
|
| 66 |
+
- Auto-focus into prompt (via post message) _DONE_
|
| 67 |
+
- Support ESC to close iframe _DONE_
|
| 68 |
+
- Do evals against suggested questions _DONE_
|
| 69 |
+
- Prompt engineer
|
| 70 |
+
- Do not show code _skip_
|
| 71 |
+
- File new issue if asking for feature that doesn't exist _skip_
|
| 72 |
+
|
| 73 |
+
MAYBE:
|
| 74 |
+
|
| 75 |
+
- Ask Mesop to consolidate sources from the same page
|
| 76 |
+
|
| 77 |
+
### UX
|
| 78 |
+
|
| 79 |
+
- Scroll to specific part of text? DONE
|
| 80 |
+
- Show code (syntax highlighting)
|
| 81 |
+
- Don't show sources which are not cited? done
|
| 82 |
+
- Renumber?? done
|
| 83 |
+
- File GitHub issue if the response isn't good DONE
|
| 84 |
+
|
| 85 |
+
### APIs
|
| 86 |
+
|
| 87 |
+
- Use Google embedding API? done
|
| 88 |
+
|
| 89 |
+
### Indexing
|
| 90 |
+
|
| 91 |
+
- Index GitHub issues / discussions?
|
| 92 |
+
- https://docs.llamaindex.ai/en/stable/examples/usecases/github_issue_analysis/
|
| 93 |
+
- DONE filter out blog posts? (the --- mark settings)
|
| 94 |
+
- DONE filter out internal docs, e.g. bazel commands
|
| 95 |
+
- DONE set title for all pages OR retrieve title by using mkdocs.yml??
|
| 96 |
+
- Maybe load in the code snippets? Depends on whether that's a goal.
|
| 97 |
+
|
| 98 |
+
### Docs TODOs:
|
| 99 |
+
|
| 100 |
+
- Why doesn't mesop have this new feature? attribute is missing
|
__init__.py
ADDED
|
File without changes
|
citation.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import {
|
| 2 |
+
LitElement,
|
| 3 |
+
html,
|
| 4 |
+
css,
|
| 5 |
+
} from 'https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js';
|
| 6 |
+
|
| 7 |
+
class CitationComponent extends LitElement {
|
| 8 |
+
static styles = css`
|
| 9 |
+
a {
|
| 10 |
+
display: block;
|
| 11 |
+
text-decoration: none;
|
| 12 |
+
color: var(--sys-on-surface);
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
.container {
|
| 16 |
+
background: var(--sys-surface-container-high);
|
| 17 |
+
border-radius: 12px;
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
.container:hover {
|
| 21 |
+
background: var(--sys-surface-container-highest);
|
| 22 |
+
}
|
| 23 |
+
`;
|
| 24 |
+
|
| 25 |
+
static properties = {
|
| 26 |
+
url: {type: String},
|
| 27 |
+
};
|
| 28 |
+
|
| 29 |
+
constructor() {
|
| 30 |
+
super();
|
| 31 |
+
this.url = '';
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
render() {
|
| 35 |
+
return html`
|
| 36 |
+
<a class="container" href="${this.url}" target="_blank">
|
| 37 |
+
<slot></slot>
|
| 38 |
+
</a>
|
| 39 |
+
`;
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
_onClick() {
|
| 43 |
+
window.open(this.url, '_blank');
|
| 44 |
+
console.log('open url', this.url);
|
| 45 |
+
}
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
customElements.define('citation-component', CitationComponent);
|
deploy_to_hf.sh
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
|
| 3 |
+
set -e
|
| 4 |
+
|
| 5 |
+
error_handler() {
|
| 6 |
+
echo "Error: An error occurred. Exiting script."
|
| 7 |
+
exit 1
|
| 8 |
+
}
|
| 9 |
+
|
| 10 |
+
# Set up error handling
|
| 11 |
+
trap error_handler ERR
|
| 12 |
+
|
| 13 |
+
if [ $# -eq 0 ]; then
|
| 14 |
+
echo "Error: Please provide a destination path as an argument."
|
| 15 |
+
exit 1
|
| 16 |
+
fi
|
| 17 |
+
|
| 18 |
+
DEST_PATH="$1"
|
| 19 |
+
|
| 20 |
+
if [ ! -d "$DEST_PATH" ]; then
|
| 21 |
+
echo "Destination path does not exist. Creating it now."
|
| 22 |
+
mkdir -p "$DEST_PATH"
|
| 23 |
+
fi
|
| 24 |
+
|
| 25 |
+
# Build the docs index
|
| 26 |
+
cd ai/docbot && python docs_index.py --build-index && cd -
|
| 27 |
+
|
| 28 |
+
# Get the path of this script which is the demo dir.
|
| 29 |
+
DEMO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
| 30 |
+
cp -R "$DEMO_DIR/" "$DEST_PATH"
|
| 31 |
+
echo "Demo files have been copied to $DEST_PATH"
|
| 32 |
+
cd "$DEST_PATH/docbot"
|
| 33 |
+
echo "Changed directory to $DEST_PATH"
|
| 34 |
+
|
| 35 |
+
git init
|
| 36 |
+
git branch -m main
|
| 37 |
+
git config user.name github-actions[bot]
|
| 38 |
+
git config user.email github-actions[bot]@users.noreply.github.com
|
| 39 |
+
echo "Configured git user"
|
| 40 |
+
git add .
|
| 41 |
+
git commit -m "Commit"
|
| 42 |
+
git remote add hf https://wwwillchen:$HF_TOKEN@huggingface.co/spaces/wwwillchen/mesop-docs-bot || true
|
| 43 |
+
git push --force --set-upstream hf main
|
| 44 |
+
|
| 45 |
+
echo "Pushed to: https://huggingface.co/spaces/wwwillchen/mesop-docs-bot. Check the logs to see that it's deployed correctly."
|
docs_index.py
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
|
| 4 |
+
import nest_asyncio
|
| 5 |
+
import Stemmer
|
| 6 |
+
from llama_index.core import (
|
| 7 |
+
PromptTemplate,
|
| 8 |
+
Settings,
|
| 9 |
+
SimpleDirectoryReader,
|
| 10 |
+
StorageContext,
|
| 11 |
+
VectorStoreIndex,
|
| 12 |
+
load_index_from_storage,
|
| 13 |
+
)
|
| 14 |
+
from llama_index.core.node_parser import SentenceSplitter
|
| 15 |
+
from llama_index.core.query_engine import CitationQueryEngine
|
| 16 |
+
from llama_index.core.retrievers import QueryFusionRetriever
|
| 17 |
+
from llama_index.core.schema import NodeWithScore as NodeWithScore
|
| 18 |
+
from llama_index.embeddings.google import GeminiEmbedding
|
| 19 |
+
from llama_index.llms.gemini import Gemini
|
| 20 |
+
from llama_index.retrievers.bm25 import BM25Retriever
|
| 21 |
+
|
| 22 |
+
import mesop as me
|
| 23 |
+
|
| 24 |
+
nest_asyncio.apply()
|
| 25 |
+
|
| 26 |
+
CITATION_QA_TEMPLATE = PromptTemplate(
|
| 27 |
+
"Please provide an answer based solely on the provided sources. "
|
| 28 |
+
"When referencing information from a source, "
|
| 29 |
+
"cite the appropriate source(s) using their corresponding numbers. "
|
| 30 |
+
"Every answer should include at least one source citation. "
|
| 31 |
+
"Only cite a source when you are explicitly referencing it. "
|
| 32 |
+
"If you are sure NONE of the sources are helpful, then say: 'Sorry, I didn't find any docs about this.'"
|
| 33 |
+
"If you are not sure if any of the sources are helpful, then say: 'You might find this helpful', where 'this' is the source's title.'"
|
| 34 |
+
"DO NOT say Source 1, Source 2, etc. Only reference sources like this: [1], [2], etc."
|
| 35 |
+
"I want you to pick just ONE source to answer the question."
|
| 36 |
+
"For example:\n"
|
| 37 |
+
"Source 1:\n"
|
| 38 |
+
"The sky is red in the evening and blue in the morning.\n"
|
| 39 |
+
"Source 2:\n"
|
| 40 |
+
"Water is wet when the sky is red.\n"
|
| 41 |
+
"Query: When is water wet?\n"
|
| 42 |
+
"Answer: Water will be wet when the sky is red [2], "
|
| 43 |
+
"which occurs in the evening [1].\n"
|
| 44 |
+
"Now it's your turn. Below are several numbered sources of information:"
|
| 45 |
+
"\n------\n"
|
| 46 |
+
"{context_str}"
|
| 47 |
+
"\n------\n"
|
| 48 |
+
"Query: {query_str}\n"
|
| 49 |
+
"Answer: "
|
| 50 |
+
)
|
| 51 |
+
|
| 52 |
+
os.environ["GOOGLE_API_KEY"] = os.environ["GEMINI_API_KEY"]
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
def get_meta(file_path: str) -> dict[str, str]:
|
| 56 |
+
with open(file_path) as f:
|
| 57 |
+
title = f.readline().strip()
|
| 58 |
+
if title.startswith("# "):
|
| 59 |
+
title = title[2:]
|
| 60 |
+
else:
|
| 61 |
+
title = (
|
| 62 |
+
file_path.split("/")[-1]
|
| 63 |
+
.replace(".md", "")
|
| 64 |
+
.replace("-", " ")
|
| 65 |
+
.capitalize()
|
| 66 |
+
)
|
| 67 |
+
|
| 68 |
+
file_path = file_path.replace(".md", "")
|
| 69 |
+
CONST = "../../docs/"
|
| 70 |
+
docs_index = file_path.index(CONST)
|
| 71 |
+
docs_path = file_path[docs_index + len(CONST) :]
|
| 72 |
+
|
| 73 |
+
url = "https://mesop-dev.github.io/mesop/" + docs_path
|
| 74 |
+
|
| 75 |
+
print(f"URL: {url}")
|
| 76 |
+
return {
|
| 77 |
+
"url": url,
|
| 78 |
+
"title": title,
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
|
| 82 |
+
embed_model = GeminiEmbedding(
|
| 83 |
+
model_name="models/text-embedding-004", api_key=os.environ["GOOGLE_API_KEY"]
|
| 84 |
+
)
|
| 85 |
+
Settings.embed_model = embed_model
|
| 86 |
+
|
| 87 |
+
PERSIST_DIR = "./gen"
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
def build_or_load_index():
|
| 91 |
+
if not os.path.exists(PERSIST_DIR) or "--build-index" in sys.argv:
|
| 92 |
+
print("Building index")
|
| 93 |
+
|
| 94 |
+
documents = SimpleDirectoryReader(
|
| 95 |
+
"../../docs/",
|
| 96 |
+
required_exts=[
|
| 97 |
+
".md",
|
| 98 |
+
],
|
| 99 |
+
exclude=[
|
| 100 |
+
"showcase.md",
|
| 101 |
+
"demo.md",
|
| 102 |
+
"blog",
|
| 103 |
+
"internal",
|
| 104 |
+
],
|
| 105 |
+
file_metadata=get_meta,
|
| 106 |
+
recursive=True,
|
| 107 |
+
).load_data()
|
| 108 |
+
for doc in documents:
|
| 109 |
+
doc.excluded_llm_metadata_keys = ["url"]
|
| 110 |
+
splitter = SentenceSplitter(chunk_size=512)
|
| 111 |
+
|
| 112 |
+
nodes = splitter.get_nodes_from_documents(documents)
|
| 113 |
+
bm25_retriever = BM25Retriever.from_defaults(
|
| 114 |
+
nodes=nodes,
|
| 115 |
+
similarity_top_k=5,
|
| 116 |
+
# Optional: We can pass in the stemmer and set the language for stopwords
|
| 117 |
+
# This is important for removing stopwords and stemming the query + text
|
| 118 |
+
# The default is english for both
|
| 119 |
+
stemmer=Stemmer.Stemmer("english"),
|
| 120 |
+
language="english",
|
| 121 |
+
)
|
| 122 |
+
bm25_retriever.persist(PERSIST_DIR + "/bm25_retriever")
|
| 123 |
+
|
| 124 |
+
index = VectorStoreIndex.from_documents(documents, embed_model=embed_model)
|
| 125 |
+
index.storage_context.persist(persist_dir=PERSIST_DIR)
|
| 126 |
+
return index, bm25_retriever
|
| 127 |
+
else:
|
| 128 |
+
print("Loading index")
|
| 129 |
+
bm25_retriever = BM25Retriever.from_persist_dir(
|
| 130 |
+
PERSIST_DIR + "/bm25_retriever"
|
| 131 |
+
)
|
| 132 |
+
storage_context = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
|
| 133 |
+
index = load_index_from_storage(storage_context)
|
| 134 |
+
return index, bm25_retriever
|
| 135 |
+
|
| 136 |
+
|
| 137 |
+
if me.runtime().is_hot_reload_in_progress:
|
| 138 |
+
print("Hot reload - skip building index!")
|
| 139 |
+
query_engine = me._query_engine
|
| 140 |
+
bm25_retriever = me._bm25_retriever
|
| 141 |
+
|
| 142 |
+
else:
|
| 143 |
+
index, bm25_retriever = build_or_load_index()
|
| 144 |
+
llm = Gemini(model="models/gemini-flash-latest")
|
| 145 |
+
retriever = QueryFusionRetriever(
|
| 146 |
+
[
|
| 147 |
+
index.as_retriever(similarity_top_k=5),
|
| 148 |
+
bm25_retriever,
|
| 149 |
+
],
|
| 150 |
+
llm=llm,
|
| 151 |
+
num_queries=1,
|
| 152 |
+
use_async=True,
|
| 153 |
+
similarity_top_k=5,
|
| 154 |
+
)
|
| 155 |
+
query_engine = CitationQueryEngine.from_args(
|
| 156 |
+
index,
|
| 157 |
+
retriever=retriever,
|
| 158 |
+
llm=llm,
|
| 159 |
+
citation_qa_template=CITATION_QA_TEMPLATE,
|
| 160 |
+
similarity_top_k=5,
|
| 161 |
+
embedding_model=embed_model,
|
| 162 |
+
streaming=True,
|
| 163 |
+
)
|
| 164 |
+
|
| 165 |
+
blocking_query_engine = CitationQueryEngine.from_args(
|
| 166 |
+
index,
|
| 167 |
+
retriever=retriever,
|
| 168 |
+
llm=llm,
|
| 169 |
+
citation_qa_template=CITATION_QA_TEMPLATE,
|
| 170 |
+
similarity_top_k=5,
|
| 171 |
+
embedding_model=embed_model,
|
| 172 |
+
streaming=False,
|
| 173 |
+
)
|
| 174 |
+
# TODO: replace with proper mechanism for persisting objects
|
| 175 |
+
# across hot reloads
|
| 176 |
+
me._query_engine = query_engine
|
| 177 |
+
me._bm25_retriever = bm25_retriever
|
| 178 |
+
|
| 179 |
+
|
| 180 |
+
NEWLINE = "\n"
|
| 181 |
+
|
| 182 |
+
|
| 183 |
+
def ask(query: str):
|
| 184 |
+
return query_engine.query(query)
|
| 185 |
+
|
| 186 |
+
|
| 187 |
+
def retrieve(query: str):
|
| 188 |
+
return bm25_retriever.retrieve(query)
|
eval_viewer.py
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import itertools
|
| 2 |
+
import os
|
| 3 |
+
import sys
|
| 4 |
+
import urllib.parse
|
| 5 |
+
from dataclasses import dataclass, field
|
| 6 |
+
|
| 7 |
+
import mesop as me
|
| 8 |
+
|
| 9 |
+
# Get the directory from the environment variable
|
| 10 |
+
EVAL_DIR = os.environ.get("EVAL_DIR")
|
| 11 |
+
|
| 12 |
+
if EVAL_DIR:
|
| 13 |
+
print(f"Directory set to: {EVAL_DIR}")
|
| 14 |
+
else:
|
| 15 |
+
print(
|
| 16 |
+
"No directory specified. Exiting! Set the EVAL_DIR environment variable."
|
| 17 |
+
)
|
| 18 |
+
sys.exit(1)
|
| 19 |
+
|
| 20 |
+
EVAL_DIR_2 = os.environ.get("EVAL_DIR_2")
|
| 21 |
+
|
| 22 |
+
if EVAL_DIR_2:
|
| 23 |
+
print(f"Eval directory 2 set to: {EVAL_DIR_2}")
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
@dataclass
|
| 27 |
+
class Item:
|
| 28 |
+
query: str = ""
|
| 29 |
+
input: str = ""
|
| 30 |
+
output: str = ""
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
@dataclass
|
| 34 |
+
class EvalGroup:
|
| 35 |
+
items: list[Item] = field(default_factory=list)
|
| 36 |
+
|
| 37 |
+
|
| 38 |
+
@me.stateclass
|
| 39 |
+
class State:
|
| 40 |
+
directories: list[str]
|
| 41 |
+
group_1: EvalGroup
|
| 42 |
+
group_2: EvalGroup
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def load_eval_dir(eval_dir: str):
|
| 46 |
+
# Read all directories from args.dir
|
| 47 |
+
directories = [
|
| 48 |
+
d for d in os.listdir(eval_dir) if os.path.isdir(os.path.join(eval_dir, d))
|
| 49 |
+
]
|
| 50 |
+
items: list[Item] = []
|
| 51 |
+
for dir in directories:
|
| 52 |
+
input_path = os.path.join(eval_dir, dir, "input.txt")
|
| 53 |
+
output_path = os.path.join(eval_dir, dir, "output.txt")
|
| 54 |
+
|
| 55 |
+
with open(input_path) as f:
|
| 56 |
+
input_content = f.read()
|
| 57 |
+
with open(output_path) as f:
|
| 58 |
+
output_content = f.read()
|
| 59 |
+
|
| 60 |
+
item = Item(
|
| 61 |
+
input=input_content,
|
| 62 |
+
output=output_content,
|
| 63 |
+
query=urllib.parse.unquote(dir),
|
| 64 |
+
)
|
| 65 |
+
items.append(item)
|
| 66 |
+
return items
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def on_load(e: me.LoadEvent):
|
| 70 |
+
state = me.state(State)
|
| 71 |
+
assert EVAL_DIR
|
| 72 |
+
state.group_1.items = load_eval_dir(EVAL_DIR)
|
| 73 |
+
if EVAL_DIR_2:
|
| 74 |
+
state.group_2.items = load_eval_dir(EVAL_DIR_2)
|
| 75 |
+
print("state.group_2.items", state.group_2.items)
|
| 76 |
+
|
| 77 |
+
# Store the directories in the state for later use
|
| 78 |
+
# me.state(State).directories = directories
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
@me.page(
|
| 82 |
+
on_load=on_load,
|
| 83 |
+
security_policy=me.SecurityPolicy(
|
| 84 |
+
allowed_script_srcs=[
|
| 85 |
+
"https://cdn.jsdelivr.net",
|
| 86 |
+
]
|
| 87 |
+
),
|
| 88 |
+
)
|
| 89 |
+
def index():
|
| 90 |
+
state = me.state(State)
|
| 91 |
+
with scrollable():
|
| 92 |
+
with me.box(
|
| 93 |
+
style=me.Style(
|
| 94 |
+
margin=me.Margin.symmetric(horizontal="auto", vertical=24),
|
| 95 |
+
# background="white",
|
| 96 |
+
padding=me.Padding.symmetric(horizontal=16),
|
| 97 |
+
)
|
| 98 |
+
):
|
| 99 |
+
me.text("Eval viewer", type="headline-3")
|
| 100 |
+
me.text(f"Group 1: {len(state.group_1.items)} items")
|
| 101 |
+
me.text(f"Group 2: {len(state.group_2.items)} items")
|
| 102 |
+
|
| 103 |
+
# Zip group_1 and group_2 items
|
| 104 |
+
zipped_items = list(
|
| 105 |
+
itertools.zip_longest(
|
| 106 |
+
state.group_1.items, state.group_2.items, fillvalue=None
|
| 107 |
+
)
|
| 108 |
+
)
|
| 109 |
+
with me.box(
|
| 110 |
+
style=me.Style(
|
| 111 |
+
display="grid",
|
| 112 |
+
grid_template_columns="160px 300px 1fr 300px 1fr"
|
| 113 |
+
if state.group_2.items
|
| 114 |
+
else "160px 1fr 1fr",
|
| 115 |
+
gap=16,
|
| 116 |
+
)
|
| 117 |
+
):
|
| 118 |
+
# Header
|
| 119 |
+
me.text("Query", style=me.Style(font_weight=500))
|
| 120 |
+
me.text("Input (1)", style=me.Style(font_weight=500))
|
| 121 |
+
me.text("Output (1)", style=me.Style(font_weight=500))
|
| 122 |
+
if state.group_2.items:
|
| 123 |
+
me.text("Input (2)", style=me.Style(font_weight=500))
|
| 124 |
+
me.text("Output (2)", style=me.Style(font_weight=500))
|
| 125 |
+
# Body
|
| 126 |
+
for item_1, item_2 in zipped_items:
|
| 127 |
+
if item_1:
|
| 128 |
+
me.text(item_1.query, style=me.Style(font_weight=500))
|
| 129 |
+
me.markdown(
|
| 130 |
+
item_1.input, style=me.Style(overflow_y="auto", max_height=400)
|
| 131 |
+
)
|
| 132 |
+
me.text(item_1.output)
|
| 133 |
+
|
| 134 |
+
if item_2:
|
| 135 |
+
me.markdown(
|
| 136 |
+
item_2.input, style=me.Style(overflow_y="auto", max_height=400)
|
| 137 |
+
)
|
| 138 |
+
me.text(item_2.output)
|
| 139 |
+
|
| 140 |
+
|
| 141 |
+
@me.web_component(path="./scrollable.js")
|
| 142 |
+
def scrollable(
|
| 143 |
+
*,
|
| 144 |
+
key: str | None = None,
|
| 145 |
+
):
|
| 146 |
+
return me.insert_web_component(
|
| 147 |
+
name="scrollable-component",
|
| 148 |
+
key=key,
|
| 149 |
+
)
|
frame_listener.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Listen for 'focus' message from the parent window
|
| 2 |
+
window.addEventListener('message', function (event) {
|
| 3 |
+
if (event.data === 'focus') {
|
| 4 |
+
// Find the textarea element
|
| 5 |
+
const textarea = document.querySelector('textarea');
|
| 6 |
+
console.log('focusing on textarea', textarea);
|
| 7 |
+
// If the textarea is found, focus on it
|
| 8 |
+
if (textarea) {
|
| 9 |
+
textarea.focus();
|
| 10 |
+
} else {
|
| 11 |
+
console.warn('Textarea not found for focus');
|
| 12 |
+
}
|
| 13 |
+
}
|
| 14 |
+
});
|
| 15 |
+
|
| 16 |
+
window.addEventListener('keydown', function (event) {
|
| 17 |
+
if (event.key === 'Escape') {
|
| 18 |
+
if (document.activeElement) {
|
| 19 |
+
document.activeElement.blur();
|
| 20 |
+
}
|
| 21 |
+
// Send a message to the parent window to close this iframe
|
| 22 |
+
window.parent.postMessage('closeDocbot', '*');
|
| 23 |
+
}
|
| 24 |
+
});
|
gen/bm25_retriever/corpus.jsonl
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
gen/bm25_retriever/corpus.mmindex.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
[0, 1458, 2833, 4188, 5580, 6906, 8205, 9686, 11068, 12431, 13999, 15367, 16714, 17934, 19236, 20471, 22878, 24507, 26058, 28184, 30194, 33572, 36486, 37986, 39471, 40953, 42418, 44129, 45501, 47145, 49547, 51007, 52519, 54023, 55430, 56659, 58025, 59680, 60903, 62275, 63498, 65003, 66443, 67784, 69104, 70495, 72006, 73285, 74717, 76542, 77978, 79705, 81240, 82584, 83917, 85277, 86601, 87872, 89416, 91005, 92302, 93737, 95007, 96455, 97720, 99707, 101635, 102990, 104599, 106332, 110817, 112868, 114374, 117415, 118959, 120369, 121851, 123486, 126141, 130040, 134190, 138342, 142357, 146522, 149451, 151091, 152510, 154113, 155674, 159233, 162297, 165993, 170040, 173044, 174590, 176286, 177690, 179288, 180854, 184597, 189035, 193281, 196518, 199165, 201250, 204290, 206073, 207462, 209383, 210812, 212168, 213524, 214807, 216386, 218046, 219842, 221464, 222927, 224558, 225908, 227458, 229409, 230930, 232879, 234600, 236817, 238615, 240696, 242401, 244319, 245806, 247636, 248979, 250275, 251552, 253344, 254689, 256355, 257732, 259028, 260305, 261637, 262919, 264178, 265485, 266788, 268157, 269520, 270872, 272367, 273658, 274947, 276399, 277730, 279019, 280276, 281638, 282955, 284453, 285789, 287083, 288351, 289780, 291118, 292515, 293987, 295367, 296839, 298196, 299506, 300801, 302113, 303409, 304686, 306265, 307631, 309133, 310733, 312027, 313295, 314623, 315912, 317180, 318470, 319766, 321043, 322461, 323725, 325484, 327060, 328628, 331088, 332365, 334477, 337171, 338597, 340452, 342994, 344380, 345676, 347085, 348397, 349686, 350954, 352257, 353579, 354883, 356193, 357482, 358750, 360155, 361500, 362919, 364356, 365729, 367105, 368436, 369732, 371115, 372475, 373783, 375245, 376608, 377918, 379213, 380610, 381955, 383438, 384799, 386102, 387449, 388787, 390083, 391360, 392770, 394122, 395451, 396860, 398205, 399526, 400844, 402133, 403401, 404851, 406168, 407598, 408913, 410223, 411518, 412919, 414236, 415706, 417049, 418345, 419622, 420902, 422162, 423912, 425292, 427037, 428559, 430025, 431289, 432920, 434296, 436316, 438143, 439768, 441515, 443164, 445424, 446933, 448470, 450009, 451555, 453642, 455151, 456537, 457871, 459247, 460751, 462437, 464156, 465563, 467611, 469724, 471541, 473638, 475071, 477110, 478613, 480647, 482052, 483617, 485154, 487819, 490300, 491964, 493356, 494807, 496267, 497626, 499029, 500825, 502345, 504030, 505394, 506940, 508562, 510076, 511439, 512757, 514112, 515511, 517177, 518836, 520264, 521604, 522978, 524420, 525820, 527371, 529009, 530401, 531820, 533547, 535027, 536533, 538008, 540580, 541875, 543490, 545591, 547710, 548990, 551588, 553756, 555043, 557722, 559101, 560582, 562933, 564426, 565895, 567176, 569394, 571263, 573033, 575018, 576365, 577671, 579116, 580744, 582189, 583435, 584883, 586383, 587988, 589857, 591091, 592718, 594828, 596730, 598953, 600557, 601931, 603458, 605132, 606537, 608007, 609305, 611110, 612874, 614536, 615945, 618083, 619693, 621120, 622676, 624135, 625829, 629362, 631225, 632730, 634091, 635630, 637253, 638772, 640171, 641914, 643519, 645258, 646673, 648607, 650345, 652476, 653982, 656110, 657807, 660136, 661423, 662841, 664285, 665870, 667352, 669243, 670819, 672428, 673779, 675445, 677119, 679960, 681454, 683076, 684895, 687106, 688778, 690537, 691976, 693331, 694793, 696615, 698407, 700233, 701999, 703440, 704712, 706357, 708173, 709906, 711536, 713107, 714474, 717320, 721298, 725385, 729690, 733485, 736372, 739749, 741015, 742816, 744236, 745806, 747546, 749057, 750409, 752136, 755110, 756937, 758858, 760836, 762294, 764057, 765402, 766779, 768643, 770148, 772509, 774819, 777134, 778485]
|
gen/bm25_retriever/data.csc.index.npy
ADDED
|
Binary file (46.6 kB). View file
|
|
|
gen/bm25_retriever/indices.csc.index.npy
ADDED
|
Binary file (46.6 kB). View file
|
|
|
gen/bm25_retriever/indptr.csc.index.npy
ADDED
|
Binary file (7.74 kB). View file
|
|
|
gen/bm25_retriever/params.index.json
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"k1": 1.5,
|
| 3 |
+
"b": 0.75,
|
| 4 |
+
"delta": 0.5,
|
| 5 |
+
"method": "lucene",
|
| 6 |
+
"idf_method": "lucene",
|
| 7 |
+
"dtype": "float32",
|
| 8 |
+
"int_dtype": "int32",
|
| 9 |
+
"num_docs": 462,
|
| 10 |
+
"version": "0.1.10"
|
| 11 |
+
}
|
gen/bm25_retriever/retriever.json
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"similarity_top_k": 5,
|
| 3 |
+
"verbose": false
|
| 4 |
+
}
|
gen/bm25_retriever/vocab.index.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"tend": 0, "date": 1, "pic": 2, "enabl": 3, "alt": 4, "debug": 5, "mel": 6, "concurr": 7, "content_upload": 8, "incompat": 9, "event": 10, "receiv": 11, "maco": 12, "display_messag": 13, "ask": 14, "subtre": 15, "mesopdeveloperexcept": 16, "queu": 17, "chunk": 18, "control": 19, "git": 20, "mechan": 21, "complic": 22, "execut": 23, "happen": 24, "low": 25, "buttontogglechangeev": 26, "anoth": 27, "contain": 28, "project": 29, "old": 30, "contact": 31, "param_nam": 32, "traffic": 33, "much": 34, "smaller": 35, "frontend": 36, "request": 37, "refus": 38, "stage": 39, "ipynb": 40, "prefix": 41, "media": 42, "differ": 43, "conform": 44, "effortless": 45, "anthrop": 46, "__user": 47, "rank": 48, "chromeo": 49, "shift": 50, "isol": 51, "inter": 52, "appl": 53, "when": 54, "header": 55, "purpos": 56, "1000": 57, "spinner": 58, "problem": 59, "posit": 60, "315": 61, "share": 62, "bi": 63, "even": 64, "480": 65, "problemat": 66, "accord": 67, "what": 68, "congress": 69, "50": 70, "pyproject": 71, "simplest": 72, "nav": 73, "omit": 74, "manner": 75, "syntax": 76, "status_cod": 77, "thalnerkar": 78, "rang": 79, "made": 80, "work": 81, "36": 82, "self": 83, "solut": 84, "unread": 85, "moder": 86, "wire": 87, "dark": 88, "gave": 89, "accumul": 90, "expansionpaneltoggleev": 91, "simplic": 92, "privileg": 93, "mutabl": 94, "split": 95, "platform": 96, "allows_ifram": 97, "disk": 98, "agnost": 99, "store": 100, "init": 101, "bob": 102, "somewher": 103, "occasion": 104, "bundl": 105, "huggingfac": 106, "debugg": 107, "default_factori": 108, "design": 109, "typescript": 110, "max": 111, "text_to_text": 112, "purpl": 113, "callsit": 114, "bring": 115, "__native__": 116, "safe": 117, "angular": 118, "7anchay": 119, "els": 120, "5678": 121, "download": 122, "app": 123, "either": 124, "8192": 125, "subject": 126, "tell": 127, "while": 128, "3px": 129, "viewer": 130, "aim": 131, "may": 132, "baseurl": 133, "around": 134, "send_prompt_pro": 135, "enum": 136, "sdk": 137, "polici": 138, "abl": 139, "lightweight": 140, "toggle_them": 141, "counter_compon": 142, "directori": 143, "address": 144, "multi": 145, "replica": 146, "automat": 147, "infrastructur": 148, "lot": 149, "confirm_model_picker_dialog": 150, "closur": 151, "bodi": 152, "z_index": 153, "font_siz": 154, "encourag": 155, "easier": 156, "50vh": 157, "must": 158, "is_open": 159, "firebase_auth": 160, "standard": 161, "logic": 162, "src": 163, "imper": 164, "templat": 165, "scalabl": 166, "file_cont": 167, "could": 168, "limit": 169, "flash": 170, "colorfrom": 171, "tool": 172, "zone": 173, "goodby": 174, "100": 175, "last": 176, "fix": 177, "behavior": 178, "within": 179, "inform": 180, "prod": 181, "text_to_imag": 182, "delight": 183, "attempt": 184, "here": 185, "collection_nam": 186, "random": 187, "sourc": 188, "add": 189, "style": 190, "bandwidth": 191, "deploy": 192, "interfac": 193, "mesop_static_fold": 194, "2rem": 195, "set_gemini_api_key": 196, "though": 197, "pip": 198, "optim": 199, "audio": 200, "switcher": 201, "belief": 202, "new_param": 203, "max_output_token": 204, "bucket": 205, "tune": 206, "mesop_concurrent_updates_en": 207, "extend": 208, "lab": 209, "id": 210, "grand": 211, "iter": 212, "trust": 213, "sidebar": 214, "on_load": 215, "component_": 216, "entrypoint": 217, "entri": 218, "codelab": 219, "claude_api_key": 220, "215px": 221, "ram": 222, "call": 223, "16gb": 224, "signinsuccessurl": 225, "progressbaranimationendev": 226, "remind": 227, "1804890091816644906": 228, "wght": 229, "server": 230, "xlr8harder": 231, "1798673386425786724": 232, "drawback": 233, "pad": 234, "inputenterev": 235, "mdash": 236, "query_param": 237, "warn": 238, "comprehens": 239, "embrac": 240, "take": 241, "ad": 242, "authent": 243, "value2": 244, "backend": 245, "stack": 246, "disabl": 247, "valid": 248, "20240229": 249, "local": 250, "auth": 251, "usual": 252, "develop": 253, "small": 254, "create_al": 255, "bottleneck": 256, "gap": 257, "a_web_compon": 258, "ll": 259, "privaci": 260, "allowed_connect_src": 261, "debugpi": 262, "info": 263, "callabl": 264, "pointer": 265, "string": 266, "further": 267, "css": 268, "librari": 269, "f0f0f0": 270, "webev": 271, "path": 272, "_first_": 273, "json": 274, "set_claude_api_key": 275, "model_picker_dialog": 276, "layout": 277, "network": 278, "panel": 279, "updat": 280, "probabl": 281, "about": 282, "uri": 283, "gemini_api_key": 284, "instal": 285, "int": 286, "_this": 287, "box_shadow": 288, "mesop_state_session_backend_file_base_dir": 289, "manag": 290, "tier": 291, "decod": 292, "leverag": 293, "common": 294, "assum": 295, "pattern": 296, "especi": 297, "longer": 298, "tutori": 299, "queri": 300, "viewport_s": 301, "xhr": 302, "card": 303, "deal": 304, "prod_bundl": 305, "ttl": 306, "ssh": 307, "violat": 308, "done": 309, "lifetim": 310, "yield": 311, "dozen": 312, "learn": 313, "500": 314, "abov": 315, "12": 316, "down": 317, "filter": 318, "associ": 319, "postgresql": 320, "claude_3_5_sonnet": 321, "net": 322, "factori": 323, "intend": 324, "autosc": 325, "mutat": 326, "replac": 327, "creat": 328, "resiz": 329, "repeat": 330, "overal": 331, "rich": 332, "familiar": 333, "known": 334, "email": 335, "40px": 336, "calendar": 337, "theme": 338, "render": 339, "reload": 340, "ts": 341, "input_valu": 342, "base64": 343, "namedslot": 344, "nest": 345, "await": 346, "make": 347, "streamlin": 348, "val": 349, "center": 350, "extern": 351, "workaround": 352, "chat_sess": 353, "24": 354, "locat": 355, "up": 356, "did": 357, "re": 358, "improv": 359, "3d3929": 360, "we": 361, "flavor": 362, "str": 363, "static": 364, "prioriti": 365, "releas": 366, "prompt": 367, "num": 368, "myapp": 369, "align_item": 370, "gcloud": 371, "lit": 372, "horizont": 373, "demo": 374, "fault": 375, "asyncio": 376, "ident": 377, "whi": 378, "switch": 379, "tab": 380, "security_polici": 381, "besid": 382, "sign": 383, "milk": 384, "principl": 385, "inadvert": 386, "finish": 387, "github": 388, "value1": 389, "file": 390, "curv": 391, "mean": 392, "apach": 393, "mediadevic": 394, "newer": 395, "introduc": 396, "straight": 397, "start_chat": 398, "empti": 399, "addit": 400, "cursor": 401, "paradigm": 402, "operating_system": 403, "end_of_messag": 404, "opendemogalleryinnewtab": 405, "proto": 406, "intern": 407, "setup": 408, "devic": 409, "although": 410, "playwright": 411, "choos": 412, "harshit": 413, "abil": 414, "broader": 415, "immut": 416, "pass": 417, "dom": 418, "advanc": 419, "sse": 420, "built": 421, "credenti": 422, "1800557173073691000": 423, "care": 424, "databas": 425, "help": 426, "workspacefold": 427, "feel": 428, "interact": 429, "starter_kit": 430, "en": 431, "ifram": 432, "grid": 433, "hint": 434, "justify_cont": 435, "ml": 436, "declar": 437, "box_siz": 438, "npx": 439, "step": 440, "starter": 441, "virtual": 442, "person": 443, "port": 444, "font_famili": 445, "sever": 446, "ui": 447, "test": 448, "11": 449, "sequenc": 450, "dialog_st": 451, "absolut": 452, "hot": 453, "permiss": 454, "proxi": 455, "red": 456, "on_input": 457, "accur": 458, "clean": 459, "flex_direct": 460, "safelist": 461, "clickjack": 462, "localroot": 463, "script": 464, "argument": 465, "page_2": 466, "float": 467, "uniqu": 468, "response_text": 469, "insert_web_compon": 470, "architectur": 471, "sorri": 472, "fetch": 473, "simpl": 474, "markdown": 475, "use": 476, "you": 477, "note": 478, "runtime_vers": 479, "crux": 480, "valu": 481, "localhost": 482, "39": 483, "home": 484, "pre": 485, "grant": 486, "protocol": 487, "lower": 488, "bottom": 489, "filenam": 490, "parti": 491, "param_to_delet": 492, "has": 493, "how": 494, "respons": 495, "statement": 496, "trace": 497, "now": 498, "rgba": 499, "thing": 500, "verbos": 501, "send": 502, "gemini": 503, "scienc": 504, "among": 505, "selectopenedchangeev": 506, "scratch": 507, "sort": 508, "good": 509, "version": 510, "680px": 511, "wrapper": 512, "secur": 513, "person_dict": 514, "plenti": 515, "googleapi": 516, "lock": 517, "generation_config": 518, "web": 519, "left": 520, "selectopt": 521, "kw_on": 522, "initial_valu": 523, "buffer": 524, "new": 525, "exist": 526, "scheme": 527, "set": 528, "includ": 529, "16": 530, "tradit": 531, "code": 532, "jpeg": 533, "found": 534, "box": 535, "messag": 536, "config": 537, "decrement": 538, "user_messag": 539, "verifi": 540, "slidetogglechangeev": 541, "compatibilti": 542, "trustworthi": 543, "slowli": 544, "app_port": 545, "find": 546, "_zr64fycojgbcdqbjpla": 547, "duochat": 548, "navigate_hom": 549, "progress_spinn": 550, "link": 551, "wrap": 552, "favicon": 553, "expiresat": 554, "name": 555, "medium": 556, "v1": 557, "create_engin": 558, "safest": 559, "fallback": 560, "llm_respons": 561, "identitytoolkit": 562, "birthday": 563, "linux": 564, "tree": 565, "680": 566, "datetim": 567, "nested_dict": 568, "readi": 569, "tailwind": 570, "error": 571, "s9ag_yndl0m": 572, "reuseexistingserv": 573, "layoutslot": 574, "open": 575, "sent": 576, "action": 577, "upgrad": 578, "function": 579, "fruit": 580, "recogn": 581, "interoper": 582, "abc": 583, "form": 584, "relat": 585, "minimalist": 586, "congratul": 587, "compos": 588, "login": 589, "rerun": 590, "capabl": 591, "nativ": 592, "largebinari": 593, "product": 594, "been": 595, "parent": 596, "bool": 597, "pageast": 598, "load": 599, "via": 600, "smbah5leri": 601, "generic": 602, "basic": 603, "convent": 604, "requir": 605, "bad": 606, "direct": 607, "trustedhtml": 608, "doe": 609, "onto": 610, "doc": 611, "endpoint": 612, "input": 613, "814": 614, "increment": 615, "get_al": 616, "i18n": 617, "button_click": 618, "prefer": 619, "cach": 620, "facilit": 621, "5px": 622, "row": 623, "world": 624, "granular": 625, "branch": 626, "slow": 627, "min": 628, "suit": 629, "datafram": 630, "param": 631, "react": 632, "word": 633, "font_weight": 634, "affin": 635, "view": 636, "boilerpl": 637, "firebase_auth_app": 638, "px": 639, "node": 640, "outlin": 641, "want": 642, "reduc": 643, "decoupl": 644, "overflow_i": 645, "let": 646, "summari": 647, "defens": 648, "o1": 649, "firebaseui": 650, "payload": 651, "dedic": 652, "ren": 653, "lost": 654, "date_range_pick": 655, "firebase_auth_compon": 656, "compon": 657, "pictur": 658, "origin": 659, "session": 660, "button_toggl": 661, "explain": 662, "each": 663, "encrypt": 664, "firestor": 665, "inputblurev": 666, "set_theme_dens": 667, "retain": 668, "say": 669, "mesop_base_url_path": 670, "alloc": 671, "content_checkbox": 672, "appli": 673, "gradio": 674, "send_messag": 675, "ide": 676, "checkbox": 677, "send_prompt_flash": 678, "offset": 679, "800": 680, "flow": 681, "robust": 682, "content_layout": 683, "explicit": 684, "variable_nam": 685, "output": 686, "swap": 687, "specif": 688, "program": 689, "modifi": 690, "paramet": 691, "couldn": 692, "multipl": 693, "which": 694, "field": 695, "hit": 696, "color": 697, "e0e0e0": 698, "basemodel": 699, "bordersid": 700, "quick": 701, "expansion_panel": 702, "foo": 703, "flex_grow": 704, "text": 705, "prebuilt": 706, "invalid": 707, "sql": 708, "see": 709, "srv": 710, "evalu": 711, "doesn": 712, "troubl": 713, "mesop_state_session_backend_sql_connection_uri": 714, "complex_config": 715, "your": 716, "cpu": 717, "edgy0afg6u": 718, "setattr": 719, "ever": 720, "variat": 721, "set_page_titl": 722, "come": 723, "expertis": 724, "del": 725, "models_px": 726, "wsgi": 727, "txt": 728, "dictionari": 729, "few": 730, "srcdoc": 731, "access": 732, "picker": 733, "class": 734, "focus": 735, "correspond": 736, "fail": 737, "face": 738, "high": 739, "detection_compon": 740, "wrong": 741, "descript": 742, "content_compon": 743, "created_at": 744, "condit": 745, "given": 746, "licens": 747, "exampl": 748, "again": 749, "depth": 750, "object_detector": 751, "writeabl": 752, "mistak": 753, "uncom": 754, "ps1": 755, "retriev": 756, "languag": 757, "absenc": 758, "can": 759, "conclus": 760, "inject": 761, "typeerror": 762, "cli": 763, "line": 764, "datepickerchangeev": 765, "hub": 766, "process": 767, "saniti": 768, "wide": 769, "regular": 770, "approach": 771, "badg": 772, "height": 773, "2px": 774, "clipboard": 775, "friction": 776, "connect": 777, "url": 778, "compromis": 779, "walk": 780, "binari": 781, "convert": 782, "assign": 783, "handler": 784, "primit": 785, "specifi": 786, "scroll": 787, "clickev": 788, "gradiomesop": 789, "append": 790, "minut": 791, "db": 792, "consist": 793, "materi": 794, "slide_toggl": 795, "seamless": 796, "better": 797, "sequenti": 798, "depend": 799, "letter_spac": 800, "between": 801, "area": 802, "video": 803, "vcpu": 804, "doubl": 805, "move": 806, "mesop": 807, "footer": 808, "behind": 809, "experi": 810, "packag": 811, "respond": 812, "deep": 813, "real": 814, "widget": 815, "correct": 816, "instanti": 817, "requisit": 818, "link_compon": 819, "byte": 820, "con": 821, "unfortun": 822, "devtool": 823, "dark_mod": 824, "continu": 825, "third": 826, "galleri": 827, "viewport": 828, "ecosystem": 829, "put": 830, "nested_list": 831, "gh": 832, "runtime_config": 833, "look": 834, "gyroscop": 835, "black": 836, "sqlalchemi": 837, "slotclass": 838, "framework": 839, "si": 840, "namespac": 841, "most": 842, "unsaf": 843, "custom": 844, "cdn": 845, "caus": 846, "defin": 847, "differenti": 848, "defer": 849, "conversation_pag": 850, "autocomplet": 851, "higher": 852, "hello_world": 853, "mention": 854, "didn": 855, "bar": 856, "futur": 857, "mutableclass": 858, "excel": 859, "side": 860, "integ": 861, "right": 862, "genai": 863, "selected_model": 864, "progress": 865, "minimum": 866, "launch": 867, "order": 868, "cloud": 869, "straightforward": 870, "visual": 871, "flexbox": 872, "margin": 873, "panda": 874, "colorto": 875, "plugin": 876, "cover": 877, "expect": 878, "expans": 879, "until": 880, "enterpris": 881, "match": 882, "non": 883, "2024": 884, "api_key": 885, "protect": 886, "card_head": 887, "runtim": 888, "modul": 889, "wsgi_app": 890, "relax": 891, "decrementev": 892, "after": 893, "html_demo": 894, "unnecessarili": 895, "configure_gemini": 896, "suffici": 897, "gemini_1_5_pro": 898, "theme_var": 899, "combin": 900, "repositori": 901, "desktop": 902, "redact": 903, "detail": 904, "three": 905, "issu": 906, "zi1dngoryho": 907, "dev": 908, "race": 909, "page": 910, "best": 911, "plot": 912, "detect": 913, "chatmessag": 914, "border_radius": 915, "on_ent": 916, "understand": 917, "strive": 918, "dialog_act": 919, "toc": 920, "module_nam": 921, "balanc": 922, "select_demo": 923, "consol": 924, "point": 925, "semant": 926, "life": 927, "highlight": 928, "user": 929, "95": 930, "manual": 931, "push": 932, "block": 933, "serv": 934, "on_chang": 935, "dynam": 936, "nullabl": 937, "5etfw": 938, "consider": 939, "dataclass": 940, "properti": 941, "width": 942, "believ": 943, "table_nam": 944, "standalon": 945, "outer": 946, "annot": 947, "identifi": 948, "connection_uri": 949, "pleas": 950, "href": 951, "ai": 952, "default": 953, "larg": 954, "disk_size_gb": 955, "befor": 956, "oftentim": 957, "banana": 958, "regist": 959, "keyboard": 960, "environ": 961, "actual": 962, "choic": 963, "engin": 964, "various": 965, "itself": 966, "date_pick": 967, "end": 968, "size": 969, "insensit": 970, "md": 971, "rare": 972, "screen": 973, "python": 974, "construct": 975, "dive": 976, "offici": 977, "support": 978, "js": 979, "serious": 980, "magic": 981, "allowed_iframe_par": 982, "instead": 983, "fewer": 984, "root": 985, "hf": 986, "eas": 987, "shadow": 988, "env": 989, "unfamiliar": 990, "per": 991, "pydant": 992, "your_project_id": 993, "team": 994, "extrem": 995, "adc": 996, "beginn": 997, "amount": 998, "troubleshoot": 999, "footgun": 1000, "site": 1001, "mesop_web_components_http_cache_key": 1002, "exact": 1003, "safeti": 1004, "20": 1005, "ci": 1006, "sonnet": 1007, "allowed_script_src": 1008, "autocompleteselectionchangeev": 1009, "least": 1010, "hidden": 1011, "symbol": 1012, "token": 1013, "instant": 1014, "64": 1015, "unique_id": 1016, "rest": 1017, "adjust": 1018, "16px": 1019, "object": 1020, "reset": 1021, "integr": 1022, "subdomain": 1023, "is_model_picker_dialog_open": 1024, "claud": 1025, "sometim": 1026, "onc": 1027, "two": 1028, "notic": 1029, "domain": 1030, "chat": 1031, "update_st": 1032, "content__inn": 1033, "ubuntu22": 1034, "clariti": 1035, "less": 1036, "skew": 1037, "polic": 1038, "should": 1039, "callback": 1040, "increas": 1041, "due": 1042, "mesop_state_session_backend_sql_t": 1043, "potenti": 1044, "mesop_layout_colab": 1045, "child": 1046, "congrat": 1047, "remov": 1048, "encod": 1049, "unhandl": 1050, "ambigu": 1051, "model": 1052, "bg": 1053, "modeldialogst": 1054, "risk": 1055, "select": 1056, "readabl": 1057, "plumb": 1058, "is_desktop": 1059, "without": 1060, "mark": 1061, "main": 1062, "particular": 1063, "variabl": 1064, "click_exampl": 1065, "traceback": 1066, "go": 1067, "strict": 1068, "research": 1069, "state": 1070, "on_login": 1071, "stateless": 1072, "account": 1073, "tosurl": 1074, "overview": 1075, "shown": 1076, "display": 1077, "_or_": 1078, "toml": 1079, "allow": 1080, "part": 1081, "justmycod": 1082, "datapick": 1083, "page2": 1084, "fluid": 1085, "mesopev": 1086, "icon": 1087, "mesop_http_cache_js_bundl": 1088, "dispatch": 1089, "describ": 1090, "alic": 1091, "pd": 1092, "cannot": 1093, "data_model": 1094, "symmetr": 1095, "keep": 1096, "show": 1097, "our": 1098, "boolean": 1099, "microphon": 1100, "player": 1101, "subtl": 1102, "py": 1103, "strategi": 1104, "citi": 1105, "togeth": 1106, "change_model_opt": 1107, "slidervaluechangeev": 1108, "larger": 1109, "rout": 1110, "emb": 1111, "calc": 1112, "window": 1113, "framebord": 1114, "content_button": 1115, "reli": 1116, "emoji": 1117, "trigger": 1118, "com": 1119, "deeper": 1120, "etc": 1121, "price": 1122, "anchor": 1123, "prevent": 1124, "examples_row": 1125, "often": 1126, "slide": 1127, "securitypolici": 1128, "640": 1129, "context": 1130, "abstract": 1131, "becaus": 1132, "confirm": 1133, "offer": 1134, "googl": 1135, "headlin": 1136, "https": 1137, "8080": 1138, "compar": 1139, "emit": 1140, "ahd": 1141, "follow": 1142, "reason": 1143, "shell": 1144, "slot": 1145, "page_a": 1146, "ensur": 1147, "ico": 1148, "typeset": 1149, "them": 1150, "sinc": 1151, "chat_input": 1152, "power": 1153, "still": 1154, "autocompleteoptiongroup": 1155, "suitabl": 1156, "textarea": 1157, "560": 1158, "theme_bright": 1159, "migrat": 1160, "complex": 1161, "top_p": 1162, "customiz": 1163, "elif": 1164, "entir": 1165, "toy": 1166, "fff": 1167, "pin": 1168, "catch": 1169, "june": 1170, "me": 1171, "general": 1172, "run": 1173, "rapid": 1174, "perform": 1175, "confid": 1176, "all": 1177, "mesop_state_session_backend_firestore_collect": 1178, "item": 1179, "ttls": 1180, "final": 1181, "fastapi": 1182, "minor": 1183, "is_load": 1184, "colab_run": 1185, "concept": 1186, "detect_object": 1187, "streamlit": 1188, "vast": 1189, "show_menu_button": 1190, "adapt": 1191, "async": 1192, "get": 1193, "signific": 1194, "mesop_websockets_en": 1195, "csp": 1196, "applic": 1197, "too": 1198, "grid_template_row": 1199, "who": 1200, "mesop_colab_getting_start": 1201, "h1": 1202, "native_textarea": 1203, "otherwis": 1204, "persist": 1205, "command": 1206, "us": 1207, "subclass": 1208, "flexibl": 1209, "were": 1210, "daterangepickerchangeev": 1211, "webserv": 1212, "machin": 1213, "idiomat": 1214, "toler": 1215, "next": 1216, "logo": 1217, "remoteroot": 1218, "easili": 1219, "100vh": 1220, "themevar": 1221, "_ondecr": 1222, "0003": 1223, "add_query_param": 1224, "home_pag": 1225, "scaffold": 1226, "http": 1227, "ctrl": 1228, "svelt": 1229, "enhanc": 1230, "everi": 1231, "32px": 1232, "like": 1233, "900": 1234, "use_config": 1235, "expos": 1236, "implement": 1237, "none": 1238, "llm": 1239, "unopinion": 1240, "v2": 1241, "read": 1242, "target": 1243, "on_upload": 1244, "card_act": 1245, "incred": 1246, "tailwindcss": 1247, "docker": 1248, "screenshot": 1249, "bind": 1250, "transport": 1251, "cryptic": 1252, "away": 1253, "famili": 1254, "primary_key": 1255, "insid": 1256, "nonc": 1257, "load_complex_config": 1258, "instanc": 1259, "tmp": 1260, "radiochangeev": 1261, "counter": 1262, "latest": 1263, "usermodel": 1264, "deliv": 1265, "def": 1266, "api": 1267, "startswith": 1268, "www": 1269, "eventu": 1270, "set_theme_mod": 1271, "quota": 1272, "background_color": 1273, "30": 1274, "accordion": 1275, "mani": 1276, "becom": 1277, "score": 1278, "send_prompt": 1279, "option": 1280, "1px": 1281, "express": 1282, "night": 1283, "background": 1284, "boost": 1285, "250px": 1286, "trick": 1287, "activ": 1288, "alreadi": 1289, "don": 1290, "bash": 1291, "page_b": 1292, "those": 1293, "0000001f": 1294, "frame": 1295, "disclaim": 1296, "level": 1297, "auto": 1298, "dump": 1299, "listen": 1300, "nice": 1301, "intuit": 1302, "return": 1303, "provid": 1304, "fuss": 1305, "arbitrari": 1306, "yaml": 1307, "var": 1308, "colab": 1309, "tupl": 1310, "repres": 1311, "grow": 1312, "folder": 1313, "current_input_valu": 1314, "loadev": 1315, "plan": 1316, "aj4rqzs2mmwvxfo": 1317, "max_token": 1318, "xs": 1319, "ok": 1320, "call_claude_sonnet": 1321, "it": 1322, "dockerfil": 1323, "mdn": 1324, "wildcard": 1325, "initi": 1326, "flex": 1327, "downsid": 1328, "check": 1329, "sanit": 1330, "readm": 1331, "term": 1332, "dist": 1333, "goal": 1334, "overridden": 1335, "memori": 1336, "current": 1337, "repo": 1338, "hate": 1339, "firebas": 1340, "procfil": 1341, "refer": 1342, "blob": 1343, "full": 1344, "resist": 1345, "earlier": 1346, "progress_bar": 1347, "stream": 1348, "caveat": 1349, "guidanc": 1350, "transform": 1351, "trustedscripturl": 1352, "well": 1353, "decor": 1354, "restart": 1355, "almost": 1356, "e7f2ff": 1357, "consum": 1358, "grid_template_column": 1359, "datepick": 1360, "clear": 1361, "venv": 1362, "innerhtml": 1363, "consid": 1364, "log": 1365, "histori": 1366, "initial_input_valu": 1367, "save": 1368, "altern": 1369, "uploadev": 1370, "explor": 1371, "160": 1372, "featur": 1373, "jumpstart": 1374, "scope": 1375, "proper": 1376, "allowfullscreen": 1377, "display_convers": 1378, "client": 1379, "cd": 1380, "white": 1381, "autoplay": 1382, "some": 1383, "column": 1384, "would": 1385, "profil": 1386, "fraction": 1387, "tabl": 1388, "resourc": 1389, "my": 1390, "export": 1391, "tri": 1392, "stale": 1393, "later": 1394, "do": 1395, "evolv": 1396, "mesop_static_url_path": 1397, "type": 1398, "document": 1399, "welcom": 1400, "dens": 1401, "unnecessari": 1402, "tailwind_input": 1403, "565": 1404, "generativemodel": 1405, "collect": 1406, "way": 1407, "mount": 1408, "answer": 1409, "leak": 1410, "fine": 1411, "unless": 1412, "dure": 1413, "asdict": 1414, "dict": 1415, "deprec": 1416, "elem": 1417, "chrome": 1418, "align": 1419, "cloudsql": 1420, "javascript": 1421, "imag": 1422, "serializ": 1423, "index": 1424, "hl_line": 1425, "untrust": 1426, "difficult": 1427, "be": 1428, "disallow": 1429, "config_json": 1430, "children": 1431, "getusermedia": 1432, "anyth": 1433, "matplotlib": 1434, "reusabl": 1435, "howev": 1436, "stringent": 1437, "through": 1438, "gcp_project": 1439, "560px": 1440, "viewabl": 1441, "charset": 1442, "role": 1443, "figur": 1444, "densiti": 1445, "quiet": 1446, "multi_page_nav": 1447, "unit": 1448, "light_mod": 1449, "asset": 1450, "line_height": 1451, "refin": 1452, "on_load_gener": 1453, "notebook": 1454, "stylesheet": 1455, "10": 1456, "remot": 1457, "justify_item": 1458, "oper": 1459, "sandbox": 1460, "comput": 1461, "busi": 1462, "complet": 1463, "text_stream": 1464, "avoid": 1465, "rememb": 1466, "versatil": 1467, "decreas": 1468, "socket": 1469, "metadata": 1470, "sophist": 1471, "status": 1472, "tedious": 1473, "sleep": 1474, "named_slot": 1475, "extract": 1476, "hug": 1477, "image_data": 1478, "sure": 1479, "everyth": 1480, "weight": 1481, "shortcut": 1482, "uploadedfil": 1483, "data": 1484, "page1": 1485, "resolv": 1486, "earli": 1487, "delet": 1488, "keyerror": 1489, "one": 1490, "intermedi": 1491, "build": 1492, "nestedst": 1493, "appropri": 1494, "fast": 1495, "obj": 1496, "touch": 1497, "2767": 1498, "fals": 1499, "autom": 1500, "blank": 1501, "experiment": 1502, "button": 1503, "markdown_demo": 1504, "hamburg": 1505, "click": 1506, "strong": 1507, "checkboxindeterminatechangeev": 1508, "659": 1509, "categori": 1510, "_root": 1511, "servic": 1512, "pro": 1513, "know": 1514, "b64encod": 1515, "youtub": 1516, "bunch": 1517, "jsdelivr": 1518, "on_blur": 1519, "pagebst": 1520, "inspir": 1521, "in": 1522, "_not_": 1523, "failur": 1524, "dangerously_disable_trusted_typ": 1525, "gentl": 1526, "on_auth_chang": 1527, "twitter": 1528, "format": 1529, "join": 1530, "content_slide_toggl": 1531, "slash": 1532, "frequent": 1533, "click_navigate_button": 1534, "back": 1535, "more": 1536, "section": 1537, "typic": 1538, "png": 1539, "programmingerror": 1540, "defined__": 1541, "across": 1542, "stabl": 1543, "utf": 1544, "wwwillchen": 1545, "chang": 1546, "modern": 1547, "under": 1548, "cross": 1549, "web_compon": 1550, "easi": 1551, "bill": 1552, "ultim": 1553, "revers": 1554, "2f": 1555, "all_valu": 1556, "print": 1557, "primarili": 1558, "sqlite3": 1559, "backward": 1560, "constraint": 1561, "handl": 1562, "determin": 1563, "vs": 1564, "ani": 1565, "io": 1566, "tyagi": 1567, "border": 1568, "than": 1569, "1028": 1570, "jupyt": 1571, "aren": 1572, "generativeai": 1573, "mesop_state_sess": 1574, "divid": 1575, "off": 1576, "equival": 1577, "unselect": 1578, "worker": 1579, "liner": 1580, "vscode": 1581, "inner": 1582, "moment": 1583, "pretti": 1584, "ref_src": 1585, "write": 1586, "whenev": 1587, "exc": 1588, "ffffff": 1589, "blue": 1590, "anatomi": 1591, "scroll_into_view": 1592, "768px": 1593, "unifi": 1594, "vertic": 1595, "core": 1596, "tooltip": 1597, "possibl": 1598, "dif": 1599, "respect": 1600, "social": 1601, "anti": 1602, "soon": 1603, "street": 1604, "deseri": 1605, "hashtag": 1606, "awar": 1607, "communiti": 1608, "serial": 1609, "wait": 1610, "dswharshit": 1611, "1024": 1612, "usag": 1613, "except": 1614, "adopt": 1615, "select_menu_key": 1616, "minim": 1617, "on_image_upload": 1618, "achiev": 1619, "contribut": 1620, "00000024": 1621, "whether": 1622, "expand": 1623, "mesop_state_session_backend": 1624, "question": 1625, "unredact": 1626, "fair": 1627, "navig": 1628, "demand": 1629, "firebaseconfig": 1630, "comparison": 1631, "kind": 1632, "127": 1633, "gunicorn": 1634, "attract": 1635, "32123": 1636, "previous": 1637, "userprofil": 1638, "umd": 1639, "storag": 1640, "captur": 1641, "avail": 1642, "true": 1643, "toggl": 1644, "bat": 1645, "in_progress": 1646, "cmd": 1647, "gcp": 1648, "individu": 1649, "manual_sc": 1650, "forth": 1651, "popular": 1652, "recommend": 1653, "critic": 1654, "menu": 1655, "autocompleteenterev": 1656, "top_k": 1657, "on_click": 1658, "valuabl": 1659, "below": 1660, "steeper": 1661, "cancel": 1662, "own": 1663, "element": 1664, "card_cont": 1665, "singl": 1666, "danger": 1667, "past": 1668, "interpol": 1669, "knowledg": 1670, "inputev": 1671, "len": 1672, "method": 1673, "accept": 1674, "pros": 1675, "alway": 1676, "desir": 1677, "generat": 1678, "mkdir": 1679, "1fr": 1680, "spin": 1681, "concaten": 1682, "review": 1683, "miss": 1684, "your_servic": 1685, "fragment": 1686, "tip": 1687, "_blank": 1688, "admin": 1689, "list": 1690, "battl": 1691, "sanchay": 1692, "sensit": 1693, "rais": 1694, "group": 1695, "blur": 1696, "written": 1697, "kit": 1698, "anywher": 1699, "browser": 1700, "both": 1701, "assist": 1702, "hide": 1703, "second": 1704, "some_cont": 1705, "is_en": 1706, "idea": 1707, "mesop_app_base_path": 1708, "just": 1709, "involv": 1710, "__component__": 1711, "autocompleteopt": 1712, "degrad": 1713, "incom": 1714, "kufpisujrw": 1715, "long": 1716, "dispatchev": 1717, "spec": 1718, "radioopt": 1719, "counter_component_app": 1720, "guid": 1721, "result": 1722, "maintain": 1723, "util": 1724, "veri": 1725, "conveni": 1726, "special": 1727, "api_respons": 1728, "root_box_styl": 1729, "varieti": 1730, "radio": 1731, "bin": 1732, "give": 1733, "copi": 1734, "hello": 1735, "treat": 1736, "dynapubow3aft47i": 1737, "wiki": 1738, "dkvt0rboqumapk5d": 1739, "technolog": 1740, "age": 1741, "number": 1742, "outsid": 1743, "similar": 1744, "budget": 1745, "rather": 1746, "sh": 1747, "base": 1748, "first": 1749, "lose": 1750, "onli": 1751, "switch_model": 1752, "placehold": 1753, "have": 1754, "23": 1755, "case": 1756, "dialog": 1757, "referrerpolici": 1758, "mesop_prod_unredacted_error": 1759, "flask": 1760, "create_wsgi_app": 1761, "think": 1762, "snippet": 1763, "substr": 1764, "count": 1765, "search": 1766, "system": 1767, "stateclass": 1768, "temperatur": 1769, "configur": 1770, "lambda": 1771, "overflow_x": 1772, "so": 1773, "async_await": 1774, "light": 1775, "charact": 1776, "amongst": 1777, "also": 1778, "separ": 1779, "roundtrip": 1780, "liter": 1781, "coupl": 1782, "2fr": 1783, "buttontogglebutton": 1784, "communic": 1785, "convers": 1786, "over": 1787, "attribut": 1788, "pathmap": 1789, "css2": 1790, "simultan": 1791, "instruct": 1792, "indic": 1793, "prototyp": 1794, "commit": 1795, "repeated_param": 1796, "loop": 1797, "space": 1798, "classif": 1799, "accommod": 1800, "break": 1801, "enter": 1802, "menu_width": 1803, "structur": 1804, "b9e1ff": 1805, "from": 1806, "pick": 1807, "modular": 1808, "acceleromet": 1809, "model_messag": 1810, "imagin": 1811, "cell": 1812, "nav_compon": 1813, "fulli": 1814, "establish": 1815, "gray": 1816, "demonstr": 1817, "ve": 1818, "unsupport": 1819, "gemini_1_5_flash": 1820, "elimin": 1821, "trail": 1822, "slider": 1823, "veloc": 1824, "start": 1825, "close_model_picker_dialog": 1826, "mobil": 1827, "upload": 1828, "myapppath": 1829, "whichev": 1830, "host": 1831, "transmit": 1832, "strength": 1833, "selectselectionchangeev": 1834, "complement": 1835, "helper": 1836, "dsl": 1837, "twsrc": 1838, "town": 1839, "fit": 1840, "co": 1841, "priorit": 1842, "philosophi": 1843, "goto": 1844, "code_demo": 1845, "breakpoint": 1846, "same": 1847, "powershel": 1848, "cdns": 1849, "success": 1850, "titl": 1851, "memory_gb": 1852, "other": 1853, "scale": 1854, "key": 1855, "free": 1856, "extens": 1857, "call_api": 1858, "privacypolicyurl": 1859, "ipython": 1860, "time": 1861, "effici": 1862, "top": 1863, "produc": 1864, "someth": 1865, "import": 1866, "essenti": 1867, "need": 1868, "checkboxchangeev": 1869, "compat": 1870, "impos": 1871, "sleek": 1872, "mode": 1873, "inspect": 1874, "label": 1875, "goe": 1876, "websocket": 1877, "clone": 1878, "thread": 1879, "component_help": 1880, "confidenti": 1881, "model_nam": 1882, "reus": 1883, "where": 1884, "act": 1885, "html": 1886, "place": 1887, "hood": 1888, "out": 1889, "focus_compon": 1890, "sidenav": 1891, "quickstart": 1892, "attach": 1893, "wrestl": 1894, "front": 1895, "termin": 1896, "data_fram": 1897, "content": 1898, "font": 1899, "showcas": 1900, "global": 1901}
|
gen/default__vector_store.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
gen/docstore.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
gen/graph_store.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"graph_dict": {}}
|
gen/image__vector_store.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"embedding_dict": {}, "text_id_to_ref_doc_id": {}, "metadata_dict": {}}
|
gen/index_store.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"index_store/data": {"312fae99-c253-49e3-b5a2-ad25a3f18c43": {"__type__": "vector_store", "__data__": "{\"index_id\": \"312fae99-c253-49e3-b5a2-ad25a3f18c43\", \"summary\": null, \"nodes_dict\": {\"381052e1-25b6-482c-9b8c-3813950b3afb\": \"381052e1-25b6-482c-9b8c-3813950b3afb\", \"82259c92-2206-4fad-b39f-8d65e3cd6bc1\": \"82259c92-2206-4fad-b39f-8d65e3cd6bc1\", \"60d24f6c-bb9d-4c5e-9cd0-ff7e64753265\": \"60d24f6c-bb9d-4c5e-9cd0-ff7e64753265\", \"a0678bbd-dd7f-4dad-ae34-77aeb52ff754\": \"a0678bbd-dd7f-4dad-ae34-77aeb52ff754\", \"49885b96-7d1f-48fa-819f-26ade55476eb\": \"49885b96-7d1f-48fa-819f-26ade55476eb\", \"c305576b-c578-4038-a983-680048d35175\": \"c305576b-c578-4038-a983-680048d35175\", \"057f6393-f51a-4c21-9ecf-aba002e41759\": \"057f6393-f51a-4c21-9ecf-aba002e41759\", \"a4d1cb17-8da9-4b08-9c95-7be508b27b62\": \"a4d1cb17-8da9-4b08-9c95-7be508b27b62\", \"96fb51e2-539c-4829-b175-0defcd7606d6\": \"96fb51e2-539c-4829-b175-0defcd7606d6\", \"97f573e7-e2de-4556-94c9-5d91f5898440\": \"97f573e7-e2de-4556-94c9-5d91f5898440\", \"8fdecda0-d89d-4859-b2c8-fea45687d7ad\": \"8fdecda0-d89d-4859-b2c8-fea45687d7ad\", \"7042fc47-1c75-494f-9e34-9fc35269942a\": \"7042fc47-1c75-494f-9e34-9fc35269942a\", \"a51f5239-8860-4c50-affa-1e22f390ec24\": \"a51f5239-8860-4c50-affa-1e22f390ec24\", \"3dc3d105-d1c3-456b-affd-8786eb136730\": \"3dc3d105-d1c3-456b-affd-8786eb136730\", \"c8529b77-3c26-459f-a913-cad371eaa858\": \"c8529b77-3c26-459f-a913-cad371eaa858\", \"7f1d091a-a38c-4adb-a177-d4b8f56a3beb\": \"7f1d091a-a38c-4adb-a177-d4b8f56a3beb\", \"95d703ca-55a2-498b-ac79-60acc72da1bb\": \"95d703ca-55a2-498b-ac79-60acc72da1bb\", \"55b65bb4-5fdd-4f89-87c8-bc7d4b33e6c2\": \"55b65bb4-5fdd-4f89-87c8-bc7d4b33e6c2\", \"c207ab36-851c-4725-a6e6-762ed371365a\": \"c207ab36-851c-4725-a6e6-762ed371365a\", \"45e24739-759a-4e96-b16b-af246081dd99\": \"45e24739-759a-4e96-b16b-af246081dd99\", \"484ef60d-97d9-4af8-89b8-e85b12f52810\": \"484ef60d-97d9-4af8-89b8-e85b12f52810\", \"ccc1ee7d-4e5f-4efa-924c-b578de1af369\": \"ccc1ee7d-4e5f-4efa-924c-b578de1af369\", \"0f7c9dbf-2fa8-43ac-a4c9-539d9085739e\": \"0f7c9dbf-2fa8-43ac-a4c9-539d9085739e\", \"d42dc191-ab80-4770-ba2a-92d28f105776\": \"d42dc191-ab80-4770-ba2a-92d28f105776\", \"f3c8519b-de1a-4236-b3f7-4a9dbae960b9\": \"f3c8519b-de1a-4236-b3f7-4a9dbae960b9\", \"a671d5c0-b2a1-488e-8ea0-f5b23f57a98a\": \"a671d5c0-b2a1-488e-8ea0-f5b23f57a98a\", \"fbbc40fa-13f7-4a81-9ada-974084dca940\": \"fbbc40fa-13f7-4a81-9ada-974084dca940\", \"055d78a8-5f9a-449d-bc2e-5fe2067bf55b\": \"055d78a8-5f9a-449d-bc2e-5fe2067bf55b\", \"dc292655-5d93-46c8-9156-6ba75e23be23\": \"dc292655-5d93-46c8-9156-6ba75e23be23\", \"12e938f3-4d15-46a3-b426-0bacf7530a21\": \"12e938f3-4d15-46a3-b426-0bacf7530a21\", \"557898e7-0d82-4a8d-92eb-6b1951e766ff\": \"557898e7-0d82-4a8d-92eb-6b1951e766ff\", \"e6423c16-c320-4e44-bc65-9d2ad2064031\": \"e6423c16-c320-4e44-bc65-9d2ad2064031\", \"2595d43b-4c96-475b-9f6c-bfd34de79d5f\": \"2595d43b-4c96-475b-9f6c-bfd34de79d5f\", \"9d77bd2f-d5fa-4d0c-ad23-43ab2f47773d\": \"9d77bd2f-d5fa-4d0c-ad23-43ab2f47773d\", \"a2c3e68f-3336-486b-b0be-1fb48131d066\": \"a2c3e68f-3336-486b-b0be-1fb48131d066\", \"38faeb54-8025-4037-a231-c3a3246ec4a0\": \"38faeb54-8025-4037-a231-c3a3246ec4a0\", \"87c0ab38-4ab3-4f72-bdb1-79565621be03\": \"87c0ab38-4ab3-4f72-bdb1-79565621be03\", \"046a1a2a-3f83-486f-807e-16ce128509aa\": \"046a1a2a-3f83-486f-807e-16ce128509aa\", \"996143a6-f841-4439-a21b-3246b269f5c9\": \"996143a6-f841-4439-a21b-3246b269f5c9\", \"d1f92a15-b99c-47a0-8827-7672933998f2\": \"d1f92a15-b99c-47a0-8827-7672933998f2\", \"a7512d00-cef4-49a7-8bd2-95c4a2da39c7\": \"a7512d00-cef4-49a7-8bd2-95c4a2da39c7\", \"765a1cde-33c4-4dab-a8cc-03ba8ba9e49b\": \"765a1cde-33c4-4dab-a8cc-03ba8ba9e49b\", \"d55e78f2-91c3-42c8-98f3-eaedcce047f9\": \"d55e78f2-91c3-42c8-98f3-eaedcce047f9\", \"6a350289-95be-4090-a506-96fc8ce2e4e1\": \"6a350289-95be-4090-a506-96fc8ce2e4e1\", \"592628a0-d1de-44db-98e6-12b4c8a26f68\": \"592628a0-d1de-44db-98e6-12b4c8a26f68\", \"28ba4cca-6ad8-4327-b354-53b4d6ba4661\": \"28ba4cca-6ad8-4327-b354-53b4d6ba4661\", \"1ca27cbb-f460-40c0-bccf-84904da4ddaa\": \"1ca27cbb-f460-40c0-bccf-84904da4ddaa\", \"c303a090-1d01-4883-9f3a-80f77bfc5d5f\": \"c303a090-1d01-4883-9f3a-80f77bfc5d5f\", \"fc80bbdf-308e-4c47-979b-c1b1f1da7d3e\": \"fc80bbdf-308e-4c47-979b-c1b1f1da7d3e\", \"efce4c69-f3e2-46a2-911b-58ab2df468df\": \"efce4c69-f3e2-46a2-911b-58ab2df468df\", \"8c88c7f2-79b0-4f0f-8335-b53b3888e918\": \"8c88c7f2-79b0-4f0f-8335-b53b3888e918\", \"9c33306d-344a-4d40-b2a9-d10c70e9ea48\": \"9c33306d-344a-4d40-b2a9-d10c70e9ea48\", \"7e5399d6-210c-4fe2-beae-9be2b108ff95\": \"7e5399d6-210c-4fe2-beae-9be2b108ff95\", \"414dccc1-cd84-48aa-a00f-fc6f758dcdd4\": \"414dccc1-cd84-48aa-a00f-fc6f758dcdd4\", \"4669d480-bc3f-4bbc-8114-2fd89f1ba765\": \"4669d480-bc3f-4bbc-8114-2fd89f1ba765\", \"fb777b3c-4e48-4bb7-bdac-364c605ca29e\": \"fb777b3c-4e48-4bb7-bdac-364c605ca29e\", \"f7ab662a-9655-442e-b6f0-b8372e82619c\": \"f7ab662a-9655-442e-b6f0-b8372e82619c\", \"6d205607-dee5-4e5e-9225-2a5473b52612\": \"6d205607-dee5-4e5e-9225-2a5473b52612\", \"22db4cc0-f046-4ac3-a091-8421f1a374ad\": \"22db4cc0-f046-4ac3-a091-8421f1a374ad\", \"20ea3eb1-4a72-4a08-876f-5565b6082881\": \"20ea3eb1-4a72-4a08-876f-5565b6082881\", \"a904242a-c9c3-4b92-8aed-5a9e6d3a4a47\": \"a904242a-c9c3-4b92-8aed-5a9e6d3a4a47\", \"6dcc46dd-cee8-49cc-91dd-64089fbce436\": \"6dcc46dd-cee8-49cc-91dd-64089fbce436\", \"c9942dcc-ea76-4d43-88f8-79dbe711997a\": \"c9942dcc-ea76-4d43-88f8-79dbe711997a\", \"1e9b97fd-8010-4f0e-909f-a3bda26edd17\": \"1e9b97fd-8010-4f0e-909f-a3bda26edd17\", \"9d5e74f6-1405-4111-80a0-e3bc9044dd11\": \"9d5e74f6-1405-4111-80a0-e3bc9044dd11\", \"4a55f4ff-e336-42fd-8141-6940a8159f3e\": \"4a55f4ff-e336-42fd-8141-6940a8159f3e\", \"4527e595-9d24-4e34-b56f-54c836636d80\": \"4527e595-9d24-4e34-b56f-54c836636d80\", \"38b57768-3763-428b-9f5d-b01ab2f53659\": \"38b57768-3763-428b-9f5d-b01ab2f53659\", \"a6ddd9b2-ca47-4fd0-9488-58b7572b5836\": \"a6ddd9b2-ca47-4fd0-9488-58b7572b5836\", \"2c012a92-edcc-4c8c-8766-171cc3de0305\": \"2c012a92-edcc-4c8c-8766-171cc3de0305\", \"f58696eb-3af8-45b2-bddf-b6fc0ea6245c\": \"f58696eb-3af8-45b2-bddf-b6fc0ea6245c\", \"d9cb4325-4947-43cd-93f1-4ad3cd88f1fb\": \"d9cb4325-4947-43cd-93f1-4ad3cd88f1fb\", \"dcebafa9-d590-40ec-9f36-24c4aecee755\": \"dcebafa9-d590-40ec-9f36-24c4aecee755\", \"4042664a-937c-4210-b167-c5679774a62d\": \"4042664a-937c-4210-b167-c5679774a62d\", \"5636e197-2f41-4ec9-9eb3-68169a613d05\": \"5636e197-2f41-4ec9-9eb3-68169a613d05\", \"156f3734-75de-4955-92d6-7e1335d5b81e\": \"156f3734-75de-4955-92d6-7e1335d5b81e\", \"dbdc021d-7132-432d-88db-093633bb7257\": \"dbdc021d-7132-432d-88db-093633bb7257\", \"fc1f68a1-214f-4af2-bdac-224285a2f96d\": \"fc1f68a1-214f-4af2-bdac-224285a2f96d\", \"6777a9b7-3936-4b78-a06a-050f33165f6c\": \"6777a9b7-3936-4b78-a06a-050f33165f6c\", \"9094b3d6-643b-44f5-ad57-dc2c16ffceea\": \"9094b3d6-643b-44f5-ad57-dc2c16ffceea\", \"1d819f06-ff1b-4b15-bf62-d5f824276f92\": \"1d819f06-ff1b-4b15-bf62-d5f824276f92\", \"d2ca339f-0727-47f8-af84-c724824d5d09\": \"d2ca339f-0727-47f8-af84-c724824d5d09\", \"97a23655-9241-419f-ad0b-bb0d854da57c\": \"97a23655-9241-419f-ad0b-bb0d854da57c\", \"2717c2f7-8149-4dff-8bb2-5c6548c35387\": \"2717c2f7-8149-4dff-8bb2-5c6548c35387\", \"bac73926-8d1d-4abf-83ca-10950b83156e\": \"bac73926-8d1d-4abf-83ca-10950b83156e\", \"4d5226ce-b2d8-4b5e-b1d8-28a38cc2d8c6\": \"4d5226ce-b2d8-4b5e-b1d8-28a38cc2d8c6\", \"3d8394df-5217-4f81-a28c-0b34c5a50769\": \"3d8394df-5217-4f81-a28c-0b34c5a50769\", \"f7e7d448-edeb-471c-bd96-720aa72867b8\": \"f7e7d448-edeb-471c-bd96-720aa72867b8\", \"f6a7c925-7f30-492b-8276-308b29d4194a\": \"f6a7c925-7f30-492b-8276-308b29d4194a\", \"6db8c6de-b9de-4cae-b91f-9c56e5f3a54e\": \"6db8c6de-b9de-4cae-b91f-9c56e5f3a54e\", \"9471d6a1-9882-49dd-9328-b90573e5ef1c\": \"9471d6a1-9882-49dd-9328-b90573e5ef1c\", \"edd0bf32-7d7d-4a00-84dc-b642c785fd60\": \"edd0bf32-7d7d-4a00-84dc-b642c785fd60\", \"2cabce5f-762f-4c4e-b3fa-033c7d0e32df\": \"2cabce5f-762f-4c4e-b3fa-033c7d0e32df\", \"bcb7286c-a3e7-4efe-95ef-f01f00b9abdc\": \"bcb7286c-a3e7-4efe-95ef-f01f00b9abdc\", \"aebb3435-b969-478a-ac82-32bde9132cab\": \"aebb3435-b969-478a-ac82-32bde9132cab\", \"7e0967b0-1054-43b7-9501-4e6b681d13ad\": \"7e0967b0-1054-43b7-9501-4e6b681d13ad\", \"0e7ffd89-450f-48e1-998b-840075054bf4\": \"0e7ffd89-450f-48e1-998b-840075054bf4\", \"032d07ff-b5b6-41bb-b649-0ff3bc3d8d4e\": \"032d07ff-b5b6-41bb-b649-0ff3bc3d8d4e\", \"8c2aea5e-d304-4031-a5f8-3725999ffe01\": \"8c2aea5e-d304-4031-a5f8-3725999ffe01\", \"91d3f8ff-ef9a-4d8e-9d59-7bb925a230a9\": \"91d3f8ff-ef9a-4d8e-9d59-7bb925a230a9\", \"7695a469-c8a8-438c-b664-66de95d22569\": \"7695a469-c8a8-438c-b664-66de95d22569\", \"446866aa-c6b7-4e5c-aec9-159f0d2d47f9\": \"446866aa-c6b7-4e5c-aec9-159f0d2d47f9\", \"d63501be-0b55-444b-9d47-ca4064cd7851\": \"d63501be-0b55-444b-9d47-ca4064cd7851\", \"508c7ca3-5d2c-4742-a14d-50f5ac1b8eea\": \"508c7ca3-5d2c-4742-a14d-50f5ac1b8eea\", \"1013041c-1785-4da8-8ffe-a4be2bade7dc\": \"1013041c-1785-4da8-8ffe-a4be2bade7dc\", \"7f3560ac-7157-481a-aa85-bffd2c2730db\": \"7f3560ac-7157-481a-aa85-bffd2c2730db\", \"c656a36d-3d2c-4620-a5c7-3b89b36ef22e\": \"c656a36d-3d2c-4620-a5c7-3b89b36ef22e\", \"b88ebcbc-f9f5-4fec-818c-af40a16004af\": \"b88ebcbc-f9f5-4fec-818c-af40a16004af\", \"9b6f2395-8047-47b8-a27b-c5256f40c13c\": \"9b6f2395-8047-47b8-a27b-c5256f40c13c\", \"bca8842d-ec76-4f3f-a2c4-6f957634ea33\": \"bca8842d-ec76-4f3f-a2c4-6f957634ea33\", \"a8d8a18f-14cc-43f2-8981-ba9844b6931e\": \"a8d8a18f-14cc-43f2-8981-ba9844b6931e\", \"b9d5747c-4f2b-4624-800e-51c9deaf097d\": \"b9d5747c-4f2b-4624-800e-51c9deaf097d\", \"c07a84aa-9769-458d-905c-4bf5d65e8dd8\": \"c07a84aa-9769-458d-905c-4bf5d65e8dd8\", \"af1d43ee-3c91-498f-9ad5-88a1375f8799\": \"af1d43ee-3c91-498f-9ad5-88a1375f8799\", \"9c743a4e-b874-415b-9291-96283adcd527\": \"9c743a4e-b874-415b-9291-96283adcd527\", \"6adf67b6-35b6-4a44-9a2b-8b23bc849e14\": \"6adf67b6-35b6-4a44-9a2b-8b23bc849e14\", \"9d62096c-8f2a-4f03-9771-8c826c146924\": \"9d62096c-8f2a-4f03-9771-8c826c146924\", \"ff74f167-a35f-43ec-9fcc-a05e5eab7d88\": \"ff74f167-a35f-43ec-9fcc-a05e5eab7d88\", \"14640128-8c75-41ee-8bfe-caa645e8bf44\": \"14640128-8c75-41ee-8bfe-caa645e8bf44\", \"df060512-fe26-483d-8fed-4a1c29a73f94\": \"df060512-fe26-483d-8fed-4a1c29a73f94\", \"cc22e6fb-b980-4679-bbcd-c48408eae3db\": \"cc22e6fb-b980-4679-bbcd-c48408eae3db\", \"3660a7fd-25e7-4767-a91c-12537e68e585\": \"3660a7fd-25e7-4767-a91c-12537e68e585\", \"fc241732-e444-401b-b122-e13fd5777605\": \"fc241732-e444-401b-b122-e13fd5777605\", \"a7bf6eb9-a0fa-4029-92a7-f7f9ce0d892e\": \"a7bf6eb9-a0fa-4029-92a7-f7f9ce0d892e\", \"20d5ed36-eb8f-4c59-928e-9ce5602939ae\": \"20d5ed36-eb8f-4c59-928e-9ce5602939ae\", \"784cd87f-05df-47fc-bf9a-87ebb3e535e1\": \"784cd87f-05df-47fc-bf9a-87ebb3e535e1\", \"35fa8570-d647-471d-9119-e034028a8492\": \"35fa8570-d647-471d-9119-e034028a8492\", \"d6233341-eed4-4d44-9664-3f7b693d79fd\": \"d6233341-eed4-4d44-9664-3f7b693d79fd\", \"a4aac7b8-5011-4ba6-9f9d-418c2781b6ef\": \"a4aac7b8-5011-4ba6-9f9d-418c2781b6ef\", \"8415ca41-3ef2-4ddc-b67f-189bb0725636\": \"8415ca41-3ef2-4ddc-b67f-189bb0725636\", \"e1aa0897-e694-4add-a4c4-75b5116cf897\": \"e1aa0897-e694-4add-a4c4-75b5116cf897\", \"fe2e1aa4-0e64-44a1-a42e-05b3ea54f270\": \"fe2e1aa4-0e64-44a1-a42e-05b3ea54f270\", \"a56385c0-13e8-4985-92c2-b73d0865ac4c\": \"a56385c0-13e8-4985-92c2-b73d0865ac4c\", \"cda5cd35-d9f3-4e4d-af35-e16834e7aaed\": \"cda5cd35-d9f3-4e4d-af35-e16834e7aaed\", \"5c9824f5-6108-46cb-96d0-792fea7278b6\": \"5c9824f5-6108-46cb-96d0-792fea7278b6\", \"3a897012-930d-4df3-a01a-a9c037165ebb\": \"3a897012-930d-4df3-a01a-a9c037165ebb\", \"0ac4207e-0f7e-4535-bc80-cecb680964dc\": \"0ac4207e-0f7e-4535-bc80-cecb680964dc\", \"ac54b265-6bda-44d6-8cd4-06b4014c902c\": \"ac54b265-6bda-44d6-8cd4-06b4014c902c\", \"1b7bfb69-d22b-421d-ba59-198b97b1d406\": \"1b7bfb69-d22b-421d-ba59-198b97b1d406\", \"7f7a5f5c-45b7-44df-81d1-82f88a551ce2\": \"7f7a5f5c-45b7-44df-81d1-82f88a551ce2\", \"f37d8c5c-714e-45a3-a8c6-6e0084211ac2\": \"f37d8c5c-714e-45a3-a8c6-6e0084211ac2\", \"c2a74961-d663-4eca-a90e-5984d7298a9e\": \"c2a74961-d663-4eca-a90e-5984d7298a9e\", \"fc6c4d84-1a87-4f5d-9b1b-5630079ab548\": \"fc6c4d84-1a87-4f5d-9b1b-5630079ab548\", \"42053742-8e59-4183-846e-f395ed64c452\": \"42053742-8e59-4183-846e-f395ed64c452\", \"fcbf14ac-8dda-4ebc-978f-b004d5ed56b5\": \"fcbf14ac-8dda-4ebc-978f-b004d5ed56b5\", \"a14394ed-37d2-41ad-98ac-106ceceaa057\": \"a14394ed-37d2-41ad-98ac-106ceceaa057\", \"2de0eb87-dd1b-46e1-85ea-ff72ec009abe\": \"2de0eb87-dd1b-46e1-85ea-ff72ec009abe\", \"7edb498c-59a4-4988-b8e1-f60957e05724\": \"7edb498c-59a4-4988-b8e1-f60957e05724\", \"ec7a6913-9a35-4568-b5f5-bfa5904e2588\": \"ec7a6913-9a35-4568-b5f5-bfa5904e2588\", \"c592b4c9-ffba-4bd1-9799-55e6088580d4\": \"c592b4c9-ffba-4bd1-9799-55e6088580d4\", \"509e7987-28d9-4e41-aaf9-15ea3213a6fc\": \"509e7987-28d9-4e41-aaf9-15ea3213a6fc\", \"380d939d-c2dc-46e9-a29f-06bc549cf2ae\": \"380d939d-c2dc-46e9-a29f-06bc549cf2ae\", \"2bf83a41-7ff0-4611-bd02-db7658e1eee2\": \"2bf83a41-7ff0-4611-bd02-db7658e1eee2\", \"a06f24d7-1c4d-4444-aa8e-f0f78f12ea31\": \"a06f24d7-1c4d-4444-aa8e-f0f78f12ea31\", \"d5884ac1-85ea-4f45-9b4c-600fe0b5bfe4\": \"d5884ac1-85ea-4f45-9b4c-600fe0b5bfe4\", \"87e1702b-4c77-49be-afbe-79d13047ddcb\": \"87e1702b-4c77-49be-afbe-79d13047ddcb\", \"f0b2e0b5-a252-4917-83b9-b116fb1fc6cf\": \"f0b2e0b5-a252-4917-83b9-b116fb1fc6cf\", \"de6a467d-2932-489f-8a69-d605a705f9cc\": \"de6a467d-2932-489f-8a69-d605a705f9cc\", \"3e904911-4e13-4fa8-aa08-4135048958c8\": \"3e904911-4e13-4fa8-aa08-4135048958c8\", \"be199ccc-498b-41a0-8438-f8cb1369106d\": \"be199ccc-498b-41a0-8438-f8cb1369106d\", \"33378187-1b8e-434e-b37a-d5ab4b5e6c5c\": \"33378187-1b8e-434e-b37a-d5ab4b5e6c5c\", \"48c417d3-d351-4b17-a342-bea1abafeb85\": \"48c417d3-d351-4b17-a342-bea1abafeb85\", \"7a82c89a-defb-4158-a944-c9bddcd9dd5c\": \"7a82c89a-defb-4158-a944-c9bddcd9dd5c\", \"43fab03c-3774-4bf2-9f04-9dd76ea791ef\": \"43fab03c-3774-4bf2-9f04-9dd76ea791ef\", \"84ce4224-d55e-4e36-b7e5-44f16d7bcdc6\": \"84ce4224-d55e-4e36-b7e5-44f16d7bcdc6\", \"061155c3-9f31-4928-a7df-cfce50e88313\": \"061155c3-9f31-4928-a7df-cfce50e88313\", \"8e91717a-5194-4ce5-9c65-80ea50e6547a\": \"8e91717a-5194-4ce5-9c65-80ea50e6547a\", \"7eb134d9-bce8-414a-ae6d-92439f40ee55\": \"7eb134d9-bce8-414a-ae6d-92439f40ee55\", \"2c74133e-1042-4ff4-b369-41eac16831c6\": \"2c74133e-1042-4ff4-b369-41eac16831c6\", \"2cbd0192-3c86-4d9b-a86f-3270dc84d27e\": \"2cbd0192-3c86-4d9b-a86f-3270dc84d27e\", \"a01839aa-5723-4669-939b-af7e69262ce3\": \"a01839aa-5723-4669-939b-af7e69262ce3\", \"9887858b-e493-45a6-9dba-fde742704c83\": \"9887858b-e493-45a6-9dba-fde742704c83\", \"0521bdd3-15a4-4cf5-a126-8dfb30d89df4\": \"0521bdd3-15a4-4cf5-a126-8dfb30d89df4\", \"86646a96-bea0-49f5-83e4-5092add3496a\": \"86646a96-bea0-49f5-83e4-5092add3496a\", \"f5fa4eb5-88a0-4bd5-946e-184b683ddb43\": \"f5fa4eb5-88a0-4bd5-946e-184b683ddb43\", \"b8c191e6-f666-4483-85a2-fb514206fd40\": \"b8c191e6-f666-4483-85a2-fb514206fd40\", \"2c28e192-a634-4869-9e36-3db8d9f67929\": \"2c28e192-a634-4869-9e36-3db8d9f67929\", \"07f5ef0e-2b99-4974-a3c2-112f688b747b\": \"07f5ef0e-2b99-4974-a3c2-112f688b747b\", \"66d0a6a7-cc46-4fcb-94f0-afbe94162f17\": \"66d0a6a7-cc46-4fcb-94f0-afbe94162f17\", \"7fedfb24-6fb5-4f47-932e-32db7bc33b38\": \"7fedfb24-6fb5-4f47-932e-32db7bc33b38\", \"eec022c1-c6c5-42d9-98e6-a39781660657\": \"eec022c1-c6c5-42d9-98e6-a39781660657\", \"dffb83cf-5260-438a-ac22-562cf8f84662\": \"dffb83cf-5260-438a-ac22-562cf8f84662\", \"75b2f71c-fd4e-444e-bfc6-f8452cb07a5a\": \"75b2f71c-fd4e-444e-bfc6-f8452cb07a5a\", \"50ed7abd-171b-4b08-b5b9-0717b3cbd332\": \"50ed7abd-171b-4b08-b5b9-0717b3cbd332\", \"40613dff-0d75-459c-8bd8-b56a37a9f22b\": \"40613dff-0d75-459c-8bd8-b56a37a9f22b\", \"eb81953b-3be7-4a64-9161-ffee806b3f4f\": \"eb81953b-3be7-4a64-9161-ffee806b3f4f\", \"d794dc51-56bc-4322-8c60-9c30c74c08dd\": \"d794dc51-56bc-4322-8c60-9c30c74c08dd\", \"c30b6719-b863-404c-a9c8-1af1c4d84204\": \"c30b6719-b863-404c-a9c8-1af1c4d84204\", \"b6210038-acad-4a56-861a-8a0ca25ec368\": \"b6210038-acad-4a56-861a-8a0ca25ec368\", \"984b4f01-90f3-4d2b-92e8-fcd28e0b3dfa\": \"984b4f01-90f3-4d2b-92e8-fcd28e0b3dfa\", \"f84ddd7d-efdb-4ef4-a14d-29d09c35f163\": \"f84ddd7d-efdb-4ef4-a14d-29d09c35f163\", \"38dde395-ba0c-492b-b8c1-eba966a3215e\": \"38dde395-ba0c-492b-b8c1-eba966a3215e\", \"3c42c2ce-99ed-4b4a-9b14-52935a35016b\": \"3c42c2ce-99ed-4b4a-9b14-52935a35016b\", \"45a8d50e-a5cb-4f44-a597-4f4217e5b958\": \"45a8d50e-a5cb-4f44-a597-4f4217e5b958\", \"de28eac3-783f-44d5-8649-f1a22b680328\": \"de28eac3-783f-44d5-8649-f1a22b680328\", \"9e5d884e-edbe-43a5-b0d8-7d3e9d1bfd9c\": \"9e5d884e-edbe-43a5-b0d8-7d3e9d1bfd9c\", \"b5c06246-229d-40e5-8ed0-3a5602c255da\": \"b5c06246-229d-40e5-8ed0-3a5602c255da\", \"f8365958-b962-4164-9327-eed6568f0927\": \"f8365958-b962-4164-9327-eed6568f0927\", \"d8346063-3f89-4c61-8263-eeb3e701ab5e\": \"d8346063-3f89-4c61-8263-eeb3e701ab5e\", \"3d956030-6caa-487a-b40b-681310abc327\": \"3d956030-6caa-487a-b40b-681310abc327\", \"0378fed7-e55e-4905-9a1a-da4e5568f5d7\": \"0378fed7-e55e-4905-9a1a-da4e5568f5d7\", \"b2979ec0-00d0-4fd8-bf79-ae67ad28407e\": \"b2979ec0-00d0-4fd8-bf79-ae67ad28407e\", \"f5df7a87-c674-459b-a054-114fc698b7c7\": \"f5df7a87-c674-459b-a054-114fc698b7c7\", \"e406bd30-5f15-44c3-8212-41e21dad1803\": \"e406bd30-5f15-44c3-8212-41e21dad1803\", \"54b314c2-4ca4-4e40-b268-d66ee3983586\": \"54b314c2-4ca4-4e40-b268-d66ee3983586\", \"30719e21-6d94-469f-8488-2a814d50233a\": \"30719e21-6d94-469f-8488-2a814d50233a\", \"07473fd1-5c9d-424d-8a89-1e51ad1c040c\": \"07473fd1-5c9d-424d-8a89-1e51ad1c040c\", \"32a189ec-e045-4a04-b319-db438e60ef41\": \"32a189ec-e045-4a04-b319-db438e60ef41\", \"600c973a-10b8-4805-9d65-5223bcfacf1a\": \"600c973a-10b8-4805-9d65-5223bcfacf1a\", \"ccab04a9-2a6c-4e3d-b787-bdd4b4210ab0\": \"ccab04a9-2a6c-4e3d-b787-bdd4b4210ab0\", \"bf5329a9-b14a-44f4-8c15-25903bfbac12\": \"bf5329a9-b14a-44f4-8c15-25903bfbac12\", \"3ab4b0b5-76c4-4c3b-9f3a-68838fac3ce2\": \"3ab4b0b5-76c4-4c3b-9f3a-68838fac3ce2\", \"0fc81356-e20e-4092-a847-65e5a8fdf30b\": \"0fc81356-e20e-4092-a847-65e5a8fdf30b\", \"62687a8e-5276-42fe-ae0b-b0d0a56d7922\": \"62687a8e-5276-42fe-ae0b-b0d0a56d7922\", \"13513327-37cb-4317-838e-8af402d3d32b\": \"13513327-37cb-4317-838e-8af402d3d32b\", \"ac606a0a-c092-43af-bcf9-5b8973d0b3d5\": \"ac606a0a-c092-43af-bcf9-5b8973d0b3d5\", \"83eec57a-feef-4ac0-a18e-48a3171eb007\": \"83eec57a-feef-4ac0-a18e-48a3171eb007\", \"b021f3f2-97cd-448e-a9cd-d37524ac1bea\": \"b021f3f2-97cd-448e-a9cd-d37524ac1bea\", \"759bdb8a-fdc8-4759-a2ae-fb5f884fe77f\": \"759bdb8a-fdc8-4759-a2ae-fb5f884fe77f\", \"a79907ba-4374-4ea4-a565-e68d72b0d0e9\": \"a79907ba-4374-4ea4-a565-e68d72b0d0e9\", \"1f7661bd-cd8f-4e35-8c56-53dea354acc9\": \"1f7661bd-cd8f-4e35-8c56-53dea354acc9\", \"961f8882-8384-4518-9c47-e268633568a9\": \"961f8882-8384-4518-9c47-e268633568a9\", \"037dbeac-6f59-49b7-a72e-626ed0db3aab\": \"037dbeac-6f59-49b7-a72e-626ed0db3aab\", \"b2e6e104-f8c5-4129-aa2c-246f02c0e61c\": \"b2e6e104-f8c5-4129-aa2c-246f02c0e61c\", \"4803a9d6-d00f-4db5-828e-9d9983788c67\": \"4803a9d6-d00f-4db5-828e-9d9983788c67\", \"07bfa0ff-9419-4782-a2e0-1448ddc76c57\": \"07bfa0ff-9419-4782-a2e0-1448ddc76c57\", \"41bcf934-e84c-46cd-a687-bedccb4007bb\": \"41bcf934-e84c-46cd-a687-bedccb4007bb\", \"d594a9c6-5154-4cce-b6bd-03f29c2b7a94\": \"d594a9c6-5154-4cce-b6bd-03f29c2b7a94\", \"5c4d8218-9e6f-4bb7-a2ad-0d6182f015bf\": \"5c4d8218-9e6f-4bb7-a2ad-0d6182f015bf\", \"864f410a-c078-4246-96dc-3563c64b2ad4\": \"864f410a-c078-4246-96dc-3563c64b2ad4\", \"bde84acf-5a34-4fa8-9ad5-2fc6a34cfc72\": \"bde84acf-5a34-4fa8-9ad5-2fc6a34cfc72\", \"a914a44a-426e-4dc3-a7ec-460bba7db6a7\": \"a914a44a-426e-4dc3-a7ec-460bba7db6a7\", \"c0b43229-f029-4a7e-a2e0-3b1ff69b23d9\": \"c0b43229-f029-4a7e-a2e0-3b1ff69b23d9\", \"f174fe09-0f38-42f4-81b7-be4ede1115e9\": \"f174fe09-0f38-42f4-81b7-be4ede1115e9\", \"f9894dd7-c5db-4a18-8608-c519dba13637\": \"f9894dd7-c5db-4a18-8608-c519dba13637\", \"135f0cf7-4d85-439f-8a1f-894303b5bc8a\": \"135f0cf7-4d85-439f-8a1f-894303b5bc8a\", \"d2525a7d-806f-4825-9f83-c2f9d875a356\": \"d2525a7d-806f-4825-9f83-c2f9d875a356\", \"4cf65231-a7e5-4c4a-853f-62b1b5fffca9\": \"4cf65231-a7e5-4c4a-853f-62b1b5fffca9\", \"108fe1f0-a695-4a1a-8014-19ca0f75af4b\": \"108fe1f0-a695-4a1a-8014-19ca0f75af4b\", \"1bbf7b95-f1d6-4dc5-801f-10b6eaa0e4e5\": \"1bbf7b95-f1d6-4dc5-801f-10b6eaa0e4e5\", \"732d2f42-1d11-43fb-aeda-677360926c0d\": \"732d2f42-1d11-43fb-aeda-677360926c0d\", \"48bb5d05-a6bc-465d-9b9b-2fd4622bdc79\": \"48bb5d05-a6bc-465d-9b9b-2fd4622bdc79\", \"cda3fae8-3798-4820-836c-51b0cbf177b1\": \"cda3fae8-3798-4820-836c-51b0cbf177b1\", \"aa04ad0c-c8fb-400f-a7c7-e8f9aea9f322\": \"aa04ad0c-c8fb-400f-a7c7-e8f9aea9f322\", \"8accdf20-69d4-4df1-82b0-66e8ce08123f\": \"8accdf20-69d4-4df1-82b0-66e8ce08123f\", \"6432650b-0522-44be-b8c1-cb3c967a83b1\": \"6432650b-0522-44be-b8c1-cb3c967a83b1\", \"2104986f-6544-4e2c-b242-abcb1439a1dc\": \"2104986f-6544-4e2c-b242-abcb1439a1dc\", \"0fe9589f-a38b-44bf-802a-313f40edbbe4\": \"0fe9589f-a38b-44bf-802a-313f40edbbe4\", \"088639c1-dcbd-4116-bd68-34dabcd0bdb2\": \"088639c1-dcbd-4116-bd68-34dabcd0bdb2\", \"9127abcc-7200-49be-96ea-efbe98d63422\": \"9127abcc-7200-49be-96ea-efbe98d63422\", \"60eb7526-d7c2-454a-a48a-9216993ca344\": \"60eb7526-d7c2-454a-a48a-9216993ca344\", \"cd68dbdd-74aa-4532-a790-603d556c7ea2\": \"cd68dbdd-74aa-4532-a790-603d556c7ea2\", \"0a92d490-10bf-478c-aab0-1fec8209fbf6\": \"0a92d490-10bf-478c-aab0-1fec8209fbf6\", \"d2cf8f7d-bfbf-4b67-a9b6-34fc8421e606\": \"d2cf8f7d-bfbf-4b67-a9b6-34fc8421e606\", \"36f7ec21-599e-4fd0-85a4-9198122c9b97\": \"36f7ec21-599e-4fd0-85a4-9198122c9b97\", \"4548023f-fa23-4779-8fdc-238c6476a02a\": \"4548023f-fa23-4779-8fdc-238c6476a02a\", \"678e5dbe-4647-48d8-b93e-5b3b680e637c\": \"678e5dbe-4647-48d8-b93e-5b3b680e637c\", \"30146be2-b22b-4469-b11e-0797a7d6a858\": \"30146be2-b22b-4469-b11e-0797a7d6a858\", \"3e6f83bd-0ea7-4dbd-9b6a-2cdd405200b0\": \"3e6f83bd-0ea7-4dbd-9b6a-2cdd405200b0\", \"38e9cc9f-0ea3-42d4-bc6b-1b1a74591397\": \"38e9cc9f-0ea3-42d4-bc6b-1b1a74591397\", \"bb4bb559-ae42-4da1-8e57-10684473bb86\": \"bb4bb559-ae42-4da1-8e57-10684473bb86\", \"4c3ccc2c-11ad-4a81-8bb9-620acc53bced\": \"4c3ccc2c-11ad-4a81-8bb9-620acc53bced\", \"18e24564-40c3-4792-b1df-f8fba5dcf5c9\": \"18e24564-40c3-4792-b1df-f8fba5dcf5c9\", \"bad05950-4756-43c0-a4df-5f13bb08eb1e\": \"bad05950-4756-43c0-a4df-5f13bb08eb1e\", \"e06a56c6-6c89-4c4e-a458-7d019700a07d\": \"e06a56c6-6c89-4c4e-a458-7d019700a07d\", \"bb1c500c-4e30-47e3-9571-283b1ace40eb\": \"bb1c500c-4e30-47e3-9571-283b1ace40eb\", \"4c60ec65-97b7-4957-8ce2-5fc4f4322a86\": \"4c60ec65-97b7-4957-8ce2-5fc4f4322a86\", \"16111680-7c52-4f36-8454-03af33283a9f\": \"16111680-7c52-4f36-8454-03af33283a9f\", \"9145eb03-01cc-4314-b8e7-1200ceee4f6d\": \"9145eb03-01cc-4314-b8e7-1200ceee4f6d\", \"d6bdb389-4290-4c3b-9bd8-30a212f7f1c3\": \"d6bdb389-4290-4c3b-9bd8-30a212f7f1c3\", \"162c00a9-1627-49de-bfb1-53f9c886b699\": \"162c00a9-1627-49de-bfb1-53f9c886b699\", \"5dfedece-5111-4b19-8d72-24f024f7c8aa\": \"5dfedece-5111-4b19-8d72-24f024f7c8aa\", \"1922c3b7-0187-4ecf-af2f-9a9d5074aa83\": \"1922c3b7-0187-4ecf-af2f-9a9d5074aa83\", \"6515a409-9885-4091-b928-35bf65a04d24\": \"6515a409-9885-4091-b928-35bf65a04d24\", \"3bb8e874-9bc9-43b6-a64d-cb3e87bee957\": \"3bb8e874-9bc9-43b6-a64d-cb3e87bee957\", \"8a5005ce-6afd-45eb-b266-025b1c3e4411\": \"8a5005ce-6afd-45eb-b266-025b1c3e4411\", \"0f6ed898-8748-419a-8847-89b9acf42d1d\": \"0f6ed898-8748-419a-8847-89b9acf42d1d\", \"46f5eb5a-5fda-4a98-83ca-f27a716a2c31\": \"46f5eb5a-5fda-4a98-83ca-f27a716a2c31\", \"f3c12aab-e3cb-48e5-a957-735b5cb86bae\": \"f3c12aab-e3cb-48e5-a957-735b5cb86bae\", \"745f47b4-d7b7-4b7b-b551-25b34669d5d8\": \"745f47b4-d7b7-4b7b-b551-25b34669d5d8\", \"f9cda98f-df47-464a-9f55-cf4eab2b5a11\": \"f9cda98f-df47-464a-9f55-cf4eab2b5a11\", \"130e8536-a87c-40f3-a0fb-9c2815c321c0\": \"130e8536-a87c-40f3-a0fb-9c2815c321c0\", \"5148b7b9-a08c-41be-9381-90e4caa2d926\": \"5148b7b9-a08c-41be-9381-90e4caa2d926\", \"8d721640-4bbb-4296-98ef-e6715b5230a2\": \"8d721640-4bbb-4296-98ef-e6715b5230a2\", \"a38e95a8-99c6-411d-ae1f-5428b5dbcd89\": \"a38e95a8-99c6-411d-ae1f-5428b5dbcd89\", \"58e7c697-6043-4a39-922f-49f3538360d0\": \"58e7c697-6043-4a39-922f-49f3538360d0\", \"71ad09fb-45cb-4209-ae77-0eef47aacbb3\": \"71ad09fb-45cb-4209-ae77-0eef47aacbb3\", \"e52ca55e-4588-481d-9662-f35a4969da49\": \"e52ca55e-4588-481d-9662-f35a4969da49\", \"dc41d413-e031-43c9-9094-eee4b0fa2475\": \"dc41d413-e031-43c9-9094-eee4b0fa2475\", \"2782f86e-c394-431a-bd7f-48a2b84c5106\": \"2782f86e-c394-431a-bd7f-48a2b84c5106\", \"90d7f560-033a-45da-8949-c542dd9def38\": \"90d7f560-033a-45da-8949-c542dd9def38\", \"3affe4ad-acc1-4a24-b502-d2c4d8db6e27\": \"3affe4ad-acc1-4a24-b502-d2c4d8db6e27\", \"e0294a45-04be-426d-8695-877dec1d47c1\": \"e0294a45-04be-426d-8695-877dec1d47c1\", \"b73104d8-e600-49bf-b5f9-cd20a8d22e5f\": \"b73104d8-e600-49bf-b5f9-cd20a8d22e5f\", \"3c197744-96f7-4169-9f82-5d928904314c\": \"3c197744-96f7-4169-9f82-5d928904314c\", \"2b3fdc2a-886d-4e43-8de3-77a0d217b5d8\": \"2b3fdc2a-886d-4e43-8de3-77a0d217b5d8\", \"bdbaeab7-bb55-40a9-8b7f-253fa6e17a5a\": \"bdbaeab7-bb55-40a9-8b7f-253fa6e17a5a\", \"54b5486d-0282-44fb-9533-e73cc9ced299\": \"54b5486d-0282-44fb-9533-e73cc9ced299\", \"75c8a5a8-2651-4dca-8321-5fc8f7f4219c\": \"75c8a5a8-2651-4dca-8321-5fc8f7f4219c\", \"86a6d6cf-8361-4fe9-8ec7-cbda27a754c3\": \"86a6d6cf-8361-4fe9-8ec7-cbda27a754c3\", \"2194a8a0-58ee-4d31-badb-baf5ada588ee\": \"2194a8a0-58ee-4d31-badb-baf5ada588ee\", \"e5e9e278-8ef0-45f4-bcc9-f0f4d85a2063\": \"e5e9e278-8ef0-45f4-bcc9-f0f4d85a2063\", \"a57cb858-09db-40cc-80ab-ed77228665ce\": \"a57cb858-09db-40cc-80ab-ed77228665ce\", \"32323564-20c1-49f4-9b4b-cc1cbbe74b33\": \"32323564-20c1-49f4-9b4b-cc1cbbe74b33\", \"d350d4e8-9967-4410-b2ca-4b35896d777b\": \"d350d4e8-9967-4410-b2ca-4b35896d777b\", \"2d802987-3571-4977-8abc-78779e076dea\": \"2d802987-3571-4977-8abc-78779e076dea\", \"c628f193-6948-41c3-b7b4-7d5253ee04d5\": \"c628f193-6948-41c3-b7b4-7d5253ee04d5\", \"ebb5cb20-cab0-4245-935e-716388e69b8a\": \"ebb5cb20-cab0-4245-935e-716388e69b8a\", \"7ac3d273-ff0d-4283-b9a9-d926d62f3a37\": \"7ac3d273-ff0d-4283-b9a9-d926d62f3a37\", \"39ba109f-1852-4dbf-914d-aec6434c03da\": \"39ba109f-1852-4dbf-914d-aec6434c03da\", \"0c993375-ffb6-4ffd-bf95-fce01d420421\": \"0c993375-ffb6-4ffd-bf95-fce01d420421\", \"c4b3343f-4f30-4a1a-80c8-55e419fba987\": \"c4b3343f-4f30-4a1a-80c8-55e419fba987\", \"3a9f9365-127f-4b83-b296-658bf52c7bc0\": \"3a9f9365-127f-4b83-b296-658bf52c7bc0\", \"05cc10fb-7084-4731-bef1-95fe31b811af\": \"05cc10fb-7084-4731-bef1-95fe31b811af\", \"b6f83b8d-5b6f-475e-853b-aae7e5cea877\": \"b6f83b8d-5b6f-475e-853b-aae7e5cea877\", \"cd28e351-ddef-497e-9b76-e115981d61cf\": \"cd28e351-ddef-497e-9b76-e115981d61cf\", \"07346672-8c4b-41dd-83b7-80a379fe1565\": \"07346672-8c4b-41dd-83b7-80a379fe1565\", \"1744f3a3-6366-4b2b-9744-baf583041ee9\": \"1744f3a3-6366-4b2b-9744-baf583041ee9\", \"1a994dd5-9e60-45c6-a676-8f0f5e2f734a\": \"1a994dd5-9e60-45c6-a676-8f0f5e2f734a\", \"6b2b11dd-9961-4b8c-81e0-840bcc273f43\": \"6b2b11dd-9961-4b8c-81e0-840bcc273f43\", \"78858f68-acdc-4c09-9190-aac326fbfd46\": \"78858f68-acdc-4c09-9190-aac326fbfd46\", \"ac0b354c-e6e1-4bd8-80ce-0a02f042a40c\": \"ac0b354c-e6e1-4bd8-80ce-0a02f042a40c\", \"2a002f2a-406b-41ef-b8e5-df1f9f3d1459\": \"2a002f2a-406b-41ef-b8e5-df1f9f3d1459\", \"864eed31-2af2-43cd-aadc-3ada12d2bd37\": \"864eed31-2af2-43cd-aadc-3ada12d2bd37\", \"5e02b96c-d75e-4c9e-bcb4-c183016b677d\": \"5e02b96c-d75e-4c9e-bcb4-c183016b677d\", \"c20196eb-86ce-43b6-ad2c-49d6a0ede806\": \"c20196eb-86ce-43b6-ad2c-49d6a0ede806\", \"d023f817-7bab-4073-a7c9-0054a97cf30b\": \"d023f817-7bab-4073-a7c9-0054a97cf30b\", \"6e946557-0e6c-49b0-b74a-b9a1cc9065d3\": \"6e946557-0e6c-49b0-b74a-b9a1cc9065d3\", \"aa347ac5-4e51-4b79-a97f-269543e8ad7a\": \"aa347ac5-4e51-4b79-a97f-269543e8ad7a\", \"a027221f-59c0-4df0-8dff-2f76d7a07589\": \"a027221f-59c0-4df0-8dff-2f76d7a07589\", \"ab06db72-37c7-4923-bd12-e40cb4243b35\": \"ab06db72-37c7-4923-bd12-e40cb4243b35\", \"5e849a9e-a16c-4d77-b134-0f3216ff88e4\": \"5e849a9e-a16c-4d77-b134-0f3216ff88e4\", \"53476336-5ef5-40fc-8513-e6304c9c1ecf\": \"53476336-5ef5-40fc-8513-e6304c9c1ecf\", \"b937c17d-67d7-46c8-9e9d-e8980dad8f6a\": \"b937c17d-67d7-46c8-9e9d-e8980dad8f6a\", \"c5d0a2c5-1f2a-479a-9958-6ebc25f6561c\": \"c5d0a2c5-1f2a-479a-9958-6ebc25f6561c\", \"b615f82e-c587-43bf-8862-9525cfdc26a0\": \"b615f82e-c587-43bf-8862-9525cfdc26a0\", \"e32f79cc-56e4-40a4-b4c7-8f8c11d8727e\": \"e32f79cc-56e4-40a4-b4c7-8f8c11d8727e\", \"1ef62832-721e-4745-831f-aa7794c0d709\": \"1ef62832-721e-4745-831f-aa7794c0d709\", \"8442adda-daa8-4b81-a43d-0af7f7260ede\": \"8442adda-daa8-4b81-a43d-0af7f7260ede\", \"825c7262-d7dd-4d54-9da0-03ac3417327d\": \"825c7262-d7dd-4d54-9da0-03ac3417327d\", \"fea887cf-d063-40ee-b78e-b2dd5dbc4af2\": \"fea887cf-d063-40ee-b78e-b2dd5dbc4af2\", \"68d9bf4f-9ed8-482f-857e-d72c93d6e774\": \"68d9bf4f-9ed8-482f-857e-d72c93d6e774\", \"252d5cc8-2e59-468a-8583-a95c33bb6dc2\": \"252d5cc8-2e59-468a-8583-a95c33bb6dc2\", \"1e182d65-3278-4626-8bec-4e8bb469461f\": \"1e182d65-3278-4626-8bec-4e8bb469461f\", \"461f2408-f095-4456-9794-086ec0e8a76b\": \"461f2408-f095-4456-9794-086ec0e8a76b\", \"78ee597c-11b5-43a5-b235-77ba2b5a80c0\": \"78ee597c-11b5-43a5-b235-77ba2b5a80c0\", \"a4cd941a-edcc-466d-8520-a51341952728\": \"a4cd941a-edcc-466d-8520-a51341952728\", \"53e90676-4854-4491-8dec-12f8fa47119e\": \"53e90676-4854-4491-8dec-12f8fa47119e\", \"911c663e-dcbe-438d-953d-8c6f58132522\": \"911c663e-dcbe-438d-953d-8c6f58132522\", \"399cf741-31b4-4561-9d61-78f9a7870bef\": \"399cf741-31b4-4561-9d61-78f9a7870bef\", \"800142ff-7684-4f77-a942-df706dac8bce\": \"800142ff-7684-4f77-a942-df706dac8bce\", \"a6b8b931-1f15-4b73-ac3d-7ba9bf55744c\": \"a6b8b931-1f15-4b73-ac3d-7ba9bf55744c\", \"c6a45a27-f159-4b9e-b446-fbafac5dd84f\": \"c6a45a27-f159-4b9e-b446-fbafac5dd84f\", \"d6a35b3c-98d2-462f-8d2a-f537b51c6df4\": \"d6a35b3c-98d2-462f-8d2a-f537b51c6df4\", \"bbb3e7f9-4748-44bd-9a9a-bf12cc0fa374\": \"bbb3e7f9-4748-44bd-9a9a-bf12cc0fa374\", \"9f24e144-f567-46d0-9e8c-f85f4e66ffca\": \"9f24e144-f567-46d0-9e8c-f85f4e66ffca\", \"a5d8a041-ebb0-439e-a4ac-0fcc0841f304\": \"a5d8a041-ebb0-439e-a4ac-0fcc0841f304\", \"d06a2707-7dd0-42a9-900b-f67b85319e38\": \"d06a2707-7dd0-42a9-900b-f67b85319e38\", \"69a6e0ad-b969-4fcc-b712-78ff9220a227\": \"69a6e0ad-b969-4fcc-b712-78ff9220a227\", \"dec29423-c682-4da7-bd68-3badbde6e38d\": \"dec29423-c682-4da7-bd68-3badbde6e38d\", \"872ebe7a-e729-4933-b465-de1db30e4ee4\": \"872ebe7a-e729-4933-b465-de1db30e4ee4\", \"6c826a5e-957c-4506-aa42-3e93f5888f50\": \"6c826a5e-957c-4506-aa42-3e93f5888f50\", \"46b0437b-6327-4e69-9826-d2494bb43f98\": \"46b0437b-6327-4e69-9826-d2494bb43f98\", \"82e2f4c8-0009-4504-9393-703ada46c88f\": \"82e2f4c8-0009-4504-9393-703ada46c88f\", \"0d099488-4ce1-40a5-bcf6-05c6fb0b15c2\": \"0d099488-4ce1-40a5-bcf6-05c6fb0b15c2\", \"376a5e26-526d-4393-9c85-2c82a4ea6524\": \"376a5e26-526d-4393-9c85-2c82a4ea6524\", \"062e9bb3-423c-422f-8725-19c75caa063f\": \"062e9bb3-423c-422f-8725-19c75caa063f\", \"2aaf6e8e-aabf-48dc-98e2-cd4db6e48652\": \"2aaf6e8e-aabf-48dc-98e2-cd4db6e48652\", \"ee61b73e-a30d-4200-9609-00947fc260bf\": \"ee61b73e-a30d-4200-9609-00947fc260bf\", \"c5de8191-0d00-4cab-be86-c7d421f0e552\": \"c5de8191-0d00-4cab-be86-c7d421f0e552\", \"edd0e35b-c4f7-4061-84ce-50ee4e8a6fe0\": \"edd0e35b-c4f7-4061-84ce-50ee4e8a6fe0\", \"9889a92c-e6da-4de3-acce-1107bb6dc377\": \"9889a92c-e6da-4de3-acce-1107bb6dc377\", \"f8bd23b8-ce39-4f55-95b9-4233630bf156\": \"f8bd23b8-ce39-4f55-95b9-4233630bf156\", \"059521f2-e734-4caf-8af6-8d2bee7a3d7f\": \"059521f2-e734-4caf-8af6-8d2bee7a3d7f\", \"f36c1a2c-d170-4b30-96f3-18e25984c85d\": \"f36c1a2c-d170-4b30-96f3-18e25984c85d\", \"c8a98b11-7fe5-46e1-b162-cddc8e9ebd8b\": \"c8a98b11-7fe5-46e1-b162-cddc8e9ebd8b\", \"40b28347-ec98-4e8f-afdf-48fdc06c6c4c\": \"40b28347-ec98-4e8f-afdf-48fdc06c6c4c\", \"718860fe-aee3-49aa-94f7-d494ccbcabef\": \"718860fe-aee3-49aa-94f7-d494ccbcabef\", \"96248987-3e1c-41a5-acbf-72bff3743839\": \"96248987-3e1c-41a5-acbf-72bff3743839\", \"820e7f31-75c5-4bc3-951d-c7b1492086ec\": \"820e7f31-75c5-4bc3-951d-c7b1492086ec\", \"1a0f1bbf-8aa6-480c-af4a-8ee4c5532876\": \"1a0f1bbf-8aa6-480c-af4a-8ee4c5532876\", \"3b7ade87-33d6-4b59-9353-457de126c3e1\": \"3b7ade87-33d6-4b59-9353-457de126c3e1\", \"4139e208-d3fd-463c-8b60-05e46c6dc009\": \"4139e208-d3fd-463c-8b60-05e46c6dc009\", \"125067c4-ee6a-4379-bc0b-fc2daf453dbd\": \"125067c4-ee6a-4379-bc0b-fc2daf453dbd\", \"2421b262-b3e8-4578-a640-9ffa5457ce55\": \"2421b262-b3e8-4578-a640-9ffa5457ce55\", \"5422801f-5028-44e3-aac3-ded06ae381eb\": \"5422801f-5028-44e3-aac3-ded06ae381eb\", \"348fa801-bdc0-42e9-91ac-e78a0c5cee8a\": \"348fa801-bdc0-42e9-91ac-e78a0c5cee8a\", \"751806ba-fe9c-47a1-9b9d-0a95ee3f072c\": \"751806ba-fe9c-47a1-9b9d-0a95ee3f072c\", \"79045798-2a15-4cdf-85a3-6337c0c150d8\": \"79045798-2a15-4cdf-85a3-6337c0c150d8\", \"5d74614b-5058-49ef-893e-5c86feed2d3e\": \"5d74614b-5058-49ef-893e-5c86feed2d3e\", \"ec582e0f-784f-40a5-a466-1aaac7c5eb47\": \"ec582e0f-784f-40a5-a466-1aaac7c5eb47\", \"8344ca7d-4cd7-4fdc-86d8-7e692824b317\": \"8344ca7d-4cd7-4fdc-86d8-7e692824b317\", \"7eebe43e-6862-4786-b7e5-c1a57d4fbc22\": \"7eebe43e-6862-4786-b7e5-c1a57d4fbc22\", \"ef3cbf2a-0323-48d6-adc9-839b0cec66c8\": \"ef3cbf2a-0323-48d6-adc9-839b0cec66c8\", \"2e3c702a-4b28-4d09-bec5-b4eedb0f449e\": \"2e3c702a-4b28-4d09-bec5-b4eedb0f449e\", \"70521719-ae02-4ee2-aaa5-05ce51d17953\": \"70521719-ae02-4ee2-aaa5-05ce51d17953\", \"4da1ac66-918a-4902-817f-1e0145da5c39\": \"4da1ac66-918a-4902-817f-1e0145da5c39\", \"2a22d6f9-aef1-492d-8966-dcc0276bf5a0\": \"2a22d6f9-aef1-492d-8966-dcc0276bf5a0\", \"de879882-1fcf-497d-9d16-2552f934ebda\": \"de879882-1fcf-497d-9d16-2552f934ebda\", \"ba919c7f-41ff-45de-a703-68e4b08245f0\": \"ba919c7f-41ff-45de-a703-68e4b08245f0\", \"b4ef9922-8a37-4250-ae82-7afca1355f7b\": \"b4ef9922-8a37-4250-ae82-7afca1355f7b\", \"2108d5a8-e98d-4f86-8922-d020996f70eb\": \"2108d5a8-e98d-4f86-8922-d020996f70eb\", \"5f6a6b97-ac82-48d6-92db-616bc0d6d9f7\": \"5f6a6b97-ac82-48d6-92db-616bc0d6d9f7\", \"3ee10ba7-48da-4e2f-943b-4907cd160ef0\": \"3ee10ba7-48da-4e2f-943b-4907cd160ef0\", \"bfb3c2f2-4cae-4491-904e-b13292ff89bd\": \"bfb3c2f2-4cae-4491-904e-b13292ff89bd\", \"bd3f1951-9db2-48ea-a7a5-24eda8962736\": \"bd3f1951-9db2-48ea-a7a5-24eda8962736\", \"ec313f78-4a44-4662-a662-e3d328c92983\": \"ec313f78-4a44-4662-a662-e3d328c92983\", \"36ba93d8-f818-4ba6-a8ab-47e82701ec64\": \"36ba93d8-f818-4ba6-a8ab-47e82701ec64\", \"d85287ec-7ae8-435f-9f60-0b8bafc091b7\": \"d85287ec-7ae8-435f-9f60-0b8bafc091b7\", \"929fe17a-e4b1-4485-8495-ccddc05ecb85\": \"929fe17a-e4b1-4485-8495-ccddc05ecb85\", \"4f8987e2-0266-4936-8777-b57224e7e888\": \"4f8987e2-0266-4936-8777-b57224e7e888\", \"197f1d66-f717-4051-b09f-b6d2a9382789\": \"197f1d66-f717-4051-b09f-b6d2a9382789\", \"c9a6a8f1-9784-45b0-aca5-4f4cdf7463b3\": \"c9a6a8f1-9784-45b0-aca5-4f4cdf7463b3\", \"7560a71f-0fc9-459c-934c-f75b37e0809f\": \"7560a71f-0fc9-459c-934c-f75b37e0809f\", \"ce3cb3b0-f059-4a13-9708-1dfcfad1d505\": \"ce3cb3b0-f059-4a13-9708-1dfcfad1d505\", \"26d70240-3004-40bd-bb44-2e99a921917c\": \"26d70240-3004-40bd-bb44-2e99a921917c\", \"1dd33758-f5df-4202-bd01-408c05f0c98b\": \"1dd33758-f5df-4202-bd01-408c05f0c98b\", \"f4b032c7-bafe-496e-a91a-7532415dc651\": \"f4b032c7-bafe-496e-a91a-7532415dc651\", \"2255ec4a-1aed-4afb-a456-4afd215f1981\": \"2255ec4a-1aed-4afb-a456-4afd215f1981\", \"0e5b4d96-afb6-40a8-a5be-294805c64d3f\": \"0e5b4d96-afb6-40a8-a5be-294805c64d3f\", \"8ba0416b-f68a-4020-8f5e-0b54f0ee601f\": \"8ba0416b-f68a-4020-8f5e-0b54f0ee601f\", \"3d538447-e148-4052-bd6a-9ce29c0b30f7\": \"3d538447-e148-4052-bd6a-9ce29c0b30f7\", \"0775e2af-6fb1-47b7-aeb6-55e5761fdbeb\": \"0775e2af-6fb1-47b7-aeb6-55e5761fdbeb\", \"b332edc9-182f-438c-ae36-53bdd53339bb\": \"b332edc9-182f-438c-ae36-53bdd53339bb\", \"fdeb84de-5c93-4bc3-97af-cf1e5fc54b2f\": \"fdeb84de-5c93-4bc3-97af-cf1e5fc54b2f\", \"859ebd4d-b1f9-43c5-9e84-adfab8875b99\": \"859ebd4d-b1f9-43c5-9e84-adfab8875b99\", \"185902f4-933f-445a-94d9-96c14d295218\": \"185902f4-933f-445a-94d9-96c14d295218\", \"f134b9cf-64d8-4376-bf1b-6be7a9807cac\": \"f134b9cf-64d8-4376-bf1b-6be7a9807cac\", \"6eb8711b-799f-4a36-aa71-2d357621786b\": \"6eb8711b-799f-4a36-aa71-2d357621786b\", \"65a62575-9486-4776-b0a3-ffbf013dc3f7\": \"65a62575-9486-4776-b0a3-ffbf013dc3f7\", \"ee653d01-b32a-49ad-a59f-da81f9c6b9db\": \"ee653d01-b32a-49ad-a59f-da81f9c6b9db\", \"4276fc73-6f53-4cb2-9e57-a5f475ec1108\": \"4276fc73-6f53-4cb2-9e57-a5f475ec1108\", \"349772dd-190e-4886-b5e8-eb17d5c7370c\": \"349772dd-190e-4886-b5e8-eb17d5c7370c\", \"d18743de-3626-478d-ba7b-12f6d849d78a\": \"d18743de-3626-478d-ba7b-12f6d849d78a\", \"b84ac5ab-6a56-443b-bd3a-79545461a8ec\": \"b84ac5ab-6a56-443b-bd3a-79545461a8ec\", \"6b91208e-d832-4320-be56-5fd540c54272\": \"6b91208e-d832-4320-be56-5fd540c54272\", \"d399f63a-acd1-47bc-97d2-f68cee37eeeb\": \"d399f63a-acd1-47bc-97d2-f68cee37eeeb\", \"b9a808b0-f4ae-4c4d-a143-8ec4a06e6744\": \"b9a808b0-f4ae-4c4d-a143-8ec4a06e6744\", \"71372737-31f7-45e9-8db9-0d2dc7248886\": \"71372737-31f7-45e9-8db9-0d2dc7248886\", \"a7bf8328-1a68-4064-85a9-c969a91dcd4d\": \"a7bf8328-1a68-4064-85a9-c969a91dcd4d\", \"81dfe0b8-8793-40dd-a83e-ad821409e904\": \"81dfe0b8-8793-40dd-a83e-ad821409e904\", \"87826348-cf59-4f7e-9da5-59d493a95215\": \"87826348-cf59-4f7e-9da5-59d493a95215\", \"bd918fa5-b4cb-4347-b389-7735eb3eeb33\": \"bd918fa5-b4cb-4347-b389-7735eb3eeb33\", \"0260b144-895f-4616-b443-0197629475a6\": \"0260b144-895f-4616-b443-0197629475a6\", \"c6f2daee-c24b-4f62-9076-a094953050ab\": \"c6f2daee-c24b-4f62-9076-a094953050ab\", \"1d874f84-e2fb-4f3b-9680-c856d279b1ca\": \"1d874f84-e2fb-4f3b-9680-c856d279b1ca\", \"9a82ad6d-05b7-4d6a-acc8-3364fc5a009a\": \"9a82ad6d-05b7-4d6a-acc8-3364fc5a009a\"}, \"doc_id_dict\": {}, \"embeddings_dict\": {}}"}}}
|
main.py
ADDED
|
@@ -0,0 +1,643 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import random
|
| 2 |
+
import re
|
| 3 |
+
import time
|
| 4 |
+
import urllib.parse
|
| 5 |
+
from dataclasses import dataclass, field
|
| 6 |
+
from typing import Generator, Literal
|
| 7 |
+
|
| 8 |
+
from docs_index import NodeWithScore, ask, retrieve
|
| 9 |
+
|
| 10 |
+
import mesop as me
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
def on_load(e: me.LoadEvent):
|
| 14 |
+
state = me.state(State)
|
| 15 |
+
state.examples = random.sample(EXAMPLES, 3)
|
| 16 |
+
if "prompt" in me.query_params:
|
| 17 |
+
state.initial_input = me.query_params["prompt"]
|
| 18 |
+
me.set_theme_mode("system")
|
| 19 |
+
yield
|
| 20 |
+
me.focus_component(key=f"input-{len(state.output)}")
|
| 21 |
+
yield
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
@me.page(
|
| 25 |
+
on_load=on_load,
|
| 26 |
+
security_policy=me.SecurityPolicy(
|
| 27 |
+
allowed_script_srcs=[
|
| 28 |
+
"https://cdn.jsdelivr.net",
|
| 29 |
+
],
|
| 30 |
+
allowed_iframe_parents=[
|
| 31 |
+
"https://huggingface.co",
|
| 32 |
+
"https://mesop-dev.github.io",
|
| 33 |
+
"http://localhost:*",
|
| 34 |
+
],
|
| 35 |
+
),
|
| 36 |
+
title="Mesop Docs Chat",
|
| 37 |
+
)
|
| 38 |
+
def page():
|
| 39 |
+
frame_listener()
|
| 40 |
+
return chat()
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
Role = Literal["user", "assistant"]
|
| 44 |
+
|
| 45 |
+
_ROLE_USER = "user"
|
| 46 |
+
_ROLE_ASSISTANT = "assistant"
|
| 47 |
+
|
| 48 |
+
_BOT_USER_DEFAULT = "Mesop Docs Bot"
|
| 49 |
+
|
| 50 |
+
_COLOR_BACKGROUND = me.theme_var("background")
|
| 51 |
+
|
| 52 |
+
_DEFAULT_PADDING = me.Padding.all(12)
|
| 53 |
+
|
| 54 |
+
_LABEL_BUTTON = "send"
|
| 55 |
+
_LABEL_BUTTON_IN_PROGRESS = "pending"
|
| 56 |
+
_LABEL_INPUT = "Ask Mesop Docs Bot"
|
| 57 |
+
|
| 58 |
+
_STYLE_APP_CONTAINER = me.Style(
|
| 59 |
+
background=_COLOR_BACKGROUND,
|
| 60 |
+
display="flex",
|
| 61 |
+
flex_direction="column",
|
| 62 |
+
height="100%",
|
| 63 |
+
)
|
| 64 |
+
_STYLE_TITLE = me.Style(padding=me.Padding(left=10))
|
| 65 |
+
_STYLE_CHAT_BOX = me.Style(
|
| 66 |
+
height="100%",
|
| 67 |
+
overflow_y="scroll",
|
| 68 |
+
padding=_DEFAULT_PADDING,
|
| 69 |
+
background=me.theme_var("background"),
|
| 70 |
+
)
|
| 71 |
+
|
| 72 |
+
_STYLE_CHAT_BUTTON = me.Style(margin=me.Margin(top=8, left=8))
|
| 73 |
+
_STYLE_CHAT_BUBBLE_NAME = me.Style(
|
| 74 |
+
font_weight="bold",
|
| 75 |
+
font_size="13px",
|
| 76 |
+
padding=me.Padding(left=15, right=15, bottom=5),
|
| 77 |
+
)
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
def _make_style_chat_ui_container() -> me.Style:
|
| 81 |
+
return me.Style(
|
| 82 |
+
flex_grow=1,
|
| 83 |
+
display="grid",
|
| 84 |
+
grid_template_columns="repeat(1, 1fr)",
|
| 85 |
+
grid_template_rows="5fr 1fr",
|
| 86 |
+
margin=me.Margin.symmetric(vertical=0, horizontal="auto"),
|
| 87 |
+
width="min(100%)",
|
| 88 |
+
background=_COLOR_BACKGROUND,
|
| 89 |
+
box_shadow=(
|
| 90 |
+
"0 3px 1px -2px #0003, 0 2px 2px #00000024, 0 1px 5px #0000001f"
|
| 91 |
+
),
|
| 92 |
+
padding=me.Padding(top=3, left=12, right=12),
|
| 93 |
+
)
|
| 94 |
+
|
| 95 |
+
|
| 96 |
+
@dataclass(kw_only=True)
|
| 97 |
+
class Chunk:
|
| 98 |
+
content: str = ""
|
| 99 |
+
citation_numbers: list[int] = field(default_factory=list)
|
| 100 |
+
|
| 101 |
+
|
| 102 |
+
@dataclass(kw_only=True)
|
| 103 |
+
class ChatMessage:
|
| 104 |
+
"""Chat message metadata."""
|
| 105 |
+
|
| 106 |
+
role: Role = "user"
|
| 107 |
+
content: str = ""
|
| 108 |
+
chunks: list[Chunk] = field(default_factory=list)
|
| 109 |
+
|
| 110 |
+
|
| 111 |
+
@dataclass(kw_only=True)
|
| 112 |
+
class Citation:
|
| 113 |
+
number: int = 0
|
| 114 |
+
original_numbers: list[int] = field(default_factory=list)
|
| 115 |
+
url: str = ""
|
| 116 |
+
title: str = ""
|
| 117 |
+
breadcrumbs: list[str] = field(default_factory=list)
|
| 118 |
+
content: str = ""
|
| 119 |
+
|
| 120 |
+
|
| 121 |
+
@me.stateclass
|
| 122 |
+
class State:
|
| 123 |
+
input: str
|
| 124 |
+
initial_input: str
|
| 125 |
+
output: list[ChatMessage]
|
| 126 |
+
citations: list[Citation]
|
| 127 |
+
intermediate_citations: list[Citation]
|
| 128 |
+
in_progress: bool = False
|
| 129 |
+
examples: list[str]
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
def on_blur(e: me.InputBlurEvent):
|
| 133 |
+
state = me.state(State)
|
| 134 |
+
state.input = e.value
|
| 135 |
+
|
| 136 |
+
|
| 137 |
+
mesop_questions = [
|
| 138 |
+
"How can I reset an input component?",
|
| 139 |
+
"Show me how to style a component",
|
| 140 |
+
"Create a multi-page app",
|
| 141 |
+
"Is it possible to create custom components?",
|
| 142 |
+
"Implement authentication",
|
| 143 |
+
"Deploy a Mesop app",
|
| 144 |
+
"Optimize performance",
|
| 145 |
+
"Can I use JavaScript libraries in Mesop?",
|
| 146 |
+
"Stream UI updates from an LLM API",
|
| 147 |
+
"Debug a Mesop application",
|
| 148 |
+
"Is Mesop ready for production use?",
|
| 149 |
+
"Create a mobile-friendly and responsive UI",
|
| 150 |
+
"Handle asynchronous operations",
|
| 151 |
+
"Implement dark mode",
|
| 152 |
+
"Add tooltips to Mesop components",
|
| 153 |
+
"Render a pandas DataFrame as a table",
|
| 154 |
+
"Add charts",
|
| 155 |
+
"Handle file uploads",
|
| 156 |
+
]
|
| 157 |
+
|
| 158 |
+
EXAMPLES = [
|
| 159 |
+
*mesop_questions,
|
| 160 |
+
"How do I create a streaming chat UI?",
|
| 161 |
+
"How do I install Mesop?",
|
| 162 |
+
"How is Mesop different from other UI frameworks?",
|
| 163 |
+
]
|
| 164 |
+
|
| 165 |
+
|
| 166 |
+
def on_click_submit(e: me.ClickEvent) -> Generator[None, None, None]:
|
| 167 |
+
yield from submit()
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
def on_input(e: me.InputEvent) -> Generator[None, None, None]:
|
| 171 |
+
state = me.state(State)
|
| 172 |
+
if len(e.value) > 2:
|
| 173 |
+
nodes = retrieve(e.value)
|
| 174 |
+
citations = get_citations(nodes)
|
| 175 |
+
citation_by_breadcrumb = {
|
| 176 |
+
tuple(citation.breadcrumbs): citation for citation in citations
|
| 177 |
+
}
|
| 178 |
+
state.intermediate_citations = list(citation_by_breadcrumb.values())
|
| 179 |
+
yield
|
| 180 |
+
if not e.value.endswith("\n"):
|
| 181 |
+
return
|
| 182 |
+
state.input = e.value
|
| 183 |
+
|
| 184 |
+
yield from submit()
|
| 185 |
+
me.focus_component(key=f"input-{len(state.output)}")
|
| 186 |
+
yield
|
| 187 |
+
|
| 188 |
+
|
| 189 |
+
def submit():
|
| 190 |
+
state = me.state(State)
|
| 191 |
+
if state.in_progress or not state.input:
|
| 192 |
+
return
|
| 193 |
+
input = state.input
|
| 194 |
+
state.input = ""
|
| 195 |
+
yield
|
| 196 |
+
|
| 197 |
+
state.output = []
|
| 198 |
+
output = state.output
|
| 199 |
+
output.append(ChatMessage(role=_ROLE_USER, content=input))
|
| 200 |
+
state.in_progress = True
|
| 201 |
+
yield
|
| 202 |
+
|
| 203 |
+
start_time = time.time()
|
| 204 |
+
output_message = transform(input, state.output)
|
| 205 |
+
assistant_message = ChatMessage(role=_ROLE_ASSISTANT)
|
| 206 |
+
output.append(assistant_message)
|
| 207 |
+
state.output = output
|
| 208 |
+
|
| 209 |
+
for content in output_message:
|
| 210 |
+
assistant_message.content += content
|
| 211 |
+
|
| 212 |
+
if (time.time() - start_time) >= 0.75:
|
| 213 |
+
start_time = time.time()
|
| 214 |
+
transform_to_chunks(assistant_message)
|
| 215 |
+
yield
|
| 216 |
+
transform_to_chunks(assistant_message)
|
| 217 |
+
state.in_progress = False
|
| 218 |
+
me.focus_component(key=f"input-{len(state.output)}")
|
| 219 |
+
yield
|
| 220 |
+
|
| 221 |
+
|
| 222 |
+
# TODO: handle the case where [4,5]
|
| 223 |
+
def transform_to_chunks(message: ChatMessage):
|
| 224 |
+
message.chunks = []
|
| 225 |
+
# Split the message content into chunks based on citations
|
| 226 |
+
chunks = re.split(r"(\[\d+(?:,\s*\d+)*\])", message.content)
|
| 227 |
+
# Initialize variables
|
| 228 |
+
current_chunk = ""
|
| 229 |
+
current_citations: list[int] = []
|
| 230 |
+
|
| 231 |
+
# Process each chunk
|
| 232 |
+
for chunk in chunks:
|
| 233 |
+
if re.match(r"\[\d+(?:,\s*\d+)*\]", chunk):
|
| 234 |
+
try:
|
| 235 |
+
# Remove brackets and split by comma
|
| 236 |
+
citation_numbers = [int(num.strip()) for num in chunk[1:-1].split(",")]
|
| 237 |
+
current_citations.extend(citation_numbers)
|
| 238 |
+
except Exception:
|
| 239 |
+
print("Error: Unable to parse citation numbers")
|
| 240 |
+
else:
|
| 241 |
+
# If it's text content
|
| 242 |
+
if current_chunk:
|
| 243 |
+
# If there's existing content, create a new chunk
|
| 244 |
+
message.chunks.append(
|
| 245 |
+
Chunk(
|
| 246 |
+
content=current_chunk,
|
| 247 |
+
citation_numbers=map_citation_numbers(current_citations),
|
| 248 |
+
)
|
| 249 |
+
)
|
| 250 |
+
current_chunk = ""
|
| 251 |
+
current_citations = []
|
| 252 |
+
# Add the new content
|
| 253 |
+
current_chunk += chunk
|
| 254 |
+
|
| 255 |
+
# Add the last chunk if there's any remaining content
|
| 256 |
+
if current_chunk:
|
| 257 |
+
message.chunks.append(
|
| 258 |
+
Chunk(
|
| 259 |
+
content=current_chunk,
|
| 260 |
+
citation_numbers=map_citation_numbers(current_citations),
|
| 261 |
+
)
|
| 262 |
+
)
|
| 263 |
+
|
| 264 |
+
|
| 265 |
+
def map_citation_numbers(citation_numbers: list[int]) -> list[int]:
|
| 266 |
+
return citation_numbers
|
| 267 |
+
|
| 268 |
+
|
| 269 |
+
def chat(
|
| 270 |
+
title: str | None = None,
|
| 271 |
+
bot_user: str = _BOT_USER_DEFAULT,
|
| 272 |
+
):
|
| 273 |
+
state = me.state(State)
|
| 274 |
+
|
| 275 |
+
def toggle_theme(e: me.ClickEvent):
|
| 276 |
+
if me.theme_brightness() == "light":
|
| 277 |
+
me.set_theme_mode("dark")
|
| 278 |
+
else:
|
| 279 |
+
me.set_theme_mode("light")
|
| 280 |
+
|
| 281 |
+
with me.box(style=_STYLE_APP_CONTAINER):
|
| 282 |
+
with me.content_button(
|
| 283 |
+
type="icon",
|
| 284 |
+
style=me.Style(position="absolute", left=8, top=12),
|
| 285 |
+
on_click=toggle_theme,
|
| 286 |
+
):
|
| 287 |
+
me.icon("light_mode" if me.theme_brightness() == "dark" else "dark_mode")
|
| 288 |
+
with me.box(
|
| 289 |
+
style=me.Style(
|
| 290 |
+
display="flex",
|
| 291 |
+
flex_direction="row",
|
| 292 |
+
padding=me.Padding.all(8),
|
| 293 |
+
background=me.theme_var("background"),
|
| 294 |
+
width="100%",
|
| 295 |
+
border=me.Border.all(
|
| 296 |
+
me.BorderSide(width=0, style="solid", color="black")
|
| 297 |
+
),
|
| 298 |
+
box_shadow="0 10px 20px #0000000a, 0 2px 6px #0000000a, 0 0 1px #0000000a",
|
| 299 |
+
)
|
| 300 |
+
):
|
| 301 |
+
with me.box(style=me.Style(flex_grow=1)):
|
| 302 |
+
me.native_textarea(
|
| 303 |
+
value=state.initial_input,
|
| 304 |
+
placeholder=_LABEL_INPUT,
|
| 305 |
+
key=f"input-{len(state.output)}",
|
| 306 |
+
on_blur=on_blur,
|
| 307 |
+
on_input=on_input,
|
| 308 |
+
style=me.Style(
|
| 309 |
+
color=me.theme_var("on-background"),
|
| 310 |
+
padding=me.Padding(top=16, left=48),
|
| 311 |
+
background=me.theme_var("background"),
|
| 312 |
+
letter_spacing="0.07px",
|
| 313 |
+
outline="none",
|
| 314 |
+
width="100%",
|
| 315 |
+
overflow_y="auto",
|
| 316 |
+
border=me.Border.all(
|
| 317 |
+
me.BorderSide(style="none"),
|
| 318 |
+
),
|
| 319 |
+
),
|
| 320 |
+
)
|
| 321 |
+
with me.content_button(
|
| 322 |
+
color="primary",
|
| 323 |
+
type="flat",
|
| 324 |
+
disabled=state.in_progress,
|
| 325 |
+
on_click=on_click_submit,
|
| 326 |
+
style=_STYLE_CHAT_BUTTON,
|
| 327 |
+
):
|
| 328 |
+
me.icon(
|
| 329 |
+
_LABEL_BUTTON_IN_PROGRESS if state.in_progress else _LABEL_BUTTON
|
| 330 |
+
)
|
| 331 |
+
|
| 332 |
+
with me.box(style=_make_style_chat_ui_container()):
|
| 333 |
+
if title:
|
| 334 |
+
me.text(title, type="headline-5", style=_STYLE_TITLE)
|
| 335 |
+
with me.box(style=_STYLE_CHAT_BOX):
|
| 336 |
+
if not state.output and not state.intermediate_citations:
|
| 337 |
+
me.text(
|
| 338 |
+
"Welcome to Mesop Docs Bot! Ask me anything about Mesop.",
|
| 339 |
+
style=me.Style(
|
| 340 |
+
margin=me.Margin(bottom=24),
|
| 341 |
+
font_weight=500,
|
| 342 |
+
),
|
| 343 |
+
)
|
| 344 |
+
with me.box(
|
| 345 |
+
style=me.Style(
|
| 346 |
+
display="flex",
|
| 347 |
+
flex_direction="column",
|
| 348 |
+
gap=24,
|
| 349 |
+
)
|
| 350 |
+
):
|
| 351 |
+
for example in state.examples:
|
| 352 |
+
example_box(example)
|
| 353 |
+
if not state.output and state.intermediate_citations:
|
| 354 |
+
with me.box(
|
| 355 |
+
style=me.Style(
|
| 356 |
+
padding=me.Padding(top=16),
|
| 357 |
+
display="flex",
|
| 358 |
+
flex_direction="column",
|
| 359 |
+
gap=16,
|
| 360 |
+
),
|
| 361 |
+
):
|
| 362 |
+
for citation in state.intermediate_citations:
|
| 363 |
+
with citation_box(url=citation.url):
|
| 364 |
+
citation_content(
|
| 365 |
+
Citation(
|
| 366 |
+
url=citation.url,
|
| 367 |
+
title=citation.title,
|
| 368 |
+
breadcrumbs=citation.breadcrumbs,
|
| 369 |
+
original_numbers=citation.original_numbers,
|
| 370 |
+
content=citation.content,
|
| 371 |
+
number=0,
|
| 372 |
+
)
|
| 373 |
+
)
|
| 374 |
+
for msg in state.output:
|
| 375 |
+
with me.box(
|
| 376 |
+
style=me.Style(
|
| 377 |
+
display="flex", flex_direction="column", align_items="start"
|
| 378 |
+
)
|
| 379 |
+
):
|
| 380 |
+
if msg.role == _ROLE_ASSISTANT:
|
| 381 |
+
me.text(bot_user, style=_STYLE_CHAT_BUBBLE_NAME)
|
| 382 |
+
else:
|
| 383 |
+
me.text("You", style=_STYLE_CHAT_BUBBLE_NAME)
|
| 384 |
+
with me.box(
|
| 385 |
+
style=me.Style(
|
| 386 |
+
width="100%",
|
| 387 |
+
font_size="16px",
|
| 388 |
+
line_height="1.5",
|
| 389 |
+
border_radius="15px",
|
| 390 |
+
padding=me.Padding(right=15, left=15, bottom=3),
|
| 391 |
+
margin=me.Margin(bottom=10),
|
| 392 |
+
)
|
| 393 |
+
):
|
| 394 |
+
if msg.role == _ROLE_USER:
|
| 395 |
+
me.text(
|
| 396 |
+
msg.content, style=me.Style(margin=me.Margin(bottom=16))
|
| 397 |
+
)
|
| 398 |
+
else:
|
| 399 |
+
if state.in_progress:
|
| 400 |
+
me.progress_spinner()
|
| 401 |
+
used_citation_numbers: set[int] = set()
|
| 402 |
+
|
| 403 |
+
for chunk in msg.chunks:
|
| 404 |
+
me.text(
|
| 405 |
+
chunk.content,
|
| 406 |
+
style=me.Style(white_space="pre-wrap", display="inline"),
|
| 407 |
+
)
|
| 408 |
+
if chunk.citation_numbers:
|
| 409 |
+
with me.box(
|
| 410 |
+
style=me.Style(
|
| 411 |
+
display="inline-flex",
|
| 412 |
+
flex_direction="row",
|
| 413 |
+
gap=4,
|
| 414 |
+
margin=me.Margin.symmetric(horizontal=6),
|
| 415 |
+
)
|
| 416 |
+
):
|
| 417 |
+
for citation_number in chunk.citation_numbers:
|
| 418 |
+
used_citation_numbers.add(citation_number)
|
| 419 |
+
|
| 420 |
+
citation_tooltip(
|
| 421 |
+
get_citation_number(
|
| 422 |
+
citation_number, used_citation_numbers
|
| 423 |
+
)
|
| 424 |
+
)
|
| 425 |
+
|
| 426 |
+
with me.box(
|
| 427 |
+
style=me.Style(
|
| 428 |
+
padding=me.Padding(top=16),
|
| 429 |
+
display="flex",
|
| 430 |
+
flex_direction="column",
|
| 431 |
+
gap=16,
|
| 432 |
+
),
|
| 433 |
+
):
|
| 434 |
+
for citation in state.citations:
|
| 435 |
+
if citation.number in used_citation_numbers:
|
| 436 |
+
with citation_box(url=citation.url):
|
| 437 |
+
citation_content(
|
| 438 |
+
Citation(
|
| 439 |
+
url=citation.url,
|
| 440 |
+
title=citation.title,
|
| 441 |
+
breadcrumbs=citation.breadcrumbs,
|
| 442 |
+
original_numbers=citation.original_numbers,
|
| 443 |
+
content=citation.content,
|
| 444 |
+
number=get_citation_number(
|
| 445 |
+
citation.number, used_citation_numbers
|
| 446 |
+
),
|
| 447 |
+
)
|
| 448 |
+
)
|
| 449 |
+
if not me.state(State).in_progress:
|
| 450 |
+
with me.box(
|
| 451 |
+
style=me.Style(
|
| 452 |
+
display="flex",
|
| 453 |
+
flex_direction="row",
|
| 454 |
+
gap=4,
|
| 455 |
+
margin=me.Margin(top=16),
|
| 456 |
+
)
|
| 457 |
+
):
|
| 458 |
+
NEWLINE = "\n"
|
| 459 |
+
me.text("Is there an issue with this this response?")
|
| 460 |
+
me.link(
|
| 461 |
+
text="File an issue",
|
| 462 |
+
url="https://github.com/mesop-dev/mesop/issues/new?assignees=&labels=bug,chatbot&projects=&title=Bad%20chatbot%20response&body="
|
| 463 |
+
+ urllib.parse.quote(f"""
|
| 464 |
+
What was the issue with the chatbot response?
|
| 465 |
+
|
| 466 |
+
---
|
| 467 |
+
Original content:
|
| 468 |
+
|
| 469 |
+
__Prompt:__
|
| 470 |
+
{state.output[0].content}
|
| 471 |
+
|
| 472 |
+
__Response:__
|
| 473 |
+
{state.output[-1].content}
|
| 474 |
+
|
| 475 |
+
__Citations:__
|
| 476 |
+
|
| 477 |
+
{NEWLINE.join([f"1. {citation.url}" for citation in state.citations])}
|
| 478 |
+
"""),
|
| 479 |
+
style=me.Style(
|
| 480 |
+
color=me.theme_var("primary"),
|
| 481 |
+
text_decoration="none",
|
| 482 |
+
),
|
| 483 |
+
open_in_new_tab=True,
|
| 484 |
+
)
|
| 485 |
+
|
| 486 |
+
|
| 487 |
+
def citation_tooltip(citation_number: int):
|
| 488 |
+
state = me.state(State)
|
| 489 |
+
with me.box(style=me.Style(display="inline-block")):
|
| 490 |
+
with me.tooltip(
|
| 491 |
+
message=state.citations[citation_number - 1].title,
|
| 492 |
+
position="below",
|
| 493 |
+
):
|
| 494 |
+
me.text(
|
| 495 |
+
f"{citation_number}",
|
| 496 |
+
style=me.Style(
|
| 497 |
+
background=me.theme_var("surface-variant"),
|
| 498 |
+
padding=me.Padding.symmetric(horizontal=5),
|
| 499 |
+
border_radius="6px",
|
| 500 |
+
font_weight=500,
|
| 501 |
+
),
|
| 502 |
+
)
|
| 503 |
+
|
| 504 |
+
|
| 505 |
+
@me.web_component(path="./citation.js")
|
| 506 |
+
def citation_box(
|
| 507 |
+
*,
|
| 508 |
+
url: str,
|
| 509 |
+
key: str | None = None,
|
| 510 |
+
):
|
| 511 |
+
return me.insert_web_component(
|
| 512 |
+
name="citation-component",
|
| 513 |
+
key=key,
|
| 514 |
+
properties={
|
| 515 |
+
"url": url,
|
| 516 |
+
"active": True,
|
| 517 |
+
},
|
| 518 |
+
)
|
| 519 |
+
|
| 520 |
+
|
| 521 |
+
def citation_content(citation: Citation):
|
| 522 |
+
with me.box(
|
| 523 |
+
style=me.Style(
|
| 524 |
+
display="flex",
|
| 525 |
+
flex_direction="column",
|
| 526 |
+
padding=me.Padding.symmetric(vertical=8, horizontal=16),
|
| 527 |
+
cursor="pointer",
|
| 528 |
+
),
|
| 529 |
+
):
|
| 530 |
+
with me.box(
|
| 531 |
+
style=me.Style(
|
| 532 |
+
display="flex",
|
| 533 |
+
flex_direction="row",
|
| 534 |
+
gap=4,
|
| 535 |
+
align_items="start",
|
| 536 |
+
)
|
| 537 |
+
):
|
| 538 |
+
if citation.number:
|
| 539 |
+
me.text(
|
| 540 |
+
f"{citation.number}", style=me.Style(font_weight=500, font_size=18)
|
| 541 |
+
)
|
| 542 |
+
me.icon(
|
| 543 |
+
icon="description",
|
| 544 |
+
style=me.Style(font_size=20, padding=me.Padding(top=3, left=3)),
|
| 545 |
+
)
|
| 546 |
+
|
| 547 |
+
me.text(citation.title)
|
| 548 |
+
with me.box(
|
| 549 |
+
style=me.Style(
|
| 550 |
+
display="flex",
|
| 551 |
+
flex_direction="row",
|
| 552 |
+
gap=8,
|
| 553 |
+
font_size="14px",
|
| 554 |
+
font_weight=500,
|
| 555 |
+
)
|
| 556 |
+
):
|
| 557 |
+
for breadcrumb in citation.breadcrumbs:
|
| 558 |
+
me.text(breadcrumb)
|
| 559 |
+
if breadcrumb != citation.breadcrumbs[-1]:
|
| 560 |
+
me.text(" > ")
|
| 561 |
+
|
| 562 |
+
|
| 563 |
+
def example_box(example: str):
|
| 564 |
+
with me.box(
|
| 565 |
+
style=me.Style(
|
| 566 |
+
background=me.theme_var("secondary-container"),
|
| 567 |
+
border_radius="12px",
|
| 568 |
+
padding=me.Padding(left=16, right=16, top=16, bottom=16),
|
| 569 |
+
cursor="pointer",
|
| 570 |
+
),
|
| 571 |
+
key=example,
|
| 572 |
+
on_click=on_click_example,
|
| 573 |
+
):
|
| 574 |
+
me.text(example)
|
| 575 |
+
|
| 576 |
+
|
| 577 |
+
def on_click_example(e: me.ClickEvent) -> Generator[None, None, None]:
|
| 578 |
+
state = me.state(State)
|
| 579 |
+
state.input = e.key
|
| 580 |
+
yield from submit()
|
| 581 |
+
|
| 582 |
+
|
| 583 |
+
def transform(
|
| 584 |
+
message: str, history: list[ChatMessage]
|
| 585 |
+
) -> Generator[str, None, None]:
|
| 586 |
+
response = ask(message)
|
| 587 |
+
citations = get_citations(response.source_nodes)
|
| 588 |
+
|
| 589 |
+
me.state(State).citations = citations
|
| 590 |
+
yield from response.response_gen
|
| 591 |
+
|
| 592 |
+
|
| 593 |
+
def get_citations(source_nodes: list[NodeWithScore]) -> list[Citation]:
|
| 594 |
+
citations: list[Citation] = []
|
| 595 |
+
|
| 596 |
+
for i, source_node in enumerate(source_nodes):
|
| 597 |
+
url: str = source_node.node.metadata.get("url", "")
|
| 598 |
+
breadcrumbs = url.split("https://mesop-dev.github.io/mesop/")[-1].split("/")
|
| 599 |
+
title = source_node.node.metadata.get("title", "")
|
| 600 |
+
content_lines = source_node.node.get_content().split("\n")
|
| 601 |
+
|
| 602 |
+
for line in content_lines[2:]:
|
| 603 |
+
if line and not line.startswith("```"):
|
| 604 |
+
break
|
| 605 |
+
if len(content_lines) > 2:
|
| 606 |
+
fragment: str = (
|
| 607 |
+
"#:~:text="
|
| 608 |
+
+ urllib.parse.quote(content_lines[1])
|
| 609 |
+
+ ",-"
|
| 610 |
+
# Just take the first two words of the line to avoid
|
| 611 |
+
# mismatching (e.g. URLs).
|
| 612 |
+
+ urllib.parse.quote(" ".join(line.split(" ")[:2]))
|
| 613 |
+
)
|
| 614 |
+
else:
|
| 615 |
+
fragment = ""
|
| 616 |
+
citations.append(
|
| 617 |
+
Citation(
|
| 618 |
+
url=url + fragment,
|
| 619 |
+
breadcrumbs=breadcrumbs,
|
| 620 |
+
title=title,
|
| 621 |
+
number=i + 1,
|
| 622 |
+
)
|
| 623 |
+
)
|
| 624 |
+
return citations
|
| 625 |
+
|
| 626 |
+
|
| 627 |
+
def get_citation_number(
|
| 628 |
+
citation_number: int, used_citation_numbers: set[int]
|
| 629 |
+
) -> int:
|
| 630 |
+
number = 0
|
| 631 |
+
for n in used_citation_numbers:
|
| 632 |
+
number += 1 # noqa: SIM113
|
| 633 |
+
if n == citation_number:
|
| 634 |
+
return number
|
| 635 |
+
raise ValueError(f"Citation number {citation_number} not found")
|
| 636 |
+
|
| 637 |
+
|
| 638 |
+
@me.web_component(path="./frame_listener.js")
|
| 639 |
+
def frame_listener(
|
| 640 |
+
*,
|
| 641 |
+
key: str | None = None,
|
| 642 |
+
):
|
| 643 |
+
pass
|
pyproject.toml
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[project]
|
| 2 |
+
name = "docbot"
|
| 3 |
+
version = "0.1.0"
|
| 4 |
+
description = "A chatbot for docs"
|
| 5 |
+
readme = "README.md"
|
| 6 |
+
requires-python = ">=3.10"
|
| 7 |
+
dependencies = [
|
| 8 |
+
"gunicorn>=23.0.0",
|
| 9 |
+
"nest-asyncio>=1.6.0",
|
| 10 |
+
"llama-index==0.10.68",
|
| 11 |
+
"google-generativeai>=0.5.4",
|
| 12 |
+
"llama-index-llms-gemini==0.2.0",
|
| 13 |
+
"llama-index-embeddings-google==0.1.6",
|
| 14 |
+
"llama-index-retrievers-bm25==0.2.2",
|
| 15 |
+
"mesop>=1.0.0",
|
| 16 |
+
]
|
| 17 |
+
|
| 18 |
+
# uv required properties:
|
| 19 |
+
|
| 20 |
+
[tool.uv]
|
| 21 |
+
dev-dependencies = []
|
| 22 |
+
|
| 23 |
+
[tool.uv.workspace]
|
| 24 |
+
|
| 25 |
+
[build-system]
|
| 26 |
+
requires = ["hatchling"]
|
| 27 |
+
build-backend = "hatchling.build"
|
| 28 |
+
|
| 29 |
+
# See: https://github.com/astral-sh/uv/issues/6293
|
| 30 |
+
[tool.hatch.build.targets.wheel]
|
| 31 |
+
packages = ["."]
|
recorder.py
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Create a folder at out_dir + query (percent encoded)
|
| 2 |
+
import argparse
|
| 3 |
+
import os
|
| 4 |
+
import sys
|
| 5 |
+
import urllib.parse
|
| 6 |
+
|
| 7 |
+
from docs_index import blocking_query_engine
|
| 8 |
+
from llama_index.core.instrumentation import get_dispatcher
|
| 9 |
+
from llama_index.core.instrumentation.event_handlers import BaseEventHandler
|
| 10 |
+
from llama_index.core.instrumentation.events.llm import (
|
| 11 |
+
LLMChatEndEvent,
|
| 12 |
+
LLMCompletionEndEvent,
|
| 13 |
+
)
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
class ModelEventHandler(BaseEventHandler):
|
| 17 |
+
@classmethod
|
| 18 |
+
def class_name(cls) -> str:
|
| 19 |
+
"""Class name."""
|
| 20 |
+
return "ModelEventHandler"
|
| 21 |
+
|
| 22 |
+
def handle(self, event) -> None:
|
| 23 |
+
"""Logic for handling event."""
|
| 24 |
+
if isinstance(event, LLMCompletionEndEvent):
|
| 25 |
+
print(f"LLM Prompt length: {len(event.prompt)}")
|
| 26 |
+
print(f"LLM Prompt CONTENT: {event.prompt}")
|
| 27 |
+
print(f"LLM Completion: {event.response.text!s}")
|
| 28 |
+
elif isinstance(event, LLMChatEndEvent):
|
| 29 |
+
messages_str = "\n".join([str(x.content) for x in event.messages])
|
| 30 |
+
print(f"LLM Input Messages RAW: {event.messages}")
|
| 31 |
+
print(f"LLM Input Messages length: {len(messages_str)}")
|
| 32 |
+
print(f"LLM Input Messages CONTENT: {messages_str}")
|
| 33 |
+
print(f"LLM Response: {event.response.message.content!s}")
|
| 34 |
+
|
| 35 |
+
# Create a folder for the query
|
| 36 |
+
query_folder = os.path.join(args.out_dir, urllib.parse.quote(query))
|
| 37 |
+
os.makedirs(query_folder, exist_ok=True)
|
| 38 |
+
print(f"Created folder for query: {query_folder}")
|
| 39 |
+
|
| 40 |
+
# Save the LLM input and output to files
|
| 41 |
+
with open(os.path.join(query_folder, "input.txt"), "w") as f:
|
| 42 |
+
f.write(messages_str)
|
| 43 |
+
with open(os.path.join(query_folder, "output.txt"), "w") as f:
|
| 44 |
+
f.write(str(event.response.message.content))
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
# root dispatcher
|
| 48 |
+
root_dispatcher = get_dispatcher()
|
| 49 |
+
|
| 50 |
+
# register event handler
|
| 51 |
+
root_dispatcher.add_event_handler(ModelEventHandler())
|
| 52 |
+
|
| 53 |
+
QUERIES = [
|
| 54 |
+
"How can I reset an input component?",
|
| 55 |
+
"Show me how to style a component",
|
| 56 |
+
"Create a multi-page app",
|
| 57 |
+
"Is it possible to create custom components?",
|
| 58 |
+
"Implement authentication",
|
| 59 |
+
"Deploy a Mesop app",
|
| 60 |
+
"Optimize performance",
|
| 61 |
+
"Can I use JavaScript libraries in Mesop?",
|
| 62 |
+
"Stream UI updates from an LLM API",
|
| 63 |
+
"Debug a Mesop application",
|
| 64 |
+
"Is Mesop ready for production use?",
|
| 65 |
+
"Create a mobile-friendly and responsive UI",
|
| 66 |
+
"Handle asynchronous operations",
|
| 67 |
+
"Implement dark mode",
|
| 68 |
+
"Add tooltips to Mesop components",
|
| 69 |
+
"Render a pandas DataFrame as a table",
|
| 70 |
+
"Add charts",
|
| 71 |
+
"Handle file uploads",
|
| 72 |
+
]
|
| 73 |
+
|
| 74 |
+
# QUERIES = [
|
| 75 |
+
# "How do I test a Mesop application?",
|
| 76 |
+
# "What components are available in Mesop?",
|
| 77 |
+
# "How can I reset a text input field in Mesop?",
|
| 78 |
+
# "Show me how to style a component in Mesop",
|
| 79 |
+
# "Create a multi-page app using Mesop",
|
| 80 |
+
# "Is it possible to create custom components in Mesop?",
|
| 81 |
+
# "Implement authentication in a Mesop app",
|
| 82 |
+
# "How do I call an API from a Mesop application?",
|
| 83 |
+
# "What's the process for deploying a Mesop app?",
|
| 84 |
+
# "Optimize performance in a Mesop application",
|
| 85 |
+
# "Implement a datepicker in Mesop",
|
| 86 |
+
# "Can I use JavaScript libraries with Mesop?",
|
| 87 |
+
# "Implement real-time updates in a Mesop app",
|
| 88 |
+
# "Stream UI updates from an LLM API in Mesop",
|
| 89 |
+
# "Debug a Mesop application",
|
| 90 |
+
# "Is Mesop ready for production use?",
|
| 91 |
+
# "Implement form validation in Mesop",
|
| 92 |
+
# "Create a mobile-friendly Mesop app",
|
| 93 |
+
# "Handle asynchronous operations in Mesop",
|
| 94 |
+
# "Implement dark mode in a Mesop application",
|
| 95 |
+
# "Add keyboard shortcuts to a Mesop app",
|
| 96 |
+
# "Implement drag and drop functionality in Mesop",
|
| 97 |
+
# "Create an infinite scroll feature in Mesop",
|
| 98 |
+
# "How to make a row of components in Mesop",
|
| 99 |
+
# "Add tooltips to Mesop components",
|
| 100 |
+
# "Render a pandas DataFrame in a Mesop app",
|
| 101 |
+
# "Add charts to a Mesop application",
|
| 102 |
+
# "Create a table component in Mesop",
|
| 103 |
+
# "Handle file uploads in a Mesop app",
|
| 104 |
+
# "Use command-line flags with a Mesop application",
|
| 105 |
+
# "Create a clickable link in Mesop",
|
| 106 |
+
# "Implement a download link in a Mesop app",
|
| 107 |
+
# ]
|
| 108 |
+
|
| 109 |
+
|
| 110 |
+
parser = argparse.ArgumentParser(
|
| 111 |
+
description="Process queries and record model events."
|
| 112 |
+
)
|
| 113 |
+
parser.add_argument(
|
| 114 |
+
"--out-dir", type=str, help="Output directory for recorded events"
|
| 115 |
+
)
|
| 116 |
+
args = parser.parse_args()
|
| 117 |
+
|
| 118 |
+
if args.out_dir:
|
| 119 |
+
print(f"Output directory set to: {args.out_dir}")
|
| 120 |
+
|
| 121 |
+
# Create the output directory if it doesn't exist
|
| 122 |
+
os.makedirs(args.out_dir, exist_ok=True)
|
| 123 |
+
print(f"Created output directory: {args.out_dir}")
|
| 124 |
+
else:
|
| 125 |
+
print("No output directory specified. Exiting! Specify with --out-dir")
|
| 126 |
+
sys.exit(1)
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
for query in QUERIES:
|
| 130 |
+
blocking_query_engine.query(query)
|
requirements.txt
ADDED
|
@@ -0,0 +1,374 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# This file was autogenerated by uv via the following command:
|
| 2 |
+
# uv pip compile pyproject.toml -o requirements.txt
|
| 3 |
+
absl-py==2.1.0
|
| 4 |
+
# via mesop
|
| 5 |
+
aiohappyeyeballs==2.4.0
|
| 6 |
+
# via aiohttp
|
| 7 |
+
aiohttp==3.10.11
|
| 8 |
+
# via
|
| 9 |
+
# llama-index-core
|
| 10 |
+
# llama-index-legacy
|
| 11 |
+
aiosignal==1.3.1
|
| 12 |
+
# via aiohttp
|
| 13 |
+
annotated-types==0.7.0
|
| 14 |
+
# via pydantic
|
| 15 |
+
anyio==4.4.0
|
| 16 |
+
# via
|
| 17 |
+
# httpx
|
| 18 |
+
# openai
|
| 19 |
+
async-timeout==4.0.3
|
| 20 |
+
# via aiohttp
|
| 21 |
+
attrs==24.2.0
|
| 22 |
+
# via aiohttp
|
| 23 |
+
beautifulsoup4==4.12.3
|
| 24 |
+
# via llama-index-readers-file
|
| 25 |
+
blinker==1.8.2
|
| 26 |
+
# via flask
|
| 27 |
+
bm25s==0.1.10
|
| 28 |
+
# via llama-index-retrievers-bm25
|
| 29 |
+
cachetools==5.5.0
|
| 30 |
+
# via google-auth
|
| 31 |
+
certifi==2024.8.30
|
| 32 |
+
# via
|
| 33 |
+
# httpcore
|
| 34 |
+
# httpx
|
| 35 |
+
# requests
|
| 36 |
+
charset-normalizer==3.3.2
|
| 37 |
+
# via requests
|
| 38 |
+
click==8.1.7
|
| 39 |
+
# via
|
| 40 |
+
# flask
|
| 41 |
+
# nltk
|
| 42 |
+
dataclasses-json==0.6.7
|
| 43 |
+
# via
|
| 44 |
+
# llama-index-core
|
| 45 |
+
# llama-index-legacy
|
| 46 |
+
deepdiff==6.7.1
|
| 47 |
+
# via mesop
|
| 48 |
+
deprecated==1.2.14
|
| 49 |
+
# via
|
| 50 |
+
# llama-index-core
|
| 51 |
+
# llama-index-legacy
|
| 52 |
+
dirtyjson==1.0.8
|
| 53 |
+
# via
|
| 54 |
+
# llama-index-core
|
| 55 |
+
# llama-index-legacy
|
| 56 |
+
distro==1.9.0
|
| 57 |
+
# via openai
|
| 58 |
+
exceptiongroup==1.2.2
|
| 59 |
+
# via anyio
|
| 60 |
+
flask==3.0.3
|
| 61 |
+
# via mesop
|
| 62 |
+
frozenlist==1.4.1
|
| 63 |
+
# via
|
| 64 |
+
# aiohttp
|
| 65 |
+
# aiosignal
|
| 66 |
+
fsspec==2024.6.1
|
| 67 |
+
# via
|
| 68 |
+
# llama-index-core
|
| 69 |
+
# llama-index-legacy
|
| 70 |
+
google-ai-generativelanguage==0.6.4
|
| 71 |
+
# via google-generativeai
|
| 72 |
+
google-api-core==2.19.1
|
| 73 |
+
# via
|
| 74 |
+
# google-ai-generativelanguage
|
| 75 |
+
# google-api-python-client
|
| 76 |
+
# google-generativeai
|
| 77 |
+
google-api-python-client==2.142.0
|
| 78 |
+
# via google-generativeai
|
| 79 |
+
google-auth==2.34.0
|
| 80 |
+
# via
|
| 81 |
+
# google-ai-generativelanguage
|
| 82 |
+
# google-api-core
|
| 83 |
+
# google-api-python-client
|
| 84 |
+
# google-auth-httplib2
|
| 85 |
+
# google-generativeai
|
| 86 |
+
google-auth-httplib2==0.2.0
|
| 87 |
+
# via google-api-python-client
|
| 88 |
+
google-generativeai==0.5.4
|
| 89 |
+
# via
|
| 90 |
+
# docbot (pyproject.toml)
|
| 91 |
+
# llama-index-embeddings-google
|
| 92 |
+
# llama-index-llms-gemini
|
| 93 |
+
googleapis-common-protos==1.63.2
|
| 94 |
+
# via
|
| 95 |
+
# google-api-core
|
| 96 |
+
# grpcio-status
|
| 97 |
+
greenlet==3.0.3
|
| 98 |
+
# via sqlalchemy
|
| 99 |
+
grpcio==1.66.0
|
| 100 |
+
# via
|
| 101 |
+
# google-api-core
|
| 102 |
+
# grpcio-status
|
| 103 |
+
grpcio-status==1.62.3
|
| 104 |
+
# via google-api-core
|
| 105 |
+
gunicorn==23.0.0
|
| 106 |
+
# via docbot (pyproject.toml)
|
| 107 |
+
h11==0.14.0
|
| 108 |
+
# via httpcore
|
| 109 |
+
httpcore==1.0.5
|
| 110 |
+
# via httpx
|
| 111 |
+
httplib2==0.22.0
|
| 112 |
+
# via
|
| 113 |
+
# google-api-python-client
|
| 114 |
+
# google-auth-httplib2
|
| 115 |
+
httpx==0.27.0
|
| 116 |
+
# via
|
| 117 |
+
# llama-cloud
|
| 118 |
+
# llama-index-core
|
| 119 |
+
# llama-index-legacy
|
| 120 |
+
# openai
|
| 121 |
+
idna==3.8
|
| 122 |
+
# via
|
| 123 |
+
# anyio
|
| 124 |
+
# httpx
|
| 125 |
+
# requests
|
| 126 |
+
# yarl
|
| 127 |
+
itsdangerous==2.2.0
|
| 128 |
+
# via flask
|
| 129 |
+
jinja2==3.1.4
|
| 130 |
+
# via flask
|
| 131 |
+
jiter==0.5.0
|
| 132 |
+
# via openai
|
| 133 |
+
joblib==1.4.2
|
| 134 |
+
# via nltk
|
| 135 |
+
llama-cloud==0.0.15
|
| 136 |
+
# via llama-index-indices-managed-llama-cloud
|
| 137 |
+
llama-index==0.10.68
|
| 138 |
+
# via docbot (pyproject.toml)
|
| 139 |
+
llama-index-agent-openai==0.2.9
|
| 140 |
+
# via
|
| 141 |
+
# llama-index
|
| 142 |
+
# llama-index-program-openai
|
| 143 |
+
llama-index-cli==0.1.13
|
| 144 |
+
# via llama-index
|
| 145 |
+
llama-index-core==0.10.68.post1
|
| 146 |
+
# via
|
| 147 |
+
# llama-index
|
| 148 |
+
# llama-index-agent-openai
|
| 149 |
+
# llama-index-cli
|
| 150 |
+
# llama-index-embeddings-google
|
| 151 |
+
# llama-index-embeddings-openai
|
| 152 |
+
# llama-index-indices-managed-llama-cloud
|
| 153 |
+
# llama-index-llms-gemini
|
| 154 |
+
# llama-index-llms-openai
|
| 155 |
+
# llama-index-multi-modal-llms-openai
|
| 156 |
+
# llama-index-program-openai
|
| 157 |
+
# llama-index-question-gen-openai
|
| 158 |
+
# llama-index-readers-file
|
| 159 |
+
# llama-index-readers-llama-parse
|
| 160 |
+
# llama-index-retrievers-bm25
|
| 161 |
+
# llama-parse
|
| 162 |
+
llama-index-embeddings-google==0.1.6
|
| 163 |
+
# via docbot (pyproject.toml)
|
| 164 |
+
llama-index-embeddings-openai==0.1.11
|
| 165 |
+
# via
|
| 166 |
+
# llama-index
|
| 167 |
+
# llama-index-cli
|
| 168 |
+
llama-index-indices-managed-llama-cloud==0.2.7
|
| 169 |
+
# via llama-index
|
| 170 |
+
llama-index-legacy==0.9.48.post3
|
| 171 |
+
# via llama-index
|
| 172 |
+
llama-index-llms-gemini==0.2.0
|
| 173 |
+
# via docbot (pyproject.toml)
|
| 174 |
+
llama-index-llms-openai==0.1.31
|
| 175 |
+
# via
|
| 176 |
+
# llama-index
|
| 177 |
+
# llama-index-agent-openai
|
| 178 |
+
# llama-index-cli
|
| 179 |
+
# llama-index-multi-modal-llms-openai
|
| 180 |
+
# llama-index-program-openai
|
| 181 |
+
# llama-index-question-gen-openai
|
| 182 |
+
llama-index-multi-modal-llms-openai==0.1.9
|
| 183 |
+
# via llama-index
|
| 184 |
+
llama-index-program-openai==0.1.7
|
| 185 |
+
# via
|
| 186 |
+
# llama-index
|
| 187 |
+
# llama-index-question-gen-openai
|
| 188 |
+
llama-index-question-gen-openai==0.1.3
|
| 189 |
+
# via llama-index
|
| 190 |
+
llama-index-readers-file==0.1.33
|
| 191 |
+
# via llama-index
|
| 192 |
+
llama-index-readers-llama-parse==0.1.6
|
| 193 |
+
# via llama-index
|
| 194 |
+
llama-index-retrievers-bm25==0.2.2
|
| 195 |
+
# via docbot (pyproject.toml)
|
| 196 |
+
llama-parse==0.4.9
|
| 197 |
+
# via llama-index-readers-llama-parse
|
| 198 |
+
markupsafe==2.1.5
|
| 199 |
+
# via
|
| 200 |
+
# jinja2
|
| 201 |
+
# werkzeug
|
| 202 |
+
marshmallow==3.22.0
|
| 203 |
+
# via dataclasses-json
|
| 204 |
+
mesop==1.0.0
|
| 205 |
+
# via docbot (pyproject.toml)
|
| 206 |
+
msgpack==1.0.8
|
| 207 |
+
# via mesop
|
| 208 |
+
multidict==6.0.5
|
| 209 |
+
# via
|
| 210 |
+
# aiohttp
|
| 211 |
+
# yarl
|
| 212 |
+
mypy-extensions==1.0.0
|
| 213 |
+
# via typing-inspect
|
| 214 |
+
nest-asyncio==1.6.0
|
| 215 |
+
# via
|
| 216 |
+
# docbot (pyproject.toml)
|
| 217 |
+
# llama-index-core
|
| 218 |
+
# llama-index-legacy
|
| 219 |
+
networkx==3.3
|
| 220 |
+
# via
|
| 221 |
+
# llama-index-core
|
| 222 |
+
# llama-index-legacy
|
| 223 |
+
nltk==3.9.1
|
| 224 |
+
# via
|
| 225 |
+
# llama-index-core
|
| 226 |
+
# llama-index-legacy
|
| 227 |
+
numpy==1.26.4
|
| 228 |
+
# via
|
| 229 |
+
# bm25s
|
| 230 |
+
# llama-index-core
|
| 231 |
+
# llama-index-legacy
|
| 232 |
+
# pandas
|
| 233 |
+
# scipy
|
| 234 |
+
openai==1.42.0
|
| 235 |
+
# via
|
| 236 |
+
# llama-index-agent-openai
|
| 237 |
+
# llama-index-legacy
|
| 238 |
+
# llama-index-llms-openai
|
| 239 |
+
ordered-set==4.1.0
|
| 240 |
+
# via deepdiff
|
| 241 |
+
packaging==24.1
|
| 242 |
+
# via
|
| 243 |
+
# gunicorn
|
| 244 |
+
# marshmallow
|
| 245 |
+
pandas==2.2.2
|
| 246 |
+
# via
|
| 247 |
+
# llama-index-core
|
| 248 |
+
# llama-index-legacy
|
| 249 |
+
pillow==10.4.0
|
| 250 |
+
# via
|
| 251 |
+
# llama-index-core
|
| 252 |
+
# llama-index-llms-gemini
|
| 253 |
+
propcache==0.3.0
|
| 254 |
+
# via yarl
|
| 255 |
+
proto-plus==1.24.0
|
| 256 |
+
# via
|
| 257 |
+
# google-ai-generativelanguage
|
| 258 |
+
# google-api-core
|
| 259 |
+
protobuf==4.25.4
|
| 260 |
+
# via
|
| 261 |
+
# google-ai-generativelanguage
|
| 262 |
+
# google-api-core
|
| 263 |
+
# google-generativeai
|
| 264 |
+
# googleapis-common-protos
|
| 265 |
+
# grpcio-status
|
| 266 |
+
# mesop
|
| 267 |
+
# proto-plus
|
| 268 |
+
pyasn1==0.6.0
|
| 269 |
+
# via
|
| 270 |
+
# pyasn1-modules
|
| 271 |
+
# rsa
|
| 272 |
+
pyasn1-modules==0.4.0
|
| 273 |
+
# via google-auth
|
| 274 |
+
pydantic==2.8.2
|
| 275 |
+
# via
|
| 276 |
+
# google-generativeai
|
| 277 |
+
# llama-cloud
|
| 278 |
+
# llama-index-core
|
| 279 |
+
# mesop
|
| 280 |
+
# openai
|
| 281 |
+
pydantic-core==2.20.1
|
| 282 |
+
# via pydantic
|
| 283 |
+
pyparsing==3.1.4
|
| 284 |
+
# via httplib2
|
| 285 |
+
pypdf==4.3.1
|
| 286 |
+
# via llama-index-readers-file
|
| 287 |
+
pystemmer==2.2.0.1
|
| 288 |
+
# via llama-index-retrievers-bm25
|
| 289 |
+
python-dateutil==2.9.0.post0
|
| 290 |
+
# via pandas
|
| 291 |
+
python-dotenv==1.0.1
|
| 292 |
+
# via mesop
|
| 293 |
+
pytz==2024.1
|
| 294 |
+
# via pandas
|
| 295 |
+
pyyaml==6.0.2
|
| 296 |
+
# via llama-index-core
|
| 297 |
+
regex==2024.7.24
|
| 298 |
+
# via
|
| 299 |
+
# nltk
|
| 300 |
+
# tiktoken
|
| 301 |
+
requests==2.32.3
|
| 302 |
+
# via
|
| 303 |
+
# google-api-core
|
| 304 |
+
# llama-index-core
|
| 305 |
+
# llama-index-legacy
|
| 306 |
+
# tiktoken
|
| 307 |
+
rsa==4.9
|
| 308 |
+
# via google-auth
|
| 309 |
+
scipy==1.14.1
|
| 310 |
+
# via bm25s
|
| 311 |
+
six==1.16.0
|
| 312 |
+
# via python-dateutil
|
| 313 |
+
sniffio==1.3.1
|
| 314 |
+
# via
|
| 315 |
+
# anyio
|
| 316 |
+
# httpx
|
| 317 |
+
# openai
|
| 318 |
+
soupsieve==2.6
|
| 319 |
+
# via beautifulsoup4
|
| 320 |
+
sqlalchemy==2.0.32
|
| 321 |
+
# via
|
| 322 |
+
# llama-index-core
|
| 323 |
+
# llama-index-legacy
|
| 324 |
+
striprtf==0.0.26
|
| 325 |
+
# via llama-index-readers-file
|
| 326 |
+
tenacity==8.5.0
|
| 327 |
+
# via
|
| 328 |
+
# llama-index-core
|
| 329 |
+
# llama-index-legacy
|
| 330 |
+
tiktoken==0.7.0
|
| 331 |
+
# via
|
| 332 |
+
# llama-index-core
|
| 333 |
+
# llama-index-legacy
|
| 334 |
+
tqdm==4.66.5
|
| 335 |
+
# via
|
| 336 |
+
# google-generativeai
|
| 337 |
+
# llama-index-core
|
| 338 |
+
# nltk
|
| 339 |
+
# openai
|
| 340 |
+
typing-extensions==4.12.2
|
| 341 |
+
# via
|
| 342 |
+
# anyio
|
| 343 |
+
# google-generativeai
|
| 344 |
+
# llama-index-core
|
| 345 |
+
# llama-index-legacy
|
| 346 |
+
# openai
|
| 347 |
+
# pydantic
|
| 348 |
+
# pydantic-core
|
| 349 |
+
# pypdf
|
| 350 |
+
# sqlalchemy
|
| 351 |
+
# typing-inspect
|
| 352 |
+
typing-inspect==0.9.0
|
| 353 |
+
# via
|
| 354 |
+
# dataclasses-json
|
| 355 |
+
# llama-index-core
|
| 356 |
+
# llama-index-legacy
|
| 357 |
+
tzdata==2024.1
|
| 358 |
+
# via pandas
|
| 359 |
+
uritemplate==4.1.1
|
| 360 |
+
# via google-api-python-client
|
| 361 |
+
urllib3==2.2.2
|
| 362 |
+
# via requests
|
| 363 |
+
watchdog==4.0.2
|
| 364 |
+
# via mesop
|
| 365 |
+
werkzeug==3.0.6
|
| 366 |
+
# via
|
| 367 |
+
# flask
|
| 368 |
+
# mesop
|
| 369 |
+
wrapt==1.16.0
|
| 370 |
+
# via
|
| 371 |
+
# deprecated
|
| 372 |
+
# llama-index-core
|
| 373 |
+
yarl==1.18.3
|
| 374 |
+
# via aiohttp
|
scrollable.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import {
|
| 2 |
+
LitElement,
|
| 3 |
+
html,
|
| 4 |
+
css,
|
| 5 |
+
} from 'https://cdn.jsdelivr.net/gh/lit/dist@3/core/lit-core.min.js';
|
| 6 |
+
|
| 7 |
+
class ScrollableComponent extends LitElement {
|
| 8 |
+
renderRoot() {
|
| 9 |
+
return this;
|
| 10 |
+
}
|
| 11 |
+
firstUpdated() {
|
| 12 |
+
// this.focus();
|
| 13 |
+
}
|
| 14 |
+
render() {
|
| 15 |
+
this.tabIndex = 0;
|
| 16 |
+
this.style.overflowY = 'auto';
|
| 17 |
+
this.style.outline = 'none';
|
| 18 |
+
}
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
customElements.define('scrollable-component', ScrollableComponent);
|
uv.lock
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|