openfree commited on
Commit
13dd292
ยท
verified ยท
1 Parent(s): 491aa2d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +118 -53
app.py CHANGED
@@ -1503,7 +1503,15 @@ Provide specific solutions for each issue."""
1503
  )
1504
 
1505
  if response.status_code != 200:
1506
- yield f"โŒ API Error (Status Code: {response.status_code})"
 
 
 
 
 
 
 
 
1507
  return
1508
 
1509
  buffer = ""
@@ -1516,32 +1524,49 @@ Provide specific solutions for each issue."""
1516
  if not line_str.startswith("data: "):
1517
  continue
1518
 
1519
- data_str = line_str[6:]
1520
  if data_str == "[DONE]":
1521
  break
1522
 
1523
- data = json.loads(data_str)
1524
- choices = data.get("choices", [])
1525
- if choices and choices[0].get("delta", {}).get("content"):
1526
- content = choices[0]["delta"]["content"]
1527
- buffer += content
1528
-
1529
- if len(buffer) >= 50 or '\n' in buffer:
1530
- yield buffer
1531
- buffer = ""
1532
- time.sleep(0.01)
 
 
 
 
 
 
 
 
 
 
 
1533
 
1534
  except Exception as e:
1535
- logger.error(f"Chunk processing error: {str(e)}")
1536
  continue
1537
 
 
1538
  if buffer:
1539
  yield buffer
1540
 
 
 
 
1541
  except Exception as e:
1542
  logger.error(f"Streaming error: {type(e).__name__}: {str(e)}")
1543
  yield f"โŒ Error occurred: {str(e)}"
1544
 
 
 
1545
  def get_system_prompts(self, language: str) -> Dict[str, str]:
1546
  """Role-specific system prompts"""
1547
 
@@ -1903,22 +1928,29 @@ You provide feedback that's critical yet encouraging."""
1903
 
1904
  # --- Utility functions ---
1905
  def generate_random_screenplay_theme(screenplay_type: str, genre: str, language: str) -> str:
1906
- """Generate random screenplay theme"""
1907
- try:
1908
- # Load themes data
1909
- themes_data = load_screenplay_themes_data()
1910
-
1911
- # Select random elements
1912
- import secrets
1913
- situation = secrets.choice(themes_data['situations'].get(genre, themes_data['situations']['drama']))
1914
- protagonist = secrets.choice(themes_data['protagonists'].get(genre, themes_data['protagonists']['drama']))
1915
- conflict = secrets.choice(themes_data['conflicts'].get(genre, themes_data['conflicts']['drama']))
1916
-
1917
- # Generate theme using LLM
1918
- system = ScreenplayGenerationSystem()
1919
-
1920
- if language == "Korean":
1921
- prompt = f"""๋‹ค์Œ ์š”์†Œ๋“ค๋กœ {screenplay_type}์šฉ ๋งค๋ ฅ์ ์ธ ์ปจ์…‰์„ ์ƒ์„ฑํ•˜์„ธ์š”:
 
 
 
 
 
 
 
1922
 
1923
  ์ƒํ™ฉ: {situation}
1924
  ์ฃผ์ธ๊ณต: {protagonist}
@@ -1934,8 +1966,8 @@ def generate_random_screenplay_theme(screenplay_type: str, genre: str, language:
1934
  **์ปจ์…‰:** [์ฃผ์ธ๊ณต]์ด(๊ฐ€) [์ƒํ™ฉ]์—์„œ [๊ฐˆ๋“ฑ]์„ ๊ฒช์œผ๋ฉฐ [๋ชฉํ‘œ]๋ฅผ ์ถ”๊ตฌํ•˜๋Š” ์ด์•ผ๊ธฐ.
1935
 
1936
  **๋…ํŠนํ•œ ์š”์†Œ:** [์ด ์ด์•ผ๊ธฐ๋งŒ์˜ ํŠน๋ณ„ํ•œ ์ ]"""
1937
- else:
1938
- prompt = f"""Generate an attractive concept for {screenplay_type} using these elements:
1939
 
1940
  Situation: {situation}
1941
  Protagonist: {protagonist}
@@ -1952,28 +1984,61 @@ Format as:
1952
 
1953
  **Unique Element:** [What makes this story special]"""
1954
 
