Spaces:
Sleeping
Sleeping
""" | |
Analysis tools for understanding and interpreting song lyrics. | |
""" | |
import os | |
from loguru import logger | |
from smolagents import Tool | |
import json | |
from typing import Dict | |
from config import get_model_id | |
from api_utils import make_api_call_with_retry | |
class AnalyzeLyricsTool(Tool): | |
"""Tool for analyzing song lyrics""" | |
name = "analyze_lyrics" | |
description = "Analyzes song lyrics, given its text as a string, and returns a detailed analysis" | |
inputs = { | |
"song_title": {"type": "string", "description": "Title of the song"}, | |
"artist": {"type": "string", "description": "Name of the artist"}, | |
"lyrics": {"type": "string", "description": "Lyrics of the song"} | |
} | |
output_type = "string" | |
def __init__(self, model_id=None): | |
super().__init__() | |
self.model_id = get_model_id(provider='openrouter') | |
def forward(self, song_title: str, artist: str, lyrics: str) -> str: | |
""" | |
Performs a deep analysis of the given lyrics and artist metadata. | |
Args: | |
song_title: Title of the song or music track. | |
artist: The name of the artist. | |
lyrics: The lyrics of the song. | |
format_output: Whether to format the output using rich formatting (default: True). | |
Returns: | |
A formatted full lyrics analysis and meaning in English. | |
""" | |
prompt = f"""You are an expert in songs and their meanings. | |
Analyze the song "{song_title}" by {artist}. Return a structured JSON with the following information: | |
1. Overall analysis of the song including themes, mood, meaning, and context. | |
2. Section-by-section meaning analysis of each part of the song (verses, chorus, bridge, etc.). | |
4. A conclusion about the vibes and concepts of the underlying meaning of the song. Try to get deeper into the meaning of the song if the text has the potential. | |
Format your response as a valid JSON object with the following structure: | |
``` | |
{{ | |
"summary": "Overall analysis of the song vibes, meaning and mood", | |
"main_themes": ["theme1", "theme2", ...], | |
"mood": "The overall mood/emotion of the song", | |
"sections_analysis": [ | |
{{ | |
"section_type": "verse/chorus/bridge/etc.", | |
"section_number": 1, | |
"lines": ["line1", "line2", ...], | |
"analysis": "Analysis of this section whith respect to the overall theme" | |
}}, | |
... | |
], | |
"conclusion": "The song vibes and concepts of the underlying meaning, including ideas author may have intended to express" | |
}} | |
``` | |
Make sure your response is a properly formatted JSON. Only provide the JSON object, no other text. | |
Here are the lyrics to analyze: | |
{lyrics} | |
""" | |
model_to_use = self.model_id | |
logger.info("Using {} for lyrics analysis", model_to_use) | |
# Use the function with retry mechanism | |
logger.info("Analyzing lyrics for song: '{}' by '{}'", song_title, artist) | |
response_text = make_api_call_with_retry(model_to_use, prompt) | |
# Parse the string response into a JSON object (dictionary) | |
logger.debug(f"Parsing JSON response for {song_title}") | |
response_json = json.loads(response_text) | |
return response_json | |