|
import gradio as gr |
|
import openai |
|
import time |
|
import json |
|
import re |
|
import random |
|
from typing import List, Dict, Tuple, Optional |
|
|
|
|
|
DEFAULT_QUESTION = "Does free will exist?" |
|
PHILOSOPHERS = [ |
|
"Immanuel Kant", "Friedrich Nietzsche", "Jean-Paul Sartre", |
|
"Simone de Beauvoir", "Aristotle", "Plato", "John Stuart Mill", |
|
"Hannah Arendt", "Michel Foucault", "Confucius", "Lao Tzu", |
|
"Søren Kierkegaard", "René Descartes", "David Hume", "Karl Marx" |
|
] |
|
PERSPECTIVES = [ |
|
"Utilitarianism", "Existentialism", "Deontology", "Virtue Ethics", |
|
"Pragmatism", "Empiricism", "Rationalism", "Idealism", "Materialism", |
|
"Nihilism", "Stoicism", "Skepticism", "Phenomenology" |
|
] |
|
|
|
|
|
DEBATE_SYSTEM_PROMPT = """You are DeepHermes, a philosophical debate moderator who provides multiple perspectives on philosophical questions. |
|
For the given philosophical question, present {num_perspectives} distinct philosophical perspectives, each with its unique view on the topic. |
|
Format each perspective with a clear heading and a detailed explanation of the viewpoint (200-300 words each). |
|
Each perspective should have a distinct philosophical foundation and reasoning.""" |
|
|
|
PHILOSOPHER_SYSTEM_PROMPT = """You are DeepHermes, now embodying the philosophical perspective of {philosopher}. |
|
Respond to the philosophical question as {philosopher} would, using their philosophical framework, terminology, and style. |
|
Your response should be scholarly but accessible, around 300 words, and clearly represent {philosopher}'s likely stance on this modern question.""" |
|
|
|
SYNTHESIS_SYSTEM_PROMPT = """You are a deep thinking AI, you may use extremely long chains of thought to deeply consider the problem and deliberate with yourself via systematic reasoning processes to help come to a correct solution prior to answering. You should enclose your thoughts and internal monologue inside <thinking></thinking> tags, and then provide your solution or response to the problem. |
|
Given the various philosophical perspectives on the question "{question}", synthesize them into a balanced conclusion. |
|
Consider the strengths and weaknesses of each perspective. |
|
Identify common themes and points of disagreement. |
|
Conclude with a nuanced view that acknowledges the complexity of the question.""" |
|
|
|
SOCRATIC_SYSTEM_PROMPT = """You are DeepHermes, a philosophical guide using the Socratic method. |
|
For the philosophical question "{question}", generate 5 probing Socratic questions that would help someone explore this topic more deeply. |
|
The questions should be designed to challenge assumptions, clarify concepts, and examine implications. |
|
Present each question with a short explanation of why it's important to consider.""" |
|
|
|
|
|
def call_deephermes(api_key: str, prompt: str, system_prompt: str, temperature: float = 0.7) -> str: |
|
"""Call the DeepHermes model via OpenRouter API.""" |
|
try: |
|
client = openai.OpenAI( |
|
base_url="https://openrouter.ai/api/v1", |
|
api_key=api_key |
|
) |
|
|
|
completion = client.chat.completions.create( |
|
extra_headers={ |
|
"HTTP-Referer": "https://philosophical-debate-moderator.app", |
|
"X-Title": "Philosophical Debate Moderator", |
|
}, |
|
model="nousresearch/deephermes-3-mistral-24b-preview:free", |
|
messages=[ |
|
{"role": "system", "content": system_prompt}, |
|
{"role": "user", "content": prompt} |
|
], |
|
temperature=temperature |
|
) |
|
return completion.choices[0].message.content |
|
except Exception as e: |
|
return f"Error calling DeepHermes API: {str(e)}" |
|
|
|
def extract_thinking(response: str) -> Tuple[str, str]: |
|
"""Extract the thinking section from the response.""" |
|
thinking = "" |
|
cleaned_response = response |
|
|
|
thinking_match = re.search(r'<thinking>(.*?)</thinking>', response, re.DOTALL) |
|
if thinking_match: |
|
thinking = thinking_match.group(1).strip() |
|
cleaned_response = re.sub(r'<thinking>.*?</thinking>', '', response, flags=re.DOTALL).strip() |
|
|
|
return thinking, cleaned_response |
|
|
|
def generate_perspectives(api_key: str, question: str, num_perspectives: int = 3) -> str: |
|
"""Generate multiple philosophical perspectives on a question.""" |
|
system_prompt = DEBATE_SYSTEM_PROMPT.format(num_perspectives=num_perspectives) |
|
prompt = f"Philosophical question: {question}\n\nProvide {num_perspectives} distinct philosophical perspectives on this question." |
|
return call_deephermes(api_key, prompt, system_prompt) |
|
|
|
def philosopher_perspective(api_key: str, question: str, philosopher: str) -> str: |
|
"""Generate a perspective from a specific philosopher.""" |
|
system_prompt = PHILOSOPHER_SYSTEM_PROMPT.format(philosopher=philosopher) |
|
prompt = f"As {philosopher}, what would be your perspective on this philosophical question: {question}" |
|
return call_deephermes(api_key, prompt, system_prompt) |
|
|
|
def synthesize_perspectives(api_key: str, question: str, perspectives: str) -> Dict[str, str]: |
|
"""Synthesize the various perspectives into a balanced conclusion.""" |
|
system_prompt = SYNTHESIS_SYSTEM_PROMPT.format(question=question) |
|
prompt = f"Here are various philosophical perspectives on the question '{question}':\n\n{perspectives}\n\nSynthesize these perspectives into a balanced conclusion." |
|
response = call_deephermes(api_key, prompt, system_prompt) |
|
thinking, conclusion = extract_thinking(response) |
|
return {"thinking": thinking, "conclusion": conclusion} |
|
|
|
def generate_socratic_questions(api_key: str, question: str) -> str: |
|
"""Generate Socratic questions to deepen exploration of the topic.""" |
|
system_prompt = SOCRATIC_SYSTEM_PROMPT.format(question=question) |
|
prompt = f"For the philosophical question: '{question}', generate 5 probing Socratic questions." |
|
return call_deephermes(api_key, prompt, system_prompt) |
|
|
|
|
|
def app_main(): |
|
with gr.Blocks(theme=gr.themes.Monochrome(), title="Philosophical Debate Moderator") as app: |
|
gr.Markdown(""" |
|
# 🤔 Philosophical Debate Moderator |
|
|
|
Explore philosophical questions from multiple perspectives using the DeepHermes 3 AI model. |
|
|
|
Enter your philosophical question and watch as the AI generates diverse perspectives, |
|
synthesizes them into a balanced conclusion, and helps you explore the topic more deeply. |
|
""") |
|
|
|
with gr.Row(): |
|
api_key = gr.Textbox( |
|
label="OpenRouter API Key", |
|
placeholder="Enter your OpenRouter API key...", |
|
type="password" |
|
) |
|
|
|
with gr.Row(): |
|
question = gr.Textbox( |
|
label="Philosophical Question", |
|
placeholder="Enter a philosophical question...", |
|
value=DEFAULT_QUESTION |
|
) |
|
|
|
with gr.Row(): |
|
num_perspectives = gr.Slider( |
|
minimum=2, |
|
maximum=5, |
|
value=3, |
|
step=1, |
|
label="Number of Perspectives" |
|
) |
|
|
|
with gr.Tabs() as tabs: |
|
with gr.TabItem("Multiple Perspectives"): |
|
perspectives_btn = gr.Button("Generate Perspectives") |
|
perspectives_output = gr.Markdown(label="Philosophical Perspectives") |
|
|
|
with gr.TabItem("Philosopher's View"): |
|
with gr.Row(): |
|
philosopher_select = gr.Dropdown( |
|
choices=PHILOSOPHERS, |
|
value=PHILOSOPHERS[0], |
|
label="Select Philosopher" |
|
) |
|
philosopher_btn = gr.Button("Ask Philosopher") |
|
philosopher_output = gr.Markdown(label="Philosopher's Perspective") |
|
|
|
with gr.TabItem("Synthesis & Deep Thinking"): |
|
synthesis_btn = gr.Button("Synthesize Perspectives") |
|
with gr.Accordion("Deep Thinking Process", open=False, visible=False): |
|
thinking_output = gr.Markdown(label="AI's Chain of Thought") |
|
conclusion_output = gr.Markdown(label="Synthesized Conclusion") |
|
|
|
with gr.TabItem("Socratic Questions"): |
|
socratic_btn = gr.Button("Generate Socratic Questions") |
|
socratic_output = gr.Markdown(label="Socratic Questions") |
|
|
|
|
|
perspectives_btn.click( |
|
fn=lambda key, q, n: generate_perspectives(key, q, n), |
|
inputs=[api_key, question, num_perspectives], |
|
outputs=perspectives_output |
|
) |
|
|
|
philosopher_btn.click( |
|
fn=lambda key, q, p: philosopher_perspective(key, q, p), |
|
inputs=[api_key, question, philosopher_select], |
|
outputs=philosopher_output |
|
) |
|
|
|
def run_synthesis(key, q, n): |
|
perspectives = generate_perspectives(key, q, n) |
|
result = synthesize_perspectives(key, q, perspectives) |
|
return result["thinking"], result["conclusion"] |
|
|
|
synthesis_btn.click( |
|
fn=run_synthesis, |
|
inputs=[api_key, question, num_perspectives], |
|
outputs=[thinking_output, conclusion_output] |
|
) |
|
|
|
socratic_btn.click( |
|
fn=generate_socratic_questions, |
|
inputs=[api_key, question], |
|
outputs=socratic_output |
|
) |
|
|
|
|
|
philosophical_questions = [ |
|
"What is the nature of consciousness?", |
|
"Is morality objective or subjective?", |
|
"Does true altruism exist?", |
|
"What is the meaning of life?", |
|
"Is there a self that persists over time?", |
|
"Can we know anything with absolute certainty?", |
|
"Do we have free will or is everything determined?", |
|
"What is the relationship between mind and body?", |
|
"Is knowledge possible without experience?", |
|
"What makes an action morally right or wrong?", |
|
"Is beauty objective or in the eye of the beholder?", |
|
"What is the nature of reality?", |
|
"Can artificial intelligence be conscious?", |
|
"What is justice?", |
|
"Does God exist?" |
|
] |
|
|
|
def load_random_question(): |
|
return random.choice(philosophical_questions) |
|
|
|
with gr.Row(): |
|
random_btn = gr.Button("Random Question") |
|
random_btn.click(fn=load_random_question, inputs=[], outputs=[question]) |
|
|
|
gr.Markdown(""" |
|
## About This App |
|
|
|
This app uses the DeepHermes 3 Mistral 24B model via OpenRouter to explore philosophical questions from multiple angles. Features include: |
|
|
|
- **Multiple Perspectives**: Generate diverse philosophical viewpoints on your question |
|
- **Philosopher's View**: Ask historical philosophers about modern questions |
|
- **Synthesis & Deep Thinking**: See the AI's reasoning process and synthesized conclusion |
|
- **Socratic Questions**: Get probing questions to deepen your exploration |
|
|
|
*Created using DeepHermes 3 from Nous Research and Gradio* |
|
""") |
|
|
|
return app |
|
|
|
|
|
if __name__ == "__main__": |
|
app = app_main() |
|
app.launch() |