diff --git a/.release-please-manifest.json b/.release-please-manifest.json index d139eec..c7b8cc6 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.10.6" + ".": "0.10.7" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 04a3a0e..f4bb289 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,3 +1,3 @@ -configured_endpoints: 26 -openapi_spec_hash: 6f6cb98b7755d18274dd51e857508336 -config_hash: cc9a32249c08143687799eb8de187d6a +configured_endpoints: 27 +openapi_spec_hash: c70c3eccfe803e99c14e97e650b1e314 +config_hash: 1f7626e569e1a74574a58d7883170a0e diff --git a/CHANGELOG.md b/CHANGELOG.md index 09b15ad..eef1edb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.10.7 (2026-02-10) + +Full Changelog: [v0.10.6...v0.10.7](https://github.com/openlayer-ai/openlayer-ruby/compare/v0.10.6...v0.10.7) + +### Chores + +* **closes OPEN-8647:** add endpoint to retrieve aggregated user data for inference pipelines ([5442bcb](https://github.com/openlayer-ai/openlayer-ruby/commit/5442bcbd5b6ab56d618fd36a985a7d864b65e7ae)) + ## 0.10.6 (2026-02-07) Full Changelog: [v0.10.5...v0.10.6](https://github.com/openlayer-ai/openlayer-ruby/compare/v0.10.5...v0.10.6) diff --git a/Gemfile.lock b/Gemfile.lock index 3d09063..5e3deb1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -11,7 +11,7 @@ GIT PATH remote: . specs: - openlayer (0.10.6) + openlayer (0.10.7) cgi connection_pool diff --git a/README.md b/README.md index 77543d0..591a12c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ To use this gem, install via Bundler by adding the following to your application ```ruby -gem "openlayer", "~> 0.10.6" +gem "openlayer", "~> 0.10.7" ``` diff --git a/lib/openlayer.rb b/lib/openlayer.rb index 730cc61..f6740a6 100644 --- a/lib/openlayer.rb +++ b/lib/openlayer.rb @@ -59,6 +59,8 @@ require_relative "openlayer/models/inference_pipeline_delete_params" require_relative "openlayer/models/inference_pipeline_retrieve_params" require_relative "openlayer/models/inference_pipeline_retrieve_response" +require_relative "openlayer/models/inference_pipeline_retrieve_users_params" +require_relative "openlayer/models/inference_pipeline_retrieve_users_response" require_relative "openlayer/models/inference_pipelines/data_stream_params" require_relative "openlayer/models/inference_pipelines/data_stream_response" require_relative "openlayer/models/inference_pipelines/row_update_params" diff --git a/lib/openlayer/models.rb b/lib/openlayer/models.rb index 0be6579..7f7034a 100644 --- a/lib/openlayer/models.rb +++ b/lib/openlayer/models.rb @@ -47,6 +47,8 @@ module Openlayer InferencePipelineRetrieveParams = Openlayer::Models::InferencePipelineRetrieveParams + InferencePipelineRetrieveUsersParams = Openlayer::Models::InferencePipelineRetrieveUsersParams + InferencePipelines = Openlayer::Models::InferencePipelines InferencePipelineUpdateParams = Openlayer::Models::InferencePipelineUpdateParams diff --git a/lib/openlayer/models/inference_pipeline_retrieve_users_params.rb b/lib/openlayer/models/inference_pipeline_retrieve_users_params.rb new file mode 100644 index 0000000..e8a2fd4 --- /dev/null +++ b/lib/openlayer/models/inference_pipeline_retrieve_users_params.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module Openlayer + module Models + # @see Openlayer::Resources::InferencePipelines#retrieve_users + class InferencePipelineRetrieveUsersParams < Openlayer::Internal::Type::BaseModel + extend Openlayer::Internal::Type::RequestParameters::Converter + include Openlayer::Internal::Type::RequestParameters + + # @!attribute page + # The page to return in a paginated query. + # + # @return [Integer, nil] + optional :page, Integer + + # @!attribute per_page + # Maximum number of items to return per page. + # + # @return [Integer, nil] + optional :per_page, Integer + + # @!method initialize(page: nil, per_page: nil, request_options: {}) + # @param page [Integer] The page to return in a paginated query. + # + # @param per_page [Integer] Maximum number of items to return per page. + # + # @param request_options [Openlayer::RequestOptions, Hash{Symbol=>Object}] + end + end +end diff --git a/lib/openlayer/models/inference_pipeline_retrieve_users_response.rb b/lib/openlayer/models/inference_pipeline_retrieve_users_response.rb new file mode 100644 index 0000000..802b624 --- /dev/null +++ b/lib/openlayer/models/inference_pipeline_retrieve_users_response.rb @@ -0,0 +1,77 @@ +# frozen_string_literal: true + +module Openlayer + module Models + # @see Openlayer::Resources::InferencePipelines#retrieve_users + class InferencePipelineRetrieveUsersResponse < Openlayer::Internal::Type::BaseModel + # @!attribute items + # Array of user aggregation data + # + # @return [Array] + required :items, + -> { Openlayer::Internal::Type::ArrayOf[Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item] } + + # @!method initialize(items:) + # @param items [Array] Array of user aggregation data + + class Item < Openlayer::Internal::Type::BaseModel + # @!attribute id + # The unique user identifier + # + # @return [String] + required :id, String + + # @!attribute cost + # Total cost for this user + # + # @return [Float] + required :cost, Float + + # @!attribute date_of_first_record + # Timestamp of the user's first event/trace + # + # @return [Time] + required :date_of_first_record, Time, api_name: :dateOfFirstRecord + + # @!attribute date_of_last_record + # Timestamp of the user's last event/trace + # + # @return [Time] + required :date_of_last_record, Time, api_name: :dateOfLastRecord + + # @!attribute records + # Total number of traces/rows for this user + # + # @return [Integer] + required :records, Integer + + # @!attribute sessions + # Count of unique sessions for this user + # + # @return [Integer] + required :sessions, Integer + + # @!attribute tokens + # Total token count for this user + # + # @return [Float] + required :tokens, Float + + # @!method initialize(id:, cost:, date_of_first_record:, date_of_last_record:, records:, sessions:, tokens:) + # @param id [String] The unique user identifier + # + # @param cost [Float] Total cost for this user + # + # @param date_of_first_record [Time] Timestamp of the user's first event/trace + # + # @param date_of_last_record [Time] Timestamp of the user's last event/trace + # + # @param records [Integer] Total number of traces/rows for this user + # + # @param sessions [Integer] Count of unique sessions for this user + # + # @param tokens [Float] Total token count for this user + end + end + end +end diff --git a/lib/openlayer/resources/inference_pipelines.rb b/lib/openlayer/resources/inference_pipelines.rb index 2d95eee..a42d1a1 100644 --- a/lib/openlayer/resources/inference_pipelines.rb +++ b/lib/openlayer/resources/inference_pipelines.rb @@ -87,6 +87,36 @@ def delete(inference_pipeline_id, params = {}) ) end + # Get aggregated user data for an inference pipeline with pagination and metadata. + # + # Returns a list of users who have interacted with the inference pipeline, + # including their activity statistics such as session counts, record counts, token + # usage, and costs. + # + # @overload retrieve_users(inference_pipeline_id, page: nil, per_page: nil, request_options: {}) + # + # @param inference_pipeline_id [String] The inference pipeline id (a UUID). + # + # @param page [Integer] The page to return in a paginated query. + # + # @param per_page [Integer] Maximum number of items to return per page. + # + # @param request_options [Openlayer::RequestOptions, Hash{Symbol=>Object}, nil] + # + # @return [Openlayer::Models::InferencePipelineRetrieveUsersResponse] + # + # @see Openlayer::Models::InferencePipelineRetrieveUsersParams + def retrieve_users(inference_pipeline_id, params = {}) + parsed, options = Openlayer::InferencePipelineRetrieveUsersParams.dump_request(params) + @client.request( + method: :get, + path: ["inference-pipelines/%1$s/users", inference_pipeline_id], + query: parsed.transform_keys(per_page: "perPage"), + model: Openlayer::Models::InferencePipelineRetrieveUsersResponse, + options: options + ) + end + # @api private # # @param client [Openlayer::Client] diff --git a/lib/openlayer/version.rb b/lib/openlayer/version.rb index 03a48be..3a3efc5 100644 --- a/lib/openlayer/version.rb +++ b/lib/openlayer/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Openlayer - VERSION = "0.10.6" + VERSION = "0.10.7" end diff --git a/rbi/openlayer/models.rbi b/rbi/openlayer/models.rbi index 6380315..389d0e8 100644 --- a/rbi/openlayer/models.rbi +++ b/rbi/openlayer/models.rbi @@ -11,6 +11,9 @@ module Openlayer InferencePipelineRetrieveParams = Openlayer::Models::InferencePipelineRetrieveParams + InferencePipelineRetrieveUsersParams = + Openlayer::Models::InferencePipelineRetrieveUsersParams + InferencePipelines = Openlayer::Models::InferencePipelines InferencePipelineUpdateParams = diff --git a/rbi/openlayer/models/inference_pipeline_retrieve_users_params.rbi b/rbi/openlayer/models/inference_pipeline_retrieve_users_params.rbi new file mode 100644 index 0000000..0fad054 --- /dev/null +++ b/rbi/openlayer/models/inference_pipeline_retrieve_users_params.rbi @@ -0,0 +1,60 @@ +# typed: strong + +module Openlayer + module Models + class InferencePipelineRetrieveUsersParams < Openlayer::Internal::Type::BaseModel + extend Openlayer::Internal::Type::RequestParameters::Converter + include Openlayer::Internal::Type::RequestParameters + + OrHash = + T.type_alias do + T.any( + Openlayer::InferencePipelineRetrieveUsersParams, + Openlayer::Internal::AnyHash + ) + end + + # The page to return in a paginated query. + sig { returns(T.nilable(Integer)) } + attr_reader :page + + sig { params(page: Integer).void } + attr_writer :page + + # Maximum number of items to return per page. + sig { returns(T.nilable(Integer)) } + attr_reader :per_page + + sig { params(per_page: Integer).void } + attr_writer :per_page + + sig do + params( + page: Integer, + per_page: Integer, + request_options: Openlayer::RequestOptions::OrHash + ).returns(T.attached_class) + end + def self.new( + # The page to return in a paginated query. + page: nil, + # Maximum number of items to return per page. + per_page: nil, + request_options: {} + ) + end + + sig do + override.returns( + { + page: Integer, + per_page: Integer, + request_options: Openlayer::RequestOptions + } + ) + end + def to_hash + end + end + end +end diff --git a/rbi/openlayer/models/inference_pipeline_retrieve_users_response.rbi b/rbi/openlayer/models/inference_pipeline_retrieve_users_response.rbi new file mode 100644 index 0000000..9063590 --- /dev/null +++ b/rbi/openlayer/models/inference_pipeline_retrieve_users_response.rbi @@ -0,0 +1,135 @@ +# typed: strong + +module Openlayer + module Models + class InferencePipelineRetrieveUsersResponse < Openlayer::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + Openlayer::Models::InferencePipelineRetrieveUsersResponse, + Openlayer::Internal::AnyHash + ) + end + + # Array of user aggregation data + sig do + returns( + T::Array[ + Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item + ] + ) + end + attr_accessor :items + + sig do + params( + items: + T::Array[ + Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item::OrHash + ] + ).returns(T.attached_class) + end + def self.new( + # Array of user aggregation data + items: + ) + end + + sig do + override.returns( + { + items: + T::Array[ + Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item + ] + } + ) + end + def to_hash + end + + class Item < Openlayer::Internal::Type::BaseModel + OrHash = + T.type_alias do + T.any( + Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item, + Openlayer::Internal::AnyHash + ) + end + + # The unique user identifier + sig { returns(String) } + attr_accessor :id + + # Total cost for this user + sig { returns(Float) } + attr_accessor :cost + + # Timestamp of the user's first event/trace + sig { returns(Time) } + attr_accessor :date_of_first_record + + # Timestamp of the user's last event/trace + sig { returns(Time) } + attr_accessor :date_of_last_record + + # Total number of traces/rows for this user + sig { returns(Integer) } + attr_accessor :records + + # Count of unique sessions for this user + sig { returns(Integer) } + attr_accessor :sessions + + # Total token count for this user + sig { returns(Float) } + attr_accessor :tokens + + sig do + params( + id: String, + cost: Float, + date_of_first_record: Time, + date_of_last_record: Time, + records: Integer, + sessions: Integer, + tokens: Float + ).returns(T.attached_class) + end + def self.new( + # The unique user identifier + id:, + # Total cost for this user + cost:, + # Timestamp of the user's first event/trace + date_of_first_record:, + # Timestamp of the user's last event/trace + date_of_last_record:, + # Total number of traces/rows for this user + records:, + # Count of unique sessions for this user + sessions:, + # Total token count for this user + tokens: + ) + end + + sig do + override.returns( + { + id: String, + cost: Float, + date_of_first_record: Time, + date_of_last_record: Time, + records: Integer, + sessions: Integer, + tokens: Float + } + ) + end + def to_hash + end + end + end + end +end diff --git a/rbi/openlayer/resources/inference_pipelines.rbi b/rbi/openlayer/resources/inference_pipelines.rbi index 6299e69..b1794ec 100644 --- a/rbi/openlayer/resources/inference_pipelines.rbi +++ b/rbi/openlayer/resources/inference_pipelines.rbi @@ -70,6 +70,30 @@ module Openlayer ) end + # Get aggregated user data for an inference pipeline with pagination and metadata. + # + # Returns a list of users who have interacted with the inference pipeline, + # including their activity statistics such as session counts, record counts, token + # usage, and costs. + sig do + params( + inference_pipeline_id: String, + page: Integer, + per_page: Integer, + request_options: Openlayer::RequestOptions::OrHash + ).returns(Openlayer::Models::InferencePipelineRetrieveUsersResponse) + end + def retrieve_users( + # The inference pipeline id (a UUID). + inference_pipeline_id, + # The page to return in a paginated query. + page: nil, + # Maximum number of items to return per page. + per_page: nil, + request_options: {} + ) + end + # @api private sig { params(client: Openlayer::Client).returns(T.attached_class) } def self.new(client:) diff --git a/sig/openlayer/models.rbs b/sig/openlayer/models.rbs index 762157b..e367a68 100644 --- a/sig/openlayer/models.rbs +++ b/sig/openlayer/models.rbs @@ -7,6 +7,8 @@ module Openlayer class InferencePipelineRetrieveParams = Openlayer::Models::InferencePipelineRetrieveParams + class InferencePipelineRetrieveUsersParams = Openlayer::Models::InferencePipelineRetrieveUsersParams + module InferencePipelines = Openlayer::Models::InferencePipelines class InferencePipelineUpdateParams = Openlayer::Models::InferencePipelineUpdateParams diff --git a/sig/openlayer/models/inference_pipeline_retrieve_users_params.rbs b/sig/openlayer/models/inference_pipeline_retrieve_users_params.rbs new file mode 100644 index 0000000..5a7610d --- /dev/null +++ b/sig/openlayer/models/inference_pipeline_retrieve_users_params.rbs @@ -0,0 +1,32 @@ +module Openlayer + module Models + type inference_pipeline_retrieve_users_params = + { page: Integer, per_page: Integer } + & Openlayer::Internal::Type::request_parameters + + class InferencePipelineRetrieveUsersParams < Openlayer::Internal::Type::BaseModel + extend Openlayer::Internal::Type::RequestParameters::Converter + include Openlayer::Internal::Type::RequestParameters + + attr_reader page: Integer? + + def page=: (Integer) -> Integer + + attr_reader per_page: Integer? + + def per_page=: (Integer) -> Integer + + def initialize: ( + ?page: Integer, + ?per_page: Integer, + ?request_options: Openlayer::request_opts + ) -> void + + def to_hash: -> { + page: Integer, + per_page: Integer, + request_options: Openlayer::RequestOptions + } + end + end +end diff --git a/sig/openlayer/models/inference_pipeline_retrieve_users_response.rbs b/sig/openlayer/models/inference_pipeline_retrieve_users_response.rbs new file mode 100644 index 0000000..facdba8 --- /dev/null +++ b/sig/openlayer/models/inference_pipeline_retrieve_users_response.rbs @@ -0,0 +1,67 @@ +module Openlayer + module Models + type inference_pipeline_retrieve_users_response = + { + items: ::Array[Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item] + } + + class InferencePipelineRetrieveUsersResponse < Openlayer::Internal::Type::BaseModel + attr_accessor items: ::Array[Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item] + + def initialize: ( + items: ::Array[Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item] + ) -> void + + def to_hash: -> { + items: ::Array[Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item] + } + + type item = + { + id: String, + cost: Float, + date_of_first_record: Time, + date_of_last_record: Time, + records: Integer, + sessions: Integer, + tokens: Float + } + + class Item < Openlayer::Internal::Type::BaseModel + attr_accessor id: String + + attr_accessor cost: Float + + attr_accessor date_of_first_record: Time + + attr_accessor date_of_last_record: Time + + attr_accessor records: Integer + + attr_accessor sessions: Integer + + attr_accessor tokens: Float + + def initialize: ( + id: String, + cost: Float, + date_of_first_record: Time, + date_of_last_record: Time, + records: Integer, + sessions: Integer, + tokens: Float + ) -> void + + def to_hash: -> { + id: String, + cost: Float, + date_of_first_record: Time, + date_of_last_record: Time, + records: Integer, + sessions: Integer, + tokens: Float + } + end + end + end +end diff --git a/sig/openlayer/resources/inference_pipelines.rbs b/sig/openlayer/resources/inference_pipelines.rbs index c0721a6..c73670a 100644 --- a/sig/openlayer/resources/inference_pipelines.rbs +++ b/sig/openlayer/resources/inference_pipelines.rbs @@ -26,6 +26,13 @@ module Openlayer ?request_options: Openlayer::request_opts ) -> nil + def retrieve_users: ( + String inference_pipeline_id, + ?page: Integer, + ?per_page: Integer, + ?request_options: Openlayer::request_opts + ) -> Openlayer::Models::InferencePipelineRetrieveUsersResponse + def initialize: (client: Openlayer::Client) -> void end end diff --git a/test/openlayer/resources/inference_pipelines_test.rb b/test/openlayer/resources/inference_pipelines_test.rb index c5f636a..f912995 100644 --- a/test/openlayer/resources/inference_pipelines_test.rb +++ b/test/openlayer/resources/inference_pipelines_test.rb @@ -78,4 +78,18 @@ def test_delete response => nil end end + + def test_retrieve_users + response = @openlayer.inference_pipelines.retrieve_users("182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e") + + assert_pattern do + response => Openlayer::Models::InferencePipelineRetrieveUsersResponse + end + + assert_pattern do + response => { + items: ^(Openlayer::Internal::Type::ArrayOf[Openlayer::Models::InferencePipelineRetrieveUsersResponse::Item]) + } + end + end end