Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ logs/*

# IDE
.vscode/
.idea/
.idea/
pytest-temp/
134 changes: 69 additions & 65 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,14 @@
}
]

initial_messages = [message.copy() for message in messages]


def clear_conversation(messages, initial_messages):
"""Reset conversation context while preserving initial system messages."""
messages[:] = [message.copy() for message in initial_messages]
return "Conversation cleared. Persistent memories and documents are preserved."


def route_request(user_input):
intents = []
Expand Down Expand Up @@ -111,89 +117,87 @@ def route_request(user_input):
intents.append("none")
return intents

while True:

user_message = input("What’s the yap? : ")
intents = route_request(user_message)

if user_message.lower() == "exit":
print("Goodbye!")
break

def main():
while True:
user_message = input("What’s the yap? : ").strip()

# Add user message to memory
messages.append({
"role": "user",
"content": user_message
})
if user_message.lower() == "exit":
print("Goodbye!")
break

logging.info(f"USER: {user_message}")
if user_message.lower() == "/clear":
print(clear_conversation(messages, initial_messages))
logging.info("Conversation context cleared.")
continue

selected_tools = [
registry.tools[intent]["definition"]
for intent in intents
if intent in registry.tools
]
intents = route_request(user_message)

# Ask Ollama what to do
response = ollama.chat(
model=MODEL_NAME,
messages=messages,
tools=selected_tools
)
# Add user message to conversation history.
messages.append({
"role": "user",
"content": user_message
})

logging.info(f"USER: {user_message}")

# If Ollama wants to use a tool
if response.message.tool_calls:
selected_tools = [
registry.tools[intent]["definition"]
for intent in intents
if intent in registry.tools
]

# Save Ollama's tool-call message
messages.append(response.message)
# Ask Ollama what to do.
response = ollama.chat(
model=MODEL_NAME,
messages=messages,
tools=selected_tools
)

for tool_call in response.message.tool_calls:
function_name = tool_call.function.name
function_arguments = tool_call.function.arguments
# Handle tool calls.
if response.message.tool_calls:
messages.append(response.message)

logging.info(f"FUNCTION: {function_name}")
for tool_call in response.message.tool_calls:
function_name = tool_call.function.name
function_arguments = tool_call.function.arguments

function = registry.tools[function_name]["function"]
result = function(**function_arguments)
logging.info(f"RESULT: {result}")
logging.info(f"FUNCTION: {function_name}")

function = registry.tools[function_name]["function"]
result = function(**function_arguments)

# Add tool result to memory
messages.append({
"role": "tool",
"tool_name": tool_call.function.name,
"content": str(result)
})
logging.info(f"RESULT: {result}")

messages.append({
"role": "tool",
"tool_name": function_name,
"content": str(result)
})

# Send tool result back to Ollama
final_response = ollama.chat(
model=MODEL_NAME,
messages=messages
)
# Send tool results back to Ollama.
final_response = ollama.chat(
model=MODEL_NAME,
messages=messages
)

print(final_response.message.content)
logging.info(f"AI: {final_response.message.content}")

# Print final answer
print(final_response.message.content)
logging.info(f"AI: {final_response.message.content}")


# Save final answer to memory
messages.append({
"role": "assistant",
"content": final_response.message.content
})
messages.append({
"role": "assistant",
"content": final_response.message.content
})

else:
print(response.message.content)
logging.info(f"AI: {response.message.content}")

# Normal conversation without tools
else:
messages.append({
"role": "assistant",
"content": response.message.content
})

print(response.message.content)
logging.info(f"AI: {response.message.content}")

messages.append({
"role": "assistant",
"content": response.message.content
})
if __name__ == "__main__":
main()
39 changes: 39 additions & 0 deletions tests/test_clear.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@

from main import clear_conversation


def test_clear_conversation_preserves_initial_messages():
initial_messages = [
{"role": "system", "content": "System instructions"},
{"role": "system", "content": "Persistent memory context"},
]

messages = initial_messages.copy()
messages.extend([
{"role": "user", "content": "My previous question"},
{"role": "assistant", "content": "My previous answer"},
])

result = clear_conversation(messages, initial_messages)

assert messages == initial_messages
assert result == (
"Conversation cleared. Persistent memories and documents are preserved."
)


def test_clear_conversation_removes_tool_messages():
initial_messages = [
{"role": "system", "content": "System instructions"}
]

messages = initial_messages.copy()
messages.extend([
{"role": "user", "content": "Find this document"},
{"role": "tool", "content": "Document contents"},
])

clear_conversation(messages, initial_messages)

assert messages == initial_messages
assert all(message["role"] == "system" for message in messages)
Loading