About BeatBuddy

🎮 Inspiration

VALORANT has always been more than just a game to me—it’s a mental battleground that sharpens decision-making and strategic thinking in real-time. Watching how fast-paced gameplay can enhance cognitive skills inspired me to blend my passion for data science and computer science. This hackathon was the perfect arena to channel that enthusiasm, transforming a personal love for the game into a tangible tool. BeatBuddy is the culmination of that passion—a strategic companion born from the desire to innovate and elevate the VALORANT experience for players of all levels.

🚀 What It Does

BeatBuddy is your all-in-one VALORANT strategy companion, designed to empower players with the tools they need to succeed. Whether you’re building fantasy teams, analyzing strategies, or diving deep into player stats, BeatBuddy has you covered with features that cater to every skill level:

  • Fantasy Team Building: Craft custom teams based on comprehensive player stats, roles, and performance metrics.
  • Strategy Analysis: Gain insights into team compositions, role effectiveness, and map-specific tactics.
  • Player Insights: Dive into detailed player statistics, win rates, and damage metrics to make informed decisions.
  • Dynamic Conversations: Engage in interactive dialogues where BeatBuddy understands and responds to your queries with contextually relevant information.
  • Advanced Simulations: Experiment with strategic combinations and refine complex tactics to master the game.

BeatBuddy isn’t just about winning games—it’s about learning, evolving, and mastering the art of VALORANT.

🛠️ How I Built It

