Spaces:
Sleeping
Sleeping
| import tempfile | |
| import gradio as gr | |
| import janus_swi as janus | |
| from crewai import Agent, Task, Crew | |
| from crewai_tools import tool | |
| from crewai_tools import MDXSearchTool | |
| from crewai_tools import WebsiteSearchTool | |
| from langchain_anthropic import ChatAnthropic | |
| import nest_asyncio | |
| nest_asyncio.apply() | |
| DOC_URL = 'https://secure.ssa.gov/apps10/poms.nsf/lnx/0500502100' | |
| MODEL_NAME = "claude-3-5-sonnet-20240620" | |
| llm = ChatAnthropic(model=MODEL_NAME, | |
| temperature=0.2, | |
| max_tokens=4096,) | |
| webs_tool = WebsiteSearchTool( | |
| website=DOC_URL, | |
| config=dict( | |
| llm=dict( | |
| provider="anthropic", | |
| config=dict( | |
| model=MODEL_NAME, | |
| temperature=0.2, | |
| # top_p=1, | |
| # stream=true, | |
| ), | |
| ), | |
| embedder=dict( | |
| provider="ollama", | |
| config=dict( | |
| model="mxbai-embed-large", | |
| # task_type="retrieval_document", | |
| # title="Embeddings", | |
| ), | |
| ), | |
| ) | |
| ) | |
| docs_tool = MDXSearchTool( | |
| mdx='agent_doc.md', | |
| config=dict( | |
| llm=dict( | |
| provider="anthropic", | |
| config=dict( | |
| model=MODEL_NAME, | |
| temperature=0.2, | |
| # top_p=1, | |
| # stream=true, | |
| ), | |
| ), | |
| embedder=dict( | |
| provider="ollama", | |
| config=dict( | |
| model="mxbai-embed-large", | |
| # task_type="retrieval_document", | |
| # title="Embeddings", | |
| ), | |
| ), | |
| ) | |
| ) | |
| def prolog_query_engine(code: str, query: str) -> str: | |
| """Executes a Prolog query with additional Prolog code defining predicates and facts, and returns the results. | |
| Args: | |
| code: Prolog code defining predicates and facts. This code will be appended to knowledge base before executing the query. | |
| query: The Prolog query to execute. | |
| Returns: | |
| A string containing the results of the query, with each result on a new line. If the query fails, returns "False". | |
| """ | |
| janus.consult("knowledge_base.pl") | |
| # Remove code block markers if present | |
| if '```' in code: | |
| code = code.split('```')[1].split('```')[0] | |
| # Write the provided Prolog code to a temporary file | |
| with open('tmp.pl', 'w') as f: | |
| f.write(code) | |
| # Consult the temporary file to load the provided Prolog code | |
| janus.consult("tmp.pl") | |
| # Execute the query and return the results | |
| results = janus.query(query) | |
| if results: | |
| return '\n'.join([str(r) for r in results]) | |
| else: | |
| return "False" | |
| # Define your agents with roles, goals, and tools | |
| programmer = Agent( | |
| role='Software Engineer', | |
| goal='Write Prolog code and a line of Prolog queries to answer user queries', | |
| backstory='''A software engineer with expertise in logic programming and experience using Prolog. | |
| Can translate user requests into Prolog code and execute queries to provide accurate results. | |
| Familiar with various Prolog concepts like recursion, backtracking, and unification.''', | |
| tools=[prolog_query_engine, docs_tool], | |
| llm=llm | |
| ) | |
| consultant = Agent( | |
| role='Consultant', | |
| goal='Answer user query and explain in simple English that even 8 year old kid can understand', | |
| backstory='''A friendly and patient consultant, skilled at explaining complex topics in a clear and simple way. | |
| Can understand the output of a software engineer and translate it into easy-to-understand explanations, | |
| even for someone as young as eight years old. Use simple words and examples to make learning fun and engaging.''', | |
| tools=[webs_tool], | |
| llm=llm | |
| ) | |
| # Define a task | |
| task1 = Task( | |
| name='Answer user query', | |
| description='Given a user query, write Prolog defining predicates and facts in query and build a Prolog query to access knowledge base and answer user query.\nUser query: {query}', | |
| agent=programmer, | |
| expected_output='''A report including:\n\ | |
| - User query\n\ | |
| - Prolog code with predicates and facts\n\ | |
| - Prolog query used to answer the user query\n\ | |
| - Result of running the Prolog query\n\ | |
| - A basic explanation of the result, clarifying how the Prolog query produced the answer''' | |
| ) | |
| # Define a task | |
| task2 = Task( | |
| name='Reply user query', | |
| description='Given answer to user query, improve the wordings in answer using your knowledge.', | |
| agent=consultant, | |
| expected_output='A clear, concise, and easy-to-understand explanation of the answer to the user query, suitable for an 8-year-old.' | |
| ) | |
| # Create a crew | |
| crew = Crew( | |
| agents=[programmer, consultant], | |
| tasks=[task1, task2], | |
| verbose=True) | |
| def yes_man(user_query, history): | |
| return crew.kickoff(inputs={"query": user_query}) | |
| gr.ChatInterface( | |
| yes_man, | |
| title="SSI/SSDI expert", | |
| description="Ask expert system any question", | |
| examples=["Is it eligible for a blind US citizen born in 1996 Jan 2 name John Doe to get SSI?"], | |
| ).queue().launch() |