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()