Nechba commited on
Commit
f16f588
·
verified ·
1 Parent(s): b24f86a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +159 -69
app.py CHANGED
@@ -1,72 +1,162 @@
1
- from fastapi import FastAPI, HTTPException, Request
2
- from fastapi.responses import JSONResponse
3
- from pydantic import BaseModel
4
- from typing import Optional
5
- import logging
6
- from utils import *
7
-
8
- app = FastAPI()
9
- logging.basicConfig(level=logging.INFO)
10
- logger = logging.getLogger(__name__)
11
- # Define the request model
12
- class ArticleRequesteng(BaseModel):
13
- article_title: str
14
- main_keyword: str
15
- target_tone: str
16
- optional_text: str = None
17
- # Define the request model
18
- class ArticleRequest(BaseModel):
19
- titre_article: str
20
- mot_cle_principal: str
21
- ton_cible: str
22
- optional_text : str = None
23
-
24
- # Define the response model
25
- class ArticleResponse(BaseModel):
26
- article: str
27
-
28
- @app.post("/generate_article_fr", response_model=ArticleResponse)
29
- async def generate_article(request: ArticleRequest):
30
- """
31
- Endpoint to generate a French SEO article.
32
- Parameters:
33
- - titre_article: str - The title of the article.
34
- - mot_cle_principal: str - The main keyword for the article.
35
- - ton_cible: str - The target tone of the article.
36
- - optional_text: str - Optional text to include in the article.
37
- """
38
- try:
39
- article = create_pipeline_fr(request.titre_article, request.mot_cle_principal, request.ton_cible,request.optional_text)
40
- return ArticleResponse(article=article)
41
- except Exception as e:
42
- raise HTTPException(status_code=500, detail=str(e))
43
-
44
- @app.post("/generate_article_eng", response_model=ArticleResponse)
45
- async def generate_article_eng(request: ArticleRequesteng):
 
 
 
46
  """
47
- Endpoint to generate an SEO article.
48
- Parameters:
49
- - article_title: str - The title of the article.
50
- - main_keyword: str - The main keyword for the article.
51
- - target_tone: str - The target tone of the article.
52
- - optional_text: str - Optional text to include in the article.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  """
54
- try:
55
- # Basic validation of the input
56
- if not request.article_title or not request.main_keyword:
57
- raise HTTPException(status_code=400, detail="Title and main keyword are required")
58
-
59
- article = create_pipeline(request.article_title, request.main_keyword, request.target_tone,request.optional_text)
60
-
61
- # Ensure the response is not empty
62
- if not article:
63
- raise HTTPException(status_code=204, detail="Generated article is empty")
64
-
65
- return ArticleResponse(article=article)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
- except HTTPException as http_exc:
68
- logger.error(f"HTTP Exception: {http_exc.detail}")
69
- raise http_exc
70
- except Exception as e:
71
- logger.error(f"Unhandled Exception: {str(e)}")
72
- raise HTTPException(status_code=500, detail="An internal server error occurred")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import google.generativeai as genai
2
+
3
+ genai.configure(api_key="AIzaSyCdIOCNM7NmCeu5TS30TxZx6ldN4gSDoTI")
4
+ def call_ai_api(prompt):
5
+ # Set up the model
6
+ generation_config = {
7
+ "temperature": 1,
8
+ "top_p": 0.95,
9
+ "max_output_tokens": 5000000,
10
+ }
11
+ model = genai.GenerativeModel(model_name="gemini-1.5-pro-latest",
12
+ generation_config=generation_config)
13
+ response = model.generate_content(prompt)
14
+ return response.text
15
+
16
+
17
+ def generer_prompt_seo(titre_article, mot_cle_principal, ton_cible, mots_cles_associes,optional_text):
18
+ mots_cles_lexicaux = mots_cles_associes
19
+ if optional_text :
20
+ p=f"""Données optionnel sur l'article : {optional_text}"""
21
+ else:
22
+ p=""""""
23
+ prompt = f"""
24
+ CONTEXTE:
25
+ Veuillez écrire un article de 1500 - 2000 mots. N'hésitez pas à prendre votre temps pour réfléchir à votre réponse j'ai besoin d'un long article.
26
+ Vous êtes un rédacteur SEO chargé de composer un article de blog optimisé pour le SEO sur le sujet suivant.
27
+ Voici les informations et directives à suivre :
28
+
29
+ Titre de l'article : {titre_article}
30
+ Mot-clé principal : {mot_cle_principal}
31
+ Ton et/ou public cible : {ton_cible}
32
+ Mots-clés lexicaux à inclure : {mots_cles_lexicaux}"""
33
+ +p+"""
34
+
35
+ INSTRUCTIONS:
36
+ NOMBRE DE MOTS : 1000 à 1500
37
+ ### Règles de rédaction :
38
+ N'hésitez pas à prendre votre temps pour réfléchir à votre réponse j'ai besoin d'un long article.
39
+ 1. Structure de l'article avec des titres hiérarchisés.
40
+ 2. Optimisation du mot-clé principal (densité d'environ 1,5%, utilisation dans le titre SEO, méta description, et répartition uniforme).
41
+ 3. Inclusion de sous-titres et de mots-clés LSI pour enrichir le contenu sans bourrage de mots-clés.
42
+ 4. Titres et méta descriptions attractifs avec appels à l'action.
43
+ 5. Ton informatif et engageant, avec une variété de vocabulaire.
44
+ 6. Introduction et conclusion engageantes avec le mot-clé principal.
45
+ 7. Section FAQ avec trois questions/réponses courtes.
46
+ 8. Au moins un lien externe vers une source crédible.
47
+ N'hésitez pas à prendre votre temps pour réfléchir à votre réponse j'ai besoin d'un long article.
48
+ Assurez que l'article soit lisible, bien structuré et visuellement attrayant.
49
  """
