feat: Working tool calls

o
	new file:   llm_interface.py
This commit is contained in:
2025-09-12 15:32:03 +01:00
parent fd2432df38
commit 30989e62ca
8 changed files with 6347 additions and 169 deletions
+73
View File
@@ -0,0 +1,73 @@
import config
from tools import ToolExecutor
import requests
from rich import print
from rich.prompt import Prompt
#TODO: context squish when it gets big
class llm():
def __init__(self, logger) -> None:
self.logger = logger
self.first_prompt = 1
self.context = {
"history": [],
"summary": None,
"metadata": {
"created_at": None,
"token_budget": 8000,
}
}
def summarise_context(self):
# add ai summary & created at time
pass
def add_to_history(self, history_object):
self.context['history'].append(history_object)
self.logger.debug(self.context['history'])
def ask_model(self, prompt: str, url=config.LM_STUDIO_URL) -> str:
# prompt = config.PRE_PROMPT + prompt
payload = {
"model": 'qwen/qwen3-coder-30b',
"messages": [],
"temperature": 0.7,
"max_tokens": 2048,
}
self.add_to_history({"role": "user", "content": prompt})
payload["messages"] = [
{"role": "system", "content": config.SYSTEM_MESSAGE}
] + self.context['history']
self.logger.debug(f'json payload: {payload}')
resp = requests.post(url, json=payload)
resp.raise_for_status()
self.logger.debug(resp.json())
self.add_to_history(resp.json()["choices"][0]["message"])
return resp.json()["choices"][0]["message"]["content"].strip()
def tool_response(self, prompt: str, url=config.LM_STUDIO_URL) -> str:
payload = {
"model": 'qwen/qwen3-coder-30b',
"messages": [],
"temperature": 0.7,
"max_tokens": 2048,
}
payload["messages"] = [{"role": "tool", "content": prompt}]
resp = requests.post(url, json=payload)
resp.raise_for_status()
self.logger.debug(resp.json())
return resp.json()["choices"][0]["message"]["content"].strip()
def get_llm_prompt(self):
while True:
llm_prompt = Prompt.ask("[bold cyan]Ask your local llm[/]")
self.logger.debug(f'prompt is: {llm_prompt}')
if llm_prompt == '':
self.logger.error("Cannot be empty!")
return llm_prompt
def handle_llm_reply(self, llm_reply:str):
architect = ToolExecutor(self.logger)
return architect.process_llm_response(llm_output=llm_reply)