Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import gradio as gr | |
import spaces | |
from huggingface_hub import InferenceClient | |
import json | |
# Initialize the Llama 3.3 model client with Cerebras provider | |
import os | |
try: | |
client = InferenceClient( | |
"meta-llama/Llama-3.3-70B-Instruct", | |
provider="cerebras", | |
token=os.getenv("HF_TOKEN"), | |
) | |
except Exception as e: | |
print(f"Error initializing Cerebras client: {e}") | |
# Fallback to default provider | |
client = InferenceClient("meta-llama/Llama-3.3-70B-Instruct") | |
# Turabian-based prompts for each stage | |
TURABIAN_PROMPTS = { | |
"stage_1": """Based on Turabian's method for developing research arguments, analyze this topic and create a commonsense argument with: | |
1. A clear main CLAIM (what you're arguing) | |
2. 2-3 supporting REASONS (why readers should accept your claim) | |
3. Types of EVIDENCE needed (what would support your reasons) | |
4. Present it as everyday conversation logic | |
Make it simple and foundational - this is just the starting point. | |
Topic: {input} | |
Format your response as: | |
CLAIM: [Your main argument] | |
REASON 1: [First supporting reason] | |
REASON 2: [Second supporting reason] | |
REASON 3: [Third reason if needed] | |
EVIDENCE TYPES NEEDED: [What kind of evidence you'd need]""", | |
"stage_2": """Help transition this commonsense argument into a research argument framework suitable for academic writing: | |
1. Identify what needs strengthening for a scholarly audience | |
2. Note areas requiring more formal evidence | |
3. Suggest how to frame this as a cooperative conversation with skeptical but receptive colleagues | |
4. Highlight the gap between commonsense and research-level argumentation | |
Current Commonsense Argument: {input} | |
Format your response with: | |
STRENGTHS TO BUILD ON: [What's already strong] | |
AREAS NEEDING DEVELOPMENT: [What needs more work] | |
ACADEMIC FRAMING: [How to present to scholars] | |
NEXT STEPS: [What to focus on in Stage 3]""", | |
"stage_3a": """Transform this working hypothesis into a specific, supportable academic claim: | |
1. Make it an assertion that clearly demands support | |
2. Ensure it's specific and focused (not too broad) | |
3. Check that you can realistically support it with available evidence | |
4. Make sure it goes beyond obvious or trivial statements | |
Working Hypothesis: {input} | |
Provide: | |
REFINED CLAIM: [Your specific, supportable claim] | |
WHY THIS WORKS: [Why this claim is effective] | |
POTENTIAL CHALLENGES: [What might be difficult to prove] | |
SCOPE NOTES: [What you're including/excluding]""", | |
"stage_3b": """Develop comprehensive reasons and evidence strategy for this claim: | |
1. Generate multiple strong supporting reasons | |
2. Identify primary source evidence needed | |
3. Assess evidence quality, quantity, and type requirements | |
4. Note potential challenges readers might raise about your evidence | |
Claim: {input} | |
Provide: | |
REASON 1: [First major reason] | |
- Evidence needed: [Specific evidence for this reason] | |
REASON 2: [Second major reason] | |
- Evidence needed: [Specific evidence for this reason] | |
REASON 3: [Third reason if applicable] | |
- Evidence needed: [Specific evidence for this reason] | |
PRIMARY SOURCES REQUIRED: [What original sources you need] | |
EVIDENCE QUALITY STANDARDS: [What makes strong evidence here] | |
POTENTIAL EVIDENCE CHALLENGES: [What readers might question]""", | |
"stage_3c": """Anticipate objections and questions from careful, skeptical readers: | |
1. List questions skeptical readers might ask | |
2. Identify internal soundness challenges (evidence quality, reason consistency) | |
3. Identify external soundness challenges (alternative views, exceptions) | |
4. Suggest strong responses to key objections | |
Argument: {input} | |
Provide: | |
READER QUESTIONS: [What will they ask?] | |
INTERNAL CHALLENGES: [Questions about evidence/logic] | |
EXTERNAL CHALLENGES: [Alternative interpretations/views] | |
KEY OBJECTION 1: [Most important objection] | |
- Your Response: [How you'll address it] | |
KEY OBJECTION 2: [Second most important] | |
- Your Response: [How you'll address it] | |
ACKNOWLEDGMENT STRATEGY: [How to show you've considered these]""", | |
"stage_3d": """Identify and articulate the warrants (underlying principles) connecting your reasons to your claim: | |
1. Explain the underlying principles/assumptions | |
2. Create clear When-Then statements | |
3. Check if readers will likely accept these warrants | |
4. Note any limiting conditions | |
Reason: {reason} | |
Claim: {claim} | |
Provide: | |
UNDERLYING PRINCIPLE: [The basic assumption connecting reason to claim] | |
WHEN-THEN STATEMENT: [When X, then Y format] | |
WARRANT ACCEPTABILITY: [Will readers accept this principle?] | |
POTENTIAL WARRANT CHALLENGES: [What if readers question the principle?] | |
LIMITING CONDITIONS: [When might this warrant not apply?] | |
MAKING IT EXPLICIT: [How to clearly state this in your argument]""", | |
"stage_4a": """Create a comprehensive storyboard/outline including all argument elements: | |
1. Research question | |
2. Working hypothesis/claim | |
3. Reasons and evidence | |
4. Acknowledgments and responses | |
5. Warrants | |
Argument Elements: {input} | |
Create: | |
RESEARCH QUESTION: [Your driving question] | |
MAIN CLAIM: [Your central argument] | |
STORYBOARD OUTLINE: | |
1. Introduction | |
- Hook/Context | |
- Research Question | |
- Claim Preview | |
2. Reason 1 + Evidence | |
- Warrant | |
- Potential Objection + Response | |
3. Reason 2 + Evidence | |
- Warrant | |
- Potential Objection + Response | |
4. [Additional reasons as needed] | |
5. Conclusion | |
- Claim Restatement | |
- Broader Implications | |
FLOW CHECK: [How sections connect logically]""", | |
"stage_4b": """Organize this argument structure to meet reader needs and expectations: | |
1. Suggest optimal ordering strategies | |
2. Recommend transitional structure | |
3. Consider what academic readers expect | |
4. Plan logical flow between sections | |
Argument Elements: {input} | |
Provide: | |
RECOMMENDED ORGANIZATION: [Best structure approach] | |
- Chronological / Topical / Simple-to-Complex / etc. | |
SECTION ORDER: [Specific sequence] | |
TRANSITIONAL STRATEGY: [How sections will connect] | |
READER EXPECTATIONS: [What readers need to see when] | |
LOGICAL FLOW NOTES: [Why this order works] | |
ALTERNATIVE APPROACHES: [Other viable structures]""", | |
"stage_4c": """Sketch working introduction and conclusion that effectively frame your argument: | |
1. Draft introduction that hooks readers and previews argument | |
2. Draft conclusion that reinforces argument and shows significance | |
3. Ensure they work together as a frame | |
Main Argument: {input} | |
Create: | |
INTRODUCTION DRAFT: | |
- Opening Hook: [Engaging start] | |
- Context/Background: [Essential background] | |
- Research Question: [Your driving question] | |
- Claim Statement: [Clear claim] | |
- Roadmap: [What's coming] | |
CONCLUSION DRAFT: | |
- Claim Restatement: [Reaffirm your argument] | |
- Key Evidence Summary: [Main support] | |
- Broader Implications: [Why it matters] | |
- Future Research: [What's next] | |
FRAME COHERENCE: [How intro and conclusion work together]""", | |
"stage_4d": """Identify and define key terms that will provide conceptual coherence throughout your paper: | |
1. Select terms representing core concepts | |
2. Ensure terms will run consistently through the paper | |
3. Check for conceptual clarity and consistency | |
Argument: {input} | |
Provide: | |
KEY TERMS TO DEFINE: | |
1. [Term 1]: [Definition and importance] | |
2. [Term 2]: [Definition and importance] | |
3. [Term 3]: [Definition and importance] | |
[Continue as needed] | |
CONCEPTUAL CONSISTENCY: [How terms relate to each other] | |
DEFINITION STRATEGY: [Where/how to define terms] | |
USAGE GUIDELINES: [How to use terms consistently] | |
POTENTIAL CONFUSION: [Terms readers might misunderstand]""", | |
"stage_5": """Provide comprehensive drafting guidance and best practices: | |
1. Effective writing habits | |
2. Source integration techniques | |
3. Evidence relevance demonstration | |
4. Using headings and key terms effectively | |
Writing Plan: {input} | |
Guidance: | |
WRITING HABITS: | |
- Daily writing schedule suggestions | |
- Productivity techniques | |
- Dealing with writer's block | |
SOURCE INTEGRATION: | |
- When to quote vs. paraphrase vs. summarize | |
- How to introduce sources effectively | |
- Attribution best practices | |
EVIDENCE CONNECTION: | |
- Making evidence relevance clear | |
- Linking evidence to reasons and claims | |
- Handling complex or detailed evidence | |
STRUCTURE MAINTENANCE: | |
- Using headings effectively | |
- Tracking key terms | |
- Maintaining argument thread | |
DRAFTING TIPS: [Practical writing advice]""", | |
"stage_6": """Create a comprehensive revision checklist based on Turabian's standards: | |
1. Check for argument blind spots | |
2. Review introduction, conclusion, and claim clarity | |
3. Assess overall body coherence | |
4. Provide paragraph-level revision guidance | |
Draft Description: {input} | |
Revision Checklist: | |
ARGUMENT STRENGTH: | |
β‘ Blind spots check (unconsidered counterarguments?) | |
β‘ Alternative interpretations addressed? | |
β‘ Evidence gaps filled? | |
STRUCTURAL CLARITY: | |
β‘ Introduction clearly frames argument? | |
β‘ Conclusion reinforces without repeating? | |
β‘ Claim visible and specific? | |
BODY COHERENCE: | |
β‘ Key terms used consistently? | |
β‘ Section breaks logical? | |
β‘ Each section contributes to main argument? | |
β‘ Transitions smooth and clear? | |
PARAGRAPH LEVEL: | |
β‘ Each paragraph has clear purpose? | |
β‘ Evidence clearly supports reasons? | |
β‘ Warrants made explicit where needed? | |
REVISION PRIORITIES: [What to focus on first]""" | |
} | |
# Track user progress through stages | |
def get_stage_info(stage_key): | |
stage_info = { | |
"stage_1": {"name": "Commonsense Argument", "description": "Create your foundational argument"}, | |
"stage_2": {"name": "Research Transition", "description": "Move from commonsense to academic"}, | |
"stage_3a": {"name": "Claim Development", "description": "Refine your specific claim"}, | |
"stage_3b": {"name": "Evidence Mapping", "description": "Plan reasons and evidence"}, | |
"stage_3c": {"name": "Objection Analysis", "description": "Anticipate reader challenges"}, | |
"stage_3d": {"name": "Warrant Identification", "description": "Connect reasons to claims"}, | |
"stage_4a": {"name": "Storyboard Creation", "description": "Outline your argument"}, | |
"stage_4b": {"name": "Organization Planning", "description": "Structure for readers"}, | |
"stage_4c": {"name": "Introduction & Conclusion", "description": "Frame your argument"}, | |
"stage_4d": {"name": "Key Terms", "description": "Define core concepts"}, | |
"stage_5": {"name": "Drafting Guidance", "description": "Write your first draft"}, | |
"stage_6": {"name": "Revision Checklist", "description": "Polish your argument"} | |
} | |
return stage_info.get(stage_key, {"name": "Unknown", "description": ""}) | |
# Main processing function | |
def process_stage(stage, input_text, reason_text="", claim_text=""): | |
"""Process input through selected Turabian stage""" | |
if not input_text.strip(): | |
return "Please provide input text to analyze." | |
# Get the appropriate prompt - fixed the key mapping | |
prompt_template = TURABIAN_PROMPTS.get(stage) | |
if not prompt_template: | |
return f"Error: Stage {stage} not found." | |
# Handle special case for warrant stage that needs both reason and claim | |
if stage == "stage_3d": | |
if not reason_text.strip() or not claim_text.strip(): | |
return "For warrant analysis, please provide both a reason and a claim." | |
prompt = prompt_template.format(reason=reason_text, claim=claim_text) | |
else: | |
prompt = prompt_template.format(input=input_text) | |
try: | |
# Generate response using Llama 3.3 | |
messages = [{"role": "user", "content": prompt}] | |
response = client.chat_completion( | |
messages=messages, | |
max_tokens=1500, | |
temperature=0.7, | |
top_p=0.9 | |
) | |
return response.choices[0].message.content | |
except Exception as e: | |
return f"Error processing request: {str(e)}" | |
# Custom CSS for better styling | |
custom_css = """ | |
.stage-container { | |
border: 2px solid #4CAF50; | |
border-radius: 10px; | |
padding: 20px; | |
margin: 10px 0; | |
background-color: #f9f9f9; | |
} | |
.stage-title { | |
color: #2E7D32; | |
font-size: 1.2em; | |
font-weight: bold; | |
margin-bottom: 10px; | |
} | |
.progress-indicator { | |
background-color: #E3F2FD; | |
padding: 10px; | |
border-radius: 5px; | |
margin-bottom: 15px; | |
} | |
.output-box { | |
background-color: #FAFAFA; | |
border: 1px solid #E0E0E0; | |
border-radius: 5px; | |
padding: 15px; | |
font-family: monospace; | |
line-height: 1.6; | |
} | |
""" | |
# Main Gradio interface | |
with gr.Blocks(title="Turabian Research Argument Assistant", css=custom_css, theme=gr.themes.Soft()) as app: | |
gr.Markdown(""" | |
# π Turabian Research Argument Assistant | |
### *Based on "A Manual for Writers of Research Papers, Theses, and Dissertations" by Kate L. Turabian* | |
Develop your research argument step-by-step using Turabian's proven methodology. This tool guides you through all 6 stages from commonsense argument to final revision. | |
""") | |
with gr.Row(): | |
with gr.Column(scale=2): | |
gr.Markdown("## π― Select Your Stage") | |
stage = gr.Radio( | |
choices=[ | |
("π Stage 1: Commonsense Argument", "stage_1"), | |
("π Stage 2: Research Transition", "stage_2"), | |
("ποΈ Stage 3A: Claim Development", "stage_3a"), | |
("π Stage 3B: Evidence Mapping", "stage_3b"), | |
("β Stage 3C: Objection Analysis", "stage_3c"), | |
("π Stage 3D: Warrant Identification", "stage_3d"), | |
("π Stage 4A: Storyboard Creation", "stage_4a"), | |
("π Stage 4B: Organization Planning", "stage_4b"), | |
("βοΈ Stage 4C: Introduction & Conclusion", "stage_4c"), | |
("π Stage 4D: Key Terms", "stage_4d"), | |
("π Stage 5: Drafting Guidance", "stage_5"), | |
("π Stage 6: Revision Checklist", "stage_6") | |
], | |
value="stage_1", | |
label="Choose Your Current Stage" | |
) | |
# Dynamic stage information | |
stage_info = gr.Markdown("**Stage 1: Commonsense Argument** - Create your foundational argument") | |
# Input section | |
gr.Markdown("## π Your Input") | |
input_text = gr.Textbox( | |
label="Main Input", | |
placeholder="Enter your topic, argument, or text for this stage...", | |
lines=8, | |
max_lines=15 | |
) | |
# Special inputs for warrant stage | |
with gr.Row(visible=False) as warrant_inputs: | |
reason_text = gr.Textbox( | |
label="Reason", | |
placeholder="Enter the specific reason...", | |
lines=3 | |
) | |
claim_text = gr.Textbox( | |
label="Claim", | |
placeholder="Enter the specific claim...", | |
lines=3 | |
) | |
process_btn = gr.Button("π Process Stage", variant="primary", size="lg") | |
with gr.Column(scale=3): | |
gr.Markdown("## π Stage Output") | |
output = gr.Textbox( | |
label="Analysis Results", | |
lines=30, | |
max_lines=40, | |
show_copy_button=True, | |
elem_classes=["output-box"] | |
) | |
gr.Markdown(""" | |
## π How to Use This Tool | |
1. **Start with Stage 1** - Input your basic topic/idea | |
2. **Progress sequentially** - Each stage builds on the previous | |
3. **Copy outputs** - Use results from one stage as input for the next | |
4. **Take your time** - Turabian's method requires careful development | |
## π‘ Tips | |
- Keep outputs from each stage for reference | |
- Don't skip stages - each builds essential elements | |
- Stage 3D (Warrants) requires both a reason and claim | |
- Use stage 4+ outputs to guide your actual writing | |
""") | |
# Update stage information when selection changes | |
def update_stage_info(stage_key): | |
info = get_stage_info(stage_key) | |
stage_desc = f"**{info['name']}** - {info['description']}" | |
# Show/hide warrant special inputs | |
if stage_key == "stage_3d": | |
return stage_desc, gr.update(visible=True) | |
else: | |
return stage_desc, gr.update(visible=False) | |
stage.change( | |
fn=update_stage_info, | |
inputs=[stage], | |
outputs=[stage_info, warrant_inputs] | |
) | |
# Process button click | |
process_btn.click( | |
fn=process_stage, | |
inputs=[stage, input_text, reason_text, claim_text], | |
outputs=output, | |
show_progress=True | |
) | |
if __name__ == "__main__": | |
app.launch() |