revengelibrary 0.1.5__tar.gz → 0.1.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/PKG-INFO +2 -2
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/pyproject.toml +2 -2
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary/__init__.py +6 -1
- revengelibrary-0.1.6/revengelibrary/agents.py +60 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary/chat.py +8 -1
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary/cli.py +41 -4
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary.egg-info/PKG-INFO +2 -2
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary.egg-info/SOURCES.txt +1 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/LICENSE +0 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/MANIFEST.in +0 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/README.md +0 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary/memory_store.json +0 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary.egg-info/dependency_links.txt +0 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary.egg-info/entry_points.txt +0 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary.egg-info/requires.txt +0 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/revengelibrary.egg-info/top_level.txt +0 -0
- {revengelibrary-0.1.5 → revengelibrary-0.1.6}/setup.cfg +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: revengelibrary
|
|
3
|
-
Version: 0.1.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.1.6
|
|
4
|
+
Summary: Не нейросеть
|
|
5
5
|
Author: revengebibliotek contributors
|
|
6
6
|
License: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/example/revengelibrary
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "revengelibrary"
|
|
7
|
-
version = "0.1.
|
|
8
|
-
description = "
|
|
7
|
+
version = "0.1.6"
|
|
8
|
+
description = "Не нейросеть"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
11
11
|
license = { text = "MIT" }
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from .agents import DEFAULT_AGENT, AgentProfile, get_agent, list_agents
|
|
1
2
|
from .chat import (
|
|
2
3
|
APIError,
|
|
3
4
|
DEFAULT_MEMORY_FILE,
|
|
@@ -12,5 +13,9 @@ __all__ = [
|
|
|
12
13
|
"DEFAULT_OPENROUTER_API_KEY",
|
|
13
14
|
"DEFAULT_MODEL",
|
|
14
15
|
"DEFAULT_MEMORY_FILE",
|
|
16
|
+
"DEFAULT_AGENT",
|
|
17
|
+
"AgentProfile",
|
|
18
|
+
"list_agents",
|
|
19
|
+
"get_agent",
|
|
15
20
|
]
|
|
16
|
-
__version__ = "0.1.
|
|
21
|
+
__version__ = "0.1.6"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
DEFAULT_AGENT = "general"
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass(frozen=True)
|
|
9
|
+
class AgentProfile:
|
|
10
|
+
name: str
|
|
11
|
+
title: str
|
|
12
|
+
system_prompt: str
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
AGENT_PROFILES: dict[str, AgentProfile] = {
|
|
16
|
+
"general": AgentProfile(
|
|
17
|
+
name="general",
|
|
18
|
+
title="Универсальный ассистент",
|
|
19
|
+
system_prompt="You are a helpful assistant.",
|
|
20
|
+
),
|
|
21
|
+
"frontend": AgentProfile(
|
|
22
|
+
name="frontend",
|
|
23
|
+
title="Senior Frontend + Mobile Design",
|
|
24
|
+
system_prompt=(
|
|
25
|
+
"Ты senior frontend-разработчик с сильной экспертизой в дизайне "
|
|
26
|
+
"мобильных приложений. Пиши ответы как практический инженер: "
|
|
27
|
+
"mobile-first, доступность, понятная архитектура компонентов, "
|
|
28
|
+
"чистый UI/UX, адаптив под iOS/Android, хорошая типографика и "
|
|
29
|
+
"согласованная дизайн-система."
|
|
30
|
+
),
|
|
31
|
+
),
|
|
32
|
+
"backend": AgentProfile(
|
|
33
|
+
name="backend",
|
|
34
|
+
title="Backend Engineer",
|
|
35
|
+
system_prompt=(
|
|
36
|
+
"Ты senior backend-разработчик. Предлагай надежные API-контракты, "
|
|
37
|
+
"чистую архитектуру, контроль ошибок, безопасность и масштабируемость."
|
|
38
|
+
),
|
|
39
|
+
),
|
|
40
|
+
"qa": AgentProfile(
|
|
41
|
+
name="qa",
|
|
42
|
+
title="QA Engineer",
|
|
43
|
+
system_prompt=(
|
|
44
|
+
"Ты senior QA-инженер. Фокус: тест-кейсы, граничные условия, "
|
|
45
|
+
"регрессия, воспроизводимость багов и риски релиза."
|
|
46
|
+
),
|
|
47
|
+
),
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def list_agents() -> list[AgentProfile]:
|
|
52
|
+
return list(AGENT_PROFILES.values())
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def get_agent(agent_name: str) -> AgentProfile:
|
|
56
|
+
name = (agent_name or DEFAULT_AGENT).strip().lower()
|
|
57
|
+
if name not in AGENT_PROFILES:
|
|
58
|
+
available = ", ".join(sorted(AGENT_PROFILES))
|
|
59
|
+
raise ValueError(f"Unknown agent '{agent_name}'. Available: {available}")
|
|
60
|
+
return AGENT_PROFILES[name]
|
|
@@ -176,7 +176,7 @@ class FreeNeuroChatClient:
|
|
|
176
176
|
value = file_path if file_path is not None else self.memory_file
|
|
177
177
|
if not value:
|
|
178
178
|
return None
|
|
179
|
-
return
|
|
179
|
+
return _normalize_memory_path(value)
|
|
180
180
|
|
|
181
181
|
@staticmethod
|
|
182
182
|
def _normalize_messages(data: Any) -> list[dict[str, str]]:
|
|
@@ -205,3 +205,10 @@ class FreeNeuroChatClient:
|
|
|
205
205
|
return content
|
|
206
206
|
except (KeyError, TypeError, IndexError):
|
|
207
207
|
raise APIError(f"Unexpected API response: {data}") from None
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def _normalize_memory_path(value: str) -> Path:
|
|
211
|
+
path = Path(value).expanduser()
|
|
212
|
+
if path.suffix:
|
|
213
|
+
return path
|
|
214
|
+
return path.with_suffix(".json")
|
|
@@ -2,7 +2,9 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import argparse
|
|
4
4
|
import os
|
|
5
|
+
from pathlib import Path
|
|
5
6
|
|
|
7
|
+
from .agents import DEFAULT_AGENT, get_agent, list_agents
|
|
6
8
|
from .chat import (
|
|
7
9
|
APIError,
|
|
8
10
|
DEFAULT_MEMORY_FILE,
|
|
@@ -29,8 +31,18 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
29
31
|
)
|
|
30
32
|
parser.add_argument(
|
|
31
33
|
"--system",
|
|
32
|
-
default=
|
|
33
|
-
help="System prompt.",
|
|
34
|
+
default=None,
|
|
35
|
+
help="System prompt override. If omitted, selected agent prompt is used.",
|
|
36
|
+
)
|
|
37
|
+
parser.add_argument(
|
|
38
|
+
"--agent",
|
|
39
|
+
default=os.getenv("REVENGELIBRARY_AGENT", DEFAULT_AGENT),
|
|
40
|
+
help="Agent role. Use --list-agents to view available roles.",
|
|
41
|
+
)
|
|
42
|
+
parser.add_argument(
|
|
43
|
+
"--list-agents",
|
|
44
|
+
action="store_true",
|
|
45
|
+
help="Show available agent roles and exit.",
|
|
34
46
|
)
|
|
35
47
|
parser.add_argument(
|
|
36
48
|
"--memory-file",
|
|
@@ -47,11 +59,24 @@ def main() -> int:
|
|
|
47
59
|
parser = _build_parser()
|
|
48
60
|
args = parser.parse_args()
|
|
49
61
|
|
|
62
|
+
if args.list_agents:
|
|
63
|
+
for profile in list_agents():
|
|
64
|
+
print(f"{profile.name}: {profile.title}")
|
|
65
|
+
return 0
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
agent = get_agent(args.agent)
|
|
69
|
+
except ValueError as exc:
|
|
70
|
+
parser.error(str(exc))
|
|
71
|
+
|
|
72
|
+
system_prompt = args.system if args.system else agent.system_prompt
|
|
73
|
+
memory_file = _agent_memory_file(args.memory_file, agent.name)
|
|
74
|
+
|
|
50
75
|
client = FreeNeuroChatClient(
|
|
51
76
|
api_key=args.api_key or DEFAULT_OPENROUTER_API_KEY,
|
|
52
77
|
model=args.model,
|
|
53
|
-
system_prompt=
|
|
54
|
-
memory_file=
|
|
78
|
+
system_prompt=system_prompt,
|
|
79
|
+
memory_file=memory_file,
|
|
55
80
|
)
|
|
56
81
|
|
|
57
82
|
print(
|
|
@@ -89,5 +114,17 @@ def main() -> int:
|
|
|
89
114
|
print(f"unexpected error: {exc}")
|
|
90
115
|
|
|
91
116
|
|
|
117
|
+
def _agent_memory_file(memory_file: str | None, agent_name: str) -> str | None:
|
|
118
|
+
if not memory_file:
|
|
119
|
+
return None
|
|
120
|
+
if agent_name == DEFAULT_AGENT:
|
|
121
|
+
return memory_file
|
|
122
|
+
|
|
123
|
+
path = Path(memory_file).expanduser()
|
|
124
|
+
suffix = path.suffix or ".json"
|
|
125
|
+
stem = path.stem if path.suffix else path.name
|
|
126
|
+
return str(path.with_name(f"{stem}__{agent_name}{suffix}"))
|
|
127
|
+
|
|
128
|
+
|
|
92
129
|
if __name__ == "__main__":
|
|
93
130
|
raise SystemExit(main())
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: revengelibrary
|
|
3
|
-
Version: 0.1.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 0.1.6
|
|
4
|
+
Summary: Не нейросеть
|
|
5
5
|
Author: revengebibliotek contributors
|
|
6
6
|
License: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/example/revengelibrary
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|