Building BeatBuddy was a journey of innovation and technical exploration. Here’s how it all came together:

  1. Data Preprocessing: Using Python, I transformed raw VALORANT datasets into a structured database focused on player stats, role scores, and custom class scores. This foundation was crucial for enabling BeatBuddy’s fantasy team-building and strategy features. This process involved running various Python scripts over the course of several days, systematically going through each match’s data and updating statistics for every player involved in that match.

    Database Link: Click Here

    Sample entry from the database:

    Unique Player ID,Display Name,First Name,Last Name,Status,League,Team,Region,Matches,Registered Kills,Registered Deaths,Registered Assists,Registered KD Ratio,Assists,Total Damage,Average Damage Per Match,Shots Hit,Total Headshots,Headshot Percentage,Registered Wins,Registered Matches,Registered Win Rate,IGL Score,Match Data Available,Weapon Kills,Maps Played,Maps Won,Maps Lost,Agent Stats,Agent on Maps,Agent Wins,Agent Losses,Controller Score,Initiator Score,Sentinel Score,Duelist Score,Deadeye Score,Enforcer Score,Infiltrator Score,Fortress Score,Sharpshooter Score,Guardian Score,Conduit Score,Juggernaut Score,Trailblazer Score,Chameleon Score,Astra,Breach,Brimstone,Chamber,Clove,Cypher,Deadlock,Fade,Gekko,Harbor,Iso,Jett,Kayo,Killjoy,Neon,Omen,Phoenix,Raze,Reyna,Sage,Skye,Sova,Viper,Yoru,Overall Score,Big League,Stat Facts
    106116440965658227,aspas,Erick,Marmo,active,champions,LOUD (LOUD),vct-international,182,3176,2419,636,1.312939231,677,481554.9951,2645.906566,9050,2316,25.59116022,107,170,62.94117647,,Yes,"[0, 0, 0, 1093, 21, 588, 7, 0, 80, 24, 80, 207, 21, 406, 119, 25, 47, 37, 80]","[14, 19, 18, 25, 7, 11, 12, 28, 19, 13, 4]","[12, 11, 10, 19, 4, 6, 6, 18, 10, 8, 3]",,"[[0, 0, 0], [0, 0, 0], [0, 0, 0], [33, 34, 7], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [1883, 1352, 319], [0, 0, 0], [0, 0, 0], [324, 263, 101], [0, 0, 0], [13, 15, 5], [898, 741, 195], [25, 14, 9], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]","[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0], [0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 5, 0, 0, 2, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 14, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 1, 5, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]","[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 11, 0, 0, 28, 1, 0, 0, 0, 0, 0]",,38,38,36,92,79.25,73.57,44.04,54.28,100.0,36.54,37.88,88.05,41.1,78.24,33,33,33,65,33,24,24,33,33,33,33,100,33,24,100,33,73,100,100,24,33,33,33,33,100.0,,"Top 50 highest ranked player worldwide\nTop 25 Chamber player in Vct International\nTop 25 Clove player in Vct International\nTop 25 Deadlock player in Vct International\nTop 25 Iso player in Vct International\nTop 25 Jett player worldwide\nTop 10 Neon player worldwide\nTop 10 Phoenix player in Vct International\nTop 25 Raze player worldwide\nTop 5 Reyna player worldwide\nTop 50 Yoru player in Vct International\nTop 5 Duelist player worldwide\nTop 10 most accurate player in Vct International\nTop 1 sniper player worldwide\nTop 50 flex player worldwide"
    
    
  2. NLP Task Matching: The backend process starts here, with a vectorized embeddings-based system that interprets user prompts. Task matching in BeatBuddy leverages custom NLP processing to extract relevant filters and match user intent, ensuring accurate response generation by aligning user queries with specific game-related tasks.

    Sample JSON for Prompt Registration:

    {
      "PromptID": 14,
      "UserID": "testuser",
      "PageID": 5,
      "CreatedAt": "2024-11-05 06:29:09.358803",
      "Prompt": "Build a team that includes at least two players from an underrepresented group, such as the Game Changers program. It should include tenz and zekken. Define roles and discuss the advantages of this inclusive team structure.",
      "TaskMatched": "build_team",
      "ThreadOpen": true
    }
    

    Sample JSON for NLP Result:

    {
      "matched_task": "build_team",
      "similarity": 0.860281765460968,
      "filters": {
        "players": ["106229920360816436", "106525416849604559"],
        "regions": ["vct-international", "vct-challengers", "game-changers"],
        "stats": []
      }
    }
    
  3. Data Fetching: The filters obtained from the NLP result are used to filter the data relevant to the specific task. Each task has its own data filter logic and method for applying these filters. The filtered data is then integrated into a custom context tailored for each type of task, ensuring high accuracy and relevance in the results. This meticulous approach guarantees the best possible outcomes, as shown in the image below.

    Strategy Building Context

  4. AWS Integration: BeatBuddy leverages AWS App Runner for backend hosting and ultimately uses Claude 3.5 Sonnet, a powerful language model that enables accurate responses, in-depth strategy analysis, and seamless conversational interactions. "But why Claude 3.5? It is such an overkill!" While it may appear excessive, I selected Claude 3.5 Sonnet for its robustness and versatility, ensuring BeatBuddy can handle complex user prompts and perform strategic calculations effectively, making it adaptable for future developments. The LLM is configured to return parts of the data in a specific format that is then parsed on the frontend as table data.

    Sample response from Claude 3.5:

    [Team Start]
    Unique Player ID,Display Name,First Name,Last Name,Agent,Role,IGL,Sniper
    106116440965658227,aspas,Erick,Marmo,Jett,Duelist,No,Yes
    106525416849604559,zekken,Zachary,Patrone,Skye,Initiator,No,No
    107760831992553421,Kadoom,Kantapong,Kingthong,Brimstone,Controller,Yes,No
    106230236294103708,ScreaM,Adil,Benrlitom,Phoenix,Duelist,No,No
    106651793396690606,Sayf,Saif,Jibraeel,Chamber,Sentinel,No,No
    [Team End]
    [Team Score Start]
    89/100
    [Team Score End]
    
    Team Synergy:
    This team composition brings together a mix of aggressive and tactical playstyles, combining
    some of the most skilled players from the VCT International scene. The lineup features strong
    individual performers who also have the potential to work well as a cohesive unit.
    
    Attack Strategy:
    On attack, this team can execute fast-paced site takes led by aspas on Jett and ScreaM on
    Phoenix. Their aggressive entry potential is supported by zekken's Skye, who can gather crucial
    information and set up plays with flashes. Kadoom on Brimstone provides essential smoke
    coverage and post-plant molly lineups, while Sayf on Chamber offers both offensive firepower
    and the ability to watch flanks with his Trademark ability.
    
    The dual Duelist setup allows for explosive site entries, with Skye's flashes and Brimstone's
    smokes creating space. Chamber can either support the push or hold angles for potential retakes.
    The team can also split push effectively, using Chamber's teleport and Jett's mobility to create
    quick rotations.
    
    Defense Strategy:
    On defense, this composition allows for a strong site hold and retake potential. Sayf's
    Chamber can hold long angles with the Operator, supported by Brimstone's smokes to deny
    enemy vision. ScreaM and aspas can play aggressively on their respective sites, using their
    mobility to take off-angles and fall back. Zekken's Skye provides valuable information gathering
    and can delay pushes with her utility.
    
    Kadoom, as the IGL on Brimstone, can coordinate the team's rotations and use the global
    smoke ability to support either site quickly. The team's retake potential is strong, with multiple
    flashes from Skye and Phoenix, combined with Jett and Chamber's ability to quickly reposition.
    
    Map Example (Haven):
    On Haven, the team could set up with aspas (Jett) and ScreaM (Phoenix) taking aggressive
    positions on A and C sites respectively. Sayf (Chamber) could hold B site with an Operator, while
    zekken (Skye) plays a flex role, ready to support either site. Kadoom (Brimstone) would play from
    a central position, ready to smoke for retakes or site executes.
    
    For an A site execute, Kadoom could smoke Heaven and A Link. Zekken would Trailblaze into
    site, followed by a Curveball from ScreaM. Aspas would then dash in, supported by Sayf holding
    long angles from B. This coordinated push utilizes each agent's strengths and creates multiple
    points of pressure for the defenders to deal with.
    
    Overall, this team composition offers a balance of aggressive play-making potential and
    tactical utility usage. The mix of experienced veterans and young talents provides a dynamic
    that could be very effective in competitive play. Kadoom's high Controller score makes them
    well-suited for the IGL role, coordinating the team's strategies and adapting mid-round. With
    aspas as a primary Operator user and the flexibility of agents like Skye and Phoenix, this team
    has the tools to handle various situations and opponents.
    
  5. Frontend and Backend Development: Utilizing Flask for the backend and Next.js for the frontend, I crafted a modular, interactive architecture that supports dynamic user interactions and efficient data management. The language model is configured to return data in a structured format, using markers like [Team Start] and [Team End] to designate specific sections of information. On the frontend, this data is parsed into a table format, with IDs embedded within the dataset used to fetch and enrich the displayed results. This additional data enhances the user experience, offering a more comprehensive and detailed view of player and team insights, as illustrated in the image below.

    Parsed Table

    Player Info Box

