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.
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/PKG-INFO +4 -3
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/README.md +1 -1
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/pyproject.toml +3 -2
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/__init__.py +1 -1
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/context_safe.py +46 -3
- codespy_ai-2.0.1/src/codespy/agents/cost_tracker.py +573 -0
- codespy_ai-2.0.1/src/codespy/agents/diagnostic_adapter.py +328 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/dspy_config.py +131 -49
- codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/__init__.py +3 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/cerebral.py +1223 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/cost.py +509 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/delta_ops_compat.py +197 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/orphans.py +107 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/routines.py +230 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/cerebral/structured_output.py +611 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/__init__.py +4 -5
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/budget.py +6 -8
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/cartographer.py +10 -10
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/context_memory.py +42 -8
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/distiller.py +13 -14
- codespy_ai-2.0.1/src/codespy/agents/memory/hippocampus/episode.py +246 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/hippocampus/hippocampus.py +65 -60
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/postgres.py +313 -151
- codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/__init__.py +46 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/facets.py +213 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/format.py +224 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/prefrontal.py +604 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/query.py +161 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/prefrontal/reach.py +183 -0
- codespy_ai-2.0.1/src/codespy/agents/memory/recall.py +137 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/audit/agent.py +58 -35
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/code_review/agent.py +53 -50
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/doc/agent.py +49 -43
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/doc/doc_extractor.py +35 -2
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/helpers.py +42 -1
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/models.py +13 -3
- codespy_ai-2.0.1/src/codespy/agents/review/scope/__init__.py +15 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/scope/agent.py +171 -140
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/summary/agent.py +46 -23
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/supply_chain/agent.py +65 -55
- codespy_ai-2.0.1/src/codespy/agents/rlm_tools.py +330 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/cli.py +7 -7
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/cli_local.py +30 -18
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/cli_remote.py +40 -22
- codespy_ai-2.0.1/src/codespy/config.py +553 -0
- codespy_ai-2.0.1/src/codespy/config_dspy.py +108 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/config_llm.py +18 -41
- codespy_ai-2.0.1/src/codespy/config_memory.py +1006 -0
- codespy_ai-2.0.1/src/codespy/config_utils.py +205 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/osv/server.py +2 -6
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/base.py +34 -1
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/github_client.py +42 -7
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/gitlab_client.py +40 -4
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/server.py +2 -6
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/mcp_utils.py +12 -18
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/ripgrep/server.py +2 -6
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/server.py +2 -6
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/filesystem/server.py +2 -6
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/s3/server.py +2 -6
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/web/server.py +2 -6
- codespy_ai-2.0.1/src/codespy/workflows/review/models.py +486 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/pipeline.py +248 -44
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/reporters/git.py +172 -44
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/server.py +17 -15
- codespy_ai-1.2.4/src/codespy/agents/cost_tracker.py +0 -344
- codespy_ai-1.2.4/src/codespy/agents/memory/hippocampus/episode.py +0 -125
- codespy_ai-1.2.4/src/codespy/agents/review/scope/__init__.py +0 -2
- codespy_ai-1.2.4/src/codespy/config.py +0 -612
- codespy_ai-1.2.4/src/codespy/config_dspy.py +0 -193
- codespy_ai-1.2.4/src/codespy/config_memory.py +0 -401
- codespy_ai-1.2.4/src/codespy/config_utils.py +0 -21
- codespy_ai-1.2.4/src/codespy/tools/git/patch_utils.py +0 -438
- codespy_ai-1.2.4/src/codespy/workflows/review/models.py +0 -271
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/LICENSE +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/memory/pg0_manager.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/audit/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/code_review/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/doc/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/scope/manifest_parser.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/scope/models.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/summary/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/agents/review/supply_chain/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/cli_mcp_server.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/config_git.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/config_io.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/osv/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/osv/client.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/cyber/osv/models.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/client.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/local_diff.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/git/models.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/ripgrep/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/ripgrep/client.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/base_extractor.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/bash.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/cpp.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/csharp.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/go.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/java.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/javascript.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/kotlin.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/objc.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/php.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/python.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/ripgrep_fallback.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/ruby.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/rust.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/swift.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/extractors/terraform.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/models.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/parsers/treesitter/parser.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/base.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/filesystem/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/filesystem/client.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/models.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/s3/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/storage/s3/client.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/web/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/web/client.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/tools/web/models.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/reporters/__init__.py +0 -0
- {codespy_ai-1.2.4 → codespy_ai-2.0.1}/src/codespy/workflows/review/reporters/base.py +0 -0
- {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:
|
|
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 (>=
|
|
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
|
|
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
|
|
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 = "
|
|
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 = ">=
|
|
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"
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
)
|