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
19 changes: 17 additions & 2 deletions .github/workflows/code-quality.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,14 @@ jobs:
done
echo "packages=$PACKAGES" >> $GITHUB_OUTPUT

# Bridges (store and tool)
# Bridges (store, tool, and platform)
STORE_BRIDGES=$(find src/store/src/Bridge/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort \
| jq -R -s -c 'split("\n") | map(select(length > 0)) | map({component: "store", type: "Store", bridge: .})')
TOOL_BRIDGES=$(find src/agent/src/Bridge/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort \
| jq -R -s -c 'split("\n") | map(select(length > 0)) | map({component: "agent", type: "Tool", bridge: .})')
BRIDGES=$(jq -n -c --argjson store "$STORE_BRIDGES" --argjson tool "$TOOL_BRIDGES" '$store + $tool')
PLATFORM_BRIDGES=$(find src/platform/src/Bridge/ -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort \
| jq -R -s -c 'split("\n") | map(select(length > 0)) | map({component: "platform", type: "Platform", bridge: .})')
BRIDGES=$(jq -n -c --argjson store "$STORE_BRIDGES" --argjson tool "$TOOL_BRIDGES" --argjson platform "$PLATFORM_BRIDGES" '$store + $tool + $platform')
echo "bridges=$BRIDGES" >> $GITHUB_OUTPUT

# Pretty print for info
Expand Down Expand Up @@ -172,6 +174,19 @@ jobs:
php-version: ${{ env.PHP_VERSION }}
extensions: ${{ env.REQUIRED_PHP_EXTENSIONS }}

- name: Install root dependencies (platform bridges only)
if: matrix.bridge.component == 'platform'
uses: ramsey/composer-install@v3

- name: Build root packages (platform bridges only)
if: matrix.bridge.component == 'platform'
run: php .github/build-packages.php

# Remove root vendor and bridge vendor to avoid circular symlinks when installing bridge dependencies
- name: Clean vendor folders (platform bridges only)
if: matrix.bridge.component == 'platform'
run: rm -rf vendor src/platform/src/Bridge/${{ matrix.bridge.bridge }}/vendor

- name: Install dependencies
uses: ramsey/composer-install@v3
with:
Expand Down
79 changes: 79 additions & 0 deletions .github/workflows/unit-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ jobs:
store-bridges-include: ${{ steps.set-matrix.outputs.store-bridges-include }}
tool-bridges: ${{ steps.set-matrix.outputs.tool-bridges }}
tool-bridges-include: ${{ steps.set-matrix.outputs.tool-bridges-include }}
platform-bridges: ${{ steps.set-matrix.outputs.platform-bridges }}
platform-bridges-include: ${{ steps.set-matrix.outputs.platform-bridges-include }}
steps:
- name: Checkout
uses: actions/checkout@v6
Expand Down Expand Up @@ -103,6 +105,24 @@ jobs:
')
echo "tool-bridges-include=$TOOL_BRIDGES_INCLUDE" >> $GITHUB_OUTPUT

# Platform bridges
PLATFORM_BRIDGES=$(ls -1 src/platform/src/Bridge/ | sort \
| jq -R -s -c 'split("\n") | map(select(length > 0)) | map({bridge: .})')
echo "platform-bridges=$PLATFORM_BRIDGES" >> $GITHUB_OUTPUT

# Generate platform bridge includes (lowest, Symfony 7.4, Symfony 8.0)
PLATFORM_BRIDGES_INCLUDE=$(echo "$PLATFORM_BRIDGES" | jq -c '
. as $bridges |
# lowest deps with PHP 8.2
($bridges | map(. + {"php-version": "8.2", "dependency-version": "lowest"})) +
# Symfony 7.4 LTS with PHP 8.2
($bridges | map(. + {"php-version": "8.2", "symfony-version": "7.4.*"})) +
# Symfony 8.0 with PHP 8.5
($bridges | map(. + {"php-version": "8.5", "symfony-version": "8.0.*"}))
| map({bridge: {bridge: .bridge}} + (. | del(.bridge)))
')
echo "platform-bridges-include=$PLATFORM_BRIDGES_INCLUDE" >> $GITHUB_OUTPUT

# Pretty print for info
echo "::group::Packages"
echo "$PACKAGES" | jq .
Expand All @@ -113,6 +133,9 @@ jobs:
echo "::group::Tool Bridges"
echo "$TOOL_BRIDGES" | jq .
echo "::endgroup::"
echo "::group::Platform Bridges"
echo "$PLATFORM_BRIDGES" | jq .
echo "::endgroup::"

package:
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) || '' }}
Expand Down Expand Up @@ -236,3 +259,59 @@ jobs:

- name: Run PHPUnit
run: cd src/${{ matrix.bridge.component }}/src/Bridge/${{ matrix.bridge.bridge }} && vendor/bin/phpunit

