shivrajkarewar's picture
Update app.py
9a08316 verified
raw
history blame
3.23 kB
import os
import requests
import gradio as gr
from pymatgen.core import Structure, Lattice
from pymatgen.io.cif import CifWriter
import tempfile
import shutil
# Retrieve the API key from the environment variable
groq_api_key = os.getenv("GROQ_API_KEY")
if not groq_api_key:
raise ValueError("GROQ_API_KEY is missing! Set it in the Hugging Face Spaces 'Secrets'.")
# Define the API endpoint and headers
url = "https://api.groq.com/openai/v1/chat/completions"
headers = {"Authorization": f"Bearer {groq_api_key}"}
# Function to get material recommendations from Groq API
def get_material_recommendations(application):
body = {
"model": "llama-3.1-8b-instant",
"messages": [{"role": "user", "content": f"Recommend three best materials for {application} with their key properties."}]
}
response = requests.post(url, headers=headers, json=body)
if response.status_code == 200:
return response.json()['choices'][0]['message']['content']
else:
return f"Error: {response.json()}"
# Function to create dummy structures for visualization
def create_dummy_structure(material_name):
# This function creates a simple cubic structure as a placeholder
lattice = Lattice.cubic(3.5)
structure = Structure(
lattice,
["Si"],
[[0, 0, 0]]
)
return structure
# Function to generate CIF files and visualize structures
def generate_and_visualize(application):
# Get material recommendations
recommendations = get_material_recommendations(application)
# Parse the recommendations to extract material names
# For simplicity, we'll assume the material names are listed as:
# 1. Material A
# 2. Material B
# 3. Material C
lines = recommendations.split('\n')
material_names = []
for line in lines:
if line.strip().startswith(('1.', '2.', '3.')):
parts = line.split('.')
if len(parts) > 1:
material_name = parts[1].strip().split(' ')[0]
material_names.append(material_name)
# Create temporary directory to store CIF files
temp_dir = tempfile.mkdtemp()
cif_file_paths = []
for name in material_names:
structure = create_dummy_structure(name)
cif_path = os.path.join(temp_dir, f"{name}.cif")
writer = CifWriter(structure)
writer.write_file(cif_path)
cif_file_paths.append(cif_path)
# Display the recommendations and provide CIF files for download
output_text = recommendations
download_links = [gr.File(cif_path, label=os.path.basename(cif_path)) for cif_path in cif_file_paths]
return output_text, download_links
# Create Gradio interface
interface = gr.Interface(
fn=generate_and_visualize,
inputs=gr.Textbox(lines=2, placeholder="Enter application (e.g., aerospace structural component)"),
outputs=[gr.Textbox(label="Material Recommendations"), gr.File(label="Download CIF Files")],
title="Materials Science Expert",
description="Enter a specific application to get the top 3 material recommendations with their properties and download their CIF files."
)
# Launch Gradio app
if __name__ == "__main__":
interface.launch()