rfnry-engine 0.1.0__py3-none-any.whl
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.
- rfnry_engine/__init__.py +152 -0
- rfnry_engine/bundle.py +35 -0
- rfnry_engine/chain.py +37 -0
- rfnry_engine/engine.py +956 -0
- rfnry_engine/errors.py +34 -0
- rfnry_engine/fingerprint.py +41 -0
- rfnry_engine/folders.py +92 -0
- rfnry_engine/frontmatter.py +85 -0
- rfnry_engine/jail.py +24 -0
- rfnry_engine/models.py +388 -0
- rfnry_engine/py.typed +0 -0
- rfnry_engine/records.py +144 -0
- rfnry_engine/refinery/__init__.py +0 -0
- rfnry_engine/refinery/conflicts.py +37 -0
- rfnry_engine/refinery/export.py +155 -0
- rfnry_engine/refinery/holdout.py +14 -0
- rfnry_engine/refinery/judge.py +140 -0
- rfnry_engine/refinery/labels.py +62 -0
- rfnry_engine/refinery/postgres.py +292 -0
- rfnry_engine/refinery/refinery.py +592 -0
- rfnry_engine/refinery/storage.py +80 -0
- rfnry_engine/stop.py +54 -0
- rfnry_engine/tools/__init__.py +0 -0
- rfnry_engine/tools/builtins.py +391 -0
- rfnry_engine/tools/declared.py +77 -0
- rfnry_engine/tools/delegate.py +192 -0
- rfnry_engine/tools/engine_tools.py +84 -0
- rfnry_engine/tools/history.py +205 -0
- rfnry_engine/tools/tools.py +109 -0
- rfnry_engine/tools/workspace.py +654 -0
- rfnry_engine/tree.py +386 -0
- rfnry_engine-0.1.0.dist-info/METADATA +30 -0
- rfnry_engine-0.1.0.dist-info/RECORD +34 -0
- rfnry_engine-0.1.0.dist-info/WHEEL +4 -0
rfnry_engine/__init__.py
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
from rfnry_engine.engine import AgentInfo, Engine
|
|
2
|
+
from rfnry_engine.errors import (
|
|
3
|
+
ConfigurationError,
|
|
4
|
+
DelegationDepthError,
|
|
5
|
+
DelegationLoopError,
|
|
6
|
+
EngineException,
|
|
7
|
+
InputError,
|
|
8
|
+
ModelError,
|
|
9
|
+
NotFoundError,
|
|
10
|
+
RunawayError,
|
|
11
|
+
StorageError,
|
|
12
|
+
)
|
|
13
|
+
from rfnry_engine.jail import Jail
|
|
14
|
+
from rfnry_engine.models import (
|
|
15
|
+
Answer,
|
|
16
|
+
AnswerLike,
|
|
17
|
+
Audio,
|
|
18
|
+
Check,
|
|
19
|
+
CheckAnswer,
|
|
20
|
+
Choice,
|
|
21
|
+
ChoiceAnswer,
|
|
22
|
+
Content,
|
|
23
|
+
Decided,
|
|
24
|
+
DecidedLike,
|
|
25
|
+
DecisionModel,
|
|
26
|
+
Document,
|
|
27
|
+
GenerationModel,
|
|
28
|
+
HistoryLike,
|
|
29
|
+
Image,
|
|
30
|
+
Message,
|
|
31
|
+
Part,
|
|
32
|
+
Question,
|
|
33
|
+
QuestionLike,
|
|
34
|
+
Reply,
|
|
35
|
+
ReplyLike,
|
|
36
|
+
Score,
|
|
37
|
+
ScoreAnswer,
|
|
38
|
+
State,
|
|
39
|
+
StreamingGenerationModel,
|
|
40
|
+
Text,
|
|
41
|
+
ToolCall,
|
|
42
|
+
ToolSpec,
|
|
43
|
+
Usage,
|
|
44
|
+
confidence,
|
|
45
|
+
)
|
|
46
|
+
from rfnry_engine.records import (
|
|
47
|
+
Decision,
|
|
48
|
+
Event,
|
|
49
|
+
Fingerprint,
|
|
50
|
+
Generation,
|
|
51
|
+
Run,
|
|
52
|
+
Step,
|
|
53
|
+
TextDelta,
|
|
54
|
+
ToolCallStarted,
|
|
55
|
+
ToolResultReady,
|
|
56
|
+
)
|
|
57
|
+
from rfnry_engine.refinery.export import Bucket
|
|
58
|
+
from rfnry_engine.refinery.holdout import is_holdout
|
|
59
|
+
from rfnry_engine.refinery.labels import (
|
|
60
|
+
Conflict,
|
|
61
|
+
Exported,
|
|
62
|
+
Label,
|
|
63
|
+
Labeled,
|
|
64
|
+
Outcome,
|
|
65
|
+
Replay,
|
|
66
|
+
Review,
|
|
67
|
+
)
|
|
68
|
+
from rfnry_engine.refinery.postgres import PostgresStorage
|
|
69
|
+
from rfnry_engine.refinery.refinery import Refinery
|
|
70
|
+
from rfnry_engine.refinery.storage import LabelRow, RunRow, Storage
|
|
71
|
+
from rfnry_engine.stop import Stop
|
|
72
|
+
from rfnry_engine.tools.engine_tools import EngineTools
|
|
73
|
+
from rfnry_engine.tools.tools import Tool, Tools
|
|
74
|
+
from rfnry_engine.tools.workspace import Backend, Local, Process, Workspace
|
|
75
|
+
|
|
76
|
+
__version__ = "0.1.0"
|
|
77
|
+
|
|
78
|
+
__all__ = [
|
|
79
|
+
"AgentInfo",
|
|
80
|
+
"Answer",
|
|
81
|
+
"AnswerLike",
|
|
82
|
+
"Bucket",
|
|
83
|
+
"Check",
|
|
84
|
+
"CheckAnswer",
|
|
85
|
+
"Choice",
|
|
86
|
+
"ChoiceAnswer",
|
|
87
|
+
"ConfigurationError",
|
|
88
|
+
"Conflict",
|
|
89
|
+
"Decided",
|
|
90
|
+
"DecidedLike",
|
|
91
|
+
"Decision",
|
|
92
|
+
"DecisionModel",
|
|
93
|
+
"DelegationDepthError",
|
|
94
|
+
"DelegationLoopError",
|
|
95
|
+
"Engine",
|
|
96
|
+
"EngineException",
|
|
97
|
+
"EngineTools",
|
|
98
|
+
"Event",
|
|
99
|
+
"Exported",
|
|
100
|
+
"Fingerprint",
|
|
101
|
+
"Generation",
|
|
102
|
+
"GenerationModel",
|
|
103
|
+
"HistoryLike",
|
|
104
|
+
"InputError",
|
|
105
|
+
"Jail",
|
|
106
|
+
"Label",
|
|
107
|
+
"LabelRow",
|
|
108
|
+
"Labeled",
|
|
109
|
+
"Message",
|
|
110
|
+
"ModelError",
|
|
111
|
+
"NotFoundError",
|
|
112
|
+
"Outcome",
|
|
113
|
+
"PostgresStorage",
|
|
114
|
+
"Question",
|
|
115
|
+
"QuestionLike",
|
|
116
|
+
"Refinery",
|
|
117
|
+
"Replay",
|
|
118
|
+
"Reply",
|
|
119
|
+
"ReplyLike",
|
|
120
|
+
"Review",
|
|
121
|
+
"Run",
|
|
122
|
+
"RunRow",
|
|
123
|
+
"RunawayError",
|
|
124
|
+
"Score",
|
|
125
|
+
"ScoreAnswer",
|
|
126
|
+
"State",
|
|
127
|
+
"Step",
|
|
128
|
+
"Stop",
|
|
129
|
+
"Storage",
|
|
130
|
+
"StorageError",
|
|
131
|
+
"StreamingGenerationModel",
|
|
132
|
+
"TextDelta",
|
|
133
|
+
"Tool",
|
|
134
|
+
"ToolCall",
|
|
135
|
+
"ToolCallStarted",
|
|
136
|
+
"ToolResultReady",
|
|
137
|
+
"ToolSpec",
|
|
138
|
+
"Tools",
|
|
139
|
+
"Usage",
|
|
140
|
+
"Workspace",
|
|
141
|
+
"Backend",
|
|
142
|
+
"Local",
|
|
143
|
+
"Process",
|
|
144
|
+
"confidence",
|
|
145
|
+
"is_holdout",
|
|
146
|
+
"Text",
|
|
147
|
+
"Image",
|
|
148
|
+
"Audio",
|
|
149
|
+
"Document",
|
|
150
|
+
"Part",
|
|
151
|
+
"Content",
|
|
152
|
+
]
|
rfnry_engine/bundle.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from rfnry_engine.models import ToolSpec
|
|
6
|
+
from rfnry_engine.tree import AgentSpec
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _read(path: Path) -> str:
|
|
10
|
+
return path.read_text(encoding="utf-8").strip() if path.is_file() else ""
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def build_bundle(
|
|
14
|
+
spec: AgentSpec,
|
|
15
|
+
*,
|
|
16
|
+
task: str | None,
|
|
17
|
+
tools: list[ToolSpec],
|
|
18
|
+
agents: list[AgentSpec],
|
|
19
|
+
context: str | None,
|
|
20
|
+
) -> str:
|
|
21
|
+
sections = [
|
|
22
|
+
("AGENT", spec.body),
|
|
23
|
+
("TASK", "" if task is None else _read(spec.root / "tasks" / f"{task}.md")),
|
|
24
|
+
("FILES", spec.listing),
|
|
25
|
+
(
|
|
26
|
+
"TOOLS",
|
|
27
|
+
"\n".join(
|
|
28
|
+
f"- {t.name}: {t.description.splitlines()[0] if t.description else ''}"
|
|
29
|
+
for t in tools
|
|
30
|
+
),
|
|
31
|
+
),
|
|
32
|
+
("AGENTS", "\n".join(f"- {a.name}: {a.description}" for a in agents)),
|
|
33
|
+
("CONTEXT", (context or "").strip()),
|
|
34
|
+
]
|
|
35
|
+
return "\n\n".join(f"<<<{label}>>>\n{body}" for label, body in sections if body)
|
rfnry_engine/chain.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import json
|
|
5
|
+
|
|
6
|
+
from rfnry_engine.models import Message, Part, ToolSpec
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def opening(model: str | None, system: str, tools: list[ToolSpec], preload: list[Part]) -> bytes:
|
|
10
|
+
head = {
|
|
11
|
+
"model": model,
|
|
12
|
+
"system": system,
|
|
13
|
+
"tools": [tool.model_dump(mode="json") for tool in tools],
|
|
14
|
+
"preload": [part.model_dump(mode="json") for part in preload],
|
|
15
|
+
}
|
|
16
|
+
return hashlib.sha256(json.dumps(head, sort_keys=True, ensure_ascii=False).encode()).digest()
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def extend(digest: bytes, message: Message) -> bytes:
|
|
20
|
+
said = message.model_dump(mode="json", exclude={"prefix", "usage"}, fallback=repr)
|
|
21
|
+
return hashlib.sha256(
|
|
22
|
+
digest + json.dumps(said, sort_keys=True, ensure_ascii=False).encode()
|
|
23
|
+
).digest()
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def mark(digest: bytes) -> str:
|
|
27
|
+
return digest.hex()[:16]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def settle(history: list[Message], digest: bytes) -> tuple[list[Message], bytes]:
|
|
31
|
+
sent: list[Message] = []
|
|
32
|
+
for message in history:
|
|
33
|
+
if message.reasoning is not None and message.prefix != mark(digest):
|
|
34
|
+
message = message.model_copy(update={"reasoning": None})
|
|
35
|
+
sent.append(message)
|
|
36
|
+
digest = extend(digest, message)
|
|
37
|
+
return sent, digest
|