feat(local-llm): B1b-Plumbing — tools/tool_calls durch Adapter/Bridge/Brain-Client

Traegt OpenAI-Tool-Definitionen (tools) durch den ganzen lokalen Pfad und gibt
tool_calls zurueck:
- adapter.py: tools -> llama.cpp /v1/chat/completions (tool_choice=auto),
  message.tool_calls zurueck in llm_response.
- aria_bridge.py: _local_llm + /internal/local-llm reichen tools durch, geben
  tool_calls zurueck.
- local_llm.py: local_llm_chat akzeptiert tools, result enthaelt tool_calls.

Inert bis der Brain-Tool-Loop (naechster Schritt) tools uebergibt — Verhalten
unveraendert. Tool-Set + lokale Tool-Loop + Router-Anpassung folgen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 12:36:09 +02:00
co-authored by Claude Opus 4.8
parent 3a3c14fdc5
commit a58aa5594d
3 changed files with 37 additions and 13 deletions
+10 -4
View File
@@ -3367,9 +3367,10 @@ class ARIABridge:
_LLM_TIMEOUT_S = 30.0
async def _local_llm(self, messages: list, max_tokens: int = 512,
temperature: float = 0.7, stop=None) -> dict:
temperature: float = 0.7, stop=None, tools=None) -> dict:
"""Schickt einen llm_request an den llm-adapter (Gamebox), wartet auf
llm_response. Rueckgabe: {ok, content, model, elapsedMs} oder {ok:False, error}."""
llm_response. tools (B1b) werden durchgereicht; tool_calls kommen zurueck.
Rueckgabe: {ok, content, tool_calls, model, elapsedMs} oder {ok:False, error}."""
if self.ws_rvs is None:
return {"ok": False, "error": "RVS-Verbindung nicht aktiv"}
if not isinstance(messages, list) or not messages:
@@ -3388,8 +3389,10 @@ class ARIABridge:
}
if stop:
req_payload["stop"] = stop
logger.info("[rvs] llm_request → llm-adapter (id=%s, msgs=%d, max_tokens=%d)",
request_id[:8], len(messages), max_tokens)
if tools:
req_payload["tools"] = tools
logger.info("[rvs] llm_request → llm-adapter (id=%s, msgs=%d, max_tokens=%d, tools=%d)",
request_id[:8], len(messages), max_tokens, len(tools) if tools else 0)
ok = await self._send_to_rvs({
"type": "llm_request",
"payload": req_payload,
@@ -3407,6 +3410,7 @@ class ARIABridge:
return {
"ok": True,
"content": result.get("content", ""),
"tool_calls": result.get("tool_calls"),
"model": result.get("model"),
"elapsedMs": result.get("elapsedMs"),
}
@@ -3885,9 +3889,11 @@ class ARIABridge:
temperature = float(data.get("temperature"))
except (TypeError, ValueError):
temperature = 0.7
_tools = data.get("tools") if isinstance(data.get("tools"), list) else None
result = await self._local_llm(
messages=messages, max_tokens=max_tokens,
temperature=temperature, stop=data.get("stop"),
tools=_tools,
)
status = 200 if result.get("ok") else 502
await _send_response(writer, status, result)