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.
Files changed (36) hide show
  1. proscenium/__init__.py +3 -0
  2. proscenium/admin/__init__.py +37 -0
  3. proscenium/bin/bot.py +142 -0
  4. proscenium/core/__init__.py +152 -0
  5. proscenium/interfaces/__init__.py +3 -0
  6. proscenium/interfaces/slack.py +265 -0
  7. proscenium/patterns/__init__.py +3 -0
  8. proscenium/patterns/chunk_space.py +51 -0
  9. proscenium/{scripts → patterns}/document_enricher.py +15 -11
  10. proscenium/{scripts → patterns}/entity_resolver.py +24 -18
  11. proscenium/patterns/graph_rag.py +61 -0
  12. proscenium/{scripts → patterns}/knowledge_graph.py +4 -2
  13. proscenium/{scripts → patterns}/rag.py +6 -12
  14. proscenium/{scripts → patterns}/tools.py +13 -45
  15. proscenium/verbs/__init__.py +3 -0
  16. proscenium/verbs/chunk.py +2 -0
  17. proscenium/verbs/complete.py +24 -28
  18. proscenium/verbs/display/__init__.py +1 -1
  19. proscenium/verbs/display.py +3 -0
  20. proscenium/verbs/extract.py +8 -4
  21. proscenium/verbs/invoke.py +3 -0
  22. proscenium/verbs/read.py +6 -8
  23. proscenium/verbs/remember.py +5 -0
  24. proscenium/verbs/vector_database.py +13 -20
  25. proscenium/verbs/write.py +3 -0
  26. {proscenium-0.0.1.dist-info → proscenium-0.0.3.dist-info}/METADATA +5 -8
  27. proscenium-0.0.3.dist-info/RECORD +34 -0
  28. {proscenium-0.0.1.dist-info → proscenium-0.0.3.dist-info}/WHEEL +1 -1
  29. proscenium-0.0.3.dist-info/entry_points.txt +3 -0
  30. proscenium/scripts/__init__.py +0 -0
  31. proscenium/scripts/chunk_space.py +0 -33
  32. proscenium/scripts/graph_rag.py +0 -43
  33. proscenium/verbs/display/huggingface.py +0 -0
  34. proscenium/verbs/know.py +0 -9
  35. proscenium-0.0.1.dist-info/RECORD +0 -30
  36. {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
- from langchain_core.documents.base import Document
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
 
@@ -1,3 +1,8 @@
1
+ import logging
2
+
3
+ log = logging.getLogger(__name__)
4
+
5
+
1
6
  def format_chat_history(chat_history) -> str:
2
7
  delimiter = "-" * 80 + "\n"
3
8
  return delimiter.join(
@@ -1,13 +1,17 @@
1
- from typing import Dict, List, Optional
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
- if overwrite:
56
- file_path.unlink()
57
- print("Deleted existing vector db file", file_path)
58
- else:
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
- print("Creating new vector db file", file_path)
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
- print("Created collection", collection_name)
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,7 +1,10 @@
1
1
  from typing import List
2
2
 
3
+ import logging
3
4
  import csv
4
5
 
6
+ log = logging.getLogger(__name__)
7
+
5
8
 
6
9
  def triples_to_csv(triples: List[tuple[str, str, str]], filename: str) -> None:
7
10
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: proscenium
3
- Version: 0.0.1
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
  [![CI](https://github.com/The-AI-Alliance/proscenium/actions/workflows/pytest.yml/badge.svg)](https://github.com/The-AI-Alliance/proscenium/actions/workflows/pytest.yml)
37
+ [![PyPI](https://img.shields.io/pypi/v/proscenium)](https://pypi.org/project/proscenium/)
37
38
  [![License](https://img.shields.io/github/license/The-AI-Alliance/proscenium)](https://github.com/The-AI-Alliance/proscenium/tree/main?tab=Apache-2.0-1-ov-file#readme)
38
39
  [![Issues](https://img.shields.io/github/issues/The-AI-Alliance/proscenium)](https://github.com/The-AI-Alliance/proscenium/issues)
39
40
  [![GitHub stars](https://img.shields.io/github/stars/The-AI-Alliance/proscenium?style=social)](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
- It is also set of simple demonstration applications that elucidate aspects of application and library design.
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.2
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ proscenium-bot=proscenium.bin.bot:app
3
+
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))
@@ -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,9 +0,0 @@
1
- from neo4j import GraphDatabase
2
- from neo4j import Driver
3
-
4
-
5
- def knowledge_graph_client(uri: str, username: str, password: str) -> Driver:
6
-
7
- driver = GraphDatabase.driver(uri, auth=(username, password))
8
-
9
- return driver
@@ -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,,