campaign-rpg-engine 1.0.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.
- campaign_rpg_engine/__init__.py +210 -0
- campaign_rpg_engine/action_outcome.py +19 -0
- campaign_rpg_engine/actions/__init__.py +15 -0
- campaign_rpg_engine/actions/emote.py +24 -0
- campaign_rpg_engine/actions/interact.py +621 -0
- campaign_rpg_engine/actions/move.py +350 -0
- campaign_rpg_engine/actions/speak.py +19 -0
- campaign_rpg_engine/agent.py +98 -0
- campaign_rpg_engine/area.py +384 -0
- campaign_rpg_engine/area_edit.py +1308 -0
- campaign_rpg_engine/area_edit_parse.py +38 -0
- campaign_rpg_engine/area_event.py +29 -0
- campaign_rpg_engine/compound_arg_parse.py +110 -0
- campaign_rpg_engine/coordinates.py +54 -0
- campaign_rpg_engine/emote_phrasing.py +40 -0
- campaign_rpg_engine/game_profile.py +177 -0
- campaign_rpg_engine/grid.py +9 -0
- campaign_rpg_engine/interact_templates.py +71 -0
- campaign_rpg_engine/interaction_handlers/__init__.py +24 -0
- campaign_rpg_engine/interaction_handlers/base.py +27 -0
- campaign_rpg_engine/interaction_handlers/registry.py +111 -0
- campaign_rpg_engine/llm/__init__.py +4 -0
- campaign_rpg_engine/llm/client.py +143 -0
- campaign_rpg_engine/llm/memory_summary.py +88 -0
- campaign_rpg_engine/llm/prompt.py +44 -0
- campaign_rpg_engine/llm/prompt_context.py +258 -0
- campaign_rpg_engine/llm/schemas.py +149 -0
- campaign_rpg_engine/llm/text_truncation.py +111 -0
- campaign_rpg_engine/llm/token_estimate.py +16 -0
- campaign_rpg_engine/llm/types.py +21 -0
- campaign_rpg_engine/log_utils/__init__.py +14 -0
- campaign_rpg_engine/log_utils/logger.py +152 -0
- campaign_rpg_engine/lorebook/__init__.py +29 -0
- campaign_rpg_engine/lorebook/factory.py +37 -0
- campaign_rpg_engine/lorebook/import_st.py +70 -0
- campaign_rpg_engine/lorebook/listing.py +17 -0
- campaign_rpg_engine/lorebook/matcher.py +111 -0
- campaign_rpg_engine/lorebook/models.py +123 -0
- campaign_rpg_engine/lorebook/scan_config.py +90 -0
- campaign_rpg_engine/lorebook/st_defaults.py +99 -0
- campaign_rpg_engine/memory.py +156 -0
- campaign_rpg_engine/memory_modules/__init__.py +28 -0
- campaign_rpg_engine/memory_modules/base.py +85 -0
- campaign_rpg_engine/memory_modules/consolidation_runner.py +179 -0
- campaign_rpg_engine/memory_modules/formatting/__init__.py +34 -0
- campaign_rpg_engine/memory_modules/formatting/common.py +93 -0
- campaign_rpg_engine/memory_modules/formatting/salient.py +34 -0
- campaign_rpg_engine/memory_modules/formatting/summary.py +32 -0
- campaign_rpg_engine/memory_modules/loader.py +106 -0
- campaign_rpg_engine/memory_modules/recent_turns.py +100 -0
- campaign_rpg_engine/memory_modules/registry.py +267 -0
- campaign_rpg_engine/memory_modules/rolling_summary.py +297 -0
- campaign_rpg_engine/memory_modules/salient_turns.py +286 -0
- campaign_rpg_engine/memory_modules/serialization.py +101 -0
- campaign_rpg_engine/move_target.py +288 -0
- campaign_rpg_engine/object.py +135 -0
- campaign_rpg_engine/object_action.py +42 -0
- campaign_rpg_engine/observations.py +121 -0
- campaign_rpg_engine/occupancy.py +244 -0
- campaign_rpg_engine/pathfinding.py +155 -0
- campaign_rpg_engine/pathing.py +57 -0
- campaign_rpg_engine/perception.py +431 -0
- campaign_rpg_engine/prompt_blocks.py +462 -0
- campaign_rpg_engine/prompt_template.py +57 -0
- campaign_rpg_engine/reserved_names.py +80 -0
- campaign_rpg_engine/session.py +1149 -0
- campaign_rpg_engine/session_area_edit.py +254 -0
- campaign_rpg_engine/session_persistence.py +351 -0
- campaign_rpg_engine/simulation.py +288 -0
- campaign_rpg_engine/snapshot.py +213 -0
- campaign_rpg_engine/triggers.py +119 -0
- campaign_rpg_engine/turn_record.py +33 -0
- campaign_rpg_engine/utils/__init__.py +6 -0
- campaign_rpg_engine/vision_bearing.py +94 -0
- campaign_rpg_engine/world_edit_api.py +460 -0
- campaign_rpg_engine-1.0.0.dist-info/METADATA +114 -0
- campaign_rpg_engine-1.0.0.dist-info/RECORD +81 -0
- campaign_rpg_engine-1.0.0.dist-info/WHEEL +4 -0
- campaign_rpg_engine-1.0.0.dist-info/licenses/LICENSE +21 -0
- profiles/default_compound/few_shots.txt +63 -0
- profiles/default_compound/template.txt +17 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"""
|
|
2
|
+
campaign_rpg_engine — public engine API for CampAIgn-RPG-Engine (1.0.0).
|
|
3
|
+
|
|
4
|
+
Import from this package in application code.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import tomllib
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
from campaign_rpg_engine.agent import Agent
|
|
13
|
+
from campaign_rpg_engine.area import Area, GridBounds, create_area, create_initial_area
|
|
14
|
+
from campaign_rpg_engine.area_edit import (
|
|
15
|
+
delete_agent_by_id,
|
|
16
|
+
format_agents_list,
|
|
17
|
+
format_full_list,
|
|
18
|
+
format_objects_list,
|
|
19
|
+
parse_position,
|
|
20
|
+
)
|
|
21
|
+
from campaign_rpg_engine.game_profile import GameProfile, default_compound_profile, load_profile
|
|
22
|
+
from campaign_rpg_engine.interact_templates import interact_template_var_help
|
|
23
|
+
from campaign_rpg_engine.llm.client import LLMParseError, get_compound_turn
|
|
24
|
+
from campaign_rpg_engine.llm.prompt_context import PromptContext, build_prompt_context
|
|
25
|
+
from campaign_rpg_engine.llm.schemas import AgentCompoundTurn
|
|
26
|
+
from campaign_rpg_engine.llm.token_estimate import estimate_prompt_tokens
|
|
27
|
+
from campaign_rpg_engine.llm.types import LLMResponse
|
|
28
|
+
from campaign_rpg_engine.lorebook import (
|
|
29
|
+
DEFAULT_LOREBOOK_CHAR_BUDGET,
|
|
30
|
+
Lorebook,
|
|
31
|
+
LoreEntry,
|
|
32
|
+
LorebookScanConfig,
|
|
33
|
+
ST_ENTRY_DEFAULTS,
|
|
34
|
+
build_scan_corpus,
|
|
35
|
+
derive_lorebook_id_from_filename,
|
|
36
|
+
describe_scan_sources,
|
|
37
|
+
load_lorebook_from_dict,
|
|
38
|
+
load_lorebook_from_path,
|
|
39
|
+
match_lorebook_entries,
|
|
40
|
+
new_st_entry_dict,
|
|
41
|
+
render_lorebook,
|
|
42
|
+
with_st_entry_defaults,
|
|
43
|
+
)
|
|
44
|
+
from campaign_rpg_engine.lorebook.factory import create_empty_lorebook
|
|
45
|
+
from campaign_rpg_engine.memory import TurnRecord
|
|
46
|
+
from campaign_rpg_engine.memory_modules.base import MemoryModule
|
|
47
|
+
from campaign_rpg_engine.memory_modules.recent_turns import DEFAULT_WINDOW, MAX_WINDOW, MIN_WINDOW
|
|
48
|
+
from campaign_rpg_engine.memory_modules.registry import (
|
|
49
|
+
clear_custom_memory_registrations,
|
|
50
|
+
default_module_id,
|
|
51
|
+
format_memory_modules_list,
|
|
52
|
+
get_custom_module_metadata,
|
|
53
|
+
loaded_module_ids,
|
|
54
|
+
register_memory_module_from_path,
|
|
55
|
+
register_memory_module_from_source,
|
|
56
|
+
)
|
|
57
|
+
from campaign_rpg_engine.memory_modules.rolling_summary import (
|
|
58
|
+
DEFAULT_MAX_SUMMARY_CHARS,
|
|
59
|
+
DEFAULT_SUMMARY_INTERVAL,
|
|
60
|
+
DEFAULT_SUMMARY_TAIL,
|
|
61
|
+
MAX_MAX_SUMMARY_CHARS,
|
|
62
|
+
MIN_MAX_SUMMARY_CHARS,
|
|
63
|
+
MIN_SUMMARY_INTERVAL,
|
|
64
|
+
MIN_SUMMARY_TAIL,
|
|
65
|
+
RollingSummaryModule,
|
|
66
|
+
)
|
|
67
|
+
from campaign_rpg_engine.memory_modules.salient_turns import (
|
|
68
|
+
DEFAULT_CHAR_BUDGET,
|
|
69
|
+
MAX_CHAR_BUDGET,
|
|
70
|
+
MIN_CHAR_BUDGET,
|
|
71
|
+
)
|
|
72
|
+
from campaign_rpg_engine.object import Object, object_footprint_tiles
|
|
73
|
+
from campaign_rpg_engine.object_action import ActionKind, ObjectAction
|
|
74
|
+
from campaign_rpg_engine.perception import build_passive_vision
|
|
75
|
+
from campaign_rpg_engine.prompt_blocks import (
|
|
76
|
+
PromptBlock,
|
|
77
|
+
default_prompt_blocks,
|
|
78
|
+
enrich_blocks_with_previews,
|
|
79
|
+
prompt_block_catalog,
|
|
80
|
+
prompt_blocks_from_dicts,
|
|
81
|
+
prompt_slot_catalog,
|
|
82
|
+
validate_prompt_blocks,
|
|
83
|
+
)
|
|
84
|
+
from campaign_rpg_engine.session import Session, SessionResult, TurnResult
|
|
85
|
+
from campaign_rpg_engine.session_area_edit import (
|
|
86
|
+
AreaMutationResult,
|
|
87
|
+
delete_area_by_id,
|
|
88
|
+
)
|
|
89
|
+
from campaign_rpg_engine.simulation import run_compound_turn
|
|
90
|
+
from campaign_rpg_engine.session_persistence import build_save_snapshot, load_session_from_snapshot
|
|
91
|
+
from campaign_rpg_engine.interaction_handlers import (
|
|
92
|
+
format_handlers_list,
|
|
93
|
+
get_handler_registration,
|
|
94
|
+
is_handler_registered,
|
|
95
|
+
list_registered_handlers,
|
|
96
|
+
register_interaction_handler,
|
|
97
|
+
run_interaction_handler,
|
|
98
|
+
)
|
|
99
|
+
from campaign_rpg_engine.snapshot import DEFAULT_AREA_ID, build_area_snapshot, build_session_snapshot
|
|
100
|
+
from campaign_rpg_engine.world_edit_api import WorldMutationResult
|
|
101
|
+
|
|
102
|
+
__all__ = [
|
|
103
|
+
"__version__",
|
|
104
|
+
"ActionKind",
|
|
105
|
+
"Agent",
|
|
106
|
+
"AgentCompoundTurn",
|
|
107
|
+
"Area",
|
|
108
|
+
"AreaMutationResult",
|
|
109
|
+
"DEFAULT_AREA_ID",
|
|
110
|
+
"DEFAULT_CHAR_BUDGET",
|
|
111
|
+
"DEFAULT_LOREBOOK_CHAR_BUDGET",
|
|
112
|
+
"DEFAULT_MAX_SUMMARY_CHARS",
|
|
113
|
+
"DEFAULT_SUMMARY_INTERVAL",
|
|
114
|
+
"DEFAULT_SUMMARY_TAIL",
|
|
115
|
+
"DEFAULT_WINDOW",
|
|
116
|
+
"GameProfile",
|
|
117
|
+
"GridBounds",
|
|
118
|
+
"LLMParseError",
|
|
119
|
+
"LLMResponse",
|
|
120
|
+
"Lorebook",
|
|
121
|
+
"LoreEntry",
|
|
122
|
+
"LorebookScanConfig",
|
|
123
|
+
"MAX_CHAR_BUDGET",
|
|
124
|
+
"MAX_MAX_SUMMARY_CHARS",
|
|
125
|
+
"MAX_WINDOW",
|
|
126
|
+
"MemoryModule",
|
|
127
|
+
"MIN_CHAR_BUDGET",
|
|
128
|
+
"MIN_MAX_SUMMARY_CHARS",
|
|
129
|
+
"MIN_SUMMARY_INTERVAL",
|
|
130
|
+
"MIN_SUMMARY_TAIL",
|
|
131
|
+
"MIN_WINDOW",
|
|
132
|
+
"Object",
|
|
133
|
+
"ObjectAction",
|
|
134
|
+
"PromptBlock",
|
|
135
|
+
"PromptContext",
|
|
136
|
+
"RollingSummaryModule",
|
|
137
|
+
"Session",
|
|
138
|
+
"SessionResult",
|
|
139
|
+
"ST_ENTRY_DEFAULTS",
|
|
140
|
+
"TurnRecord",
|
|
141
|
+
"TurnResult",
|
|
142
|
+
"WorldMutationResult",
|
|
143
|
+
"build_area_snapshot",
|
|
144
|
+
"build_passive_vision",
|
|
145
|
+
"build_prompt_context",
|
|
146
|
+
"build_save_snapshot",
|
|
147
|
+
"build_scan_corpus",
|
|
148
|
+
"build_session_snapshot",
|
|
149
|
+
"clear_custom_memory_registrations",
|
|
150
|
+
"create_area",
|
|
151
|
+
"create_empty_lorebook",
|
|
152
|
+
"create_initial_area",
|
|
153
|
+
"default_compound_profile",
|
|
154
|
+
"default_module_id",
|
|
155
|
+
"default_prompt_blocks",
|
|
156
|
+
"delete_area_by_id",
|
|
157
|
+
"derive_lorebook_id_from_filename",
|
|
158
|
+
"describe_scan_sources",
|
|
159
|
+
"enrich_blocks_with_previews",
|
|
160
|
+
"estimate_prompt_tokens",
|
|
161
|
+
"format_agents_list",
|
|
162
|
+
"format_full_list",
|
|
163
|
+
"format_handlers_list",
|
|
164
|
+
"format_memory_modules_list",
|
|
165
|
+
"format_objects_list",
|
|
166
|
+
"get_compound_turn",
|
|
167
|
+
"get_custom_module_metadata",
|
|
168
|
+
"get_handler_registration",
|
|
169
|
+
"interact_template_var_help",
|
|
170
|
+
"is_handler_registered",
|
|
171
|
+
"list_registered_handlers",
|
|
172
|
+
"load_lorebook_from_dict",
|
|
173
|
+
"load_lorebook_from_path",
|
|
174
|
+
"load_profile",
|
|
175
|
+
"load_session_from_snapshot",
|
|
176
|
+
"loaded_module_ids",
|
|
177
|
+
"match_lorebook_entries",
|
|
178
|
+
"new_st_entry_dict",
|
|
179
|
+
"object_footprint_tiles",
|
|
180
|
+
"parse_position",
|
|
181
|
+
"prompt_block_catalog",
|
|
182
|
+
"prompt_blocks_from_dicts",
|
|
183
|
+
"prompt_slot_catalog",
|
|
184
|
+
"register_interaction_handler",
|
|
185
|
+
"register_memory_module_from_path",
|
|
186
|
+
"register_memory_module_from_source",
|
|
187
|
+
"render_lorebook",
|
|
188
|
+
"run_compound_turn",
|
|
189
|
+
"run_interaction_handler",
|
|
190
|
+
"validate_prompt_blocks",
|
|
191
|
+
"with_st_entry_defaults",
|
|
192
|
+
]
|
|
193
|
+
|
|
194
|
+
_ROOT = Path(__file__).resolve().parent.parent
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def _read_version() -> str:
|
|
198
|
+
try:
|
|
199
|
+
from importlib.metadata import version as _pkg_version
|
|
200
|
+
|
|
201
|
+
return _pkg_version("campaign-rpg-engine")
|
|
202
|
+
except Exception:
|
|
203
|
+
pass
|
|
204
|
+
pyproject_path = _ROOT / "pyproject.toml"
|
|
205
|
+
if pyproject_path.is_file():
|
|
206
|
+
return tomllib.loads(pyproject_path.read_text(encoding="utf-8"))["project"]["version"]
|
|
207
|
+
return "0.0.0"
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
__version__ = _read_version()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Action result types — first-person result for the actor, passive for observers."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass(frozen=True)
|
|
8
|
+
class ActionOutcome:
|
|
9
|
+
"""Result of executing one action."""
|
|
10
|
+
|
|
11
|
+
result: str
|
|
12
|
+
"""First-person feedback for the acting agent (stored in TurnRecord)."""
|
|
13
|
+
|
|
14
|
+
passive_result: str = ""
|
|
15
|
+
"""
|
|
16
|
+
Third-person summary for other agents' passive vision.
|
|
17
|
+
|
|
18
|
+
Empty when the action did not succeed or has nothing observable.
|
|
19
|
+
"""
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Actions package.
|
|
3
|
+
|
|
4
|
+
Contains move, speak, and interact implementations. Look is implemented in
|
|
5
|
+
perception.py (perform_look) because it shares vision/memory logic.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from campaign_rpg_engine.actions.emote import emote as do_emote
|
|
10
|
+
from campaign_rpg_engine.actions.interact import interact as do_interact
|
|
11
|
+
from campaign_rpg_engine.actions.interact import interact_phases as do_interact_phases
|
|
12
|
+
from campaign_rpg_engine.actions.move import move as do_move
|
|
13
|
+
from campaign_rpg_engine.actions.speak import speak as do_speak
|
|
14
|
+
|
|
15
|
+
__all__ = ["do_emote", "do_interact", "do_interact_phases", "do_move", "do_speak"]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Emote turn action — gesture at an entity or free-text target (V0.4.2)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from campaign_rpg_engine.action_outcome import ActionOutcome
|
|
6
|
+
from campaign_rpg_engine.agent import Agent
|
|
7
|
+
from campaign_rpg_engine.area import Area
|
|
8
|
+
from campaign_rpg_engine.emote_phrasing import (
|
|
9
|
+
emote_target_phrase_for_actor,
|
|
10
|
+
emote_target_phrase_neutral,
|
|
11
|
+
format_emote_line,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def emote(agent: Agent, area: Area, target: str, action_name: str) -> ActionOutcome:
|
|
16
|
+
"""Perform a past-tense emote directed at *target*."""
|
|
17
|
+
verb = action_name.strip()
|
|
18
|
+
target_id = target.strip()
|
|
19
|
+
actor_phrase = emote_target_phrase_for_actor(area, agent, target_id)
|
|
20
|
+
neutral_phrase = emote_target_phrase_neutral(area, target_id)
|
|
21
|
+
return ActionOutcome(
|
|
22
|
+
result=f"You {verb} at {actor_phrase}.",
|
|
23
|
+
passive_result=format_emote_line(agent.name, verb, neutral_phrase),
|
|
24
|
+
)
|