feat!: migrate to OpenAI native tool calls and fix circular deps (#fuck-gemini)

- Fix circular dependencies in agent/tools
- Migrate from custom JSON to OpenAI tool calls format
- Add async streaming (step_stream, complete_stream)
- Simplify prompt system and remove token counting
- Add 5 new API endpoints (/health, /v1/models, /api/memory/*)
- Add 3 new tools (get_torrent_by_index, add_torrent_by_index, set_language)
- Fix all 500 tests and add coverage config (80% threshold)
- Add comprehensive docs (README, pytest guide)

BREAKING: LLM interface changed, memory injection via get_memory()
This commit is contained in:
2025-12-06 19:11:05 +01:00
parent 2c8cdd3ab1
commit 9ca31e45e0
92 changed files with 7897 additions and 1786 deletions
+19 -17
View File
@@ -1,21 +1,22 @@
"""Filesystem application DTOs."""
from dataclasses import dataclass
from typing import Optional, List
@dataclass
class SetFolderPathResponse:
"""Response from setting a folder path."""
status: str
folder_name: Optional[str] = None
path: Optional[str] = None
error: Optional[str] = None
message: Optional[str] = None
folder_name: str | None = None
path: str | None = None
error: str | None = None
message: str | None = None
def to_dict(self):
"""Convert to dict for agent compatibility."""
result = {"status": self.status}
if self.error:
result["error"] = self.error
result["message"] = self.message
@@ -24,25 +25,26 @@ class SetFolderPathResponse:
result["folder_name"] = self.folder_name
if self.path:
result["path"] = self.path
return result
@dataclass
class ListFolderResponse:
"""Response from listing a folder."""
status: str
folder_type: Optional[str] = None
path: Optional[str] = None
entries: Optional[List[str]] = None
count: Optional[int] = None
error: Optional[str] = None
message: Optional[str] = None
folder_type: str | None = None
path: str | None = None
entries: list[str] | None = None
count: int | None = None
error: str | None = None
message: str | None = None
def to_dict(self):
"""Convert to dict for agent compatibility."""
result = {"status": self.status}
if self.error:
result["error"] = self.error
result["message"] = self.message
@@ -55,5 +57,5 @@ class ListFolderResponse:
result["entries"] = self.entries
if self.count is not None:
result["count"] = self.count
return result