@agentvoy/core 0.1.0 → 0.3.0

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.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Anthropic SDK Adapter
3
+ *
4
+ * Scaffolds projects using the Anthropic Agent SDK (Python).
5
+ */
6
+ import type { FrameworkAdapter } from "../types.js";
7
+ export declare const anthropicAdapter: FrameworkAdapter;
8
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAMjB,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,gBAAgB,EAAE,gBAyE9B,CAAC"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ /**
3
+ * Anthropic SDK Adapter
4
+ *
5
+ * Scaffolds projects using the Anthropic Agent SDK (Python).
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.anthropicAdapter = void 0;
9
+ const config_js_1 = require("../config.js");
10
+ exports.anthropicAdapter = {
11
+ name: "anthropic",
12
+ displayName: "Anthropic SDK",
13
+ language: "python",
14
+ async scaffold(config) {
15
+ const files = [
16
+ {
17
+ path: "agent.py",
18
+ content: generateAgentFile(config),
19
+ },
20
+ {
21
+ path: "tools.py",
22
+ content: generateToolsFile(config),
23
+ },
24
+ {
25
+ path: "run.py",
26
+ content: generateRunFile(config),
27
+ },
28
+ {
29
+ path: "requirements.txt",
30
+ content: generateRequirements(),
31
+ },
32
+ {
33
+ path: ".env.example",
34
+ content: "ANTHROPIC_API_KEY=your-api-key-here\n",
35
+ },
36
+ {
37
+ path: "agent.guard.yml",
38
+ content: (0, config_js_1.generateDefaultConfig)(config.projectName, "anthropic", config.model.model || "claude-sonnet-4-20250514"),
39
+ },
40
+ ];
41
+ return {
42
+ files,
43
+ dependencies: {},
44
+ devDependencies: {},
45
+ scripts: {
46
+ start: "python run.py",
47
+ },
48
+ postInstallInstructions: [
49
+ "pip install -r requirements.txt",
50
+ "cp .env.example .env",
51
+ "Add your ANTHROPIC_API_KEY to .env",
52
+ "python run.py",
53
+ ],
54
+ };
55
+ },
56
+ validateConfig(config) {
57
+ const errors = [];
58
+ const warnings = [];
59
+ if (config.model.provider !== "anthropic") {
60
+ warnings.push({
61
+ field: "model.provider",
62
+ message: `Anthropic adapter works best with provider "anthropic", got "${config.model.provider}"`,
63
+ });
64
+ }
65
+ return { valid: errors.length === 0, errors, warnings };
66
+ },
67
+ getDependencies() {
68
+ return {
69
+ anthropic: ">=0.40.0",
70
+ "python-dotenv": ">=1.0.0",
71
+ };
72
+ },
73
+ };
74
+ function generateAgentFile(config) {
75
+ const model = config.model.model || "claude-sonnet-4-20250514";
76
+ const maxIterations = config.guardrails?.behavior?.max_iterations || 20;
77
+ return `"""
78
+ ${config.projectName} — Built with AgentVoy
79
+ https://github.com/agentvoy
80
+ """
81
+
82
+ import anthropic
83
+ from tools import get_tools, process_tool_call
84
+
85
+
86
+ def create_client() -> anthropic.Anthropic:
87
+ """Create the Anthropic client."""
88
+ return anthropic.Anthropic()
89
+
90
+
91
+ def run_agent(prompt: str) -> str:
92
+ """Run the agent with an agentic loop, enforcing agent.guard.yml at runtime."""
93
+ from agentvoy_guard import Guard
94
+ guard = Guard.from_config()
95
+
96
+ client = create_client()
97
+ tools = get_tools()
98
+ messages = [{"role": "user", "content": prompt}]
99
+
100
+ with guard.session() as session:
101
+ session.check_input(prompt)
102
+
103
+ while True:
104
+ session.tick()
105
+
106
+ response = client.messages.create(
107
+ model="${model}",
108
+ max_tokens=8096,
109
+ tools=tools,
110
+ messages=messages,
111
+ )
112
+
113
+ session.track_usage(response.usage)
114
+ messages.append({"role": "assistant", "content": response.content})
115
+
116
+ if response.stop_reason == "end_turn":
117
+ for block in response.content:
118
+ if hasattr(block, "text"):
119
+ session.check_output(block.text)
120
+ print(f"[guard] {guard.last_summary}")
121
+ return block.text
122
+ return "Done."
123
+
124
+ if response.stop_reason == "tool_use":
125
+ tool_results = []
126
+ for block in response.content:
127
+ if block.type == "tool_use":
128
+ session.tick_tool()
129
+ result = process_tool_call(block.name, block.input)
130
+ tool_results.append({
131
+ "type": "tool_result",
132
+ "tool_use_id": block.id,
133
+ "content": str(result),
134
+ })
135
+ messages.append({"role": "user", "content": tool_results})
136
+
137
+ return "Max iterations reached."
138
+ `;
139
+ }
140
+ function generateToolsFile(_config) {
141
+ return `"""
142
+ Agent tools — add your custom tools here.
143
+ """
144
+
145
+
146
+ def get_tools() -> list:
147
+ """Return tool definitions for the Anthropic API."""
148
+ return [
149
+ {
150
+ "name": "search_web",
151
+ "description": "Search the web for information on a given topic.",
152
+ "input_schema": {
153
+ "type": "object",
154
+ "properties": {
155
+ "query": {
156
+ "type": "string",
157
+ "description": "The search query.",
158
+ }
159
+ },
160
+ "required": ["query"],
161
+ },
162
+ },
163
+ {
164
+ "name": "read_file",
165
+ "description": "Read the contents of a file.",
166
+ "input_schema": {
167
+ "type": "object",
168
+ "properties": {
169
+ "path": {
170
+ "type": "string",
171
+ "description": "Path to the file to read.",
172
+ }
173
+ },
174
+ "required": ["path"],
175
+ },
176
+ },
177
+ ]
178
+
179
+
180
+ def process_tool_call(tool_name: str, tool_input: dict) -> str:
181
+ """Execute a tool call and return the result."""
182
+ if tool_name == "search_web":
183
+ return _search_web(tool_input["query"])
184
+ elif tool_name == "read_file":
185
+ return _read_file(tool_input["path"])
186
+ else:
187
+ return f"Unknown tool: {tool_name}"
188
+
189
+
190
+ def _search_web(query: str) -> str:
191
+ """Search the web for information."""
192
+ # TODO: Implement your search logic (e.g., Tavily, Serper, Brave Search)
193
+ return f"Search results for: {query}"
194
+
195
+
196
+ def _read_file(path: str) -> str:
197
+ """Read a file's contents."""
198
+ try:
199
+ with open(path, "r") as f:
200
+ return f.read()
201
+ except FileNotFoundError:
202
+ return f"File not found: {path}"
203
+ except PermissionError:
204
+ return f"Permission denied: {path}"
205
+ `;
206
+ }
207
+ function generateRunFile(config) {
208
+ return `"""
209
+ Run the ${config.projectName} agent.
210
+ """
211
+
212
+ from dotenv import load_dotenv
213
+ from agent import run_agent
214
+
215
+ load_dotenv()
216
+
217
+
218
+ def main():
219
+ print("\\n🚀 ${config.projectName} — Powered by AgentVoy")
220
+ print("=" * 50)
221
+ print("Type your prompt (or 'quit' to exit):\\n")
222
+
223
+ while True:
224
+ try:
225
+ prompt = input("> ")
226
+ if prompt.lower() in ("quit", "exit", "q"):
227
+ print("\\nGoodbye!")
228
+ break
229
+ if not prompt.strip():
230
+ continue
231
+
232
+ print("\\nThinking...\\n")
233
+ result = run_agent(prompt)
234
+ print(f"\\n{result}\\n")
235
+ except KeyboardInterrupt:
236
+ print("\\n\\nGoodbye!")
237
+ break
238
+
239
+
240
+ if __name__ == "__main__":
241
+ main()
242
+ `;
243
+ }
244
+ function generateRequirements() {
245
+ return `anthropic>=0.40.0
246
+ python-dotenv>=1.0.0
247
+ agentvoy-guard>=0.1.0
248
+ `;
249
+ }
250
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAUH,4CAAqD;AAExC,QAAA,gBAAgB,GAAqB;IAChD,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,eAAe;IAC5B,QAAQ,EAAE,QAAQ;IAElB,KAAK,CAAC,QAAQ,CAAC,MAAsB;QACnC,MAAM,KAAK,GAAoB;YAC7B;gBACE,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC;aACnC;YACD;gBACE,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC;aACnC;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC;aACjC;YACD;gBACE,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,oBAAoB,EAAE;aAChC;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,uCAAuC;aACjD;YACD;gBACE,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,IAAA,iCAAqB,EAC5B,MAAM,CAAC,WAAW,EAClB,WAAW,EACX,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,0BAA0B,CACjD;aACF;SACF,CAAC;QAEF,OAAO;YACL,KAAK;YACL,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,EAAE;YACnB,OAAO,EAAE;gBACP,KAAK,EAAE,eAAe;aACvB;YACD,uBAAuB,EAAE;gBACvB,iCAAiC;gBACjC,sBAAsB;gBACtB,oCAAoC;gBACpC,eAAe;aAChB;SACF,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,MAAwB;QACrC,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAyC,EAAE,CAAC;QAE1D,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,gEAAgE,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG;aAClG,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IAED,eAAe;QACb,OAAO;YACL,SAAS,EAAE,UAAU;YACrB,eAAe,EAAE,SAAS;SAC3B,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,iBAAiB,CAAC,MAAsB;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,0BAA0B,CAAC;IAC/D,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,cAAc,IAAI,EAAE,CAAC;IAExE,OAAO;EACP,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA6BK,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B7B,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAuB;IAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgER,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CAAC,MAAsB;IAC7C,OAAO;UACC,MAAM,CAAC,WAAW;;;;;;;;;;mBAUT,MAAM,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;CAuBpC,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO;;;CAGR,CAAC;AACF,CAAC"}
@@ -197,18 +197,25 @@ def main():
197
197
  print("\\n🚀 ${config.projectName} — Powered by AgentVoy")
