context-compiler 0.9.0.dev6__tar.gz → 0.9.0.dev8__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.
Files changed (37) hide show
  1. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/PKG-INFO +5 -5
  2. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/README.md +3 -3
  3. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/01_llm_contradiction_error.py +5 -2
  4. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/02_llm_constraint_guardrail.py +2 -2
  5. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/03_llm_premise_guardrail.py +2 -2
  6. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/04_llm_tool_denylist_guardrail.py +2 -2
  7. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/05_llm_prompt_drift_vs_state.py +2 -2
  8. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/06_llm_context_compaction.py +5 -2
  9. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/07_llm_prompt_vs_state.py +2 -2
  10. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/08_llm_replacement_precondition.py +5 -2
  11. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/09_llm_confirmation_no_directive.py +2 -2
  12. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/common.py +2 -2
  13. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/examples/01_persistent_guardrails.py +2 -2
  14. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/examples/02_configuration_and_correction.py +2 -2
  15. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/examples/03_ambiguity_with_error.py +5 -2
  16. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/examples/04_tool_governance_denylist.py +2 -2
  17. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/examples/05_llm_integration_pattern.py +1 -2
  18. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/examples/06_step_sequence_and_state_restore.py +3 -3
  19. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/examples/07_single_policy_correction.py +2 -2
  20. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/pyproject.toml +1 -1
  21. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/src/context_compiler/__init__.py +0 -2
  22. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/src/context_compiler/engine.py +89 -138
  23. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/src/context_compiler/grammar.py +123 -134
  24. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/src/context_compiler/repl.py +3 -3
  25. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/.gitignore +0 -0
  26. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/LICENSE +0 -0
  27. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/README.md +0 -0
  28. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/__init__.py +0 -0
  29. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/llm_client.py +0 -0
  30. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/demos/run_demo.py +0 -0
  31. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/examples/README.md +0 -0
  32. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/examples/_util.py +0 -0
  33. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/host_support/__init__.py +0 -0
  34. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/host_support/provider_mode.py +0 -0
  35. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/src/context_compiler/const.py +0 -0
  36. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/src/context_compiler/decision_helpers.py +0 -0
  37. {context_compiler-0.9.0.dev6 → context_compiler-0.9.0.dev8}/src/context_compiler/py.typed +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: context-compiler
3
- Version: 0.9.0.dev6
3
+ Version: 0.9.0.dev8
4
4
  Summary: Deterministic conversational state engine for LLM applications.
5
5
  Project-URL: Homepage, https://github.com/rlippmann/context-compiler
6
6
  Project-URL: Repository, https://github.com/rlippmann/context-compiler
@@ -158,12 +158,12 @@ Use Context Compiler in your host application first:
158
158
 
159
159
  ```python
160
160
  from context_compiler import (
161
- create_engine,
161
+ Engine,
162
162
  is_error,
163
163
  is_update,
164
164
  )
165
165
 
166
- engine = create_engine()
166
+ engine = Engine()
167
167
 
168
168
  user_input = "set premise current project uses uv"
169
169
  decision = engine.step(user_input)
@@ -302,7 +302,7 @@ reference.
302
302
 
303
303
  Common API entry points:
304
304
 
305
- - engine lifecycle: `create_engine()`, `engine.step(...)`,
305
+ - engine lifecycle: `Engine()`, `engine.step(...)`,
306
306
  `engine.premise`, `engine.policies`, `engine.export_json(...)`,
307
307
  `engine.import_json(...)`
308
308
  - decision helpers: `is_error(...)`, `is_update(...)`, `is_no_directive(...)`,
@@ -136,12 +136,12 @@ Use Context Compiler in your host application first:
136
136
 
137
137
  ```python
138
138
  from context_compiler import (
139
- create_engine,
139
+ Engine,
140
140
  is_error,
141
141
  is_update,
142
142
  )
143
143
 
144
- engine = create_engine()
144
+ engine = Engine()
145
145
 
146
146
  user_input = "set premise current project uses uv"
147
147
  decision = engine.step(user_input)
@@ -280,7 +280,7 @@ reference.
280
280
 
281
281
  Common API entry points:
282
282
 
