Skip to content

Commit adad748

Browse files
committed
[Platform] Split bridges into dedicated packages
1 parent 41703c5 commit adad748

File tree

286 files changed

+4162
-263
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

286 files changed

+4162
-263
lines changed

.github/workflows/code-quality.yaml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,14 @@ jobs:
5151
done
5252
echo "packages=$PACKAGES" >> $GITHUB_OUTPUT
5353
54-
# Bridges (store and tool)
54+
# Bridges (store, tool, and platform)
5555
STORE_BRIDGES=$(find src/store/src/Bridge/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort \
5656
| jq -R -s -c 'split("\n") | map(select(length > 0)) | map({component: "store", type: "Store", bridge: .})')
5757
TOOL_BRIDGES=$(find src/agent/src/Bridge/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort \
5858
| jq -R -s -c 'split("\n") | map(select(length > 0)) | map({component: "agent", type: "Tool", bridge: .})')
59-
BRIDGES=$(jq -n -c --argjson store "$STORE_BRIDGES" --argjson tool "$TOOL_BRIDGES" '$store + $tool')
59+
PLATFORM_BRIDGES=$(find src/platform/src/Bridge/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort \
60+
| jq -R -s -c 'split("\n") | map(select(length > 0)) | map({component: "platform", type: "Platform", bridge: .})')
61+
BRIDGES=$(jq -n -c --argjson store "$STORE_BRIDGES" --argjson tool "$TOOL_BRIDGES" --argjson platform "$PLATFORM_BRIDGES" '$store + $tool + $platform')
6062
echo "bridges=$BRIDGES" >> $GITHUB_OUTPUT
6163
6264
# Pretty print for info
@@ -172,6 +174,19 @@ jobs:
172174
php-version: ${{ env.PHP_VERSION }}
173175
extensions: ${{ env.REQUIRED_PHP_EXTENSIONS }}
174176

177+
- name: Install root dependencies (platform bridges only)
178+
if: matrix.bridge.component == 'platform'
179+
uses: ramsey/composer-install@v3
180+
181+
- name: Build root packages (platform bridges only)
182+
if: matrix.bridge.component == 'platform'
183+
run: php .github/build-packages.php
184+
185+
# Remove root vendor and bridge vendor to avoid circular symlinks when installing bridge dependencies
186+
- name: Clean vendor folders (platform bridges only)
187+
if: matrix.bridge.component == 'platform'
188+
run: rm -rf vendor src/platform/src/Bridge/${{ matrix.bridge.bridge }}/vendor
189+
175190
- name: Install dependencies
176191
uses: ramsey/composer-install@v3
177192
with:

