isayahc commited on
Commit
b38f031
1 Parent(s): dcd6834

finishinig the MVP and wow factor

Browse files
Files changed (5) hide show
  1. app.py +94 -1
  2. chain_apparatarus_weaviate.py +36 -0
  3. google_buckets.py +61 -38
  4. multi_angle_stl.py +36 -36
  5. utils.py +19 -0
app.py CHANGED
@@ -12,6 +12,22 @@ from structured_experiment_chain import (
12
  wikipedia_chain as experiment_wikipedia_chain
13
  )
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
 
16
  apparatus_retriever_options = {
17
  "Arxiv": apparatus_arxiv_chain,
@@ -32,7 +48,20 @@ def generate_apparatus(input_text, retriever_choice):
32
  app_components = output_text["Material"]
33
  component_collection = weaviate_client.collections.get("Component")
34
 
 
 
 
35
  for i in app_components:
 
 
 
 
 
 
 
 
 
 
36
 
37
  app_uuid = component_collection.data.insert({
38
  "Tags": output_text['Fields_of_study'],
@@ -40,6 +69,14 @@ def generate_apparatus(input_text, retriever_choice):
40
  "ToolName" : i,
41
  "UsedInComps" : [input_text]
42
  })
 
 
 
 
 
 
 
 
43
 
44
  return output_text
45
 
@@ -91,6 +128,47 @@ def search_apparatus(input_text, number):
91
 
92
  return response_objects_string
93
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  generate_apparatus_interface = gr.Interface(
95
  fn=generate_apparatus,
96
  inputs=["text", gr.Radio(choices=list(apparatus_retriever_options.keys()), label="Select a retriever", value="Wikipedia")],
@@ -123,12 +201,27 @@ search_apparatus_interface = gr.Interface(
123
  description="If you would like an idea of the apparatuses in the vectorestore here is the place",
124
  )
125
 
 
 
 
 
 
 
 
 
126
  demo = gr.TabbedInterface([
127
  generate_apparatus_interface,
128
  generate_experiment_interface,
129
  search_experiments_interface,
130
  search_apparatus_interface,
131
- ], ["Generate Apparatus", "Generate Experiment", "Search Existing Experiments","Search Existing Apparatuses"])
 
 
 
 
 
 
 
132
 
133
  if __name__ == "__main__":
134
  demo.launch()
 
12
  wikipedia_chain as experiment_wikipedia_chain
13
  )
14
 
15
+ from google_buckets import CloudStorageManager
16
+ import dotenv
17
+ import os
18
+
19
+ from utils import (
20
+ change_file_extension, convert_obj_to_stl,
21
+ remove_files
22
+ )
23
+
24
+ from mesh_utils import generate_mesh_images
25
+
26
+ from vision_model import analyze_images
27
+
28
+ from gradio_client import Client as ShapEClient
29
+
30
+ dotenv.load_dotenv()
31
 
32
  apparatus_retriever_options = {
33
  "Arxiv": apparatus_arxiv_chain,
 
48
  app_components = output_text["Material"]
49
  component_collection = weaviate_client.collections.get("Component")
50
 
51
+ bucket_name = os.getenv('GOOGLE_BUCKET_NAME')
52
+ manager = CloudStorageManager(bucket_name)
53
+
54
  for i in app_components:
55
+
56
+ client = ShapEClient("hysts/Shap-E")
57
+ client.hf_token = os.getenv("HUGGINGFACE_API_KEY")
58
+ result = client.predict(
59
+ i, # str in 'Prompt' Textbox component
60
+ 1621396601, # float (numeric value between 0 and 2147483647) in 'Seed' Slider component
61
+ 15, # float (numeric value between 1 and 20) in 'Guidance scale' Slider component
62
+ 64, # float (numeric value between 2 and 100) in 'Number of inference steps' Slider component
63
+ api_name="/text-to-3d"
64
+ )
65
 
66
  app_uuid = component_collection.data.insert({
67
  "Tags": output_text['Fields_of_study'],
 
69
  "ToolName" : i,
70
  "UsedInComps" : [input_text]
71
  })
72
+
73
+
74
+ glb_file_name = app_uuid.hex + ".glb"
75
+
76
+ manager.upload_file(
77
+ result,
78
+ glb_file_name,
79
+ )
80
 
81
  return output_text
82
 
 
128
 
129
  return response_objects_string
130
 
131
+ def review_3d_model(uuid:str) -> None:
132
+ """input the uuid of a 3d model"""
133
+ uuid = uuid.replace("-","")
134
+ bucket_name = os.getenv('GOOGLE_BUCKET_NAME')
135
+ manager = CloudStorageManager(bucket_name)
136
+ xx = manager.get_file_by_uuid(uuid)
137
+ manager.download_file(
138
+ xx,
139
+ xx
140
+ )
141
+ xx_as_stl = change_file_extension(xx,"stl")
142
+ convert_obj_to_stl(xx,xx_as_stl)
143
+ viewing_angles = [(30, 45), (60, 90), (45, 135)]
144
+
145
+ prompt = "I am creating an 3d model of a Glass lenses for refracting light,\
146
+ using a text-to-3d model\
147
+ Do these images look correct?\
148
+ If not please make a suggesttion on how to improve the text input\
149
+ As this response will be used in a pipeline please only output a new \
150
+ potential prompt or output nothing, "
151
+ # Please keep the prompt to 5 25 words to not confuse the model"
152
+
153
+ images = generate_mesh_images(
154
+ xx_as_stl,
155
+ viewing_angles,
156
+
157
+ )
158
+
159
+ response = analyze_images(
160
+ images,
161
+ prompt,
162
+ # api_key,
163
+ )
164
+
165
+ #clean up
166
+ remove_files(images)
167
+ remove_files([xx,xx_as_stl])
168
+ return response
169
+
170
+
171
+
172
  generate_apparatus_interface = gr.Interface(
173
  fn=generate_apparatus,
174
  inputs=["text", gr.Radio(choices=list(apparatus_retriever_options.keys()), label="Select a retriever", value="Wikipedia")],
 
201
  description="If you would like an idea of the apparatuses in the vectorestore here is the place",
202
  )
203
 
204
+ review_3d_model_interface = gr.Interface(
205
+ fn=review_3d_model,
206
+ inputs=["text"],
207
+ outputs="text",
208
+ title="Review 3D Model",
209
+ description="Input the UUID of a 3D model to review its images and provide feedback.",
210
+ )
211
+
212
  demo = gr.TabbedInterface([
213
  generate_apparatus_interface,
214
  generate_experiment_interface,
215
  search_experiments_interface,
216
  search_apparatus_interface,
217
+ review_3d_model_interface,
218
+ ], [
219
+ "Generate Apparatus",
220
+ "Generate Experiment",
221
+ "Search Existing Experiments",
222
+ "Search Existing Apparatuses",
223
+ "review_3d_model_interface"
224
+ ])
225
 
226
  if __name__ == "__main__":
227
  demo.launch()
chain_apparatarus_weaviate.py CHANGED
@@ -11,12 +11,19 @@ from structured_experiment_chain import (
11
  wikipedia_chain as experiment_wikipedia_chain
12
  )
13
 
 
 
 
14
  from weaviate_utils import init_client
15
 
16
  from datetime import datetime, timezone
17
 
 
 
18
 
 
19
 
 
20
 
21
  def main():
22
  # exp_qury = "fabricating cellolouse based electronics"
@@ -33,9 +40,26 @@ def main():
33
  component_image_collection = weaviate_client.collections.get("ComponentImage")
34
  science_experiment_collection = weaviate_client.collections.get("ScienceEperiment")
35
 
 
 
 
 
 
 
36
  app_components = app_data["Material"]
37
 
38
  for i in app_components:
 
 
 
 
 
 
 
 
 
 
 
39
 
40
  app_uuid = component_collection.data.insert({
41
  "Tags": app_data['Fields_of_study'],
@@ -43,6 +67,18 @@ def main():
43
  "ToolName" : i,
44
  "UsedInComps" : [app_query]
45
  })
 
 
 
 
 
 
 
 
 
 
 
 
46
 
47
  response = component_collection.query.bm25(
48
  query="something that goes in a microscope",
 
11
  wikipedia_chain as experiment_wikipedia_chain
12
  )
13
 
14
+
15
+ # from google_buckets import upload_file, man
16
+
17
  from weaviate_utils import init_client
18
 
19
  from datetime import datetime, timezone
20
 
21
+ from gradio_client import Client as ShapEClient
22
+ import os
23
 
24
+ from google_buckets import CloudStorageManager
25
 
26
+ from utils import copy_file_to_location
27
 
28
  def main():
29
  # exp_qury = "fabricating cellolouse based electronics"
 
40
  component_image_collection = weaviate_client.collections.get("ComponentImage")
41
  science_experiment_collection = weaviate_client.collections.get("ScienceEperiment")
42
 
43
+
44
+ bucket_name = os.getenv('GOOGLE_BUCKET_NAME')
45
+ manager = CloudStorageManager(bucket_name)
46
+
47
+
48
+
49
  app_components = app_data["Material"]
50
 
51
  for i in app_components:
52
+
53
+ client = ShapEClient("hysts/Shap-E")
54
+ client.hf_token = os.getenv("HUGGINGFACE_API_KEY")
55
+ result = client.predict(
56
+ i, # str in 'Prompt' Textbox component
57
+ 1621396601, # float (numeric value between 0 and 2147483647) in 'Seed' Slider component
58
+ 15, # float (numeric value between 1 and 20) in 'Guidance scale' Slider component
59
+ 64, # float (numeric value between 2 and 100) in 'Number of inference steps' Slider component
60
+ api_name="/text-to-3d"
61
+ )
62
+
63
 
64
  app_uuid = component_collection.data.insert({
65
  "Tags": app_data['Fields_of_study'],
 
67
  "ToolName" : i,
68
  "UsedInComps" : [app_query]
69
  })
70
+
71
+ glb_file_name = app_uuid.hex + ".glb"
72
+
73
+ manager.upload_file(
74
+ result,
75
+ glb_file_name,
76
+ )
77
+ # copy_file_to_location(result,glb_file_name)
78
+ # upload_file(glb_file_name)
79
+ # os.remove(glb_file_name)
80
+
81
+ x = 0
82
 
83
  response = component_collection.query.bm25(
84
  query="something that goes in a microscope",
google_buckets.py CHANGED
@@ -2,58 +2,81 @@ from google.cloud import storage
2
  import os
3
  import json
4
 
5
- SERVICE_ACOUNT_STUFF = os.getenv('GOOGLE_APPLICATION_CREDENTIALS_JSON')
6
 
7
- # https://stackoverflow.com/questions/71878229/initializing-firebase-admin-via-environment-variables-without-storing-serviceacc
8
- key_dict = json.loads(
9
- os.environ["GOOGLE_APPLICATION_CREDENTIALS_JSON"]
10
- )
11
 
12
- SERVICE_ACOUNT_STUFF = os.getenv('GOOGLE_APPLICATION_CREDENTIALS_JSON')
 
 
 
 
 
13
 
 
 
 
 
 
14
 
15
- # fire_app = firebase_admin.initialize_app(Certificate(key_dict))
 
 
 
 
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- # db = client = firestore.client(app=fire_app)
19
- # Initialize Google Cloud Storage client
20
- client = storage.Client()
21
 
22
- # Define bucket and file name
23
- # bucket_name = os.getenv('GOOGLE_PROJECT_ID')
24
- bucket_name = "production-blender-platform-bucket"
25
- # file_name = 'your-file.glb'
26
- file_name = "tmpcpd7o7v0.glb"
27
 
 
28
 
29
 
30
- # Function to upload a .glb file to the bucket
31
- def upload_file(file_path):
32
- bucket = client.get_bucket(bucket_name)
33
- blob = bucket.blob(file_name)
34
- blob.upload_from_filename(file_path)
35
- print(f'File {file_name} uploaded to {bucket_name}.')
36
 
37
- # Function to download a .glb file from the bucket
38
- def download_file(destination_path):
39
- bucket = client.get_bucket(bucket_name)
40
- blob = bucket.blob(file_name)
41
- blob.download_to_filename(destination_path)
42
- print(f'File {file_name} downloaded to {destination_path}.')
43
 
44
- # Function to delete a .glb file from the bucket
45
- def delete_file():
46
- bucket = client.get_bucket(bucket_name)
47
- blob = bucket.blob(file_name)
48
- blob.delete()
49
- print(f'File {file_name} deleted from {bucket_name}.')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
- def main():
52
  # Example usage
53
- file_name = "tmpcpd7o7v0.glb"
54
- upload_file(file_name)
55
- download_file('path/to/save/your/file.glb')
56
- delete_file()
57
 
58
  if __name__ == "__main__":
59
  main()
 
2
  import os
3
  import json
4
 
 
5
 
 
 
 
 
6
 
7
+ from google.cloud import storage
8
+
9
+ class CloudStorageManager:
10
+ def __init__(self, bucket_name):
11
+ self.client = storage.Client()
12
+ self.bucket_name = bucket_name
13
 
14
+ def upload_file(self, file_path, destination_file_name):
15
+ bucket = self.client.bucket(self.bucket_name)
16
+ blob = bucket.blob(destination_file_name)
17
+ blob.upload_from_filename(file_path)
18
+ print(f'File {destination_file_name} uploaded to {self.bucket_name}.')
19
 
20
+ def download_file(self, source_file_name, destination_path):
21
+ bucket = self.client.bucket(self.bucket_name)
22
+ blob = bucket.blob(source_file_name)
23
+ blob.download_to_filename(destination_path)
24
+ print(f'File {source_file_name} downloaded to {destination_path}.')
25
 
26
+ def delete_file(self, file_name):
27
+ bucket = self.client.bucket(self.bucket_name)
28
+ blob = bucket.blob(file_name)
29
+ blob.delete()
30
+ print(f'File {file_name} deleted from {self.bucket_name}.')
31
+
32
+ def get_file_by_uuid(self, uuid):
33
+ bucket = self.client.bucket(self.bucket_name)
34
+ blobs = bucket.list_blobs(prefix=uuid)
35
+ for blob in blobs:
36
+ if blob.name.endswith('.glb'):
37
+ return blob.name
38
+ return None
39
 
40
+ def main():
41
+ SERVICE_ACOUNT_STUFF = os.getenv('GOOGLE_APPLICATION_CREDENTIALS_JSON')
 
42
 
43
+ # https://stackoverflow.com/questions/71878229/initializing-firebase-admin-via-environment-variables-without-storing-serviceacc
44
+ key_dict = json.loads(
45
+ os.environ["GOOGLE_APPLICATION_CREDENTIALS_JSON"]
46
+ )
 
47
 
48
+ SERVICE_ACOUNT_STUFF = os.getenv('GOOGLE_APPLICATION_CREDENTIALS_JSON')
49
 
50
 
51
+ # fire_app = firebase_admin.initialize_app(Certificate(key_dict))
 
 
 
 
 
52
 
 
 
 
 
 
 
53
 
54
+ # Initialize Google Cloud Storage client
55
+ client = storage.Client()
56
+ bucket_name = os.getenv('GOOGLE_BUCKET_NAME')
57
+ manager = CloudStorageManager(bucket_name)
58
+
59
+
60
+ # uuid = '9ca1555c-e8ca-4111-a084-1a2374b2e6bd'
61
+ # uuid = '9ca1555c-e8ca-4111-a084-1a2374b2e6bd'.replace("-","")
62
+ uuid = "506bb34a122a4bea86a64f96933f6bbd"
63
+ xx = manager.get_file_by_uuid(uuid)
64
+
65
+ # manager.upload_file(
66
+ # "506bb34a122a4bea86a64f96933f6bbd.glb",
67
+ # "506bb34a122a4bea86a64f96933f6bbd.glb"
68
+ # )
69
+
70
+ manager.download_file(
71
+ xx,
72
+ xx
73
+ )
74
+ x = 0
75
 
 
76
  # Example usage
77
+ # manager.upload_file("/home/isayahc/projects/Hackathon-Projects/Maker-Tech-Tree/7698996e43bf4aa1ba98f5dd0bf77000.glb", "7698996e43bf4aa1ba98f5dd0bf77000.glb")
78
+ # manager.download_file('your-file.glb', 'path/to/save/your/file.glb')
79
+ # manager.delete_file('your-file.glb')
 
80
 
81
  if __name__ == "__main__":
82
  main()
multi_angle_stl.py CHANGED
@@ -1,39 +1,39 @@
1
  from stl import mesh
 
2
  from mpl_toolkits import mplot3d
3
- from matplotlib import pyplot as plt
4
 
5
- # Load the STL file
6
- your_mesh = mesh.Mesh.from_file('sample_data.stl')
7
-
8
- # Define three different viewing angles
9
- viewing_angles = [(30, 45), (60, 90), (45, 135)]
10
-
11
- # Iterate over each viewing angle and generate an image
12
- for i, (elev, azim) in enumerate(viewing_angles, start=1):
13
- # Create a new plot with a larger figure size
14
- fig = plt.figure(figsize=(10, 10))
15
- ax = fig.add_subplot(111, projection='3d')
16
-
17
- # Add the STL file to the plot
18
- ax.add_collection3d(mplot3d.art3d.Poly3DCollection(your_mesh.vectors))
19
-
20
- # Calculate the limits of the mesh
21
- max_dim = max(your_mesh.points.flatten())
22
- min_dim = min(your_mesh.points.flatten())
23
-
24
- # Set the limits of the plot
25
- ax.set_xlim([min_dim, max_dim])
26
- ax.set_ylim([min_dim, max_dim])
27
- ax.set_zlim([min_dim, max_dim])
28
-
29
- # Set the viewing angle
30
- ax.view_init(elev=elev, azim=azim)
31
-
32
- # Save the plot as an image
33
- plt.savefig(f'mesh_{i}.png')
34
-
35
- # Close the plot to avoid memory leaks
36
- plt.close()
37
-
38
- # Optional: Show the last generated plot
39
- # plt.show()
 
1
  from stl import mesh
2
+ import matplotlib.pyplot as plt
3
  from mpl_toolkits import mplot3d
 
4
 
5
+ def load_stl(file_path):
6
+ """Load the STL file."""
7
+ return mesh.Mesh.from_file(file_path)
8
+
9
+ def generate_images(mesh, viewing_angles, figsize=(10, 10)):
10
+ """Generate images from different viewing angles."""
11
+ for i, (elev, azim) in enumerate(viewing_angles, start=1):
12
+ fig = plt.figure(figsize=figsize)
13
+ ax = fig.add_subplot(111, projection='3d')
14
+ ax.add_collection3d(mplot3d.art3d.Poly3DCollection(mesh.vectors))
15
+ max_dim = max(mesh.points.flatten())
16
+ min_dim = min(mesh.points.flatten())
17
+ ax.set_xlim([min_dim, max_dim])
18
+ ax.set_ylim([min_dim, max_dim])
19
+ ax.set_zlim([min_dim, max_dim])
20
+ ax.view_init(elev=elev, azim=azim)
21
+ plt.savefig(f'mesh_{i}.png')
22
+ plt.close()
23
+
24
+ def main():
25
+ # Load the STL file
26
+ # stl_file_path = 'sample_data.stl'
27
+ # your_mesh = load_stl(stl_file_path)
28
+
29
+ # Define three different viewing angles
30
+ viewing_angles = [(30, 45), (60, 90), (45, 135)]
31
+
32
+ # Generate images from different viewing angles
33
+ # generate_images(your_mesh, viewing_angles)
34
+
35
+ # Optional: Show the last generated plot
36
+ # plt.show()
37
+
38
+ if __name__ == "__main__":
39
+ main()
utils.py CHANGED
@@ -73,3 +73,22 @@ def base64_to_file(base64_string: str, output_file_location: str) -> None:
73
  binary_data = base64.b64decode(base64_string)
74
  with open(output_file_location, "wb") as output_file:
75
  output_file.write(binary_data)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  binary_data = base64.b64decode(base64_string)
74
  with open(output_file_location, "wb") as output_file:
75
  output_file.write(binary_data)
76
+
77
+ def copy_file_to_location(file_path: str, destination_path: str) -> None:
78
+ """
79
+ Copy a file to a new location with the same name.
80
+
81
+ Args:
82
+ file_path: The path of the file to be copied.
83
+ destination_path: The path of the destination directory.
84
+ """
85
+ shutil.copy(file_path, destination_path)
86
+
87
+ def remove_files(file_paths):
88
+ """Remove files given a list of file paths."""
89
+ for file_path in file_paths:
90
+ try:
91
+ os.remove(file_path)
92
+ print(f"File '{file_path}' removed successfully.")
93
+ except OSError as e:
94
+ print(f"Error removing file '{file_path}': {e}")