Spaces:
Running
Running
github-actions[bot]
commited on
Commit
·
651bf53
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 |
+
{"signinsuccessurl": 0, "disallow": 1, "twsrc": 2, "collection_nam": 3, "consum": 4, "chromeo": 5, "security_polici": 6, "com": 7, "instanc": 8, "on_image_upload": 9, "express": 10, "children": 11, "earlier": 12, "return": 13, "safeti": 14, "autocompleteoptiongroup": 15, "who": 16, "familiar": 17, "inform": 18, "background": 19, "storag": 20, "pydant": 21, "about": 22, "configur": 23, "nested_list": 24, "npx": 25, "accord": 26, "devic": 27, "miss": 28, "react": 29, "extens": 30, "dive": 31, "user": 32, "non": 33, "pleas": 34, "genai": 35, "nullabl": 36, "basic": 37, "provid": 38, "securitypolici": 39, "hit": 40, "review": 41, "export": 42, "gave": 43, "titl": 44, "cli": 45, "sse": 46, "set_theme_dens": 47, "compatibilti": 48, "last": 49, "moder": 50, "now": 51, "lot": 52, "rank": 53, "asyncio": 54, "split": 55, "bob": 56, "sophist": 57, "tailwindcss": 58, "default": 59, "re": 60, "scale": 61, "datafram": 62, "subclass": 63, "famili": 64, "close_model_picker_dialog": 65, "flow": 66, "crux": 67, "uploadedfil": 68, "someth": 69, "we": 70, "gap": 71, "generic": 72, "it": 73, "actual": 74, "repres": 75, "encourag": 76, "slowli": 77, "shift": 78, "expans": 79, "thalnerkar": 80, "queu": 81, "pyproject": 82, "increment": 83, "operating_system": 84, "page_a": 85, "1000": 86, "real": 87, "button_toggl": 88, "over": 89, "power": 90, "complement": 91, "spinner": 92, "mesop_state_session_backend_sql_t": 93, "align_item": 94, "choic": 95, "risk": 96, "differenti": 97, "safest": 98, "indic": 99, "stream": 100, "markdown_demo": 101, "playwright": 102, "fix": 103, "left": 104, "10": 105, "log": 106, "is_load": 107, "verbos": 108, "dispatchev": 109, "note": 110, "constraint": 111, "unique_id": 112, "io": 113, "counter_compon": 114, "src": 115, "upload": 116, "color": 117, "detect": 118, "question": 119, "append": 120, "github": 121, "idea": 122, "typic": 123, "danger": 124, "integr": 125, "cross": 126, "border_radius": 127, "rais": 128, "written": 129, "bin": 130, "width": 131, "opendemogalleryinnewtab": 132, "automat": 133, "protocol": 134, "fuss": 135, "mesop_web_components_http_cache_key": 136, "ultim": 137, "request": 138, "py": 139, "touch": 140, "our": 141, "directori": 142, "favicon": 143, "upgrad": 144, "birthday": 145, "etc": 146, "togeth": 147, "loadev": 148, "str": 149, "were": 150, "sqlalchemi": 151, "filenam": 152, "experi": 153, "abc": 154, "colorto": 155, "explicit": 156, "overflow_i": 157, "len": 158, "download": 159, "40px": 160, "select_demo": 161, "instal": 162, "row": 163, "variabl": 164, "slidetogglechangeev": 165, "mdn": 166, "allowed_script_src": 167, "licens": 168, "checkbox": 169, "ai": 170, "svelt": 171, "mesop_layout_colab": 172, "eventu": 173, "simultan": 174, "transport": 175, "soon": 176, "buttontogglebutton": 177, "reli": 178, "xs": 179, "degrad": 180, "elimin": 181, "on_upload": 182, "long": 183, "sinc": 184, "ahd": 185, "next": 186, "regist": 187, "inadvert": 188, "skew": 189, "agnost": 190, "when": 191, "gemini": 192, "caus": 193, "get_al": 194, "project": 195, "offset": 196, "via": 197, "write": 198, "walk": 199, "colab_run": 200, "librari": 201, "pin": 202, "contain": 203, "ever": 204, "cd": 205, "spin": 206, "desktop": 207, "mobil": 208, "interpol": 209, "typescript": 210, "lifetim": 211, "byte": 212, "async": 213, "letter_spac": 214, "primarili": 215, "weight": 216, "toy": 217, "created_at": 218, "move": 219, "bi": 220, "text_stream": 221, "layoutslot": 222, "white": 223, "tip": 224, "straight": 225, "semant": 226, "workspacefold": 227, "stylesheet": 228, "substr": 229, "full": 230, "check": 231, "id": 232, "root": 233, "block": 234, "determin": 235, "whenev": 236, "2f": 237, "best": 238, "onto": 239, "mesop_static_fold": 240, "size": 241, "uniqu": 242, "involv": 243, "again": 244, "trick": 245, "relax": 246, "box": 247, "ll": 248, "flavor": 249, "bunch": 250, "2024": 251, "manual": 252, "_or_": 253, "websocket": 254, "date": 255, "decrement": 256, "inject": 257, "scroll_into_view": 258, "fruit": 259, "extract": 260, "replac": 261, "claude_3_5_sonnet": 262, "connection_uri": 263, "mel": 264, "profil": 265, "ffffff": 266, "add": 267, "direct": 268, "tailwind_input": 269, "autoplay": 270, "claude_api_key": 271, "frequent": 272, "did": 273, "bad": 274, "take": 275, "correct": 276, "uploadev": 277, "true": 278, "grid_template_column": 279, "36": 280, "24": 281, "insensit": 282, "api_key": 283, "origin": 284, "languag": 285, "so": 286, "decod": 287, "stringent": 288, "slash": 289, "minimum": 290, "scaffold": 291, "advanc": 292, "_blank": 293, "june": 294, "navig": 295, "mesop_concurrent_updates_en": 296, "third": 297, "bash": 298, "whether": 299, "conform": 300, "let": 301, "30": 302, "happen": 303, "server": 304, "age": 305, "display": 306, "give": 307, "search": 308, "mkdir": 309, "special": 310, "160": 311, "none": 312, "680px": 313, "complex_config": 314, "ts": 315, "goto": 316, "info": 317, "violat": 318, "typeset": 319, "wide": 320, "selectopt": 321, "local": 322, "subtre": 323, "mount": 324, "variable_nam": 325, "cdn": 326, "folder": 327, "expiresat": 328, "branch": 329, "find": 330, "includ": 331, "srcdoc": 332, "respect": 333, "higher": 334, "group": 335, "tupl": 336, "fetch": 337, "enterpris": 338, "omit": 339, "attempt": 340, "maco": 341, "starter_kit": 342, "sandbox": 343, "earli": 344, "3d3929": 345, "googleapi": 346, "in_progress": 347, "through": 348, "multi": 349, "score": 350, "object_detector": 351, "pagebst": 352, "content_compon": 353, "top_p": 354, "accept": 355, "z_index": 356, "on_blur": 357, "content": 358, "know": 359, "outlin": 360, "checkboxchangeev": 361, "error": 362, "technolog": 363, "__component__": 364, "con": 365, "stage": 366, "retriev": 367, "dialog": 368, "cursor": 369, "comput": 370, "breakpoint": 371, "onli": 372, "complic": 373, "high": 374, "termin": 375, "until": 376, "start_chat": 377, "congratul": 378, "incom": 379, "worker": 380, "datapick": 381, "verifi": 382, "768px": 383, "which": 384, "bottleneck": 385, "event": 386, "would": 387, "behind": 388, "highlight": 389, "fewer": 390, "zi1dngoryho": 391, "area": 392, "minimalist": 393, "rest": 394, "namedslot": 395, "chatmessag": 396, "handler": 397, "gemini_api_key": 398, "rang": 399, "allowfullscreen": 400, "even": 401, "import": 402, "type": 403, "proxi": 404, "float": 405, "should": 406, "si": 407, "tailwind": 408, "page_b": 409, "also": 410, "broader": 411, "built": 412, "side": 413, "appropri": 414, "stateless": 415, "be": 416, "too": 417, "unit": 418, "16px": 419, "updat": 420, "use_config": 421, "host": 422, "sever": 423, "kw_on": 424, "radioopt": 425, "model_picker_dialog": 426, "multi_page_nav": 427, "justmycod": 428, "some": 429, "venv": 430, "127": 431, "random": 432, "right": 433, "some_cont": 434, "slot": 435, "blue": 436, "downsid": 437, "subject": 438, "isol": 439, "acceleromet": 440, "mutableclass": 441, "endpoint": 442, "center": 443, "grant": 444, "sqlite3": 445, "recommend": 446, "current": 447, "href": 448, "outsid": 449, "protect": 450, "rgba": 451, "abstract": 452, "step": 453, "runtim": 454, "fault": 455, "remot": 456, "dure": 457, "f0f0f0": 458, "consol": 459, "string": 460, "attach": 461, "click_exampl": 462, "startswith": 463, "fulli": 464, "alway": 465, "root_box_styl": 466, "configure_gemini": 467, "face": 468, "1798673386425786724": 469, "label": 470, "coupl": 471, "match": 472, "header": 473, "top_k": 474, "absenc": 475, "unnecessari": 476, "within": 477, "640": 478, "sql": 479, "examples_row": 480, "flask": 481, "fair": 482, "generativeai": 483, "us": 484, "tree": 485, "on_load": 486, "dedic": 487, "believ": 488, "three": 489, "setup": 490, "keep": 491, "hello": 492, "pathmap": 493, "unread": 494, "catch": 495, "dict": 496, "email": 497, "assum": 498, "machin": 499, "couldn": 500, "comprehens": 501, "date_range_pick": 502, "powershel": 503, "text": 504, "webserv": 505, "harshit": 506, "answer": 507, "googl": 508, "mark": 509, "progress_spinn": 510, "edgy0afg6u": 511, "11": 512, "queri": 513, "1800557173073691000": 514, "base64": 515, "bring": 516, "capabl": 517, "e7f2ff": 518, "privacypolicyurl": 519, "congress": 520, "like": 521, "panel": 522, "must": 523, "user_messag": 524, "dialog_act": 525, "loop": 526, "specif": 527, "element": 528, "defined__": 529, "file_cont": 530, "cach": 531, "idiomat": 532, "global": 533, "signific": 534, "how": 535, "content_checkbox": 536, "sent": 537, "sidebar": 538, "ttl": 539, "disk_size_gb": 540, "nested_dict": 541, "nest": 542, "card_head": 543, "consid": 544, "param_to_delet": 545, "dispatch": 546, "mean": 547, "didn": 548, "slider": 549, "refer": 550, "fail": 551, "polici": 552, "plugin": 553, "_this": 554, "compos": 555, "in": 556, "least": 557, "failur": 558, "tool": 559, "00000024": 560, "__user": 561, "keyboard": 562, "cpu": 563, "altern": 564, "dynapubow3aft47i": 565, "go": 566, "alreadi": 567, "produc": 568, "conclus": 569, "call": 570, "i18n": 571, "stateclass": 572, "kufpisujrw": 573, "data_model": 574, "pd": 575, "strength": 576, "unfamiliar": 577, "readabl": 578, "model_messag": 579, "deal": 580, "child": 581, "clean": 582, "up": 583, "exist": 584, "twitter": 585, "mdash": 586, "grow": 587, "pre": 588, "come": 589, "made": 590, "callsit": 591, "2px": 592, "priorit": 593, "radiochangeev": 594, "materi": 595, "inspect": 596, "both": 597, "open": 598, "date_pick": 599, "down": 600, "content_upload": 601, "async_await": 602, "update_st": 603, "sh": 604, "screenshot": 605, "rich": 606, "dswharshit": 607, "input": 608, "query_param": 609, "allow": 610, "daterangepickerchangeev": 611, "frontend": 612, "increas": 613, "shadow": 614, "textarea": 615, "token": 616, "act": 617, "care": 618, "srv": 619, "what": 620, "selected_model": 621, "requir": 622, "reus": 623, "firebaseui": 624, "alt": 625, "hood": 626, "easier": 627, "price": 628, "reason": 629, "prevent": 630, "api": 631, "font_weight": 632, "everyth": 633, "prod_bundl": 634, "done": 635, "usermodel": 636, "unsaf": 637, "xlr8harder": 638, "complex": 639, "easili": 640, "person_dict": 641, "session": 642, "team": 643, "b64encod": 644, "1024": 645, "modeldialogst": 646, "focus": 647, "below": 648, "race": 649, "dom": 650, "gradiomesop": 651, "one": 652, "descript": 653, "callabl": 654, "justify_cont": 655, "purpos": 656, "value2": 657, "page2": 658, "tune": 659, "troubl": 660, "allows_ifram": 661, "list": 662, "style": 663, "expansion_panel": 664, "overview": 665, "20240229": 666, "servic": 667, "css": 668, "lab": 669, "ssh": 670, "mesop_state_session_backend_firestore_collect": 671, "payload": 672, "resolv": 673, "factori": 674, "dif": 675, "offer": 676, "rout": 677, "hot": 678, "tab": 679, "20": 680, "s9ag_yndl0m": 681, "uri": 682, "after": 683, "emit": 684, "troubleshoot": 685, "your": 686, "detection_compon": 687, "larger": 688, "workaround": 689, "set": 690, "small": 691, "consider": 692, "datepick": 693, "font_famili": 694, "boolean": 695, "while": 696, "px": 697, "strict": 698, "autosc": 699, "baseurl": 700, "primit": 701, "untrust": 702, "ide": 703, "line_height": 704, "fast": 705, "app_port": 706, "add_query_param": 707, "code": 708, "wrong": 709, "gh": 710, "flex_grow": 711, "sleep": 712, "box_siz": 713, "execut": 714, "toc": 715, "v2": 716, "fit": 717, "section": 718, "philosophi": 719, "accumul": 720, "sometim": 721, "purpl": 722, "assign": 723, "environ": 724, "_not_": 725, "balanc": 726, "horizont": 727, "instead": 728, "panda": 729, "field": 730, "xhr": 731, "pattern": 732, "fragment": 733, "remind": 734, "fallback": 735, "bundl": 736, "see": 737, "16gb": 738, "read": 739, "simplic": 740, "sequenti": 741, "fraction": 742, "light_mod": 743, "rememb": 744, "rapid": 745, "llm_respons": 746, "jpeg": 747, "enter": 748, "enum": 749, "introduc": 750, "smbah5leri": 751, "develop": 752, "llm": 753, "level": 754, "data": 755, "templat": 756, "instruct": 757, "deep": 758, "imag": 759, "support": 760, "overflow_x": 761, "theme_bright": 762, "feel": 763, "select": 764, "identitytoolkit": 765, "bind": 766, "serializ": 767, "media": 768, "modifi": 769, "outer": 770, "guidanc": 771, "card": 772, "concept": 773, "gcp": 774, "shown": 775, "autocompleteselectionchangeev": 776, "output": 777, "citi": 778, "md": 779, "futur": 780, "5px": 781, "565": 782, "engin": 783, "firebas": 784, "entri": 785, "packag": 786, "replica": 787, "number": 788, "chrome": 789, "combin": 790, "consist": 791, "mesop_state_session_backend": 792, "implement": 793, "max_token": 794, "interoper": 795, "base": 796, "warn": 797, "cancel": 798, "progress": 799, "all": 800, "viewport_s": 801, "tell": 802, "largebinari": 803, "summari": 804, "blur": 805, "ifram": 806, "slide_toggl": 807, "histori": 808, "method": 809, "privileg": 810, "intern": 811, "stale": 812, "retain": 813, "figur": 814, "among": 815, "jupyt": 816, "serv": 817, "custom": 818, "possibl": 819, "jsdelivr": 820, "few": 821, "ci": 822, "cannot": 823, "may": 824, "desir": 825, "index": 826, "concurr": 827, "border": 828, "250px": 829, "everi": 830, "classif": 831, "alic": 832, "asset": 833, "manual_sc": 834, "valid": 835, "https": 836, "ui": 837, "home_pag": 838, "flexbox": 839, "pick": 840, "streamlin": 841, "boilerpl": 842, "featur": 843, "knowledg": 844, "def": 845, "set_claude_api_key": 846, "referrerpolici": 847, "main": 848, "document": 849, "off": 850, "authent": 851, "delet": 852, "autocompleteenterev": 853, "network": 854, "store": 855, "regular": 856, "tabl": 857, "_ondecr": 858, "http": 859, "toggle_them": 860, "load_complex_config": 861, "minor": 862, "font_siz": 863, "namespac": 864, "vscode": 865, "microphon": 866, "probabl": 867, "ubuntu22": 868, "lost": 869, "on_ent": 870, "releas": 871, "mistak": 872, "inner": 873, "accur": 874, "amongst": 875, "all_valu": 876, "nav": 877, "tradit": 878, "devtool": 879, "experiment": 880, "product": 881, "dark": 882, "gray": 883, "url": 884, "expertis": 885, "toggl": 886, "second": 887, "itself": 888, "caveat": 889, "sign": 890, "send_prompt": 891, "autom": 892, "suffici": 893, "first": 894, "config": 895, "paramet": 896, "gunicorn": 897, "usag": 898, "models_px": 899, "programmingerror": 900, "respond": 901, "script": 902, "path": 903, "nav_compon": 904, "goe": 905, "transmit": 906, "kit": 907, "send": 908, "busi": 909, "encrypt": 910, "strategi": 911, "decreas": 912, "communic": 913, "thread": 914, "build": 915, "static": 916, "focus_compon": 917, "other": 918, "emoji": 919, "impos": 920, "trust": 921, "web_compon": 922, "locat": 923, "v1": 924, "don": 925, "eas": 926, "audio": 927, "mesop_prod_unredacted_error": 928, "incompat": 929, "mani": 930, "starter": 931, "hub": 932, "screen": 933, "cover": 934, "social": 935, "divid": 936, "max": 937, "command": 938, "those": 939, "duochat": 940, "function": 941, "mode": 942, "module_nam": 943, "initial_input_valu": 944, "various": 945, "prompt": 946, "compromis": 947, "decrementev": 948, "toler": 949, "480": 950, "doc": 951, "selectselectionchangeev": 952, "correspond": 953, "chat": 954, "exc": 955, "understand": 956, "justify_item": 957, "hf": 958, "commit": 959, "difficult": 960, "embrac": 961, "tri": 962, "prebuilt": 963, "access": 964, "video": 965, "avail": 966, "rare": 967, "picker": 968, "js": 969, "progress_bar": 970, "ani": 971, "more": 972, "themevar": 973, "create_al": 974, "db": 975, "ecosystem": 976, "selectopenedchangeev": 977, "expand": 978, "create_wsgi_app": 979, "unselect": 980, "adapt": 981, "foo": 982, "mesop_state_session_backend_file_base_dir": 983, "construct": 984, "platform": 985, "welcom": 986, "facilit": 987, "categori": 988, "expansionpaneltoggleev": 989, "2fr": 990, "matplotlib": 991, "limit": 992, "allowed_connect_src": 993, "o1": 994, "frame": 995, "page1": 996, "multipl": 997, "occasion": 998, "revers": 999, "result": 1000, "time": 1001, "valuabl": 1002, "unopinion": 1003, "userprofil": 1004, "cmd": 1005, "margin": 1006, "lose": 1007, "order": 1008, "repeated_param": 1009, "scienc": 1010, "want": 1011, "login": 1012, "placehold": 1013, "theme": 1014, "continu": 1015, "bill": 1016, "dump": 1017, "convers": 1018, "menu_width": 1019, "vast": 1020, "prefix": 1021, "vcpu": 1022, "run": 1023, "writeabl": 1024, "deliv": 1025, "share": 1026, "lower": 1027, "call_api": 1028, "card_cont": 1029, "pip": 1030, "trustedhtml": 1031, "tend": 1032, "model": 1033, "liter": 1034, "_root": 1035, "old": 1036, "complet": 1037, "insid": 1038, "api_respons": 1039, "charset": 1040, "common": 1041, "well": 1042, "show": 1043, "persist": 1044, "markdown": 1045, "unifi": 1046, "traceback": 1047, "dsl": 1048, "extend": 1049, "demonstr": 1050, "num": 1051, "around": 1052, "card_act": 1053, "serial": 1054, "anchor": 1055, "resourc": 1056, "suitabl": 1057, "has": 1058, "found": 1059, "point": 1060, "excel": 1061, "select_menu_key": 1062, "pointer": 1063, "deeper": 1064, "notebook": 1065, "structur": 1066, "accordion": 1067, "plan": 1068, "target": 1069, "integ": 1070, "change_model_opt": 1071, "reset": 1072, "image_data": 1073, "uncom": 1074, "autocompleteopt": 1075, "goodby": 1076, "adc": 1077, "repositori": 1078, "display_convers": 1079, "calendar": 1080, "expos": 1081, "web": 1082, "expect": 1083, "800": 1084, "valu": 1085, "1px": 1086, "trigger": 1087, "slow": 1088, "onc": 1089, "500": 1090, "manner": 1091, "name": 1092, "grid": 1093, "runtime_config": 1094, "popular": 1095, "5etfw": 1096, "content_button": 1097, "generat": 1098, "ps1": 1099, "budget": 1100, "2rem": 1101, "quota": 1102, "system": 1103, "modular": 1104, "stack": 1105, "visual": 1106, "dockerfil": 1107, "await": 1108, "chunk": 1109, "navigate_hom": 1110, "set_theme_mod": 1111, "under": 1112, "disabl": 1113, "class": 1114, "prioriti": 1115, "lit": 1116, "init": 1117, "firebaseconfig": 1118, "site": 1119, "program": 1120, "latest": 1121, "wrapper": 1122, "html_demo": 1123, "mutabl": 1124, "friction": 1125, "each": 1126, "on_load_gener": 1127, "restart": 1128, "evalu": 1129, "belief": 1130, "click": 1131, "smaller": 1132, "content_layout": 1133, "window": 1134, "logo": 1135, "nativ": 1136, "clariti": 1137, "firebase_auth_app": 1138, "decor": 1139, "linux": 1140, "doubl": 1141, "state": 1142, "rerun": 1143, "moment": 1144, "32123": 1145, "2767": 1146, "code_demo": 1147, "memory_gb": 1148, "is_desktop": 1149, "dangerously_disable_trusted_typ": 1150, "reduc": 1151, "runtime_vers": 1152, "permiss": 1153, "snippet": 1154, "evolv": 1155, "often": 1156, "roundtrip": 1157, "street": 1158, "on_login": 1159, "instant": 1160, "on_chang": 1161, "spec": 1162, "approach": 1163, "repeat": 1164, "goal": 1165, "night": 1166, "trail": 1167, "exampl": 1168, "object": 1169, "wildcard": 1170, "most": 1171, "veri": 1172, "modern": 1173, "polic": 1174, "unhandl": 1175, "could": 1176, "inputblurev": 1177, "problem": 1178, "follow": 1179, "infrastructur": 1180, "model_nam": 1181, "filter": 1182, "further": 1183, "deseri": 1184, "confirm_model_picker_dialog": 1185, "arbitrari": 1186, "lock": 1187, "plumb": 1188, "straightforward": 1189, "congrat": 1190, "text_to_imag": 1191, "red": 1192, "ok": 1193, "recogn": 1194, "mention": 1195, "veloc": 1196, "unredact": 1197, "dataclass": 1198, "syntax": 1199, "later": 1200, "subdomain": 1201, "icon": 1202, "oftentim": 1203, "tooltip": 1204, "scalabl": 1205, "pro": 1206, "them": 1207, "back": 1208, "cell": 1209, "attribut": 1210, "ttls": 1211, "prototyp": 1212, "gcp_project": 1213, "debug": 1214, "closur": 1215, "page": 1216, "guid": 1217, "behavior": 1218, "much": 1219, "cloud": 1220, "component_help": 1221, "call_claude_sonnet": 1222, "hello_world": 1223, "abov": 1224, "milk": 1225, "databas": 1226, "potenti": 1227, "toml": 1228, "ctrl": 1229, "role": 1230, "comparison": 1231, "grand": 1232, "node": 1233, "befor": 1234, "bodi": 1235, "migrat": 1236, "val": 1237, "fff": 1238, "new": 1239, "innerhtml": 1240, "sidenav": 1241, "firestor": 1242, "attract": 1243, "effortless": 1244, "allowed_iframe_par": 1245, "dev": 1246, "counter": 1247, "net": 1248, "put": 1249, "larg": 1250, "sanit": 1251, "your_servic": 1252, "yield": 1253, "config_json": 1254, "auth": 1255, "past": 1256, "anoth": 1257, "compon": 1258, "7anchay": 1259, "blob": 1260, "improv": 1261, "gemini_1_5_pro": 1262, "readi": 1263, "page_2": 1264, "text_to_text": 1265, "ipython": 1266, "newer": 1267, "clickjack": 1268, "convert": 1269, "send_prompt_flash": 1270, "word": 1271, "between": 1272, "calc": 1273, "intermedi": 1274, "overal": 1275, "backward": 1276, "grid_template_row": 1277, "detail": 1278, "requisit": 1279, "solut": 1280, "amount": 1281, "out": 1282, "h1": 1283, "clear": 1284, "final": 1285, "safe": 1286, "obj": 1287, "shell": 1288, "slotclass": 1289, "b9e1ff": 1290, "privaci": 1291, "whi": 1292, "flex_direct": 1293, "bat": 1294, "mesopev": 1295, "versatil": 1296, "action": 1297, "hate": 1298, "backend": 1299, "setattr": 1300, "viewport": 1301, "oper": 1302, "optim": 1303, "datepickerchangeev": 1304, "conveni": 1305, "forth": 1306, "black": 1307, "helper": 1308, "ask": 1309, "default_factori": 1310, "gradio": 1311, "establish": 1312, "tmp": 1313, "reload": 1314, "plenti": 1315, "player": 1316, "collect": 1317, "inputev": 1318, "23": 1319, "app": 1320, "light": 1321, "display_messag": 1322, "viewabl": 1323, "chat_input": 1324, "wrestl": 1325, "key": 1326, "better": 1327, "incred": 1328, "checkboxindeterminatechangeev": 1329, "asdict": 1330, "issu": 1331, "anthrop": 1332, "layout": 1333, "part": 1334, "avoid": 1335, "remoteroot": 1336, "extern": 1337, "scope": 1338, "saniti": 1339, "webev": 1340, "connect": 1341, "16": 1342, "scheme": 1343, "memori": 1344, "relat": 1345, "remov": 1346, "aim": 1347, "aren": 1348, "unless": 1349, "html": 1350, "315": 1351, "differ": 1352, "battl": 1353, "proper": 1354, "item": 1355, "where": 1356, "fals": 1357, "curv": 1358, "from": 1359, "buttontogglechangeev": 1360, "tutori": 1361, "95": 1362, "demand": 1363, "fine": 1364, "wire": 1365, "address": 1366, "status": 1367, "primary_key": 1368, "place": 1369, "plot": 1370, "swap": 1371, "anywher": 1372, "disclaim": 1373, "fluid": 1374, "ram": 1375, "assist": 1376, "adopt": 1377, "codelab": 1378, "chat_sess": 1379, "new_param": 1380, "set_gemini_api_key": 1381, "streamlit": 1382, "learn": 1383, "hl_line": 1384, "help": 1385, "compat": 1386, "suit": 1387, "50": 1388, "alloc": 1389, "0000001f": 1390, "bandwidth": 1391, "vs": 1392, "lambda": 1393, "proto": 1394, "csp": 1395, "clone": 1396, "boost": 1397, "still": 1398, "box_shadow": 1399, "stabl": 1400, "firebase_auth_compon": 1401, "leverag": 1402, "liner": 1403, "inspir": 1404, "end": 1405, "achiev": 1406, "mediadevic": 1407, "simplest": 1408, "hint": 1409, "tedious": 1410, "minim": 1411, "sanchay": 1412, "argument": 1413, "format": 1414, "reuseexistingserv": 1415, "my": 1416, "applic": 1417, "get": 1418, "defens": 1419, "blank": 1420, "unsupport": 1421, "drawback": 1422, "colab": 1423, "declar": 1424, "context": 1425, "elem": 1426, "properti": 1427, "dist": 1428, "is_en": 1429, "safelist": 1430, "easi": 1431, "menu": 1432, "anyth": 1433, "delight": 1434, "wiki": 1435, "deploy": 1436, "abl": 1437, "button_click": 1438, "ident": 1439, "emb": 1440, "data_fram": 1441, "effici": 1442, "png": 1443, "communiti": 1444, "1804890091816644906": 1445, "insert_web_compon": 1446, "repo": 1447, "sleek": 1448, "height": 1449, "thing": 1450, "badg": 1451, "5678": 1452, "basemodel": 1453, "nonc": 1454, "response_text": 1455, "entrypoint": 1456, "case": 1457, "count": 1458, "addit": 1459, "en": 1460, "binari": 1461, "instanti": 1462, "link": 1463, "is_open": 1464, "besid": 1465, "receiv": 1466, "12": 1467, "intend": 1468, "activ": 1469, "framebord": 1470, "parti": 1471, "end_of_messag": 1472, "absolut": 1473, "varieti": 1474, "customiz": 1475, "strive": 1476, "jumpstart": 1477, "fastapi": 1478, "save": 1479, "need": 1480, "datetim": 1481, "unfortun": 1482, "native_textarea": 1483, "mutat": 1484, "tyagi": 1485, "demo": 1486, "int": 1487, "on_click": 1488, "yaml": 1489, "bordersid": 1490, "css2": 1491, "json": 1492, "215px": 1493, "lightweight": 1494, "except": 1495, "way": 1496, "handl": 1497, "footer": 1498, "refus": 1499, "pictur": 1500, "firebase_auth": 1501, "self": 1502, "radio": 1503, "charact": 1504, "otherwis": 1505, "del": 1506, "good": 1507, "widget": 1508, "dkvt0rboqumapk5d": 1509, "switch_model": 1510, "form": 1511, "accommod": 1512, "view": 1513, "enhanc": 1514, "pageast": 1515, "make": 1516, "elif": 1517, "util": 1518, "compar": 1519, "defin": 1520, "560px": 1521, "identifi": 1522, "imper": 1523, "is_model_picker_dialog_open": 1524, "can": 1525, "javascript": 1526, "seamless": 1527, "prod": 1528, "localroot": 1529, "sequenc": 1530, "python": 1531, "100": 1532, "659": 1533, "resist": 1534, "e0e0e0": 1535, "copi": 1536, "immut": 1537, "singl": 1538, "longer": 1539, "standard": 1540, "symbol": 1541, "robust": 1542, "affin": 1543, "same": 1544, "myapp": 1545, "ad": 1546, "procfil": 1547, "chang": 1548, "specifi": 1549, "work": 1550, "mesopdeveloperexcept": 1551, "gentl": 1552, "condit": 1553, "getusermedia": 1554, "concaten": 1555, "dark_mod": 1556, "principl": 1557, "39": 1558, "term": 1559, "interfac": 1560, "general": 1561, "resiz": 1562, "break": 1563, "trace": 1564, "paradigm": 1565, "respons": 1566, "perform": 1567, "send_messag": 1568, "link_compon": 1569, "me": 1570, "notic": 1571, "hashtag": 1572, "front": 1573, "admin": 1574, "subtl": 1575, "contribut": 1576, "client": 1577, "progressbaranimationendev": 1578, "finish": 1579, "individu": 1580, "nestedst": 1581, "bottom": 1582, "statement": 1583, "txt": 1584, "footgun": 1585, "dictionari": 1586, "metadata": 1587, "have": 1588, "credenti": 1589, "think": 1590, "callback": 1591, "process": 1592, "detect_object": 1593, "typeerror": 1594, "print": 1595, "kind": 1596, "person": 1597, "framework": 1598, "doesn": 1599, "you": 1600, "doe": 1601, "refin": 1602, "mesop_websockets_en": 1603, "content_slide_toggl": 1604, "appli": 1605, "myapppath": 1606, "headlin": 1607, "do": 1608, "theme_var": 1609, "tosurl": 1610, "max_output_token": 1611, "use": 1612, "explain": 1613, "angular": 1614, "overridden": 1615, "contact": 1616, "line": 1617, "sensit": 1618, "design": 1619, "confid": 1620, "posit": 1621, "inputenterev": 1622, "cryptic": 1623, "away": 1624, "messag": 1625, "900": 1626, "adjust": 1627, "convent": 1628, "pass": 1629, "usual": 1630, "depend": 1631, "banana": 1632, "keyerror": 1633, "logic": 1634, "file": 1635, "clipboard": 1636, "flex": 1637, "bar": 1638, "gyroscop": 1639, "traffic": 1640, "than": 1641, "debugg": 1642, "strong": 1643, "hidden": 1644, "viewer": 1645, "dynam": 1646, "although": 1647, "wsgi_app": 1648, "transform": 1649, "whichev": 1650, "64": 1651, "known": 1652, "granular": 1653, "anti": 1654, "initial_valu": 1655, "hide": 1656, "wwwillchen": 1657, "treat": 1658, "generativemodel": 1659, "separ": 1660, "creat": 1661, "3px": 1662, "utf": 1663, "join": 1664, "clickev": 1665, "parent": 1666, "mesop_http_cache_js_bundl": 1667, "gcloud": 1668, "hug": 1669, "docker": 1670, "version": 1671, "confidenti": 1672, "appl": 1673, "medium": 1674, "mesop": 1675, "essenti": 1676, "colorfrom": 1677, "especi": 1678, "flash": 1679, "virtual": 1680, "env": 1681, "_zr64fycojgbcdqbjpla": 1682, "sourc": 1683, "set_page_titl": 1684, "listen": 1685, "bucket": 1686, "core": 1687, "quiet": 1688, "wsgi": 1689, "galleri": 1690, "becom": 1691, "component_": 1692, "invalid": 1693, "min": 1694, "home": 1695, "table_nam": 1696, "given": 1697, "slide": 1698, "quick": 1699, "domain": 1700, "own": 1701, "abil": 1702, "mesop_static_url_path": 1703, "cdns": 1704, "captur": 1705, "mesop_app_base_path": 1706, "depth": 1707, "pic": 1708, "nice": 1709, "success": 1710, "prefer": 1711, "ml": 1712, "tier": 1713, "though": 1714, "browser": 1715, "manag": 1716, "trustedscripturl": 1717, "ico": 1718, "bg": 1719, "ipynb": 1720, "less": 1721, "exact": 1722, "two": 1723, "1028": 1724, "due": 1725, "temperatur": 1726, "680": 1727, "shortcut": 1728, "current_input_valu": 1729, "becaus": 1730, "readm": 1731, "world": 1732, "font": 1733, "test": 1734, "a_web_compon": 1735, "trustworthi": 1736, "show_menu_button": 1737, "pad": 1738, "autocomplet": 1739, "dialog_st": 1740, "input_valu": 1741, "50vh": 1742, "0003": 1743, "send_prompt_pro": 1744, "var": 1745, "across": 1746, "mechan": 1747, "button": 1748, "space": 1749, "ambigu": 1750, "wait": 1751, "git": 1752, "apach": 1753, "port": 1754, "minut": 1755, "almost": 1756, "steeper": 1757, "awar": 1758, "decoupl": 1759, "inter": 1760, "showcas": 1761, "associ": 1762, "launch": 1763, "initi": 1764, "slidervaluechangeev": 1765, "bool": 1766, "switch": 1767, "conversation_pag": 1768, "interact": 1769, "click_navigate_button": 1770, "generation_config": 1771, "column": 1772, "magic": 1773, "pretti": 1774, "youtub": 1775, "8080": 1776, "look": 1777, "previous": 1778, "sorri": 1779, "vertic": 1780, "push": 1781, "offici": 1782, "variat": 1783, "your_project_id": 1784, "flexibl": 1785, "start": 1786, "per": 1787, "life": 1788, "disk": 1789, "here": 1790, "wght": 1791, "claud": 1792, "redact": 1793, "huggingfac": 1794, "maintain": 1795, "describ": 1796, "load": 1797, "reusabl": 1798, "param_nam": 1799, "secur": 1800, "100vh": 1801, "howev": 1802, "serious": 1803, "without": 1804, "unnecessarili": 1805, "imagin": 1806, "somewher": 1807, "iter": 1808, "debugpi": 1809, "umd": 1810, "critic": 1811, "ensur": 1812, "_first_": 1813, "town": 1814, "aj4rqzs2mmwvxfo": 1815, "top": 1816, "enabl": 1817, "leak": 1818, "similar": 1819, "densiti": 1820, "been": 1821, "els": 1822, "ren": 1823, "gemini_1_5_flash": 1824, "extrem": 1825, "encod": 1826, "architectur": 1827, "pros": 1828, "account": 1829, "explor": 1830, "quickstart": 1831, "counter_component_app": 1832, "560": 1833, "ve": 1834, "wrap": 1835, "mesop_base_url_path": 1836, "either": 1837, "dens": 1838, "cloudsql": 1839, "control": 1840, "standalon": 1841, "on_auth_chang": 1842, "research": 1843, "32px": 1844, "param": 1845, "create_engin": 1846, "free": 1847, "low": 1848, "problemat": 1849, "named_slot": 1850, "value1": 1851, "scratch": 1852, "entir": 1853, "__native__": 1854, "8192": 1855, "localhost": 1856, "say": 1857, "scroll": 1858, "co": 1859, "equival": 1860, "zone": 1861, "defer": 1862, "empti": 1863, "render": 1864, "sure": 1865, "sonnet": 1866, "align": 1867, "status_cod": 1868, "beginn": 1869, "sdk": 1870, "hamburg": 1871, "postgresql": 1872, "modul": 1873, "rather": 1874, "socket": 1875, "symmetr": 1876, "deprec": 1877, "auto": 1878, "switcher": 1879, "confirm": 1880, "814": 1881, "annot": 1882, "particular": 1883, "just": 1884, "content__inn": 1885, "intuit": 1886, "buffer": 1887, "ref_src": 1888, "1fr": 1889, "www": 1890, "sort": 1891, "background_color": 1892, "mesop_state_sess": 1893, "simpl": 1894, "mesop_colab_getting_start": 1895, "anatomi": 1896, "option": 1897, "choos": 1898, "on_input": 1899, "mesop_state_session_backend_sql_connection_uri": 1900, "dozen": 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": {"cddb75d8-1788-48b2-acd4-15b83e3a44c4": {"__type__": "vector_store", "__data__": "{\"index_id\": \"cddb75d8-1788-48b2-acd4-15b83e3a44c4\", \"summary\": null, \"nodes_dict\": {\"d01a41e6-8420-480a-9ce5-e6bebec77cf7\": \"d01a41e6-8420-480a-9ce5-e6bebec77cf7\", \"79bd125c-1828-4d70-a69f-0995989efca2\": \"79bd125c-1828-4d70-a69f-0995989efca2\", \"7176af37-87b6-4a26-b1f7-789c1a608b96\": \"7176af37-87b6-4a26-b1f7-789c1a608b96\", \"42b4b67d-87c2-45d7-bca5-275fdcc012fd\": \"42b4b67d-87c2-45d7-bca5-275fdcc012fd\", \"fbcc3ff6-0f89-4a3f-b1e0-a270380c0e32\": \"fbcc3ff6-0f89-4a3f-b1e0-a270380c0e32\", \"e6ed9231-df03-4f37-a120-84153a732c01\": \"e6ed9231-df03-4f37-a120-84153a732c01\", \"03ed8b20-9a76-4742-8336-fa453a6b2508\": \"03ed8b20-9a76-4742-8336-fa453a6b2508\", \"7c1ac6a1-2e24-4ee9-8bfa-9d9c37e03129\": \"7c1ac6a1-2e24-4ee9-8bfa-9d9c37e03129\", \"a6f2f452-48cc-43f4-ad9b-51b2bd49a35d\": \"a6f2f452-48cc-43f4-ad9b-51b2bd49a35d\", \"dc782681-b3fb-4224-9a6c-efecff98d416\": \"dc782681-b3fb-4224-9a6c-efecff98d416\", \"72dc1972-c081-4995-9194-395896416759\": \"72dc1972-c081-4995-9194-395896416759\", \"8012763a-01dc-439e-b1d1-e98a76d9e8b5\": \"8012763a-01dc-439e-b1d1-e98a76d9e8b5\", \"f276bbd5-ad77-4572-8c4c-26e030ac69ad\": \"f276bbd5-ad77-4572-8c4c-26e030ac69ad\", \"624923f9-89e6-453f-8eda-b98d5b517fe2\": \"624923f9-89e6-453f-8eda-b98d5b517fe2\", \"b368efb8-bd78-45a1-9323-a5d080522fe5\": \"b368efb8-bd78-45a1-9323-a5d080522fe5\", \"f3aacb81-0271-4fb4-8d8b-de1003f57ec5\": \"f3aacb81-0271-4fb4-8d8b-de1003f57ec5\", \"941e20f8-0d58-4fc8-961e-df1afc310cc0\": \"941e20f8-0d58-4fc8-961e-df1afc310cc0\", \"385cee15-2287-4dab-9ddf-947fcfad5894\": \"385cee15-2287-4dab-9ddf-947fcfad5894\", \"490da0b0-8ecd-413b-bac6-85b8ea158c5b\": \"490da0b0-8ecd-413b-bac6-85b8ea158c5b\", \"a6468848-bdc0-45f4-8189-6237e2f8926e\": \"a6468848-bdc0-45f4-8189-6237e2f8926e\", \"266e9e94-a4a2-4504-9bdf-82837ae0110b\": \"266e9e94-a4a2-4504-9bdf-82837ae0110b\", \"72e86cce-fac4-4941-9866-80dbb46bb0c4\": \"72e86cce-fac4-4941-9866-80dbb46bb0c4\", \"629d456d-2954-47ca-897c-a411d9896874\": \"629d456d-2954-47ca-897c-a411d9896874\", \"7cc17ef6-5592-45b3-b215-e199d68a4f95\": \"7cc17ef6-5592-45b3-b215-e199d68a4f95\", \"4bbee23c-7aaa-4f5b-ba62-775435e047fe\": \"4bbee23c-7aaa-4f5b-ba62-775435e047fe\", \"314da1e0-4f44-4fa8-8996-c5a735c3e35d\": \"314da1e0-4f44-4fa8-8996-c5a735c3e35d\", \"fe50ff73-4b86-4cc6-965a-1f869fcad61a\": \"fe50ff73-4b86-4cc6-965a-1f869fcad61a\", \"0cbf5be1-053a-4f1f-a109-c96f0b321c17\": \"0cbf5be1-053a-4f1f-a109-c96f0b321c17\", \"4cd80548-015c-48d1-b3ea-7ace4fd42db8\": \"4cd80548-015c-48d1-b3ea-7ace4fd42db8\", \"8c496c4c-2c41-44c2-9766-d0f6a3d0eef6\": \"8c496c4c-2c41-44c2-9766-d0f6a3d0eef6\", \"65d8d5e0-0df0-4b49-8075-82ad8bc4db5c\": \"65d8d5e0-0df0-4b49-8075-82ad8bc4db5c\", \"7eda6af1-6a0d-450f-91b1-6d191a3232d8\": \"7eda6af1-6a0d-450f-91b1-6d191a3232d8\", \"9990921e-a103-46f1-ac30-fe9d0663a09a\": \"9990921e-a103-46f1-ac30-fe9d0663a09a\", \"954d1866-ae84-4c41-be7c-6b3201e165cb\": \"954d1866-ae84-4c41-be7c-6b3201e165cb\", \"53eeccbb-a462-46e5-9da4-34ac289b15c3\": \"53eeccbb-a462-46e5-9da4-34ac289b15c3\", \"b3775820-2c93-4870-96fb-242b6076c5a3\": \"b3775820-2c93-4870-96fb-242b6076c5a3\", \"4fe8e681-8353-4bfd-a1d7-6750cb1aeb52\": \"4fe8e681-8353-4bfd-a1d7-6750cb1aeb52\", \"908301f5-ebec-4626-b213-abd86832b79b\": \"908301f5-ebec-4626-b213-abd86832b79b\", \"c2fb93d1-5831-4a1b-b43a-a859bf1eb1ac\": \"c2fb93d1-5831-4a1b-b43a-a859bf1eb1ac\", \"6917fec5-9fa3-467f-b7da-55754883c083\": \"6917fec5-9fa3-467f-b7da-55754883c083\", \"b50d74be-f673-4960-a2cc-0f9e432ffe63\": \"b50d74be-f673-4960-a2cc-0f9e432ffe63\", \"6ebff458-54c9-46c6-a529-ae908b651e65\": \"6ebff458-54c9-46c6-a529-ae908b651e65\", \"9086c2d2-eb27-4244-9c5d-bc5aa0b39f08\": \"9086c2d2-eb27-4244-9c5d-bc5aa0b39f08\", \"59231a30-caef-4885-bb15-24a0620ad4b7\": \"59231a30-caef-4885-bb15-24a0620ad4b7\", \"2a48c07a-6b57-4268-b31a-a625501203be\": \"2a48c07a-6b57-4268-b31a-a625501203be\", \"4e936778-1f9d-422b-937b-ed7911700359\": \"4e936778-1f9d-422b-937b-ed7911700359\", \"36b7ac9b-a3b3-4351-907a-61b04dd5d0ba\": \"36b7ac9b-a3b3-4351-907a-61b04dd5d0ba\", \"2b7a1813-6fde-40b3-84a5-5b88ce257241\": \"2b7a1813-6fde-40b3-84a5-5b88ce257241\", \"f22fd3f2-2b22-4314-bf2f-e0045a358659\": \"f22fd3f2-2b22-4314-bf2f-e0045a358659\", \"994a858a-ed03-4181-9f69-b257b6303d16\": \"994a858a-ed03-4181-9f69-b257b6303d16\", \"259721dc-73d5-4ce1-8973-fb7da5b3d2e2\": \"259721dc-73d5-4ce1-8973-fb7da5b3d2e2\", \"5ce09036-4220-4d15-b559-3bfd329ab565\": \"5ce09036-4220-4d15-b559-3bfd329ab565\", \"85475931-6197-409d-a83d-48402d1ea0a6\": \"85475931-6197-409d-a83d-48402d1ea0a6\", \"3fd1a414-08d2-41b1-bf42-f10ae15f0944\": \"3fd1a414-08d2-41b1-bf42-f10ae15f0944\", \"88dd2c41-7d41-43fc-a8d0-70e6b8d34f6d\": \"88dd2c41-7d41-43fc-a8d0-70e6b8d34f6d\", \"2b7db190-520d-4262-af40-59807e7f15c7\": \"2b7db190-520d-4262-af40-59807e7f15c7\", \"c357a7bd-fa43-4dd7-8785-c107d5ad0d9e\": \"c357a7bd-fa43-4dd7-8785-c107d5ad0d9e\", \"4924b6b8-0c68-4470-9ca5-d890bdfc4bb0\": \"4924b6b8-0c68-4470-9ca5-d890bdfc4bb0\", \"9f23c977-43f0-4af7-8e78-b8b2a102f2f5\": \"9f23c977-43f0-4af7-8e78-b8b2a102f2f5\", \"1ba7c750-3d1e-4a97-a0a1-252452180aac\": \"1ba7c750-3d1e-4a97-a0a1-252452180aac\", \"9b1230ce-eeae-4960-bb56-a241ad377188\": \"9b1230ce-eeae-4960-bb56-a241ad377188\", \"9326727b-6779-49e2-9bb4-425190a36bfc\": \"9326727b-6779-49e2-9bb4-425190a36bfc\", \"d3aba67b-75c4-444e-b9ad-14c8dccc3be4\": \"d3aba67b-75c4-444e-b9ad-14c8dccc3be4\", \"e9d58004-b203-459e-946b-9af27203b8fe\": \"e9d58004-b203-459e-946b-9af27203b8fe\", \"2836c3de-6ec0-4d52-846b-dec7a8d2acde\": \"2836c3de-6ec0-4d52-846b-dec7a8d2acde\", \"43c46b35-36a4-40c2-ba8f-ad0953e68b63\": \"43c46b35-36a4-40c2-ba8f-ad0953e68b63\", \"ac046d70-296c-433b-bcb4-27e6b118a4b2\": \"ac046d70-296c-433b-bcb4-27e6b118a4b2\", \"9e6c103a-afd8-4af3-8d89-f1c743f05c79\": \"9e6c103a-afd8-4af3-8d89-f1c743f05c79\", \"b54ea07d-c976-4a42-b5b6-18d0ea5ac3b0\": \"b54ea07d-c976-4a42-b5b6-18d0ea5ac3b0\", \"15568fcf-b627-4370-9e87-f200ba8b8291\": \"15568fcf-b627-4370-9e87-f200ba8b8291\", \"f07b456f-8370-4383-8783-affcfa49bc77\": \"f07b456f-8370-4383-8783-affcfa49bc77\", \"531c3037-2301-45b8-98fa-0bebf663f2cd\": \"531c3037-2301-45b8-98fa-0bebf663f2cd\", \"d918953d-8408-4905-8942-95fb26464958\": \"d918953d-8408-4905-8942-95fb26464958\", \"6c0f90ad-c94c-4ad4-8b80-765c539a74c0\": \"6c0f90ad-c94c-4ad4-8b80-765c539a74c0\", \"f6fa6765-cd46-4d8b-bb76-69cc4dc9044a\": \"f6fa6765-cd46-4d8b-bb76-69cc4dc9044a\", \"67e96a41-3617-49a3-b046-09782f081646\": \"67e96a41-3617-49a3-b046-09782f081646\", \"232ccc7c-38c5-4ab5-983d-e8821da597bf\": \"232ccc7c-38c5-4ab5-983d-e8821da597bf\", \"863d21c7-48c5-4791-acdd-3e90e31785ea\": \"863d21c7-48c5-4791-acdd-3e90e31785ea\", \"780c6ca6-0b93-46d8-a560-659e89ed979a\": \"780c6ca6-0b93-46d8-a560-659e89ed979a\", \"3c207eb7-47aa-4bb2-b5df-81d8ba2dab46\": \"3c207eb7-47aa-4bb2-b5df-81d8ba2dab46\", \"597827fb-6078-429d-857c-6e1e20100a7a\": \"597827fb-6078-429d-857c-6e1e20100a7a\", \"3899dfb9-99e6-48af-a5f8-f2ce915a048d\": \"3899dfb9-99e6-48af-a5f8-f2ce915a048d\", \"6e6e5d8a-c982-4175-8d79-e6c81edbc031\": \"6e6e5d8a-c982-4175-8d79-e6c81edbc031\", \"2fcc0faf-fd11-4dac-8306-6c8b40a842af\": \"2fcc0faf-fd11-4dac-8306-6c8b40a842af\", \"00496821-824b-4da1-8cdc-a4484365e3d2\": \"00496821-824b-4da1-8cdc-a4484365e3d2\", \"0be48d44-d44c-44ae-bd30-8504d81faf2a\": \"0be48d44-d44c-44ae-bd30-8504d81faf2a\", \"cc739371-5ec4-4ca3-bbc1-5dfa56b7f7ef\": \"cc739371-5ec4-4ca3-bbc1-5dfa56b7f7ef\", \"0b2e4028-95ca-4c81-aa47-998bf50ad486\": \"0b2e4028-95ca-4c81-aa47-998bf50ad486\", \"95b83192-c4a4-46ad-8317-d872486c027a\": \"95b83192-c4a4-46ad-8317-d872486c027a\", \"5194f181-00d8-45cc-ba9e-2f1f530798fd\": \"5194f181-00d8-45cc-ba9e-2f1f530798fd\", \"c929ed77-3f62-402a-a7f6-01225c7881b6\": \"c929ed77-3f62-402a-a7f6-01225c7881b6\", \"78a98af1-a1ac-405f-bd0e-e04182268a80\": \"78a98af1-a1ac-405f-bd0e-e04182268a80\", \"a67bc623-3547-418a-b8b9-1f1075af6f35\": \"a67bc623-3547-418a-b8b9-1f1075af6f35\", \"405a1273-64be-4975-9d57-bd75dbeb89e1\": \"405a1273-64be-4975-9d57-bd75dbeb89e1\", \"4f7305ca-b848-4a39-b16c-ca183e58b20a\": \"4f7305ca-b848-4a39-b16c-ca183e58b20a\", \"426894b3-de2c-4a1f-bca2-16c90f6b0409\": \"426894b3-de2c-4a1f-bca2-16c90f6b0409\", \"6fa8e99e-94e9-4b9b-9943-e8d9866900d3\": \"6fa8e99e-94e9-4b9b-9943-e8d9866900d3\", \"fec1a42e-084b-4ff7-a9ee-33db7ced9499\": \"fec1a42e-084b-4ff7-a9ee-33db7ced9499\", \"08a7cbf8-6bdb-47ad-a015-e8c0d2ddf47e\": \"08a7cbf8-6bdb-47ad-a015-e8c0d2ddf47e\", \"35056d3f-46ae-4cb9-94fc-e5dcf50c719b\": \"35056d3f-46ae-4cb9-94fc-e5dcf50c719b\", \"1b75f7b1-585e-42f2-892a-2db30f2b334b\": \"1b75f7b1-585e-42f2-892a-2db30f2b334b\", \"0bcc91b9-1810-42d9-b3e2-aa4f164941cb\": \"0bcc91b9-1810-42d9-b3e2-aa4f164941cb\", \"bef0f8e4-e999-4d50-9a67-bbde6e9d78d3\": \"bef0f8e4-e999-4d50-9a67-bbde6e9d78d3\", \"4d49af7e-9cd4-47b9-ac06-b54d68468d40\": \"4d49af7e-9cd4-47b9-ac06-b54d68468d40\", \"0813e5d0-d9cb-4ae2-8eb0-9259caf84c2d\": \"0813e5d0-d9cb-4ae2-8eb0-9259caf84c2d\", \"cc33b3cf-9a65-45fc-9e5a-156459adabd4\": \"cc33b3cf-9a65-45fc-9e5a-156459adabd4\", \"5f1bfffe-7578-4188-b632-3c125b074b5b\": \"5f1bfffe-7578-4188-b632-3c125b074b5b\", \"0e13c12c-6e35-41fd-8be4-6cc20cb6bc19\": \"0e13c12c-6e35-41fd-8be4-6cc20cb6bc19\", \"3b4a4bbd-84f4-44a9-9710-56f437d4f6c6\": \"3b4a4bbd-84f4-44a9-9710-56f437d4f6c6\", \"dd89ec61-b2ef-4af8-9ffc-8bba5cc79900\": \"dd89ec61-b2ef-4af8-9ffc-8bba5cc79900\", \"17b7e35f-4afe-4c96-bb7d-870727d1e41d\": \"17b7e35f-4afe-4c96-bb7d-870727d1e41d\", \"5cec8a45-d7d1-48f3-8cd9-f88f5d4b9514\": \"5cec8a45-d7d1-48f3-8cd9-f88f5d4b9514\", \"48181add-5e01-4544-8543-a2c32eec3e85\": \"48181add-5e01-4544-8543-a2c32eec3e85\", \"c01b7e88-88be-4a93-b0c3-1b4924a0d57d\": \"c01b7e88-88be-4a93-b0c3-1b4924a0d57d\", \"01e1a665-34a3-44f8-8dbe-45bae8781de3\": \"01e1a665-34a3-44f8-8dbe-45bae8781de3\", \"c3c0cdcf-9518-4372-967f-5624bc71ef38\": \"c3c0cdcf-9518-4372-967f-5624bc71ef38\", \"0fa30d29-1b91-4684-bcb3-a7dedcedb3ce\": \"0fa30d29-1b91-4684-bcb3-a7dedcedb3ce\", \"67f63002-e3e3-4dc9-8181-d50e525e0e13\": \"67f63002-e3e3-4dc9-8181-d50e525e0e13\", \"87b61399-9318-4087-a7f5-5ba6cbfdad84\": \"87b61399-9318-4087-a7f5-5ba6cbfdad84\", \"d9c10d00-eb90-4a9b-b707-acab399461c8\": \"d9c10d00-eb90-4a9b-b707-acab399461c8\", \"0ecec2da-1c8c-4f5a-9813-31f2b1fd0ea3\": \"0ecec2da-1c8c-4f5a-9813-31f2b1fd0ea3\", \"a107ff2b-c2df-468d-871c-f979ad64f3b6\": \"a107ff2b-c2df-468d-871c-f979ad64f3b6\", \"afae7604-6df0-47ff-a103-1d4eb9cbc004\": \"afae7604-6df0-47ff-a103-1d4eb9cbc004\", \"c8183e3d-ce7f-4f3d-a69e-83663219de0f\": \"c8183e3d-ce7f-4f3d-a69e-83663219de0f\", \"f1da13c5-dc07-474f-868b-ba0b678800e0\": \"f1da13c5-dc07-474f-868b-ba0b678800e0\", \"d51380c0-28d4-41ed-a371-f2456230d42d\": \"d51380c0-28d4-41ed-a371-f2456230d42d\", \"daf35cc3-34fc-4fbe-97a0-e9b1416a18c9\": \"daf35cc3-34fc-4fbe-97a0-e9b1416a18c9\", \"b44a9988-6151-4db3-b09a-cccbdb15589e\": \"b44a9988-6151-4db3-b09a-cccbdb15589e\", \"4a512014-5f4b-453b-807b-89b842d4b211\": \"4a512014-5f4b-453b-807b-89b842d4b211\", \"4f36c21c-9739-4141-a2f1-2a3d57c9e016\": \"4f36c21c-9739-4141-a2f1-2a3d57c9e016\", \"909b187d-8cb4-41d1-9218-1d944d669fa2\": \"909b187d-8cb4-41d1-9218-1d944d669fa2\", \"bdf6d7a0-a64d-4793-9719-cd507c2105cd\": \"bdf6d7a0-a64d-4793-9719-cd507c2105cd\", \"16d70846-1d68-4fc4-8b24-cd6521c3ef47\": \"16d70846-1d68-4fc4-8b24-cd6521c3ef47\", \"0700a17f-2b78-4c91-8e1c-4acb35c4257d\": \"0700a17f-2b78-4c91-8e1c-4acb35c4257d\", \"9efe0240-27a4-49bd-9f6c-b7b778ba560c\": \"9efe0240-27a4-49bd-9f6c-b7b778ba560c\", \"d420dd4b-c722-436c-b6ab-f9e755e5a433\": \"d420dd4b-c722-436c-b6ab-f9e755e5a433\", \"9cd5e346-286f-4876-af69-b0ed24f99b42\": \"9cd5e346-286f-4876-af69-b0ed24f99b42\", \"0d58815e-612c-4c0e-a88f-cf3177c2f7df\": \"0d58815e-612c-4c0e-a88f-cf3177c2f7df\", \"8c4694d8-73aa-4817-8dab-a40fa2c51543\": \"8c4694d8-73aa-4817-8dab-a40fa2c51543\", \"e6674923-6a7b-41f2-bd0e-4b580e2bcf74\": \"e6674923-6a7b-41f2-bd0e-4b580e2bcf74\", \"191c5bc2-8a4f-4293-9a26-a906a0775f45\": \"191c5bc2-8a4f-4293-9a26-a906a0775f45\", \"82fa963f-5e9e-464f-8bff-2177a7bcf168\": \"82fa963f-5e9e-464f-8bff-2177a7bcf168\", \"2b4db812-7004-4524-a272-70b6aa1fa3cc\": \"2b4db812-7004-4524-a272-70b6aa1fa3cc\", \"5acb3354-c963-4529-a12d-77e626a0ca72\": \"5acb3354-c963-4529-a12d-77e626a0ca72\", \"428aeda8-47f2-4742-a151-ad7c3c449ef6\": \"428aeda8-47f2-4742-a151-ad7c3c449ef6\", \"af47ba7c-5c9b-4dc5-a1b1-ae592486ffa0\": \"af47ba7c-5c9b-4dc5-a1b1-ae592486ffa0\", \"1f333af2-03be-4335-a766-184b891e6137\": \"1f333af2-03be-4335-a766-184b891e6137\", \"1f20b433-ff02-4076-9b55-7e942a5f5b8d\": \"1f20b433-ff02-4076-9b55-7e942a5f5b8d\", \"9b66ff34-1ddf-4cbc-a604-caf605be40b5\": \"9b66ff34-1ddf-4cbc-a604-caf605be40b5\", \"4de01a3e-0f58-4c42-81a3-e5b8f6983767\": \"4de01a3e-0f58-4c42-81a3-e5b8f6983767\", \"8339926e-1974-49dc-ac25-d1e6246e4b44\": \"8339926e-1974-49dc-ac25-d1e6246e4b44\", \"4ef384b4-0697-409b-a04c-e7e1f05efed2\": \"4ef384b4-0697-409b-a04c-e7e1f05efed2\", \"376f0f2c-8e53-4bf3-99a9-8825f07df7c5\": \"376f0f2c-8e53-4bf3-99a9-8825f07df7c5\", \"38fb6d87-9088-4087-a8b4-dbef7ea30083\": \"38fb6d87-9088-4087-a8b4-dbef7ea30083\", \"d608c87d-34b5-4134-86d9-015009a44d66\": \"d608c87d-34b5-4134-86d9-015009a44d66\", \"4d102ed0-61af-4f38-ae6b-8d0f8818e6c5\": \"4d102ed0-61af-4f38-ae6b-8d0f8818e6c5\", \"e84576d3-f334-42fe-8e44-b174694b93ac\": \"e84576d3-f334-42fe-8e44-b174694b93ac\", \"9eb4cfca-995e-4961-93de-a98ce18c0240\": \"9eb4cfca-995e-4961-93de-a98ce18c0240\", \"ab9604d1-1001-4d2f-a7ca-318e1a555e89\": \"ab9604d1-1001-4d2f-a7ca-318e1a555e89\", \"05d41bcc-2862-4225-84d1-9d25e4d8c8c4\": \"05d41bcc-2862-4225-84d1-9d25e4d8c8c4\", \"821a8717-e998-4673-8bee-a5e944d36215\": \"821a8717-e998-4673-8bee-a5e944d36215\", \"d0c71128-36bc-463c-90a4-545ca0be9a9d\": \"d0c71128-36bc-463c-90a4-545ca0be9a9d\", \"9388da7a-5e7a-4bc5-a21e-db0e05a3cb4f\": \"9388da7a-5e7a-4bc5-a21e-db0e05a3cb4f\", \"9a433076-ac75-43cb-a7ed-f3b4ba00d9f0\": \"9a433076-ac75-43cb-a7ed-f3b4ba00d9f0\", \"758a7785-5c78-4f6c-94c1-ced8ee3d8da3\": \"758a7785-5c78-4f6c-94c1-ced8ee3d8da3\", \"7b4721c8-67e8-4dc6-ae7b-244de7fadad3\": \"7b4721c8-67e8-4dc6-ae7b-244de7fadad3\", \"61690cb7-f6ea-487c-a70c-6e15cca03b59\": \"61690cb7-f6ea-487c-a70c-6e15cca03b59\", \"7e78c57d-2f2c-4ff4-a297-587e5b5c2924\": \"7e78c57d-2f2c-4ff4-a297-587e5b5c2924\", \"2c3d88c8-3006-48f6-847a-dfe978757f70\": \"2c3d88c8-3006-48f6-847a-dfe978757f70\", \"1e0fa6a3-777a-4a30-8427-5506a0f90c0a\": \"1e0fa6a3-777a-4a30-8427-5506a0f90c0a\", \"68d891f6-1665-46fb-9be0-0c0375f11d37\": \"68d891f6-1665-46fb-9be0-0c0375f11d37\", \"e25095d8-8787-455c-b345-5cce2d294723\": \"e25095d8-8787-455c-b345-5cce2d294723\", \"44a1c869-f2bc-4434-bd7c-9ed6a7da45cc\": \"44a1c869-f2bc-4434-bd7c-9ed6a7da45cc\", \"b992fe19-913a-479b-b559-4b4e9cdf1402\": \"b992fe19-913a-479b-b559-4b4e9cdf1402\", \"3a1257da-48fc-4a08-8225-2ecc9c6775e9\": \"3a1257da-48fc-4a08-8225-2ecc9c6775e9\", \"3cb91559-e7cd-4555-9c74-1f787068079f\": \"3cb91559-e7cd-4555-9c74-1f787068079f\", \"a290ba0c-e9b3-4a11-8ff3-a77f1e1c2062\": \"a290ba0c-e9b3-4a11-8ff3-a77f1e1c2062\", \"0b00ac05-3f6c-4480-8770-c8130f946e9e\": \"0b00ac05-3f6c-4480-8770-c8130f946e9e\", \"73adfce5-1133-49fb-b97c-5d06a1fac237\": \"73adfce5-1133-49fb-b97c-5d06a1fac237\", \"11271fae-2c58-485f-b8d2-55ee06c379a4\": \"11271fae-2c58-485f-b8d2-55ee06c379a4\", \"bbccad8e-094a-4766-85af-f79f0b178b7b\": \"bbccad8e-094a-4766-85af-f79f0b178b7b\", \"6d28c4c7-70cd-4b74-9bd9-7044a547fbc4\": \"6d28c4c7-70cd-4b74-9bd9-7044a547fbc4\", \"97fc577d-e09a-4731-8a98-23e208d2733b\": \"97fc577d-e09a-4731-8a98-23e208d2733b\", \"f415a1d4-a742-4361-b79a-a246ef6f7143\": \"f415a1d4-a742-4361-b79a-a246ef6f7143\", \"c7f13b8e-ab56-4727-88ce-065a3e15651a\": \"c7f13b8e-ab56-4727-88ce-065a3e15651a\", \"7f7c0659-5fe0-458d-8631-46a8f974bc39\": \"7f7c0659-5fe0-458d-8631-46a8f974bc39\", \"753a47c1-ab29-4e67-882f-a709c67fcd51\": \"753a47c1-ab29-4e67-882f-a709c67fcd51\", \"a2e95cff-c88d-43ea-a241-8265bd92c20f\": \"a2e95cff-c88d-43ea-a241-8265bd92c20f\", \"ffb0ad2c-4ad4-472c-a960-54323bbda7c5\": \"ffb0ad2c-4ad4-472c-a960-54323bbda7c5\", \"5551c2e4-f2cc-46e7-b8e6-d372bbe8d2ef\": \"5551c2e4-f2cc-46e7-b8e6-d372bbe8d2ef\", \"2f8d38a7-6cbb-4c1c-8efe-9e81007d5192\": \"2f8d38a7-6cbb-4c1c-8efe-9e81007d5192\", \"82cc54e2-b653-4e33-8ff0-184388ceead3\": \"82cc54e2-b653-4e33-8ff0-184388ceead3\", \"c921ffdd-fbbb-470c-bbd7-df0d02f035f9\": \"c921ffdd-fbbb-470c-bbd7-df0d02f035f9\", \"9238bbe0-4f6e-4373-b472-5290e472f571\": \"9238bbe0-4f6e-4373-b472-5290e472f571\", \"b9042ad5-2705-49e0-bc2d-15c7769452d1\": \"b9042ad5-2705-49e0-bc2d-15c7769452d1\", \"0fc32337-9934-45c9-8a37-e69d55b2cc3b\": \"0fc32337-9934-45c9-8a37-e69d55b2cc3b\", \"edde4b6c-29f4-4eab-adba-bceee1ec1360\": \"edde4b6c-29f4-4eab-adba-bceee1ec1360\", \"bf0934a4-96b5-4ed6-a6f3-7f6392a588e3\": \"bf0934a4-96b5-4ed6-a6f3-7f6392a588e3\", \"b9b3f5f4-cc82-44d0-9368-3a12e5852395\": \"b9b3f5f4-cc82-44d0-9368-3a12e5852395\", \"4c0bf51b-73e3-4aef-86ff-2b0890e7ca65\": \"4c0bf51b-73e3-4aef-86ff-2b0890e7ca65\", \"f05d844a-3bd0-4dc4-bd14-95758e1cbd6c\": \"f05d844a-3bd0-4dc4-bd14-95758e1cbd6c\", \"fb670521-48a8-44c7-9c8a-b0ae4aec96ec\": \"fb670521-48a8-44c7-9c8a-b0ae4aec96ec\", \"4e4fd04a-b01e-45db-be0a-798adbc2dd60\": \"4e4fd04a-b01e-45db-be0a-798adbc2dd60\", \"a99f48cd-d693-4de4-be8c-b297354cfc7a\": \"a99f48cd-d693-4de4-be8c-b297354cfc7a\", \"c9b03ec3-0eb7-4ad0-b164-b068316346de\": \"c9b03ec3-0eb7-4ad0-b164-b068316346de\", \"bf9a2c15-d703-4a9e-a630-4bb13136627c\": \"bf9a2c15-d703-4a9e-a630-4bb13136627c\", \"a63fd0c5-3eb1-4ef3-b8d0-fb3412d35923\": \"a63fd0c5-3eb1-4ef3-b8d0-fb3412d35923\", \"24efb88b-be47-47ad-ae3c-0b3dc381f351\": \"24efb88b-be47-47ad-ae3c-0b3dc381f351\", \"935fad65-72f7-4888-a602-b542d24da9d3\": \"935fad65-72f7-4888-a602-b542d24da9d3\", \"e2d650d3-3b72-47c2-9f69-e268220832bd\": \"e2d650d3-3b72-47c2-9f69-e268220832bd\", \"ce047846-dae7-4830-b7f3-7ce0393dfd83\": \"ce047846-dae7-4830-b7f3-7ce0393dfd83\", \"6e43a302-23b1-45ee-9d5d-97fbbfcfcb55\": \"6e43a302-23b1-45ee-9d5d-97fbbfcfcb55\", \"c180eee6-a25e-4a46-a582-a86fd4618098\": \"c180eee6-a25e-4a46-a582-a86fd4618098\", \"ba22070b-5a6a-4a9c-9392-22fd726cfcaf\": \"ba22070b-5a6a-4a9c-9392-22fd726cfcaf\", \"915afda5-7140-4c96-941a-3646bb7fac70\": \"915afda5-7140-4c96-941a-3646bb7fac70\", \"7e1af6b2-b3da-4752-9676-5f634db4649b\": \"7e1af6b2-b3da-4752-9676-5f634db4649b\", \"9b2f6ba9-c9e4-4ea1-9a15-38cabf339d66\": \"9b2f6ba9-c9e4-4ea1-9a15-38cabf339d66\", \"8330944b-1a8b-4056-b1b0-a8a9adb4e49d\": \"8330944b-1a8b-4056-b1b0-a8a9adb4e49d\", \"ca9f07c9-6704-4d0c-975e-42e2df4def1b\": \"ca9f07c9-6704-4d0c-975e-42e2df4def1b\", \"c96db0dc-b1a1-460e-8816-d1888547a908\": \"c96db0dc-b1a1-460e-8816-d1888547a908\", \"676cef67-f042-4301-8360-c4714a552bae\": \"676cef67-f042-4301-8360-c4714a552bae\", \"774868a2-67bd-4351-ae33-869aab0825d1\": \"774868a2-67bd-4351-ae33-869aab0825d1\", \"88517ccb-e923-4cac-b6b0-2dd63c9611b5\": \"88517ccb-e923-4cac-b6b0-2dd63c9611b5\", \"04a79cb8-5018-4ab9-acc5-edc21b0cfc20\": \"04a79cb8-5018-4ab9-acc5-edc21b0cfc20\", \"b62ccc67-3773-4568-9baa-25e232a06fd1\": \"b62ccc67-3773-4568-9baa-25e232a06fd1\", \"4c9cdaac-f429-4670-95cd-e4b23a5077a4\": \"4c9cdaac-f429-4670-95cd-e4b23a5077a4\", \"5c5be8a4-9591-4746-92c0-c76bdb8996da\": \"5c5be8a4-9591-4746-92c0-c76bdb8996da\", \"4678724d-6482-41a1-bb10-fc1659703cce\": \"4678724d-6482-41a1-bb10-fc1659703cce\", \"20d078c7-f7ab-42ac-84d3-6ac9c0d9e994\": \"20d078c7-f7ab-42ac-84d3-6ac9c0d9e994\", \"99b3aaa6-8215-4c63-b4e0-252457bf69fe\": \"99b3aaa6-8215-4c63-b4e0-252457bf69fe\", \"2d6054d1-eccb-47cf-9c98-a53d335ceb73\": \"2d6054d1-eccb-47cf-9c98-a53d335ceb73\", \"7eb38594-9b4f-4562-b6e9-a2a79c3e8a25\": \"7eb38594-9b4f-4562-b6e9-a2a79c3e8a25\", \"c7b3d8e4-043a-4387-99e6-ed7f36a32ae9\": \"c7b3d8e4-043a-4387-99e6-ed7f36a32ae9\", \"6fd33a98-24e7-4bb5-b906-60ead366b890\": \"6fd33a98-24e7-4bb5-b906-60ead366b890\", \"5f7be6b7-5ebf-4ec2-af7e-31ec90231770\": \"5f7be6b7-5ebf-4ec2-af7e-31ec90231770\", \"21141152-5082-4b6f-8dba-0a29503528e9\": \"21141152-5082-4b6f-8dba-0a29503528e9\", \"5567291b-083e-45f9-85f9-224132d4f892\": \"5567291b-083e-45f9-85f9-224132d4f892\", \"77a5f921-6a39-462c-b03f-00c2b2d48184\": \"77a5f921-6a39-462c-b03f-00c2b2d48184\", \"84f9fa65-fd54-44d6-9eed-a90b1279802f\": \"84f9fa65-fd54-44d6-9eed-a90b1279802f\", \"d16a7a25-f886-4ccf-b23d-cbbb0e92d2ed\": \"d16a7a25-f886-4ccf-b23d-cbbb0e92d2ed\", \"2f9aedbb-c8a1-42a7-90de-4665a0fa0b38\": \"2f9aedbb-c8a1-42a7-90de-4665a0fa0b38\", \"ed4f9aef-357b-41ca-85f2-b6bc57f498f1\": \"ed4f9aef-357b-41ca-85f2-b6bc57f498f1\", \"25f8035b-9d27-4ae1-87de-248125a2ffc3\": \"25f8035b-9d27-4ae1-87de-248125a2ffc3\", \"2779951b-3428-46da-a541-040d48603e8e\": \"2779951b-3428-46da-a541-040d48603e8e\", \"ceac56e4-dad3-4c10-9315-51fcdc3de033\": \"ceac56e4-dad3-4c10-9315-51fcdc3de033\", \"71b7364e-0176-470e-8590-d51b9c0bf45b\": \"71b7364e-0176-470e-8590-d51b9c0bf45b\", \"6e661441-a0e9-4fc0-a85c-8e1eb16bad51\": \"6e661441-a0e9-4fc0-a85c-8e1eb16bad51\", \"014dc5ca-fdf0-402c-b14f-78dea8ecbe07\": \"014dc5ca-fdf0-402c-b14f-78dea8ecbe07\", \"c643b8d9-0fd2-42f1-993f-7a616fe3ea5f\": \"c643b8d9-0fd2-42f1-993f-7a616fe3ea5f\", \"8c26e76b-0704-4753-b6e4-4140c51504b1\": \"8c26e76b-0704-4753-b6e4-4140c51504b1\", \"d69abbba-e0eb-4cf6-b3f8-534aff28de84\": \"d69abbba-e0eb-4cf6-b3f8-534aff28de84\", \"0fc0e255-d002-4151-9bc6-235e550c0d6c\": \"0fc0e255-d002-4151-9bc6-235e550c0d6c\", \"ab2d9902-1551-44e3-a1a7-3931528f8d83\": \"ab2d9902-1551-44e3-a1a7-3931528f8d83\", \"59e4d2ae-5354-4322-a513-d629069b01a9\": \"59e4d2ae-5354-4322-a513-d629069b01a9\", \"98d8a62a-7687-48f4-bb67-9c939511b93b\": \"98d8a62a-7687-48f4-bb67-9c939511b93b\", \"2a64ab56-4ed7-41c9-a8a3-85094d4037be\": \"2a64ab56-4ed7-41c9-a8a3-85094d4037be\", \"2d98feeb-36e5-49a4-89b9-b2f93b6b56f3\": \"2d98feeb-36e5-49a4-89b9-b2f93b6b56f3\", \"30f6eba1-9a1c-40e7-8b0f-19aceaf02e7c\": \"30f6eba1-9a1c-40e7-8b0f-19aceaf02e7c\", \"438e77da-4091-4412-8be8-92c3576f571e\": \"438e77da-4091-4412-8be8-92c3576f571e\", \"501b82d6-37e2-4551-99ff-60f540c5e3f6\": \"501b82d6-37e2-4551-99ff-60f540c5e3f6\", \"8a1c5b51-a196-4cb0-9d0b-78daa942e811\": \"8a1c5b51-a196-4cb0-9d0b-78daa942e811\", \"c0daf2a1-3c0c-4a99-a14b-c489ccad4167\": \"c0daf2a1-3c0c-4a99-a14b-c489ccad4167\", \"b2f757ea-ba23-4dbd-9c36-965265148dc5\": \"b2f757ea-ba23-4dbd-9c36-965265148dc5\", \"b264d48e-87db-4e36-a9d2-f8414ff6fb03\": \"b264d48e-87db-4e36-a9d2-f8414ff6fb03\", \"5f6f4cb4-6c4a-459f-a8f2-fd99085d3b6a\": \"5f6f4cb4-6c4a-459f-a8f2-fd99085d3b6a\", \"cd02a2cb-8b1d-46e9-a2b8-8ae98a8128d2\": \"cd02a2cb-8b1d-46e9-a2b8-8ae98a8128d2\", \"be020e45-fcc6-404a-b2a1-b1305cfc37b0\": \"be020e45-fcc6-404a-b2a1-b1305cfc37b0\", \"0e88f558-a088-4469-b334-ee0f4de4edb7\": \"0e88f558-a088-4469-b334-ee0f4de4edb7\", \"d4a34650-2f99-44a8-8052-3e7680ad890d\": \"d4a34650-2f99-44a8-8052-3e7680ad890d\", \"9fae27d5-9d47-40c2-a629-5067f95f2da3\": \"9fae27d5-9d47-40c2-a629-5067f95f2da3\", \"19500ba8-0e03-4aaa-880b-f5b84e1159aa\": \"19500ba8-0e03-4aaa-880b-f5b84e1159aa\", \"7312d358-8e21-45d8-9114-3fb5ce1666a3\": \"7312d358-8e21-45d8-9114-3fb5ce1666a3\", \"89590864-4876-4456-ba2d-b2e91069afd1\": \"89590864-4876-4456-ba2d-b2e91069afd1\", \"574e2488-7c80-434f-9db5-df6d9ccd99aa\": \"574e2488-7c80-434f-9db5-df6d9ccd99aa\", \"b7c744a7-ef43-472a-a5c2-79eafaf384b5\": \"b7c744a7-ef43-472a-a5c2-79eafaf384b5\", \"057be179-cfae-4c8d-96c8-913a3e0ad8b0\": \"057be179-cfae-4c8d-96c8-913a3e0ad8b0\", \"45dfc144-7f1d-4306-a2c3-1d1dce8f4d02\": \"45dfc144-7f1d-4306-a2c3-1d1dce8f4d02\", \"4a5a6b57-7484-42be-9d72-a67c4efb0c4b\": \"4a5a6b57-7484-42be-9d72-a67c4efb0c4b\", \"a58a68d2-2f3c-49b4-aa1d-34725ea2b3c1\": \"a58a68d2-2f3c-49b4-aa1d-34725ea2b3c1\", \"75758f92-1764-4ae6-adcf-357423f948f4\": \"75758f92-1764-4ae6-adcf-357423f948f4\", \"e736141d-04f5-4715-83c0-8b12102411af\": \"e736141d-04f5-4715-83c0-8b12102411af\", \"e6318a1f-854a-4057-8bbb-e69ff688e9cc\": \"e6318a1f-854a-4057-8bbb-e69ff688e9cc\", \"e57f3413-19fb-4ea2-b16b-3cb12c4eea17\": \"e57f3413-19fb-4ea2-b16b-3cb12c4eea17\", \"234abbb3-c390-4121-ad85-fb3c789727bc\": \"234abbb3-c390-4121-ad85-fb3c789727bc\", \"637fe4de-bc50-4d3f-a47c-5b4866e3f264\": \"637fe4de-bc50-4d3f-a47c-5b4866e3f264\", \"ba8cee59-eab4-47c8-9d86-08ed4f014224\": \"ba8cee59-eab4-47c8-9d86-08ed4f014224\", \"d42de2b6-b1aa-45ca-b92e-92d737cd396f\": \"d42de2b6-b1aa-45ca-b92e-92d737cd396f\", \"3971370e-e29c-4c31-81cf-7d5f32d29bc5\": \"3971370e-e29c-4c31-81cf-7d5f32d29bc5\", \"d729b07a-4c67-4030-860f-84ea5d65cc08\": \"d729b07a-4c67-4030-860f-84ea5d65cc08\", \"caff4b47-0264-489d-9ffc-a3903ac71a11\": \"caff4b47-0264-489d-9ffc-a3903ac71a11\", \"509f277e-d5ce-40eb-9d06-24d2f5e17076\": \"509f277e-d5ce-40eb-9d06-24d2f5e17076\", \"47fa5e37-131b-4ec4-bfc7-1604a0e21ebf\": \"47fa5e37-131b-4ec4-bfc7-1604a0e21ebf\", \"2e61435d-9e5d-4960-9712-247a3f55e569\": \"2e61435d-9e5d-4960-9712-247a3f55e569\", \"4dab3a4e-e5a6-4f2b-ba36-a05fb8c823bc\": \"4dab3a4e-e5a6-4f2b-ba36-a05fb8c823bc\", \"1e6ec8d0-fd8d-4f4e-bc3e-cd67a04f3291\": \"1e6ec8d0-fd8d-4f4e-bc3e-cd67a04f3291\", \"5ccd60fc-bd72-492b-9386-9723d8922a71\": \"5ccd60fc-bd72-492b-9386-9723d8922a71\", \"a787855b-01b0-4f91-a67b-79258529391e\": \"a787855b-01b0-4f91-a67b-79258529391e\", \"1ddccc29-b152-4cca-8e39-c7828f5fb39e\": \"1ddccc29-b152-4cca-8e39-c7828f5fb39e\", \"8047d46b-6b4b-4a0c-8573-0152d73d3e83\": \"8047d46b-6b4b-4a0c-8573-0152d73d3e83\", \"46108239-72dc-435b-8b5a-a30c5c8b1c31\": \"46108239-72dc-435b-8b5a-a30c5c8b1c31\", \"b2bb0a01-adcc-436d-a936-b58b2e1316d3\": \"b2bb0a01-adcc-436d-a936-b58b2e1316d3\", \"610ebff1-7997-4166-b704-8bee77eeef5d\": \"610ebff1-7997-4166-b704-8bee77eeef5d\", \"05936737-6b2b-43a7-a18e-62bc527c04cf\": \"05936737-6b2b-43a7-a18e-62bc527c04cf\", \"b1fb19d3-25aa-41f1-9abf-37202025214d\": \"b1fb19d3-25aa-41f1-9abf-37202025214d\", \"9ddee677-e144-42d1-a777-19e511723cf2\": \"9ddee677-e144-42d1-a777-19e511723cf2\", \"ccbd852e-decf-4524-a525-eef6dd5b268c\": \"ccbd852e-decf-4524-a525-eef6dd5b268c\", \"48528a40-6053-47ed-8f6b-d5e684d149d5\": \"48528a40-6053-47ed-8f6b-d5e684d149d5\", \"551a5071-53cd-47aa-a6e9-adb8bbcaa353\": \"551a5071-53cd-47aa-a6e9-adb8bbcaa353\", \"3bc6c2cf-f074-4295-bfe5-366a695aca37\": \"3bc6c2cf-f074-4295-bfe5-366a695aca37\", \"e8eea662-ebdc-40f3-996e-a80ce52d5d0b\": \"e8eea662-ebdc-40f3-996e-a80ce52d5d0b\", \"904279bb-ea10-4816-ac76-72a08c2b931b\": \"904279bb-ea10-4816-ac76-72a08c2b931b\", \"832065e7-59fb-47a6-bf11-d0428814afae\": \"832065e7-59fb-47a6-bf11-d0428814afae\", \"73ed1f22-b93d-490f-8abe-7994c8f173d7\": \"73ed1f22-b93d-490f-8abe-7994c8f173d7\", \"912e938e-be61-42dc-8638-19ed3e7cdd22\": \"912e938e-be61-42dc-8638-19ed3e7cdd22\", \"11165bfe-41fb-454c-a460-4cba21f11d82\": \"11165bfe-41fb-454c-a460-4cba21f11d82\", \"484a7f3e-c0b4-425d-8c20-abca3560b9fd\": \"484a7f3e-c0b4-425d-8c20-abca3560b9fd\", \"d851354d-bc48-41aa-9db5-3f7991623a93\": \"d851354d-bc48-41aa-9db5-3f7991623a93\", \"599f762e-915e-4da5-a4eb-4b19e5f3d614\": \"599f762e-915e-4da5-a4eb-4b19e5f3d614\", \"3154cf44-17fc-4ac1-9013-fe8dd47a8ea4\": \"3154cf44-17fc-4ac1-9013-fe8dd47a8ea4\", \"920ef107-4b66-40c5-9f3a-45de9f649d3b\": \"920ef107-4b66-40c5-9f3a-45de9f649d3b\", \"ce3677ab-a551-4b34-b95d-b6cd6bdae655\": \"ce3677ab-a551-4b34-b95d-b6cd6bdae655\", \"3a310a1f-d673-4191-ae02-d5c5155e6ea9\": \"3a310a1f-d673-4191-ae02-d5c5155e6ea9\", \"3914d8d7-7014-45ea-b34c-40e3647f90c0\": \"3914d8d7-7014-45ea-b34c-40e3647f90c0\", \"81615864-2061-4723-83b1-7636d39ec154\": \"81615864-2061-4723-83b1-7636d39ec154\", \"c3caa109-b196-460e-b6e7-c954c4a5a3dc\": \"c3caa109-b196-460e-b6e7-c954c4a5a3dc\", \"2f9f4702-c7ad-45d9-a7ee-697f06b5fb19\": \"2f9f4702-c7ad-45d9-a7ee-697f06b5fb19\", \"52d7a0fc-a199-418f-b25e-12b32939e189\": \"52d7a0fc-a199-418f-b25e-12b32939e189\", \"8e6f8415-163b-4864-af51-4485a52ab171\": \"8e6f8415-163b-4864-af51-4485a52ab171\", \"f5f32b20-b1a7-4451-acf2-a2867d3c8e6d\": \"f5f32b20-b1a7-4451-acf2-a2867d3c8e6d\", \"0faf93c2-6437-4d52-91b0-c6135f67e400\": \"0faf93c2-6437-4d52-91b0-c6135f67e400\", \"6b67e51a-2654-46f7-a01b-c71fd80615de\": \"6b67e51a-2654-46f7-a01b-c71fd80615de\", \"7b69af87-612f-48d0-bd7c-ea11611a5805\": \"7b69af87-612f-48d0-bd7c-ea11611a5805\", \"8cda4e35-435c-4e12-a85f-7f9f6a4adaf7\": \"8cda4e35-435c-4e12-a85f-7f9f6a4adaf7\", \"a78b7f93-96ba-4eb3-b635-7cee71252a3b\": \"a78b7f93-96ba-4eb3-b635-7cee71252a3b\", \"2ab974b0-a4ab-4511-934e-b7dccb3f6415\": \"2ab974b0-a4ab-4511-934e-b7dccb3f6415\", \"dc9fabf5-4027-4d16-b4b0-4706ea6a1ff3\": \"dc9fabf5-4027-4d16-b4b0-4706ea6a1ff3\", \"f6a01348-8283-4c21-b06e-449de64944a3\": \"f6a01348-8283-4c21-b06e-449de64944a3\", \"6a70ad0a-d1c0-4f4e-99f4-f4b51288bc47\": \"6a70ad0a-d1c0-4f4e-99f4-f4b51288bc47\", \"ea872eb3-2c98-4e9e-b136-c593f5b46cd3\": \"ea872eb3-2c98-4e9e-b136-c593f5b46cd3\", \"68034c89-e262-4d12-ab75-2880a16912f9\": \"68034c89-e262-4d12-ab75-2880a16912f9\", \"f88a61a0-ab77-4b6c-a640-d93d5861c20d\": \"f88a61a0-ab77-4b6c-a640-d93d5861c20d\", \"1fb0993a-13db-4a17-a983-ceae1fdd00be\": \"1fb0993a-13db-4a17-a983-ceae1fdd00be\", \"64d4f7f7-635c-4597-9926-6130bc0ee6af\": \"64d4f7f7-635c-4597-9926-6130bc0ee6af\", \"26389ef9-5be8-470d-93a2-e833814fcc12\": \"26389ef9-5be8-470d-93a2-e833814fcc12\", \"d98e589d-5861-4d2c-8ffa-521470206205\": \"d98e589d-5861-4d2c-8ffa-521470206205\", \"e76b611d-42cf-47f0-a868-b1e64182781d\": \"e76b611d-42cf-47f0-a868-b1e64182781d\", \"d55a124c-df1e-4bf1-af25-7b002e232274\": \"d55a124c-df1e-4bf1-af25-7b002e232274\", \"62e6e7ed-f895-4a21-9975-cb1c3c864429\": \"62e6e7ed-f895-4a21-9975-cb1c3c864429\", \"a1f5e625-6051-4fe5-8a79-953fdd0547bf\": \"a1f5e625-6051-4fe5-8a79-953fdd0547bf\", \"246446a8-4fb5-42c0-bc32-3acf60f47fd8\": \"246446a8-4fb5-42c0-bc32-3acf60f47fd8\", \"4d8b3220-e6b4-4095-98b1-835e989ee113\": \"4d8b3220-e6b4-4095-98b1-835e989ee113\", \"eed0f771-4464-4fc3-870d-25c055f558cd\": \"eed0f771-4464-4fc3-870d-25c055f558cd\", \"82c81caf-23ad-41cc-a989-d18867091991\": \"82c81caf-23ad-41cc-a989-d18867091991\", \"a6271b04-f0d5-4e51-9e60-bd5ae8d746a5\": \"a6271b04-f0d5-4e51-9e60-bd5ae8d746a5\", \"25655c28-b03b-4e9c-9af7-6c89c1d5fa00\": \"25655c28-b03b-4e9c-9af7-6c89c1d5fa00\", \"f478369d-9347-4c0a-a96c-8c133e18473a\": \"f478369d-9347-4c0a-a96c-8c133e18473a\", \"a1f1574b-e743-4377-8c43-c45e13be5d4b\": \"a1f1574b-e743-4377-8c43-c45e13be5d4b\", \"379f53f1-bbf0-4991-bb17-0f749dc57e00\": \"379f53f1-bbf0-4991-bb17-0f749dc57e00\", \"a2ec47a6-a793-4a4e-b5e6-afb06eb39ff7\": \"a2ec47a6-a793-4a4e-b5e6-afb06eb39ff7\", \"fd66f285-b19a-4c35-b394-96023d57fbef\": \"fd66f285-b19a-4c35-b394-96023d57fbef\", \"1dbc8853-ba3f-42a1-ab7f-6061282cf146\": \"1dbc8853-ba3f-42a1-ab7f-6061282cf146\", \"842965d7-8c66-4c2a-a448-590c6f98f5b5\": \"842965d7-8c66-4c2a-a448-590c6f98f5b5\", \"dae23fe2-ea94-42cb-8686-cd32bc043c6e\": \"dae23fe2-ea94-42cb-8686-cd32bc043c6e\", \"9003794d-4274-4b88-8bcf-3d9469bf028a\": \"9003794d-4274-4b88-8bcf-3d9469bf028a\", \"431c079d-1175-420c-bc65-9629303e6204\": \"431c079d-1175-420c-bc65-9629303e6204\", \"49b45156-c099-4cf9-98a5-3b2b72f9992f\": \"49b45156-c099-4cf9-98a5-3b2b72f9992f\", \"2a802173-5cc4-4253-b37d-4d0fe4b4ab62\": \"2a802173-5cc4-4253-b37d-4d0fe4b4ab62\", \"1a74d207-80af-49aa-bed1-2562d00d7f2e\": \"1a74d207-80af-49aa-bed1-2562d00d7f2e\", \"5c8a620f-0f2a-4110-a656-6c541f59bd3a\": \"5c8a620f-0f2a-4110-a656-6c541f59bd3a\", \"f4d8730b-8c55-4165-bad7-83397d085050\": \"f4d8730b-8c55-4165-bad7-83397d085050\", \"2300c6b2-4674-4e30-9fc0-4510e1eabd16\": \"2300c6b2-4674-4e30-9fc0-4510e1eabd16\", \"7a479c15-c044-4242-ad20-2e171ca63f94\": \"7a479c15-c044-4242-ad20-2e171ca63f94\", \"c07dda93-dd3d-4dbe-b8dd-15c5f368cdc7\": \"c07dda93-dd3d-4dbe-b8dd-15c5f368cdc7\", \"14bdef5e-4c5a-4e23-8843-d6446d77debd\": \"14bdef5e-4c5a-4e23-8843-d6446d77debd\", \"d94d3fcd-2f87-413f-bcf6-87fe43f815db\": \"d94d3fcd-2f87-413f-bcf6-87fe43f815db\", \"dd1e4994-cc89-4ae2-9268-7952fa96dbe0\": \"dd1e4994-cc89-4ae2-9268-7952fa96dbe0\", \"9e0c319a-91d2-4bef-940c-be1568c6dcb7\": \"9e0c319a-91d2-4bef-940c-be1568c6dcb7\", \"60f4719f-08ba-4843-9d8c-ff6765bdb34e\": \"60f4719f-08ba-4843-9d8c-ff6765bdb34e\", \"17d7bd82-07fe-4ebe-bf97-2aae1c03583e\": \"17d7bd82-07fe-4ebe-bf97-2aae1c03583e\", \"699bbe8a-bfa1-4f03-9906-dcf3b4e764dc\": \"699bbe8a-bfa1-4f03-9906-dcf3b4e764dc\", \"9a6cb2f5-3215-4c12-b437-52207d102f38\": \"9a6cb2f5-3215-4c12-b437-52207d102f38\", \"91b5b8f0-f78a-44cf-96ea-b9c21c0eaf59\": \"91b5b8f0-f78a-44cf-96ea-b9c21c0eaf59\", \"e8b7d76d-6b6c-46a5-a10f-55afa9eb1212\": \"e8b7d76d-6b6c-46a5-a10f-55afa9eb1212\", \"9c1bd6e2-8576-4ab4-8413-b9e6d20e5ac9\": \"9c1bd6e2-8576-4ab4-8413-b9e6d20e5ac9\", \"c187bfe6-3c0a-408d-882a-84286e042dc5\": \"c187bfe6-3c0a-408d-882a-84286e042dc5\", \"67c6ecec-9839-479e-94fa-ccf99b5626b2\": \"67c6ecec-9839-479e-94fa-ccf99b5626b2\", \"0bc3a324-6fa8-4ae3-894a-606f2aeb9543\": \"0bc3a324-6fa8-4ae3-894a-606f2aeb9543\", \"7ffeb13a-d673-4514-ae8d-c8ff9e56cbcb\": \"7ffeb13a-d673-4514-ae8d-c8ff9e56cbcb\", \"87eb45ab-2653-417b-93a4-0fa8945c459f\": \"87eb45ab-2653-417b-93a4-0fa8945c459f\", \"4258b124-9335-4187-970a-e293775be81d\": \"4258b124-9335-4187-970a-e293775be81d\", \"3d03c8a8-ffa7-4e3a-9944-e7a08524fa69\": \"3d03c8a8-ffa7-4e3a-9944-e7a08524fa69\", \"0b91c614-3c6c-4557-aabc-e329cf9997b3\": \"0b91c614-3c6c-4557-aabc-e329cf9997b3\", \"f369b18a-dd4f-4691-a812-22bcde6fd63b\": \"f369b18a-dd4f-4691-a812-22bcde6fd63b\", \"934c1b04-6e59-45f9-8de3-44e2f47d829c\": \"934c1b04-6e59-45f9-8de3-44e2f47d829c\", \"6c1abe9a-f9f2-4a78-8de2-e1e6c707aaa4\": \"6c1abe9a-f9f2-4a78-8de2-e1e6c707aaa4\", \"d408f048-1999-4fce-a3a1-a68c425e519a\": \"d408f048-1999-4fce-a3a1-a68c425e519a\", \"e6e205ff-6ff6-4b79-a92a-06c07d082204\": \"e6e205ff-6ff6-4b79-a92a-06c07d082204\", \"fc44122b-4824-4ebd-ae2e-ae69f1dd55e5\": \"fc44122b-4824-4ebd-ae2e-ae69f1dd55e5\", \"8e497f8c-9846-4be7-8627-d3f6b16936be\": \"8e497f8c-9846-4be7-8627-d3f6b16936be\", \"248b6d21-b15b-4cbd-8e08-39111c9b1079\": \"248b6d21-b15b-4cbd-8e08-39111c9b1079\", \"16305fb4-3d9f-4d2f-a10e-c65cfacb08f2\": \"16305fb4-3d9f-4d2f-a10e-c65cfacb08f2\", \"01cab48e-6403-4d49-ae79-d692f3747dbc\": \"01cab48e-6403-4d49-ae79-d692f3747dbc\", \"e387095e-194b-4521-b83a-d72fd5f16526\": \"e387095e-194b-4521-b83a-d72fd5f16526\", \"ded5ff9f-ae6f-443e-bd8e-96cf614a2acb\": \"ded5ff9f-ae6f-443e-bd8e-96cf614a2acb\", \"dba2a094-2d7b-4f37-96a9-c353c0579476\": \"dba2a094-2d7b-4f37-96a9-c353c0579476\", \"1978ae0b-e6a8-4441-bb8c-9891f620af28\": \"1978ae0b-e6a8-4441-bb8c-9891f620af28\", \"cb376e53-6f46-4e79-8496-53ae4d877095\": \"cb376e53-6f46-4e79-8496-53ae4d877095\", \"164fd432-ba3d-42c8-8a69-49e9c53eacea\": \"164fd432-ba3d-42c8-8a69-49e9c53eacea\", \"a419645a-53f0-4aa7-a4ed-76c7f2f0161f\": \"a419645a-53f0-4aa7-a4ed-76c7f2f0161f\", \"42c61256-47d4-48e9-b2d2-892a78f3eb47\": \"42c61256-47d4-48e9-b2d2-892a78f3eb47\", \"f26281f8-cb44-4b1e-ad18-91e1cdcd52bf\": \"f26281f8-cb44-4b1e-ad18-91e1cdcd52bf\", \"49402226-dc2f-4652-a732-3c4b90ef547d\": \"49402226-dc2f-4652-a732-3c4b90ef547d\", \"aeb0e70c-4de7-4610-86dc-e7ffcdfd9d03\": \"aeb0e70c-4de7-4610-86dc-e7ffcdfd9d03\", \"13f0e884-c935-4a61-9094-9682b234b730\": \"13f0e884-c935-4a61-9094-9682b234b730\", \"fbb62f9b-7501-4d68-b63b-8544825159cf\": \"fbb62f9b-7501-4d68-b63b-8544825159cf\", \"833b5770-321f-45aa-874f-4719393ebbc9\": \"833b5770-321f-45aa-874f-4719393ebbc9\", \"61593909-2f1d-4017-a399-d70f05c109eb\": \"61593909-2f1d-4017-a399-d70f05c109eb\", \"76917744-563f-4c5d-919f-e8720f689931\": \"76917744-563f-4c5d-919f-e8720f689931\", \"c751dd3d-f3fb-4da3-a34d-f93d5d4c1f98\": \"c751dd3d-f3fb-4da3-a34d-f93d5d4c1f98\", \"f83e25af-c71f-444f-bc25-825e0601e16d\": \"f83e25af-c71f-444f-bc25-825e0601e16d\", \"70ca824e-85e5-4685-98be-3423fdcd0e33\": \"70ca824e-85e5-4685-98be-3423fdcd0e33\", \"77eb0421-3cf7-433c-884d-4a11d10cb03a\": \"77eb0421-3cf7-433c-884d-4a11d10cb03a\", \"dfd6a6b0-3a4e-498b-bc2e-efe455a32ac1\": \"dfd6a6b0-3a4e-498b-bc2e-efe455a32ac1\", \"351d6e3e-8575-4fac-ba46-afdfd7ff051f\": \"351d6e3e-8575-4fac-ba46-afdfd7ff051f\", \"47cf9e55-c3bc-4cbf-ab4c-84d7f1c78afd\": \"47cf9e55-c3bc-4cbf-ab4c-84d7f1c78afd\", \"d7e58600-54ca-4e14-85dd-687491d66f55\": \"d7e58600-54ca-4e14-85dd-687491d66f55\", \"19dd198d-910d-47cb-9242-cf6c6d4bf090\": \"19dd198d-910d-47cb-9242-cf6c6d4bf090\", \"5582b18d-3474-466d-94c5-46be330f0944\": \"5582b18d-3474-466d-94c5-46be330f0944\", \"c6c3bb43-7d8b-4359-83e1-8bdfe39a2ec8\": \"c6c3bb43-7d8b-4359-83e1-8bdfe39a2ec8\", \"6f56d628-93d6-4faa-a7df-405f3a303cc6\": \"6f56d628-93d6-4faa-a7df-405f3a303cc6\", \"d0521004-4fc2-4368-9c7c-8e3f8e5d563a\": \"d0521004-4fc2-4368-9c7c-8e3f8e5d563a\", \"75aa6827-904e-4c81-ad9c-a857c6ffb1d5\": \"75aa6827-904e-4c81-ad9c-a857c6ffb1d5\", \"b42612ad-cff7-4cef-8088-56117315dc07\": \"b42612ad-cff7-4cef-8088-56117315dc07\", \"28f23e94-93ff-4eca-b285-14043251046f\": \"28f23e94-93ff-4eca-b285-14043251046f\", \"f5ea57f5-d52b-423f-94fc-63cfaf51aa23\": \"f5ea57f5-d52b-423f-94fc-63cfaf51aa23\", \"7dec0367-03c8-4be0-822f-682c5cd2dc99\": \"7dec0367-03c8-4be0-822f-682c5cd2dc99\", \"ab42878e-ba0c-4769-b6d0-cb7f39b9df9d\": \"ab42878e-ba0c-4769-b6d0-cb7f39b9df9d\", \"63bec14d-9281-4251-aa76-a53663dce909\": \"63bec14d-9281-4251-aa76-a53663dce909\", \"e651f565-17c1-4d19-baa7-7166f49763c0\": \"e651f565-17c1-4d19-baa7-7166f49763c0\", \"68de84ce-4665-482a-9260-dc942cc13e25\": \"68de84ce-4665-482a-9260-dc942cc13e25\", \"bf798134-b4f2-49ce-a6c5-30b4b492dd6c\": \"bf798134-b4f2-49ce-a6c5-30b4b492dd6c\", \"1713aa9b-7fbc-4152-8eed-a4576afb41eb\": \"1713aa9b-7fbc-4152-8eed-a4576afb41eb\", \"f2d6f155-1b64-453a-ae85-8948dab7a60d\": \"f2d6f155-1b64-453a-ae85-8948dab7a60d\", \"c9d9b143-8d10-4b33-bdb0-de32f5360d85\": \"c9d9b143-8d10-4b33-bdb0-de32f5360d85\", \"660218b0-0ab6-4f24-887b-72719e39e8c4\": \"660218b0-0ab6-4f24-887b-72719e39e8c4\", \"44150852-6f59-4d56-9dbb-64d980c43054\": \"44150852-6f59-4d56-9dbb-64d980c43054\", \"f917e233-29f8-4248-af3a-36b3550087ad\": \"f917e233-29f8-4248-af3a-36b3550087ad\"}, \"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
|
|
|