jsakshi commited on
Commit
4e648fd
·
verified ·
1 Parent(s): 3a37236

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +196 -2
app.py CHANGED
@@ -341,7 +341,7 @@ if __name__ == "__main__":
341
  app.launch(share=True)'''
342
 
343
 
344
- import gradio as gr
345
  import os
346
  import time
347
  import requests
@@ -730,7 +730,7 @@ def create_hosted_blog(topic):
730
 
731
  <div class="sidebar-section">
732
  <h3 class="sidebar-title">About the Author</h3>
733
- <p>This article was created by our AI content system that combines research, writing, and design capabilities to produce comprehensive, informative content on cutting-edge topics.</p>
734
  </div>
735
 
736
  <div class="sidebar-section">
@@ -803,5 +803,199 @@ with gr.Blocks(theme=gr.themes.Soft()) as app:
803
  outputs=[blog_link, blog_output]
804
  )
805
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
806
  if __name__ == "__main__":
807
  app.launch(share=True)
 
341
  app.launch(share=True)'''
342
 
343
 
344
+ '''import gradio as gr
345
  import os
346
  import time
347
  import requests
 
730
 
731
  <div class="sidebar-section">
732
  <h3 class="sidebar-title">About the Author</h3>
733
+ <p>This article was created by Sakshi Jadhav that combines research, writing, and design capabilities to produce comprehensive, informative content on cutting-edge topics.</p>
734
  </div>
735
 
736
  <div class="sidebar-section">
 
803
  outputs=[blog_link, blog_output]
804
  )
805
 
806
+ if __name__ == "__main__":
807
+ app.launch(share=True)'''
808
+
809
+ import gradio as gr
810
+ import os
811
+ import time
812
+ import requests
813
+ import re
814
+ import uuid
815
+ import markdown
816
+ from datetime import datetime
817
+ from dotenv import load_dotenv
818
+ from huggingface_hub import HfApi, upload_file
819
+
820
+ load_dotenv()
821
+
822
+ # Configuration
823
+ HF_TOKEN = os.getenv("HF_TOKEN")
824
+ HF_USERNAME = "jsakshi"
825
+ AUTHOR_NAME = "Sarah Johnson" # Add your name here
826
+ HEADERS = {"Authorization": f"Bearer {HF_TOKEN}"}
827
+
828
+ def generate_blog_content(topic, seo_keywords):
829
+ try:
830
+ prompt = f"""Write a high-quality, well-researched blog post on {topic} that sounds completely human-written.
831
+ Requirements:
832
+ - Engaging, conversational tone (avoid AI-sounding phrases)
833
+ - Start with a strong hook in the introduction
834
+ - Use subheadings, bullet points, and real-world examples
835
+ - Bold 3-5 key terms using **bold** formatting
836
+ - Include: "This article was written by {AUTHOR_NAME}, combining research and industry expertise"
837
+ - SEO keywords: {', '.join(seo_keywords)}
838
+ - Length: 1500-2000 words
839
+ - Structure:
840
+ 1. Introduction with surprising statistic/anecdote
841
+ 2. 3-5 main sections with clear subheadings
842
+ 3. Practical advice/actionable takeaways
843
+ 4. Conclusion with thought-provoking question
844
+
845
+ Make it flow naturally with varied sentence structure. Avoid markdown formatting except for bolding."""
846
+
847
+ response = requests.post(
848
+ "https://api-inference.huggingface.co/models/mistralai/Mistral-7B-Instruct-v0.2",
849
+ headers=HEADERS,
850
+ json={"inputs": prompt, "parameters": {"max_length": 2500}}
851
+ )
852
+
853
+ if response.status_code != 200:
854
+ return None, f"API Error: {response.text}"
855
+
856
+ blog_text = response.json()[0]['generated_text']
857
+
858
+ # Post-processing
859
+ blog_text = re.sub(r'\n{3,}', '\n\n', blog_text) # Remove extra newlines
860
+ blog_text = add_author_byline(blog_text, AUTHOR_NAME)
861
+
862
+ return extract_metadata(blog_text), None
863
+
864
+ except Exception as e:
865
+ return None, f"Error: {str(e)}"
866
+
867
+ def add_author_byline(content, author_name):
868
+ byline = f"\n\n---\n\n*This article was meticulously researched and written by {author_name}, " \
869
+ "combining hands-on industry experience with academic insights. All content is human-created.*"
870
+ return content + byline
871
+
872
+ def extract_metadata(blog_text):
873
+ # Extract title and subtitle
874
+ lines = blog_text.split('\n')
875
+ title = lines[0].strip().replace('#', '').strip()
876
+ subtitle = next((line.strip() for line in lines[1:10] if line.strip() and not line.startswith('#')), "In-Depth Analysis")
877
+
878
+ # Find key points for bold formatting
879
+ bold_terms = list(set(re.findall(r'\*\*(.*?)\*\*', blog_text)))
880
+
881
+ return {
882
+ "title": title,
883
+ "subtitle": subtitle,
884
+ "content": blog_text,
885
+ "bold_terms": bold_terms[:5]
886
+ }
887
+
888
+ def create_hosted_blog(topic, seo_keywords):
889
+ try:
890
+ # Generate blog content
891
+ content_data, error = generate_blog_content(topic, seo_keywords)
892
+ if error:
893
+ return f"Error: {error}", ""
894
+
895
+ # Create space and upload content (same as before)
896
+ # ... [keep previous space creation and image upload code] ...
897
+
898
+ # Enhanced HTML template with SEO
899
+ complete_html = f"""<!DOCTYPE html>
900
+ <html lang="en">
901
+ <head>
902
+ <meta charset="UTF-8">
903
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
904
+ <title>{content_data['title']}</title>
905
+ <meta name="description" content="{content_data['subtitle']}">
906
+ <meta name="keywords" content="{', '.join(seo_keywords)}">
907
+ <meta name="author" content="{AUTHOR_NAME}">
908
+ <!-- Keep previous styles, add these enhancements -->
909
+ <style>
910
+ .author-bio {{
911
+ display: flex;
912
+ align-items: center;
913
+ gap: 1rem;
914
+ padding: 1.5rem;
915
+ background: #f8f9fa;
916
+ border-radius: 8px;
917
+ margin: 2rem 0;
918
+ }}
919
+ .author-img {{
920
+ width: 80px;
921
+ height: 80px;
922
+ border-radius: 50%;
923
+ object-fit: cover;
924
+ }}
925
+ .key-terms {{
926
+ background: #fff3cd;
927
+ padding: 1rem;
928
+ border-left: 4px solid #ffc107;
929
+ margin: 1.5rem 0;
930
+ }}
931
+ /* Keep previous styles */
932
+ </style>
933
+ </head>
934
+ <body>
935
+ <header><!-- Same header --></header>
936
+
937
+ <div class="container">
938
+ <div class="blog-content">
939
+ <article class="main-content">
940
+ <div class="author-bio">
941
+ <img src="author-placeholder.png" alt="{AUTHOR_NAME}" class="author-img">
942
+ <div>
943
+ <h4>{AUTHOR_NAME}</h4>
944
+ <p>Industry expert with 10+ years experience in {topic.split()[-1]}</p>
945
+ </div>
946
+ </div>
947
+
948
+ <div class="key-terms">
949
+ <h4>Key Terms in This Article:</h4>
950
+ <p>{', '.join(content_data['bold_terms'])}</p>
951
+ </div>
952
+
953
+ <!-- Content sections -->
954
+ {process_content(content_data['content'])}
955
+
956
+ <!-- Keep footer and other elements -->
957
+ </article>
958
+ </div>
959
+ </div>
960
+ </body>
961
+ </html>
962
+ """
963
+ # Upload and return
964
+ # ... [keep previous upload code] ...
965
+
966
+ except Exception as e:
967
+ return f"Error: {str(e)}", ""
968
+
969
+ def process_content(content):
970
+ # Convert markdown bold to HTML and add anchor links
971
+ content = content.replace('**', '<strong>').replace('**', '</strong>')
972
+ return markdown.markdown(content)
973
+
974
+ # Enhanced Gradio UI
975
+ with gr.Blocks(theme=gr.themes.Soft()) as app:
976
+ gr.Markdown("# ✍️ Human-Written Blog Generator")
977
+ gr.Markdown("Create authentic, SEO-optimized articles that read like human-written content")
978
+
979
+ with gr.Row():
980
+ with gr.Column():
981
+ topic_input = gr.Textbox(label="Main Topic",
982
+ placeholder="e.g., Sustainable AI Practices in Modern Tech")
983
+ seo_input = gr.Textbox(label="SEO Keywords (comma-separated)",
984
+ placeholder="AI sustainability, green tech, eco-friendly AI")
985
+ generate_btn = gr.Button("Create Article", variant="primary")
986
+
987
+ with gr.Column():
988
+ gr.Markdown("### Live Blog URL")
989
+ blog_link = gr.Markdown()
990
+ gr.Markdown("### Content Preview")
991
+ blog_output = gr.Markdown()
992
+ status = gr.Textbox(label="Generation Status")
993
+
994
+ generate_btn.click(
995
+ fn=create_hosted_blog,
996
+ inputs=[topic_input, seo_input],
997
+ outputs=[blog_link, blog_output]
998
+ )
999
+
1000
  if __name__ == "__main__":
1001
  app.launch(share=True)