platform-bridge:
name: Platform / ${{ matrix.bridge.bridge }} / PHP ${{ matrix.php-version }}${{ matrix.dependency-version == 'lowest' && ' / lowest' || '' }}${{ matrix.symfony-version && format(' / Symfony {0}', matrix.symfony-version) || '' }}
needs: matrix
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
bridge: ${{ fromJson(needs.matrix.outputs.platform-bridges) }}
php-version: ['8.2', '8.5']
dependency-version: ['']
symfony-version: ['']
include: ${{ fromJson(needs.matrix.outputs.platform-bridges-include) }}

env:
SYMFONY_REQUIRE: ${{ matrix.symfony-version || '>=7.4' }}

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Configure environment
run: |
echo COLUMNS=120 >> $GITHUB_ENV
[ 'lowest' = '${{ matrix.dependency-version }}' ] && echo SYMFONY_DEPRECATIONS_HELPER=weak >> $GITHUB_ENV || true

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
tools: flex
extensions: ${{ env.REQUIRED_PHP_EXTENSIONS }}

# Deptrac does not support Symfony 8.0 yet
- name: Remove deptrac (Symfony 8.0)
if: matrix.symfony-version == '8.0.*'
run: composer remove --dev deptrac/deptrac --no-update

- name: Install root dependencies
uses: ramsey/composer-install@v3

- name: Build packages
run: php .github/build-packages.php

# Remove root vendor and bridge vendor to avoid circular symlinks when installing bridge dependencies
- name: Clean vendor folders
run: rm -rf vendor src/platform/src/Bridge/${{ matrix.bridge.bridge }}/vendor

- name: Install dependencies
uses: ramsey/composer-install@v3
with:
working-directory: src/platform/src/Bridge/${{ matrix.bridge.bridge }}
dependency-versions: ${{ matrix.dependency-version || 'highest' }}

- name: Run PHPUnit
run: cd src/platform/src/Bridge/${{ matrix.bridge.bridge }} && vendor/bin/phpunit
16 changes: 16 additions & 0 deletions .github/workflows/validation.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,19 @@ jobs:

- name: Validate tool bridges have required files
run: .github/scripts/validate-bridge-files.sh tool agent

validate_platforms:
name: Platform Bridges
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Validate platform bridge naming conventions
run: .github/scripts/validate-bridge-naming.sh platform platform

- name: Validate platform bridges are in splitsh.json
run: .github/scripts/validate-bridge-splitsh.sh platform

