From b92c04f1c6a920d2306a51fc577f651fc19a9068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Lange?= Date: Mon, 16 Mar 2026 02:29:07 +0100 Subject: [PATCH] docs(onboarding): add third v1.1 starter wave --- CHANGELOG.md | 1 + README.md | 1 + docs/AI-NATIVE-MATRIX.md | 10 ++- docs/INTEGRATIONS.md | 34 ++++++++ docs/ONBOARDING.md | 17 ++++ docs/examples/autogen-foundrygate.env.example | 4 + docs/examples/camel-foundrygate.env.example | 4 + docs/examples/crewai-foundrygate.env.example | 4 + .../llamaindex-foundrygate.env.example | 4 + .../pydanticai-foundrygate.env.example | 4 + foundrygate/onboarding.py | 83 +++++++++++++++++++ tests/test_onboarding.py | 5 ++ 12 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 docs/examples/autogen-foundrygate.env.example create mode 100644 docs/examples/camel-foundrygate.env.example create mode 100644 docs/examples/crewai-foundrygate.env.example create mode 100644 docs/examples/llamaindex-foundrygate.env.example create mode 100644 docs/examples/pydanticai-foundrygate.env.example diff --git a/CHANGELOG.md b/CHANGELOG.md index f91aa94..2944532 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ The format is intentionally lightweight and human-readable. Group entries by rel - Added richer client usage reporting in `GET /api/stats` and the dashboard, including per-client tokens, failures, success rate, and aggregate client totals - Added a second wave of AI-native starter templates for Agno, Semantic Kernel, Haystack, Mastra, and Google ADK - Added client highlight summaries to `GET /api/stats` and the built-in dashboard for top request, token, cost, failure, and latency signals +- Added a third wave of AI-native starter templates for AutoGen, LlamaIndex, CrewAI, PydanticAI, and CAMEL ### Changed diff --git a/README.md b/README.md index 7eae50a..5efaf9d 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,7 @@ Start here for the deeper deployment details: - [Examples](./docs/examples) - [First-wave AI-native starters](./docs/AI-NATIVE-MATRIX.md#first-wave-template-set-for-v110) - [Second-wave AI-native starters](./docs/AI-NATIVE-MATRIX.md#second-wave-template-set) +- [Third-wave AI-native starters](./docs/AI-NATIVE-MATRIX.md#third-wave-template-set) - [Security review for `v1.0.0`](./docs/SECURITY-REVIEW-v1.0.0.md) - [Publishing](./docs/PUBLISHING.md) - [Troubleshooting](./docs/TROUBLESHOOTING.md) diff --git a/docs/AI-NATIVE-MATRIX.md b/docs/AI-NATIVE-MATRIX.md index cfe1d66..557f684 100644 --- a/docs/AI-NATIVE-MATRIX.md +++ b/docs/AI-NATIVE-MATRIX.md @@ -73,13 +73,21 @@ That set gives FoundryGate: ## Second-Wave Template Set -Good candidates once the first wave is stable: +This wave is now covered in the repo: - `Agno` - `Semantic Kernel` - `Haystack` - `Mastra` - `Google ADK` + +## Third-Wave Template Set + +The next clean bundle after the second wave is: + +- `AutoGen` +- `LlamaIndex` +- `CrewAI` - `PydanticAI` - `CAMEL` diff --git a/docs/INTEGRATIONS.md b/docs/INTEGRATIONS.md index b919796..481f545 100644 --- a/docs/INTEGRATIONS.md +++ b/docs/INTEGRATIONS.md @@ -188,6 +188,40 @@ The second wave keeps the same integration discipline while extending FoundryGat - recommended header: `X-FoundryGate-Client: google-adk` - recommended profile name: `google-adk` +## Third-wave framework starters + +The third wave rounds out the most visible remaining framework set from the AI-native matrix. + +### AutoGen + +- starter: [examples/autogen-foundrygate.env.example](./examples/autogen-foundrygate.env.example) +- recommended header: `X-FoundryGate-Client: autogen` +- recommended profile name: `autogen` + +### LlamaIndex + +- starter: [examples/llamaindex-foundrygate.env.example](./examples/llamaindex-foundrygate.env.example) +- recommended header: `X-FoundryGate-Client: llamaindex` +- recommended profile name: `llamaindex` + +### CrewAI + +- starter: [examples/crewai-foundrygate.env.example](./examples/crewai-foundrygate.env.example) +- recommended header: `X-FoundryGate-Client: crewai` +- recommended profile name: `crewai` + +### PydanticAI + +- starter: [examples/pydanticai-foundrygate.env.example](./examples/pydanticai-foundrygate.env.example) +- recommended header: `X-FoundryGate-Client: pydanticai` +- recommended profile name: `pydanticai` + +### CAMEL + +- starter: [examples/camel-foundrygate.env.example](./examples/camel-foundrygate.env.example) +- recommended header: `X-FoundryGate-Client: camel` +- recommended profile name: `camel` + ## Provider onboarding When onboarding a new provider: diff --git a/docs/ONBOARDING.md b/docs/ONBOARDING.md index 7005ea9..767f61c 100644 --- a/docs/ONBOARDING.md +++ b/docs/ONBOARDING.md @@ -160,6 +160,11 @@ Starter files: - [examples/haystack-foundrygate.env.example](./examples/haystack-foundrygate.env.example) - [examples/mastra-foundrygate.env.example](./examples/mastra-foundrygate.env.example) - [examples/google-adk-foundrygate.env.example](./examples/google-adk-foundrygate.env.example) +- [examples/autogen-foundrygate.env.example](./examples/autogen-foundrygate.env.example) +- [examples/llamaindex-foundrygate.env.example](./examples/llamaindex-foundrygate.env.example) +- [examples/crewai-foundrygate.env.example](./examples/crewai-foundrygate.env.example) +- [examples/pydanticai-foundrygate.env.example](./examples/pydanticai-foundrygate.env.example) +- [examples/camel-foundrygate.env.example](./examples/camel-foundrygate.env.example) ### 3b. First-wave framework starters @@ -185,6 +190,18 @@ The second post-`1.0` starter wave extends the same pattern to: Keep these on the shared OpenAI-compatible path first. The right time to split them into more specialized profiles is after traces and stats show a real difference in locality, fallback, or cost behavior. +### 3d. Third-wave framework starters + +The third post-`1.0` starter wave closes the biggest remaining framework gaps from the matrix: + +- `AutoGen` -> `X-FoundryGate-Client: autogen` +- `LlamaIndex` -> `X-FoundryGate-Client: llamaindex` +- `CrewAI` -> `X-FoundryGate-Client: crewai` +- `PydanticAI` -> `X-FoundryGate-Client: pydanticai` +- `CAMEL` -> `X-FoundryGate-Client: camel` + +Treat these the same way as the earlier waves: stay on the shared OpenAI-compatible endpoint first, then split profiles only when traces and route previews show a real need. + ### 4. Add request hooks only if needed Keep hooks opt-in and narrow. Good uses are: diff --git a/docs/examples/autogen-foundrygate.env.example b/docs/examples/autogen-foundrygate.env.example new file mode 100644 index 0000000..399bb4d --- /dev/null +++ b/docs/examples/autogen-foundrygate.env.example @@ -0,0 +1,4 @@ +OPENAI_BASE_URL=http://127.0.0.1:8090/v1 +OPENAI_API_KEY=local +FOUNDRYGATE_CLIENT_HEADER=autogen +FOUNDRYGATE_PROFILE=autogen diff --git a/docs/examples/camel-foundrygate.env.example b/docs/examples/camel-foundrygate.env.example new file mode 100644 index 0000000..a624a21 --- /dev/null +++ b/docs/examples/camel-foundrygate.env.example @@ -0,0 +1,4 @@ +OPENAI_BASE_URL=http://127.0.0.1:8090/v1 +OPENAI_API_KEY=local +FOUNDRYGATE_CLIENT_HEADER=camel +FOUNDRYGATE_PROFILE=camel diff --git a/docs/examples/crewai-foundrygate.env.example b/docs/examples/crewai-foundrygate.env.example new file mode 100644 index 0000000..ebc83db --- /dev/null +++ b/docs/examples/crewai-foundrygate.env.example @@ -0,0 +1,4 @@ +OPENAI_BASE_URL=http://127.0.0.1:8090/v1 +OPENAI_API_KEY=local +FOUNDRYGATE_CLIENT_HEADER=crewai +FOUNDRYGATE_PROFILE=crewai diff --git a/docs/examples/llamaindex-foundrygate.env.example b/docs/examples/llamaindex-foundrygate.env.example new file mode 100644 index 0000000..35ca68c --- /dev/null +++ b/docs/examples/llamaindex-foundrygate.env.example @@ -0,0 +1,4 @@ +OPENAI_BASE_URL=http://127.0.0.1:8090/v1 +OPENAI_API_KEY=local +FOUNDRYGATE_CLIENT_HEADER=llamaindex +FOUNDRYGATE_PROFILE=llamaindex diff --git a/docs/examples/pydanticai-foundrygate.env.example b/docs/examples/pydanticai-foundrygate.env.example new file mode 100644 index 0000000..406d8de --- /dev/null +++ b/docs/examples/pydanticai-foundrygate.env.example @@ -0,0 +1,4 @@ +OPENAI_BASE_URL=http://127.0.0.1:8090/v1 +OPENAI_API_KEY=local +FOUNDRYGATE_CLIENT_HEADER=pydanticai +FOUNDRYGATE_PROFILE=pydanticai diff --git a/foundrygate/onboarding.py b/foundrygate/onboarding.py index c2d37af..3add70b 100644 --- a/foundrygate/onboarding.py +++ b/foundrygate/onboarding.py @@ -503,6 +503,89 @@ def build_onboarding_report( ), ], }, + "autogen": { + "recommended": "autogen" in profile_names, + "header": "X-FoundryGate-Client: autogen", + "profile": "autogen", + "snippet": [ + "export OPENAI_BASE_URL=http://127.0.0.1:8090/v1", + "export OPENAI_API_KEY=local", + ], + "notes": [ + "Keep AutoGen on the shared OpenAI-compatible path first.", + ( + "Split assistant families into separate profiles only when traces " + "show a real locality or cost split." + ), + ], + }, + "llamaindex": { + "recommended": "llamaindex" in profile_names, + "header": "X-FoundryGate-Client: llamaindex", + "profile": "llamaindex", + "snippet": [ + "export OPENAI_BASE_URL=http://127.0.0.1:8090/v1", + "export OPENAI_API_KEY=local", + ], + "notes": [ + "Keep retrieval and generation on one gateway surface to start with.", + ( + "Add dedicated routing only when one index or workflow class needs " + "different provider behavior." + ), + ], + }, + "crewai": { + "recommended": "crewai" in profile_names, + "header": "X-FoundryGate-Client: crewai", + "profile": "crewai", + "snippet": [ + "export OPENAI_BASE_URL=http://127.0.0.1:8090/v1", + "export OPENAI_API_KEY=local", + ], + "notes": [ + "Use one stable client tag for CrewAI orchestration before splitting roles.", + ( + "Only add profile-specific routing when crew classes need distinct " + "fallback, locality, or cost constraints." + ), + ], + }, + "pydanticai": { + "recommended": "pydanticai" in profile_names, + "header": "X-FoundryGate-Client: pydanticai", + "profile": "pydanticai", + "snippet": [ + "export OPENAI_BASE_URL=http://127.0.0.1:8090/v1", + "export OPENAI_API_KEY=local", + ], + "notes": [ + ( + "Keep PydanticAI on the common OpenAI-compatible path unless a " + "model API gap appears." + ), + ( + "Use client profiles only when tool or validation-heavy traffic " + "deserves a different provider set." + ), + ], + }, + "camel": { + "recommended": "camel" in profile_names, + "header": "X-FoundryGate-Client: camel", + "profile": "camel", + "snippet": [ + "export OPENAI_BASE_URL=http://127.0.0.1:8090/v1", + "export OPENAI_API_KEY=local", + ], + "notes": [ + "Start CAMEL traffic on the shared gateway path and keep one stable client tag.", + ( + "Only add narrower policies when multi-agent workloads need stronger " + "provider isolation." + ), + ], + }, } return { diff --git a/tests/test_onboarding.py b/tests/test_onboarding.py index 3c8cfd1..f51d7f4 100644 --- a/tests/test_onboarding.py +++ b/tests/test_onboarding.py @@ -266,6 +266,11 @@ def test_onboarding_report_marks_all_builtin_integrations_ready(tmp_path: Path): assert report["integrations"]["openclaw"]["recommended"] is True assert report["integrations"]["n8n"]["recommended"] is True assert report["integrations"]["cli"]["recommended"] is True + assert "autogen" in report["integrations"] + assert "llamaindex" in report["integrations"] + assert "crewai" in report["integrations"] + assert "pydanticai" in report["integrations"] + assert "camel" in report["integrations"] assert report["clients"]["matrix"][0]["name"] == "cli" assert report["clients"]["matrix"][0]["has_rule"] is True