More improvements.

This commit is contained in:
2026-02-06 11:05:46 -05:00
parent 7e5dbe6f00
commit 848d187f4b
7 changed files with 250 additions and 83 deletions

View File

@@ -52,7 +52,8 @@ def refresh_style_guidelines(model, folder=None):
"""
try:
response = model.generate_content(prompt)
if folder: utils.log_usage(folder, "logic-pro", response.usage_metadata)
model_name = getattr(model, 'name', ai.logic_model_name)
if folder: utils.log_usage(folder, model_name, response.usage_metadata)
new_data = json.loads(utils.clean_json(response.text))
# Validate
@@ -157,7 +158,7 @@ def enrich(bp, folder, context=""):
try:
# Merge AI response with existing data (don't overwrite if user provided specific keys)
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
response_text = response.text
cleaned_json = utils.clean_json(response_text)
ai_data = json.loads(cleaned_json)
@@ -234,7 +235,7 @@ def plan_structure(bp, folder):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
return json.loads(utils.clean_json(response.text))['events']
except:
return []
@@ -268,7 +269,7 @@ def expand(events, pass_num, target_chapters, bp, folder):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
new_events = json.loads(utils.clean_json(response.text))['events']
if len(new_events) > len(events):
@@ -318,7 +319,7 @@ def create_chapter_plan(events, bp, folder):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
plan = json.loads(utils.clean_json(response.text))
target_str = str(words).lower().replace(',', '').replace('k', '000').replace('+', '').replace(' ', '')
@@ -376,7 +377,7 @@ def update_tracking(folder, chapter_num, chapter_text, current_tracking):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
new_data = json.loads(utils.clean_json(response.text))
return new_data
except Exception as e:
@@ -439,7 +440,8 @@ def evaluate_chapter_quality(text, chapter_title, genre, model, folder):
"""
try:
response = model.generate_content([prompt, text[:30000]])
utils.log_usage(folder, "logic-pro", response.usage_metadata)
model_name = getattr(model, 'name', ai.logic_model_name)
utils.log_usage(folder, model_name, response.usage_metadata)
data = json.loads(utils.clean_json(response.text))
critique_text = data.get('critique', 'No critique provided.')
@@ -483,7 +485,7 @@ def check_pacing(bp, summary, last_chapter_text, last_chapter_data, remaining_ch
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
return json.loads(utils.clean_json(response.text))
except Exception as e:
utils.log("ARCHITECT", f"Pacing check failed: {e}")
@@ -508,7 +510,7 @@ def create_initial_persona(bp, folder):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
return json.loads(utils.clean_json(response.text))
except Exception as e:
utils.log("SYSTEM", f"Persona generation failed: {e}")
@@ -533,7 +535,7 @@ def refine_persona(bp, text, folder):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
new_bio = json.loads(utils.clean_json(response.text)).get('bio')
if new_bio:
ad['bio'] = new_bio
@@ -678,7 +680,7 @@ def write_chapter(chap, bp, folder, prev_sum, tracking=None, prev_content=None):
current_text = ""
try:
resp_draft = ai.model_writer.generate_content(prompt)
utils.log_usage(folder, "writer-flash", resp_draft.usage_metadata)
utils.log_usage(folder, ai.model_writer.name, resp_draft.usage_metadata)
current_text = resp_draft.text
except Exception as e:
utils.log("WRITER", f"⚠️ Failed Ch {chap['chapter_number']}: {e}")
@@ -696,7 +698,7 @@ def write_chapter(chap, bp, folder, prev_sum, tracking=None, prev_content=None):
for attempt in range(1, max_attempts + 1):
utils.log("WRITER", f" -> Evaluating Ch {chap['chapter_number']} (Attempt {attempt}/{max_attempts})...")
score, critique = evaluate_chapter_quality(current_text, chap['title'], meta.get('genre', 'Fiction'), ai.model_logic, folder)
score, critique = evaluate_chapter_quality(current_text, chap['title'], meta.get('genre', 'Fiction'), ai.model_writer, folder)
past_critiques.append(f"Attempt {attempt}: {critique}")
@@ -736,8 +738,8 @@ def write_chapter(chap, bp, folder, prev_sum, tracking=None, prev_content=None):
"""
try:
resp_rewrite = ai.model_writer.generate_content(full_rewrite_prompt)
utils.log_usage(folder, "writer-flash", resp_rewrite.usage_metadata)
resp_rewrite = ai.model_logic.generate_content(full_rewrite_prompt)
utils.log_usage(folder, ai.model_logic.name, resp_rewrite.usage_metadata)
current_text = resp_rewrite.text
continue
except Exception as e:
@@ -787,9 +789,9 @@ def write_chapter(chap, bp, folder, prev_sum, tracking=None, prev_content=None):
OUTPUT: Polished Markdown.
"""
try:
# Use Logic model (Pro) for refinement to ensure higher quality prose
resp_refine = ai.model_logic.generate_content(refine_prompt)
utils.log_usage(folder, "logic-pro", resp_refine.usage_metadata)
# Use Writer model (Flash) for refinement to save costs (Flash 1.5 is sufficient for editing)
resp_refine = ai.model_writer.generate_content(refine_prompt)
utils.log_usage(folder, ai.model_writer.name, resp_refine.usage_metadata)
current_text = resp_refine.text
except Exception as e:
utils.log("WRITER", f"Refinement failed: {e}")
@@ -814,7 +816,7 @@ def harvest_metadata(bp, folder, full_manuscript):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
new_chars = json.loads(utils.clean_json(response.text)).get('new_characters', [])
if new_chars:
valid_chars = filter_characters(new_chars)
@@ -867,7 +869,7 @@ def update_persona_sample(bp, folder):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
bio = response.text.strip()
except: bio = "Style analysis unavailable."
@@ -903,7 +905,7 @@ def refine_bible(bible, instruction, folder):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
new_data = json.loads(utils.clean_json(response.text))
return new_data
except Exception as e:
@@ -939,7 +941,7 @@ def analyze_consistency(bp, manuscript, folder):
"""
try:
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, "logic-pro", response.usage_metadata)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
return json.loads(utils.clean_json(response.text))
except Exception as e:
return {"issues": [f"Analysis failed: {e}"], "score": 0, "summary": "Error during analysis."}
@@ -1034,8 +1036,8 @@ def rewrite_chapter_content(bp, manuscript, chapter_num, instruction, folder):
"""
try:
response = ai.model_writer.generate_content(prompt)
utils.log_usage(folder, "writer-flash", response.usage_metadata)
response = ai.model_logic.generate_content(prompt)
utils.log_usage(folder, ai.model_logic.name, response.usage_metadata)
try:
data = json.loads(utils.clean_json(response.text))
return data.get('content'), data.get('summary')
@@ -1073,6 +1075,7 @@ def check_and_propagate(bp, manuscript, changed_chap_num, folder, change_summary
"""
try:
resp = ai.model_writer.generate_content(change_summary_prompt)
utils.log_usage(folder, ai.model_writer.name, resp.usage_metadata)
current_context = resp.text
except:
current_context = changed_chap.get('content', '')[-2000:] # Fallback
@@ -1133,6 +1136,7 @@ def check_and_propagate(bp, manuscript, changed_chap_num, folder, change_summary
try:
resp = ai.model_logic.generate_content(scan_prompt)
utils.log_usage(folder, ai.model_logic.name, resp.usage_metadata)
potential_impact_chapters = json.loads(utils.clean_json(resp.text))
if not isinstance(potential_impact_chapters, list): potential_impact_chapters = []
# Ensure integers
@@ -1179,6 +1183,7 @@ def check_and_propagate(bp, manuscript, changed_chap_num, folder, change_summary
try:
response = ai.model_writer.generate_content(prompt)
utils.log_usage(folder, ai.model_writer.name, response.usage_metadata)
data = json.loads(utils.clean_json(response.text))
if data.get('status') == 'NO_CHANGE':