Sunil Surendra Singh commited on
Commit
265c07a
·
1 Parent(s): f944fa7

added MongoDB support

Browse files
Files changed (6) hide show
  1. app.py +31 -14
  2. assets/app-design.png +2 -2
  3. config.py +10 -4
  4. model.py +10 -2
  5. mongo_utils.py +57 -0
  6. requirements.txt +2 -1
app.py CHANGED
@@ -1,6 +1,7 @@
1
  import gradio as gr
2
  import model
3
  from config import app_config
 
4
 
5
 
6
  def clear():
@@ -29,19 +30,34 @@ def create_interface():
29
  api_name=False,
30
  )
31
  with gr.Row():
32
- gr.Markdown(
33
- """
34
- # Storyteller
35
- **This app can craft captivating narratives from captivating images,
36
- potentially surpassing even Shakespearean standards. Select an image
37
- that inspires a story, choose a story length (up to 100 words), and
38
- adjust the creativity index to enhance its creative flair.**
39
- <br>
40
- ***Please exercise patience, as the models employed are extensive and may
41
- require a few seconds to load. If you encounter an unrelated story,
42
- it is likely still loading; wait a moment and try again.***
43
- """
44
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  with gr.Row():
46
  with gr.Column():
47
  image = gr.Image(
@@ -89,7 +105,7 @@ def create_interface():
89
  submit_button.click(
90
  fn=model.generate_story,
91
  inputs=[image, word_count, creativity],
92
- outputs=[story],
93
  )
94
  clear_button.click(
95
  fn=clear, inputs=[], outputs=[image, word_count, creativity, story]
@@ -100,5 +116,6 @@ def create_interface():
100
 
101
 
102
  if __name__ == "__main__":
 
103
  app = create_interface()
104
  app.launch()
 
1
  import gradio as gr
2
  import model
3
  from config import app_config
4
+ import mongo_utils as mongo
5
 
6
 
7
  def clear():
 
30
  api_name=False,
31
  )
32
  with gr.Row():
33
+ with gr.Column(scale=5):
34
+ gr.Markdown(
35
+ """
36
+ # Storyteller
37
+ **This app can craft captivating narratives from captivating images,
38
+ potentially surpassing even Shakespearean standards. Select an image
39
+ that inspires a story, choose a story length (up to 100 words), and
40
+ adjust the creativity index to enhance its creative flair.**
41
+ <br>
42
+ ***Please exercise patience, as the models employed are extensive and may
43
+ require a few seconds to load. If you encounter an unrelated story,
44
+ it is likely still loading; wait a moment and try again.***
45
+ """
46
+ )
47
+ with gr.Column(scale=2):
48
+ max_count = gr.Textbox(
49
+ label="Max allowed OpenAI requests:",
50
+ value=app_config.openai_max_access_count,
51
+ )
52
+ curr_count = gr.Textbox(
53
+ label="Used up OpenAI requests:",
54
+ value=app_config.openai_curr_access_count,
55
+ )
56
+ available_count = gr.Textbox(
57
+ label="Available OpenAI requests:",
58
+ value=app_config.openai_max_access_count
59
+ - app_config.openai_curr_access_count,
60
+ )
61
  with gr.Row():
62
  with gr.Column():
63
  image = gr.Image(
 
105
  submit_button.click(
106
  fn=model.generate_story,
107
  inputs=[image, word_count, creativity],
108
+ outputs=[story, max_count, curr_count, available_count],
109
  )
110
  clear_button.click(
111
  fn=clear, inputs=[], outputs=[image, word_count, creativity, story]
 
116
 
117
 
118
  if __name__ == "__main__":
119
+ mongo.fetch_curr_access_count()
120
  app = create_interface()
121
  app.launch()
assets/app-design.png CHANGED

Git LFS Details

  • SHA256: 466a5730016a5f668680b7a12b3fe729afbe3bd6366ec91511ad643a62d987ca
  • Pointer size: 131 Bytes
  • Size of remote file: 216 kB

Git LFS Details

  • SHA256: 9af394f4928e1f34b77cc33e8bf946a9ef93058d638bc6ea78f1cc102cae8f95
  • Pointer size: 131 Bytes
  • Size of remote file: 227 kB
config.py CHANGED
@@ -1,6 +1,5 @@
1
  import os
2
  from dataclasses import dataclass
3
- import gradio as gr
4
 
5
 
6
  @dataclass
@@ -8,9 +7,16 @@ class AppConfig:
8
  title = "Picture to Story Generator"
9
  theme = "freddyaboulton/dracula_revamped"
10
  css = "style.css"
11
- HF_TOKEN = os.getenv("HF_TOKEN")
12
- OPENAI_KEY = os.getenv("OPENAI_KEY")
13
- I2T_API_URL = os.getenv("I2T_API_URL")
 
 
 
 
 
 
 
14
 
15
 
16
  app_config = AppConfig()
 
1
  import os
2
  from dataclasses import dataclass
 
3
 
4
 
5
  @dataclass
 
7
  title = "Picture to Story Generator"
8
  theme = "freddyaboulton/dracula_revamped"
9
  css = "style.css"
10
+ openai_max_access_count = 200
11
+ openai_curr_access_count = None
12
+ mongo_client = None
13
+ db = "mydb"
14
+ collection = "pic2story-openai-access-counter"
15
+ key = "current_count"
16
+ # HF_TOKEN = os.getenv("HF_TOKEN")
17
+ # OPENAI_KEY = os.getenv("OPENAI_KEY")
18
+ # I2T_API_URL = os.getenv("I2T_API_URL")
19
+ # MONGO_CONN_STR = os.getenv("MONGO_CONN_STR")
20
 
21
 
22
  app_config = AppConfig()
model.py CHANGED
@@ -8,6 +8,7 @@ from langchain.prompts import (
8
  ChatPromptTemplate,
9
  )
10
  from config import app_config
 
11
 
12
 
13
  def __image2text(image):
@@ -51,11 +52,18 @@ def __text2story(image_desc, word_count, creativity):
51
 
52
  def generate_story(image_file, word_count, creativity):
53
  """Generates a story given an image"""
54
- # read image as bytes array
55
  with open(image_file, "rb") as f:
56
  input_image = f.read()
 
57
  image_desc = __image2text(image=input_image)
 
58
  story = __text2story(
59
  image_desc=image_desc, word_count=word_count, creativity=creativity
60
  )
61
- return story
 
 
 
 
 
 
8
  ChatPromptTemplate,
9
  )
10
  from config import app_config
11
+ import mongo_utils as mongo
12
 
13
 
14
  def __image2text(image):
 
52
 
53
  def generate_story(image_file, word_count, creativity):
54
  """Generates a story given an image"""
55
+ # read image as bytes arrayS
56
  with open(image_file, "rb") as f:
57
  input_image = f.read()
58
+ # generate caption for image
59
  image_desc = __image2text(image=input_image)
60
+ # generate story from caption
61
  story = __text2story(
62
  image_desc=image_desc, word_count=word_count, creativity=creativity
63
  )
64
+ # increment the openai access counter and compute count stats
65
+ mongo.increment_curr_access_count()
66
+ max_count = app_config.openai_max_access_count
67
+ curr_count = app_config.openai_curr_access_count
68
+ available_count = max_count - curr_count
69
+ return story, max_count, curr_count, available_count
mongo_utils.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pymongo
2
+ from config import app_config
3
+
4
+
5
+ # Generic functions
6
+ def get_db_client():
7
+ """Returns MongoDB client object, connect to MongoDB Atlas instances if required"""
8
+ try:
9
+ if app_config.mongo_client == None:
10
+ client = pymongo.MongoClient(app_config.MONGO_CONN_STR)
11
+ app_config.mongo_client = client
12
+ except Exception as e:
13
+ print(e)
14
+ return app_config.mongo_client
15
+
16
+
17
+ def fetch_document(client, db, collection):
18
+ """Get a single document from the provided db and collection"""
19
+ try:
20
+ document = client[db][collection].find_one()
21
+ except Exception as e:
22
+ print(e)
23
+ return document
24
+
25
+
26
+ def update_document(client, db, collection, key, value):
27
+ """Update the passed key in the document for provided db and collection"""
28
+ try:
29
+ document = fetch_document(client, db, collection)
30
+ client[db][collection].update_one(
31
+ {"_id": document["_id"]},
32
+ {"$set": {key: value}},
33
+ )
34
+ except Exception as e:
35
+ print(e)
36
+
37
+
38
+ # Use case specific functions
39
+ def fetch_curr_access_count():
40
+ client = get_db_client()
41
+ curr_count = fetch_document(
42
+ client=client, db=app_config.db, collection=app_config.collection
43
+ )[app_config.key]
44
+ app_config.openai_curr_access_count = curr_count
45
+
46
+
47
+ def increment_curr_access_count():
48
+ client = get_db_client()
49
+ updated_count = app_config.openai_curr_access_count + 1
50
+ update_document(
51
+ client=client,
52
+ db=app_config.db,
53
+ collection=app_config.collection,
54
+ key=app_config.key,
55
+ value=updated_count,
56
+ )
57
+ app_config.openai_curr_access_count = updated_count
requirements.txt CHANGED
@@ -1,4 +1,5 @@
1
  gradio==3.45.*
2
  requests==2.29.*
3
  langchain==0.0.*
4
- openai==0.27.*
 
 
1
  gradio==3.45.*
2
  requests==2.29.*
3
  langchain==0.0.*
4
+ openai==0.27.*
5
+ pymongo[tls, srv]==4.4.*