codespy-ai 1.2.4__tar.gz → 2.0.1__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 (135) hide show
  1. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/PKG-INFO +4 -3
  2. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/README.md +1 -1
  3. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/pyproject.toml +3 -2
  4. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/__init__.py +1 -1
  5. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/context_safe.py +46 -3
  6. codespy_ai-2.0.1/src/codespy/agents/cost_tracker.py +573 -0
  7. codespy_ai-2.0.1/src/codespy/agents/diagnostic_adapter.py +328 -0
  8. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/dspy_config.py +131 -49
  9. codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/__init__.py +3 -0
  10. codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/cerebral.py +1223 -0
  11. codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/cost.py +509 -0
  12. codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/delta_ops_compat.py +197 -0
  13. codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/orphans.py +107 -0
  14. codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/routines.py +230 -0
  15. codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/structured_output.py +611 -0
  16. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/__init__.py +4 -5
  17. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/budget.py +6 -8
  18. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/cartographer.py +10 -10
  19. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/context_memory.py +42 -8
  20. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/distiller.py +13 -14
  21. codespy_ai-2.0.1/src/codespy/agents/memory/hippocampus/episode.py +246 -0
  22. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/hippocampus.py +65 -60
  23. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/postgres.py +313 -151
  24. codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/__init__.py +46 -0
  25. codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/facets.py +213 -0
  26. codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/format.py +224 -0
  27. codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/prefrontal.py +604 -0
  28. codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/query.py +161 -0
  29. codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/reach.py +183 -0
  30. codespy_ai-2.0.1/src/codespy/agents/memory/recall.py +137 -0
  31. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/audit/agent.py +58 -35
  32. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/code_review/agent.py +53 -50
  33. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/doc/agent.py +49 -43
  34. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/doc/doc_extractor.py +35 -2
  35. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/helpers.py +42 -1
  36. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/models.py +13 -3
  37. codespy_ai-2.0.1/src/codespy/agents/review/scope/__init__.py +15 -0
  38. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/scope/agent.py +171 -140
  39. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/summary/agent.py +46 -23
  40. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/supply_chain/agent.py +65 -55
  41. codespy_ai-2.0.1/src/codespy/agents/rlm_tools.py +330 -0
  42. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/cli.py +7 -7
  43. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/cli_local.py +30 -18
  44. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/cli_remote.py +40 -22
  45. codespy_ai-2.0.1/src/codespy/config.py +553 -0
  46. codespy_ai-2.0.1/src/codespy/config_dspy.py +108 -0
  47. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/config_llm.py +18 -41
  48. codespy_ai-2.0.1/src/codespy/config_memory.py +1006 -0
  49. codespy_ai-2.0.1/src/codespy/config_utils.py +205 -0
  50. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/osv/server.py +2 -6
  51. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/base.py +34 -1
  52. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/github_client.py +42 -7
  53. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/gitlab_client.py +40 -4
  54. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/server.py +2 -6
  55. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/mcp_utils.py +12 -18
  56. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/ripgrep/server.py +2 -6
  57. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/server.py +2 -6
  58. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/filesystem/server.py +2 -6
  59. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/s3/server.py +2 -6
  60. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/web/server.py +2 -6
  61. codespy_ai-2.0.1/src/codespy/workflows/review/models.py +486 -0
  62. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/pipeline.py +248 -44
  63. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/reporters/git.py +172 -44
  64. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/server.py +17 -15
  65. codespy_ai-1.2.4/src/codespy/agents/cost_tracker.py +0 -344
  66. codespy_ai-1.2.4/src/codespy/agents/memory/hippocampus/episode.py +0 -125
  67. codespy_ai-1.2.4/src/codespy/agents/review/scope/__init__.py +0 -2
  68. codespy_ai-1.2.4/src/codespy/config.py +0 -612
  69. codespy_ai-1.2.4/src/codespy/config_dspy.py +0 -193
  70. codespy_ai-1.2.4/src/codespy/config_memory.py +0 -401
  71. codespy_ai-1.2.4/src/codespy/config_utils.py +0 -21
  72. codespy_ai-1.2.4/src/codespy/tools/git/patch_utils.py +0 -438
  73. codespy_ai-1.2.4/src/codespy/workflows/review/models.py +0 -271
  74. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/LICENSE +0 -0
  75. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/__init__.py +0 -0
  76. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/__init__.py +0 -0
  77. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/pg0_manager.py +0 -0
  78. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/__init__.py +0 -0
  79. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/audit/__init__.py +0 -0
  80. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/code_review/__init__.py +0 -0
  81. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/doc/__init__.py +0 -0
  82. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/scope/manifest_parser.py +0 -0
  83. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/scope/models.py +0 -0
  84. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/summary/__init__.py +0 -0
  85. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/supply_chain/__init__.py +0 -0
  86. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/cli_mcp_server.py +0 -0
  87. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/config_git.py +0 -0
  88. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/config_io.py +0 -0
  89. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/__init__.py +0 -0
  90. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/__init__.py +0 -0
  91. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/osv/__init__.py +0 -0
  92. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/osv/client.py +0 -0
  93. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/osv/models.py +0 -0
  94. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/__init__.py +0 -0
  95. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/client.py +0 -0
  96. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/local_diff.py +0 -0
  97. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/models.py +0 -0
  98. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/__init__.py +0 -0
  99. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/ripgrep/__init__.py +0 -0
  100. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/ripgrep/client.py +0 -0
  101. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/__init__.py +0 -0
  102. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/base_extractor.py +0 -0
  103. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/__init__.py +0 -0
  104. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/bash.py +0 -0
  105. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/cpp.py +0 -0
  106. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/csharp.py +0 -0
  107. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/go.py +0 -0
  108. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/java.py +0 -0
  109. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/javascript.py +0 -0
  110. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/kotlin.py +0 -0
  111. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/objc.py +0 -0
  112. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/php.py +0 -0
  113. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/python.py +0 -0
  114. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/ripgrep_fallback.py +0 -0
  115. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/ruby.py +0 -0
  116. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/rust.py +0 -0
  117. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/swift.py +0 -0
  118. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/terraform.py +0 -0
  119. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/models.py +0 -0
  120. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/parser.py +0 -0
  121. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/__init__.py +0 -0
  122. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/base.py +0 -0
  123. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/filesystem/__init__.py +0 -0
  124. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/filesystem/client.py +0 -0
  125. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/models.py +0 -0
  126. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/s3/__init__.py +0 -0
  127. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/s3/client.py +0 -0
  128. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/web/__init__.py +0 -0
  129. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/web/client.py +0 -0
  130. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/web/models.py +0 -0
  131. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/__init__.py +0 -0
  132. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/__init__.py +0 -0
  133. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/reporters/__init__.py +0 -0
  134. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/reporters/base.py +0 -0
  135. {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/reporters/stdout.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codespy-ai
3
- Version: 1.2.4
3
+ Version: 2.0.1
4
4
  Summary: Code review agent powered by DSPy
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -23,11 +23,12 @@ Requires-Dist: cloudpickle (>=3.1.2,<4.0.0)
23
23
  Requires-Dist: ddgs (>=8.0.0)
24
24
  Requires-Dist: dspy[mcp] (>=3.3.0,<4.0.0)
25
25
  Requires-Dist: gitpython (>=3.1.42)
26
+ Requires-Dist: hindsight-api-slim (>=0.10.1)
26
27
  Requires-Dist: httpx (>=0.28.0)
27
28
  Requires-Dist: json-repair (>=0.60.1)
28
29
  Requires-Dist: litellm (>=1.84.0,<2.0.0)
29
30
  Requires-Dist: markdownify (>=0.15.0)
30
- Requires-Dist: mcp (>=1.29.0,<2.0.0)
31
+ Requires-Dist: mcp (>=2.2,<3)
31
32
  Requires-Dist: pg0-embedded (>=0.15)
32
33
  Requires-Dist: psycopg[binary,pool] (>=3.1)
33
34
  Requires-Dist: pydantic (>=2.10.0)
@@ -204,7 +205,7 @@ codespy auto-discovers credentials from standard locations (`~/.aws/credentials`
204
205
  | **[Usage](docs/usage.md)** | CLI commands, Docker, GitHub Action, MCP server, output formats |
205
206
  | **[Configuration](docs/configuration.md)** | Environment variables, YAML config, model strategy, per-signature settings |
206
207
  | **[Architecture](docs/architecture.md)** | Pipeline design, DSPy signatures, supported languages |
207
- | **[Memory System](docs/memory.md)** | Hippocampus episodic memory for cross-review knowledge |
208
+ | **[Memory System](docs/memory.md)** | Hippocampus (episodic), Cerebral (semantic store), Prefrontal (recall) |
208
209
  | **[Development](docs/development.md)** | Setup, build, test, lint |
209
210
 
210
211
  ---
@@ -151,7 +151,7 @@ codespy auto-discovers credentials from standard locations (`~/.aws/credentials`
151
151
  | **[Usage](docs/usage.md)** | CLI commands, Docker, GitHub Action, MCP server, output formats |
152
152
  | **[Configuration](docs/configuration.md)** | Environment variables, YAML config, model strategy, per-signature settings |
153
153
  | **[Architecture](docs/architecture.md)** | Pipeline design, DSPy signatures, supported languages |
154
- | **[Memory System](docs/memory.md)** | Hippocampus episodic memory for cross-review knowledge |
154
+ | **[Memory System](docs/memory.md)** | Hippocampus (episodic), Cerebral (semantic store), Prefrontal (recall) |
155
155
  | **[Development](docs/development.md)** | Setup, build, test, lint |
156
156
 
157
157
  ---
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "codespy-ai"
3
- version = "1.2.4"
3
+ version = "2.0.1"
4
4
  description = "Code review agent powered by DSPy"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -47,12 +47,13 @@ tree-sitter-kotlin = ">=1.0"
47
47
  tree-sitter-objc = ">=3.0"
48
48
  tree-sitter-rust = ">=0.23"
49
49
  tree-sitter-hcl = ">=1.2.0"
50
- mcp = ">=1.29.0,<2.0.0"
50
+ mcp = ">=2.2,<3"
51
51
  psycopg = {version = ">=3.1", extras = ["binary", "pool"]}
52
52
  beautifulsoup4 = ">=4.12.0"
53
53
  markdownify = ">=0.15.0"
54
54
  ddgs = ">=8.0.0"
55
55
  pg0-embedded = ">=0.15"
56
+ hindsight-api-slim = ">=0.10.1"
56
57
 
57
58
  [tool.poetry.group.dev.dependencies]
58
59
  pytest = ">=8.0.0"
@@ -1,3 +1,3 @@
1
1
  """codespy - Code review agent powered by DSPy."""
2
2
 
3
- __version__ = "1.2.4"
3
+ __version__ = "2.0.1"
@@ -4,6 +4,7 @@ Provides transparent fallback to RLM (Recursive Language Model) when inputs
4
4
  exceed the model's context window. Used to wrap all DSPy signature modules.
5
5
  """
6
6
 
7
+ import enum
7
8
  import logging
8
9
  import re
9
10
 
@@ -19,6 +20,47 @@ _RE_CONTEXT_LENGTH = re.compile(r"maximum context length is \d+ tokens", re.IGNO
19
20
  # Below this, context rot is not a concern regardless of ratio.
20
21
  _MIN_RLM_THRESHOLD_TOKENS = 8192
21
22
 
23
+ # Replaces dspy.RLM's stock `reasoning` desc ("Think step-by-step: what do you
24
+ # know? What remains? Plan your next action."), which on its own triggers Bedrock
25
+ # content_filter on Claude Opus 5.5.
26
+ RLM_REASONING_DESC = "Short plan for the next step."
27
+
28
+
29
+ def _plain(value): # type: ignore[no-untyped-def]
30
+ """Replace Enum members with their values, recursively.
31
+
32
+ dspy's PythonInterpreter injects inputs as `name = repr(value)`; an Enum repr
33
+ (`<IssueCategory.BUG: 'bug'>`) is not valid Python, so every REPL execution
34
+ fails with an empty SyntaxError.
35
+ """
36
+ if isinstance(value, enum.Enum):
37
+ return value.value
38
+ if isinstance(value, (list, tuple, set)):
39
+ return [_plain(v) for v in value]
40
+ if isinstance(value, dict):
41
+ return {_plain(k): _plain(v) for k, v in value.items()}
42
+ return value
43
+
44
+
45
+ class CodespyRLM(dspy.RLM):
46
+ """dspy.RLM adjusted for codespy.
47
+
48
+ - Neutral action-signature `reasoning` description (Bedrock content_filter).
49
+ - Enum inputs passed as plain values (REPL variable injection).
50
+ """
51
+
52
+ def forward(self, **kwargs): # type: ignore[no-untyped-def]
53
+ return super().forward(**{k: _plain(v) for k, v in kwargs.items()})
54
+
55
+ async def aforward(self, **kwargs): # type: ignore[no-untyped-def]
56
+ return await super().aforward(**{k: _plain(v) for k, v in kwargs.items()})
57
+
58
+ def _build_signatures(self): # type: ignore[no-untyped-def]
59
+ action_sig, extract_sig = super()._build_signatures()
60
+ if "reasoning" in action_sig.output_fields:
61
+ action_sig = action_sig.with_updated_fields("reasoning", desc=RLM_REASONING_DESC)
62
+ return action_sig, extract_sig
63
+
22
64
 
23
65
  def estimate_context_overflow(model: str, max_tokens: int, input_text: str) -> bool:
24
66
  """Estimate whether input + max_tokens would exceed the model's context window.
@@ -60,7 +102,7 @@ class ContextSafe(dspy.Module):
60
102
  - Try/catch: if the inner module raises a context overflow error (unknown
61
103
  models where pre-flight can't estimate), catches it and retries with RLM.
62
104
 
63
- Transparent to inject_context_memory — delegates .signature to inner module.
105
+ Transparent to signature injection — delegates .signature to inner module.
64
106
  """
65
107
 
66
108
  def __init__(
@@ -186,7 +228,7 @@ class ContextSafe(dspy.Module):
186
228
  return False, ""
187
229
 
188
230
  def _get_current_signature(self):
189
- """Get current signature (may include context_memory if inject_context_memory was called)."""
231
+ """Get current signature."""
190
232
  sig = getattr(self.module, "signature", None)
191
233
  if sig is not None:
192
234
  return sig
@@ -197,9 +239,10 @@ class ContextSafe(dspy.Module):
197
239
 
198
240
  def _create_rlm_fallback(self) -> dspy.RLM:
199
241
  """Create RLM with current signature and tools."""
200
- return dspy.RLM(
242
+ return CodespyRLM(
201
243
  self._get_current_signature(),
202
244
  tools=self._tools,
203
245
  max_iters=self._max_iters,
204
246
  max_llm_calls=self._max_llm_calls,
247
+ verbose=logger.isEnabledFor(logging.DEBUG),
205
248
  )