Spaces:
Running
Running
| # deepseek_client.py | |
| # Komunikacja z DeepSeek API | |
| import streamlit as st | |
| from openai import OpenAI | |
| import os | |
| from personas import get_persona_for_analysis | |
| class DeepSeekClient: | |
| def __init__(self): | |
| """ | |
| Inicjalizuje klienta DeepSeek z kluczem API z secrets | |
| """ | |
| try: | |
| self.api_key = st.secrets["DEEPSEEK_API_KEY"] | |
| self.client = OpenAI( | |
| api_key=self.api_key, | |
| base_url="https://api.deepseek.com" | |
| ) | |
| except Exception as e: | |
| st.error(f"Błąd inicjalizacji DeepSeek API: {str(e)}") | |
| self.client = None | |
| def load_knowledge_base(self): | |
| """ | |
| Ładuje bazę wiedzy z plików dane_polacy.txt i raport_polska.txt | |
| """ | |
| knowledge_content = "" | |
| knowledge_files = ["dane_polacy.txt", "raport_polska.txt"] | |
| for filename in knowledge_files: | |
| filepath = os.path.join("knowledge", filename) | |
| try: | |
| with open(filepath, 'r', encoding='utf-8') as file: | |
| content = file.read() | |
| knowledge_content += f"\n\n=== {filename} ===\n{content}" | |
| except FileNotFoundError: | |
| st.warning(f"Nie znaleziono pliku: {filepath}") | |
| except Exception as e: | |
| st.error(f"Błąd czytania pliku {filepath}: {str(e)}") | |
| return knowledge_content | |
| def build_analysis_prompt(self, concept_description, selected_personas, custom_target, knowledge_context): | |
| """ | |
| Buduje prompt dla analizy koncepcji reklamowej | |
| """ | |
| prompt = f""" | |
| Jesteś ekspertem od badań rynku i analizy konsumenckiej w Polsce. Twoim zadaniem jest przeanalizowanie koncepcji reklamowej/produktowej i przewidzenie reakcji różnych grup docelowych. | |
| === KONTEKST WIEDZY O POLSKICH KONSUMENTACH === | |
| {knowledge_context} | |
| === KONCEPCJA DO ANALIZY === | |
| {concept_description} | |
| === GRUPY DOCELOWE DO ANALIZY === | |
| """ | |
| # Dodawanie wybranych person | |
| if selected_personas: | |
| for persona_key in selected_personas: | |
| persona_desc = get_persona_for_analysis(persona_key) | |
| prompt += f"\n{persona_desc}" | |
| # Dodawanie custom target group | |
| if custom_target: | |
| prompt += f"\n\nCustom Target Group:\n{custom_target}" | |
| prompt += f""" | |
| === ZADANIE === | |
| Dla każdej z grup docelowych przeanalizuj koncepcję i przedstaw wyniki w następującym formacie: | |
| **[NAZWA GRUPY/PERSONY]** | |
| **Co myślę:** | |
| [Wypowiedź w pierwszej osobie - jakie są pierwsze myśli, skojarzenia, czy to jest interesujące/nudne/wartościowe] | |
| **Co czuję:** | |
| [Wypowiedź w pierwszej osobie - jakie emocje wywołuje ta koncepcja, jakie ma skojarzenia pozytywne/negatywne] | |
| **Co zrobię:** | |
| [Wypowiedź w pierwszej osobie - jaka będzie prawdopodobna reakcja zakupowa, czy kupi, poleci, zignoruje] | |
| --- | |
| WAŻNE WSKAZÓWKI: | |
| - Pisz w pierwszej osobie, jak gdyby to była autentyczna wypowiedź danej osoby | |
| - Uwzględnij specyfikę polskiego rynku i mentalności | |
| - Bazuj na danych z kontekstu wiedzy | |
| - Bądź realistyczny - nie wszyscy muszą reagować pozytywnie | |
| - Uwzględnij demografię, wartości i styl życia każdej grupy | |
| """ | |
| return prompt | |
| def analyze_concept(self, concept_description, selected_personas=None, custom_target=None): | |
| """ | |
| Główna metoda analizująca koncepcję | |
| """ | |
| if not self.client: | |
| return "Błąd: Brak połączenia z API DeepSeek" | |
| # Ładowanie bazy wiedzy | |
| knowledge_context = self.load_knowledge_base() | |
| # Budowanie promptu | |
| prompt = self.build_analysis_prompt( | |
| concept_description, | |
| selected_personas, | |
| custom_target, | |
| knowledge_context | |
| ) | |
| try: | |
| # Wywołanie API DeepSeek | |
| response = self.client.chat.completions.create( | |
| model="deepseek-chat", | |
| messages=[ | |
| {"role": "system", "content": "Jesteś ekspertem od badań rynku i analizy konsumenckiej w Polsce."}, | |
| {"role": "user", "content": prompt} | |
| ], | |
| temperature=1.3, # Dla kreatywnej analizy | |
| max_tokens=4000 | |
| ) | |
| return response.choices[0].message.content | |
| except Exception as e: | |
| error_msg = f"Błąd podczas analizy: {str(e)}" | |
| st.error(error_msg) | |
| return error_msg | |
| def format_custom_target_description(self, gender, age_range, location, additional_desc=""): | |
| """ | |
| Formatuje opis custom target group | |
| """ | |
| target_desc = f"Grupa docelowa: {gender}, wiek {age_range}, mieszka w: {location}" | |
| if additional_desc: | |
| target_desc += f"\nDodatkowe informacje: {additional_desc}" | |
| return target_desc | |
| # Test funkcji | |
| if __name__ == "__main__": | |
| print("DeepSeek Client - moduł testowy") | |
| # Tutaj można dodać testy jednostkowe | |