#!/usr/bin/env python3 """ Model Comparison Simulator ========================== Simulates conversations with different Gemini models for comparison. Usage: python scripts/simulate_model_comparison.py Author: Maciej Pienczyn, InPi sp. z o.o. Created: 2026-01-29 """ import os import sys import json from datetime import datetime # Add parent directory to path for imports sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from dotenv import load_dotenv load_dotenv() from database import SessionLocal, AIChatConversation, AIChatMessage, User from nordabiz_chat import NordaBizChatEngine # Questions to compare (from Artur's and Maciej's conversations) COMPARISON_QUESTIONS = { 'artur': { 'user_id': 3, 'user_name': 'Artur Wiertel', 'original_conversation_id': 63, 'questions': [ { 'id': 1, 'question': 'ilu członków ma izba norda?', 'type': 'simple', 'original_answer': 'Izba Norda Biznes zrzesza obecnie 111 firm.' }, { 'id': 2, 'question': 'czy w izbie są osoby gotowe do współpracy przy wspólnych projektach inwestycyjnych?', 'type': 'complex', 'original_answer': 'W Norda Biznes posiadamy firmy otwarte na współpracę przy projektach inwestycyjnych. Szczególnie interesujące mogą być podmioty z kategorii Budownictwo, Nieruchomości oraz Usługi Biznesowe. Czy szukasz konkretnego rodzaju partnera lub projektu?' }, { 'id': 3, 'question': 'Mam pomysł i projekt ciekawego przedsięwzięcia inwestycyjnego - budowa nieruchomości komercyjnej. Szukam partnerów - 3 osoby, wkład na poziomie 1,5 mln netto', 'type': 'business', 'original_answer': 'Poszukujesz partnerów do inwestycji w nieruchomość komercyjną. W naszej bazie znajdują się firmy, które mogą być zainteresowane takim przedsięwzięciem. Warto zwrócić uwagę na: ARD Invest, Progress Optima...' }, { 'id': 4, 'question': 'a co sądzisz o firmie sigma?', 'type': 'company', 'original_answer': 'Firma Sigma Budownictwo to generalny wykonawca robót budowlanych, który ma na swoim koncie portfolio ponad 250 tys. m² powierzchni użytkowej, w tym hale przemysłowe. Jest to rodzinna firma z Wejherowa, zarządzana przez Romana i Tomasza Wiercińskich.' }, { 'id': 5, 'question': 'co myślisz o pomysłach Jacka Pomieczyńskiego na forum?', 'type': 'analysis', 'original_answer': 'Chętnie pomogę! Aby odpowiedzieć na Twoje pytanie o pomysły Jacka Pomieczyńskiego, potrzebuję więcej informacji. Czy możesz sprecyzować, o jakie konkretnie pomysły chodzi?' } ] }, 'maciej': { 'user_id': 1, 'user_name': 'Maciej Pienczyn', 'original_conversation_id': 62, 'questions': [ { 'id': 1, 'question': 'Kto jest prezesem PIXLAB?', 'type': 'simple', 'original_answer': 'Prezesem firmy Pixlab Softwarehouse jest Michał Bogdan Roszman.' }, { 'id': 2, 'question': 'jakie znasz inne firmy IT w Norda?', 'type': 'listing', 'original_answer': 'W Norda Biznes działa kilka firm z branży IT i Telekomunikacja. Są to między innymi VENCODE, oferujące dedykowane aplikacje oparte na sztucznej inteligencji i technologii blockchain, oraz Delkom, specjalizujący się w usługach IT, cyberbezpieczeństwie i doradztwie informatycznym.' }, { 'id': 3, 'question': 'podaj osoby kontaktowe - będę budował sieć komputerową', 'type': 'contact', 'original_answer': 'Wśród firm z branży IT i telekomunikacja, które mogą pomóc w budowie sieci komputerowej, znajdują się: Chopin Telewizja Kablowa: Operator telekomunikacyjny...' } ] } } def run_simulation(): """Run model comparison simulation.""" print("=" * 60) print("MODEL COMPARISON SIMULATION") print(f"New model: gemini-3-flash-preview") print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M')}") print("=" * 60) # Initialize chat engine (uses new model from app config) try: chat_engine = NordaBizChatEngine() print(f"✓ Chat engine initialized with model: {chat_engine.gemini_service.model_name}") except Exception as e: print(f"✗ Failed to initialize chat engine: {e}") return None results = {} for user_key, user_data in COMPARISON_QUESTIONS.items(): print(f"\n--- {user_data['user_name']} ---") results[user_key] = { 'user_id': user_data['user_id'], 'user_name': user_data['user_name'], 'original_conversation_id': user_data['original_conversation_id'], 'comparisons': [] } for q in user_data['questions']: print(f"\nQ{q['id']}: {q['question'][:50]}...") try: # Get response from new model response = chat_engine.chat( user_message=q['question'], user_id=user_data['user_id'], conversation_id=None, # New conversation context save_to_db=False # Don't save simulation ) new_answer = response.get('response', 'Brak odpowiedzi') print(f" ✓ Got response ({len(new_answer)} chars)") except Exception as e: new_answer = f"Error: {str(e)}" print(f" ✗ Error: {e}") results[user_key]['comparisons'].append({ 'question_id': q['id'], 'question': q['question'], 'type': q['type'], 'old_model': 'gemini-2.5-flash-lite', 'old_answer': q['original_answer'], 'new_model': 'gemini-3-flash-preview', 'new_answer': new_answer }) # Save results to JSON output_file = os.path.join( os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'data', 'model_comparison_results.json' ) os.makedirs(os.path.dirname(output_file), exist_ok=True) with open(output_file, 'w', encoding='utf-8') as f: json.dump({ 'generated_at': datetime.now().isoformat(), 'old_model': 'gemini-2.5-flash-lite', 'new_model': 'gemini-3-flash-preview', 'results': results }, f, ensure_ascii=False, indent=2) print(f"\n✓ Results saved to: {output_file}") return results if __name__ == '__main__': run_simulation()