diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 88b2d5106..bb848209f 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -18,6 +18,7 @@ Llama Stack uses GitHub Actions for Continuous Integration (CI). Below is a tabl | Python Package Build Test | [python-build-test.yml](python-build-test.yml) | Test building the llama-stack PyPI project | | Integration Tests (Record) | [record-integration-tests.yml](record-integration-tests.yml) | Run the integration test suite from tests/integration | | Check semantic PR titles | [semantic-pr.yml](semantic-pr.yml) | Ensure that PR titles follow the conventional commit spec | +| Stainless SDK Builds | [stainless-builds.yml](stainless-builds.yml) | Build Stainless SDK from OpenAPI spec changes | | Close stale issues and PRs | [stale_bot.yml](stale_bot.yml) | Run the Stale Bot action | | Test External Providers Installed via Module | [test-external-provider-module.yml](test-external-provider-module.yml) | Test External Provider installation via Python module | | Test External API and Providers | [test-external.yml](test-external.yml) | Test the External API and Provider mechanisms | diff --git a/.github/workflows/stainless-builds.yml b/.github/workflows/stainless-builds.yml new file mode 100644 index 000000000..00c5e3df5 --- /dev/null +++ b/.github/workflows/stainless-builds.yml @@ -0,0 +1,110 @@ +name: Stainless SDK Builds +run-name: Build Stainless SDK from OpenAPI spec changes + +# This workflow uses pull_request_target, which allows it to run on pull requests +# from forks with access to secrets. This is safe because the workflow definition +# comes from the base branch (trusted), and the action only reads OpenAPI spec +# files without executing any code from the PR. + +on: + pull_request_target: + types: + - opened + - synchronize + - reopened + - closed + paths: + - "client-sdks/stainless/**" + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true + +env: + # Stainless organization name. + STAINLESS_ORG: llamastack + + # Stainless project name. + STAINLESS_PROJECT: llama-stack-client + + # Path to your OpenAPI spec. + OAS_PATH: ./client-sdks/stainless/openapi.yml + + # Path to your Stainless config. Optional; only provide this if you prefer + # to maintain the ground truth Stainless config in your own repo. + CONFIG_PATH: ./client-sdks/stainless/config.yml + + # When to fail the job based on build conclusion. + # Options: "never" | "note" | "warning" | "error" | "fatal". + FAIL_ON: error + + # In your repo secrets, configure: + # - STAINLESS_API_KEY: a Stainless API key, which you can generate on the + # Stainless organization dashboard + +jobs: + preview: + if: github.event.action != 'closed' + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + # Checkout the PR's code to access the OpenAPI spec and config files. + # This is necessary to read the spec/config from the PR (including from forks). + - name: Checkout repository + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 2 + + # This action builds preview SDKs from the OpenAPI spec changes and + # posts/updates a comment on the PR with build results and links to the preview. + - name: Run preview builds + uses: stainless-api/upload-openapi-spec-action/preview@32823b096b4319c53ee948d702d9052873af485f # 1.6.0 + with: + stainless_api_key: ${{ secrets.STAINLESS_API_KEY }} + org: ${{ env.STAINLESS_ORG }} + project: ${{ env.STAINLESS_PROJECT }} + oas_path: ${{ env.OAS_PATH }} + config_path: ${{ env.CONFIG_PATH }} + fail_on: ${{ env.FAIL_ON }} + base_sha: ${{ github.event.pull_request.base.sha }} + base_ref: ${{ github.event.pull_request.base.ref }} + head_sha: ${{ github.event.pull_request.head.sha }} + + merge: + if: github.event.action == 'closed' && github.event.pull_request.merged == true + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + # Checkout the PR's code to access the OpenAPI spec and config files. + # This is necessary to read the spec/config from the PR (including from forks). + - name: Checkout repository + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 2 + + # Note that this only merges in changes that happened on the last build on + # preview/${{ github.head_ref }}. It's possible that there are OAS/config + # changes that haven't been built, if the preview-sdk job didn't finish + # before this step starts. In theory we want to wait for all builds + # against preview/${{ github.head_ref }} to complete, but assuming that + # the preview-sdk job happens before the PR merge, it should be fine. + - name: Run merge build + uses: stainless-api/upload-openapi-spec-action/merge@32823b096b4319c53ee948d702d9052873af485f # 1.6.0 + with: + stainless_api_key: ${{ secrets.STAINLESS_API_KEY }} + org: ${{ env.STAINLESS_ORG }} + project: ${{ env.STAINLESS_PROJECT }} + oas_path: ${{ env.OAS_PATH }} + config_path: ${{ env.CONFIG_PATH }} + fail_on: ${{ env.FAIL_ON }} + base_sha: ${{ github.event.pull_request.base.sha }} + base_ref: ${{ github.event.pull_request.base.ref }} + head_sha: ${{ github.event.pull_request.head.sha }} diff --git a/client-sdks/stainless/README.md b/client-sdks/stainless/README.md index 5d391f14c..5551e90d5 100644 --- a/client-sdks/stainless/README.md +++ b/client-sdks/stainless/README.md @@ -1,8 +1,8 @@ These are the source-of-truth configuration files used to generate the Stainless client SDKs via Stainless. - `openapi.yml`: this is the OpenAPI specification for the Llama Stack API. -- `openapi.stainless.yml`: this is the Stainless _configuration_ which instructs Stainless how to generate the client SDKs. +- `config.yml`: this is the Stainless _configuration_ which instructs Stainless how to generate the client SDKs. A small side note: notice the `.yml` suffixes since Stainless uses that suffix typically for its configuration files. -These files go hand-in-hand. As of now, only the `openapi.yml` file is automatically generated using the `run_openapi_generator.sh` script. \ No newline at end of file +These files go hand-in-hand. As of now, only the `openapi.yml` file is automatically generated using the `run_openapi_generator.sh` script. diff --git a/client-sdks/stainless/config-not-source-of-truth-yet.yml b/client-sdks/stainless/config.yml similarity index 96% rename from client-sdks/stainless/config-not-source-of-truth-yet.yml rename to client-sdks/stainless/config.yml index 23be00d74..ab9342c49 100644 --- a/client-sdks/stainless/config-not-source-of-truth-yet.yml +++ b/client-sdks/stainless/config.yml @@ -115,6 +115,9 @@ resources: sampling_params: SamplingParams scoring_result: ScoringResult system_message: SystemMessage + query_result: RAGQueryResult + document: RAGDocument + query_config: RAGQueryConfig toolgroups: models: tool_group: ToolGroup @@ -140,6 +143,11 @@ resources: endpoint: get /v1/tool-runtime/list-tools paginated: false invoke_tool: post /v1/tool-runtime/invoke + subresources: + rag_tool: + methods: + insert: post /v1/tool-runtime/rag-tool/insert + query: post /v1/tool-runtime/rag-tool/query responses: models: @@ -332,21 +340,18 @@ resources: endpoint: get /v1/inspect/routes paginated: false - moderations: models: create_response: ModerationObject methods: create: post /v1/moderations - safety: models: run_shield_response: RunShieldResponse methods: run_shield: post /v1/safety/run-shield - shields: models: shield: Shield @@ -455,10 +460,9 @@ resources: iterrows: get /v1beta/datasetio/iterrows/{dataset_id} appendrows: post /v1beta/datasetio/append-rows/{dataset_id} - settings: license: MIT - unwrap_response_fields: [ data ] + unwrap_response_fields: [data] openapi: transformations: @@ -466,7 +470,7 @@ openapi: reason: Better return_type using enum args: target: - - '$.components.schemas' + - "$.components.schemas" object: ReturnType: additionalProperties: false @@ -491,10 +495,10 @@ openapi: args: filter: only: - - '$.components.schemas.ScoringFn.properties.return_type' - - '$.components.schemas.RegisterScoringFunctionRequest.properties.return_type' + - "$.components.schemas.ScoringFn.properties.return_type" + - "$.components.schemas.RegisterScoringFunctionRequest.properties.return_type" value: - $ref: '#/components/schemas/ReturnType' + $ref: "#/components/schemas/ReturnType" - command: oneOfToAnyOf reason: Prism (mock server) doesn't like one of our requests as it technically matches multiple variants