Some Fun Prompts to Try:

  • "Build a team that includes at least two players from an underrepresented group, such as the Game Changers program. Define roles and discuss the advantages of this inclusive team structure."
  • "Assign team roles including 2 duelists, 1 controller, and 2 initiators or 2 sentinels, one of the two, to the team of tenz, aspas, f0rsaken, scream, something."
  • "Calculate the effectiveness of this team comp on the map Bind: breach, jett, raze, omen, brimstone."
  • "Analyze the team of Miku, rukia, zekken, fNs, fluxxy and prepare a list of their strengths."
  • "Give me a good team comp for the map Split."
  • "How well would demon1 play a duelist role?"

🧩 Challenges Faced

The road to creating BeatBuddy was not without its hurdles. The most significant challenge was when my initial team decided to step away halfway through the hackathon, leaving me to navigate the project solo. Balancing creativity with practical functionality required innovative problem-solving and relentless dedication. Additionally, integrating advanced NLP capabilities while maintaining efficient performance demanded meticulous planning and execution. Despite these setbacks, overcoming these obstacles strengthened my technical skills and resilience.

What Would We Do If We Didn’t Have Throttling Issues

I've recently been facing throttling limitations on the AWS Claude 3.5 bot, which has restricted my ability to test follow-up prompts. Although I’m confident that the follow-up prompts should work according to the thread open/close functionality designed for this project, testing and improving is always beneficial, but I haven't been able to utilize that opportunity fully. The thread functionality enables the NLP to recognize follow-up prompts, allowing it to pass the previous context in a specific format along with the new context, but only within the specific thread tied to that follow-up timeline. When a new task is recognized, the current thread is closed, and a new one begins.

🏆 Accomplishments

Completing BeatBuddy on my own was a proud achievement, especially while balancing multiple responsibilities as a junior student with various projects and part-time jobs. What makes this even more meaningful is that I’ve never taken any formal machine learning or database programming courses. Every technique, from data analysis to integrating machine learning and NLP for intent recognition, comes from self-taught practical methods and hands-on experience. This journey has been a true testament to the power of independent learning and dedication to problem-solving. BeatBuddy stands out as a unique tool that I’m incredibly proud to present, showcasing the potential of AI-driven gaming tools.

📚 What I Learned

Building BeatBuddy was an invaluable learning experience, offering insights into full-stack development, advanced data preprocessing, and integrating large language models to support VALORANT team composition. I delved into machine learning concepts crucial for analyzing player statistics, intent recognition, and task matching, enhancing my understanding of NLP and model-driven decision-making.

Using AWS services to create a scalable and efficient application, I learned the intricacies of managing cloud-based deployments, which elevated my backend proficiency. Beyond the technical gains, BeatBuddy sharpened my problem-solving skills and adaptability, especially when facing unexpected challenges. This project reinforced my passion for data science and AI, fueling my drive to create impactful, data-driven solutions in gaming and beyond.

🌟 What's Next for BeatBuddy

The journey doesn’t end here—BeatBuddy is poised to evolve and grow. Future enhancements include:

  • Real-time Data Updates: Keeping insights aligned with the latest VALORANT meta.
  • Advanced Performance Tracking: Providing deeper insights into individual gameplay metrics.
  • Enhanced Team Composition Analysis: Refining algorithms to suggest even more optimized teams based on current data trends.

BeatBuddy is here to stay, helping everyone from Silvers to Immortals. Whether you’re learning new strategies, exploring fantasy team setups, or mastering advanced gameplay techniques, BeatBuddy aims to be the go-to tool for all VALORANT enthusiasts.

Share this project:

Updates