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.
@@ -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