- name: Validate platform bridges have required files
run: .github/scripts/validate-bridge-files.sh platform
2 changes: 2 additions & 0 deletions demo/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
"symfony/ai-bundle": "@dev",
"symfony/ai-chroma-db-store": "@dev",
"symfony/ai-clock-tool": "@dev",
"symfony/ai-hugging-face-platform": "@dev",
"symfony/ai-open-ai-platform": "@dev",
"symfony/ai-similarity-search-tool": "@dev",
"symfony/ai-wikipedia-tool": "@dev",
"symfony/asset": "^8.0",
Expand Down
129 changes: 125 additions & 4 deletions examples/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,44 +19,165 @@
{
"type": "path",
"url": "../src/store"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/AiMlApi"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Albert"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Anthropic"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Azure"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Bedrock"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Cartesia"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Cerebras"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Decart"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/DeepSeek"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/DockerModelRunner"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/ElevenLabs"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Gemini"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Generic"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/HuggingFace"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/LmStudio"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Meta"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Mistral"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Ollama"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/OpenAi"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/OpenRouter"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Perplexity"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Scaleway"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/TransformersPhp"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/VertexAi"
},
{
"type": "path",
"url": "../src/platform/src/Bridge/Voyage"
}
],
"require": {
"php": ">=8.2",
"async-aws/bedrock-runtime": "^1.1",
"codewithkyrian/transformers": "^0.6.2",
"doctrine/dbal": "^3.3|^4.0",
"google/auth": "^1.47",
"symfony/ai-agent": "@dev",
"symfony/ai-ai-ml-api-platform": "@dev",
"symfony/ai-albert-platform": "@dev",
"symfony/ai-anthropic-platform": "@dev",
"symfony/ai-azure-platform": "@dev",
"symfony/ai-azure-search-store": "@dev",
"symfony/ai-bedrock-platform": "@dev",
"symfony/ai-brave-tool": "@dev",
"symfony/ai-cache-store": "@dev",
"symfony/ai-cartesia-platform": "@dev",
"symfony/ai-cerebras-platform": "@dev",
"symfony/ai-chat": "@dev",
"symfony/ai-chroma-db-store": "@dev",
"symfony/ai-click-house-store": "@dev",
"symfony/ai-clock-tool": "@dev",
"symfony/ai-cloudflare-store": "@dev",
"symfony/ai-decart-platform": "@dev",
"symfony/ai-deep-seek-platform": "@dev",
"symfony/ai-docker-model-runner-platform": "@dev",
"symfony/ai-elasticsearch-store": "@dev",
"symfony/ai-eleven-labs-platform": "@dev",
"symfony/ai-gemini-platform": "@dev",
"symfony/ai-generic-platform": "@dev",
"symfony/ai-hugging-face-platform": "@dev",
"symfony/ai-lm-studio-platform": "@dev",
"symfony/ai-manticore-search-store": "@dev",
"symfony/ai-maria-db-store": "@dev",
"symfony/ai-meilisearch-store": "@dev",
"symfony/ai-meta-platform": "@dev",
"symfony/ai-milvus-store": "@dev",
"symfony/ai-mistral-platform": "@dev",
"symfony/ai-mongo-db-store": "@dev",
"symfony/ai-neo4j-store": "@dev",
"symfony/ai-ollama-platform": "@dev",
"symfony/ai-open-ai-platform": "@dev",
"symfony/ai-open-meteo-tool": "@dev",
"symfony/ai-open-router-platform": "@dev",
"symfony/ai-open-search-store": "@dev",
"symfony/ai-perplexity-platform": "@dev",
"symfony/ai-pinecone-store": "@dev",
"symfony/ai-platform": "@dev",
"symfony/ai-postgres-store": "@dev",
"symfony/ai-qdrant-store": "@dev",
"symfony/ai-redis-store": "@dev",
"symfony/ai-scaleway-platform": "@dev",
"symfony/ai-scraper-tool": "@dev",
"symfony/ai-serp-api-tool": "@dev",
"symfony/ai-similarity-search-tool": "@dev",
"symfony/ai-supabase-store": "@dev",
"symfony/ai-surreal-db-store": "@dev",
"symfony/ai-tavily-tool": "@dev",
"symfony/ai-transformers-php-platform": "@dev",
"symfony/ai-typesense-store": "@dev",
"symfony/ai-vertex-ai-platform": "@dev",
"symfony/ai-voyage-platform": "@dev",
"symfony/ai-weaviate-store": "@dev",
"symfony/ai-wikipedia-tool": "@dev",
"symfony/ai-youtube-tool": "@dev",
Expand Down
30 changes: 29 additions & 1 deletion splitsh.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,35 @@
"ai-bundle": "src/ai-bundle",
"ai-chat": "src/chat",
"mcp-bundle": "src/mcp-bundle",
"ai-platform": "src/platform",
"ai-platform": {
"prefixes": [{ "from": "src/platform", "to": "", "excludes": ["src/Bridge"] }]
},
"ai-ai-ml-api-platform": "src/platform/src/Bridge/AiMlApi",
"ai-albert-platform": "src/platform/src/Bridge/Albert",
"ai-anthropic-platform": "src/platform/src/Bridge/Anthropic",
"ai-azure-platform": "src/platform/src/Bridge/Azure",
"ai-bedrock-platform": "src/platform/src/Bridge/Bedrock",
"ai-cartesia-platform": "src/platform/src/Bridge/Cartesia",
"ai-cerebras-platform": "src/platform/src/Bridge/Cerebras",
"ai-decart-platform": "src/platform/src/Bridge/Decart",
"ai-deep-seek-platform": "src/platform/src/Bridge/DeepSeek",
"ai-docker-model-runner-platform": "src/platform/src/Bridge/DockerModelRunner",
"ai-eleven-labs-platform": "src/platform/src/Bridge/ElevenLabs",
"ai-gemini-platform": "src/platform/src/Bridge/Gemini",
"ai-generic-platform": "src/platform/src/Bridge/Generic",
"ai-hugging-face-platform": "src/platform/src/Bridge/HuggingFace",
"ai-lm-studio-platform": "src/platform/src/Bridge/LmStudio",
"ai-meta-platform": "src/platform/src/Bridge/Meta",
"ai-mistral-platform": "src/platform/src/Bridge/Mistral",
"ai-ollama-platform": "src/platform/src/Bridge/Ollama",
"ai-open-ai-platform": "src/platform/src/Bridge/OpenAi",
"ai-open-router-platform": "src/platform/src/Bridge/OpenRouter",
"ai-perplexity-platform": "src/platform/src/Bridge/Perplexity",
"ai-replicate-platform": "src/platform/src/Bridge/Replicate",
"ai-scaleway-platform": "src/platform/src/Bridge/Scaleway",
"ai-transformers-php-platform": "src/platform/src/Bridge/TransformersPhp",
"ai-vertex-ai-platform": "src/platform/src/Bridge/VertexAi",
"ai-voyage-platform": "src/platform/src/Bridge/Voyage",
"ai-store": {
"prefixes": [{ "from": "src/store", "to": "", "excludes": ["src/Bridge"] }]
},
Expand Down
5 changes: 1 addition & 4 deletions src/ai-bundle/composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,7 @@
}
},
"config": {
"sort-packages": true,
"allow-plugins": {
"php-http/discovery": true
}
"sort-packages": true
},
"extra": {
"branch-alias": {
Expand Down
Loading