vamp-cli 0.1.2__tar.gz → 0.1.4__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.
- vamp_cli-0.1.4/MANIFEST.in +1 -0
- {vamp_cli-0.1.2/src/vamp_cli.egg-info → vamp_cli-0.1.4}/PKG-INFO +3 -2
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/README.md +1 -1
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/pyproject.toml +3 -2
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/nodes.py +22 -15
- vamp_cli-0.1.4/src/vamp_cli/config/default_config.yaml +291 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/main.py +17 -9
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/transcript.py +1 -1
- {vamp_cli-0.1.2 → vamp_cli-0.1.4/src/vamp_cli.egg-info}/PKG-INFO +3 -2
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/SOURCES.txt +2 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/requires.txt +1 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/LICENSE +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/setup.cfg +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/context_sync.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/graph.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/instructions.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/roles.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/runtime/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/runtime/runtime.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/state.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/agent/status.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/config/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/config/loader.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/config/schema.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/adapter.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/adapter_registry.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/debug_callbacks.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/router.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/llm/usage.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/logging_setup/logging_setup.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/compaction.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/emitter.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/event_log.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/fork.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/persistence/loader.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/prompts/agent.md +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/prompts/coder.md +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/prompts/planner.md +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/prompts/prompts.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/base.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/config.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/docker.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/manager.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/result.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/sandbox/terminal.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/base.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/diagnostic.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/execute_cmd.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/files.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/registry.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/tools/tools_classes.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/error_codes.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/ignore.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/sha_256.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/utils/token_tracker.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/workspace/__init__.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli/workspace/workspace.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/dependency_links.txt +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/entry_points.txt +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/src/vamp_cli.egg-info/top_level.txt +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_list_dir.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_loader.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_model_fallbacks.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_persistence.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_registry_async.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_sandbox_roundtrip.py +0 -0
- {vamp_cli-0.1.2 → vamp_cli-0.1.4}/tests/test_system_verification.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
recursive-include src/vamp_cli/config *.yaml
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vamp-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: VAMP-CLI is an interactive coding agent for working in a local repository. It combines a planner, a coder, model fallbacks, workspace-aware file tools, and a Docker-backed command sandbox in one terminal application. The agent can inspect and edit files, search a codebase, run commands, maintain a task list, and ask for confirmation before executing potentially dangerous operations.
|
|
5
5
|
Author-email: Satyam Kumar <satkr2208@gmail.com>
|
|
6
6
|
License: MIT License
|
|
@@ -50,6 +50,7 @@ Requires-Dist: langgraph
|
|
|
50
50
|
Requires-Dist: langchain-litellm
|
|
51
51
|
Requires-Dist: langgraph-checkpoint-sqlite
|
|
52
52
|
Requires-Dist: aiosqlite
|
|
53
|
+
Requires-Dist: mcp
|
|
53
54
|
Dynamic: license-file
|
|
54
55
|
|
|
55
56
|
# VAMP-CLI
|
|
@@ -91,7 +92,7 @@ The first run automatically builds the `vamp-sandbox:latest` image from [`src/va
|
|
|
91
92
|
Create and activate a virtual environment, then install the project (all dependencies will be installed itself):
|
|
92
93
|
|
|
93
94
|
```bash
|
|
94
|
-
python3.
|
|
95
|
+
python3.12 -m venv .venv
|
|
95
96
|
source .venv/bin/activate
|
|
96
97
|
python -m pip install --upgrade pip
|
|
97
98
|
python -m pip install vamp-cli
|
|
@@ -37,7 +37,7 @@ The first run automatically builds the `vamp-sandbox:latest` image from [`src/va
|
|
|
37
37
|
Create and activate a virtual environment, then install the project (all dependencies will be installed itself):
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
|
-
python3.
|
|
40
|
+
python3.12 -m venv .venv
|
|
41
41
|
source .venv/bin/activate
|
|
42
42
|
python -m pip install --upgrade pip
|
|
43
43
|
python -m pip install vamp-cli
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "vamp-cli"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.4"
|
|
8
8
|
authors = [
|
|
9
9
|
{ name = "Satyam Kumar", email = "satkr2208@gmail.com" }
|
|
10
10
|
]
|
|
@@ -36,6 +36,7 @@ dependencies = [
|
|
|
36
36
|
"langchain-litellm",
|
|
37
37
|
"langgraph-checkpoint-sqlite",
|
|
38
38
|
"aiosqlite",
|
|
39
|
+
"mcp",
|
|
39
40
|
]
|
|
40
41
|
|
|
41
42
|
|
|
@@ -43,7 +44,7 @@ dependencies = [
|
|
|
43
44
|
where = ["src"]
|
|
44
45
|
|
|
45
46
|
[tool.setuptools.package-data]
|
|
46
|
-
vamp_cli = ["*.md", "**/*.md"]
|
|
47
|
+
vamp_cli = ["*.md", "**/*.md", "**/*.yaml"]
|
|
47
48
|
|
|
48
49
|
|
|
49
50
|
[project.scripts]
|
|
@@ -4,6 +4,7 @@ import asyncio
|
|
|
4
4
|
from typing import Any
|
|
5
5
|
from prompt_toolkit import print_formatted_text
|
|
6
6
|
from prompt_toolkit.formatted_text import FormattedText, HTML
|
|
7
|
+
from prompt_toolkit.styles import Style
|
|
7
8
|
|
|
8
9
|
from langgraph.graph import END
|
|
9
10
|
from langgraph.types import interrupt, Command
|
|
@@ -16,7 +17,9 @@ from vamp_cli.agent.state import AgentState
|
|
|
16
17
|
from vamp_cli.agent.status import FeedbackResponse
|
|
17
18
|
from vamp_cli.agent.instructions import TODO_INSTRUCTIONS, PLAN_INSTRUCTIONS
|
|
18
19
|
|
|
19
|
-
|
|
20
|
+
_dim_style = Style.from_dict({
|
|
21
|
+
'dimmed': '#767B7D',
|
|
22
|
+
})
|
|
20
23
|
|
|
21
24
|
def create_planner_node(model: Runnable):
|
|
22
25
|
|
|
@@ -36,17 +39,19 @@ def create_planner_node(model: Runnable):
|
|
|
36
39
|
if response.tool_calls:
|
|
37
40
|
print_formatted_text(
|
|
38
41
|
FormattedText([(
|
|
39
|
-
"
|
|
42
|
+
"class:dimmed",
|
|
40
43
|
"\n\n[planner] calling:"
|
|
41
44
|
)]),
|
|
45
|
+
style=_dim_style,
|
|
42
46
|
end="\n"
|
|
43
47
|
)
|
|
44
48
|
for tc in response.tool_calls:
|
|
45
49
|
print_formatted_text(
|
|
46
50
|
FormattedText([(
|
|
47
|
-
"
|
|
48
|
-
f">> {tc['name']}({tc['args']})"
|
|
51
|
+
"class:dimmed",
|
|
52
|
+
f">> {str(tc['name'])}({str(tc['args'])})"
|
|
49
53
|
)]),
|
|
54
|
+
style=_dim_style,
|
|
50
55
|
end="\n"
|
|
51
56
|
)
|
|
52
57
|
# print("Tool: ", tc['name'])
|
|
@@ -99,15 +104,15 @@ def create_agent_node(model: Runnable):
|
|
|
99
104
|
|
|
100
105
|
|
|
101
106
|
|
|
102
|
-
if not state.get("todo"):
|
|
103
|
-
|
|
107
|
+
# if not state.get("todo"):
|
|
108
|
+
# message_to_send.append(SystemMessage(content=TODO_INSTRUCTIONS))
|
|
104
109
|
|
|
105
|
-
if state.get("todo"):
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
110
|
+
# if state.get("todo"):
|
|
111
|
+
# turns_since_update = _turns_since_todo_update(state["coder_messages"])
|
|
112
|
+
# if turns_since_update >= 10:
|
|
113
|
+
# message_to_send.append(
|
|
114
|
+
# SystemMessage(content=_format_todo_reminder(state["todo"]))
|
|
115
|
+
# )
|
|
111
116
|
|
|
112
117
|
response: AIMessage = await model.with_config(config).ainvoke(message_to_send)
|
|
113
118
|
|
|
@@ -116,17 +121,19 @@ def create_agent_node(model: Runnable):
|
|
|
116
121
|
if response.tool_calls:
|
|
117
122
|
print_formatted_text(
|
|
118
123
|
FormattedText([(
|
|
119
|
-
"
|
|
124
|
+
"class:dimmed",
|
|
120
125
|
"\n\n[coder] calling:"
|
|
121
126
|
)]),
|
|
127
|
+
style=_dim_style,
|
|
122
128
|
end="\n"
|
|
123
129
|
)
|
|
124
130
|
for tc in response.tool_calls:
|
|
125
131
|
print_formatted_text(
|
|
126
132
|
FormattedText([(
|
|
127
|
-
"
|
|
128
|
-
f">> {tc['name']}({tc['args']})"
|
|
133
|
+
"class:dimmed",
|
|
134
|
+
f">> {str(tc['name'])}({str(tc['args'])})"
|
|
129
135
|
)]),
|
|
136
|
+
style=_dim_style,
|
|
130
137
|
end="\n"
|
|
131
138
|
)
|
|
132
139
|
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
models:
|
|
2
|
+
qwen:
|
|
3
|
+
model: dashscope/qwen3.6-flash
|
|
4
|
+
api_base: https://ws-n7c4pdh4ldno9hkc.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1
|
|
5
|
+
api_key_env: DASHSCOPE_API_KEY
|
|
6
|
+
adapter: reasoning
|
|
7
|
+
params:
|
|
8
|
+
temperature: 0.2
|
|
9
|
+
max_tokens: 8192
|
|
10
|
+
max_retries: 2
|
|
11
|
+
streaming: true
|
|
12
|
+
fallbacks: []
|
|
13
|
+
# - openai
|
|
14
|
+
capabilities:
|
|
15
|
+
supports_tools: true
|
|
16
|
+
supports_parallel_tools: false
|
|
17
|
+
supports_streaming: true
|
|
18
|
+
supports_reasoning: true
|
|
19
|
+
context_window: 128000
|
|
20
|
+
|
|
21
|
+
# (for DashScope native OpenAI mode)
|
|
22
|
+
reasoning_param: enable_thinking
|
|
23
|
+
reasoning_value: true
|
|
24
|
+
|
|
25
|
+
# (general)
|
|
26
|
+
# reasoning_param: thinking
|
|
27
|
+
# reasoning_value:
|
|
28
|
+
# type: enabled
|
|
29
|
+
# budget_tokens: 4000
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
openai:
|
|
33
|
+
model: openai/gpt-5.6-luna
|
|
34
|
+
api_base:
|
|
35
|
+
api_key_env: OPENAI_API_KEY
|
|
36
|
+
adapter: reasoning
|
|
37
|
+
params:
|
|
38
|
+
temperature: 0.2
|
|
39
|
+
max_tokens: 8192
|
|
40
|
+
max_retries: 2
|
|
41
|
+
streaming: true
|
|
42
|
+
fallbacks: []
|
|
43
|
+
capabilities:
|
|
44
|
+
supports_tools: true
|
|
45
|
+
supports_parallel_tools: false
|
|
46
|
+
supports_streaming: true
|
|
47
|
+
supports_reasoning: true
|
|
48
|
+
reasoning_param: reasoning_effort
|
|
49
|
+
reasoning_value: medium # Options: low, medium, high
|
|
50
|
+
context_window: 128000
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
anthropic:
|
|
54
|
+
model: anthropic/claude-opus-5-5
|
|
55
|
+
api_base:
|
|
56
|
+
api_key_env: ANTHROPIC_API_KEY
|
|
57
|
+
adapter: reasoning
|
|
58
|
+
params:
|
|
59
|
+
temperature: 0.2
|
|
60
|
+
max_tokens: 8192
|
|
61
|
+
max_retries: 2
|
|
62
|
+
streaming: true
|
|
63
|
+
fallbacks: []
|
|
64
|
+
capabilities:
|
|
65
|
+
supports_tools: true
|
|
66
|
+
supports_parallel_tools: false
|
|
67
|
+
supports_streaming: true
|
|
68
|
+
supports_reasoning: true
|
|
69
|
+
reasoning_param: thinking
|
|
70
|
+
reasoning_value:
|
|
71
|
+
type: adaptive
|
|
72
|
+
context_window: 128000
|
|
73
|
+
# or (for Opus 4.5, Sonnet 4.5, Haiku 4.5)
|
|
74
|
+
# reasoning_param: thinking
|
|
75
|
+
# reasoning_value:
|
|
76
|
+
# type: enabled
|
|
77
|
+
# budget_tokens: 4000
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
deepseek:
|
|
82
|
+
model: deepseek/deepseek-v4
|
|
83
|
+
api_base:
|
|
84
|
+
api_key_env: DEEPSEEK_API_KEY
|
|
85
|
+
adapter: reasoning
|
|
86
|
+
params:
|
|
87
|
+
temperature: 0.2
|
|
88
|
+
max_tokens: 8192
|
|
89
|
+
max_retries: 2
|
|
90
|
+
streaming: true
|
|
91
|
+
fallbacks: []
|
|
92
|
+
capabilities:
|
|
93
|
+
supports_tools: true
|
|
94
|
+
supports_parallel_tools: false
|
|
95
|
+
supports_streaming: true
|
|
96
|
+
supports_reasoning: true
|
|
97
|
+
reasoning_param: reasoning_effort
|
|
98
|
+
reasoning_value: high # Options: low, high, max context_window: 128000
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
kimi:
|
|
103
|
+
model: kimi/kimi
|
|
104
|
+
api_base:
|
|
105
|
+
api_key_env: KIMI_API_KEY
|
|
106
|
+
adapter: reasoning
|
|
107
|
+
params:
|
|
108
|
+
temperature: 0.2
|
|
109
|
+
max_tokens: 8192
|
|
110
|
+
max_retries: 2
|
|
111
|
+
streaming: true
|
|
112
|
+
fallbacks: []
|
|
113
|
+
capabilities:
|
|
114
|
+
supports_tools: true
|
|
115
|
+
supports_parallel_tools: false
|
|
116
|
+
supports_streaming: true
|
|
117
|
+
supports_reasoning: true
|
|
118
|
+
reasoning_param: reasoning_effort
|
|
119
|
+
reasoning_value: high # Options: low, high, max
|
|
120
|
+
context_window: 128000
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
gork:
|
|
124
|
+
model: gork/gork
|
|
125
|
+
api_base:
|
|
126
|
+
api_key_env: GORK_API_KEY
|
|
127
|
+
adapter: reasoning
|
|
128
|
+
params:
|
|
129
|
+
temperature: 0.2
|
|
130
|
+
max_tokens: 8192
|
|
131
|
+
max_retries: 2
|
|
132
|
+
streaming: true
|
|
133
|
+
fallbacks: []
|
|
134
|
+
capabilities:
|
|
135
|
+
supports_tools: true
|
|
136
|
+
supports_parallel_tools: false
|
|
137
|
+
supports_streaming: true
|
|
138
|
+
supports_reasoning: true
|
|
139
|
+
reasoning_param: reasoning_effort
|
|
140
|
+
reasoning_value: high # Options: low, high, max, xhigh
|
|
141
|
+
context_window: 128000
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
gemini:
|
|
145
|
+
model: gemini/gemini
|
|
146
|
+
api_base:
|
|
147
|
+
api_key_env: GEMINI_API_KEY
|
|
148
|
+
adapter: reasoning
|
|
149
|
+
params:
|
|
150
|
+
temperature: 0.2
|
|
151
|
+
max_tokens: 8192
|
|
152
|
+
max_retries: 2
|
|
153
|
+
streaming: true
|
|
154
|
+
fallbacks: []
|
|
155
|
+
capabilities:
|
|
156
|
+
supports_tools: true
|
|
157
|
+
supports_parallel_tools: false
|
|
158
|
+
supports_streaming: true
|
|
159
|
+
supports_reasoning: true
|
|
160
|
+
context_window: 128000
|
|
161
|
+
|
|
162
|
+
# for gemini 2.5 series
|
|
163
|
+
reasoning_param: thinking_config
|
|
164
|
+
reasoning_value:
|
|
165
|
+
thinking_budget: 4000 # -1 for dynamic, 0 to disable, or an explicit integer budget
|
|
166
|
+
|
|
167
|
+
# for gemini 3/4 series
|
|
168
|
+
# reasoning_param: thinking_config
|
|
169
|
+
# reasoning_value:
|
|
170
|
+
# thinking_level: high # Options: minimal, low, medium, high
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
profiles:
|
|
174
|
+
default_coder:
|
|
175
|
+
model: qwen
|
|
176
|
+
tools:
|
|
177
|
+
- list_dir
|
|
178
|
+
- read_file
|
|
179
|
+
- read_many_files
|
|
180
|
+
- apply_search_replace
|
|
181
|
+
- write_file
|
|
182
|
+
- file_search
|
|
183
|
+
- ripgrep_search
|
|
184
|
+
- execute_command
|
|
185
|
+
- write_update_todos
|
|
186
|
+
prompt: prompts/coder.md
|
|
187
|
+
|
|
188
|
+
default_planner:
|
|
189
|
+
model: qwen
|
|
190
|
+
tools:
|
|
191
|
+
- list_dir
|
|
192
|
+
- read_file
|
|
193
|
+
- read_many_files
|
|
194
|
+
- file_search
|
|
195
|
+
- ripgrep_search
|
|
196
|
+
- submit_plan
|
|
197
|
+
- execute_command
|
|
198
|
+
prompt: prompts/planner.md
|
|
199
|
+
|
|
200
|
+
planner:
|
|
201
|
+
model: qwen
|
|
202
|
+
tools:
|
|
203
|
+
- list_dir
|
|
204
|
+
- read_file
|
|
205
|
+
- read_many_files
|
|
206
|
+
- file_search
|
|
207
|
+
- ripgrep_search
|
|
208
|
+
- submit_plan
|
|
209
|
+
- execute_command
|
|
210
|
+
prompt: prompts/planner.md
|
|
211
|
+
|
|
212
|
+
coder:
|
|
213
|
+
model: qwen
|
|
214
|
+
tools:
|
|
215
|
+
- list_dir
|
|
216
|
+
- read_file
|
|
217
|
+
- read_many_files
|
|
218
|
+
- apply_search_replace
|
|
219
|
+
- write_file
|
|
220
|
+
- file_search
|
|
221
|
+
- ripgrep_search
|
|
222
|
+
- execute_command
|
|
223
|
+
- write_update_todos
|
|
224
|
+
prompt: prompts/coder.md
|
|
225
|
+
|
|
226
|
+
default_profile:
|
|
227
|
+
- default_coder
|
|
228
|
+
- default_planner
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
# reasoning styles
|
|
234
|
+
|
|
235
|
+
# 1. openai
|
|
236
|
+
# reasoning_param: "reasoning_effort"
|
|
237
|
+
# reasoning_value: "medium" # Options: "low", "medium", "high"
|
|
238
|
+
|
|
239
|
+
# 2. qwen
|
|
240
|
+
# reasoning_param: "thinking"
|
|
241
|
+
# reasoning_value:
|
|
242
|
+
# type: "enabled"
|
|
243
|
+
# budget_tokens: 4000
|
|
244
|
+
|
|
245
|
+
# 4. qwen (for DashScope native OpenAI mode)
|
|
246
|
+
# reasoning_param: "enable_thinking"
|
|
247
|
+
# reasoning_value: "true"
|
|
248
|
+
|
|
249
|
+
# 5. anthropic (newer models)
|
|
250
|
+
# reasoning_param: "thinking"
|
|
251
|
+
# reasoning_value:
|
|
252
|
+
# type: "adaptive"
|
|
253
|
+
|
|
254
|
+
# 6. anthropic (older models)
|
|
255
|
+
# Models: [Claude Mythos Preview, Claude Opus 4.6, Claude Sonnet 4.6, Claude Opus 4.5, Claude Sonnet 4.5, Claude Haiku 4.5]
|
|
256
|
+
# reasoning_param: "thinking"
|
|
257
|
+
# reasoning_value:
|
|
258
|
+
# type: "enabled"
|
|
259
|
+
# budget_tokens: 4000
|
|
260
|
+
|
|
261
|
+
# 7. deepseek
|
|
262
|
+
# Models: [deepseek-reasoner, deepseek-v4]
|
|
263
|
+
# reasoning_param: "reasoning_effort"
|
|
264
|
+
# reasoning_value: "high" # Options: "low", "high", "max"
|
|
265
|
+
|
|
266
|
+
# 8. deepseek (for deepseek's anthropic style models)
|
|
267
|
+
# reasoning_param: "thinking"
|
|
268
|
+
# reasoning_value:
|
|
269
|
+
# type: "enabled"
|
|
270
|
+
|
|
271
|
+
# 9. kimi
|
|
272
|
+
# reasoning_param: "reasoning_effort"
|
|
273
|
+
# reasoning_value: "high" # Options: "low", "high", "max" (default: "max")
|
|
274
|
+
|
|
275
|
+
# 10. grok/xAi
|
|
276
|
+
# reasoning_param: "reasoning_effort"
|
|
277
|
+
# reasoning_value: "high" # Options: "low", "medium", "high", "xhigh"
|
|
278
|
+
|
|
279
|
+
# 11. gemini (Gemini 2.5 series)
|
|
280
|
+
# reasoning_param: "thinking_config"
|
|
281
|
+
# reasoning_value:
|
|
282
|
+
# thinking_budget: 4000 # -1 for dynamic, 0 to disable, or an explicit integer budget
|
|
283
|
+
|
|
284
|
+
# 12. gemini (Gemini 3 / Gemini 4 series)
|
|
285
|
+
# reasoning_param: "thinking_config"
|
|
286
|
+
# reasoning_value:
|
|
287
|
+
# thinking_level: "high" # Options: "minimal", "low", "medium", "high"
|
|
288
|
+
|
|
289
|
+
# 13. gemini (If connecting to Gemini via Google's OpenAI-compatible endpoint)
|
|
290
|
+
# reasoning_param: "reasoning_effort"
|
|
291
|
+
# reasoning_value: "high" # Options: "low", "medium", "high"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import sys
|
|
2
3
|
import asyncio
|
|
3
4
|
from pathlib import Path
|
|
@@ -5,6 +6,7 @@ from typing import Any
|
|
|
5
6
|
import click
|
|
6
7
|
import yaml
|
|
7
8
|
from prompt_toolkit import PromptSession, print_formatted_text
|
|
9
|
+
from prompt_toolkit.styles import Style
|
|
8
10
|
from prompt_toolkit.formatted_text import HTML, FormattedText
|
|
9
11
|
from prompt_toolkit.patch_stdout import patch_stdout
|
|
10
12
|
|
|
@@ -30,6 +32,7 @@ from vamp_cli.agent.graph import create_graph
|
|
|
30
32
|
from vamp_cli.agent.roles import AgentRole
|
|
31
33
|
from vamp_cli.agent.status import FeedbackResponse
|
|
32
34
|
from vamp_cli.agent.context_sync import mode_switch_sync
|
|
35
|
+
from vamp_cli.agent.instructions import TODO_INSTRUCTIONS
|
|
33
36
|
|
|
34
37
|
from vamp_cli.persistence.emitter import EventEmitter
|
|
35
38
|
from vamp_cli.persistence.event_log import EventLog, uuid7
|
|
@@ -64,6 +67,9 @@ __VERSION__ = "0.1.0"
|
|
|
64
67
|
|
|
65
68
|
PROJECT_DIR = str(Path.cwd())
|
|
66
69
|
|
|
70
|
+
_dim_style = Style.from_dict({
|
|
71
|
+
'dimmed': "#767B7D",
|
|
72
|
+
})
|
|
67
73
|
|
|
68
74
|
def create(event_type: str, data: dict[str, Any]) -> str:
|
|
69
75
|
"""Serializes events into structured strings"""
|
|
@@ -163,9 +169,10 @@ async def streaming(
|
|
|
163
169
|
if isinstance(payload, dict):
|
|
164
170
|
print_formatted_text(
|
|
165
171
|
FormattedText([(
|
|
166
|
-
"
|
|
167
|
-
f"\nMode: {payload[
|
|
172
|
+
"class:dimmed",
|
|
173
|
+
f"\nMode: {payload['mode']}"
|
|
168
174
|
)]),
|
|
175
|
+
style=_dim_style,
|
|
169
176
|
end="\n"
|
|
170
177
|
)
|
|
171
178
|
|
|
@@ -199,24 +206,24 @@ async def streaming(
|
|
|
199
206
|
|
|
200
207
|
if reasoning_chunk:
|
|
201
208
|
if not thinking_open:
|
|
202
|
-
# print("Thinking:\n", end="", flush=True)
|
|
203
209
|
print_formatted_text(
|
|
204
210
|
FormattedText([(
|
|
205
|
-
"
|
|
211
|
+
"class:dimmed",
|
|
206
212
|
f"\nThinking:\n"
|
|
207
213
|
)]),
|
|
214
|
+
style=_dim_style,
|
|
208
215
|
end=""
|
|
209
216
|
)
|
|
210
217
|
thinking_open = True
|
|
211
|
-
|
|
218
|
+
|
|
212
219
|
print_formatted_text(
|
|
213
220
|
FormattedText([(
|
|
214
|
-
"
|
|
215
|
-
reasoning_chunk
|
|
221
|
+
"class:dimmed",
|
|
222
|
+
str(reasoning_chunk)
|
|
216
223
|
)]),
|
|
224
|
+
style=_dim_style,
|
|
217
225
|
end=""
|
|
218
226
|
)
|
|
219
|
-
|
|
220
227
|
# 2. capture final human text
|
|
221
228
|
elif chunk.content:
|
|
222
229
|
if thinking_open:
|
|
@@ -236,7 +243,7 @@ async def streaming(
|
|
|
236
243
|
print("\n[aborted by user]")
|
|
237
244
|
return call_usage
|
|
238
245
|
except Exception as e:
|
|
239
|
-
print("\n[Some error happened]: "
|
|
246
|
+
print("\n[Some error happened]: ")
|
|
240
247
|
return call_usage
|
|
241
248
|
|
|
242
249
|
print("\n")
|
|
@@ -821,6 +828,7 @@ async def main(resume_id: str | None = None):
|
|
|
821
828
|
content=coder_profile.system_prompt,
|
|
822
829
|
id="coder_system_prompt"
|
|
823
830
|
),
|
|
831
|
+
SystemMessage(content=TODO_INSTRUCTIONS),
|
|
824
832
|
HumanMessage(content=user_input),
|
|
825
833
|
],
|
|
826
834
|
"task": user_input,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: vamp-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.4
|
|
4
4
|
Summary: VAMP-CLI is an interactive coding agent for working in a local repository. It combines a planner, a coder, model fallbacks, workspace-aware file tools, and a Docker-backed command sandbox in one terminal application. The agent can inspect and edit files, search a codebase, run commands, maintain a task list, and ask for confirmation before executing potentially dangerous operations.
|
|
5
5
|
Author-email: Satyam Kumar <satkr2208@gmail.com>
|
|
6
6
|
License: MIT License
|
|
@@ -50,6 +50,7 @@ Requires-Dist: langgraph
|
|
|
50
50
|
Requires-Dist: langchain-litellm
|
|
51
51
|
Requires-Dist: langgraph-checkpoint-sqlite
|
|
52
52
|
Requires-Dist: aiosqlite
|
|
53
|
+
Requires-Dist: mcp
|
|
53
54
|
Dynamic: license-file
|
|
54
55
|
|
|
55
56
|
# VAMP-CLI
|
|
@@ -91,7 +92,7 @@ The first run automatically builds the `vamp-sandbox:latest` image from [`src/va
|
|
|
91
92
|
Create and activate a virtual environment, then install the project (all dependencies will be installed itself):
|
|
92
93
|
|
|
93
94
|
```bash
|
|
94
|
-
python3.
|
|
95
|
+
python3.12 -m venv .venv
|
|
95
96
|
source .venv/bin/activate
|
|
96
97
|
python -m pip install --upgrade pip
|
|
97
98
|
python -m pip install vamp-cli
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
LICENSE
|
|
2
|
+
MANIFEST.in
|
|
2
3
|
README.md
|
|
3
4
|
pyproject.toml
|
|
4
5
|
src/vamp_cli/__init__.py
|
|
@@ -20,6 +21,7 @@ src/vamp_cli/agent/status.py
|
|
|
20
21
|
src/vamp_cli/agent/runtime/__init__.py
|
|
21
22
|
src/vamp_cli/agent/runtime/runtime.py
|
|
22
23
|
src/vamp_cli/config/__init__.py
|
|
24
|
+
src/vamp_cli/config/default_config.yaml
|
|
23
25
|
src/vamp_cli/config/loader.py
|
|
24
26
|
src/vamp_cli/config/schema.py
|
|
25
27
|
src/vamp_cli/llm/__init__.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|