diff --git a/.github/workflows/workbench-app.yml b/.github/workflows/workbench-app.yml new file mode 100644 index 00000000..d2f105ee --- /dev/null +++ b/.github/workflows/workbench-app.yml @@ -0,0 +1,85 @@ +# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy +# More GitHub Actions for Azure: https://github.com/Azure/actions + +name: workbench-app build and deploy + +on: + push: + branches: + - main + paths: + - "workbench-app/**" + - ".github/workflows/workbench-app.yml" + pull_request: + branches: + - main + paths: + - "workbench-app/**" + - ".github/workflows/workbench-app.yml" + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Node.js version + uses: actions/setup-node@v4 + with: + node-version: "20.x" + + - name: npm install, build, and test + run: | + npm install + npm run build --if-present + npm run test --if-present + working-directory: ./workbench-app + env: + NODE_OPTIONS: "--max_old_space_size=8192" + + - name: Zip artifact for deployment + if: github.event_name != 'pull_request' + run: zip semantic-workbench-release.zip . -r + working-directory: ./workbench-app/build + + - name: Upload artifact for deployment job + if: github.event_name != 'pull_request' + uses: actions/upload-artifact@v4 + with: + name: semantic-workbench-node-app + path: ./workbench-app/build/semantic-workbench-release.zip + + deploy: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' + needs: build + environment: + name: production + permissions: + id-token: write #This is required for requesting the JWT + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v4 + with: + name: semantic-workbench-node-app + + - name: Unzip artifact for deployment + run: unzip semantic-workbench-release.zip + + - name: Login to Azure + uses: azure/login@v2 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + + - name: "Deploy to Azure Web App" + id: deploy-to-webapp + uses: azure/webapps-deploy@v2 + with: + app-name: ${{ secrets.AZURE_WORKBENCH_APP_SERVICE_NAME }} + slot-name: "Production" + package: . diff --git a/.github/workflows/semantic-workbench-service.yml b/.github/workflows/workbench-service.yml similarity index 98% rename from .github/workflows/semantic-workbench-service.yml rename to .github/workflows/workbench-service.yml index 975c788f..71846c5f 100644 --- a/.github/workflows/semantic-workbench-service.yml +++ b/.github/workflows/workbench-service.yml @@ -1,4 +1,4 @@ -name: workbench service test and deploy +name: workbench-service test and deploy on: pull_request: diff --git a/examples/python/python-03-multimodel-chatbot/assistant/model_adapters.py b/examples/python/python-03-multimodel-chatbot/assistant/model_adapters.py index 1fcafcda..53b3425c 100644 --- a/examples/python/python-03-multimodel-chatbot/assistant/model_adapters.py +++ b/examples/python/python-03-multimodel-chatbot/assistant/model_adapters.py @@ -189,29 +189,30 @@ async def generate_response( # we're only expecting text blocks for now, so raise an error if we get a ToolUseBlock content = completion.content deepmerge.always_merger.merge(metadata, {"debug": {"response": completion.model_dump_json()}}) - if isinstance(content, list): - for item in content: - if isinstance(item, anthropic.types.TextBlock): - return GenerateResponseResult( - response=item.text, - metadata=metadata, - ) - elif isinstance(item, anthropic.types.ToolUseBlock): - return GenerateResponseResult( - error="Received a ToolUseBlock, which is not supported", - metadata=metadata, - ) - else: - return GenerateResponseResult( - error="Received an unexpected response", - metadata=metadata, - ) - else: + if not isinstance(content, list): return GenerateResponseResult( error="Content is not a list", metadata=metadata, ) + for item in content: + if isinstance(item, anthropic.types.TextBlock): + return GenerateResponseResult( + response=item.text, + metadata=metadata, + ) + + if isinstance(item, anthropic.types.ToolUseBlock): + return GenerateResponseResult( + error="Received a ToolUseBlock, which is not supported", + metadata=metadata, + ) + + return GenerateResponseResult( + error="Received an unexpected response", + metadata=metadata, + ) + except Exception as e: return exception_to_generate_response_result(e, metadata)