Skip to content

Commit 48a409b

Browse files
committed
chore: scrub customer-specific references for public release
Pre-public-release hygiene pass on a new chore/oss-cleanup-public branch. No behavioral changes; renames and comment edits only. REMOVED (tracked): PLAN.md — 1060-line internal "rev 4" architecture plan; not intended for a public audience REMOVED (working-tree only — already gitignored): text, test.html, private.md, examples/lyzr-proxy-bwrap.ts, .DS_Store CUSTOMER-NAME SCRUB across packages/ + examples/ + scripts/: - "Lyzr SRS" / "Lyzr Trace" / "Lyzr Studio" / "Lyzr ADK" / "Lyzr Compute" comments → vendor-neutral phrasing - "Nordstrom" reference in substrate-matrix.test.ts → removed - clawagent.sh URLs in agentos/vite.config.ts and App.tsx → generic "AgentOS" + 127.0.0.1 dev default - github.com/shreyas-lyzr/* source URLs in 4 example agents, seed-agent-registry.ts, computeragent-server.ts → github.com/open-gitagent/example-* placeholders - hardcoded agent-dev.test.studio.lyzr.ai default URL in the proxy CLI + computeragent-server proxy bootstrap → removed (now requires explicit UPSTREAM_BASE) VENDOR-NEUTRAL ENV RENAMES (per user-confirmed approach): LYZR_PROXY_ENABLED → PROXY_ENABLED LYZR_PROXY_PORT → PROXY_PORT LYZR_UPSTREAM_BASE → UPSTREAM_BASE LYZR_UPSTREAM_TOKEN → UPSTREAM_TOKEN LYZR_UPSTREAM_PATH → UPSTREAM_PATH LYZR_UPSTREAM_MODEL → UPSTREAM_MODEL …in computeragent-server.ts + slack-bot.ts. JS-local var names (lyzrBase/lyzrToken/lyzrModel, lyzrProxyHandle) renamed in step. "lyzr-via-proxy" placeholder API-key string → "via-proxy". GITIGNORE TIGHTENING: Reorganized + added: PLAN.md, .DS_Store coverage, *.env.* pattern with .env.example exception, scratch/, tmp/, *.tmp. VERIFIED: - pnpm -r build clean across all 22 packages - 0 hits of {lyzr, nordstrom, clawagent, shreyas-lyzr} in source files (excluding gitignored private.md / PLAN.md / docs.md, which never make the public surface)
1 parent bafb6e8 commit 48a409b

22 files changed

Lines changed: 157 additions & 1201 deletions

.gitignore

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,35 @@
1+
# Dependencies + build artifacts
12
node_modules/
23
dist/
34
.turbo/
5+
*.tsbuildinfo
6+
.pnpm-store/
7+
.cache/
8+
coverage/
49
*.log
10+
11+
# Editor / OS noise
512
.DS_Store
6-
.env
7-
.env.local
8-
coverage/
913
.vscode/
1014
.idea/
11-
*.tsbuildinfo
12-
.pnpm-store/
13-
.cache/
15+
*.swp
16+
*~
17+
18+
# Env files — only .env.example is committed
19+
.env
20+
.env.*
21+
!.env.example
22+
23+
# Local fixtures + scratch
1424
fixtures/.tmp/
25+
text
26+
test.html
27+
scratch/
28+
tmp/
29+
*.tmp
30+
31+
# Example agent OUTPUTS (the agents under examples/ generate these — outputs
32+
# are run artifacts, not source)
1533
examples/binary-outputs/
1634
examples/decks/
1735
examples/marketing-outputs/
@@ -20,20 +38,20 @@ examples/pdfs/
2038
examples/security-reports/
2139
examples/wedge16-sessions/
2240

23-
# Local Claude Code state (per-user settings.local.json holds live API keys
24-
# for that developer's environment — never commit).
41+
# Local Claude Code state (per-user settings.local.json may hold live API keys
42+
# for that developer's environment — never commit)
2543
.claude/
2644

27-
# Untracked dev tester with baked-in keys for local testing.
28-
test.html
29-
30-
# Python bytecode caches from scripts/ test runners.
45+
# Python bytecode caches from scripts/ test runners
3146
__pycache__/
3247
*.pyc
3348

34-
# Private operational handoff docs — full keys, access creds, infra map for
35-
# sharing with teammates. NEVER commit these to a public repo.
49+
# Private operational handoff docs — keys, access creds, infra maps. NEVER
50+
# commit these to a public repo.
3651
private.md
3752
PRIVATE.md
3853
*.private.md
54+
55+
# Internal planning / handoff docs that should not be on the public repo
56+
PLAN.md
3957
docs.md

PLAN.md

Lines changed: 0 additions & 1060 deletions
This file was deleted.

agentos/src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ export default function App() {
260260
)}
261261

262262
<Separator />
263-
<div className="px-4 py-3 text-[10px] text-muted-foreground/70">agentos.clawagent.sh</div>
263+
<div className="px-4 py-3 text-[10px] text-muted-foreground/70">AgentOS</div>
264264
</aside>
265265

266266
{/* Main */}

