stability_sdk 0.2.10 → 0.2.12
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 +4 -4
- data/README.md +61 -0
- data/Rakefile +5 -0
- data/exe/stability-client +19 -14
- data/exe/stability-dashboard-client-unstable +40 -0
- data/lib/dashboard_pb.rb +182 -0
- data/lib/dashboard_services_pb.rb +41 -0
- data/lib/generation_pb.rb +94 -16
- data/lib/generation_services_pb.rb +3 -0
- data/lib/stability_sdk/cli.rb +5 -0
- data/lib/stability_sdk/client.rb +85 -20
- data/lib/stability_sdk/unstable/dashboard_client.rb +31 -0
- data/lib/stability_sdk/version.rb +1 -1
- data/lib/stability_sdk.rb +1 -0
- data/stability_sdk.gemspec +1 -0
- metadata +22 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d5aac33cb8d504aab26b515dc2fa6bd9d76c70829a0aa706eabc6be39043b143
|
4
|
+
data.tar.gz: ca6a3cd1cd24763a9f9427132a4e8fde4c688d9bc9d3409ef921139fa62fa232
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95b76f6caf8e5a32af792cc0d284f81b76c7e38c682b24a5fc91204b3373096a47a98ab1ee6f0e32cbbd2039ad6b57c920c262661cda221c54eac529bd54e51a
|
7
|
+
data.tar.gz: f196c8b879b36e69c84d40c2528fd9fbf7f07e1ae6eec9c4a996a66a8a73841ea50d73d8ca941b7813ca9d5fbada94140143619bdb841de4ce9f71316af1303e
|
data/README.md
CHANGED
@@ -61,9 +61,25 @@ Options:
|
|
61
61
|
-m, --mask_image=VAL path to mask image
|
62
62
|
--start_schedule=VAL start schedule for init image (must be greater than 0, 1 is full strength text prompt, no trace of image). default 1.0
|
63
63
|
--end_schedule=VAL end schedule for init image. default 0.01
|
64
|
+
--guidance_preset=VAL Guidance preset to use. See generation.GuidancePreset for supported values. default `GUIDANCE_PRESET_NONE`
|
65
|
+
--guidance_cuts=VAL Number of cuts to use for guidance. default 0
|
66
|
+
--guidance_strength=VAL Strength of the guidance. We recommend values in range [0.0,1.0]. A good default is 0.25. default nil
|
67
|
+
--guidance_prompt=VAL Prompt to use for guidance, defaults to `YOUR_PROMPT_TEXT` argument (above) if not specified.
|
68
|
+
--guidance_models=VAL Models to use for guidance. default nil
|
64
69
|
-v, --verbose
|
65
70
|
```
|
66
71
|
|
72
|
+
#### CLIP guidance
|
73
|
+
|
74
|
+
By specifying `--guidance_preset` and other `--guidance_*` options, you can use CLIP guidance, which is enabled by default on DreamStudio's web interface.
|
75
|
+
See also [this notebook](https://github.com/Stability-AI/stability-sdk/blob/c04381f960008f37c7392467cfaabfdf8f763e6a/nbs/demo_colab.ipynb) for more details.
|
76
|
+
|
77
|
+
```sh
|
78
|
+
# example
|
79
|
+
# [note] --steps=35 is recommended. which is also the default value of the web interface
|
80
|
+
STABILITY_SDK_API_KEY=xxx stability-client --guidance_preset=GUIDANCE_PRESET_FAST_BLUE --guidance_strength=0.25 --steps=35 --sampler=k_dpm_2_ancestral "A dream of a distant galaxy, by Caspar David Friedrich, matte painting trending on artstation HQ"
|
81
|
+
```
|
82
|
+
|
67
83
|
### SDK usage
|
68
84
|
|
69
85
|
This sample code saves a generated image as `result.png`.
|
@@ -91,12 +107,57 @@ client.generate(prompt, options) do |answer|
|
|
91
107
|
end
|
92
108
|
```
|
93
109
|
|
110
|
+
### [Unstable] Dashboard API
|
111
|
+
|
112
|
+
**This feature is in a very early stage of development.**
|
113
|
+
|
114
|
+
Dashboard API is a way to interact with DreamStudio Web UIs, such as getting user info, payment info, etc.
|
115
|
+
|
116
|
+
Currently, there is no canonical way to get the API key for the Dashboard API. You can retrieve the key by logging in to the [DreamStudio Web page](https://beta.dreamstudio.ai/dream) and inspect request the authorization header with Chrome Developer Tool. Please be aware that how to refresh the key or an expiration period is unknown. See also https://github.com/Stability-AI/stability-sdk/issues/23
|
117
|
+
|
118
|
+
```sh
|
119
|
+
# get user info
|
120
|
+
STABILITY_SDK_DASHBOARD_API_KEY=YOUR_API_KEY stability-dashboard-client-unstable get_me
|
121
|
+
|
122
|
+
# get organization info
|
123
|
+
STABILITY_SDK_DASHBOARD_API_KEY=YOUR_API_KEY stability-dashboard-client-unstable get_organization
|
124
|
+
|
125
|
+
# i.e, get remaining balance
|
126
|
+
STABILITY_SDK_DASHBOARD_API_KEY=YOUR_API_KEY stability-dashboard-client-unstable get_organization | jq .paymentInfo.balance
|
127
|
+
```
|
128
|
+
|
94
129
|
## Development
|
95
130
|
|
96
131
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
97
132
|
|
98
133
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
99
134
|
|
135
|
+
### update submodule to try a new feature on Stability-AI/api-interfaces
|
136
|
+
|
137
|
+
- update submodule
|
138
|
+
|
139
|
+
```sh
|
140
|
+
git submodule update --init # if you haven't fetched the content of the submodule yet
|
141
|
+
cd api-interfaces
|
142
|
+
|
143
|
+
# checkout some branch/commit you need
|
144
|
+
git fetch
|
145
|
+
git reset --hard origin/some_branch
|
146
|
+
|
147
|
+
cd ..
|
148
|
+
```
|
149
|
+
|
150
|
+
- build
|
151
|
+
|
152
|
+
```sh
|
153
|
+
bundle exec rake protoc
|
154
|
+
|
155
|
+
git diff
|
156
|
+
# now you may be able to confirm that the diff is created in lib/generation_pb.rb
|
157
|
+
```
|
158
|
+
|
159
|
+
- modify the `lib/stability_sdk/client.rb` to try some new features
|
160
|
+
|
100
161
|
## Contributing
|
101
162
|
|
102
163
|
Bug reports and pull requests are welcome on GitHub at https://github.com/cou929/stability-sdk-ruby.
|
data/Rakefile
CHANGED
@@ -13,3 +13,8 @@ desc "Parse proto file and generate output"
|
|
13
13
|
task :protoc do
|
14
14
|
sh "grpc_tools_ruby_protoc -I api-interfaces/src/proto/ --ruby_out=lib --grpc_out=lib api-interfaces/src/proto/generation.proto"
|
15
15
|
end
|
16
|
+
|
17
|
+
desc "Compile a dashboard proto file"
|
18
|
+
task :protoc_dashboard do
|
19
|
+
sh "grpc_tools_ruby_protoc -I api-interfaces/src/proto/ --ruby_out=lib --grpc_out=lib api-interfaces/src/proto/dashboard.proto"
|
20
|
+
end
|
data/exe/stability-client
CHANGED
@@ -18,20 +18,25 @@ opt.banner = "Usage: stability-client [options] YOUR_PROMPT_TEXT"
|
|
18
18
|
opt.separator ""
|
19
19
|
opt.separator "Options:"
|
20
20
|
opt.on("--api_key=VAL", "api key of DreamStudio account. You can also specify by a STABILITY_SDK_API_KEY environment variable") {|v| options[:api_key] = v }
|
21
|
-
opt.on("-H", "--height=VAL", "height of image in pixel. default 512") {|v| options[:height] = v }
|
22
|
-
opt.on("-W", "--width=VAL", "width of image in pixel. default 512") {|v| options[:width] = v }
|
23
|
-
opt.on("-C", "--cfg_scale=VAL", "CFG scale factor. default 7.0") {|v| options[:cfg_scale] = v }
|
24
|
-
opt.on("-A", "--sampler=VAL", "ddim, plms, k_euler, k_euler_ancestral, k_heun, k_dpm_2, k_dpm_2_ancestral, k_lms. default k_lms") {|v| options[:sampler] = v }
|
25
|
-
opt.on("-s", "--steps=VAL", "number of steps. default 50") {|v| options[:steps] = v }
|
26
|
-
opt.on("-S", "--seed=VAL", "random seed to use in integer") {|v| options[:seed] = v }
|
27
|
-
opt.on("-p", "--prefix=VAL", "output prefixes for artifacts. default `generation`") {|v| options[:prefix] = v }
|
21
|
+
opt.on("-H", "--height=VAL", Integer, "height of image in pixel. default 512") {|v| options[:height] = v }
|
22
|
+
opt.on("-W", "--width=VAL", Integer, "width of image in pixel. default 512") {|v| options[:width] = v }
|
23
|
+
opt.on("-C", "--cfg_scale=VAL", Float, "CFG scale factor. default 7.0") {|v| options[:cfg_scale] = v }
|
24
|
+
opt.on("-A", "--sampler=VAL", String, "ddim, plms, k_euler, k_euler_ancestral, k_heun, k_dpm_2, k_dpm_2_ancestral, k_lms. default k_lms") {|v| options[:sampler] = v }
|
25
|
+
opt.on("-s", "--steps=VAL", Integer, "number of steps. default 50") {|v| options[:steps] = v }
|
26
|
+
opt.on("-S", "--seed=VAL", Integer, "random seed to use in integer") {|v| options[:seed] = v }
|
27
|
+
opt.on("-p", "--prefix=VAL", String, "output prefixes for artifacts. default `generation`") {|v| options[:prefix] = v }
|
28
28
|
opt.on("--no-store", "do not write out artifacts") {|v| options[:no_store] = v }
|
29
|
-
opt.on("-n", "--num_samples=VAL", "number of samples to generate") {|v| options[:num_samples] = v }
|
30
|
-
opt.on("-e", "--engine=VAL", "engine to use for inference. default `stable-diffusion-v1`") {|v| options[:engine_id] = v }
|
31
|
-
opt.on("-i", "--init_image=VAL", "path to init image") {|v| options[:init_image] = v }
|
32
|
-
opt.on("-m", "--mask_image=VAL", "path to mask image") {|v| options[:mask_image] = v }
|
33
|
-
opt.on("--start_schedule=VAL", "start schedule for init image (must be greater than 0, 1 is full strength text prompt, no trace of image). default 1.0") {|v| options[:start_schedule] = v }
|
34
|
-
opt.on("--end_schedule=VAL", "end schedule for init image. default 0.01") {|v| options[:end_schedule] = v }
|
29
|
+
opt.on("-n", "--num_samples=VAL", Integer, "number of samples to generate. default 1") {|v| options[:num_samples] = v }
|
30
|
+
opt.on("-e", "--engine=VAL", String, "engine to use for inference. default `stable-diffusion-v1-5`") {|v| options[:engine_id] = v }
|
31
|
+
opt.on("-i", "--init_image=VAL", String, "path to init image") {|v| options[:init_image] = v }
|
32
|
+
opt.on("-m", "--mask_image=VAL", String, "path to mask image") {|v| options[:mask_image] = v }
|
33
|
+
opt.on("--start_schedule=VAL", Float, "start schedule for init image (must be greater than 0, 1 is full strength text prompt, no trace of image). default 1.0") {|v| options[:start_schedule] = v }
|
34
|
+
opt.on("--end_schedule=VAL", Float, "end schedule for init image. default 0.01") {|v| options[:end_schedule] = v }
|
35
|
+
opt.on("--guidance_preset=VAL", String,"Guidance preset to use. See generation.GuidancePreset for supported values. default `GUIDANCE_PRESET_NONE`") {|v| options[:guidance_preset] = v }
|
36
|
+
opt.on("--guidance_cuts=VAL", Integer, "Number of cuts to use for guidance. default 0") {|v| options[:guidance_cuts] = v }
|
37
|
+
opt.on("--guidance_strength=VAL", Float, "Strength of the guidance. We recommend values in range [0.0,1.0]. A good default is 0.25. default nil") {|v| options[:guidance_strength] = v }
|
38
|
+
opt.on("--guidance_prompt=VAL", String, "Prompt to use for guidance, defaults to `YOUR_PROMPT_TEXT` argument (above) if not specified.") {|v| options[:guidance_prompt] = v }
|
39
|
+
opt.on("--guidance_models=VAL", Array, "Models to use for guidance. default nil") {|v| options[:guidance_models] = v }
|
35
40
|
opt.on("-v", "--verbose") { logger.level = Logger::DEBUG }
|
36
41
|
opt.parse!(ARGV)
|
37
42
|
|
@@ -48,7 +53,7 @@ if options.has_key?(:init_image)
|
|
48
53
|
raise StabilitySDK::InvalidParameter, "width and height of init_image must be a multiple of 64" if size[0] % 64 != 0 || size[1] % 64 != 0
|
49
54
|
end
|
50
55
|
|
51
|
-
client = StabilitySDK::Client.new(api_key: options[:api_key])
|
56
|
+
client = StabilitySDK::Client.new(api_key: options[:api_key], logger: logger)
|
52
57
|
|
53
58
|
client.generate(prompt, options) do |answer|
|
54
59
|
StabilitySDK::CLI.save_answer(answer, options, logger)
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "thor"
|
4
|
+
require "logger"
|
5
|
+
require "stability_sdk"
|
6
|
+
|
7
|
+
logger = Logger.new(STDOUT)
|
8
|
+
logger.level = Logger::WARN
|
9
|
+
|
10
|
+
Version = StabilitySDK::VERSION
|
11
|
+
|
12
|
+
class CLI < Thor
|
13
|
+
class_option :api_key
|
14
|
+
|
15
|
+
desc "get_me", "get user info"
|
16
|
+
def get_me
|
17
|
+
client = self.client(options)
|
18
|
+
res = client.get_me
|
19
|
+
puts res.to_json
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "get_organization", "get organization info"
|
23
|
+
def get_organization
|
24
|
+
client = self.client(options)
|
25
|
+
res = client.get_organization
|
26
|
+
puts res.to_json
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def client(options)
|
32
|
+
api_key = options[:api_key]
|
33
|
+
api_key = ENV["STABILITY_SDK_DASHBOARD_API_KEY"] if ENV["STABILITY_SDK_DASHBOARD_API_KEY"]
|
34
|
+
raise StabilitySDK::InsufficientParameter, "api key is required" if api_key.nil?
|
35
|
+
|
36
|
+
return StabilitySDK::Unstable::DashboardClient.new(api_key: api_key)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
CLI.start(ARGV)
|
data/lib/dashboard_pb.rb
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: dashboard.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
|
+
add_file("dashboard.proto", :syntax => :proto3) do
|
8
|
+
add_message "gooseai.OrganizationMember" do
|
9
|
+
optional :organization, :message, 1, "gooseai.Organization"
|
10
|
+
proto3_optional :user, :message, 2, "gooseai.User"
|
11
|
+
optional :role, :enum, 3, "gooseai.OrganizationRole"
|
12
|
+
optional :is_default, :bool, 4
|
13
|
+
end
|
14
|
+
add_message "gooseai.OrganizationGrant" do
|
15
|
+
optional :amount_granted, :double, 1
|
16
|
+
optional :amount_used, :double, 2
|
17
|
+
optional :expires_at, :uint64, 3
|
18
|
+
optional :granted_at, :uint64, 4
|
19
|
+
end
|
20
|
+
add_message "gooseai.OrganizationPaymentInfo" do
|
21
|
+
optional :balance, :double, 1
|
22
|
+
repeated :grants, :message, 2, "gooseai.OrganizationGrant"
|
23
|
+
end
|
24
|
+
add_message "gooseai.OrganizationAutoCharge" do
|
25
|
+
optional :enabled, :bool, 1
|
26
|
+
optional :id, :string, 2
|
27
|
+
optional :created_at, :uint64, 3
|
28
|
+
end
|
29
|
+
add_message "gooseai.Organization" do
|
30
|
+
optional :id, :string, 1
|
31
|
+
optional :name, :string, 2
|
32
|
+
optional :description, :string, 3
|
33
|
+
repeated :members, :message, 4, "gooseai.OrganizationMember"
|
34
|
+
proto3_optional :payment_info, :message, 5, "gooseai.OrganizationPaymentInfo"
|
35
|
+
proto3_optional :stripe_customer_id, :string, 6
|
36
|
+
proto3_optional :auto_charge, :message, 7, "gooseai.OrganizationAutoCharge"
|
37
|
+
end
|
38
|
+
add_message "gooseai.APIKey" do
|
39
|
+
optional :key, :string, 1
|
40
|
+
optional :is_secret, :bool, 2
|
41
|
+
optional :created_at, :uint64, 3
|
42
|
+
end
|
43
|
+
add_message "gooseai.User" do
|
44
|
+
optional :id, :string, 1
|
45
|
+
proto3_optional :auth_id, :string, 2
|
46
|
+
optional :profile_picture, :string, 3
|
47
|
+
optional :email, :string, 4
|
48
|
+
repeated :organizations, :message, 5, "gooseai.OrganizationMember"
|
49
|
+
repeated :api_keys, :message, 7, "gooseai.APIKey"
|
50
|
+
optional :created_at, :uint64, 8
|
51
|
+
proto3_optional :email_verified, :bool, 9
|
52
|
+
end
|
53
|
+
add_message "gooseai.CostData" do
|
54
|
+
optional :amount_tokens, :uint32, 1
|
55
|
+
optional :amount_credits, :double, 2
|
56
|
+
end
|
57
|
+
add_message "gooseai.UsageMetric" do
|
58
|
+
optional :operation, :string, 1
|
59
|
+
optional :engine, :string, 2
|
60
|
+
optional :input_cost, :message, 3, "gooseai.CostData"
|
61
|
+
optional :output_cost, :message, 4, "gooseai.CostData"
|
62
|
+
proto3_optional :user, :string, 5
|
63
|
+
optional :aggregation_timestamp, :uint64, 6
|
64
|
+
end
|
65
|
+
add_message "gooseai.CostTotal" do
|
66
|
+
optional :amount_tokens, :uint32, 1
|
67
|
+
optional :amount_credits, :double, 2
|
68
|
+
end
|
69
|
+
add_message "gooseai.TotalMetricsData" do
|
70
|
+
optional :input_total, :message, 1, "gooseai.CostTotal"
|
71
|
+
optional :output_total, :message, 2, "gooseai.CostTotal"
|
72
|
+
end
|
73
|
+
add_message "gooseai.Metrics" do
|
74
|
+
repeated :metrics, :message, 1, "gooseai.UsageMetric"
|
75
|
+
optional :total, :message, 2, "gooseai.TotalMetricsData"
|
76
|
+
end
|
77
|
+
add_message "gooseai.EmptyRequest" do
|
78
|
+
end
|
79
|
+
add_message "gooseai.GetOrganizationRequest" do
|
80
|
+
optional :id, :string, 1
|
81
|
+
end
|
82
|
+
add_message "gooseai.GetMetricsRequest" do
|
83
|
+
optional :organization_id, :string, 1
|
84
|
+
proto3_optional :user_id, :string, 2
|
85
|
+
optional :range_from, :uint64, 3
|
86
|
+
optional :range_to, :uint64, 4
|
87
|
+
optional :include_per_request_metrics, :bool, 5
|
88
|
+
end
|
89
|
+
add_message "gooseai.APIKeyRequest" do
|
90
|
+
optional :is_secret, :bool, 1
|
91
|
+
end
|
92
|
+
add_message "gooseai.APIKeyFindRequest" do
|
93
|
+
optional :id, :string, 1
|
94
|
+
end
|
95
|
+
add_message "gooseai.UpdateDefaultOrganizationRequest" do
|
96
|
+
optional :organization_id, :string, 1
|
97
|
+
end
|
98
|
+
add_message "gooseai.ClientSettings" do
|
99
|
+
optional :settings, :bytes, 1
|
100
|
+
end
|
101
|
+
add_message "gooseai.CreateAutoChargeIntentRequest" do
|
102
|
+
optional :organization_id, :string, 1
|
103
|
+
optional :monthly_maximum, :uint64, 2
|
104
|
+
optional :minimum_value, :uint64, 3
|
105
|
+
optional :amount_credits, :uint64, 4
|
106
|
+
end
|
107
|
+
add_message "gooseai.CreateChargeRequest" do
|
108
|
+
optional :amount, :uint64, 1
|
109
|
+
optional :organization_id, :string, 2
|
110
|
+
end
|
111
|
+
add_message "gooseai.GetChargesRequest" do
|
112
|
+
optional :organization_id, :string, 1
|
113
|
+
optional :range_from, :uint64, 2
|
114
|
+
optional :range_to, :uint64, 3
|
115
|
+
end
|
116
|
+
add_message "gooseai.Charge" do
|
117
|
+
optional :id, :string, 1
|
118
|
+
optional :paid, :bool, 2
|
119
|
+
optional :receipt_link, :string, 3
|
120
|
+
optional :payment_link, :string, 4
|
121
|
+
optional :created_at, :uint64, 5
|
122
|
+
optional :amount_credits, :uint64, 6
|
123
|
+
end
|
124
|
+
add_message "gooseai.Charges" do
|
125
|
+
repeated :charges, :message, 1, "gooseai.Charge"
|
126
|
+
end
|
127
|
+
add_message "gooseai.GetAutoChargeRequest" do
|
128
|
+
optional :organization_id, :string, 1
|
129
|
+
end
|
130
|
+
add_message "gooseai.AutoChargeIntent" do
|
131
|
+
optional :id, :string, 1
|
132
|
+
optional :payment_link, :string, 2
|
133
|
+
optional :created_at, :uint64, 3
|
134
|
+
optional :monthly_maximum, :uint64, 4
|
135
|
+
optional :minimum_value, :uint64, 5
|
136
|
+
optional :amount_credits, :uint64, 6
|
137
|
+
end
|
138
|
+
add_message "gooseai.UpdateUserInfoRequest" do
|
139
|
+
proto3_optional :email, :string, 1
|
140
|
+
end
|
141
|
+
add_message "gooseai.UserPasswordChangeTicket" do
|
142
|
+
optional :ticket, :string, 1
|
143
|
+
end
|
144
|
+
add_enum "gooseai.OrganizationRole" do
|
145
|
+
value :MEMBER, 0
|
146
|
+
value :ACCOUNTANT, 1
|
147
|
+
value :OWNER, 2
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
module Gooseai
|
153
|
+
OrganizationMember = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.OrganizationMember").msgclass
|
154
|
+
OrganizationGrant = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.OrganizationGrant").msgclass
|
155
|
+
OrganizationPaymentInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.OrganizationPaymentInfo").msgclass
|
156
|
+
OrganizationAutoCharge = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.OrganizationAutoCharge").msgclass
|
157
|
+
Organization = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Organization").msgclass
|
158
|
+
APIKey = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.APIKey").msgclass
|
159
|
+
User = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.User").msgclass
|
160
|
+
CostData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.CostData").msgclass
|
161
|
+
UsageMetric = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.UsageMetric").msgclass
|
162
|
+
CostTotal = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.CostTotal").msgclass
|
163
|
+
TotalMetricsData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.TotalMetricsData").msgclass
|
164
|
+
Metrics = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Metrics").msgclass
|
165
|
+
EmptyRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.EmptyRequest").msgclass
|
166
|
+
GetOrganizationRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.GetOrganizationRequest").msgclass
|
167
|
+
GetMetricsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.GetMetricsRequest").msgclass
|
168
|
+
APIKeyRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.APIKeyRequest").msgclass
|
169
|
+
APIKeyFindRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.APIKeyFindRequest").msgclass
|
170
|
+
UpdateDefaultOrganizationRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.UpdateDefaultOrganizationRequest").msgclass
|
171
|
+
ClientSettings = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ClientSettings").msgclass
|
172
|
+
CreateAutoChargeIntentRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.CreateAutoChargeIntentRequest").msgclass
|
173
|
+
CreateChargeRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.CreateChargeRequest").msgclass
|
174
|
+
GetChargesRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.GetChargesRequest").msgclass
|
175
|
+
Charge = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Charge").msgclass
|
176
|
+
Charges = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Charges").msgclass
|
177
|
+
GetAutoChargeRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.GetAutoChargeRequest").msgclass
|
178
|
+
AutoChargeIntent = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.AutoChargeIntent").msgclass
|
179
|
+
UpdateUserInfoRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.UpdateUserInfoRequest").msgclass
|
180
|
+
UserPasswordChangeTicket = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.UserPasswordChangeTicket").msgclass
|
181
|
+
OrganizationRole = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.OrganizationRole").enummodule
|
182
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# Source: dashboard.proto for package 'gooseai'
|
3
|
+
|
4
|
+
require 'grpc'
|
5
|
+
require 'dashboard_pb'
|
6
|
+
|
7
|
+
module Gooseai
|
8
|
+
module DashboardService
|
9
|
+
class Service
|
10
|
+
|
11
|
+
include ::GRPC::GenericService
|
12
|
+
|
13
|
+
self.marshal_class_method = :encode
|
14
|
+
self.unmarshal_class_method = :decode
|
15
|
+
self.service_name = 'gooseai.DashboardService'
|
16
|
+
|
17
|
+
# Get info
|
18
|
+
rpc :GetMe, ::Gooseai::EmptyRequest, ::Gooseai::User
|
19
|
+
rpc :GetOrganization, ::Gooseai::GetOrganizationRequest, ::Gooseai::Organization
|
20
|
+
rpc :GetMetrics, ::Gooseai::GetMetricsRequest, ::Gooseai::Metrics
|
21
|
+
# API key management
|
22
|
+
rpc :CreateAPIKey, ::Gooseai::APIKeyRequest, ::Gooseai::APIKey
|
23
|
+
rpc :DeleteAPIKey, ::Gooseai::APIKeyFindRequest, ::Gooseai::APIKey
|
24
|
+
# User settings
|
25
|
+
rpc :UpdateDefaultOrganization, ::Gooseai::UpdateDefaultOrganizationRequest, ::Gooseai::User
|
26
|
+
rpc :GetClientSettings, ::Gooseai::EmptyRequest, ::Gooseai::ClientSettings
|
27
|
+
rpc :SetClientSettings, ::Gooseai::ClientSettings, ::Gooseai::ClientSettings
|
28
|
+
rpc :UpdateUserInfo, ::Gooseai::UpdateUserInfoRequest, ::Gooseai::User
|
29
|
+
rpc :CreatePasswordChangeTicket, ::Gooseai::EmptyRequest, ::Gooseai::UserPasswordChangeTicket
|
30
|
+
rpc :DeleteAccount, ::Gooseai::EmptyRequest, ::Gooseai::User
|
31
|
+
# Payment functions
|
32
|
+
rpc :CreateCharge, ::Gooseai::CreateChargeRequest, ::Gooseai::Charge
|
33
|
+
rpc :GetCharges, ::Gooseai::GetChargesRequest, ::Gooseai::Charges
|
34
|
+
rpc :CreateAutoChargeIntent, ::Gooseai::CreateAutoChargeIntentRequest, ::Gooseai::AutoChargeIntent
|
35
|
+
rpc :UpdateAutoChargeIntent, ::Gooseai::CreateAutoChargeIntentRequest, ::Gooseai::AutoChargeIntent
|
36
|
+
rpc :GetAutoChargeIntent, ::Gooseai::GetAutoChargeRequest, ::Gooseai::AutoChargeIntent
|
37
|
+
end
|
38
|
+
|
39
|
+
Stub = Service.rpc_stub_class
|
40
|
+
end
|
41
|
+
end
|
data/lib/generation_pb.rb
CHANGED
@@ -21,6 +21,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
21
21
|
optional :index, :uint32, 8
|
22
22
|
optional :finish_reason, :enum, 9, "gooseai.FinishReason"
|
23
23
|
optional :seed, :uint32, 10
|
24
|
+
optional :uuid, :string, 12
|
25
|
+
optional :size, :uint64, 13
|
24
26
|
oneof :data do
|
25
27
|
optional :binary, :bytes, 5
|
26
28
|
optional :text, :string, 6
|
@@ -40,20 +42,6 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
40
42
|
optional :artifact, :message, 4, "gooseai.Artifact"
|
41
43
|
end
|
42
44
|
end
|
43
|
-
add_message "gooseai.AnswerMeta" do
|
44
|
-
proto3_optional :gpu_id, :string, 1
|
45
|
-
proto3_optional :cpu_id, :string, 2
|
46
|
-
proto3_optional :node_id, :string, 3
|
47
|
-
proto3_optional :engine_id, :string, 4
|
48
|
-
end
|
49
|
-
add_message "gooseai.Answer" do
|
50
|
-
optional :answer_id, :string, 1
|
51
|
-
optional :request_id, :string, 2
|
52
|
-
optional :received, :uint64, 3
|
53
|
-
optional :created, :uint64, 4
|
54
|
-
proto3_optional :meta, :message, 6, "gooseai.AnswerMeta"
|
55
|
-
repeated :artifacts, :message, 7, "gooseai.Artifact"
|
56
|
-
end
|
57
45
|
add_message "gooseai.SamplerParameters" do
|
58
46
|
proto3_optional :eta, :float, 1
|
59
47
|
proto3_optional :sampling_steps, :uint64, 2
|
@@ -63,15 +51,48 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
63
51
|
end
|
64
52
|
add_message "gooseai.ConditionerParameters" do
|
65
53
|
proto3_optional :vector_adjust_prior, :string, 1
|
54
|
+
proto3_optional :conditioner, :message, 2, "gooseai.Model"
|
66
55
|
end
|
67
56
|
add_message "gooseai.ScheduleParameters" do
|
68
57
|
proto3_optional :start, :float, 1
|
69
58
|
proto3_optional :end, :float, 2
|
59
|
+
proto3_optional :value, :float, 3
|
70
60
|
end
|
71
61
|
add_message "gooseai.StepParameter" do
|
72
62
|
optional :scaled_step, :float, 1
|
73
63
|
proto3_optional :sampler, :message, 2, "gooseai.SamplerParameters"
|
74
64
|
proto3_optional :schedule, :message, 3, "gooseai.ScheduleParameters"
|
65
|
+
proto3_optional :guidance, :message, 4, "gooseai.GuidanceParameters"
|
66
|
+
end
|
67
|
+
add_message "gooseai.Model" do
|
68
|
+
optional :architecture, :enum, 1, "gooseai.ModelArchitecture"
|
69
|
+
optional :publisher, :string, 2
|
70
|
+
optional :dataset, :string, 3
|
71
|
+
optional :version, :float, 4
|
72
|
+
optional :semantic_version, :string, 5
|
73
|
+
optional :alias, :string, 6
|
74
|
+
end
|
75
|
+
add_message "gooseai.CutoutParameters" do
|
76
|
+
repeated :cutouts, :message, 1, "gooseai.CutoutParameters"
|
77
|
+
proto3_optional :count, :uint32, 2
|
78
|
+
proto3_optional :gray, :float, 3
|
79
|
+
proto3_optional :blur, :float, 4
|
80
|
+
proto3_optional :size_power, :float, 5
|
81
|
+
end
|
82
|
+
add_message "gooseai.GuidanceScheduleParameters" do
|
83
|
+
optional :duration, :float, 1
|
84
|
+
optional :value, :float, 2
|
85
|
+
end
|
86
|
+
add_message "gooseai.GuidanceInstanceParameters" do
|
87
|
+
repeated :models, :message, 2, "gooseai.Model"
|
88
|
+
proto3_optional :guidance_strength, :float, 3
|
89
|
+
repeated :schedule, :message, 4, "gooseai.GuidanceScheduleParameters"
|
90
|
+
proto3_optional :cutouts, :message, 5, "gooseai.CutoutParameters"
|
91
|
+
proto3_optional :prompt, :message, 6, "gooseai.Prompt"
|
92
|
+
end
|
93
|
+
add_message "gooseai.GuidanceParameters" do
|
94
|
+
optional :guidance_preset, :enum, 1, "gooseai.GuidancePreset"
|
95
|
+
repeated :instances, :message, 2, "gooseai.GuidanceInstanceParameters"
|
75
96
|
end
|
76
97
|
add_message "gooseai.TransformType" do
|
77
98
|
oneof :type do
|
@@ -104,6 +125,25 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
104
125
|
repeated :exceeds, :message, 2, "gooseai.ClassifierCategory"
|
105
126
|
proto3_optional :realized_action, :enum, 3, "gooseai.Action"
|
106
127
|
end
|
128
|
+
add_message "gooseai.AssetParameters" do
|
129
|
+
optional :action, :enum, 1, "gooseai.AssetAction"
|
130
|
+
optional :project_id, :string, 2
|
131
|
+
optional :use, :enum, 3, "gooseai.AssetUse"
|
132
|
+
end
|
133
|
+
add_message "gooseai.AnswerMeta" do
|
134
|
+
proto3_optional :gpu_id, :string, 1
|
135
|
+
proto3_optional :cpu_id, :string, 2
|
136
|
+
proto3_optional :node_id, :string, 3
|
137
|
+
proto3_optional :engine_id, :string, 4
|
138
|
+
end
|
139
|
+
add_message "gooseai.Answer" do
|
140
|
+
optional :answer_id, :string, 1
|
141
|
+
optional :request_id, :string, 2
|
142
|
+
optional :received, :uint64, 3
|
143
|
+
optional :created, :uint64, 4
|
144
|
+
proto3_optional :meta, :message, 6, "gooseai.AnswerMeta"
|
145
|
+
repeated :artifacts, :message, 7, "gooseai.Artifact"
|
146
|
+
end
|
107
147
|
add_message "gooseai.Request" do
|
108
148
|
optional :engine_id, :string, 1
|
109
149
|
optional :request_id, :string, 2
|
@@ -113,6 +153,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
113
153
|
oneof :params do
|
114
154
|
optional :image, :message, 5, "gooseai.ImageParameters"
|
115
155
|
optional :classifier, :message, 7, "gooseai.ClassifierParameters"
|
156
|
+
optional :asset, :message, 8, "gooseai.AssetParameters"
|
116
157
|
end
|
117
158
|
end
|
118
159
|
add_message "gooseai.OnStatus" do
|
@@ -161,6 +202,21 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
161
202
|
value :UPSCALER_GFPGAN, 1
|
162
203
|
value :UPSCALER_ESRGAN, 2
|
163
204
|
end
|
205
|
+
add_enum "gooseai.GuidancePreset" do
|
206
|
+
value :GUIDANCE_PRESET_NONE, 0
|
207
|
+
value :GUIDANCE_PRESET_SIMPLE, 1
|
208
|
+
value :GUIDANCE_PRESET_FAST_BLUE, 2
|
209
|
+
value :GUIDANCE_PRESET_FAST_GREEN, 3
|
210
|
+
value :GUIDANCE_PRESET_SLOW, 4
|
211
|
+
value :GUIDANCE_PRESET_SLOWER, 5
|
212
|
+
value :GUIDANCE_PRESET_SLOWEST, 6
|
213
|
+
end
|
214
|
+
add_enum "gooseai.ModelArchitecture" do
|
215
|
+
value :MODEL_ARCHITECTURE_NONE, 0
|
216
|
+
value :MODEL_ARCHITECTURE_CLIP_VIT, 1
|
217
|
+
value :MODEL_ARCHITECTURE_CLIP_RESNET, 2
|
218
|
+
value :MODEL_ARCHITECTURE_LDM, 3
|
219
|
+
end
|
164
220
|
add_enum "gooseai.Action" do
|
165
221
|
value :ACTION_PASSTHROUGH, 0
|
166
222
|
value :ACTION_REGENERATE_DUPLICATE, 1
|
@@ -173,6 +229,18 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
|
|
173
229
|
value :CLSFR_MODE_ZEROSHOT, 0
|
174
230
|
value :CLSFR_MODE_MULTICLASS, 1
|
175
231
|
end
|
232
|
+
add_enum "gooseai.AssetAction" do
|
233
|
+
value :ASSET_PUT, 0
|
234
|
+
value :ASSET_GET, 1
|
235
|
+
value :ASSET_DELETE, 2
|
236
|
+
end
|
237
|
+
add_enum "gooseai.AssetUse" do
|
238
|
+
value :ASSET_USE_UNDEFINED, 0
|
239
|
+
value :ASSET_USE_INPUT, 1
|
240
|
+
value :ASSET_USE_OUTPUT, 2
|
241
|
+
value :ASSET_USE_INTERMEDIATE, 3
|
242
|
+
value :ASSET_USE_PROJECT, 4
|
243
|
+
end
|
176
244
|
add_enum "gooseai.StageAction" do
|
177
245
|
value :STAGE_ACTION_PASS, 0
|
178
246
|
value :STAGE_ACTION_DISCARD, 1
|
@@ -187,17 +255,23 @@ module Gooseai
|
|
187
255
|
Artifact = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Artifact").msgclass
|
188
256
|
PromptParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.PromptParameters").msgclass
|
189
257
|
Prompt = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Prompt").msgclass
|
190
|
-
AnswerMeta = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.AnswerMeta").msgclass
|
191
|
-
Answer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Answer").msgclass
|
192
258
|
SamplerParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.SamplerParameters").msgclass
|
193
259
|
ConditionerParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ConditionerParameters").msgclass
|
194
260
|
ScheduleParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ScheduleParameters").msgclass
|
195
261
|
StepParameter = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.StepParameter").msgclass
|
262
|
+
Model = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Model").msgclass
|
263
|
+
CutoutParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.CutoutParameters").msgclass
|
264
|
+
GuidanceScheduleParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.GuidanceScheduleParameters").msgclass
|
265
|
+
GuidanceInstanceParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.GuidanceInstanceParameters").msgclass
|
266
|
+
GuidanceParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.GuidanceParameters").msgclass
|
196
267
|
TransformType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.TransformType").msgclass
|
197
268
|
ImageParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ImageParameters").msgclass
|
198
269
|
ClassifierConcept = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ClassifierConcept").msgclass
|
199
270
|
ClassifierCategory = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ClassifierCategory").msgclass
|
200
271
|
ClassifierParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ClassifierParameters").msgclass
|
272
|
+
AssetParameters = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.AssetParameters").msgclass
|
273
|
+
AnswerMeta = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.AnswerMeta").msgclass
|
274
|
+
Answer = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Answer").msgclass
|
201
275
|
Request = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Request").msgclass
|
202
276
|
OnStatus = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.OnStatus").msgclass
|
203
277
|
Stage = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Stage").msgclass
|
@@ -206,7 +280,11 @@ module Gooseai
|
|
206
280
|
ArtifactType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ArtifactType").enummodule
|
207
281
|
DiffusionSampler = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.DiffusionSampler").enummodule
|
208
282
|
Upscaler = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Upscaler").enummodule
|
283
|
+
GuidancePreset = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.GuidancePreset").enummodule
|
284
|
+
ModelArchitecture = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ModelArchitecture").enummodule
|
209
285
|
Action = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.Action").enummodule
|
210
286
|
ClassifierMode = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.ClassifierMode").enummodule
|
287
|
+
AssetAction = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.AssetAction").enummodule
|
288
|
+
AssetUse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.AssetUse").enummodule
|
211
289
|
StageAction = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("gooseai.StageAction").enummodule
|
212
290
|
end
|
data/lib/stability_sdk/cli.rb
CHANGED
@@ -23,10 +23,15 @@ module StabilitySDK
|
|
23
23
|
logger.warn "not implemented for ArtifactType #{artifact.type}"
|
24
24
|
end
|
25
25
|
|
26
|
+
if artifact.finish_reason == :FILTER
|
27
|
+
logger.debug "the generated image is filtered"
|
28
|
+
end
|
29
|
+
|
26
30
|
next if filename == "" || contents == ""
|
27
31
|
|
28
32
|
File.open(filename, "wb") do |f|
|
29
33
|
f.write(contents)
|
34
|
+
logger.debug "wrote #{artifact.type} to #{filename}"
|
30
35
|
end
|
31
36
|
end
|
32
37
|
end
|
data/lib/stability_sdk/client.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "grpc"
|
2
2
|
require "generation_services_pb"
|
3
|
+
require "logger"
|
3
4
|
|
4
5
|
module StabilitySDK
|
5
6
|
class Client
|
@@ -36,29 +37,37 @@ module StabilitySDK
|
|
36
37
|
stub_params[kw] = options[kw] if options.has_key?(kw)
|
37
38
|
end
|
38
39
|
|
40
|
+
if options.has_key?(:logger)
|
41
|
+
@logger = options[:logger]
|
42
|
+
else
|
43
|
+
logger = Logger.new(STDOUT)
|
44
|
+
logger.level = Logger::WARN
|
45
|
+
@logger = logger
|
46
|
+
end
|
47
|
+
|
39
48
|
@stub = Gooseai::GenerationService::Stub.new(host, creds, **stub_params)
|
40
49
|
end
|
41
50
|
|
42
51
|
def generate(prompt, options, &block)
|
43
|
-
width = options.has_key?(:width) ? options[:width]
|
44
|
-
height = options.has_key?(:height) ? options[:height]
|
52
|
+
width = options.has_key?(:width) ? options[:width] : DEFAULT_IMAGE_WIDTH
|
53
|
+
height = options.has_key?(:height) ? options[:height] : DEFAULT_IMAGE_HEIGHT
|
45
54
|
|
46
55
|
if width % 64 != 0 || height % 64 != 0
|
47
56
|
raise InvalidParameter, "width and height must be a multiple of 64"
|
48
57
|
end
|
49
58
|
|
50
|
-
samples = options.has_key?(:num_samples) ? options[:num_samples]
|
51
|
-
steps = options.has_key?(:steps) ? options[:steps]
|
52
|
-
seed = options.has_key?(:seed) ? [options[:seed]
|
59
|
+
samples = options.has_key?(:num_samples) ? options[:num_samples] : DEFAULT_SAMPLE_SIZE
|
60
|
+
steps = options.has_key?(:steps) ? options[:steps] : DEFAULT_STEPS
|
61
|
+
seed = options.has_key?(:seed) ? [options[:seed]] : [rand(4294967295)]
|
53
62
|
transform = Gooseai::TransformType.new(
|
54
|
-
diffusion: options.has_key?(:sampler) ? SAMPLER_ALGORITHMS[options[:sampler]] : DEFAULT_SAMPLER_ALGORITHM,
|
63
|
+
diffusion: options.has_key?(:sampler) ? SAMPLER_ALGORITHMS[options[:sampler].to_sym] : DEFAULT_SAMPLER_ALGORITHM,
|
55
64
|
)
|
56
|
-
|
65
|
+
step_parameter = Gooseai::StepParameter.new(
|
57
66
|
scaled_step: 0,
|
58
67
|
sampler: Gooseai::SamplerParameters.new(
|
59
|
-
cfg_scale: options.has_key?(:cfg_scale) ? options[:cfg_scale]
|
68
|
+
cfg_scale: options.has_key?(:cfg_scale) ? options[:cfg_scale] : DEFAULT_CFG_SCALE,
|
60
69
|
),
|
61
|
-
)
|
70
|
+
)
|
62
71
|
|
63
72
|
prompt_param = []
|
64
73
|
if prompt != ""
|
@@ -66,21 +75,65 @@ module StabilitySDK
|
|
66
75
|
end
|
67
76
|
if options.has_key?(:init_image)
|
68
77
|
prompt_param << init_image_to_prompt(options[:init_image])
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
),
|
78
|
-
)]
|
78
|
+
step_parameter.scaled_step = 0
|
79
|
+
step_parameter.sampler = Gooseai::SamplerParameters.new(
|
80
|
+
cfg_scale: options.has_key?(:cfg_scale) ? options[:cfg_scale] : DEFAULT_CFG_SCALE,
|
81
|
+
)
|
82
|
+
step_parameter.schedule = Gooseai::ScheduleParameters.new(
|
83
|
+
start: options.has_key?(:start_schedule) ? options[:start_schedule] : DEFAULT_START_SCHEDULE,
|
84
|
+
end: options.has_key?(:end_schedule) ? options[:end_schedule] : DEFAULT_END_SCHEDULE,
|
85
|
+
)
|
79
86
|
end
|
80
87
|
if options.has_key?(:mask_image)
|
81
88
|
prompt_param << mask_image_to_prompt(options[:mask_image])
|
82
89
|
end
|
83
90
|
|
91
|
+
# CLIP guidance
|
92
|
+
if options.has_key?(:guidance_preset) && options[:guidance_preset] != "GUIDANCE_PRESET_NONE"
|
93
|
+
step_parameter.sampler = nil
|
94
|
+
|
95
|
+
guidance_prompt =
|
96
|
+
if options.has_key?(:guidance_prompt)
|
97
|
+
Gooseai::Prompt.new(text: options[:guidance_prompt])
|
98
|
+
else
|
99
|
+
Gooseai::Prompt.new(text: prompt)
|
100
|
+
end
|
101
|
+
|
102
|
+
guidance_strength = nil
|
103
|
+
if options.has_key?(:guidance_strength) && options[:guidance_strength] != 0
|
104
|
+
guidance_strength = options[:guidance_strength]
|
105
|
+
end
|
106
|
+
|
107
|
+
models = nil
|
108
|
+
if options.has_key?(:guidance_models)
|
109
|
+
models = options[:guidance_models].map { |m| Gooseai::Model.new(alias: m) }
|
110
|
+
end
|
111
|
+
|
112
|
+
cutouts = nil
|
113
|
+
if options.has_key?(:guidance_cuts)
|
114
|
+
cutouts = Gooseai::CutoutParameters.new(count: options[:guidance_cuts])
|
115
|
+
end
|
116
|
+
|
117
|
+
step_parameter.guidance = Gooseai::GuidanceParameters.new(
|
118
|
+
guidance_preset: Gooseai::GuidancePreset.const_get(options[:guidance_preset].to_sym),
|
119
|
+
instances: [
|
120
|
+
Gooseai::GuidanceInstanceParameters.new(
|
121
|
+
guidance_strength: guidance_strength,
|
122
|
+
models: models,
|
123
|
+
cutouts: cutouts,
|
124
|
+
prompt: guidance_prompt,
|
125
|
+
),
|
126
|
+
],
|
127
|
+
)
|
128
|
+
|
129
|
+
if transform.diffusion != Gooseai::DiffusionSampler::SAMPLER_K_DPM_2_ANCESTRAL && transform.diffusion != Gooseai::DiffusionSampler::SAMPLER_K_EULER_ANCESTRAL
|
130
|
+
transform = Gooseai::TransformType.new(
|
131
|
+
diffusion: Gooseai::DiffusionSampler::SAMPLER_K_DPM_2_ANCESTRAL
|
132
|
+
)
|
133
|
+
@logger.warn "CLIP guidance is only supported with ancestral samplers. So override it with SAMPLER_K_DPM_2_ANCESTRAL."
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
84
137
|
image_param = Gooseai::ImageParameters.new(
|
85
138
|
width: width,
|
86
139
|
height: height,
|
@@ -88,7 +141,7 @@ module StabilitySDK
|
|
88
141
|
steps: steps,
|
89
142
|
seed: seed,
|
90
143
|
transform: transform,
|
91
|
-
parameters:
|
144
|
+
parameters: [step_parameter],
|
92
145
|
)
|
93
146
|
|
94
147
|
req = Gooseai::Request.new(
|
@@ -97,8 +150,20 @@ module StabilitySDK
|
|
97
150
|
image: image_param
|
98
151
|
)
|
99
152
|
|
153
|
+
@logger.debug "sending request."
|
154
|
+
start = Time.now
|
100
155
|
@stub.generate(req).each do |answer|
|
156
|
+
duration = Time.now - start
|
157
|
+
if answer.artifacts.size > 0
|
158
|
+
artifact_types = answer.artifacts.map { |a| a.type }
|
159
|
+
@logger.debug "got #{answer.answer_id} with #{artifact_types} in #{duration.round(2)}s"
|
160
|
+
else
|
161
|
+
@logger.debug "got keepalive #{answer.answer_id} in #{duration.round(2)}s"
|
162
|
+
end
|
163
|
+
|
101
164
|
block.call(answer)
|
165
|
+
|
166
|
+
start = Time.now
|
102
167
|
end
|
103
168
|
end
|
104
169
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "grpc"
|
2
|
+
require "dashboard_services_pb"
|
3
|
+
|
4
|
+
module StabilitySDK::Unstable
|
5
|
+
class DashboardClient
|
6
|
+
DEFAULT_API_HOST = "grpc.stability.ai:443"
|
7
|
+
|
8
|
+
def initialize(options={})
|
9
|
+
host = options[:api_host] || DEFAULT_API_HOST
|
10
|
+
channel_creds = options.has_key?(:ca_cert) ? GRPC::Core::ChannelCredentials.new(options[:ca_cert]) : GRPC::Core::ChannelCredentials.new
|
11
|
+
call_creds = GRPC::Core::CallCredentials.new(proc { { "authorization" => "Bearer #{options[:api_key]}" } })
|
12
|
+
creds = channel_creds.compose(call_creds)
|
13
|
+
|
14
|
+
stub_params = {}
|
15
|
+
[:channel_override, :timeout, :propagate_mask, :channel_args, :interceptors].each do |kw|
|
16
|
+
stub_params[kw] = options[kw] if options.has_key?(kw)
|
17
|
+
end
|
18
|
+
|
19
|
+
@stub = Gooseai::DashboardService::Stub.new(host, creds, **stub_params)
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_me
|
23
|
+
@stub.get_me(Gooseai::EmptyRequest.new)
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_organization
|
27
|
+
me = self.get_me
|
28
|
+
@stub.get_organization(Gooseai::GetChargesRequest.new(organization_id: me.organizations[0].organization.id))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/stability_sdk.rb
CHANGED
data/stability_sdk.gemspec
CHANGED
@@ -28,5 +28,6 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_dependency "grpc", ">= 1.41.1"
|
29
29
|
spec.add_dependency "mime-types", ">= 3.0.0"
|
30
30
|
spec.add_dependency "fastimage", "~> 2.2", ">= 2.2.6"
|
31
|
+
spec.add_dependency "thor", ">= 1.2.1"
|
31
32
|
spec.add_development_dependency "grpc-tools"
|
32
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stability_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kosei Moriyama
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-10-
|
11
|
+
date: 2022-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grpc
|
@@ -58,6 +58,20 @@ dependencies:
|
|
58
58
|
- - ">="
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: 2.2.6
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: thor
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 1.2.1
|
68
|
+
type: :runtime
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.2.1
|
61
75
|
- !ruby/object:Gem::Dependency
|
62
76
|
name: grpc-tools
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,6 +92,7 @@ email:
|
|
78
92
|
- cou929@gmail.com
|
79
93
|
executables:
|
80
94
|
- stability-client
|
95
|
+
- stability-dashboard-client-unstable
|
81
96
|
extensions: []
|
82
97
|
extra_rdoc_files: []
|
83
98
|
files:
|
@@ -91,11 +106,15 @@ files:
|
|
91
106
|
- bin/console
|
92
107
|
- bin/setup
|
93
108
|
- exe/stability-client
|
109
|
+
- exe/stability-dashboard-client-unstable
|
110
|
+
- lib/dashboard_pb.rb
|
111
|
+
- lib/dashboard_services_pb.rb
|
94
112
|
- lib/generation_pb.rb
|
95
113
|
- lib/generation_services_pb.rb
|
96
114
|
- lib/stability_sdk.rb
|
97
115
|
- lib/stability_sdk/cli.rb
|
98
116
|
- lib/stability_sdk/client.rb
|
117
|
+
- lib/stability_sdk/unstable/dashboard_client.rb
|
99
118
|
- lib/stability_sdk/version.rb
|
100
119
|
- stability_sdk.gemspec
|
101
120
|
homepage: https://github.com/cou929/stability-sdk-ruby
|
@@ -120,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
139
|
- !ruby/object:Gem::Version
|
121
140
|
version: '0'
|
122
141
|
requirements: []
|
123
|
-
rubygems_version: 3.1.
|
142
|
+
rubygems_version: 3.1.6
|
124
143
|
signing_key:
|
125
144
|
specification_version: 4
|
126
145
|
summary: Ruby client for interacting with stability.ai APIs (e.g. stable diffusion
|