Dhahlan2000 commited on
Commit
204d33b
·
1 Parent(s): dc6ab46

Refactor app.py to implement streaming response generation for email creation. Removed tokenizer and model initialization in favor of using the InferenceClient for improved performance and reduced complexity. Updated conversation_predict function to yield streaming output, enhancing user experience with real-time email generation feedback. Added a new update_ui function to manage email display in the Streamlit interface, ensuring a smoother interaction flow.

Browse files
Files changed (1) hide show
  1. app.py +32 -26
app.py CHANGED
@@ -78,15 +78,6 @@ def extract_cv_text(file):
78
  # Replace 'your_huggingface_token' with your actual Hugging Face access token
79
  access_token = os.getenv('API_KEY')
80
 
81
- # Initialize the tokenizer and model with the Hugging Face access token
82
- tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b-it", use_auth_token=access_token)
83
- model = AutoModelForCausalLM.from_pretrained(
84
- "google/gemma-2b-it",
85
- torch_dtype=torch.bfloat16,
86
- use_auth_token=access_token
87
- )
88
- model.eval() # Set the model to evaluation mode
89
-
90
  # Initialize the inference client (if needed for other API-based tasks)
91
  client = InferenceClient(token=access_token)
92
 
@@ -118,23 +109,22 @@ Keep the tone professional, confident, and enthusiastic. Be concise but impactfu
118
  Email:"""
119
 
120
  def conversation_predict(input_text: str, cv_sections: Dict[str, str]):
121
- """Generate a response using the model with improved prompting."""
122
  prompt = create_email_prompt(input_text, cv_sections)
123
 
124
- # Tokenize the input text
125
- input_ids = tokenizer(prompt, return_tensors="pt").input_ids
126
-
127
- # Generate a response with the model
128
- outputs = model.generate(
129
- input_ids,
130
- max_new_tokens=2048,
131
  temperature=0.7,
132
  top_p=0.95,
133
- do_sample=True
134
- )
135
-
136
- # Decode and return the generated response
137
- return tokenizer.decode(outputs[0], skip_special_tokens=True)
 
138
 
139
  def respond(
140
  message: str,
@@ -194,18 +184,34 @@ with tab1:
194
  if isinstance(cv_sections, dict):
195
  st.success("CV uploaded and parsed successfully!")
196
  else:
197
- st.error(cv_sections) # Show error message if parsing failed
198
 
199
  # Job description input
200
  st.markdown("### Job Description")
201
  message = st.text_area("Paste the job description here:", height=200)
202
 
 
 
 
 
 
 
 
203
  # Generate button
204
  if st.button("Generate Email"):
205
  if message and cv_file and isinstance(cv_sections, dict):
206
- response = conversation_predict(message, cv_sections)
207
- st.markdown("### Generated Email:")
208
- st.markdown(response)
 
 
 
 
 
 
 
 
 
209
  else:
210
  st.warning("Please upload a CV and enter a job description.")
211
 
 
78
  # Replace 'your_huggingface_token' with your actual Hugging Face access token
79
  access_token = os.getenv('API_KEY')
80
 
 
 
 
 
 
 
 
 
 
81
  # Initialize the inference client (if needed for other API-based tasks)
82
  client = InferenceClient(token=access_token)
83
 
 
109
  Email:"""
110
 
111
  def conversation_predict(input_text: str, cv_sections: Dict[str, str]):
112
+ """Generate a response using the model with streaming output."""
113
  prompt = create_email_prompt(input_text, cv_sections)
114
 
115
+ # Use the streaming API
116
+ for response in client.text_generation(
117
+ model="google/gemma-2b-it",
118
+ prompt=prompt,
119
+ max_new_tokens=512,
 
 
120
  temperature=0.7,
121
  top_p=0.95,
122
+ stream=True
123
+ ):
124
+ if hasattr(response, 'token'): # Handle different response formats
125
+ yield response.token.text
126
+ else:
127
+ yield response.generated_text
128
 
129
  def respond(
130
  message: str,
 
184
  if isinstance(cv_sections, dict):
185
  st.success("CV uploaded and parsed successfully!")
186
  else:
187
+ st.error(cv_sections)
188
 
189
  # Job description input
190
  st.markdown("### Job Description")
191
  message = st.text_area("Paste the job description here:", height=200)
192
 
193
+ # Call the updated UI function
194
+ update_ui()
195
+
196
+ def update_ui():
197
+ # Create placeholder for the generated email
198
+ email_placeholder = st.empty()
199
+
200
  # Generate button
201
  if st.button("Generate Email"):
202
  if message and cv_file and isinstance(cv_sections, dict):
203
+ email_text = ""
204
+ # Stream the response
205
+ for chunk in conversation_predict(message, cv_sections):
206
+ if chunk:
207
+ email_text += chunk
208
+ # Update the text area with each chunk
209
+ email_placeholder.text_area(
210
+ "Generated Email",
211
+ value=email_text,
212
+ height=400,
213
+ key="email_output"
214
+ )
215
  else:
216
  st.warning("Please upload a CV and enter a job description.")
217