Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
10 changes: 9 additions & 1 deletion docs/AI-NATIVE-MATRIX.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

Expand Down
34 changes: 34 additions & 0 deletions docs/INTEGRATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
17 changes: 17 additions & 0 deletions docs/ONBOARDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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:
Expand Down
4 changes: 4 additions & 0 deletions docs/examples/autogen-foundrygate.env.example
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions docs/examples/camel-foundrygate.env.example
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions docs/examples/crewai-foundrygate.env.example
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions docs/examples/llamaindex-foundrygate.env.example
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions docs/examples/pydanticai-foundrygate.env.example
Original file line number Diff line number Diff line change
@@ -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
83 changes: 83 additions & 0 deletions foundrygate/onboarding.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
5 changes: 5 additions & 0 deletions tests/test_onboarding.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Loading