.github/workflows/unit-tests.yaml

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ jobs:
2828
store-bridges-include: ${{ steps.set-matrix.outputs.store-bridges-include }}
2929
tool-bridges: ${{ steps.set-matrix.outputs.tool-bridges }}
3030
tool-bridges-include: ${{ steps.set-matrix.outputs.tool-bridges-include }}
31+
platform-bridges: ${{ steps.set-matrix.outputs.platform-bridges }}
32+
platform-bridges-include: ${{ steps.set-matrix.outputs.platform-bridges-include }}
3133
steps:
3234
- name: Checkout
3335
uses: actions/checkout@v6
@@ -103,6 +105,24 @@ jobs:
103105
')
104106
echo "tool-bridges-include=$TOOL_BRIDGES_INCLUDE" >> $GITHUB_OUTPUT
105107
108+
# Platform bridges
109+
PLATFORM_BRIDGES=$(ls -1 src/platform/src/Bridge/ | sort \
110+
| jq -R -s -c 'split("\n") | map(select(length > 0)) | map({bridge: .})')
111+
echo "platform-bridges=$PLATFORM_BRIDGES" >> $GITHUB_OUTPUT
112+
113+
# Generate platform bridge includes (lowest, Symfony 7.4, Symfony 8.0)
114+
PLATFORM_BRIDGES_INCLUDE=$(echo "$PLATFORM_BRIDGES" | jq -c '
115+
. as $bridges |
116+
# lowest deps with PHP 8.2
117+
($bridges | map(. + {"php-version": "8.2", "dependency-version": "lowest"})) +
118+
# Symfony 7.4 LTS with PHP 8.2
119+
($bridges | map(. + {"php-version": "8.2", "symfony-version": "7.4.*"})) +
120+
# Symfony 8.0 with PHP 8.5
121+
($bridges | map(. + {"php-version": "8.5", "symfony-version": "8.0.*"}))
122+
| map({bridge: {bridge: .bridge}} + (. | del(.bridge)))
123+
')
124+
echo "platform-bridges-include=$PLATFORM_BRIDGES_INCLUDE" >> $GITHUB_OUTPUT
125+
106126
# Pretty print for info
107127
echo "::group::Packages"
108128
echo "$PACKAGES" | jq .
@@ -113,6 +133,9 @@ jobs:
113133
echo "::group::Tool Bridges"
114134
echo "$TOOL_BRIDGES" | jq .
115135
echo "::endgroup::"
136+
echo "::group::Platform Bridges"
137+
echo "$PLATFORM_BRIDGES" | jq .
138+
echo "::endgroup::"
116139
117140
package:
118141
name: ${{ matrix.package.type }} / ${{ matrix.package.name }} / PHP ${{ matrix.php-version }}${{ matrix.dependency-version == 'lowest' && ' / lowest' || '' }}${{ matrix.symfony-version && format(' / Symfony {0}', matrix.symfony-version) || '' }}
@@ -236,3 +259,59 @@ jobs:
236259

237260
- name: Run PHPUnit
238261
run: cd src/${{ matrix.bridge.component }}/src/Bridge/${{ matrix.bridge.bridge }} && vendor/bin/phpunit
262+
263+
platform-bridge:
264+
name: Platform / ${{ matrix.bridge.bridge }} / PHP ${{ matrix.php-version }}${{ matrix.dependency-version == 'lowest' && ' / lowest' || '' }}${{ matrix.symfony-version && format(' / Symfony {0}', matrix.symfony-version) || '' }}
265+
needs: matrix
266+
runs-on: ubuntu-latest
267+
strategy:
268+
fail-fast: false
269+
matrix:
270+
bridge: ${{ fromJson(needs.matrix.outputs.platform-bridges) }}
271+
php-version: ['8.2', '8.5']
272+
dependency-version: ['']
273+
symfony-version: ['']
274+
include: ${{ fromJson(needs.matrix.outputs.platform-bridges-include) }}
275+
276+
env:
277+
SYMFONY_REQUIRE: ${{ matrix.symfony-version || '>=7.4' }}
278+
279+
steps:
280+
- name: Checkout
281+
uses: actions/checkout@v6
282+
283+
- name: Configure environment
284+
run: |
285+
echo COLUMNS=120 >> $GITHUB_ENV
286+
[ 'lowest' = '${{ matrix.dependency-version }}' ] && echo SYMFONY_DEPRECATIONS_HELPER=weak >> $GITHUB_ENV || true
287+
288+
- name: Setup PHP
289+
uses: shivammathur/setup-php@v2
290+
with:
291+
php-version: ${{ matrix.php-version }}
292+
tools: flex
293+
extensions: ${{ env.REQUIRED_PHP_EXTENSIONS }}
294+
295+
# Deptrac does not support Symfony 8.0 yet
296+
- name: Remove deptrac (Symfony 8.0)
297+
if: matrix.symfony-version == '8.0.*'
298+
run: composer remove --dev deptrac/deptrac --no-update
299+
300+
- name: Install root dependencies
301+
uses: ramsey/composer-install@v3
302+
303+
- name: Build packages
304+
run: php .github/build-packages.php
305+
306+
# Remove root vendor and bridge vendor to avoid circular symlinks when installing bridge dependencies
307+
- name: Clean vendor folders
308+
run: rm -rf vendor src/platform/src/Bridge/${{ matrix.bridge.bridge }}/vendor
309+
310+
- name: Install dependencies
311+
uses: ramsey/composer-install@v3
312+
with:
313+
working-directory: src/platform/src/Bridge/${{ matrix.bridge.bridge }}
314+
dependency-versions: ${{ matrix.dependency-version || 'highest' }}
315+
316+
- name: Run PHPUnit
317+
run: cd src/platform/src/Bridge/${{ matrix.bridge.bridge }} && vendor/bin/phpunit

.github/workflows/validation.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,19 @@ jobs:
5656

5757
- name: Validate tool bridges have required files
5858
run: .github/scripts/validate-bridge-files.sh tool agent
59+
60+
validate_platforms:
61+
name: Platform Bridges
62+
runs-on: ubuntu-latest
63+
steps:
64+
- name: Checkout
65+
uses: actions/checkout@v6
66+
67+
- name: Validate platform bridge naming conventions
68+
run: .github/scripts/validate-bridge-naming.sh platform platform
69+
70+
- name: Validate platform bridges are in splitsh.json
71+
run: .github/scripts/validate-bridge-splitsh.sh platform
72+
73+
- name: Validate platform bridges have required files
74+
run: .github/scripts/validate-bridge-files.sh platform

demo/composer.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
"symfony/ai-bundle": "@dev",
1616
"symfony/ai-chroma-db-store": "@dev",
1717
"symfony/ai-clock-tool": "@dev",
18+
"symfony/ai-hugging-face-platform": "@dev",
19+
"symfony/ai-open-ai-platform": "@dev",
1820
"symfony/ai-similarity-search-tool": "@dev",
1921
"symfony/ai-wikipedia-tool": "@dev",
2022
"symfony/asset": "^8.0",

examples/composer.json

Lines changed: 125 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,44 +19,165 @@
1919
{
2020
"type": "path",
2121
"url": "../src/store"
22+
},
23+
{
24+
"type": "path",
25+
"url": "../src/platform/src/Bridge/AiMlApi"
26+
},
27+
{
28+
"type": "path",
29+
"url": "../src/platform/src/Bridge/Albert"
30+
},
31+
{
32+
"type": "path",
33+
"url": "../src/platform/src/Bridge/Anthropic"
34+
},
35+
{
36+
"type": "path",
37+
"url": "../src/platform/src/Bridge/Azure"
38+
},
39+
{
40+
"type": "path",
41+
"url": "../src/platform/src/Bridge/Bedrock"
42+
},
43+
{
44+
"type": "path",
45+
"url": "../src/platform/src/Bridge/Cartesia"
46+
},
47+
{
48+
"type": "path",
49+
"url": "../src/platform/src/Bridge/Cerebras"
50+
},
51+
{
52+
"type": "path",
53+
"url": "../src/platform/src/Bridge/Decart"
54+
},
55+
{
56+
"type": "path",
57+
"url": "../src/platform/src/Bridge/DeepSeek"
58+
},
59+
{
60+
"type": "path",
61+
"url": "../src/platform/src/Bridge/DockerModelRunner"
62+
},
63+
{
64+
"type": "path",
65+
"url": "../src/platform/src/Bridge/ElevenLabs"
66+
},
67+
{
68+
"type": "path",
69+
"url": "../src/platform/src/Bridge/Gemini"
70+
},
71+
{
72+
"type": "path",
73+
"url": "../src/platform/src/Bridge/Generic"
74+
},
75+
{
76+
"type": "path",
77+
"url": "../src/platform/src/Bridge/HuggingFace"
78+
},
79+
{
80+
"type": "path",
81+
"url": "../src/platform/src/Bridge/LmStudio"
82+
},
83+
{
84+
"type": "path",
85+
"url": "../src/platform/src/Bridge/Meta"
86+
},
87+
{
88+
"type": "path",
89+
"url": "../src/platform/src/Bridge/Mistral"
90+
},
91+
{
92+
"type": "path",
93+
"url": "../src/platform/src/Bridge/Ollama"
94+
},
95+
{
96+
"type": "path",
97+
"url": "../src/platform/src/Bridge/OpenAi"
98+
},
99+
{
100+
"type": "path",
101+
"url": "../src/platform/src/Bridge/OpenRouter"
102+
},
103+
{
104+
"type": "path",
105+
"url": "../src/platform/src/Bridge/Perplexity"
106+
},
107+
{
108+
"type": "path",
109+
"url": "../src/platform/src/Bridge/Scaleway"
110+
},
111+
{
112+
"type": "path",
113+
"url": "../src/platform/src/Bridge/TransformersPhp"
114+
},
115+
{
116+
"type": "path",
117+
"url": "../src/platform/src/Bridge/VertexAi"
118+
},
119+
{
120+
"type": "path",
121+
"url": "../src/platform/src/Bridge/Voyage"
22122
}
23123
],
24124
"require": {
25125
"php": ">=8.2",
26-
"async-aws/bedrock-runtime": "^1.1",
27-
"codewithkyrian/transformers": "^0.6.2",
28126
"doctrine/dbal": "^3.3|^4.0",
29-
"google/auth": "^1.47",
30127
"symfony/ai-agent": "@dev",
128+
"symfony/ai-ai-ml-api-platform": "@dev",
129+
"symfony/ai-albert-platform": "@dev",
130+
"symfony/ai-anthropic-platform": "@dev",
131+
"symfony/ai-azure-platform": "@dev",
31132
"symfony/ai-azure-search-store": "@dev",
133+
"symfony/ai-bedrock-platform": "@dev",
32134
"symfony/ai-brave-tool": "@dev",
33135
"symfony/ai-cache-store": "@dev",
136+
"symfony/ai-cartesia-platform": "@dev",
137+
"symfony/ai-cerebras-platform": "@dev",
34138
"symfony/ai-chat": "@dev",
35139
"symfony/ai-chroma-db-store": "@dev",
36140
"symfony/ai-click-house-store": "@dev",
37141
"symfony/ai-clock-tool": "@dev",
38142
"symfony/ai-cloudflare-store": "@dev",
143+
"symfony/ai-decart-platform": "@dev",
144+
"symfony/ai-deep-seek-platform": "@dev",
145+
"symfony/ai-docker-model-runner-platform": "@dev",
39146
"symfony/ai-elasticsearch-store": "@dev",
147+
"symfony/ai-eleven-labs-platform": "@dev",
148+
"symfony/ai-gemini-platform": "@dev",
149+
"symfony/ai-generic-platform": "@dev",
150+
"symfony/ai-hugging-face-platform": "@dev",
151+
"symfony/ai-lm-studio-platform": "@dev",
40152
"symfony/ai-manticore-search-store": "@dev",
41153
"symfony/ai-maria-db-store": "@dev",
42154
"symfony/ai-meilisearch-store": "@dev",
155+
"symfony/ai-meta-platform": "@dev",
43156
"symfony/ai-milvus-store": "@dev",
157+
"symfony/ai-mistral-platform": "@dev",
44158
"symfony/ai-mongo-db-store": "@dev",
45159
"symfony/ai-neo4j-store": "@dev",
160+
"symfony/ai-ollama-platform": "@dev",
161+
"symfony/ai-open-ai-platform": "@dev",
46162
"symfony/ai-open-meteo-tool": "@dev",
163+
"symfony/ai-open-router-platform": "@dev",
47164
"symfony/ai-open-search-store": "@dev",
165+
"symfony/ai-perplexity-platform": "@dev",
48166
"symfony/ai-pinecone-store": "@dev",
49-
"symfony/ai-platform": "@dev",
50167
"symfony/ai-postgres-store": "@dev",
51168
"symfony/ai-qdrant-store": "@dev",
52169
"symfony/ai-redis-store": "@dev",
170+
"symfony/ai-scaleway-platform": "@dev",
53171
"symfony/ai-scraper-tool": "@dev",
54172
"symfony/ai-serp-api-tool": "@dev",
55173
"symfony/ai-similarity-search-tool": "@dev",
56174
"symfony/ai-supabase-store": "@dev",
57175
"symfony/ai-surreal-db-store": "@dev",
58176
"symfony/ai-tavily-tool": "@dev",
177+
"symfony/ai-transformers-php-platform": "@dev",
59178
"symfony/ai-typesense-store": "@dev",
179+
"symfony/ai-vertex-ai-platform": "@dev",
180+
"symfony/ai-voyage-platform": "@dev",
60181
"symfony/ai-weaviate-store": "@dev",
61182
"symfony/ai-wikipedia-tool": "@dev",
62183
"symfony/ai-youtube-tool": "@dev",

splitsh.json

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,35 @@
1818
"ai-bundle": "src/ai-bundle",
1919
"ai-chat": "src/chat",
2020
"mcp-bundle": "src/mcp-bundle",
21-
"ai-platform": "src/platform",
21+
"ai-platform": {
22+
"prefixes": [{ "from": "src/platform", "to": "", "excludes": ["src/Bridge"] }]
23+
},
24+
"ai-ai-ml-api-platform": "src/platform/src/Bridge/AiMlApi",
25+
"ai-albert-platform": "src/platform/src/Bridge/Albert",
26+
"ai-anthropic-platform": "src/platform/src/Bridge/Anthropic",
27+
"ai-azure-platform": "src/platform/src/Bridge/Azure",
28+
"ai-bedrock-platform": "src/platform/src/Bridge/Bedrock",
29+
"ai-cartesia-platform": "src/platform/src/Bridge/Cartesia",
30+
"ai-cerebras-platform": "src/platform/src/Bridge/Cerebras",
31+
"ai-decart-platform": "src/platform/src/Bridge/Decart",
32+
"ai-deep-seek-platform": "src/platform/src/Bridge/DeepSeek",
33+
"ai-docker-model-runner-platform": "src/platform/src/Bridge/DockerModelRunner",
34+
"ai-eleven-labs-platform": "src/platform/src/Bridge/ElevenLabs",
35+
"ai-gemini-platform": "src/platform/src/Bridge/Gemini",
36+
"ai-generic-platform": "src/platform/src/Bridge/Generic",
37+
"ai-hugging-face-platform": "src/platform/src/Bridge/HuggingFace",
38+
"ai-lm-studio-platform": "src/platform/src/Bridge/LmStudio",
39+
"ai-meta-platform": "src/platform/src/Bridge/Meta",
40+
"ai-mistral-platform": "src/platform/src/Bridge/Mistral",
41+
"ai-ollama-platform": "src/platform/src/Bridge/Ollama",
42+
"ai-open-ai-platform": "src/platform/src/Bridge/OpenAi",
43+
"ai-open-router-platform": "src/platform/src/Bridge/OpenRouter",
44+
"ai-perplexity-platform": "src/platform/src/Bridge/Perplexity",
45+
"ai-replicate-platform": "src/platform/src/Bridge/Replicate",
46+
"ai-scaleway-platform": "src/platform/src/Bridge/Scaleway",
47+
"ai-transformers-php-platform": "src/platform/src/Bridge/TransformersPhp",
48+
"ai-vertex-ai-platform": "src/platform/src/Bridge/VertexAi",
49+
"ai-voyage-platform": "src/platform/src/Bridge/Voyage",
2250
"ai-store": {
2351
"prefixes": [{ "from": "src/store", "to": "", "excludes": ["src/Bridge"] }]
2452
},

src/ai-bundle/composer.json

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,7 @@
7373
}
7474
},
7575
"config": {
76-
"sort-packages": true,
77-
"allow-plugins": {
78-
"php-http/discovery": true
79-
}
76+
"sort-packages": true
8077
},
8178
"extra": {
8279
"branch-alias": {

0 commit comments

Comments
 (0)