1955
- messages = [{"role": "user", "content": prompt}]
1956
- generated_theme = system.call_llm_sync(messages, "producer", language)
1957
-
1958
- # Extract metadata
1959
- metadata = {
1960
- 'title': extract_title_from_theme(generated_theme),
1961
- 'logline': extract_logline_from_theme(generated_theme),
1962
- 'protagonist': protagonist,
1963
- 'conflict': conflict,
1964
- 'tags': [genre, screenplay_type]
1965
- }
1966
-
1967
- # Save to database
1968
- theme_id = ScreenplayDatabase.save_random_theme(
1969
- generated_theme, screenplay_type, genre, language, metadata
1970
- )
1971
-
1972
- return generated_theme
1973
-
1974
- except Exception as e:
1975
- logger.error(f"Theme generation error: {str(e)}")
1976
- return f"Error generating theme: {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1977
 
1978
  def load_screenplay_themes_data() -> Dict:
1979
  """Load screenplay themes data"""
 
1503
  )
1504
 
1505
  if response.status_code != 200:
1506
+ error_msg = f"API Error (Status Code: {response.status_code})"
1507
+ try:
1508
+ error_data = response.json()
1509
+ if isinstance(error_data, dict) and 'error' in error_data:
1510
+ error_msg += f" - {error_data['error']}"
1511
+ except:
1512
+ error_msg += f" - {response.text}"
1513
+ logger.error(error_msg)
1514
+ yield f"โŒ {error_msg}"
1515
  return
1516
 
1517
  buffer = ""
 
1524
  if not line_str.startswith("data: "):
1525
  continue
1526
 
1527
+ data_str = line_str[6:] # Remove "data: " prefix
1528
  if data_str == "[DONE]":
1529
  break
1530
 
1531
+ # Parse JSON data
1532
+ try:
1533
+ data = json.loads(data_str)
1534
+ except json.JSONDecodeError as e:
1535
+ logger.warning(f"JSON decode error: {e}, data: {data_str}")
1536
+ continue
1537
+
1538
+ # Safely check for content
1539
+ if data and isinstance(data, dict):
1540
+ choices = data.get("choices", [])
1541
+ if choices and len(choices) > 0:
1542
+ delta = choices[0].get("delta", {})
1543
+ if delta and isinstance(delta, dict):
1544
+ content = delta.get("content", "")
1545
+ if content:
1546
+ buffer += content
1547
+
1548
+ if len(buffer) >= 50 or '\n' in buffer:
1549
+ yield buffer
1550
+ buffer = ""
1551
+ time.sleep(0.01)
1552
 
1553
  except Exception as e:
1554
+ logger.error(f"Chunk processing error: {str(e)}, line: {line_str[:100]}")
1555
  continue
1556
 
1557
+ # Yield any remaining buffer content
1558
  if buffer:
1559
  yield buffer
1560
 
1561
+ except requests.exceptions.RequestException as e:
1562
+ logger.error(f"Request error: {type(e).__name__}: {str(e)}")
1563
+ yield f"โŒ Network error: {str(e)}"
1564
  except Exception as e:
1565
  logger.error(f"Streaming error: {type(e).__name__}: {str(e)}")
1566
  yield f"โŒ Error occurred: {str(e)}"
1567
 
1568
+
1569
+
1570
  def get_system_prompts(self, language: str) -> Dict[str, str]:
1571
  """Role-specific system prompts"""
1572
 
 
1928
 
1929
  # --- Utility functions ---
1930
  def generate_random_screenplay_theme(screenplay_type: str, genre: str, language: str) -> str:
1931
+ """Generate random screenplay theme"""
1932
+ try:
1933
+ # Load themes data
1934
+ themes_data = load_screenplay_themes_data()
1935
+
1936
+ # Select random elements
1937
+ import secrets
1938
+ situations = themes_data['situations'].get(genre, themes_data['situations']['drama'])
1939
+ protagonists = themes_data['protagonists'].get(genre, themes_data['protagonists']['drama'])
1940
+ conflicts = themes_data['conflicts'].get(genre, themes_data['conflicts']['drama'])
1941
+
1942
+ if not situations or not protagonists or not conflicts:
1943
+ return f"Error: No theme data available for genre {genre}"
1944
+
1945
+ situation = secrets.choice(situations)
1946
+ protagonist = secrets.choice(protagonists)
1947
+ conflict = secrets.choice(conflicts)
1948
+
1949
+ # Generate theme using LLM
1950
+ system = ScreenplayGenerationSystem()
1951
+
1952
+ if language == "Korean":
1953
+ prompt = f"""๋‹ค์Œ ์š”์†Œ๋“ค๋กœ {screenplay_type}์šฉ ๋งค๋ ฅ์ ์ธ ์ปจ์…‰์„ ์ƒ์„ฑํ•˜์„ธ์š”:
1954
 
1955
  ์ƒํ™ฉ: {situation}
1956
  ์ฃผ์ธ๊ณต: {protagonist}
 
1966
  **์ปจ์…‰:** [์ฃผ์ธ๊ณต]์ด(๊ฐ€) [์ƒํ™ฉ]์—์„œ [๊ฐˆ๋“ฑ]์„ ๊ฒช์œผ๋ฉฐ [๋ชฉํ‘œ]๋ฅผ ์ถ”๊ตฌํ•˜๋Š” ์ด์•ผ๊ธฐ.
1967
 
1968
  **๋…ํŠนํ•œ ์š”์†Œ:** [์ด ์ด์•ผ๊ธฐ๋งŒ์˜ ํŠน๋ณ„ํ•œ ์ ]"""
