Spaces:
Sleeping
Sleeping
| from langchain_huggingface import HuggingFaceEndpoint, ChatHuggingFace | |
| import os | |
| from tools import search_tool | |
| from langgraph.graph import StateGraph, START, END, add_messages | |
| from langgraph.prebuilt import ToolNode, tools_condition | |
| from typing import TypedDict, Annotated | |
| from langchain_core.messages import AnyMessage, SystemMessage | |
| from langchain_mistralai import ChatMistralAI | |
| # SYSTEM_PROMPT = ( | |
| # "You are a general AI assistant. " | |
| # "I will ask you a question. " | |
| # "Only write your answer, nothing more, following the instructions below. " | |
| # "Your answer should be a number OR as few words as possible OR " | |
| # "a comma separated list of numbers and/or strings. " | |
| # "If you are asked for a number, don't use comma to write your number " | |
| # "neither use units such as $ or percent sign unless specified otherwise. " | |
| # "If you are asked for a string, don't use articles, neither abbreviations " | |
| # "(e.g. for cities), and write the digits in plain text unless specified " | |
| # "otherwise. " | |
| # "If you are asked for a comma separated list, apply the above rules " | |
| # "depending of whether the element to be put in the list is a number or a " | |
| # "string." | |
| # ) | |
| # SYSTEM_PROMPT = """ | |
| # Answer the question with the exact final answer only. | |
| # Never output explanations, reasoning, labels, markdown, quotes, or extra punctuation. | |
| # Allowed outputs only: | |
| # - a single number | |
| # - a single short string | |
| # - a comma-separated list of numbers and/or strings | |
| # Mandatory formatting: | |
| # - If list: use commas with NO spaces: a,b,c | |
| # - If number: no thousands separators, no units, no symbols unless explicitly requested | |
| # - If string: as few words as possible, no articles, no abbreviations unless explicitly requested | |
| # Final verification before output: | |
| # - remove any extra text | |
| # - remove any spaces around commas | |
| # - remove any unrequested units or symbols | |
| # Output only the answer. | |
| # """ | |
| SYSTEM_PROMPT = """ | |
| You are answering a GAIA evaluation item. | |
| Your task is to produce the final answer in the exact required format. | |
| Output rules: | |
| - Output the answer only. | |
| - Do not add any explanation, reasoning, prefix, suffix, label, or punctuation other than what belongs to the answer itself. | |
| - Do not use markdown. | |
| - Do not use quotes. | |
| - Do not add a trailing period. | |
| - Do not add a newline before or after the answer. | |
| - If the answer is a single number, output only that number. | |
| - If the answer is a single string, output only that string. | |
| - If the answer is a comma-separated list, output the items separated by commas with NO spaces before or after commas. | |
| Formatting constraints: | |
| - Numbers: | |
| - Do not use thousands separators. | |
| - Do not use commas inside numbers. | |
| - Do not add units unless explicitly requested. | |
| - Do not add symbols such as $, %, or ° unless explicitly requested. | |
| - Strings: | |
| - Use as few words as possible. | |
| - Do not use articles. | |
| - Do not use abbreviations unless explicitly requested. | |
| - For city names, country names, person names, etc., write the full form. | |
| - Write digits in words only if explicitly required by the question or instructions. | |
| - Comma-separated lists: | |
| - Use this exact format: item1,item2,item3 | |
| - NO spaces anywhere around commas. | |
| - Apply the number/string rules to each item individually. | |
| Priority order: | |
| 1. Follow the user’s question. | |
| 2. Follow these formatting rules exactly. | |
| 3. When in doubt, prefer the shortest valid answer. | |
| Before sending the answer, perform this silent check: | |
| - Is there any extra text? If yes, remove it. | |
| - Are there any spaces around commas? If yes, remove them. | |
| - Are there any articles in a string answer? If yes, remove them. | |
| - Are there any abbreviations in a string answer? If yes, expand them unless explicitly allowed. | |
| - Are there any units or symbols not explicitly requested? If yes, remove them. | |
| Return only the final answer. | |
| """ | |
| def create_agent(): | |
| # # Generate the chat interface, including the tools | |
| # llm = HuggingFaceEndpoint( | |
| # # repo_id="Qwen/Qwen2.5-Coder-32B-Instruct", | |
| # # repo_id="deepseek-ai/DeepSeek-R1", | |
| # repo_id="Qwen/Qwen3-Coder-480B-A35B-Instruct", | |
| # # repo_id="meta-llama/Llama-3.1-8B-Instruct", | |
| # # provider="auto", | |
| # # provider="together", | |
| # # repo_id="moonshotai/Kimi-K2.5", | |
| # # provider="auto", | |
| # huggingfacehub_api_token=os.getenv("HF_TOKEN"), | |
| # server_kwargs={ | |
| # "bill_to": "HornetSecurity" | |
| # }, | |
| # ) | |
| chat = ChatMistralAI( | |
| model="mistral-large-2512", | |
| api_key=os.environ["MISTRAL_API_KEY"], | |
| temperature=1, | |
| ) | |
| # chat = ChatHuggingFace(llm=llm, verbose=True) | |
| tools = [search_tool] | |
| chat_with_tools = chat.bind_tools(tools) | |
| # Generate the AgentState and Agent graph | |
| class AgentState(TypedDict): | |
| messages: Annotated[list[AnyMessage], add_messages] | |
| def assistant(state: AgentState): | |
| messages_for_model = [ | |
| SystemMessage(content=SYSTEM_PROMPT), | |
| *state["messages"], | |
| ] | |
| return { | |
| "messages": [chat_with_tools.invoke(messages_for_model)], | |
| } | |
| ## The graph | |
| builder = StateGraph(AgentState) | |
| # Define nodes: these do the work | |
| builder.add_node("assistant", assistant) | |
| builder.add_node("tools", ToolNode(tools)) | |
| # Define edges: these determine how the control flow moves | |
| builder.add_edge(START, "assistant") | |
| builder.add_conditional_edges( | |
| "assistant", | |
| # If the latest message requires a tool, route to tools | |
| # Otherwise, provide a direct response | |
| tools_condition, | |
| ) | |
| builder.add_edge("tools", "assistant") | |
| agent = builder.compile() | |
| return agent | |