stability_sdk 0.2.11 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +55 -7
- data/exe/stability-client +19 -14
- data/exe/{stability-dashboard-client-unstable → stability-dashboard-client} +1 -1
- data/lib/stability_sdk/cli.rb +5 -0
- data/lib/stability_sdk/client.rb +85 -20
- data/lib/stability_sdk/{unstable/dashboard_client.rb → dashboard_client.rb} +1 -1
- data/lib/stability_sdk/version.rb +1 -1
- data/lib/stability_sdk.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e707d41b381676dfbc958975bae028b82a52a7828529c52db7809db125791e9
|
4
|
+
data.tar.gz: 9e7aafbd1c0e5638ad2bc860312e55a0b2973ec3c8423fa050730cfa15887efa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37cb8a18a1accb3cf30f6dc780781f71dfe75ad648713a2c335d1b2be41f7546c0450d88ec0ae833354db24a3d3659fe0ac8163d1f3a1a076f08e8e344282c9c
|
7
|
+
data.tar.gz: aa66ce05d53d3d5bd6aa661f752a5d71f61c9835804d69f38834e07bc4e5259d971816eb4d4061264cfadc9a825a425b0469c794369eb48c1080cdbf1d1342d3
|
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,23 +107,29 @@ client.generate(prompt, options) do |answer|
|
|
91
107
|
end
|
92
108
|
```
|
93
109
|
|
94
|
-
###
|
95
|
-
|
96
|
-
**This feature is in a very early stage of development.**
|
110
|
+
### Dashboard API
|
97
111
|
|
98
112
|
Dashboard API is a way to interact with DreamStudio Web UIs, such as getting user info, payment info, etc.
|
99
113
|
|
100
|
-
Currently,
|
114
|
+
Currently, the API key is only allowed as read-only. And this client supports only GetMe and GetOrganization actions. See also https://github.com/Stability-AI/stability-sdk/issues/23
|
101
115
|
|
102
116
|
```sh
|
103
117
|
# get user info
|
104
|
-
STABILITY_SDK_DASHBOARD_API_KEY=YOUR_API_KEY stability-dashboard-client
|
118
|
+
STABILITY_SDK_DASHBOARD_API_KEY=YOUR_API_KEY stability-dashboard-client get_me
|
105
119
|
|
106
120
|
# get organization info
|
107
|
-
STABILITY_SDK_DASHBOARD_API_KEY=YOUR_API_KEY stability-dashboard-client
|
121
|
+
STABILITY_SDK_DASHBOARD_API_KEY=YOUR_API_KEY stability-dashboard-client get_organization
|
108
122
|
|
109
123
|
# i.e, get remaining balance
|
110
|
-
STABILITY_SDK_DASHBOARD_API_KEY=YOUR_API_KEY stability-dashboard-client
|
124
|
+
STABILITY_SDK_DASHBOARD_API_KEY=YOUR_API_KEY stability-dashboard-client get_organization | jq .paymentInfo.balance
|
125
|
+
```
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
require "stability_sdk"
|
129
|
+
|
130
|
+
client = StabilitySDK::DashboardClient.new(api_key: "your api key")
|
131
|
+
res = client.get_organization
|
132
|
+
p res.payment_info.balance # prints a remaining balance
|
111
133
|
```
|
112
134
|
|
113
135
|
## Development
|
@@ -116,6 +138,32 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
116
138
|
|
117
139
|
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).
|
118
140
|
|
141
|
+
### update submodule to try a new feature on Stability-AI/api-interfaces
|
142
|
+
|
143
|
+
- update submodule
|
144
|
+
|
145
|
+
```sh
|
146
|
+
git submodule update --init # if you haven't fetched the content of the submodule yet
|
147
|
+
cd api-interfaces
|
148
|
+
|
149
|
+
# checkout some branch/commit you need
|
150
|
+
git fetch
|
151
|
+
git reset --hard origin/some_branch
|
152
|
+
|
153
|
+
cd ..
|
154
|
+
```
|
155
|
+
|
156
|
+
- build
|
157
|
+
|
158
|
+
```sh
|
159
|
+
bundle exec rake protoc
|
160
|
+
|
161
|
+
git diff
|
162
|
+
# now you may be able to confirm that the diff is created in lib/generation_pb.rb
|
163
|
+
```
|
164
|
+
|
165
|
+
- modify the `lib/stability_sdk/client.rb` to try some new features
|
166
|
+
|
119
167
|
## Contributing
|
120
168
|
|
121
169
|
Bug reports and pull requests are welcome on GitHub at https://github.com/cou929/stability-sdk-ruby.
|
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)
|
@@ -33,7 +33,7 @@ class CLI < Thor
|
|
33
33
|
api_key = ENV["STABILITY_SDK_DASHBOARD_API_KEY"] if ENV["STABILITY_SDK_DASHBOARD_API_KEY"]
|
34
34
|
raise StabilitySDK::InsufficientParameter, "api key is required" if api_key.nil?
|
35
35
|
|
36
|
-
return StabilitySDK::
|
36
|
+
return StabilitySDK::DashboardClient.new(api_key: api_key)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
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
|
|
data/lib/stability_sdk.rb
CHANGED
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.
|
4
|
+
version: 0.3.0
|
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-
|
11
|
+
date: 2022-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grpc
|
@@ -92,7 +92,7 @@ email:
|
|
92
92
|
- cou929@gmail.com
|
93
93
|
executables:
|
94
94
|
- stability-client
|
95
|
-
- stability-dashboard-client
|
95
|
+
- stability-dashboard-client
|
96
96
|
extensions: []
|
97
97
|
extra_rdoc_files: []
|
98
98
|
files:
|
@@ -106,7 +106,7 @@ files:
|
|
106
106
|
- bin/console
|
107
107
|
- bin/setup
|
108
108
|
- exe/stability-client
|
109
|
-
- exe/stability-dashboard-client
|
109
|
+
- exe/stability-dashboard-client
|
110
110
|
- lib/dashboard_pb.rb
|
111
111
|
- lib/dashboard_services_pb.rb
|
112
112
|
- lib/generation_pb.rb
|
@@ -114,7 +114,7 @@ files:
|
|
114
114
|
- lib/stability_sdk.rb
|
115
115
|
- lib/stability_sdk/cli.rb
|
116
116
|
- lib/stability_sdk/client.rb
|
117
|
-
- lib/stability_sdk/
|
117
|
+
- lib/stability_sdk/dashboard_client.rb
|
118
118
|
- lib/stability_sdk/version.rb
|
119
119
|
- stability_sdk.gemspec
|
120
120
|
homepage: https://github.com/cou929/stability-sdk-ruby
|