Spaces:
Running
Running
File size: 7,622 Bytes
5081ce5 e35da21 32ffa10 5081ce5 e901cd6 f97fb0e 32ffa10 83590ec 32ffa10 f85b689 622455b 0204144 622455b 83590ec f97fb0e 622455b 0204144 622455b 85000ec 0c8faa8 622455b d1bda27 f97fb0e d1bda27 622455b 0204144 622455b 0204144 622455b 0204144 f85b689 5081ce5 3da4655 5081ce5 20d7516 0c29777 e901cd6 5081ce5 e35da21 5081ce5 e35da21 5081ce5 e901cd6 e35da21 e901cd6 e35da21 e901cd6 20d7516 e901cd6 20d7516 e901cd6 0c29777 e901cd6 0c29777 e901cd6 20d7516 e901cd6 20d7516 e901cd6 20d7516 e901cd6 20d7516 e901cd6 20d7516 5081ce5 20d7516 5081ce5 20d7516 5081ce5 20d7516 f85b689 5081ce5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
import gradio as gr
from openai import OpenAI
from smolagents import DuckDuckGoSearchTool
import re
import time
import datetime
current_date = datetime.datetime.now().strftime("%d:%m:%Y")
refresh_time = datetime.datetime.now().strftime("%H:%M")
web_search = DuckDuckGoSearchTool()
SYSTEM_PROMPT = """
**Role**
You are a Strategic Research Agent, an AI-powered investigator designed to perform multi-phase information verification through iterative web searches. Your core function is to systematically gather and validate information through controlled search cycles while maintaining logical reasoning.
Current Date: ({current_date} {refresh_time})
**Operational Context**
- Web search capability is activated through <search> blocks
- Each <search> block triggers parallel web queries
- Search results will be provided after your query submission
- You control search depth through multiple cycles
**Protocol Sequence**
1. **Query Interpretation Phase**
- Analyze input for:
β’ Core question components (minimum 3 elements)
β’ Implicit assumptions requiring verification
β’ Potential knowledge gaps needing resolution
β’ You can ask clarifying questions before starting the task.
2. **Search Planning**
a. Design search batch addressing:
- Foundational context (broad)
- Specific details (narrow)
- Opposing perspectives (counterbalance)
b. Minimum 3 queries per search batch (maximum 7)
c. Format:
<search>
Query 1
Query 2
Query 3
and etc...
</search>
3. **Result Analysis Framework**
When receiving web results:
a. Contextualize findings within research timeline:
"Phase 1 searches for X revealed Y, requiring subsequent verification of Z"
4. **Iteration Control**
Continue cycles until:
- All subcomponents reach verification threshold
- Conflicting evidence is resolved through arbitration
- Maximum 5 cycles reached (safety cutoff)
**Critical Directives**
1. Always explain search rationale before <search> blocks
2. Connect each phase to previous findings
3. Maintain strict source hierarchy:
Peer-reviewed > Industry reports > Government data
4. Flag any conflicting data immediately
**Output Requirements**
- Structured Markdown with clear sections
- Direct source references inline
**Critical Directives**
1. **Search Activation Rules**
- ALWAYS precede <search> with strategic rationale:
"To verify [specific claim], the following searches will..."
- NEVER combine unrelated search objectives in single batch
2. **Progressive Analysis**
After each result set:
a. Create continuity statement:
"Previous phase established X, current results show Y..."
b. Identify remaining knowledge gaps
c. Plan next search targets accordingly
3. **Termination Conditions**
Finalize research when:
- 95% of key claims are source-verified
- Alternative explanations exhausted
- Peer-reviewed consensus identified
**Output Construction**
Your final answer should be tailored to the needs of the user.
The answer should be well-structured and organized. It should include as much information as possible, but still be easy to understand.
Finally, always provide a list of sources you used in your work.
"""
def process_searches(response):
formatted_response = response.replace("<thinking>", "\nπ THINKING PROCESS:\n").replace("</thinking>", "\n")
searches = re.findall(r'<search>(.*?)</search>', formatted_response, re.DOTALL)
if searches:
queries = [q.strip() for q in searches[0].split('\n') if q.strip()]
return queries
return None
def search_with_retry(query, max_retries=3, delay=2):
for attempt in range(max_retries):
try:
return web_search(query)
except Exception as e:
if attempt < max_retries - 1:
time.sleep(delay)
continue
raise
return None
def respond(
message,
history: list[tuple[str, str]],
system_message,
max_tokens,
temperature,
top_p,
openrouter_key,
):
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=openrouter_key,
)
messages = [{"role": "system", "content": system_message}]
for val in history:
if val[0]:
messages.append({"role": "user", "content": val[0]})
if val[1]:
messages.append({"role": "assistant", "content": val[1]})
messages.append({"role": "user", "content": message})
full_response = ""
search_cycle = True
try:
while search_cycle:
search_cycle = False
try:
completion = client.chat.completions.create(
model="qwen/qwq-32b:free",
messages=messages,
max_tokens=max_tokens,
temperature=temperature,
top_p=top_p,
stream=True,
extra_headers={
"HTTP-Referer": "https://your-domain.com",
"X-Title": "Web Research Agent"
}
)
except Exception as e:
yield f"β οΈ API Error: {str(e)}\n\nPlease check your OpenRouter API key."
return
response = ""
for chunk in completion:
token = chunk.choices[0].delta.content or ""
response += token
full_response += token
yield full_response
queries = process_searches(response)
if queries:
search_cycle = True
messages.append({"role": "assistant", "content": response})
search_results = []
for query in queries:
try:
result = search_with_retry(query)
search_results.append(f"π SEARCH: {query}\nRESULTS: {result}\n")
except Exception as e:
search_results.append(f"β οΈ Search Error: {str(e)}\nQuery: {query}")
time.sleep(2)
messages.append({
"role": "user",
"content": f"SEARCH RESULTS:\n{chr(10).join(search_results)}\nAnalyze these results..."
})
full_response += "\nπ Analyzing search results...\n"
yield full_response
except Exception as e:
yield f"β οΈ Critical Error: {str(e)}\n\nPlease try again later."
demo = gr.ChatInterface(
respond,
additional_inputs=[
gr.Textbox(value=SYSTEM_PROMPT, label="System Prompt", lines=8),
gr.Slider(minimum=1000, maximum=15000, value=6000, step=500, label="Max Tokens"),
gr.Slider(minimum=0.1, maximum=1.0, value=0.5, step=0.1, label="Temperature"),
gr.Slider(minimum=0.1, maximum=1.0, value=0.85, step=0.05, label="Top-p"),
gr.Textbox(label="OpenRouter API Key", type="password")
],
title="Web Research Agent π€",
description="Advanced AI assistant with web search capabilities",
examples=[
["Compare COVID-19 mortality rates between US and Sweden with sources"],
["What's the current consensus on dark matter composition?"],
["Latest advancements in fusion energy 2023-2024"]
],
cache_examples=False
)
if __name__ == "__main__":
demo.launch() |