198
198
  print("=" * 50)
199
199
 
200
+ from agentvoy_guard import Guard
201
+ guard = Guard.from_config()
202
+
200
203
  topic = input("\\nEnter a topic to research: ")
201
204
  if not topic.strip():
202
205
  print("No topic provided. Exiting.")
203
206
  return
204
207
 
205
- crew = create_crew()
206
- result = crew.kickoff(inputs={"topic": topic})
208
+ with guard.session() as session:
209
+ session.check_input(topic)
210
+ crew = create_crew()
211
+ result = crew.kickoff(inputs={"topic": topic})
212
+ session.check_output(str(result))
207
213
 
208
214
  print("\\n" + "=" * 50)
209
215
  print("RESULT:")
210
216
  print("=" * 50)
211
217
  print(result)
218
+ print(f"\\n[guard] {guard.last_summary}")
212
219
 
213
220
 
214
221
  if __name__ == "__main__":
@@ -219,6 +226,7 @@ function generateRequirements() {
219
226
  return `crewai>=0.80.0
220
227
  crewai-tools>=0.14.0
221
228
  python-dotenv>=1.0.0
229
+ agentvoy-guard>=0.1.0
222
230
  `;
223
231
  }
224
232
  function generateEnvExample(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"crewai.js","sourceRoot":"","sources":["../../src/adapters/crewai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"crewai.js","sourceRoot":"","sources":["../../src/adapters/crewai.ts"],"names":[],"mappings":"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"}
@@ -141,6 +141,7 @@ def read_file(path: str) -> dict:
141
141
  function generateRequirements() {
142
142
  return `google-adk>=1.0.0
143
143
  python-dotenv>=1.0.0
144
+ agentvoy-guard>=0.1.0
144
145
  `;
145
146
  }
146
147
  //# sourceMappingURL=google-adk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"google-adk.js","sourceRoot":"","sources":["../../src/adapters/google-adk.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAUH,4CAAqD;AAExC,QAAA,gBAAgB,GAAqB;IAChD,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,YAAY;IACzB,QAAQ,EAAE,QAAQ;IAElB,KAAK,CAAC,QAAQ,CAAC,MAAsB;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEvD,MAAM,KAAK,GAAoB;YAC7B;gBACE,IAAI,EAAE,GAAG,QAAQ,cAAc;gBAC/B,OAAO,EAAE,EAAE;aACZ;YACD;gBACE,IAAI,EAAE,GAAG,QAAQ,WAAW;gBAC5B,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC;aACnC;YACD;gBACE,IAAI,EAAE,GAAG,QAAQ,WAAW;gBAC5B,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC;aACnC;YACD;gBACE,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,oBAAoB,EAAE;aAChC;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,oCAAoC;aAC9C;YACD;gBACE,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,IAAA,iCAAqB,EAC5B,MAAM,CAAC,WAAW,EAClB,QAAQ,EACR,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,kBAAkB,CACzC;aACF;SACF,CAAC;QAEF,OAAO;YACL,KAAK;YACL,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,EAAE;YACnB,OAAO,EAAE;gBACP,KAAK,EAAE,WAAW,QAAQ,EAAE;gBAC5B,GAAG,EAAE,WAAW,QAAQ,EAAE;aAC3B;YACD,uBAAuB,EAAE;gBACvB,iCAAiC;gBACjC,sBAAsB;gBACtB,iCAAiC;gBACjC,WAAW,QAAQ,EAAE;gBACrB,8BAA8B,QAAQ,EAAE;aACzC;SACF,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,MAAwB;QACrC,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAyC,EAAE,CAAC;QAE1D,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,sDAAsD,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG;aACxF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IAED,eAAe;QACb,OAAO;YACL,YAAY,EAAE,SAAS;YACvB,eAAe,EAAE,SAAS;SAC3B,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,iBAAiB,CAAC,MAAsB;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAEvD,OAAO;EACP,MAAM,CAAC,WAAW;;;;;;;;YAQR,MAAM,CAAC,WAAW;aACjB,KAAK;;;;;;;;;;;CAWjB,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAuB;IAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCR,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO;;CAER,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"google-adk.js","sourceRoot":"","sources":["../../src/adapters/google-adk.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAUH,4CAAqD;AAExC,QAAA,gBAAgB,GAAqB;IAChD,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,YAAY;IACzB,QAAQ,EAAE,QAAQ;IAElB,KAAK,CAAC,QAAQ,CAAC,MAAsB;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEvD,MAAM,KAAK,GAAoB;YAC7B;gBACE,IAAI,EAAE,GAAG,QAAQ,cAAc;gBAC/B,OAAO,EAAE,EAAE;aACZ;YACD;gBACE,IAAI,EAAE,GAAG,QAAQ,WAAW;gBAC5B,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC;aACnC;YACD;gBACE,IAAI,EAAE,GAAG,QAAQ,WAAW;gBAC5B,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC;aACnC;YACD;gBACE,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,oBAAoB,EAAE;aAChC;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,oCAAoC;aAC9C;YACD;gBACE,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE,IAAA,iCAAqB,EAC5B,MAAM,CAAC,WAAW,EAClB,QAAQ,EACR,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,kBAAkB,CACzC;aACF;SACF,CAAC;QAEF,OAAO;YACL,KAAK;YACL,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,EAAE;YACnB,OAAO,EAAE;gBACP,KAAK,EAAE,WAAW,QAAQ,EAAE;gBAC5B,GAAG,EAAE,WAAW,QAAQ,EAAE;aAC3B;YACD,uBAAuB,EAAE;gBACvB,iCAAiC;gBACjC,sBAAsB;gBACtB,iCAAiC;gBACjC,WAAW,QAAQ,EAAE;gBACrB,8BAA8B,QAAQ,EAAE;aACzC;SACF,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,MAAwB;QACrC,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAyC,EAAE,CAAC;QAE1D,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,gBAAgB;gBACvB,OAAO,EAAE,sDAAsD,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG;aACxF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IAED,eAAe;QACb,OAAO;YACL,YAAY,EAAE,SAAS;YACvB,eAAe,EAAE,SAAS;SAC3B,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,SAAS,iBAAiB,CAAC,MAAsB;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,kBAAkB,CAAC;IAEvD,OAAO;EACP,MAAM,CAAC,WAAW;;;;;;;;YAQR,MAAM,CAAC,WAAW;aACjB,KAAK;;;;;;;;;;;CAWjB,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAuB;IAChD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCR,CAAC;AACF,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO;;;CAGR,CAAC;AACF,CAAC"}
@@ -16,8 +16,12 @@ const registry_js_2 = require("./registry.js");
16
16
  const openai_js_1 = require("./openai.js");
17
17
  const google_adk_js_1 = require("./google-adk.js");
18
18
  const crewai_js_1 = require("./crewai.js");
19
+ const anthropic_js_1 = require("./anthropic.js");
20
+ const langgraph_js_1 = require("./langgraph.js");
19
21
  // Register built-in adapters
20
22
  (0, registry_js_2.registerAdapter)(openai_js_1.openaiAdapter);
21
23
  (0, registry_js_2.registerAdapter)(google_adk_js_1.googleAdkAdapter);
22
24
  (0, registry_js_2.registerAdapter)(crewai_js_1.crewaiAdapter);
25
+ (0, registry_js_2.registerAdapter)(anthropic_js_1.anthropicAdapter);
26
+ (0, registry_js_2.registerAdapter)(langgraph_js_1.langgraphAdapter);
23
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6CAAsG;AAA7F,8GAAA,eAAe,OAAA;AAAE,yGAAA,UAAU,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,yGAAA,UAAU,OAAA;AAE9E,+CAAgD;AAChD,2CAA4C;AAC5C,mDAAmD;AACnD,2CAA4C;AAE5C,6BAA6B;AAC7B,IAAA,6BAAe,EAAC,yBAAa,CAAC,CAAC;AAC/B,IAAA,6BAAe,EAAC,gCAAgB,CAAC,CAAC;AAClC,IAAA,6BAAe,EAAC,yBAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,6CAAsG;AAA7F,8GAAA,eAAe,OAAA;AAAE,yGAAA,UAAU,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,yGAAA,UAAU,OAAA;AAE9E,+CAAgD;AAChD,2CAA4C;AAC5C,mDAAmD;AACnD,2CAA4C;AAC5C,iDAAkD;AAClD,iDAAkD;AAElD,6BAA6B;AAC7B,IAAA,6BAAe,EAAC,yBAAa,CAAC,CAAC;AAC/B,IAAA,6BAAe,EAAC,gCAAgB,CAAC,CAAC;AAClC,IAAA,6BAAe,EAAC,yBAAa,CAAC,CAAC;AAC/B,IAAA,6BAAe,EAAC,+BAAgB,CAAC,CAAC;AAClC,IAAA,6BAAe,EAAC,+BAAgB,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * LangGraph Adapter
3
+ *
4
+ * Scaffolds projects using LangGraph (Python) — stateful, graph-based agent workflows.
5
+ */
6
+ import type { FrameworkAdapter } from "../types.js";
7
+ export declare const langgraphAdapter: FrameworkAdapter;
8
+ //# sourceMappingURL=langgraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langgraph.d.ts","sourceRoot":"","sources":["../../src/adapters/langgraph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAMjB,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,gBAAgB,EAAE,gBAgF9B,CAAC"}
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ /**
3
+ * LangGraph Adapter
4
+ *
5
+ * Scaffolds projects using LangGraph (Python) — stateful, graph-based agent workflows.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.langgraphAdapter = void 0;
9
+ const config_js_1 = require("../config.js");
10
+ exports.langgraphAdapter = {
11
+ name: "langgraph",
12
+ displayName: "LangGraph",
13
+ language: "python",
14
+ async scaffold(config) {
15
+ const files = [
16
+ {
17
+ path: "agent.py",
18
+ content: generateAgentFile(config),
19
+ },
20
+ {
21
+ path: "tools.py",
22
+ content: generateToolsFile(),
23
+ },
24
+ {
25
+ path: "state.py",
26
+ content: generateStateFile(config),
27
+ },
28
+ {
29
+ path: "run.py",
30
+ content: generateRunFile(config),
31
+ },
32
+ {
33
+ path: "requirements.txt",
34
+ content: generateRequirements(config),
35
+ },
36
+ {
37
+ path: ".env.example",
38
+ content: generateEnvExample(config),
39
+ },
40
+ {
41
+ path: "agent.guard.yml",
42
+ content: (0, config_js_1.generateDefaultConfig)(config.projectName, "langgraph", config.model.model || "gpt-4o"),
43
+ },
44
+ ];
45
+ return {
46
+ files,
47
+ dependencies: {},
48
+ devDependencies: {},
49
+ scripts: {
50
+ start: "python run.py",
51
+ },
52
+ postInstallInstructions: [
53
+ "pip install -r requirements.txt",
54
+ "cp .env.example .env",
55
+ `Add your ${getApiKeyEnv(config)} to .env`,
56
+ "python run.py",
57
+ ],
58
+ };
59
+ },
60
+ validateConfig(config) {
61
+ const errors = [];
62
+ const warnings = [];
63
+ const supported = ["openai", "anthropic", "google"];
64
+ if (!supported.includes(config.model.provider)) {
65
+ warnings.push({
66
+ field: "model.provider",
67
+ message: `LangGraph works best with providers: ${supported.join(", ")}. Got "${config.model.provider}"`,
68
+ });
69
+ }
70
+ return { valid: errors.length === 0, errors, warnings };
71
+ },
72
+ getDependencies() {
73
+ return {
74
+ langgraph: ">=0.2.0",
75
+ langchain: ">=0.3.0",
76
+ "langchain-core": ">=0.3.0",
77
+ "python-dotenv": ">=1.0.0",
78
+ };
79
+ },
80
+ };
81
+ function getApiKeyEnv(config) {
82
+ const envMap = {
83
+ openai: "OPENAI_API_KEY",
84
+ anthropic: "ANTHROPIC_API_KEY",
85
+ google: "GOOGLE_API_KEY",
86
+ };
87
+ return envMap[config.model.provider] || "API_KEY";
88
+ }
89
+ function getLangChainPackage(config) {
90
+ const pkgMap = {
91
+ openai: "langchain-openai",
92
+ anthropic: "langchain-anthropic",
93
+ google: "langchain-google-genai",
94
+ };
95
+ return pkgMap[config.model.provider] || "langchain-openai";
96
+ }
97
+ function getLLMImport(config) {
98
+ const importMap = {
99
+ openai: "from langchain_openai import ChatOpenAI",
100
+ anthropic: "from langchain_anthropic import ChatAnthropic",
101
+ google: "from langchain_google_genai import ChatGoogleGenerativeAI",
102
+ };
103
+ return importMap[config.model.provider] || "from langchain_openai import ChatOpenAI";
104
+ }
105
+ function getLLMClass(config) {
106
+ const classMap = {
107
+ openai: "ChatOpenAI",
108
+ anthropic: "ChatAnthropic",
109
+ google: "ChatGoogleGenerativeAI",
110
+ };
111
+ return classMap[config.model.provider] || "ChatOpenAI";
112
+ }
113
+ function generateAgentFile(config) {
114
+ const model = config.model.model || "gpt-4o";
115
+ const maxIterations = config.guardrails?.behavior?.max_iterations || 20;
116
+ const llmImport = getLLMImport(config);
117
+ const llmClass = getLLMClass(config);
118
+ return `"""
119
+ ${config.projectName} — Built with AgentVoy
120
+ https://github.com/agentvoy
121
+
122
+ LangGraph agent with a stateful agentic loop.
123
+ """
124
+
125
+ from langchain_core.messages import HumanMessage, SystemMessage
126
+ from langgraph.graph import StateGraph, END
127
+ from langgraph.prebuilt import ToolNode
128
+ ${llmImport}
129
+
130
+ from state import AgentState
131
+ from tools import get_tools
132
+
133
+
134
+ def create_graph():
135
+ """Build the agent state graph."""
136
+ tools = get_tools()
137
+ llm = ${llmClass}(model="${model}").bind_tools(tools)
138
+ tool_node = ToolNode(tools)
139
+
140
+ def should_continue(state: AgentState) -> str:
141
+ """Route: call tools or finish."""
142
+ messages = state["messages"]
143
+ last = messages[-1]
144
+ if last.tool_calls:
145
+ return "tools"
146
+ return END
147
+
148
+ def call_model(state: AgentState) -> dict:
149
+ """Call the LLM with current messages."""
150
+ messages = state["messages"]
151
+ iteration = state.get("iteration", 0)
152
+
153
+ if iteration >= ${maxIterations}:
154
+ from langchain_core.messages import AIMessage
155
+ return {
156
+ "messages": [AIMessage(content="Max iterations reached.")],
157
+ "iteration": iteration,
158
+ }
159
+
160
+ response = llm.invoke(messages)
161
+ return {
162
+ "messages": [response],
163
+ "iteration": iteration + 1,
164
+ }
165
+
166
+ # Build the graph
167
+ graph = StateGraph(AgentState)
168
+ graph.add_node("agent", call_model)
169
+ graph.add_node("tools", tool_node)
170
+
171
+ graph.set_entry_point("agent")
172
+ graph.add_conditional_edges("agent", should_continue)
173
+ graph.add_edge("tools", "agent")
174
+
175
+ return graph.compile()
176
+
177
+
178
+ def run_agent(prompt: str) -> str:
179
+ """Run the agent graph with a user prompt."""
180
+ app = create_graph()
181
+
182
+ initial_state = {
183
+ "messages": [HumanMessage(content=prompt)],
184
+ "iteration": 0,
185
+ }
186
+
187
+ final_state = app.invoke(initial_state)
188
+ messages = final_state["messages"]
189
+
190
+ # Return the last AI message text
191
+ for msg in reversed(messages):
192
+ if hasattr(msg, "content") and isinstance(msg.content, str):
193
+ return msg.content
194
+
195
+ return "Done."
196
+ `;
197
+ }
198
+ function generateStateFile(_config) {
199
+ return `"""
200
+ Agent state definition for LangGraph.
201
+ """
202
+
203
+ from typing import TypedDict, Annotated, Sequence
204
+ from langchain_core.messages import BaseMessage
205
+ import operator
206
+
207
+
208
+ class AgentState(TypedDict):
209
+ """State passed between nodes in the graph."""
210
+ messages: Annotated[Sequence[BaseMessage], operator.add]
211
+ iteration: int
212
+ `;
213
+ }
214
+ function generateToolsFile() {
215
+ return `"""
216
+ Agent tools — add your custom tools here.
217
+ LangGraph uses @tool decorated functions from langchain_core.
218
+ """
219
+
220
+ from langchain_core.tools import tool
221
+
222
+
223
+ @tool
224
+ def search_web(query: str) -> str:
225
+ """Search the web for information on a given topic.
226
+
227
+ Args:
228
+ query: The search query.
229
+ """
230
+ # TODO: Implement your search logic (e.g., Tavily, Serper, Brave Search)
231
+ # Example with Tavily:
232
+ # from tavily import TavilyClient
233
+ # client = TavilyClient(api_key=os.environ["TAVILY_API_KEY"])
234
+ # return client.search(query)["results"][0]["content"]
235
+ return f"Search results for: {query}"
236
+
237
+
238
+ @tool
239
+ def read_file(path: str) -> str:
240
+ """Read the contents of a file.
241
+
242
+ Args:
243
+ path: Path to the file to read.
244
+ """
245
+ try:
246
+ with open(path, "r") as f:
247
+ return f.read()
248
+ except FileNotFoundError:
249
+ return f"File not found: {path}"
250
+ except PermissionError:
251
+ return f"Permission denied: {path}"
252
+
253
+
254
+ def get_tools() -> list:
255
+ """Return all available tools."""
256
+ return [search_web, read_file]
257
+ `;
258
+ }
259
+ function generateRunFile(config) {
260
+ return `"""
261
+ Run the ${config.projectName} agent.
262
+ """
263
+
264
+ from dotenv import load_dotenv
265
+ from agentvoy_guard import Guard
266
+ from agent import run_agent
267
+
268
+ load_dotenv()
269
+
270
+ guard = Guard.from_config()
271
+
272
+
273
+ def main():
274
+ print("\\n🚀 ${config.projectName} — Powered by AgentVoy")
275
+ print("=" * 50)
276
+ print("Type your prompt (or 'quit' to exit):\\n")
277
+
278
+ while True:
279
+ try:
280
+ prompt = input("> ")
281
+ if prompt.lower() in ("quit", "exit", "q"):
282
+ print("\\nGoodbye!")
283
+ break
284
+ if not prompt.strip():
285
+ continue
286
+
287
+ print("\\nThinking...\\n")
288
+ with guard.session() as session:
289
+ session.check_input(prompt)
290
+ result = run_agent(prompt)
291
+ session.check_output(result)
292
+ print(f"\\n{result}\\n")
293
+ print(f"[guard] {guard.last_summary}")
294
+ except KeyboardInterrupt:
295
+ print("\\n\\nGoodbye!")
296
+ break
297
+
298
+
299
+ if __name__ == "__main__":
300
+ main()
301
+ `;
302
+ }
303
+ function generateRequirements(config) {
304
+ const langchainPkg = getLangChainPackage(config);
305
+ return `langgraph>=0.2.0
306
+ langchain>=0.3.0
307
+ langchain-core>=0.3.0
308
+ ${langchainPkg}>=0.2.0
309
+ python-dotenv>=1.0.0
310
+ agentvoy-guard>=0.1.0
311
+ `;
312
+ }
313
+ function generateEnvExample(config) {
314
+ const envKey = getApiKeyEnv(config);
315
+ return `${envKey}=your-api-key-here\n`;
316
+ }
317
+ //# sourceMappingURL=langgraph.js.map