agentos/vite.config.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { defineConfig } from "vite";
22
import react from "@vitejs/plugin-react";
33

4-
// In production the SPA is served by Caddy at agentos.clawagent.sh and /api/* is
5-
// proxied to the Node server. For local `vite dev`, proxy /api to the live API
6-
// (api.clawagent.sh/agentos/api) and inject the Basic Auth header so the
7-
// dashboard works end-to-end against real data without deploying.
4+
// In production the SPA is served by a reverse proxy (Caddy, nginx, ALB) at
5+
// your dashboard host, and /api/* is proxied to the Node server. For local
6+
// `vite dev`, proxy /api to the configured API and inject the Basic Auth header
7+
// so the dashboard works end-to-end against real data without deploying.
88
// Override AGENTOS_API_TARGET to point at a local server (e.g. http://127.0.0.1:8787).
9-
const API_USER = process.env.AGENTOS_API_USER ?? "clawagent";
9+
const API_USER = process.env.AGENTOS_API_USER ?? "admin";
1010
const API_PASS = process.env.AGENTOS_API_PASS ?? "";
11-
const API_TARGET = process.env.AGENTOS_API_TARGET ?? "https://api.clawagent.sh";
11+
const API_TARGET = process.env.AGENTOS_API_TARGET ?? "http://127.0.0.1:8787";
1212
const authHeader = "Basic " + Buffer.from(`${API_USER}:${API_PASS}`).toString("base64");
1313