1969
+ else:
1970
+ prompt = f"""Generate an attractive concept for {screenplay_type} using these elements:
1971
 
1972
  Situation: {situation}
1973
  Protagonist: {protagonist}
 
1984
 
1985
  **Unique Element:** [What makes this story special]"""
1986
 
1987
+ messages = [{"role": "user", "content": prompt}]
1988
+
1989
+ # Call LLM with error handling
1990
+ try:
1991
+ generated_theme = system.call_llm_sync(messages, "producer", language)
1992
+
1993
+ # Check if we got an error response
1994
+ if generated_theme.startswith("โŒ"):
1995
+ logger.error(f"LLM error: {generated_theme}")
1996
+ # Return a fallback theme
1997
+ return get_fallback_theme(screenplay_type, genre, language, situation, protagonist, conflict)
1998
+
1999
+ # Extract metadata
2000
+ metadata = {
2001
+ 'title': extract_title_from_theme(generated_theme),
2002
+ 'logline': extract_logline_from_theme(generated_theme),
2003
+ 'protagonist': protagonist,
2004
+ 'conflict': conflict,
2005
+ 'tags': [genre, screenplay_type]
2006
+ }
2007
+
2008
+ # Save to database
2009
+ theme_id = ScreenplayDatabase.save_random_theme(
2010
+ generated_theme, screenplay_type, genre, language, metadata
2011
+ )
2012
+
2013
+ return generated_theme
2014
+
2015
+ except Exception as e:
2016
+ logger.error(f"LLM call failed: {e}")
2017
+ return get_fallback_theme(screenplay_type, genre, language, situation, protagonist, conflict)
2018
+
2019
+ except Exception as e:
2020
+ logger.error(f"Theme generation error: {str(e)}")
2021
+ return f"Error generating theme: {str(e)}"
2022
+
2023
+ def get_fallback_theme(screenplay_type: str, genre: str, language: str,
2024
+ situation: str, protagonist: str, conflict: str) -> str:
2025
+ """Generate fallback theme without LLM"""
2026
+ if language == "Korean":
2027
+ return f"""**์ œ๋ชฉ:** {protagonist}์˜ ์„ ํƒ
2028
+
2029
+ **๋กœ๊ทธ๋ผ์ธ:** {situation}์— ๊ฐ‡ํžŒ {protagonist}๊ฐ€ {conflict}์— ๋งž์„œ๋ฉฐ ์ƒ์กด์„ ์œ„ํ•ด ์‹ธ์šด๋‹ค.
2030
+
2031
+ **์ปจ์…‰:** {protagonist}๊ฐ€ {situation}์—์„œ {conflict}์„ ๊ฒช์œผ๋ฉฐ ์ž์‹ ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๋Š” ์ด์•ผ๊ธฐ.
2032
+
2033
+ **๋…ํŠนํ•œ ์š”์†Œ:** {genre} ์žฅ๋ฅด์˜ ์ „ํ†ต์  ์š”์†Œ๋ฅผ ํ˜„๋Œ€์ ์œผ๋กœ ์žฌํ•ด์„ํ•œ ์ž‘ํ’ˆ."""
2034
+ else:
2035
+ return f"""**Title:** The {protagonist.title()}'s Choice
2036
+
2037
+ **Logline:** When trapped in {situation}, a {protagonist} must face {conflict} to survive.
2038
+
2039
+ **Concept:** A story about a {protagonist} who faces {conflict} in {situation} while discovering their true strength.
2040
+
2041
+ **Unique Element:** A fresh take on {genre} genre conventions with contemporary relevance."""
2042
 
2043
  def load_screenplay_themes_data() -> Dict:
2044
  """Load screenplay themes data"""