Spaces:
No application file
No application file
| from openai import OpenAI | |
| import base64 | |
| from model_player import Player | |
| import json | |
| client = OpenAI() | |
| def get_ai_response(prompt): | |
| response = client.responses.create( | |
| model="gpt-4o", | |
| input=prompt | |
| ) | |
| return response.output_text | |
| def player_to_dict(player): | |
| return { | |
| "name": player.name, | |
| "position": player.position, | |
| "shirt_number": player.shirt_number, | |
| "preferred_foot": player.preferred_foot, | |
| "role": player.role, | |
| "form": player.form, | |
| } | |
| prompt = """ | |
| You are simulating a fictional soccer match and creating a realistic event timeline from kickoff to final whistle. | |
| Here is the match context: | |
| - Match type: {match_type} | |
| - Location: {location} | |
| - Date: {date} | |
| - Home team: {home_team} | |
| - Away team: {away_team} | |
| - Winner: {winner} | |
| - Score: {score} | |
| Here is the {home_team} roster: | |
| {home_roster} | |
| Here is the {away_team} roster: | |
| {away_roster} | |
| Rules: | |
| - Spread out events across 90+ minutes | |
| - Substitutions should use players not in the starting 11 if available | |
| - Vary event types and timing | |
| Only return a JSON array of chronological match events, formatted exactly like this example: | |
| [ | |
| {{ | |
| "minute": // string, e.g. 45+2 | |
| "team": // home or away team name | |
| "event": // e.g. Goal, Yellow Card, Substitution, etc. | |
| "player": // name + number | |
| "description": // 1-sentence summary | |
| }} | |
| ] | |
| """ | |
| # # match 1 | |
| # match_type = "semifinal 1" | |
| # location = "El Templo del Sol (fictional stadium in Mérida, Mexico)" | |
| # date = "July 10, 2025" | |
| # home_team = Player.teams[2] | |
| # away_team = Player.teams[3] | |
| # winner = Player.teams[2] | |
| # score = "2–1" | |
| # home_roster = None | |
| # away_roster = None | |
| # match 2 | |
| match_type = "semifinal 2" | |
| location = "Everglade Arena (fictional stadium in Miami, Florida)" | |
| date = "July 11, 2025" | |
| home_team = Player.teams[1] | |
| away_team = Player.teams[0] | |
| winner = Player.teams[1] | |
| score = "3-3 (4-2 pens)" | |
| home_roster = None | |
| away_roster = None | |
| home_players = Player.get_players(team=home_team) | |
| away_players = Player.get_players(team=away_team) | |
| home_roster = [player_to_dict(player) for player in home_players] | |
| away_roster = [player_to_dict(player) for player in away_players] | |
| prompt = prompt.format( | |
| match_type=match_type, | |
| location=location, | |
| date=date, | |
| home_team=home_team, | |
| away_team=away_team, | |
| home_roster=home_roster, | |
| away_roster=away_roster, | |
| winner=winner, | |
| score=score, | |
| ) | |
| # print(prompt) | |
| response = get_ai_response(prompt) | |
| # Parse the AI response as JSON | |
| try: | |
| if response.startswith("```json") and response.endswith("```"): | |
| response = response[7:-3] | |
| events = json.loads(response) | |
| except Exception as e: | |
| print("Error parsing AI response as JSON:", e) | |
| print("Raw response was:\n", response) | |
| raise | |
| # Pretty-print JSON to terminal | |
| print(json.dumps(events, indent=4, sort_keys=True)) | |
| # Write pretty JSON to file | |
| with open(f"/workspace/data/huge-league/games/{match_type.replace(' ', '_')}.json", "w") as f: | |
| json.dump(events, f, indent=4, sort_keys=True) | |
| # Optionally, if you want a more human-readable text format, uncomment below: | |
| # def pretty_print_events(events): | |
| # for event in events: | |
| # print(f"[{event['minute']}] {event['team']} - {event['event']} - {event['player']}: {event['description']}") | |
| # pretty_print_events(events) | |