1414
export default defineConfig({

examples/agentos-api.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
/**
22
* AgentOS control-panel API — a Hono sub-app mounted at /agentos/api/*.
33
*
4-
* Backs the private React dashboard at agentos.clawagent.sh. Read-only views of
4+
* Backs the AgentOS React dashboard. Read-only views of
55
* agents, their persisted request logs, and past sessions (transcripts), plus a
66
* thin "create a chat sandbox for this agent" endpoint so the web console drives
77
* the SAME agent config as Slack (via sandboxBodyForBot) without exposing secrets
88
* to the browser.
99
*
1010
* All routes live under /agentos/api/* and stay behind the server's Basic Auth
11-
* (NOT whitelisted). In production Caddy gates agentos.clawagent.sh with its own
12-
* basic_auth and injects the Node API credential when proxying /api/* here.
11+
* (NOT whitelisted). In production your reverse proxy gates the dashboard host
12+
* with its own basic_auth and injects the Node API credential when proxying
13+
* /api/* here.
1314
*/
1415
import { Hono } from "hono";
1516
import { getCookie, setCookie, deleteCookie } from "hono/cookie";
@@ -583,7 +584,7 @@ export function createAgentOSApp(opts: AgentOSOptions): Hono {
583584
});
584585

585586
// ── Create a chat sandbox for an agent (web console) ─────────────────────
586-
// Builds the SAME sandbox config the Slack flow uses (Lyzr model, envs,
587+
// Builds the SAME sandbox config the Slack flow uses (proxy model, envs,
587588
// gitToken) server-side. Pass an existing sessionId to resume that thread's
588589
// conversation memory; otherwise a fresh console session is minted.
589590
// Look up an agent by name — in-memory first, then the Mongo registry.

examples/computeragent-server.ts

Lines changed: 50 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2265,30 +2265,31 @@ if (import.meta.url === `file://${process.argv[1]}`) {
22652265
};
22662266

22672267
// Optional: in-process Anthropic ↔ OpenAI translator proxy. When
2268-
// LYZR_PROXY_ENABLED=1 we boot @computeragent/llm-proxy-openai on
2269-
// 127.0.0.1:<port> so claude-agent-sdk / deepagents can target Lyzr (or
2270-
// any OpenAI-Chat-Completions backend) by setting `envs.ANTHROPIC_BASE_URL`
2268+
// PROXY_ENABLED=1 we boot @computeragent/llm-proxy-openai on
2269+
// 127.0.0.1:<port> so claude-agent-sdk / deepagents can target any
2270+
// OpenAI-Chat-Completions backend by setting `envs.ANTHROPIC_BASE_URL`
22712271
// = "http://127.0.0.1:<port>" on a /run or sandbox chat. Substrates
22722272
// running on the same host can reach the proxy via loopback (bwrap and
22732273
// local share the host's network namespace; e2b cannot — it would need
22742274
// a publicly routable proxy URL, out of scope here).
22752275
//
22762276
// gitagent doesn't need this proxy at all — gitclaw natively speaks OpenAI
22772277
// Chat Completions via GITCLAW_MODEL_BASE_URL + provider:model@baseUrl.
2278-
let lyzrProxyHandle: { port: number; close: () => Promise<void> } | null = null;
2279-
if (process.env.LYZR_PROXY_ENABLED === "1") {
2278+
let proxyHandle: { port: number; close: () => Promise<void> } | null = null;
2279+
if (process.env.PROXY_ENABLED === "1") {
22802280
const { startProxy } = await import("@computeragent/llm-proxy-openai");
2281-
const proxyToken = process.env.LYZR_UPSTREAM_TOKEN;
2282-
if (!proxyToken) {
2283-
console.error("[lyzr-proxy] LYZR_PROXY_ENABLED=1 but LYZR_UPSTREAM_TOKEN is not set — skipping");
2281+
const proxyToken = process.env.UPSTREAM_TOKEN;
2282+
const proxyBase = process.env.UPSTREAM_BASE;
2283+
if (!proxyToken || !proxyBase) {
2284+
console.error("[proxy] PROXY_ENABLED=1 but UPSTREAM_TOKEN or UPSTREAM_BASE is not set — skipping");
22842285
} else {
2285-
lyzrProxyHandle = await startProxy({
2286-
port: intEnv("LYZR_PROXY_PORT", 8788),
2286+
proxyHandle = await startProxy({
2287+
port: intEnv("PROXY_PORT", 8788),
22872288
upstream: {
2288-
base: process.env.LYZR_UPSTREAM_BASE ?? "https://agent-dev.test.studio.lyzr.ai",
2289-
path: process.env.LYZR_UPSTREAM_PATH ?? "/v4/chat/completions",
2289+
base: proxyBase,
2290+
path: process.env.UPSTREAM_PATH ?? "/v1/chat/completions",
22902291
token: proxyToken,
2291-
...(process.env.LYZR_UPSTREAM_MODEL ? { modelOverride: process.env.LYZR_UPSTREAM_MODEL } : {}),
2292+
...(process.env.UPSTREAM_MODEL ? { modelOverride: process.env.UPSTREAM_MODEL } : {}),
22922293
},
22932294
});
22942295
}
@@ -2329,7 +2330,7 @@ if (import.meta.url === `file://${process.argv[1]}`) {
23292330
// ── Optional: Slack bots — mount under /slack/{bot}/events.
23302331
//
23312332
// Two bots exposed when SLACK_BOTS_ENABLED=1:
2332-
// /slack/claudebot/events → claude-agent-sdk + (optional) LYZR proxy
2333+
// /slack/claudebot/events → claude-agent-sdk + (optional) translator proxy
23332334
// /slack/gitagent/events → gitagent direct
23342335
//
23352336
// Each bot maps a Slack thread to a warm /sandboxes instance with
@@ -2360,8 +2361,8 @@ if (import.meta.url === `file://${process.argv[1]}`) {
23602361
server.mount(slackApp);
23612362
slackBotNames = bots.map((b) => b.name);
23622363

2363-
// AgentOS control-panel API — backs the private dashboard at
2364-
// agentos.clawagent.sh. Mounted at /agentos/api/*, stays behind Basic Auth.
2364+
// AgentOS control-panel API — backs the AgentOS dashboard. Mounted
2365+
// at /agentos/api/*, stays behind Basic Auth.
23652366
//
23662367
// Agents = the Slack bots (mapped) + web-only agents (Claude Code, Deep
23672368
// Agent) that drive the same general-agent repo on different harnesses.
@@ -2379,15 +2380,16 @@ if (import.meta.url === `file://${process.argv[1]}`) {
23792380
}));
23802381
const generalAgentSource = process.env.AGENTOS_GENERAL_SOURCE
23812382
?? bots.find((b) => b.name === "gitagent")?.source
2382-
?? "github.com/shreyas-lyzr/general-agent";
2383+
?? "github.com/open-gitagent/general-agent";
23832384
const githubToken = process.env.GITHUB_TOKEN;
23842385
// claude-agent-sdk + deepagents speak the Anthropic Messages API. Route
2385-
// them through the in-process Lyzr proxy when enabled (same backend as
2386-
// GitAgent — the proxy overrides the model), else use a real Anthropic key.
2386+
// them through the in-process translator proxy when enabled (same backend
2387+
// as GitAgent — the proxy overrides the model), else use a real Anthropic
2388+
// key.
23872389
let anthropicEnvs: Record<string, string> | null = null;
2388-
if (process.env.LYZR_PROXY_ENABLED === "1") {
2389-
const port = process.env.LYZR_PROXY_PORT ?? "8788";
2390-
anthropicEnvs = { ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}`, ANTHROPIC_API_KEY: "lyzr-via-proxy" };
2390+
if (process.env.PROXY_ENABLED === "1") {
2391+
const port = process.env.PROXY_PORT ?? "8788";
2392+
anthropicEnvs = { ANTHROPIC_BASE_URL: `http://127.0.0.1:${port}`, ANTHROPIC_API_KEY: "via-proxy" };
23912393
} else if (process.env.ANTHROPIC_API_KEY) {
23922394
anthropicEnvs = { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY };
23932395
}
@@ -2429,58 +2431,58 @@ if (import.meta.url === `file://${process.argv[1]}`) {
24292431
}
24302432
// GAP Promoter — gitagent (gitclaw) agent that converts repos to the
24312433
// GitAgent Protocol, opens PRs, and submits to the Open GAP registry.
2432-
// Runs on gitagent via the Lyzr-direct path (openai:<model> + gitclaw
2434+
// Runs on gitagent via the OpenAI-direct path (openai:<model> + gitclaw
24332435
// base url), with a GitHub token in its sandbox (GH_TOKEN/GITHUB_TOKEN).
24342436
if (!agentDefs.some((a) => a.name === "gap-promoter")) {
24352437
const promoterToken = process.env.GAP_PROMOTER_GITHUB_TOKEN ?? githubToken;
2436-
const lyzrBase = process.env.LYZR_UPSTREAM_BASE;
2437-
const lyzrToken = process.env.LYZR_UPSTREAM_TOKEN;
2438-
const lyzrModel = process.env.LYZR_UPSTREAM_MODEL;
2438+
const upstreamBase = process.env.UPSTREAM_BASE;
2439+
const upstreamToken = process.env.UPSTREAM_TOKEN;
2440+
const upstreamModel = process.env.UPSTREAM_MODEL;
24392441
const gitEnvs: Record<string, string> = {};
2440-
if (lyzrBase && lyzrToken) {
2441-
gitEnvs.GITCLAW_MODEL_BASE_URL = lyzrBase.replace(/\/+$/, "") + "/v4";
2442-
gitEnvs.OPENAI_API_KEY = lyzrToken;
2442+
if (upstreamBase && upstreamToken) {
2443+
gitEnvs.GITCLAW_MODEL_BASE_URL = upstreamBase.replace(/\/+$/, "") + "/v4";
2444+
gitEnvs.OPENAI_API_KEY = upstreamToken;
24432445
}
24442446
if (promoterToken) { gitEnvs.GITHUB_TOKEN = promoterToken; gitEnvs.GH_TOKEN = promoterToken; }
24452447
agentDefs.push({
24462448
name: "gap-promoter", label: "GitAgent", harness: "gitagent",
24472449
source: process.env.GAP_PROMOTER_SOURCE ?? "github.com/open-gitagent/gap-promoter",
2448-
model: lyzrModel ? `openai:${lyzrModel}` : undefined,
2450+
model: upstreamModel ? `openai:${upstreamModel}` : undefined,
24492451
envs: gitEnvs,
24502452
gitToken: promoterToken,
24512453
});
24522454
}
24532455
// Framework Translator — translates AI-agent code across frameworks
2454-
// (LangGraph, CrewAI, OpenAI Agents SDK, AutoGen, …, Lyzr ADK).
2455-
// Runs on the gitagent (gitclaw) harness via the Lyzr-direct path
2456-
// (GITCLAW_MODEL_BASE_URL + OPENAI_API_KEY + model openai:<lyzrModel>),
2456+
// (LangGraph, CrewAI, OpenAI Agents SDK, AutoGen, …).
2457+
// Runs on the gitagent (gitclaw) harness via the OpenAI-direct path
2458+
// (GITCLAW_MODEL_BASE_URL + OPENAI_API_KEY + model openai:<upstreamModel>),
24572459
// same wiring as gap-promoter — NOT the Anthropic proxy. gitagent reads
2458-
// agent.yaml runtime.max_turns (4000) and is built for the Lyzr model's
2460+
// agent.yaml runtime.max_turns (4000) and is built for an OpenAI-compatible
24592461
// tool-use loop. Keeps EXA_API_KEY (exa-research). Uses the GAP_PROMOTER
24602462
// PAT (shared with gap-promoter, per explicit request) so it can push the
24612463
// translated code / open PRs; falls back to the shared GITHUB_TOKEN.
24622464
if (!agentDefs.some((a) => a.name === "framework-translator")) {
2463-
const lyzrBase = process.env.LYZR_UPSTREAM_BASE;
2464-
const lyzrToken = process.env.LYZR_UPSTREAM_TOKEN;
2465-
const lyzrModel = process.env.LYZR_UPSTREAM_MODEL;
2465+
const upstreamBase = process.env.UPSTREAM_BASE;
2466+
const upstreamToken = process.env.UPSTREAM_TOKEN;
2467+
const upstreamModel = process.env.UPSTREAM_MODEL;
24662468
const ftGitToken = process.env.GAP_PROMOTER_GITHUB_TOKEN ?? githubToken;
24672469
const ftEnvs: Record<string, string> = {};
2468-
if (lyzrBase && lyzrToken) {
2469-
ftEnvs.GITCLAW_MODEL_BASE_URL = lyzrBase.replace(/\/+$/, "") + "/v4";
2470-
ftEnvs.OPENAI_API_KEY = lyzrToken;
2470+
if (upstreamBase && upstreamToken) {
2471+
ftEnvs.GITCLAW_MODEL_BASE_URL = upstreamBase.replace(/\/+$/, "") + "/v4";
2472+
ftEnvs.OPENAI_API_KEY = upstreamToken;
24712473
}
24722474
if (process.env.EXA_API_KEY) ftEnvs.EXA_API_KEY = process.env.EXA_API_KEY;
24732475
if (ftGitToken) { ftEnvs.GITHUB_TOKEN = ftGitToken; ftEnvs.GH_TOKEN = ftGitToken; }
24742476
agentDefs.push({
24752477
name: "framework-translator", label: "GitAgent", harness: "gitagent",
2476-
source: process.env.FRAMEWORK_TRANSLATOR_SOURCE ?? "github.com/shreyas-lyzr/framework-translator-agent",
2477-
model: lyzrModel ? `openai:${lyzrModel}` : undefined,
2478+
source: process.env.FRAMEWORK_TRANSLATOR_SOURCE ?? "github.com/open-gitagent/framework-translator-agent",
2479+
model: upstreamModel ? `openai:${upstreamModel}` : undefined,
24782480
envs: ftEnvs,
24792481
gitToken: ftGitToken,
24802482
});
24812483
}
24822484
} else {
2483-
console.warn("[agentos] no LYZR proxy or ANTHROPIC_API_KEY — Claude Code / Deep Agent not registered");
2485+
console.warn("[agentos] no translator proxy or ANTHROPIC_API_KEY — Claude Code / Deep Agent not registered");
24842486
}
24852487
const onlyEnv = process.env.AGENTOS_AGENTS_ONLY;
24862488
const filteredAgentDefs = onlyEnv
@@ -2505,17 +2507,17 @@ if (import.meta.url === `file://${process.argv[1]}`) {
25052507
process.on(sig, () => {
25062508
void (async () => {
25072509
if (auditSink) await shutdownOtel(2_000).catch(() => {});
2508-
await lyzrProxyHandle?.close().catch(() => {});
2510+
await proxyHandle?.close().catch(() => {});
25092511
await server.close().catch(() => {});
25102512
process.exit(0);
25112513
})();
25122514
});
25132515
}
25142516
const { host, port } = await server.listen();
25152517
console.log(`ComputerAgentServer listening on http://${host}:${port}`);
2516-
if (lyzrProxyHandle) {
2517-
console.log(`Anthropic↔OpenAI proxy listening on http://127.0.0.1:${lyzrProxyHandle.port}`);
2518-
console.log(` → use envs.ANTHROPIC_BASE_URL=http://127.0.0.1:${lyzrProxyHandle.port} on /run for claude-agent-sdk + deepagents`);
2518+
if (proxyHandle) {
2519+
console.log(`Anthropic↔OpenAI proxy listening on http://127.0.0.1:${proxyHandle.port}`);
2520+
console.log(` → use envs.ANTHROPIC_BASE_URL=http://127.0.0.1:${proxyHandle.port} on /run for claude-agent-sdk + deepagents`);
25192521
}
25202522
if (slackBotNames.length > 0) {
25212523
console.log(`Slack bots active: ${slackBotNames.join(", ")}`);
@@ -2555,7 +2557,7 @@ if (import.meta.url === `file://${process.argv[1]}`) {
25552557
console.log(" curl -N -X POST http://" + host + ":" + port + "/run \\");
25562558
console.log(" -H 'content-type: application/json' \\");
25572559
console.log(" -d '{");
2558-
console.log(' "source": "github.com/shreyas-lyzr/pdf-agent",');
2560+
console.log(' "source": "github.com/open-gitagent/example-pdf-agent",');
25592561
console.log(' "harness": "claude-agent-sdk",');
25602562
console.log(' "runtime": "local",');
25612563
console.log(' "options": { "permissionMode": "bypassPermissions", "settingSources": ["project"] },');

examples/marketing-agent.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* Full-fledged marketing agent example.
33
*
4-
* Runs the marketing-agent GAP repo (github.com/shreyas-lyzr/marketing-agent)
4+
* Runs the example marketing-agent GAP repo (github.com/open-gitagent/example-marketing-agent)
55
* as a multi-turn session: first turn sets product context, subsequent turns
66
* request specific marketing deliverables. Each response streams in real-time
77
* and the final outputs are saved to markdown files under ./marketing-outputs/.
@@ -189,7 +189,7 @@ if (RESUME && existsSync(SESSION_FILE)) {
189189
await using agent = new ComputerAgent({
190190
source: {
191191
type: "git",
192-
url: "github.com/shreyas-lyzr/marketing-agent",
192+
url: "github.com/open-gitagent/example-marketing-agent",
193193
},
194194
harness: "claude-agent-sdk",
195195
runtime: new LocalSubstrate(),
@@ -222,7 +222,7 @@ if (!RESUME) {
222222
`Here is our product context. Please confirm you've loaded it and identify the top 3
223223
marketing challenges you'd recommend we tackle first.
224224
225-
Product: Lyzr AI — an enterprise platform for building, deploying, and governing AI agents at scale.
225+
Product: an enterprise platform for building, deploying, and governing AI agents at scale.
226226
Audience: Mid-market and enterprise engineering and IT leaders (CTOs, VP Engineering, Head of AI).
227227
Stage: Series A, $8M ARR, 120 customers, growing 15% MoM.
228228
Key differentiators: On-prem / VPC deployment, SOC2 compliant, LLM-agnostic (OpenAI, Anthropic, Gemini, Mistral).
@@ -263,7 +263,7 @@ hr("Turn 3 — Pricing Strategy");
263263

264264
const { result: pricingResult } = await streamTurn(
265265
agent,
266-
`Design a 3-tier pricing structure for Lyzr AI. We currently charge flat enterprise contracts
266+
`Design a 3-tier pricing structure for an enterprise AI-agent platform. We currently charge flat enterprise contracts
267267
($3k–$15k/month). We want to add a self-serve tier to capture PLG motion and reduce the
268268
60-90 day sales cycle for smaller deals. Include:
269269
- Tier names and positioning
@@ -273,7 +273,7 @@ const { result: pricingResult } = await streamTurn(
273273
- A/B test ideas for the pricing page`,
274274
);
275275

276-
await saveTurnOutput("pricing-strategy.md", "Pricing Strategy — Lyzr AI", pricingResult);
276+
await saveTurnOutput("pricing-strategy.md", "Pricing Strategy — Example AI Platform", pricingResult);
277277

278278
// ── Turn 4: Launch strategy for self-serve tier ───────────────────────────────
279279

0 commit comments

Comments
 (0)