50
+ return prompt
51
+ def generate_seo_prompt(article_title, main_keyword, target_tone, associated_keywords,optional_text):
52
+ lexical_keywords = associated_keywords
53
+ if optional_text :
54
+ p=f"""Optional article data : {optional_text}"""
55
+ else:
56
+ p=""""""
57
+ prompt = f"""
58
+ CONTEXT:
59
+ Please write an article of 1500 - 2000 words. Feel free to take your time to think about your response, I need a long article.
60
+ You are an SEO writer tasked with composing an SEO-optimized blog article on the following topic.
61
+ Here are the information and guidelines to follow:
62
+
63
+ Article title: {article_title}
64
+ Main keyword: {main_keyword}
65
+ Target tone and/or audience: {target_tone}
66
+ Lexical keywords to include: {lexical_keywords}"""+p+"""
67
+
68
+ INSTRUCTIONS:
69
+ WORD COUNT: 1000 to 1500
70
+ ### Writing rules:
71
+ Feel free to take your time to think about your response, I need a long article.
72
+ 1. Structure the article with hierarchical headings.
73
+ 2. Optimize the main keyword (density of about 1.5%, use in the SEO title, meta description, and evenly distributed).
74
+ 3. Include subheadings and LSI keywords to enrich the content without keyword stuffing.
75
+ 4. Attractive titles and meta descriptions with calls to action.
76
+ 5. Informative and engaging tone, with a variety of vocabulary.
77
+ 6. Engaging introduction and conclusion with the main keyword.
78
+ 7. FAQ section with three short questions/answers.
79
+ 8. At least one external link to a credible source.
80
+ Feel free to take your time to think about your response, I need a long article.
81
+ Ensure that the article is readable, well-structured, and visually appealing.
82
  """
