proscenium 0.0.1__py3-none-any.whl → 0.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- proscenium/__init__.py +3 -0
- proscenium/admin/__init__.py +37 -0
- proscenium/bin/bot.py +142 -0
- proscenium/core/__init__.py +152 -0
- proscenium/interfaces/__init__.py +3 -0
- proscenium/interfaces/slack.py +265 -0
- proscenium/patterns/__init__.py +3 -0
- proscenium/patterns/chunk_space.py +51 -0
- proscenium/{scripts → patterns}/document_enricher.py +15 -11
- proscenium/{scripts → patterns}/entity_resolver.py +24 -18
- proscenium/patterns/graph_rag.py +61 -0
- proscenium/{scripts → patterns}/knowledge_graph.py +4 -2
- proscenium/{scripts → patterns}/rag.py +6 -12
- proscenium/{scripts → patterns}/tools.py +13 -45
- proscenium/verbs/__init__.py +3 -0
- proscenium/verbs/chunk.py +2 -0
- proscenium/verbs/complete.py +24 -28
- proscenium/verbs/display/__init__.py +1 -1
- proscenium/verbs/display.py +3 -0
- proscenium/verbs/extract.py +8 -4
- proscenium/verbs/invoke.py +3 -0
- proscenium/verbs/read.py +6 -8
- proscenium/verbs/remember.py +5 -0
- proscenium/verbs/vector_database.py +13 -20
- proscenium/verbs/write.py +3 -0
- {proscenium-0.0.1.dist-info → proscenium-0.0.3.dist-info}/METADATA +5 -8
- proscenium-0.0.3.dist-info/RECORD +34 -0
- {proscenium-0.0.1.dist-info → proscenium-0.0.3.dist-info}/WHEEL +1 -1
- proscenium-0.0.3.dist-info/entry_points.txt +3 -0
- proscenium/scripts/__init__.py +0 -0
- proscenium/scripts/chunk_space.py +0 -33
- proscenium/scripts/graph_rag.py +0 -43
- proscenium/verbs/display/huggingface.py +0 -0
- proscenium/verbs/know.py +0 -9
- proscenium-0.0.1.dist-info/RECORD +0 -30
- {proscenium-0.0.1.dist-info → proscenium-0.0.3.dist-info}/LICENSE +0 -0
proscenium/verbs/read.py
CHANGED
@@ -3,13 +3,18 @@ from typing import List
|
|
3
3
|
import os
|
4
4
|
import logging
|
5
5
|
|
6
|
-
|
6
|
+
import httpx
|
7
|
+
from pydantic.networks import HttpUrl
|
8
|
+
from pathlib import Path
|
7
9
|
|
10
|
+
from langchain_core.documents.base import Document
|
8
11
|
from langchain_community.document_loaders import TextLoader
|
9
12
|
from langchain_community.document_loaders.hugging_face_dataset import (
|
10
13
|
HuggingFaceDatasetLoader,
|
11
14
|
)
|
12
15
|
|
16
|
+
log = logging.getLogger(__name__)
|
17
|
+
|
13
18
|
os.environ["TOKENIZERS_PARALLELISM"] = "false"
|
14
19
|
logging.getLogger("langchain_text_splitters.base").setLevel(logging.ERROR)
|
15
20
|
|
@@ -34,20 +39,13 @@ def load_hugging_face_dataset(
|
|
34
39
|
return documents
|
35
40
|
|
36
41
|
|
37
|
-
import httpx
|
38
|
-
from pydantic.networks import HttpUrl
|
39
|
-
from pathlib import Path
|
40
|
-
|
41
|
-
|
42
42
|
async def url_to_file(url: HttpUrl, data_file: Path, overwrite: bool = False):
|
43
43
|
|
44
44
|
if data_file.exists() and not overwrite:
|
45
|
-
# print(f"File {data_file} exists. Use overwrite=True to replace.")
|
46
45
|
return
|
47
46
|
|
48
47
|
async with httpx.AsyncClient() as client:
|
49
48
|
|
50
|
-
# print(f"Downloading {url} to {data_file}...")
|
51
49
|
response = await client.get(url)
|
52
50
|
response.raise_for_status()
|
53
51
|
|
proscenium/verbs/remember.py
CHANGED
@@ -1,13 +1,17 @@
|
|
1
|
-
from typing import Dict, List
|
1
|
+
from typing import Dict, List
|
2
2
|
|
3
|
+
import logging
|
3
4
|
from pathlib import Path
|
4
5
|
from langchain_core.documents.base import Document
|
6
|
+
from urllib.parse import urlsplit
|
5
7
|
from pymilvus import MilvusClient
|
6
8
|
from pymilvus import DataType, FieldSchema, CollectionSchema
|
7
9
|
from pymilvus import model
|
8
10
|
|
9
11
|
# See https://milvus.io/docs/quickstart.md
|
10
12
|
|
13
|
+
log = logging.getLogger(__name__)
|
14
|
+
|
11
15
|
|
12
16
|
def embedding_function(
|
13
17
|
embedding_model_id: str,
|
@@ -39,35 +43,28 @@ def schema_chunks(
|
|
39
43
|
return schema
|
40
44
|
|
41
45
|
|
42
|
-
from urllib.parse import urlsplit
|
43
|
-
|
44
|
-
|
45
46
|
def vector_db(
|
46
47
|
uri: str,
|
47
|
-
overwrite: bool = False,
|
48
48
|
) -> MilvusClient:
|
49
49
|
|
50
|
+
log.info("Connecting to vector db %s", uri)
|
50
51
|
uri_fields = urlsplit(uri)
|
51
52
|
client = None
|
52
53
|
if uri_fields[0] == "file":
|
53
54
|
file_path = Path(uri_fields[2][1:])
|
54
55
|
if file_path.exists():
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
print(
|
60
|
-
"Using existing",
|
61
|
-
uri_fields[2],
|
62
|
-
"file. Use overwrite=True to replace.",
|
63
|
-
)
|
56
|
+
log.info(
|
57
|
+
"Using existing %s file.",
|
58
|
+
uri_fields[2],
|
59
|
+
)
|
64
60
|
else:
|
65
|
-
|
61
|
+
log.info("Creating new vector db file %s", file_path)
|
66
62
|
|
67
63
|
client = MilvusClient(uri=str(file_path))
|
68
64
|
|
69
65
|
else:
|
70
66
|
|
67
|
+
log.info("Connecting to vector db at non-file uri %s", uri)
|
71
68
|
client = MilvusClient(uri=uri)
|
72
69
|
|
73
70
|
return client
|
@@ -77,12 +74,8 @@ def create_collection(
|
|
77
74
|
client: MilvusClient,
|
78
75
|
embedding_fn: model.dense.SentenceTransformerEmbeddingFunction,
|
79
76
|
collection_name: str,
|
80
|
-
overwrite: bool = True,
|
81
77
|
) -> None:
|
82
78
|
|
83
|
-
if overwrite and client.has_collection(collection_name):
|
84
|
-
client.drop_collection(collection_name)
|
85
|
-
|
86
79
|
client.create_collection(
|
87
80
|
collection_name=collection_name,
|
88
81
|
schema=schema_chunks(embedding_fn),
|
@@ -100,7 +93,7 @@ def create_collection(
|
|
100
93
|
client.create_index(
|
101
94
|
collection_name=collection_name, index_params=index_params, sync=True
|
102
95
|
)
|
103
|
-
|
96
|
+
log.info("Created collection %s", collection_name)
|
104
97
|
|
105
98
|
|
106
99
|
def add_chunks_to_vector_db(
|
proscenium/verbs/write.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: proscenium
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.3
|
4
4
|
Summary: Frame AI Agents
|
5
5
|
License: ASFv2
|
6
6
|
Author: Adam Pingel
|
@@ -25,8 +25,8 @@ Requires-Dist: pymilvus (>=2.5.4,<3.0.0)
|
|
25
25
|
Requires-Dist: pymilvus_model (>=0.3.1,<0.4.0)
|
26
26
|
Requires-Dist: python-dotenv (>=1.0.1,<2.0.0)
|
27
27
|
Requires-Dist: rich (>=13.9.4,<14.0.0)
|
28
|
+
Requires-Dist: slack_sdk (>=3.35.0,<4.0.0)
|
28
29
|
Requires-Dist: stringcase (>=1.2.0,<2.0.0)
|
29
|
-
Requires-Dist: thespian (>=4.0.0,<5.0.0)
|
30
30
|
Requires-Dist: tiktoken (>=0.9.0,<0.10.0)
|
31
31
|
Requires-Dist: typer (>=0.15.2,<0.16.0)
|
32
32
|
Description-Content-Type: text/markdown
|
@@ -34,17 +34,14 @@ Description-Content-Type: text/markdown
|
|
34
34
|
# Proscenium
|
35
35
|
|
36
36
|
[](https://github.com/The-AI-Alliance/proscenium/actions/workflows/pytest.yml)
|
37
|
+
[](https://pypi.org/project/proscenium/)
|
37
38
|
[](https://github.com/The-AI-Alliance/proscenium/tree/main?tab=Apache-2.0-1-ov-file#readme)
|
38
39
|
[](https://github.com/The-AI-Alliance/proscenium/issues)
|
39
40
|
[](https://github.com/The-AI-Alliance/proscenium/stargazers)
|
40
41
|
|
41
|
-
Proscenium is a small, experimental library of composable glue that allows for
|
42
|
-
succinct construction of enterprise AI applications. It is in early development.
|
42
|
+
Proscenium is a small, experimental library of composable glue that allows for succinct construction of enterprise AI applications. It was started in February 2025 and is still in early development.
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
Currently, proscenium development prioritizes support for domains where
|
47
|
-
the creation and use of structured data is critical.
|
44
|
+
Currently, proscenium development prioritizes support for domains where the creation and use of structured data is critical.
|
48
45
|
|
49
46
|
See the [website](https://the-ai-alliance.github.io/proscenium/) for quickstart info, goals, and other links.
|
50
47
|
|
@@ -0,0 +1,34 @@
|
|
1
|
+
proscenium/__init__.py,sha256=nDWNd6_TSf4vDQuHVBoAf4QfZCB3ZUFQ0M7XvifNJ-g,78
|
2
|
+
proscenium/admin/__init__.py,sha256=VFcFIduWHmcM3idIbWOFGrdxp6oc5ta_ywWIL-hG4Y4,813
|
3
|
+
proscenium/bin/bot.py,sha256=nK4WN8ggpCr_KDpDI16Ib8RljmMpJyZ8qZTW8j7lwP4,3700
|
4
|
+
proscenium/core/__init__.py,sha256=MFOqGAKIK-XjbKaiFLihAX-zrsoRz4uNfCMahC4nJyc,3620
|
5
|
+
proscenium/interfaces/__init__.py,sha256=nDWNd6_TSf4vDQuHVBoAf4QfZCB3ZUFQ0M7XvifNJ-g,78
|
6
|
+
proscenium/interfaces/slack.py,sha256=kq4jVsTJUUDIrlO54ZIGqTvJoScZS3dcs1fBoNpg-m4,7947
|
7
|
+
proscenium/patterns/__init__.py,sha256=nDWNd6_TSf4vDQuHVBoAf4QfZCB3ZUFQ0M7XvifNJ-g,78
|
8
|
+
proscenium/patterns/chunk_space.py,sha256=kQzGUtkQKGQGzGjBqS7jz_zr3uvJeiCBD2leflOenM8,1635
|
9
|
+
proscenium/patterns/document_enricher.py,sha256=u-Q4FwvNAFj9nday235jUwxIwizht_VAW8DsmNQmoJs,2374
|
10
|
+
proscenium/patterns/entity_resolver.py,sha256=SOK9WO6WFuhSWPFBy4Hj09E2qgqrzxE0MT65nAgZDUw,2748
|
11
|
+
proscenium/patterns/graph_rag.py,sha256=1HH1xdlAA6ypvYdP4dWFm-KXrGPUmm0T4qIdAU8mgvE,1763
|
12
|
+
proscenium/patterns/knowledge_graph.py,sha256=VLjG8Rp7YfJLZKe9bZt2d4NsGloBV1AYI6SuaQtRLhs,1137
|
13
|
+
proscenium/patterns/rag.py,sha256=zvl_P48F3PDfVMgRXeiClLlevMsPKCMA1teVq9X20OE,1494
|
14
|
+
proscenium/patterns/tools.py,sha256=f2CD6f7CYiSs0Tm1Ff1sOL5Ti6DqJ5HQvMI7NmIgqNs,1740
|
15
|
+
proscenium/verbs/__init__.py,sha256=nDWNd6_TSf4vDQuHVBoAf4QfZCB3ZUFQ0M7XvifNJ-g,78
|
16
|
+
proscenium/verbs/chunk.py,sha256=hlVHfuR7sEAR8euh3FRd8hb2eJozE7bHe-E0RmAoFP8,1106
|
17
|
+
proscenium/verbs/complete.py,sha256=Y1T49OfAV7K8p0DMzE4aVqtkgVfjUqb6IeOazzdYGow,5071
|
18
|
+
proscenium/verbs/display/__init__.py,sha256=GXuvaMld8tzfJGngHdwVT-YLnuRmW2G0pMdti9Vj53s,238
|
19
|
+
proscenium/verbs/display/chat.py,sha256=2THBUdhG3cIIVZOnJ_AMYL4nWXKFG2cuSkX6wkm48yQ,1148
|
20
|
+
proscenium/verbs/display/milvus.py,sha256=GZze02_ZllukS7zVg0sCPxtjQ4z7O62nFY0Be4d5BX0,2390
|
21
|
+
proscenium/verbs/display/neo4j.py,sha256=yT3hulI1U7s4VmHh_UHHHxN25Q_rRgu6KM2so_pTFUI,727
|
22
|
+
proscenium/verbs/display/tools.py,sha256=eR5g-r7MGKFZY0qg-ndkW3p0mfbupV0UaAUFqJPfnNM,1491
|
23
|
+
proscenium/verbs/display.py,sha256=hHFmktyJtjYLi4I1-8HUfmsuoMTIxc6JFfczASBsCbI,260
|
24
|
+
proscenium/verbs/extract.py,sha256=2JSAblCww5Q2wiFXMib-D1iHKm6a5yj7AUYoyGoLQB8,1615
|
25
|
+
proscenium/verbs/invoke.py,sha256=-Bk7Pp0EEwRTS0MJUlViZeUNo8wxnDKJj5q78KU4CdM,339
|
26
|
+
proscenium/verbs/read.py,sha256=twFtcuyP-y-UwksLmGMCOjMqI7mp--VgvkGDfga6IxA,1262
|
27
|
+
proscenium/verbs/remember.py,sha256=Hh9BDRAYf7MGeMD4MzU73p6Q28KrSiLWPx4GjTW1amQ,296
|
28
|
+
proscenium/verbs/vector_database.py,sha256=U09P7jnpzUDeP7pEgJubf8xQsxC-O8Qb0MS0KY8eoe8,3527
|
29
|
+
proscenium/verbs/write.py,sha256=0GUJuixLnuu_EbFFzAIgrhLEQnOrL0TdUlMiqOl9KtA,367
|
30
|
+
proscenium-0.0.3.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
31
|
+
proscenium-0.0.3.dist-info/METADATA,sha256=-CZihFinSAwy-OZz9iGBLKkQRsA3TlyzWy3VYJARvGs,2528
|
32
|
+
proscenium-0.0.3.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
33
|
+
proscenium-0.0.3.dist-info/entry_points.txt,sha256=Q05DVkPq_SjgD8mFN6bG5ae2r_UbsqKCdy2kDAtHYGU,57
|
34
|
+
proscenium-0.0.3.dist-info/RECORD,,
|
proscenium/scripts/__init__.py
DELETED
File without changes
|
@@ -1,33 +0,0 @@
|
|
1
|
-
from rich import print
|
2
|
-
|
3
|
-
from pymilvus import MilvusClient
|
4
|
-
from pymilvus import model
|
5
|
-
|
6
|
-
from proscenium.verbs.read import load_file
|
7
|
-
from proscenium.verbs.chunk import documents_to_chunks_by_characters
|
8
|
-
from proscenium.verbs.vector_database import create_collection
|
9
|
-
from proscenium.verbs.vector_database import add_chunks_to_vector_db
|
10
|
-
from proscenium.verbs.display.milvus import collection_panel
|
11
|
-
|
12
|
-
|
13
|
-
def build_vector_db(
|
14
|
-
data_files: list[str],
|
15
|
-
vector_db_client: MilvusClient,
|
16
|
-
embedding_fn: model.dense.SentenceTransformerEmbeddingFunction,
|
17
|
-
collection_name: str,
|
18
|
-
):
|
19
|
-
|
20
|
-
create_collection(vector_db_client, embedding_fn, collection_name, overwrite=True)
|
21
|
-
|
22
|
-
for data_file in data_files:
|
23
|
-
|
24
|
-
documents = load_file(data_file)
|
25
|
-
chunks = documents_to_chunks_by_characters(documents)
|
26
|
-
print("Data file", data_file, "has", len(chunks), "chunks")
|
27
|
-
|
28
|
-
info = add_chunks_to_vector_db(
|
29
|
-
vector_db_client, embedding_fn, chunks, collection_name
|
30
|
-
)
|
31
|
-
print(info["insert_count"], "chunks inserted")
|
32
|
-
|
33
|
-
print(collection_panel(vector_db_client, collection_name))
|
proscenium/scripts/graph_rag.py
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
from typing import Callable
|
2
|
-
|
3
|
-
from pydantic import BaseModel
|
4
|
-
|
5
|
-
from rich import print
|
6
|
-
from rich.panel import Panel
|
7
|
-
|
8
|
-
from neo4j import Driver
|
9
|
-
|
10
|
-
from proscenium.verbs.complete import complete_simple
|
11
|
-
|
12
|
-
|
13
|
-
def query_to_prompts(
|
14
|
-
question: str,
|
15
|
-
query_extraction_model_id: str,
|
16
|
-
milvus_uri: str,
|
17
|
-
driver: Driver,
|
18
|
-
query_extract: Callable[
|
19
|
-
[str, str, bool], BaseModel
|
20
|
-
], # (query_str, query_extraction_model_id) -> QueryExtractions
|
21
|
-
extract_to_context: Callable[
|
22
|
-
[BaseModel, str, Driver, str, bool], BaseModel
|
23
|
-
], # (QueryExtractions, query_str, Driver, milvus_uri) -> Context
|
24
|
-
context_to_prompts: Callable[
|
25
|
-
[BaseModel, bool], tuple[str, str]
|
26
|
-
], # Context -> (system_prompt, user_prompt)
|
27
|
-
verbose: bool = False,
|
28
|
-
) -> str:
|
29
|
-
|
30
|
-
print("Extracting information from the question")
|
31
|
-
extract = query_extract(question, query_extraction_model_id, verbose)
|
32
|
-
if extract is None:
|
33
|
-
print("Unable to extract information from that question")
|
34
|
-
return None
|
35
|
-
print("Extract:", extract)
|
36
|
-
|
37
|
-
print("Forming context from the extracted information")
|
38
|
-
context = extract_to_context(extract, question, driver, milvus_uri, verbose)
|
39
|
-
print("Context:", context)
|
40
|
-
|
41
|
-
prompts = context_to_prompts(context, verbose)
|
42
|
-
|
43
|
-
return prompts
|
File without changes
|
proscenium/verbs/know.py
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
proscenium/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
proscenium/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
3
|
-
proscenium/scripts/chunk_space.py,sha256=04oXMUe5u-Mes8w6HFhUNkBy5hoXP-p1wHEw81XXOg4,1107
|
4
|
-
proscenium/scripts/document_enricher.py,sha256=JkK--QTlmVg7YA8scTm5YItWVWts5YscmpHEU1OeqjI,2214
|
5
|
-
proscenium/scripts/entity_resolver.py,sha256=S5-df41ZXaXDQLZ9vfFPJxq6v6fKpBHWZXsDrbD7Gis,2689
|
6
|
-
proscenium/scripts/graph_rag.py,sha256=D6lbOb0ftgf5VcUxs9cH6EjlKPBR1zarexNDgI4k4Bw,1287
|
7
|
-
proscenium/scripts/knowledge_graph.py,sha256=MddMOW8zkt0wptKijkKUbURpMYz3dAxY1BQklVAgZ1A,1104
|
8
|
-
proscenium/scripts/rag.py,sha256=O4qOWGsusqGfb4TMVk3fTav3BmPpToKSGm_2iTxzH2s,1625
|
9
|
-
proscenium/scripts/tools.py,sha256=Y4Oq_7vdgppQuDgx_513Wfz-pGDC1ZW5-m8wklmNvD4,2495
|
10
|
-
proscenium/verbs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
|
-
proscenium/verbs/chunk.py,sha256=-unQS0xgTyTDsikbueNEvPXQhwK26bQYMZBAeAEvVds,1071
|
12
|
-
proscenium/verbs/complete.py,sha256=QcDd0qVISk2NHWyGL6KTH8rzwSSF9SE4UB3Yzp0zrOI,5075
|
13
|
-
proscenium/verbs/display/__init__.py,sha256=VEvWaRpHnpE4sLKTdbFe8PybnREn4M4O9XYKRyAsdxk,222
|
14
|
-
proscenium/verbs/display/chat.py,sha256=2THBUdhG3cIIVZOnJ_AMYL4nWXKFG2cuSkX6wkm48yQ,1148
|
15
|
-
proscenium/verbs/display/huggingface.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
|
-
proscenium/verbs/display/milvus.py,sha256=GZze02_ZllukS7zVg0sCPxtjQ4z7O62nFY0Be4d5BX0,2390
|
17
|
-
proscenium/verbs/display/neo4j.py,sha256=yT3hulI1U7s4VmHh_UHHHxN25Q_rRgu6KM2so_pTFUI,727
|
18
|
-
proscenium/verbs/display/tools.py,sha256=eR5g-r7MGKFZY0qg-ndkW3p0mfbupV0UaAUFqJPfnNM,1491
|
19
|
-
proscenium/verbs/display.py,sha256=rCgiLok2EmiHGK8yUBLqxZR148BwroPMqsDf7qQwO1g,210
|
20
|
-
proscenium/verbs/extract.py,sha256=YQm7EGjBIP5klVAiG0ZXMXouxf20uUdxShkhGL-Cmw8,1519
|
21
|
-
proscenium/verbs/invoke.py,sha256=5szyVIuS3rd2zfyzbWzxVRFr2snf8XDJgzQuhQ85X9Y,289
|
22
|
-
proscenium/verbs/know.py,sha256=GF0uvZFn2xbyigdmPoJa1y_NeXspiBhpYWnE7VsG5W8,223
|
23
|
-
proscenium/verbs/read.py,sha256=iGTwY0h3cW1_ngyA-JT6HNsVz0BHpEtxamSxDhk97Y8,1361
|
24
|
-
proscenium/verbs/remember.py,sha256=AVTVD2Xm0DKAqlhiqHpDf8VFZsoAAgTLqEipZGyqdjo,244
|
25
|
-
proscenium/verbs/vector_database.py,sha256=rIxWE_1HZOXrbyb5ICsJFWZZoPax5TJefJ96mSnp6NM,3739
|
26
|
-
proscenium/verbs/write.py,sha256=MboUV1828XHITMurtddkm6kXkEgvtzfpBmSLh5X_msc,317
|
27
|
-
proscenium-0.0.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
28
|
-
proscenium-0.0.1.dist-info/METADATA,sha256=O_1ftoYXXbD68gNsTYgfYRBfhHvXRQ6fIu8v-7QV1dA,2509
|
29
|
-
proscenium-0.0.1.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
|
30
|
-
proscenium-0.0.1.dist-info/RECORD,,
|
File without changes
|