Arvstod / app.py
masulo's picture
Update app.py
1596e33 verified
Raw History Blame Contribute Delete
7.03 kB
import os
import gradio as gr
# 1) Hämta Hugging Face-token (om du har lagt in en HF_API_TOKEN som secret)
os.environ["HUGGINGFACEHUB_API_TOKEN"] = os.getenv("HF_API_TOKEN", "")
from transformers import pipeline
# Bytt till Bloom-560m, en betydligt mindre öppen modell
generator = pipeline(
"text-generation",
model="bigscience/bloom-560m",
device_map="auto" # Försöker automatiskt placera modellen på CPU/GPU
# trust_remote_code=False (ej nödvändigt för Bloom)
)
def generate_application(project_name, target_group, description):
"""
Genererar en grundläggande Arvsfondsansökan.
Här använder vi ett prompt som visar ett förifyllt format:
- Rubrik
- Projektbeskrivning
- Motivering
- Metod
AI kompletterar texten.
"""
prompt = f"""
Skriv en Arvsfondsansökan för projektet '{project_name}' som riktar sig till '{target_group}'.
Använd tydliga och konkreta formuleringar. Här är formatet:
**Rubrik:**
"Ett inkluderande projekt för {target_group} inom [verksamhetsområde]"
**Projektbeskrivning:**
"Projektet syftar till att skapa [aktivitet/tjänst] för {target_group} i syfte att [förbättring/mål].
Genom samverkan med [lokala aktörer] vill vi stärka {target_group}s behov."
**Motivering:**
"Behovet för detta projekt har identifierats genom [undersökning/dialog/erfarenhet].
Det finns för närvarande en brist på [resurs/aktivitet] för {target_group}, vilket leder till [problem]."
**Metod:**
"Projektet genomförs i tre faser: 1️⃣ [Planeringsfas], 2️⃣ [Genomförande], 3️⃣ [Utvärdering].
Vi kommer att använda [metoder] för att säkerställa att projektet är inkluderande och hållbart."
Anpassa texten för att passa föreningens behov.
"""
# Generera text med pipeline
result = generator(prompt, max_length=700, do_sample=True)
return result[0]['generated_text']
def ai_feedback(application_text):
"""
Analyserar genererad text och ger feedback enligt Arvsfondens krav:
- Tydlighet kring målgrupp
- Konkreta metoder och genomförandeplan
- Motivering till projektets behov
"""
feedback_prompt = f"""
Läs igenom följande ansökan och peka ut eventuella svagheter enligt Arvsfondens krav:
- Är målgruppen tydligt definierad?
- Har projektet en konkret metod och tydlig genomförandeplan?
- Finns det en klar motivering till varför projektet behövs?
Ansökan:
{application_text}
Ge konstruktiv feedback på svenska.
"""
# Generera feedback
result = generator(feedback_prompt, max_length=300, do_sample=True)
return result[0]['generated_text']
def chatbot_response(user_input, chat_history):
"""
Interaktiv chatbot som stegvis bygger ansökan.
Om användaren skriver nyckelord visar vi förberedda frågor.
Annars skickar vi prompten direkt till AI:n för en öppen svarsgenerering.
"""
questions = {
"start": (
"Vad handlar ert projekt om? Välj det som bäst beskriver ert initiativ:\n"
"1️⃣ Skapa en ny verksamhet\n"
"2️⃣ Utveckla en befintlig verksamhet\n"
"3️⃣ Starta en helt ny metod."
),
"target_group": (
"Vilken målgrupp riktar sig projektet till?\n"
"✅ Barn och unga (0–25 år)\n"
"✅ Personer med funktionsnedsättning\n"
"✅ Äldre (över 65 år)"
),
"goal": (
"Vad är huvudmålet med projektet?\n"
"✅ Skapa nya fritidsmöjligheter\n"
"✅ Förbättra hälsa och välmående\n"
"✅ Skapa arbete eller utbildning\n"
"✅ Öka social inkludering"
),
"execution": (
"Hur ska ni genomföra projektet?\n"
"✅ Workshops/evenemang\n"
"✅ Samarbete med lokala aktörer\n"
"✅ Digitala lösningar (webbplattform, app etc.)"
),
"need": (
"Hur vet ni att det finns ett behov av projektet?\n"
"✅ Vi har pratat med målgruppen\n"
"✅ Vi har sett att liknande projekt saknas\n"
"✅ Vi har analyserat statistik eller forskning"
)
}
lowered_input = user_input.lower()
# Styr chatboten genom enkla nyckelord
if lowered_input in ["start", "börja"]:
chat_history.append(("System", questions["start"]))
elif any(k in lowered_input for k in ["ny verksamhet", "utveckla", "ny metod"]):
chat_history.append(("System", questions["target_group"]))
elif any(k in lowered_input for k in ["barn", "funktionsnedsättning", "äldre"]):
chat_history.append(("System", questions["goal"]))
elif any(k in lowered_input for k in ["fritidsmöjligheter", "hälsa", "arbete", "inkludering"]):
chat_history.append(("System", questions["execution"]))
elif any(k in lowered_input for k in ["workshops", "samarbete", "digitala lösningar", "evenemang"]):
chat_history.append(("System", questions["need"]))
else:
# Om inget nyckelord matchar, generera fritt svar
result = generator(user_input, max_length=200, do_sample=True)
chat_history.append(("User", user_input))
chat_history.append(("AI", result[0]['generated_text']))
# Gradio Chatbot kräver att man returnerar (user_input, chat_history)
return "", chat_history
# Bygg Gradio-appen
with gr.Blocks() as demo:
gr.Markdown("# 📝 Arvstöd™ – AI-hjälp för föreningar (Falcon 7B)")
with gr.Row():
with gr.Column():
gr.Markdown("## 📋 Fyll i dina uppgifter")
project_name = gr.Textbox(label="Projektnamn")
target_group = gr.Dropdown(
["Barn och unga", "Personer med funktionsnedsättning", "Äldre"],
label="Målgrupp"
)
description = gr.Textbox(label="Kort beskrivning av projektet")
generate_button = gr.Button("Generera ansökan")
application_output = gr.Textbox(label="AI-genererad ansökningstext")
feedback_button = gr.Button("Få AI-feedback")
feedback_output = gr.Textbox(label="AI-feedback på ansökan")
with gr.Column():
gr.Markdown("## 💬 Chatbot – Förbättra din ansökan")
chatbot = gr.Chatbot()
user_input = gr.Textbox(label="Skriv en fråga eller be om feedback")
send_button = gr.Button("Skicka")
# Koppla knapparna till våra funktioner
generate_button.click(
fn=generate_application,
inputs=[project_name, target_group, description],
outputs=application_output
)
feedback_button.click(
fn=ai_feedback,
inputs=[application_output],
outputs=feedback_output
)
send_button.click(
fn=chatbot_response,
inputs=[user_input, chatbot],
outputs=[user_input, chatbot]
)
demo.launch()