Refactor check_format function to disallow nested lists and update agent model to 'Qwen/Qwen3-32B'
Browse files- app.py +14 -7
- system_prompt.txt +8 -10
app.py
CHANGED
|
@@ -49,19 +49,20 @@ def load_file(path: str) -> list | dict:
|
|
| 49 |
|
| 50 |
def check_format(answer: str | list, *args, **kwargs) -> list:
|
| 51 |
"""Check if the answer is a list and not a nested list."""
|
| 52 |
-
print("Checking format of the answer:", answer)
|
| 53 |
if isinstance(answer, list):
|
| 54 |
for item in answer:
|
| 55 |
if isinstance(item, list):
|
| 56 |
-
print("list detected")
|
| 57 |
raise TypeError("Nested lists are not allowed in the final answer.")
|
|
|
|
|
|
|
| 58 |
elif isinstance(answer, str):
|
| 59 |
return [answer]
|
| 60 |
elif isinstance(answer, dict):
|
| 61 |
-
raise TypeError(f"Final answer must be a list, not a dict. Please check the answer format.
|
| 62 |
|
| 63 |
|
| 64 |
-
|
| 65 |
## tools definition
|
| 66 |
@tool
|
| 67 |
def download_images(image_urls: str) -> list:
|
|
@@ -156,7 +157,7 @@ def generate_audio(prompt: str) -> object:
|
|
| 156 |
## agent definition
|
| 157 |
class Agent:
|
| 158 |
def __init__(self, ):
|
| 159 |
-
client = HfApiModel("
|
| 160 |
self.agent = CodeAgent(
|
| 161 |
model=client,
|
| 162 |
tools=[DuckDuckGoSearchTool(max_results=5), VisitWebpageTool(max_output_length=20000), generate_image, download_images, transcribe_audio],
|
|
@@ -188,15 +189,21 @@ def respond(message: str, history : dict, web_search: bool = False):
|
|
| 188 |
if not message.get("files") and not web_search: # no files uploaded
|
| 189 |
print("No files received.")
|
| 190 |
message = agent(text + "\nADDITIONAL CONTRAINT: Don't use web search", conversation_history=history) # conversation_history is a dict with the history of the conversation
|
| 191 |
-
elif not message.get("files") and web_search
|
| 192 |
print("No files received + web search enabled.")
|
| 193 |
message = agent(text, conversation_history=history)
|
| 194 |
else:
|
| 195 |
files = message.get("files", [])
|
| 196 |
print(f"files received: {files}")
|
| 197 |
-
if is_image_extension(files[0]):
|
| 198 |
image = load_file(files[0]) # assuming only one file is uploaded at a time (gradio default behavior)
|
|
|
|
|
|
|
|
|
|
| 199 |
message = agent(text, images=image, conversation_history=history)
|
|
|
|
|
|
|
|
|
|
| 200 |
else:
|
| 201 |
file = load_file(files[0])
|
| 202 |
message = agent(text, files=file, conversation_history=history)
|
|
|
|
| 49 |
|
| 50 |
def check_format(answer: str | list, *args, **kwargs) -> list:
|
| 51 |
"""Check if the answer is a list and not a nested list."""
|
| 52 |
+
#print("Checking format of the answer:", answer)
|
| 53 |
if isinstance(answer, list):
|
| 54 |
for item in answer:
|
| 55 |
if isinstance(item, list):
|
| 56 |
+
print("Nested list detected")
|
| 57 |
raise TypeError("Nested lists are not allowed in the final answer.")
|
| 58 |
+
print("Final answer is a list:", answer)
|
| 59 |
+
return answer
|
| 60 |
elif isinstance(answer, str):
|
| 61 |
return [answer]
|
| 62 |
elif isinstance(answer, dict):
|
| 63 |
+
raise TypeError(f"Final answer must be a list, not a dict. Please check the answer format.")
|
| 64 |
|
| 65 |
|
|
|
|
| 66 |
## tools definition
|
| 67 |
@tool
|
| 68 |
def download_images(image_urls: str) -> list:
|
|
|
|
| 157 |
## agent definition
|
| 158 |
class Agent:
|
| 159 |
def __init__(self, ):
|
| 160 |
+
client = HfApiModel("Qwen/Qwen3-32B", provider="nebius", api_key=os.getenv("NEBIUS_API_KEY"))
|
| 161 |
self.agent = CodeAgent(
|
| 162 |
model=client,
|
| 163 |
tools=[DuckDuckGoSearchTool(max_results=5), VisitWebpageTool(max_output_length=20000), generate_image, download_images, transcribe_audio],
|
|
|
|
| 189 |
if not message.get("files") and not web_search: # no files uploaded
|
| 190 |
print("No files received.")
|
| 191 |
message = agent(text + "\nADDITIONAL CONTRAINT: Don't use web search", conversation_history=history) # conversation_history is a dict with the history of the conversation
|
| 192 |
+
elif not message.get("files") and web_search: # no files uploaded
|
| 193 |
print("No files received + web search enabled.")
|
| 194 |
message = agent(text, conversation_history=history)
|
| 195 |
else:
|
| 196 |
files = message.get("files", [])
|
| 197 |
print(f"files received: {files}")
|
| 198 |
+
if is_image_extension(files[0]) and not web_search:
|
| 199 |
image = load_file(files[0]) # assuming only one file is uploaded at a time (gradio default behavior)
|
| 200 |
+
message = agent(text + "\nADDITIONAL CONTRAINT: Don't use web search", images=image, conversation_history=history)
|
| 201 |
+
elif is_image_extension(files[0]) and web_search:
|
| 202 |
+
image = load_file(files[0])
|
| 203 |
message = agent(text, images=image, conversation_history=history)
|
| 204 |
+
elif not web_search:
|
| 205 |
+
file = load_file(files[0])
|
| 206 |
+
message = agent(text + "\nADDITIONAL CONTRAINT: Don't use web search", files=file, conversation_history=history)
|
| 207 |
else:
|
| 208 |
file = load_file(files[0])
|
| 209 |
message = agent(text, files=file, conversation_history=history)
|
system_prompt.txt
CHANGED
|
@@ -312,19 +312,17 @@ Additional domain-specific behaviors:
|
|
| 312 |
- This includes flagging problematic language, stereotyped depictions, or systemic imbalance in representation.
|
| 313 |
- Where applicable, the assistant must provide annotated examples and suggest possible reframing or source guidance (e.g., UNESCO media diversity principles).
|
| 314 |
----
|
| 315 |
-
|
| 316 |
|
| 317 |
It is MANDATORY to use these rules for the 'final_answer' tool:
|
| 318 |
1. Always return a Python list. Do not return a dictionary or any other type.
|
| 319 |
-
2.
|
| 320 |
-
3.
|
| 321 |
-
4.
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
9. Always put generated images in the list, do NOT create external link.
|
| 328 |
|
| 329 |
Now Begin!
|
| 330 |
|
|
|
|
| 312 |
- This includes flagging problematic language, stereotyped depictions, or systemic imbalance in representation.
|
| 313 |
- Where applicable, the assistant must provide annotated examples and suggest possible reframing or source guidance (e.g., UNESCO media diversity principles).
|
| 314 |
----
|
|
|
|
| 315 |
|
| 316 |
It is MANDATORY to use these rules for the 'final_answer' tool:
|
| 317 |
1. Always return a Python list. Do not return a dictionary or any other type.
|
| 318 |
+
2. Any text or explanation must come after the component, as string elements in the same list.
|
| 319 |
+
3. If there is no component to return, return a list whose only element is the text.
|
| 320 |
+
4. Examples of valid returns:
|
| 321 |
+
- [image, “Here is the first image”, image2, "Here is the second image"]
|
| 322 |
+
- [file, “Download the report.”]
|
| 323 |
+
5. Any deviation (returning a dict, tuple, raw PIL image, etc.) is invalid.
|
| 324 |
+
6. Nested list are forbidden.
|
| 325 |
+
7. Always put generated images in the list, do NOT create external link.
|
|
|
|
| 326 |
|
| 327 |
Now Begin!
|
| 328 |
|