runapi-flux-2 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 56c69158fdf9a626666619b7457f16f9a562589eacec46f7358435e3a6cdbd26
4
- data.tar.gz: 4c085ddbf1ccdea5bc7df3302801767049b10a62cb802e07415effd6afa9d822
3
+ metadata.gz: 5c62a0872a2952d047ff3263dc0def4d5b5db1c6f0c37126fc0299147453037b
4
+ data.tar.gz: da871e92d952eacff9d32c85bcd506795a7678a70e5978915e8bc60e84fe6bb7
5
5
  SHA512:
6
- metadata.gz: a475f504bddc3d7319543bab106eb725de27c9c253b3fd435006cb377bde9c10e7fac49a077376f6e733d13b33f86123f8100acb4d66dfeff264b5746cc9f25c
7
- data.tar.gz: c858a93fef4b6227e33a8b70645f7bd63d7f1ebe9b758ddb14eba5de3cdcaf7096fe1b72054c0d818e5e9f9f3d36dca7b44e70fcb4e7b35285598622b6810e00
6
+ metadata.gz: 61c06e5fdc27b9707af59dd39597f2b981406552c1e4167f0e84e5fba2c527cdbc6ba5da7e764a21afcd03b23dfd3fce8226505bf4260964a06ac503ae2010d8
7
+ data.tar.gz: 27a3aad268c8753021c6d99d13fb7c2e2e6ffd2d629280ae094627c1ce94ad968c69ac3cfebe1f695d7d42257520ebed0dfa2b89e89306a0bf7e06ff3c8f6bc9
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # Flux API Ruby SDK for RunAPI
2
+
3
+ The flux api Ruby SDK is the language-specific package for Flux 2 on RunAPI. Use this flux api package for text-to-image, remix-image, and creative production flows when your application needs JSON request bodies, task status lookup, and consistent RunAPI errors in Ruby.
4
+
5
+ This flux api README is the Ruby package guide inside the public `flux-2-sdk` repository. For the repository overview, start at `../README.md`; for model details, use https://runapi.ai/models/flux-2; for API reference, use https://runapi.ai/docs#flux-2; for SDK docs, use https://runapi.ai/docs#sdk-flux-2.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ gem install runapi-flux_2
11
+ ```
12
+
13
+ ## Quick start
14
+
15
+ ```ruby
16
+ require "runapi/flux_2"
17
+
18
+ client = RunApi::Flux2::Client.new
19
+
20
+ task = client.text_to_image.create(
21
+ model: "flux-2-pro-text-to-image",
22
+ prompt: "A cinematic product photo on warm paper",
23
+ aspect_ratio: "1:1"
24
+ )
25
+ status = client.text_to_image.get(task.id)
26
+
27
+ remix = client.remix_image.create(
28
+ model: "flux-2-pro-remix-image",
29
+ prompt: "Turn this product shot into a warm editorial photo",
30
+ source_image_urls: ["https://example.com/source.jpg"],
31
+ aspect_ratio: "auto"
32
+ )
33
+ ```
34
+
35
+ Use `create` when you want to submit a task and return quickly, `get` when you need the latest task state, and `run` when a script should create and poll until completion. In web request handlers, prefer `create` plus webhook or later `get` polling so a worker is not held open.
36
+
37
+ RunAPI-generated file URLs are temporary. Download and store generated images, videos, audio, or other files in your own durable storage within 7 days; do not treat returned URLs as long-term assets.
38
+
39
+ ## Language notes
40
+
41
+ Use Ruby keyword arguments and the `RunApi::Flux2` error classes when building image jobs, Rails workers, or scripts. The available resources include `text_to_image` and `remix_image`. Keep `RUNAPI_API_KEY` in the environment or your secret manager; never commit API keys or callback secrets.
42
+
43
+ ## Links
44
+
45
+ - Model page: https://runapi.ai/models/flux-2
46
+ - SDK docs: https://runapi.ai/docs#sdk-flux-2
47
+ - Product docs: https://runapi.ai/docs#flux-2
48
+ - Pricing and rate limits: https://runapi.ai/models/flux-2/pro-text-to-image
49
+ - Provider comparison: https://runapi.ai/providers/black-forest-labs
50
+ - Full catalog: https://runapi.ai/models
51
+ - Repository: https://github.com/runapi-ai/flux-2-sdk
52
+
53
+ ## License
54
+
55
+ Licensed under the Apache License, Version 2.0.
@@ -2,23 +2,26 @@
2
2
 
3
3
  module RunApi
4
4
  module Flux2
5
- # Flux 2 text-to-image API client.
5
+ # Flux 2 text-to-image and remix API client.
6
+ #
7
+ # Pro and flex tiers for both text-to-image generation and
8
+ # text-guided image remixing.
6
9
  #
7
10
  # @example
8
11
  # client = RunApi::Flux2::Client.new(api_key: "your-api-key")
9
12
  # result = client.text_to_image.run(
10
13
  # model: "flux-2-pro-text-to-image", prompt: "A futuristic cityscape"
11
14
  # )
12
- class Client
13
- # @return [Resources::TextToImage] Text-to-image operations.
15
+ class Client < RunApi::Core::Client
16
+ # @return [Resources::TextToImage] Text-to-image generation operations.
14
17
  attr_reader :text_to_image
18
+ # @return [Resources::RemixImage] Image remix operations with text-guided transformations.
19
+ attr_reader :remix_image
15
20
 
16
21
  def initialize(api_key: nil, **options)
17
- @api_key = Core::Auth.resolve_api_key(api_key)
18
-
19
- client_options = Core::ClientOptions.new(api_key: @api_key, **options)
20
- http = client_options.http_client || Core::HttpClient.new(client_options)
22
+ super
21
23
  @text_to_image = Resources::TextToImage.new(http)
24
+ @remix_image = Resources::RemixImage.new(http)
22
25
  end
23
26
  end
24
27
  end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RunApi
4
+ module Flux2
5
+ module Resources
6
+ # Flux 2 image remix resource.
7
+ # Transform source images guided by a text prompt.
8
+ class RemixImage
9
+ include RunApi::Core::ResourceHelpers
10
+
11
+ ENDPOINT = "/api/v1/flux_2/remix_image"
12
+
13
+ RESPONSE_CLASS = Types::RemixImageResponse
14
+ COMPLETED_RESPONSE_CLASS = Types::CompletedRemixImageResponse
15
+
16
+ def initialize(http)
17
+ @http = http
18
+ end
19
+
20
+ def run(**params)
21
+ task = create(**params)
22
+ poll_until_complete { get(task.id) }
23
+ end
24
+
25
+ def create(**params)
26
+ params = compact_params(params)
27
+ validate_params!(params)
28
+ request(:post, ENDPOINT, body: params)
29
+ end
30
+
31
+ def get(id)
32
+ request(:get, "#{ENDPOINT}/#{id}")
33
+ end
34
+
35
+ private
36
+
37
+ def validate_params!(params)
38
+ model = param(params, :model)
39
+ raise Core::ValidationError, "model is required" unless model
40
+ unless Types::REMIX_MODELS.include?(model)
41
+ raise Core::ValidationError, "Invalid model: #{model}. Must be one of: #{Types::REMIX_MODELS.join(", ")}"
42
+ end
43
+
44
+ prompt = param(params, :prompt)
45
+ raise Core::ValidationError, "prompt is required" unless prompt
46
+
47
+ validate_optional!(params, :aspect_ratio, Types::REMIX_ASPECT_RATIOS)
48
+ validate_optional!(params, :output_resolution, Types::OUTPUT_RESOLUTIONS)
49
+ validate_source_image_urls!(params)
50
+ end
51
+
52
+ def validate_source_image_urls!(params)
53
+ urls = param(params, :source_image_urls)
54
+ raise Core::ValidationError, "source_image_urls is required" if urls.nil? || (urls.respond_to?(:empty?) && urls.empty?)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -51,30 +51,12 @@ module RunApi
51
51
  raise Core::ValidationError, "prompt is required" unless param(params, :prompt)
52
52
 
53
53
  model = param(params, :model)
54
- unless Types::MODELS.include?(model)
55
- raise Core::ValidationError, "Invalid model: #{model}. Must be one of: #{Types::MODELS.join(", ")}"
54
+ unless Types::TEXT_TO_IMAGE_MODELS.include?(model)
55
+ raise Core::ValidationError, "Invalid model: #{model}. Must be one of: #{Types::TEXT_TO_IMAGE_MODELS.join(", ")}"
56
56
  end
57
57
 
58
- validate_aspect_ratio!(params, model)
59
- validate_optional!(params, :resolution, Types::RESOLUTIONS)
60
- validate_input_urls!(params, model)
61
- end
62
-
63
- def validate_aspect_ratio!(params, model)
64
- return unless param(params, :aspect_ratio)
65
-
66
- allowed = Types::I2I_MODELS.include?(model) ? Types::ASPECT_RATIOS_I2I : Types::ASPECT_RATIOS
67
- value = param(params, :aspect_ratio)
68
- unless allowed.include?(value)
69
- raise Core::ValidationError, "Invalid aspect_ratio: #{value}. Must be one of: #{allowed.join(", ")}"
70
- end
71
- end
72
-
73
- def validate_input_urls!(params, model)
74
- return unless Types::I2I_MODELS.include?(model)
75
-
76
- urls = param(params, :input_urls)
77
- raise Core::ValidationError, "input_urls is required for image-to-image models" if urls.nil? || (urls.respond_to?(:empty?) && urls.empty?)
58
+ validate_optional!(params, :aspect_ratio, Types::ASPECT_RATIOS)
59
+ validate_optional!(params, :output_resolution, Types::OUTPUT_RESOLUTIONS)
78
60
  end
79
61
  end
80
62
  end
@@ -2,25 +2,31 @@
2
2
 
3
3
  module RunApi
4
4
  module Flux2
5
+ # Type definitions and constants for Flux 2.
6
+ # Each operation has pro (higher fidelity) and flex (faster, lower cost) tiers.
5
7
  module Types
6
8
  MODELS = %w[
7
- flux-2-pro-text-to-image flux-2-pro-image-to-image
8
- flux-2-flex-text-to-image flux-2-flex-image-to-image
9
+ flux-2-pro-text-to-image flux-2-pro-remix-image
10
+ flux-2-flex-text-to-image flux-2-flex-remix-image
9
11
  ].freeze
10
- I2I_MODELS = %w[flux-2-pro-image-to-image flux-2-flex-image-to-image].freeze
12
+ TEXT_TO_IMAGE_MODELS = %w[flux-2-pro-text-to-image flux-2-flex-text-to-image].freeze
13
+ REMIX_MODELS = %w[flux-2-pro-remix-image flux-2-flex-remix-image].freeze
11
14
 
12
15
  ASPECT_RATIOS = %w[1:1 4:3 3:4 16:9 9:16 3:2 2:3].freeze
13
- ASPECT_RATIOS_I2I = %w[1:1 4:3 3:4 16:9 9:16 3:2 2:3 auto].freeze
14
- RESOLUTIONS = %w[1K 2K].freeze
16
+ # Remix adds 'auto' to preserve the source image aspect ratio.
17
+ REMIX_ASPECT_RATIOS = %w[1:1 4:3 3:4 16:9 9:16 3:2 2:3 auto].freeze
18
+ OUTPUT_RESOLUTIONS = %w[1k 2k].freeze
15
19
 
20
+ # A single generated image with its CDN URL.
16
21
  class Image < RunApi::Core::BaseModel
17
22
  optional :url, String
18
23
  end
19
24
 
25
+ # Generation result. +images+ is populated once +status+ is +"completed"+.
20
26
  class TextToImageResponse < RunApi::Core::TaskResponse
21
27
  required :id, String
22
28
  optional :status, String, enum: -> { RunApi::Core::TaskResponse::Status::ALL }
23
- optional :images, [ -> { Image } ]
29
+ optional :images, [-> { Image }]
24
30
  optional :error, String
25
31
  end
26
32
 
@@ -28,7 +34,15 @@ module RunApi
28
34
  # `status: "completed"`. `images` is required so consumers never have to
29
35
  # null-check it on a successful task.
30
36
  class CompletedTextToImageResponse < TextToImageResponse
31
- required :images, [ -> { Image } ]
37
+ required :images, [-> { Image }]
38
+ end
39
+
40
+ # Remix response -- same shape as generation.
41
+ class RemixImageResponse < TextToImageResponse
42
+ end
43
+
44
+ # Narrowed remix response from +run()+ where +images+ is guaranteed present.
45
+ class CompletedRemixImageResponse < CompletedTextToImageResponse
32
46
  end
33
47
  end
34
48
  end
data/lib/runapi/flux_2.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require "runapi/core"
4
4
  require_relative "flux_2/types"
5
5
  require_relative "flux_2/resources/text_to_image"
6
+ require_relative "flux_2/resources/remix_image"
6
7
  require_relative "flux_2/client"
7
8
 
8
9
  module RunApi
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: runapi-flux-2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - RunAPI
@@ -15,25 +15,31 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: 0.2.4
18
+ version: 0.2.6
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: 0.2.4
26
- description: RunAPI Flux 2 SDK for JavaScript, Ruby, and Go
25
+ version: 0.2.6
26
+ description: The flux api Ruby SDK is the language-specific package for Flux 2 on
27
+ RunAPI. Use this flux api package for text-to-image, remix-image, and creative production
28
+ flows when your application needs JSON request bodies, task status lookup, and consistent
29
+ RunAPI errors in Ruby.
27
30
  email:
28
31
  - contact@runapi.ai
29
32
  executables: []
30
33
  extensions: []
31
- extra_rdoc_files: []
34
+ extra_rdoc_files:
35
+ - README.md
32
36
  files:
33
37
  - LICENSE
38
+ - README.md
34
39
  - lib/runapi-flux_2.rb
35
40
  - lib/runapi/flux_2.rb
36
41
  - lib/runapi/flux_2/client.rb
42
+ - lib/runapi/flux_2/resources/remix_image.rb
37
43
  - lib/runapi/flux_2/resources/text_to_image.rb
38
44
  - lib/runapi/flux_2/types.rb
39
45
  homepage: https://runapi.ai/models/flux-2
@@ -41,7 +47,7 @@ licenses:
41
47
  - Apache-2.0
42
48
  metadata:
43
49
  homepage_uri: https://runapi.ai/models/flux-2
44
- documentation_uri: https://github.com/runapi-ai/flux-2-sdk/blob/main/README.md
50
+ documentation_uri: https://github.com/runapi-ai/flux-2-sdk/blob/main/ruby/README.md
45
51
  source_code_uri: https://github.com/runapi-ai/flux-2-sdk
46
52
  changelog_uri: https://github.com/runapi-ai/flux-2-sdk/blob/main/CHANGELOG.md
47
53
  rdoc_options: []
@@ -60,5 +66,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
66
  requirements: []
61
67
  rubygems_version: 4.0.10
62
68
  specification_version: 4
63
- summary: Flux 2 API SDKs for JavaScript, Ruby, and Go on RunAPI.
69
+ summary: Flux API Ruby SDK for RunAPI
64
70
  test_files: []