@agentvoy/core 0.2.0 → 0.4.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.
- package/README.md +65 -0
- package/dist/adapters/anthropic.d.ts.map +1 -1
- package/dist/adapters/anthropic.js +75 -75
- package/dist/adapters/anthropic.js.map +1 -1
- package/dist/adapters/app-scaffold.d.ts +12 -0
- package/dist/adapters/app-scaffold.d.ts.map +1 -0
- package/dist/adapters/app-scaffold.js +49 -0
- package/dist/adapters/app-scaffold.js.map +1 -0
- package/dist/adapters/autogen.d.ts +8 -0
- package/dist/adapters/autogen.d.ts.map +1 -0
- package/dist/adapters/autogen.js +259 -0
- package/dist/adapters/autogen.js.map +1 -0
- package/dist/adapters/crewai.d.ts.map +1 -1
- package/dist/adapters/crewai.js +80 -52
- package/dist/adapters/crewai.js.map +1 -1
- package/dist/adapters/google-adk.d.ts.map +1 -1
- package/dist/adapters/google-adk.js +73 -37
- package/dist/adapters/google-adk.js.map +1 -1
- package/dist/adapters/index.js +4 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/langgraph.d.ts.map +1 -1
- package/dist/adapters/langgraph.js +41 -42
- package/dist/adapters/langgraph.js.map +1 -1
- package/dist/adapters/llamaindex.d.ts +8 -0
- package/dist/adapters/llamaindex.d.ts.map +1 -0
- package/dist/adapters/llamaindex.js +230 -0
- package/dist/adapters/llamaindex.js.map +1 -0
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +76 -53
- package/dist/adapters/openai.js.map +1 -1
- package/dist/deployers/api-wrapper.d.ts +11 -0
- package/dist/deployers/api-wrapper.d.ts.map +1 -0
- package/dist/deployers/api-wrapper.js +86 -0
- package/dist/deployers/api-wrapper.js.map +1 -0
- package/dist/deployers/aws-lambda.d.ts +3 -0
- package/dist/deployers/aws-lambda.d.ts.map +1 -0
- package/dist/deployers/aws-lambda.js +101 -0
- package/dist/deployers/aws-lambda.js.map +1 -0
- package/dist/deployers/docker.d.ts +3 -0
- package/dist/deployers/docker.d.ts.map +1 -0
- package/dist/deployers/docker.js +123 -0
- package/dist/deployers/docker.js.map +1 -0
- package/dist/deployers/fly-io.d.ts +3 -0
- package/dist/deployers/fly-io.d.ts.map +1 -0
- package/dist/deployers/fly-io.js +84 -0
- package/dist/deployers/fly-io.js.map +1 -0
- package/dist/deployers/gcp-cloud-run.d.ts +3 -0
- package/dist/deployers/gcp-cloud-run.d.ts.map +1 -0
- package/dist/deployers/gcp-cloud-run.js +75 -0
- package/dist/deployers/gcp-cloud-run.js.map +1 -0
- package/dist/deployers/guard-mapper.d.ts +6 -0
- package/dist/deployers/guard-mapper.d.ts.map +1 -0
- package/dist/deployers/guard-mapper.js +63 -0
- package/dist/deployers/guard-mapper.js.map +1 -0
- package/dist/deployers/index.d.ts +6 -0
- package/dist/deployers/index.d.ts.map +1 -0
- package/dist/deployers/index.js +30 -0
- package/dist/deployers/index.js.map +1 -0
- package/dist/deployers/pipeline.d.ts +9 -0
- package/dist/deployers/pipeline.d.ts.map +1 -0
- package/dist/deployers/pipeline.js +55 -0
- package/dist/deployers/pipeline.js.map +1 -0
- package/dist/deployers/railway.d.ts +3 -0
- package/dist/deployers/railway.d.ts.map +1 -0
- package/dist/deployers/railway.js +53 -0
- package/dist/deployers/railway.js.map +1 -0
- package/dist/deployers/registry.d.ts +7 -0
- package/dist/deployers/registry.d.ts.map +1 -0
- package/dist/deployers/registry.js +29 -0
- package/dist/deployers/registry.js.map +1 -0
- package/dist/deployers/streamlit-app.d.ts +10 -0
- package/dist/deployers/streamlit-app.d.ts.map +1 -0
- package/dist/deployers/streamlit-app.js +80 -0
- package/dist/deployers/streamlit-app.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +17 -1
- package/src/adapters/anthropic.ts +0 -268
- package/src/adapters/crewai.ts +0 -254
- package/src/adapters/google-adk.ts +0 -167
- package/src/adapters/index.ts +0 -21
- package/src/adapters/langgraph.ts +0 -336
- package/src/adapters/openai.ts +0 -214
- package/src/adapters/registry.ts +0 -37
- package/src/config.ts +0 -315
- package/src/index.ts +0 -54
- package/src/types.ts +0 -203
- package/tsconfig.json +0 -8
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LlamaIndex Adapter
|
|
4
|
+
*
|
|
5
|
+
* Scaffolds projects using LlamaIndex (Python).
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.llamaindexAdapter = void 0;
|
|
9
|
+
const config_js_1 = require("../config.js");
|
|
10
|
+
const app_scaffold_js_1 = require("./app-scaffold.js");
|
|
11
|
+
exports.llamaindexAdapter = {
|
|
12
|
+
name: "llamaindex",
|
|
13
|
+
displayName: "LlamaIndex",
|
|
14
|
+
language: "python",
|
|
15
|
+
async scaffold(config) {
|
|
16
|
+
const isApp = config.buildMode === "app";
|
|
17
|
+
const agentNames = config.agentNames ?? ["agent"];
|
|
18
|
+
const files = [];
|
|
19
|
+
if (isApp) {
|
|
20
|
+
for (const agentName of agentNames) {
|
|
21
|
+
files.push({
|
|
22
|
+
path: `src/agents/${agentName}.py`,
|
|
23
|
+
content: generateAgentFile(config, agentName),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
files.push({ path: "src/tools/tools.py", content: generateToolsFile(config) });
|
|
27
|
+
for (const f of (0, app_scaffold_js_1.generateAppInfraFiles)(config))
|
|
28
|
+
files.push(f);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
files.push({ path: "agent.py", content: generateAgentFile(config, "agent") });
|
|
32
|
+
files.push({ path: "tools.py", content: generateToolsFile(config) });
|
|
33
|
+
files.push({ path: "run.py", content: generateRunFile(config) });
|
|
34
|
+
}
|
|
35
|
+
const envVar = getEnvVar(config.model.provider);
|
|
36
|
+
files.push({ path: "requirements.txt", content: generateRequirements(isApp) });
|
|
37
|
+
files.push({ path: ".env.example", content: `${envVar}=your-api-key-here\n` });
|
|
38
|
+
files.push({
|
|
39
|
+
path: "agent.guard.yml",
|
|
40
|
+
content: (0, config_js_1.generateDefaultConfig)(config.projectName, config.model.provider, config.model.model),
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
files,
|
|
44
|
+
dependencies: {},
|
|
45
|
+
devDependencies: {},
|
|
46
|
+
scripts: { start: isApp ? "uvicorn server:app --reload --port 8080" : "python run.py" },
|
|
47
|
+
postInstallInstructions: isApp
|
|
48
|
+
? (0, app_scaffold_js_1.appPostInstallInstructions)(envVar)
|
|
49
|
+
: [
|
|
50
|
+
"pip install -r requirements.txt",
|
|
51
|
+
"cp .env.example .env",
|
|
52
|
+
`Add your ${envVar} to .env`,
|
|
53
|
+
"python run.py",
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
validateConfig(config) {
|
|
58
|
+
const errors = [];
|
|
59
|
+
const warnings = [];
|
|
60
|
+
const supported = ["openai", "anthropic", "google"];
|
|
61
|
+
if (!supported.includes(config.model.provider)) {
|
|
62
|
+
warnings.push({
|
|
63
|
+
field: "model.provider",
|
|
64
|
+
message: `LlamaIndex works best with openai, anthropic, or google. Got "${config.model.provider}"`,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
68
|
+
},
|
|
69
|
+
getDependencies() {
|
|
70
|
+
return {
|
|
71
|
+
"llama-index": ">=0.12.0",
|
|
72
|
+
"python-dotenv": ">=1.0.0",
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
function getLLMImport(config) {
|
|
77
|
+
const provider = config.model.provider;
|
|
78
|
+
const model = config.model.model || "gpt-4o";
|
|
79
|
+
if (provider === "anthropic") {
|
|
80
|
+
return `from llama_index.llms.anthropic import Anthropic
|
|
81
|
+
llm = Anthropic(model="${model}")`;
|
|
82
|
+
}
|
|
83
|
+
if (provider === "google") {
|
|
84
|
+
return `from llama_index.llms.gemini import Gemini
|
|
85
|
+
llm = Gemini(model="${model}")`;
|
|
86
|
+
}
|
|
87
|
+
return `from llama_index.llms.openai import OpenAI
|
|
88
|
+
llm = OpenAI(model="${model}")`;
|
|
89
|
+
}
|
|
90
|
+
function getEnvVar(provider) {
|
|
91
|
+
const map = {
|
|
92
|
+
openai: "OPENAI_API_KEY",
|
|
93
|
+
anthropic: "ANTHROPIC_API_KEY",
|
|
94
|
+
google: "GOOGLE_API_KEY",
|
|
95
|
+
groq: "GROQ_API_KEY",
|
|
96
|
+
mistral: "MISTRAL_API_KEY",
|
|
97
|
+
};
|
|
98
|
+
return map[provider] || "OPENAI_API_KEY";
|
|
99
|
+
}
|
|
100
|
+
function generateAgentFile(config, agentName) {
|
|
101
|
+
const isApp = config.buildMode === "app";
|
|
102
|
+
const toolsImport = isApp
|
|
103
|
+
? "from src.tools.tools import get_tools"
|
|
104
|
+
: "from tools import get_tools";
|
|
105
|
+
const llmSetup = getLLMImport(config);
|
|
106
|
+
const maxIter = config.guardrails?.behavior?.max_iterations || 20;
|
|
107
|
+
return `"""
|
|
108
|
+
${agentName} agent — Part of ${config.projectName} (Built with AgentVoy)
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
from dotenv import load_dotenv
|
|
112
|
+
from llama_index.core.agent import ReActAgent
|
|
113
|
+
${llmSetup.split("\n")[0]}
|
|
114
|
+
${toolsImport}
|
|
115
|
+
|
|
116
|
+
load_dotenv()
|
|
117
|
+
|
|
118
|
+
${llmSetup.split("\n").slice(1).join("\n")}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def create_agent() -> ReActAgent:
|
|
122
|
+
"""Create and configure the LlamaIndex ReAct agent."""
|
|
123
|
+
tools = get_tools()
|
|
124
|
+
agent = ReActAgent.from_tools(
|
|
125
|
+
tools,
|
|
126
|
+
llm=llm,
|
|
127
|
+
verbose=True,
|
|
128
|
+
max_iterations=${maxIter},
|
|
129
|
+
system_prompt="""You are a helpful AI assistant.
|
|
130
|
+
|
|
131
|
+
Follow these guidelines:
|
|
132
|
+
- Be concise and accurate
|
|
133
|
+
- Ask for clarification when the request is ambiguous
|
|
134
|
+
- Respect the guardrails defined in agent.guard.yml
|
|
135
|
+
""",
|
|
136
|
+
)
|
|
137
|
+
return agent
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def run_agent(prompt: str) -> str:
|
|
141
|
+
"""Run the agent with the given prompt, enforcing agent.guard.yml at runtime."""
|
|
142
|
+
from agentvoy_guard import Guard
|
|
143
|
+
guard = Guard.from_config()
|
|
144
|
+
|
|
145
|
+
with guard.session() as session:
|
|
146
|
+
session.check_input(prompt)
|
|
147
|
+
|
|
148
|
+
agent = create_agent()
|
|
149
|
+
response = agent.chat(prompt)
|
|
150
|
+
final = str(response)
|
|
151
|
+
|
|
152
|
+
session.check_output(final)
|
|
153
|
+
|
|
154
|
+
print(f"[guard] {guard.last_summary}")
|
|
155
|
+
return final
|
|
156
|
+
`;
|
|
157
|
+
}
|
|
158
|
+
function generateToolsFile(_config) {
|
|
159
|
+
return `"""
|
|
160
|
+
Agent tools — add your custom tools here.
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
from llama_index.core.tools import FunctionTool
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def search_web(query: str) -> str:
|
|
167
|
+
"""Search the web for information."""
|
|
168
|
+
# TODO: Implement your search logic
|
|
169
|
+
return f"Search results for: {query}"
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def read_file(path: str) -> str:
|
|
173
|
+
"""Read the contents of a file."""
|
|
174
|
+
try:
|
|
175
|
+
with open(path, "r") as f:
|
|
176
|
+
return f.read()
|
|
177
|
+
except FileNotFoundError:
|
|
178
|
+
return f"File not found: {path}"
|
|
179
|
+
except PermissionError:
|
|
180
|
+
return f"Permission denied: {path}"
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def get_tools() -> list:
|
|
184
|
+
"""Return all available tools as LlamaIndex FunctionTools."""
|
|
185
|
+
return [
|
|
186
|
+
FunctionTool.from_defaults(fn=search_web),
|
|
187
|
+
FunctionTool.from_defaults(fn=read_file),
|
|
188
|
+
]
|
|
189
|
+
`;
|
|
190
|
+
}
|
|
191
|
+
function generateRunFile(config) {
|
|
192
|
+
return `"""
|
|
193
|
+
Run the ${config.projectName} agent.
|
|
194
|
+
"""
|
|
195
|
+
|
|
196
|
+
import asyncio
|
|
197
|
+
from agent import run_agent
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
async def main():
|
|
201
|
+
print("\\n${config.projectName} — Powered by AgentVoy + LlamaIndex")
|
|
202
|
+
print("=" * 50)
|
|
203
|
+
print("Type your prompt (or 'quit' to exit):\\n")
|
|
204
|
+
|
|
205
|
+
while True:
|
|
206
|
+
try:
|
|
207
|
+
prompt = input("> ")
|
|
208
|
+
if prompt.lower() in ("quit", "exit", "q"):
|
|
209
|
+
print("\\nGoodbye!")
|
|
210
|
+
break
|
|
211
|
+
if not prompt.strip():
|
|
212
|
+
continue
|
|
213
|
+
|
|
214
|
+
print("\\nThinking...\\n")
|
|
215
|
+
result = await run_agent(prompt)
|
|
216
|
+
print(f"\\n{result}\\n")
|
|
217
|
+
except KeyboardInterrupt:
|
|
218
|
+
print("\\n\\nGoodbye!")
|
|
219
|
+
break
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
if __name__ == "__main__":
|
|
223
|
+
asyncio.run(main())
|
|
224
|
+
`;
|
|
225
|
+
}
|
|
226
|
+
function generateRequirements(isApp = false) {
|
|
227
|
+
const base = `llama-index>=0.12.0\nllama-index-llms-openai>=0.4.0\nllama-index-llms-anthropic>=0.6.0\nllama-index-llms-gemini>=0.4.0\npython-dotenv>=1.0.0\nagentvoy-guard>=0.1.0\n`;
|
|
228
|
+
return isApp ? (0, app_scaffold_js_1.appendAppRequirements)(base) : base;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=llamaindex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llamaindex.js","sourceRoot":"","sources":["../../src/adapters/llamaindex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAMjB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAMjB,MAAM,aAAa,CAAC;AAIrB,eAAO,MAAM,aAAa,EAAE,gBA+E3B,CAAC"}
|
package/dist/adapters/openai.js
CHANGED
|
@@ -7,50 +7,60 @@
|
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
8
|
exports.openaiAdapter = void 0;
|
|
9
9
|
const config_js_1 = require("../config.js");
|
|
10
|
+
const app_scaffold_js_1 = require("./app-scaffold.js");
|
|
10
11
|
exports.openaiAdapter = {
|
|
11
12
|
name: "openai",
|
|
12
13
|
displayName: "OpenAI Agents SDK",
|
|
13
14
|
language: "python",
|
|
14
15
|
async scaffold(config) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
{
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
16
|
+
const isApp = config.buildMode === "app";
|
|
17
|
+
const isMulti = isApp && config.agentMode === "multi";
|
|
18
|
+
const agentNames = config.agentNames ?? ["agent"];
|
|
19
|
+
const files = [];
|
|
20
|
+
if (isApp) {
|
|
21
|
+
// src/agents/ — one file per agent
|
|
22
|
+
for (const agentName of agentNames) {
|
|
23
|
+
files.push({
|
|
24
|
+
path: `src/agents/${agentName}.py`,
|
|
25
|
+
content: generateAgentFile(config, agentName),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// src/tools/tools.py
|
|
29
|
+
files.push({ path: "src/tools/tools.py", content: generateToolsFile(config) });
|
|
30
|
+
// Common src/ infrastructure files
|
|
31
|
+
for (const f of (0, app_scaffold_js_1.generateAppInfraFiles)(config))
|
|
32
|
+
files.push(f);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
files.push({ path: "agent.py", content: generateAgentFile(config, "agent") });
|
|
36
|
+
files.push({ path: "tools.py", content: generateToolsFile(config) });
|
|
37
|
+
files.push({ path: "run.py", content: generateRunFile(config) });
|
|
38
|
+
}
|
|
39
|
+
files.push({
|
|
40
|
+
path: "requirements.txt",
|
|
41
|
+
content: generateRequirements(isApp),
|
|
42
|
+
});
|
|
43
|
+
files.push({
|
|
44
|
+
path: ".env.example",
|
|
45
|
+
content: "OPENAI_API_KEY=your-api-key-here\n",
|
|
46
|
+
});
|
|
47
|
+
files.push({
|
|
48
|
+
path: "agent.guard.yml",
|
|
49
|
+
content: (0, config_js_1.generateDefaultConfig)(config.projectName, config.model.provider, config.model.model),
|
|
50
|
+
});
|
|
41
51
|
return {
|
|
42
52
|
files,
|
|
43
53
|
dependencies: {},
|
|
44
54
|
devDependencies: {},
|
|
45
|
-
scripts: {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
scripts: { start: isApp ? "uvicorn server:app --reload --port 8080" : "python run.py" },
|
|
56
|
+
postInstallInstructions: isApp
|
|
57
|
+
? (0, app_scaffold_js_1.appPostInstallInstructions)("OPENAI_API_KEY")
|
|
58
|
+
: [
|
|
59
|
+
"pip install -r requirements.txt",
|
|
60
|
+
"cp .env.example .env",
|
|
61
|
+
"Add your OPENAI_API_KEY to .env",
|
|
62
|
+
"python run.py",
|
|
63
|
+
],
|
|
54
64
|
};
|
|
55
65
|
},
|
|
56
66
|
validateConfig(config) {
|
|
@@ -71,16 +81,17 @@ exports.openaiAdapter = {
|
|
|
71
81
|
};
|
|
72
82
|
},
|
|
73
83
|
};
|
|
74
|
-
function generateAgentFile(config) {
|
|
84
|
+
function generateAgentFile(config, agentName) {
|
|
75
85
|
const guardConfig = config.guardrails?.behavior;
|
|
76
86
|
const maxTurns = guardConfig?.max_iterations || 20;
|
|
87
|
+
const isApp = config.buildMode === "app";
|
|
88
|
+
const toolsImport = isApp ? "from src.tools.tools import get_tools" : "from tools import get_tools";
|
|
77
89
|
return `"""
|
|
78
|
-
${config.projectName}
|
|
79
|
-
https://github.com/agentvoy
|
|
90
|
+
${agentName} agent — Part of ${config.projectName} (Built with AgentVoy)
|
|
80
91
|
"""
|
|
81
92
|
|
|
82
93
|
from agents import Agent, Runner
|
|
83
|
-
|
|
94
|
+
${toolsImport}
|
|
84
95
|
|
|
85
96
|
|
|
86
97
|
def create_agent() -> Agent:
|
|
@@ -88,7 +99,7 @@ def create_agent() -> Agent:
|
|
|
88
99
|
tools = get_tools()
|
|
89
100
|
|
|
90
101
|
agent = Agent(
|
|
91
|
-
name="${
|
|
102
|
+
name="${agentName}",
|
|
92
103
|
instructions="""You are a helpful AI assistant.
|
|
93
104
|
|
|
94
105
|
Follow these guidelines:
|
|
@@ -103,15 +114,28 @@ Follow these guidelines:
|
|
|
103
114
|
return agent
|
|
104
115
|
|
|
105
116
|
|
|
106
|
-
|
|
107
|
-
"""Run the agent with the given prompt."""
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
def run_agent(prompt: str) -> str:
|
|
118
|
+
"""Run the agent with the given prompt, enforcing agent.guard.yml at runtime."""
|
|
119
|
+
import asyncio
|
|
120
|
+
from agentvoy_guard import Guard
|
|
121
|
+
guard = Guard.from_config()
|
|
122
|
+
|
|
123
|
+
async def _run():
|
|
124
|
+
agent = create_agent()
|
|
125
|
+
result = await Runner.run(
|
|
126
|
+
agent,
|
|
127
|
+
prompt,
|
|
128
|
+
max_turns=${maxTurns},
|
|
129
|
+
)
|
|
130
|
+
return result.final_output or ""
|
|
131
|
+
|
|
132
|
+
with guard.session() as session:
|
|
133
|
+
session.check_input(prompt)
|
|
134
|
+
final = asyncio.run(_run())
|
|
135
|
+
session.check_output(final)
|
|
136
|
+
|
|
137
|
+
print(f"[guard] {guard.last_summary}")
|
|
138
|
+
return final
|
|
115
139
|
`;
|
|
116
140
|
}
|
|
117
141
|
function generateToolsFile(_config) {
|
|
@@ -185,9 +209,8 @@ if __name__ == "__main__":
|
|
|
185
209
|
asyncio.run(main())
|
|
186
210
|
`;
|
|
187
211
|
}
|
|
188
|
-
function generateRequirements() {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
`;
|
|
212
|
+
function generateRequirements(isApp = false) {
|
|
213
|
+
const base = `openai-agents>=0.1.0\npython-dotenv>=1.0.0\nagentvoy-guard>=0.1.0\n`;
|
|
214
|
+
return isApp ? (0, app_scaffold_js_1.appendAppRequirements)(base) : base;
|
|
192
215
|
}
|
|
193
216
|
//# sourceMappingURL=openai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAUH,4CAAqD;
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Framework, AgentMode } from "../types.js";
|
|
2
|
+
interface ApiWrapperConfig {
|
|
3
|
+
projectName: string;
|
|
4
|
+
framework: Framework;
|
|
5
|
+
agentMode: AgentMode;
|
|
6
|
+
agentNames?: string[];
|
|
7
|
+
port: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function generateServerPy(config: ApiWrapperConfig): string;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=api-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-wrapper.d.ts","sourceRoot":"","sources":["../../src/deployers/api-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExD,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAyBD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA8DjE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateServerPy = generateServerPy;
|
|
4
|
+
function getFrameworkImport(framework, agentMode) {
|
|
5
|
+
if (agentMode === "multi") {
|
|
6
|
+
return `from src.pipeline import run_pipeline`;
|
|
7
|
+
}
|
|
8
|
+
return `from src.agents.agent import run_agent`;
|
|
9
|
+
}
|
|
10
|
+
function getInvokeCall(framework, agentMode) {
|
|
11
|
+
if (agentMode === "multi") {
|
|
12
|
+
return `run_pipeline(request.prompt)`;
|
|
13
|
+
}
|
|
14
|
+
return `run_agent(request.prompt)`;
|
|
15
|
+
}
|
|
16
|
+
function getResultExtract(agentMode) {
|
|
17
|
+
if (agentMode === "multi") {
|
|
18
|
+
return ` response = str(result["result"]) if isinstance(result, dict) else str(result)
|
|
19
|
+
guard_summary = result.get("guard_summary") if isinstance(result, dict) else None`;
|
|
20
|
+
}
|
|
21
|
+
return ` response = str(result)
|
|
22
|
+
guard_summary = None`;
|
|
23
|
+
}
|
|
24
|
+
function generateServerPy(config) {
|
|
25
|
+
const { projectName, framework, agentMode, port } = config;
|
|
26
|
+
const frameworkImport = getFrameworkImport(framework, agentMode);
|
|
27
|
+
const invokeCall = getInvokeCall(framework, agentMode);
|
|
28
|
+
const resultExtract = getResultExtract(agentMode);
|
|
29
|
+
return `"""
|
|
30
|
+
API server — Generated by AgentVoy
|
|
31
|
+
Wraps your agent as a FastAPI endpoint with agent.guard.yml enforcement.
|
|
32
|
+
|
|
33
|
+
Run:
|
|
34
|
+
uvicorn server:app --reload --port ${port}
|
|
35
|
+
|
|
36
|
+
Endpoints:
|
|
37
|
+
POST /run — send a prompt, get a response
|
|
38
|
+
GET /health — health check
|
|
39
|
+
"""
|
|
40
|
+
import os
|
|
41
|
+
from fastapi import FastAPI, HTTPException
|
|
42
|
+
from pydantic import BaseModel
|
|
43
|
+
from dotenv import load_dotenv
|
|
44
|
+
|
|
45
|
+
load_dotenv()
|
|
46
|
+
|
|
47
|
+
${frameworkImport}
|
|
48
|
+
|
|
49
|
+
app = FastAPI(
|
|
50
|
+
title="${projectName}",
|
|
51
|
+
description="AI agent powered by AgentVoy",
|
|
52
|
+
version="0.1.0",
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class AgentRequest(BaseModel):
|
|
57
|
+
prompt: str
|
|
58
|
+
session_id: str | None = None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class AgentResponse(BaseModel):
|
|
62
|
+
response: str
|
|
63
|
+
guard_summary: dict | None = None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@app.post("/run")
|
|
67
|
+
async def run(request: AgentRequest) -> AgentResponse:
|
|
68
|
+
try:
|
|
69
|
+
result = ${invokeCall}
|
|
70
|
+
${resultExtract}
|
|
71
|
+
return AgentResponse(response=response, guard_summary=guard_summary)
|
|
72
|
+
except Exception as e:
|
|
73
|
+
raise HTTPException(status_code=500, detail=str(e))
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@app.get("/health")
|
|
77
|
+
async def health():
|
|
78
|
+
return {"status": "ok", "agent": "${projectName}"}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
if __name__ == "__main__":
|
|
82
|
+
import uvicorn
|
|
83
|
+
uvicorn.run(app, host="0.0.0.0", port=${port})
|
|
84
|
+
`;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=api-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-wrapper.js","sourceRoot":"","sources":["../../src/deployers/api-wrapper.ts"],"names":[],"mappings":";;AAiCA,4CA8DC;AArFD,SAAS,kBAAkB,CAAC,SAAoB,EAAE,SAAoB;IACpE,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,uCAAuC,CAAC;IACjD,CAAC;IACD,OAAO,wCAAwC,CAAC;AAClD,CAAC;AAED,SAAS,aAAa,CAAC,SAAoB,EAAE,SAAoB;IAC/D,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,8BAA8B,CAAC;IACxC,CAAC;IACD,OAAO,2BAA2B,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAoB;IAC5C,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO;0FAC+E,CAAC;IACzF,CAAC;IACD,OAAO;6BACoB,CAAC;AAC9B,CAAC;AAED,SAAgB,gBAAgB,CAAC,MAAwB;IACvD,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAC3D,MAAM,eAAe,GAAG,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAElD,OAAO;;;;;yCAKgC,IAAI;;;;;;;;;;;;;EAa3C,eAAe;;;aAGJ,WAAW;;;;;;;;;;;;;;;;;;;mBAmBL,UAAU;EAC3B,aAAa;;;;;;;;wCAQyB,WAAW;;;;;4CAKP,IAAI;CAC/C,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-lambda.d.ts","sourceRoot":"","sources":["../../src/deployers/aws-lambda.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAyD,MAAM,aAAa,CAAC;AAkE5G,eAAO,MAAM,gBAAgB,EAAE,iBAwC9B,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.awsLambdaAdapter = void 0;
|
|
4
|
+
const guard_mapper_js_1 = require("./guard-mapper.js");
|
|
5
|
+
function generateSamTemplate(config) {
|
|
6
|
+
const { projectName, port } = config;
|
|
7
|
+
const cloudConfig = (0, guard_mapper_js_1.mapGuardToCloudConfig)(config.guard);
|
|
8
|
+
const timeoutSeconds = cloudConfig.timeout
|
|
9
|
+
? parseInt(cloudConfig.timeout.replace("s", ""), 10)
|
|
10
|
+
: 300;
|
|
11
|
+
const memoryMb = cloudConfig.memory?.includes("Gi")
|
|
12
|
+
? parseInt(cloudConfig.memory) * 1024
|
|
13
|
+
: 512;
|
|
14
|
+
return `# template.yaml — AWS SAM template — Generated by AgentVoy
|
|
15
|
+
# Deploy: sam build && sam deploy --guided
|
|
16
|
+
|
|
17
|
+
AWSTemplateFormatVersion: "2010-09-09"
|
|
18
|
+
Transform: AWS::Serverless-2016-10-31
|
|
19
|
+
|
|
20
|
+
Description: ${projectName} — AI agent deployed with AgentVoy
|
|
21
|
+
|
|
22
|
+
Globals:
|
|
23
|
+
Function:
|
|
24
|
+
Timeout: ${timeoutSeconds}
|
|
25
|
+
MemorySize: ${memoryMb}
|
|
26
|
+
Environment:
|
|
27
|
+
Variables:
|
|
28
|
+
PORT: "${port}"
|
|
29
|
+
|
|
30
|
+
Resources:
|
|
31
|
+
AgentFunction:
|
|
32
|
+
Type: AWS::Serverless::Function
|
|
33
|
+
Properties:
|
|
34
|
+
FunctionName: ${projectName.toLowerCase().replace(/[^a-z0-9-]/g, "-")}
|
|
35
|
+
PackageType: Image
|
|
36
|
+
Events:
|
|
37
|
+
ApiRoot:
|
|
38
|
+
Type: HttpApi
|
|
39
|
+
Properties:
|
|
40
|
+
Path: /{proxy+}
|
|
41
|
+
Method: ANY
|
|
42
|
+
Metadata:
|
|
43
|
+
DockerTag: latest
|
|
44
|
+
DockerContext: .
|
|
45
|
+
Dockerfile: Dockerfile
|
|
46
|
+
|
|
47
|
+
Outputs:
|
|
48
|
+
ApiUrl:
|
|
49
|
+
Description: API Gateway endpoint URL
|
|
50
|
+
Value: !Sub "https://\${ServerlessHttpApi}.execute-api.\${AWS::Region}.amazonaws.com/"
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
function generateMangumPatch() {
|
|
54
|
+
return `"""
|
|
55
|
+
AWS Lambda handler — add to server.py or as a separate handler.py
|
|
56
|
+
Uses Mangum to wrap the FastAPI app for Lambda.
|
|
57
|
+
"""
|
|
58
|
+
from mangum import Mangum
|
|
59
|
+
from server import app # import your FastAPI app
|
|
60
|
+
|
|
61
|
+
# Lambda handler
|
|
62
|
+
handler = Mangum(app, lifespan="off")
|
|
63
|
+
`;
|
|
64
|
+
}
|
|
65
|
+
exports.awsLambdaAdapter = {
|
|
66
|
+
target: "aws-lambda",
|
|
67
|
+
displayName: "AWS Lambda",
|
|
68
|
+
requiredCLI: "sam",
|
|
69
|
+
async validate(config) {
|
|
70
|
+
const errors = [];
|
|
71
|
+
const warnings = [];
|
|
72
|
+
const missingTools = [];
|
|
73
|
+
try {
|
|
74
|
+
const { execSync } = await import("child_process");
|
|
75
|
+
execSync("sam --version", { stdio: "ignore" });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
missingTools.push("sam");
|
|
79
|
+
warnings.push({
|
|
80
|
+
field: "sam",
|
|
81
|
+
message: "AWS SAM CLI not found — install from https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html",
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return { valid: errors.length === 0, errors, warnings, missingTools };
|
|
85
|
+
},
|
|
86
|
+
async generateFiles(config) {
|
|
87
|
+
const files = [
|
|
88
|
+
{ path: "deploy/template.yaml", content: generateSamTemplate(config) },
|
|
89
|
+
{ path: "deploy/lambda_handler.py", content: generateMangumPatch() },
|
|
90
|
+
];
|
|
91
|
+
const instructions = [
|
|
92
|
+
`pip install mangum # Lambda adapter for FastAPI`,
|
|
93
|
+
`aws configure # set AWS credentials`,
|
|
94
|
+
`sam build`,
|
|
95
|
+
`sam deploy --guided`,
|
|
96
|
+
`# Follow prompts to set stack name, region, and env vars`,
|
|
97
|
+
];
|
|
98
|
+
return { files, instructions };
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=aws-lambda.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-lambda.js","sourceRoot":"","sources":["../../src/deployers/aws-lambda.ts"],"names":[],"mappings":";;;AACA,uDAA0D;AAE1D,SAAS,mBAAmB,CAAC,MAAoB;IAC/C,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACrC,MAAM,WAAW,GAAG,IAAA,uCAAqB,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO;QACxC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,CAAC,CAAC,GAAG,CAAC;IACR,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC;QACjD,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;QACrC,CAAC,CAAC,GAAG,CAAC;IAER,OAAO;;;;;;eAMM,WAAW;;;;eAIX,cAAc;kBACX,QAAQ;;;iBAGT,IAAI;;;;;;sBAMC,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;;;;;;;;;;;;;;;;;CAiB1E,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO;;;;;;;;;CASR,CAAC;AACF,CAAC;AAEY,QAAA,gBAAgB,GAAsB;IACjD,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,KAAK;IAElB,KAAK,CAAC,QAAQ,CAAC,MAAoB;QACjC,MAAM,MAAM,GAAyC,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAyC,EAAE,CAAC;QAC1D,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YACnD,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,0IAA0I;aACpJ,CAAC,CAAC;QACL,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAoB;QACtC,MAAM,KAAK,GAAG;YACZ,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE;YACtE,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE;SACrE,CAAC;QAEF,MAAM,YAAY,GAAG;YACnB,kDAAkD;YAClD,sCAAsC;YACtC,WAAW;YACX,qBAAqB;YACrB,0DAA0D;SAC3D,CAAC;QAEF,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACjC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/deployers/docker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAyD,MAAM,aAAa,CAAC;AAsF5G,eAAO,MAAM,aAAa,EAAE,iBA4C3B,CAAC"}
|