83
+ return prompt
84
+
85
+
86
+ def create_pipeline_fr(titre_article, mot_cle_principal, ton_cible, optional_text):
87
+ # Initial AI API call
88
+ mots_cles_champ_lexical=generer_mots(titre_article,mot_cle_principal)
89
+ pp=generer_prompt_seo(titre_article, mot_cle_principal, ton_cible, mots_cles_champ_lexical,optional_text)
90
+ rep = call_ai_api(pp)
91
+ # Second AI API call with additional elaboration request
92
+ prompt2 = f"D'après le prompt {pp}, j'ai eu le résultat suivant : {rep}. Élaborer plus que ça."
93
+ rep2 = call_ai_api(prompt2)
94
+
95
+ # Third AI API call with further instructions
96
+ prompt3 = (f"D'après le prompt {pp}, j'ai eu le résultat suivant : {rep}. Élaborer plus que ça. {rep2} "
97
+ "Le texte est toujours beaucoup trop court. Aussi, il n'y a aucune gestion des titres, le premier est un H2, "
98
+ "et les sous-titres sont balisés comme des paragraphes. Concernant le lien tout à la fin, il faudrait qu'il soit intégré au texte. "
99
+ "Dernier point, la meta description ne doit pas apparaître quand on demande un article.")
100
+ rep3 = call_ai_api(prompt3)
101
+
102
+ # Fourth AI API call to fix title issues and meta description
103
+ prompt4 = ("Fix ça : Mauvaise gestion des titres, le premier titre doit être un H1. Le mot-clé principal n'est pas assez utilisé, il faut une densité de 1,5%. "
104
+ "Le titre ne doit contenir une majuscule que sur le premier mot de la phrase, pas sur les autres. "
105
+ "La meta description ne doit pas être rédigée. " + rep3)
106
+ rep4 = call_ai_api(prompt4)
107
+
108
+ # Fifth AI API call to fix keyword density and internal link
109
+ prompt5 = (f"Fix ça - Le mot-clé principal : {mot_cle_principal} n'est pas assez utilisé, il faut une densité de 1,5% environ. "
110
+ "Ajoute un lien à l'intérieur d'un texte, et rends le FAQ après la conclusion. et n'ajoute pas de remarque a la fin je veux que dans la sortie que du texte " + rep4)
111
+ rep5 = call_ai_api(prompt5)
112
+
113
+ # Sixth AI API call to ensure the text length
114
+ prompt6 = ("Trop court, seulement j'aurai besoin de 1500 mots minimum attendu. "
115
+ "Laisse la même structure de texte, ajoute juste du contenu. " + rep5)
116
+ rep6 = call_ai_api(prompt6)
117
+
118
+ return rep6
119
+
120
+ def create_pipeline(article_title, main_keyword, target_tone,optional_text):
121
+ # Initial AI API call
122
+ lexical_field_keywords=generate_words(article_title, main_keyword)
123
+ pp = generate_seo_prompt(article_title, main_keyword, target_tone, lexical_field_keywords,optional_text)
124
+
125
+ rep = call_ai_api(pp)
126
 
127
+ # Second AI API call with additional elaboration request
128
+ prompt2 = f"Based on the prompt {pp}, I got the following result: {rep}. Elaborate further."
129
+ rep2 = call_ai_api(prompt2)
130
+
131
+ # Third AI API call with further instructions
132
+ prompt3 = (f"Based on the prompt {pp}, I got the following result: {rep}. Elaborate further. {rep2} "
133
+ "The text is still way too short. Also, there is no title management, the first title is an H2, "
134
+ "and the subtitles are marked as paragraphs. Regarding the link at the end, it should be integrated into the text. "
135
+ "Lastly, the meta description should not appear when requesting an article.")
136
+ rep3 = call_ai_api(prompt3)
137
+
138
+ # Fourth AI API call to fix title issues and meta description
139
+ prompt4 = ("Fix this: Poor title management, the first title must be an H1. The main keyword is not used enough, it should have a density of 1.5%. "
140
+ "The title should only have a capital letter on the first word of the sentence, not on the others. "
141
+ "The meta description should not be written. " + rep3)
142
+ rep4 = call_ai_api(prompt4)
143
+
144
+ # Fifth AI API call to fix keyword density and internal link
145
+ prompt5 = (f"Fix this - The main keyword: {main_keyword} is not used enough, it should have a density of about 1.5%. "
146
+ "Add a link inside the text, and place the FAQ after the conclusion. " + rep4)
147
+ rep5 = call_ai_api(prompt5)
148
+
149
+ # Sixth AI API call to ensure the text length
150
+ prompt6 = ("Too short, I need a minimum of 1500 words expected. "
151
+ "Keep the same text structure, just add more content. " + rep5)
152
+ rep6 = call_ai_api(prompt6)
153
+
154
+ return rep6
155
+
156
+ def generer_mots(titre_article,mot_cle_principal):
157
+ words=call_ai_api("Generes moi des mots-clés similaires a partir de ca ( SEULEMENT DES MOTS OU GROUPE DE MOTS séparés par virgules ) :"+titre_article+" et "+mot_cle_principal)
158
+ return words
159
+
160
+ def generate_words(article_title, main_keyword):
161
+ words = call_ai_api("Generate similar keywords from these (ONLY WORDS OR GROUPS OF WORDS separated by commas): " + article_title + " and " + main_keyword)
162
+ return words