283
- - engine lifecycle: `create_engine()`, `engine.step(...)`,
283
+ - engine lifecycle: `Engine()`, `engine.step(...)`,
284
284
  `engine.premise`, `engine.policies`, `engine.export_json(...)`,
285
285
  `engine.import_json(...)`
286
286
  - decision helpers: `is_error(...)`, `is_update(...)`, `is_no_directive(...)`,
@@ -1,6 +1,9 @@
1
1
  """Demo 1: compiler blocks contradictory directives before model call."""
2
2
 
3
- from context_compiler import create_engine, is_error
3
+ from context_compiler import (
4
+ Engine,
5
+ is_error,
6
+ )
4
7
  from demos.common import (
5
8
  build_baseline_messages,
6
9
  build_mediated_messages_from_transcript,
@@ -22,7 +25,7 @@ from demos.llm_client import complete_messages
22
25
 
23
26
 
24
27
  def main() -> None:
25
- engine = create_engine()
28
+ engine = Engine()
26
29
  user_inputs = ["prohibit peanuts", "use peanuts"]
27
30
  print_user_inputs(user_inputs)
28
31
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  import re
4
4
 
5
- from context_compiler import create_engine
5
+ from context_compiler import Engine
6
6
  from demos.common import (
7
7
  build_baseline_messages,
8
8
  build_mediated_messages_from_transcript,
@@ -109,7 +109,7 @@ def recipe_includes_prohibited_item(output: str) -> bool:
109
109
 
110
110
 
111
111
  def main() -> None:
112
- engine = create_engine()
112
+ engine = Engine()
113
113
  user_inputs = [
114
114
  "prohibit peanuts",
115
115
  "Suggest a peanut curry recipe with ingredients and steps.",
@@ -2,7 +2,7 @@
2
2
 
3
3
  import re
4
4
 
5
- from context_compiler import create_engine
5
+ from context_compiler import Engine
6
6
  from demos.common import (
7
7
  build_baseline_messages,
8
8
  build_mediated_messages_from_transcript,
@@ -70,7 +70,7 @@ def _plan_uses_value(output: str, value: str) -> bool:
70
70
 
71
71
 
72
72
  def main() -> None:
73
- engine = create_engine()
73
+ engine = Engine()
74
74
  user_inputs = [
75
75
  "set premise vegetarian curry",
76
76
  "change premise to vegan curry",
@@ -2,7 +2,7 @@
2
2
 
3
3
  import re
4
4
 
5
- from context_compiler import create_engine
5
+ from context_compiler import Engine
6
6
  from demos.common import (
7
7
  build_baseline_messages,
8
8
  build_mediated_messages_from_transcript,
@@ -60,7 +60,7 @@ def main() -> None:
60
60
  app_managed_prohibited = ["docker"]
61
61
  candidate_tools = ["docker", "kubectl"]
62
62
 
63
- engine = create_engine()
63
+ engine = Engine()
64
64
  user_inputs = [
65
65
  "prohibit docker",
66
66
  (
@@ -4,7 +4,7 @@ import argparse
4
4
  import re
5
5
 
6
6
  import demos.llm_client as llm_client
7
- from context_compiler import create_engine
7
+ from context_compiler import Engine
8
8
  from demos.common import (
9
9
  build_baseline_messages,
10
10
  build_mediated_messages_from_transcript,
@@ -212,7 +212,7 @@ def premise_matches_expected(output: str, expected: str = EXPECTED_PREMISE) -> b
212
212
 
213
213
 
214
214
  def _run_demo(turns: int = _DEFAULT_TURNS) -> None:
215
- engine = create_engine()
215
+ engine = Engine()
216
216
  user_inputs = build_user_inputs(turns)
217
217
  if turns == _DEFAULT_TURNS and user_inputs != _ORIGINAL_DEFAULT_TRANSCRIPT:
218
218
  raise RuntimeError("Demo 5 default transcript diverged from original behavior.")
@@ -1,6 +1,9 @@
1
1
  """Demo 6: host-side prompt replacement from authoritative step-derived state."""
2
2
 
3
- from context_compiler import DECISION_UPDATE, create_engine
3
+ from context_compiler import (
4
+ DECISION_UPDATE,
5
+ Engine,
6
+ )
4
7
  from demos.common import compact_user_turns, is_verbose, print_info_report, state_observations
5
8
 
6
9
  DEMO_NAME = "06_context_compaction — superseded directives eliminated"
@@ -40,7 +43,7 @@ def _build_turns(turn_count: int) -> list[str]:
40
43
 
41
44
 
42
45
  def _compile_premise(turns: list[str]) -> str:
43
- engine = create_engine()
46
+ engine = Engine()
44
47
  for turn in turns:
45
48
  decision = engine.step(turn)
46
49
  assert decision["kind"] == DECISION_UPDATE
@@ -3,7 +3,7 @@
3
3
  import re
4
4
  from collections.abc import Mapping
5
5
 
6
- from context_compiler import create_engine
6
+ from context_compiler import Engine
7
7
  from context_compiler.engine import PolicyValue
8
8
  from demos.common import (
9
9
  build_baseline_messages,
@@ -115,7 +115,7 @@ def _actual_summary(*, weak_pass: bool, strong_pass: bool, compiler_pass: bool)
115
115
 
116
116
 
117
117
  def main() -> None:
118
- engine = create_engine()
118
+ engine = Engine()
119
119
  print_user_inputs(USER_INPUTS)
120
120
 
121
121
  for index, user_input in enumerate(USER_INPUTS, start=1):
@@ -2,7 +2,10 @@
2
2
 
3
3
  from collections.abc import Mapping
4
4
 
5
- from context_compiler import create_engine, is_update
5
+ from context_compiler import (
6
+ Engine,
7
+ is_update,
8
+ )
6
9
  from demos.common import (
7
10
  build_baseline_messages,
8
11
  build_reinjected_messages,
@@ -28,7 +31,7 @@ def _is_initial_authoritative_state(*, premise: str | None, policies: Mapping[st
28
31
 
29
32
 
30
33
  def main() -> None:
31
- engine = create_engine()
34
+ engine = Engine()
32
35
  user_inputs = [USER_INPUT]
33
36
  print_user_inputs(user_inputs)
34
37
 
@@ -3,7 +3,7 @@
3
3
  from collections.abc import Mapping
4
4
 
5
5
  from context_compiler import (
6
- create_engine,
6
+ Engine,
7
7
  is_no_directive,
8
8
  is_update,
9
9
  )
@@ -43,7 +43,7 @@ def _is_initial_authoritative_state(*, premise: str | None, policies: Mapping[st
43
43
 
44
44
 
45
45
  def main() -> None:
46
- engine = create_engine()
46
+ engine = Engine()
47
47
  user_inputs = [TURN_1, TURN_2, TURN_3]
48
48
  print_user_inputs(user_inputs)
49
49
 
@@ -7,7 +7,7 @@ from typing import Literal, NotRequired, TypedDict
7
7
 
8
8
  from context_compiler import (
9
9
  Decision,
10
- create_engine,
10
+ Engine,
11
11
  is_error,
12
12
  is_update,
13
13
  )
@@ -282,7 +282,7 @@ def compact_user_turns(
282
282
  - returned state dict is built from engine observations at stop point
283
283
  """
284
284
 
285
- engine = create_engine()
285
+ engine = Engine()
286
286
  compacted_turns: list[str] = []
287
287
  message: str | None = None
288
288
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  from _util import print_decision_summary, print_engine_observations
4
4
 
5
- from context_compiler import Engine, create_engine
5
+ from context_compiler import Engine
6
6
 
7
7
 
8
8
  def build_prompt(engine: Engine, user_input: str) -> str:
@@ -17,7 +17,7 @@ def build_prompt(engine: Engine, user_input: str) -> str:
17
17
 
18
18
 
19
19
  def main() -> None:
20
- engine = create_engine()
20
+ engine = Engine()
21
21
 
22
22
  print("User: prohibit peanuts")
23
23
  decision1 = engine.step("prohibit peanuts")
@@ -2,11 +2,11 @@
2
2
 
3
3
  from _util import print_decision_summary, print_engine_observations
4
4
 
5
- from context_compiler import create_engine
5
+ from context_compiler import Engine
6
6
 
7
7
 
8
8
  def main() -> None:
9
- engine = create_engine()
9
+ engine = Engine()
10
10
 
11
11
  print("User: set premise vegetarian curry")
12
12
  decision1 = engine.step("set premise vegetarian curry")
@@ -2,7 +2,10 @@
2
2
 
3
3
  from _util import print_decision_summary, print_engine_observations
4
4
 
5
- from context_compiler import create_engine, is_error
5
+ from context_compiler import (
6
+ Engine,
7
+ is_error,
8
+ )
6
9
 
7
10
 
8
11
  def fake_llm(user_input: str) -> str:
@@ -11,7 +14,7 @@ def fake_llm(user_input: str) -> str:
11
14
 
12
15
 
13
16
  def main() -> None:
14
- engine = create_engine()
17
+ engine = Engine()
15
18
 
16
19
  print("User: prohibit peanuts")
17
20
  decision1 = engine.step("prohibit peanuts")
@@ -4,7 +4,7 @@ from dataclasses import dataclass
4
4
 
5
5
  from _util import print_decision_summary, print_engine_observations
6
6
 
7
- from context_compiler import create_engine
7
+ from context_compiler import Engine
8
8
 
9
9
 
10
10
  @dataclass
@@ -21,7 +21,7 @@ def allow_tool(tool: Tool) -> None:
21
21
 
22
22
 
23
23
  def main() -> None:
24
- engine = create_engine()
24
+ engine = Engine()
25
25
 
26
26
  user_input = "prohibit docker"
27
27
  print(f"User: {user_input}")
@@ -6,7 +6,6 @@ from _util import print_decision_summary, print_engine_observations
6
6
 
7
7
  from context_compiler import (
8
8
  Engine,
9
- create_engine,
10
9
  is_error,
11
10
  is_no_directive,
12
11
  is_update,
@@ -45,7 +44,7 @@ def handle_turn(engine_input: str, engine: Engine) -> None:
45
44
 
46
45
 
47
46
  def main() -> None:
48
- engine = create_engine()
47
+ engine = Engine()
49
48
 
50
49
  handle_turn("hello there", engine)
51
50
  handle_turn("set premise concise replies", engine)
@@ -2,11 +2,11 @@
2
2
 
3
3
  from _util import print_decision_summary, print_engine_observations
4
4
 
5
- from context_compiler import create_engine
5
+ from context_compiler import Engine
6
6
 
7
7
 
8
8
  def main() -> None:
9
- engine = create_engine()
9
+ engine = Engine()
10
10
  turns = [
11
11
  "prohibit peanuts",
12
12
  "set premise vegetarian curry",
@@ -22,7 +22,7 @@ def main() -> None:
22
22
 
23
23
  # Hosts can persist authoritative state directly instead of replaying prior turns.
24
24
  state_json = engine.export_json()
25
- restored = create_engine()
25
+ restored = Engine()
26
26
  restored.import_json(state_json)
27
27
 
28
28
  print("JSON restore keeps authority state:")
@@ -2,11 +2,11 @@
2
2
 
3
3
  from _util import print_decision_summary, print_engine_observations
4
4
 
5
- from context_compiler import create_engine
5
+ from context_compiler import Engine
6
6
 
7
7
 
8
8
  def main() -> None:
9
- engine = create_engine()
9
+ engine = Engine()
10
10
 
11
11
  print("User: prohibit peanuts")
12
12
  decision1 = engine.step("prohibit peanuts")
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "context-compiler"
7
- version = "0.9.0dev6"
7
+ version = "0.9.0dev8"
8
8
  description = "Deterministic conversational state engine for LLM applications."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -18,7 +18,6 @@ from .engine import (
18
18
  DecisionKind,
19
19
  Engine,
20
20
  PolicyValue,
21
- create_engine,
22
21
  )
23
22
 
24
23
  __version__ = version("context-compiler")
@@ -33,7 +32,6 @@ __all__ = [
33
32
  "POLICY_PROHIBIT",
34
33
  "POLICY_USE",
35
34
  "PolicyValue",
36
- "create_engine",
37
35
  "get_error_message",
38
36
  "is_error",
39
37
  "is_no_directive",