pangea-sdk 0.0.0
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 +7 -0
- data/.ignore +2 -0
- data/README.md +1 -0
- data/lib/pangea/client.rb +51 -0
- data/lib/pangea/errors.rb +113 -0
- data/lib/pangea/internal/transport/base_client.rb +346 -0
- data/lib/pangea/internal/transport/pooled_net_requester.rb +191 -0
- data/lib/pangea/internal/type/array_of.rb +119 -0
- data/lib/pangea/internal/type/base_model.rb +289 -0
- data/lib/pangea/internal/type/boolean.rb +44 -0
- data/lib/pangea/internal/type/converter.rb +228 -0
- data/lib/pangea/internal/type/hash_of.rb +166 -0
- data/lib/pangea/internal/type/request_parameters.rb +38 -0
- data/lib/pangea/internal/type/union.rb +66 -0
- data/lib/pangea/internal/type/unknown.rb +50 -0
- data/lib/pangea/internal/util.rb +429 -0
- data/lib/pangea/internal.rb +12 -0
- data/lib/pangea/models/ai_guard/classification_result.rb +33 -0
- data/lib/pangea/models/ai_guard/hardening_result.rb +27 -0
- data/lib/pangea/models/ai_guard/language_result.rb +20 -0
- data/lib/pangea/models/ai_guard/malicious_entity_result.rb +42 -0
- data/lib/pangea/models/ai_guard/prompt_injection_result.rb +33 -0
- data/lib/pangea/models/ai_guard/redact_entity_result.rb +43 -0
- data/lib/pangea/models/ai_guard/single_entity_result.rb +21 -0
- data/lib/pangea/models/ai_guard/text_guard_message_param.rb +19 -0
- data/lib/pangea/models/ai_guard/text_guard_params.rb +24 -0
- data/lib/pangea/models/ai_guard/text_guard_result.rb +308 -0
- data/lib/pangea/models/ai_guard/topic_result.rb +33 -0
- data/lib/pangea/models/pangea_response.rb +67 -0
- data/lib/pangea/request_options.rb +35 -0
- data/lib/pangea/services/ai_guard.rb +62 -0
- data/lib/pangea/version.rb +5 -0
- data/lib/pangea.rb +45 -0
- data/manifest.yaml +6 -0
- data/rbi/lib/pangea/client.rbi +25 -0
- data/rbi/lib/pangea/internal/internal.rbi +28 -0
- data/rbi/lib/pangea/internal/transport/base_client.rbi +18 -0
- data/rbi/lib/pangea/internal/type/array_of.rbi +66 -0
- data/rbi/lib/pangea/internal/type/base_model.rbi +33 -0
- data/rbi/lib/pangea/internal/type/boolean.rbi +46 -0
- data/rbi/lib/pangea/internal/type/converter.rbi +38 -0
- data/rbi/lib/pangea/internal/type/request_parameters.rbi +20 -0
- data/rbi/lib/pangea/internal/type/union.rbi +21 -0
- data/rbi/lib/pangea/internal/type/unknown.rbi +20 -0
- data/rbi/lib/pangea/internal.rbi +7 -0
- data/rbi/lib/pangea/models/ai_guard/text_guard_message_param.rbi +15 -0
- data/rbi/lib/pangea/models/ai_guard/text_guard_result.rbi +13 -0
- data/rbi/lib/pangea/models/pangea_response.rbi +31 -0
- data/rbi/lib/pangea/request_options.rbi +17 -0
- data/rbi/lib/pangea/services/ai_guard.rbi +28 -0
- data/rbi/lib/pangea/version.rbi +5 -0
- data/sig/pangea/client.rbs +12 -0
- data/sig/pangea/internal/transport/base_client.rbs +14 -0
- data/sig/pangea/internal/type/base_model.rbs +12 -0
- data/sig/pangea/internal/type/boolean.rbs +10 -0
- data/sig/pangea/internal/type/converter.rbs +9 -0
- data/sig/pangea/internal/type/request_parameters.rbs +15 -0
- data/sig/pangea/models/pangea_response.rbs +12 -0
- data/sig/pangea/models/text_guard_result.rbs +19 -0
- data/sig/pangea/request_options.rbs +34 -0
- data/sig/pangea/services/ai_guard.rbs +12 -0
- data/sig/pangea/version.rbs +3 -0
- metadata +126 -0
@@ -0,0 +1,429 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pangea
|
4
|
+
module Internal
|
5
|
+
# @api private
|
6
|
+
module Util
|
7
|
+
# @api private
|
8
|
+
#
|
9
|
+
# @return [Float]
|
10
|
+
def self.monotonic_secs = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
11
|
+
|
12
|
+
class << self
|
13
|
+
# @api private
|
14
|
+
#
|
15
|
+
# @param enum [Enumerable<Object>, nil]
|
16
|
+
def close_fused!(enum)
|
17
|
+
return unless enum.is_a?(Enumerator)
|
18
|
+
|
19
|
+
# rubocop:disable Lint/UnreachableLoop
|
20
|
+
enum.rewind.each { break }
|
21
|
+
# rubocop:enable Lint/UnreachableLoop
|
22
|
+
end
|
23
|
+
|
24
|
+
# @api private
|
25
|
+
#
|
26
|
+
# @param input [Object]
|
27
|
+
#
|
28
|
+
# @return [Hash{Object=>Object}, Object]
|
29
|
+
def coerce_hash(input)
|
30
|
+
case input
|
31
|
+
in NilClass | Array | Set | Enumerator | StringIO | IO
|
32
|
+
input
|
33
|
+
else
|
34
|
+
input.respond_to?(:to_h) ? input.to_h : input
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# @api private
|
39
|
+
#
|
40
|
+
# Assumes each chunk in stream has `Encoding::BINARY`.
|
41
|
+
#
|
42
|
+
# @param headers [Hash{String=>String}, Net::HTTPHeader]
|
43
|
+
# @param stream [Enumerable<String>]
|
44
|
+
# @param suppress_error [Boolean]
|
45
|
+
#
|
46
|
+
# @raise [JSON::ParserError]
|
47
|
+
# @return [Object]
|
48
|
+
def decode_content(headers, stream:, suppress_error: false)
|
49
|
+
case (content_type = headers["content-type"])
|
50
|
+
in %r{^application/(?:vnd\.api\+)?json}
|
51
|
+
json = stream.to_a.join
|
52
|
+
begin
|
53
|
+
JSON.parse(json, symbolize_names: true)
|
54
|
+
rescue JSON::ParserError => e
|
55
|
+
raise e unless suppress_error
|
56
|
+
json
|
57
|
+
end
|
58
|
+
in %r{^application/(?:x-)?jsonl}
|
59
|
+
lines = decode_lines(stream)
|
60
|
+
chain_fused(lines) do |y|
|
61
|
+
lines.each { y << JSON.parse(_1, symbolize_names: true) }
|
62
|
+
end
|
63
|
+
in %r{^text/event-stream}
|
64
|
+
lines = decode_lines(stream)
|
65
|
+
decode_sse(lines)
|
66
|
+
else
|
67
|
+
text = stream.to_a.join
|
68
|
+
force_charset!(content_type, text: text)
|
69
|
+
StringIO.new(text)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# @api private
|
74
|
+
#
|
75
|
+
# @param query [String, nil]
|
76
|
+
#
|
77
|
+
# @return [Hash{String=>Array<String>}]
|
78
|
+
def decode_query(query)
|
79
|
+
CGI.parse(query.to_s)
|
80
|
+
end
|
81
|
+
|
82
|
+
# @api private
|
83
|
+
#
|
84
|
+
# @param lhs [Object]
|
85
|
+
# @param rhs [Object]
|
86
|
+
# @param concat [Boolean]
|
87
|
+
#
|
88
|
+
# @return [Object]
|
89
|
+
private def deep_merge_lr(lhs, rhs, concat: false)
|
90
|
+
case [lhs, rhs, concat]
|
91
|
+
in [Hash, Hash, _]
|
92
|
+
lhs.merge(rhs) { deep_merge_lr(_2, _3, concat: concat) }
|
93
|
+
in [Array, Array, true]
|
94
|
+
lhs.concat(rhs)
|
95
|
+
else
|
96
|
+
rhs
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# @api private
|
101
|
+
#
|
102
|
+
# Recursively merge one hash with another. If the values at a given key are not
|
103
|
+
# both hashes, just take the new value.
|
104
|
+
#
|
105
|
+
# @param values [Array<Object>]
|
106
|
+
#
|
107
|
+
# @param sentinel [Object, nil] the value to return if no values are provided.
|
108
|
+
#
|
109
|
+
# @param concat [Boolean] whether to merge sequences by concatenation.
|
110
|
+
#
|
111
|
+
# @return [Object]
|
112
|
+
def deep_merge(*values, sentinel: nil, concat: false)
|
113
|
+
case values
|
114
|
+
in [value, *values]
|
115
|
+
values.reduce(value) do |acc, val|
|
116
|
+
deep_merge_lr(acc, val, concat: concat)
|
117
|
+
end
|
118
|
+
else
|
119
|
+
sentinel
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# @api private
|
124
|
+
#
|
125
|
+
# @param data [Hash{Symbol=>Object}, Array<Object>, Object]
|
126
|
+
# @param pick [Symbol, Integer, Array<Symbol, Integer>, nil]
|
127
|
+
# @param sentinel [Object, nil]
|
128
|
+
# @param blk [Proc, nil]
|
129
|
+
#
|
130
|
+
# @return [Object, nil]
|
131
|
+
def dig(data, pick, sentinel = nil, &blk)
|
132
|
+
case [data, pick, blk]
|
133
|
+
in [_, nil, nil]
|
134
|
+
data
|
135
|
+
in [Hash, Symbol, _] | [Array, Integer, _]
|
136
|
+
blk.nil? ? data.fetch(pick, sentinel) : data.fetch(pick, &blk)
|
137
|
+
in [Hash | Array, Array, _]
|
138
|
+
pick.reduce(data) do |acc, key|
|
139
|
+
case acc
|
140
|
+
in Hash if acc.key?(key)
|
141
|
+
acc.fetch(key)
|
142
|
+
in Array if key.is_a?(Integer) && key < acc.length
|
143
|
+
acc[key]
|
144
|
+
else
|
145
|
+
return blk.nil? ? sentinel : blk.call
|
146
|
+
end
|
147
|
+
end
|
148
|
+
in _
|
149
|
+
blk.nil? ? sentinel : blk.call
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
# @api private
|
154
|
+
#
|
155
|
+
# @param headers [Hash{String=>String}]
|
156
|
+
# @param body [Object]
|
157
|
+
#
|
158
|
+
# @return [Object]
|
159
|
+
def encode_content(headers, body)
|
160
|
+
content_type = headers["content-type"]
|
161
|
+
body = body.inner if body.is_a?(Pangea::Internal::Util::SerializationAdapter)
|
162
|
+
|
163
|
+
case [content_type, body]
|
164
|
+
in [%r{^application/(?:vnd\.api\+)?json}, Hash | Array | -> { primitive?(_1) }]
|
165
|
+
[headers, JSON.generate(body)]
|
166
|
+
in [%r{^application/(?:x-)?jsonl}, Enumerable] unless body.is_a?(StringIO) || body.is_a?(IO)
|
167
|
+
[headers, body.lazy.map { JSON.generate(_1) }]
|
168
|
+
in [%r{^multipart/form-data}, Hash | Pathname | StringIO | IO]
|
169
|
+
boundary, strio = encode_multipart_streaming(body)
|
170
|
+
headers = {**headers, "content-type" => "#{content_type}; boundary=#{boundary}"}
|
171
|
+
[headers, strio]
|
172
|
+
in [_, Symbol | Numeric]
|
173
|
+
[headers, body.to_s]
|
174
|
+
in [_, StringIO]
|
175
|
+
[headers, body.string]
|
176
|
+
else
|
177
|
+
[headers, body]
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# @api private
|
182
|
+
#
|
183
|
+
# @param query [Hash{String=>Array<String>, String, nil}, nil]
|
184
|
+
#
|
185
|
+
# @return [String, nil]
|
186
|
+
def encode_query(query)
|
187
|
+
query.to_h.empty? ? nil : URI.encode_www_form(query)
|
188
|
+
end
|
189
|
+
|
190
|
+
# @api private
|
191
|
+
#
|
192
|
+
# https://doc.rust-lang.org/std/iter/trait.FusedIterator.html
|
193
|
+
#
|
194
|
+
# @param enum [Enumerable<Object>]
|
195
|
+
# @param external [Boolean]
|
196
|
+
# @param close [Proc]
|
197
|
+
#
|
198
|
+
# @return [Enumerable<Object>]
|
199
|
+
def fused_enum(enum, external: false, &close)
|
200
|
+
fused = false
|
201
|
+
iter = Enumerator.new do |y|
|
202
|
+
next if fused
|
203
|
+
|
204
|
+
fused = true
|
205
|
+
if external
|
206
|
+
loop { y << enum.next }
|
207
|
+
else
|
208
|
+
enum.each(&y)
|
209
|
+
end
|
210
|
+
ensure
|
211
|
+
close&.call
|
212
|
+
close = nil
|
213
|
+
end
|
214
|
+
|
215
|
+
iter.define_singleton_method(:rewind) do
|
216
|
+
fused = true
|
217
|
+
self
|
218
|
+
end
|
219
|
+
iter
|
220
|
+
end
|
221
|
+
|
222
|
+
# @api private
|
223
|
+
#
|
224
|
+
# @param path [String, Array<String>]
|
225
|
+
#
|
226
|
+
# @return [String]
|
227
|
+
def interpolate_path(path)
|
228
|
+
case path
|
229
|
+
in String
|
230
|
+
path
|
231
|
+
in []
|
232
|
+
""
|
233
|
+
in [String => p, *interpolations]
|
234
|
+
encoded = interpolations.map { ERB::Util.url_encode(_1) }
|
235
|
+
format(p, *encoded)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
# @api private
|
240
|
+
#
|
241
|
+
# @param lhs [Hash{Symbol=>String, Integer, nil}] .
|
242
|
+
#
|
243
|
+
# @option lhs [String, nil] :scheme
|
244
|
+
#
|
245
|
+
# @option lhs [String, nil] :host
|
246
|
+
#
|
247
|
+
# @option lhs [Integer, nil] :port
|
248
|
+
#
|
249
|
+
# @option lhs [String, nil] :path
|
250
|
+
#
|
251
|
+
# @option lhs [Hash{String=>Array<String>}] :query
|
252
|
+
#
|
253
|
+
# @param rhs [Hash{Symbol=>String, Integer, nil}] .
|
254
|
+
#
|
255
|
+
# @option rhs [String, nil] :scheme
|
256
|
+
#
|
257
|
+
# @option rhs [String, nil] :host
|
258
|
+
#
|
259
|
+
# @option rhs [Integer, nil] :port
|
260
|
+
#
|
261
|
+
# @option rhs [String, nil] :path
|
262
|
+
#
|
263
|
+
# @option rhs [Hash{String=>Array<String>}] :query
|
264
|
+
#
|
265
|
+
# @return [URI::Generic]
|
266
|
+
def join_parsed_uri(lhs, rhs)
|
267
|
+
base_path, base_query = lhs.fetch_values(:path, :query)
|
268
|
+
slashed = base_path.end_with?("/") ? base_path : "#{base_path}/"
|
269
|
+
|
270
|
+
parsed_path, parsed_query = parse_uri(rhs.fetch(:path)).fetch_values(:path, :query)
|
271
|
+
override = URI::Generic.build(**rhs.slice(:scheme, :host, :port), path: parsed_path)
|
272
|
+
|
273
|
+
joined = URI.join(URI::Generic.build(lhs.except(:path, :query)), slashed, override)
|
274
|
+
query = deep_merge(
|
275
|
+
joined.path == base_path ? base_query : {},
|
276
|
+
parsed_query,
|
277
|
+
rhs[:query].to_h,
|
278
|
+
concat: true
|
279
|
+
)
|
280
|
+
|
281
|
+
joined.query = encode_query(query)
|
282
|
+
joined
|
283
|
+
end
|
284
|
+
|
285
|
+
# @api private
|
286
|
+
#
|
287
|
+
# @param headers [Hash{String=>String, Integer, Array<String, Integer, nil>, nil}]
|
288
|
+
#
|
289
|
+
# @return [Hash{String=>String}]
|
290
|
+
def normalized_headers(*headers)
|
291
|
+
{}.merge(*headers.compact).to_h do |key, val|
|
292
|
+
value =
|
293
|
+
case val
|
294
|
+
in Array
|
295
|
+
val.filter_map { _1&.to_s&.strip }.join(", ")
|
296
|
+
else
|
297
|
+
val&.to_s&.strip
|
298
|
+
end
|
299
|
+
[key.downcase, value]
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
# @api private
|
304
|
+
#
|
305
|
+
# @param url [URI::Generic, String]
|
306
|
+
#
|
307
|
+
# @return [Hash{Symbol=>String, Integer, nil}]
|
308
|
+
def parse_uri(url)
|
309
|
+
parsed = URI::Generic.component.zip(URI.split(url)).to_h
|
310
|
+
{**parsed, query: decode_query(parsed.fetch(:query))}
|
311
|
+
end
|
312
|
+
|
313
|
+
# @api private
|
314
|
+
#
|
315
|
+
# @param uri [URI::Generic]
|
316
|
+
#
|
317
|
+
# @return [String]
|
318
|
+
def uri_origin(uri)
|
319
|
+
"#{uri.scheme}://#{uri.host}#{uri.port == uri.default_port ? '' : ":#{uri.port}"}"
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
# @api private
|
324
|
+
class SerializationAdapter
|
325
|
+
# @return [Pathname, IO]
|
326
|
+
attr_reader :inner
|
327
|
+
|
328
|
+
# @param a [Object]
|
329
|
+
#
|
330
|
+
# @return [String]
|
331
|
+
def to_json(*a) = (inner.is_a?(IO) ? inner.read : inner.read(binmode: true)).to_json(*a)
|
332
|
+
|
333
|
+
# @param a [Object]
|
334
|
+
#
|
335
|
+
# @return [String]
|
336
|
+
def to_yaml(*a) = (inner.is_a?(IO) ? inner.read : inner.read(binmode: true)).to_yaml(*a)
|
337
|
+
|
338
|
+
# @api private
|
339
|
+
#
|
340
|
+
# @param inner [Pathname, IO]
|
341
|
+
def initialize(inner) = @inner = inner
|
342
|
+
end
|
343
|
+
|
344
|
+
# @api private
|
345
|
+
#
|
346
|
+
# An adapter that satisfies the IO interface required by `::IO.copy_stream`
|
347
|
+
class ReadIOAdapter
|
348
|
+
# @api private
|
349
|
+
#
|
350
|
+
# @return [Boolean, nil]
|
351
|
+
def close? = @closing
|
352
|
+
|
353
|
+
# @api private
|
354
|
+
def close
|
355
|
+
case @stream
|
356
|
+
in Enumerator
|
357
|
+
Pangea::Internal::Util.close_fused!(@stream)
|
358
|
+
in IO if close?
|
359
|
+
@stream.close
|
360
|
+
else
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
# @api private
|
365
|
+
#
|
366
|
+
# @param max_len [Integer, nil]
|
367
|
+
#
|
368
|
+
# @return [String]
|
369
|
+
private def read_enum(max_len)
|
370
|
+
case max_len
|
371
|
+
in nil
|
372
|
+
@stream.to_a.join
|
373
|
+
in Integer
|
374
|
+
@buf << @stream.next while @buf.length < max_len
|
375
|
+
@buf.slice!(..max_len)
|
376
|
+
end
|
377
|
+
rescue StopIteration
|
378
|
+
@stream = nil
|
379
|
+
@buf.slice!(0..)
|
380
|
+
end
|
381
|
+
|
382
|
+
# @api private
|
383
|
+
#
|
384
|
+
# @param max_len [Integer, nil]
|
385
|
+
# @param out_string [String, nil]
|
386
|
+
#
|
387
|
+
# @return [String, nil]
|
388
|
+
def read(max_len = nil, out_string = nil)
|
389
|
+
case @stream
|
390
|
+
in nil
|
391
|
+
nil
|
392
|
+
in IO | StringIO
|
393
|
+
@stream.read(max_len, out_string)
|
394
|
+
in Enumerator
|
395
|
+
read = read_enum(max_len)
|
396
|
+
case out_string
|
397
|
+
in String
|
398
|
+
out_string.replace(read)
|
399
|
+
in nil
|
400
|
+
read
|
401
|
+
end
|
402
|
+
end
|
403
|
+
.tap(&@blk)
|
404
|
+
end
|
405
|
+
|
406
|
+
# @api private
|
407
|
+
#
|
408
|
+
# @param src [String, Pathname, StringIO, Enumerable<String>]
|
409
|
+
# @param blk [Proc]
|
410
|
+
#
|
411
|
+
# @yieldparam [String]
|
412
|
+
def initialize(src, &blk)
|
413
|
+
@stream =
|
414
|
+
case src
|
415
|
+
in String
|
416
|
+
StringIO.new(src)
|
417
|
+
in Pathname
|
418
|
+
@closing = true
|
419
|
+
src.open(binmode: true)
|
420
|
+
else
|
421
|
+
src
|
422
|
+
end
|
423
|
+
@buf = String.new
|
424
|
+
@blk = blk
|
425
|
+
end
|
426
|
+
end
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pangea
|
4
|
+
module Models
|
5
|
+
module AiGuard
|
6
|
+
class ClassificationResult < Pangea::Internal::Type::BaseModel
|
7
|
+
# @!attribute action
|
8
|
+
# The action taken by this Detector
|
9
|
+
#
|
10
|
+
# @return [String, nil]
|
11
|
+
optional :action, String, nil?: true
|
12
|
+
|
13
|
+
# @!attribute classifications
|
14
|
+
# Triggered classifications.
|
15
|
+
#
|
16
|
+
# @return [Pangea::Internal::Type::ArrayOf<Classification>, nil]
|
17
|
+
optional :classifications, Pangea::Internal::Type::ArrayOf[-> { Classification }], nil?: true
|
18
|
+
|
19
|
+
class Classification < Pangea::Internal::Type::BaseModel
|
20
|
+
# @!attribute category
|
21
|
+
#
|
22
|
+
# @return [String]
|
23
|
+
required :category, String
|
24
|
+
|
25
|
+
# @!attribute confidence
|
26
|
+
#
|
27
|
+
# @return [Float]
|
28
|
+
required :confidence, Float
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pangea
|
4
|
+
module Models
|
5
|
+
module AiGuard
|
6
|
+
class HardeningResult < Pangea::Internal::Type::BaseModel
|
7
|
+
# @!attribute action
|
8
|
+
# The action taken by this Detector
|
9
|
+
#
|
10
|
+
# @return [String, nil]
|
11
|
+
optional :action, String, nil?: true
|
12
|
+
|
13
|
+
# @!attribute message
|
14
|
+
# Descriptive information about the hardening detector execution
|
15
|
+
#
|
16
|
+
# @return [String, nil]
|
17
|
+
optional :message, String, nil?: true
|
18
|
+
|
19
|
+
# @!attribute token_count
|
20
|
+
# Number of tokens counted in the last user prompt
|
21
|
+
#
|
22
|
+
# @return [Integer, nil]
|
23
|
+
optional :token_count, Integer, nil?: true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pangea
|
4
|
+
module Models
|
5
|
+
module AiGuard
|
6
|
+
class LanguageResult < Pangea::Internal::Type::BaseModel
|
7
|
+
# @!attribute action
|
8
|
+
# The action taken by this Detector
|
9
|
+
#
|
10
|
+
# @return [String, nil]
|
11
|
+
optional :action, String, nil?: true
|
12
|
+
|
13
|
+
# @!attribute language
|
14
|
+
#
|
15
|
+
# @return [String, nil]
|
16
|
+
optional :language, String, nil?: true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pangea
|
4
|
+
module Models
|
5
|
+
module AiGuard
|
6
|
+
class MaliciousEntityResult < Pangea::Internal::Type::BaseModel
|
7
|
+
# @!attribute entities
|
8
|
+
# Detected harmful items.
|
9
|
+
#
|
10
|
+
# @return [Pangea::Internal::Type::ArrayOf<Entity>, nil]
|
11
|
+
optional :entities, Pangea::Internal::Type::ArrayOf[-> { Entity }], nil?: true
|
12
|
+
|
13
|
+
class Entity < Pangea::Internal::Type::BaseModel
|
14
|
+
# @!attribute type
|
15
|
+
#
|
16
|
+
# @return [String]
|
17
|
+
required :type, String
|
18
|
+
|
19
|
+
# @!attribute value
|
20
|
+
#
|
21
|
+
# @return [String]
|
22
|
+
required :value, String
|
23
|
+
|
24
|
+
# @!attribute redacted
|
25
|
+
#
|
26
|
+
# @return [Pangea::Internal::Type::Boolean, nil]
|
27
|
+
optional :redacted, Pangea::Internal::Type::Boolean, nil?: true
|
28
|
+
|
29
|
+
# @!attribute start_pos
|
30
|
+
#
|
31
|
+
# @return [Integer, nil]
|
32
|
+
optional :start_pos, Integer, nil?: true
|
33
|
+
|
34
|
+
# @!attribute raw
|
35
|
+
#
|
36
|
+
# @return [Hash, nil]
|
37
|
+
optional :raw, Hash, nil?: true
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pangea
|
4
|
+
module Models
|
5
|
+
module AiGuard
|
6
|
+
class PromptInjectionResult < Pangea::Internal::Type::BaseModel
|
7
|
+
# @!attribute action
|
8
|
+
# The action taken by this Detector
|
9
|
+
#
|
10
|
+
# @return [String, nil]
|
11
|
+
optional :action, String, nil?: true
|
12
|
+
|
13
|
+
# @!attribute analyzer_responses
|
14
|
+
# Triggered prompt injection analyzers.
|
15
|
+
#
|
16
|
+
# @return [Pangea::Internal::Type::ArrayOf<AnalyzerResponse>, nil]
|
17
|
+
optional :analyzer_responses, Pangea::Internal::Type::ArrayOf[-> { AnalyzerResponse }], nil?: true
|
18
|
+
|
19
|
+
class AnalyzerResponse < Pangea::Internal::Type::BaseModel
|
20
|
+
# @!attribute analyzer
|
21
|
+
#
|
22
|
+
# @return [String, nil]
|
23
|
+
optional :analyzer, String, nil?: true
|
24
|
+
|
25
|
+
# @!attribute confidence
|
26
|
+
#
|
27
|
+
# @return [Float, nil]
|
28
|
+
optional :confidence, Float, nil?: true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pangea
|
4
|
+
module Models
|
5
|
+
module AiGuard
|
6
|
+
class RedactEntityResult < Pangea::Internal::Type::BaseModel
|
7
|
+
# @!attribute entities
|
8
|
+
# Detected redaction rules.
|
9
|
+
#
|
10
|
+
# @return [Pangea::Internal::Type::ArrayOf<Entity>, nil]
|
11
|
+
optional :entities, Pangea::Internal::Type::ArrayOf[-> { Entity }], nil?: true
|
12
|
+
|
13
|
+
class Entity < Pangea::Internal::Type::BaseModel
|
14
|
+
# @!attribute action
|
15
|
+
# The action taken on this Entity
|
16
|
+
#
|
17
|
+
# @return [String]
|
18
|
+
required :action, String
|
19
|
+
|
20
|
+
# @!attribute type
|
21
|
+
#
|
22
|
+
# @return [String]
|
23
|
+
required :type, String
|
24
|
+
|
25
|
+
# @!attribute value
|
26
|
+
#
|
27
|
+
# @return [String]
|
28
|
+
required :value, String
|
29
|
+
|
30
|
+
# @!attribute redacted
|
31
|
+
#
|
32
|
+
# @return [Pangea::Internal::Type::Boolean]
|
33
|
+
required :redacted, Pangea::Internal::Type::Boolean
|
34
|
+
|
35
|
+
# @!attribute start_pos
|
36
|
+
#
|
37
|
+
# @return [Integer, nil]
|
38
|
+
optional :start_pos, Integer, nil?: true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pangea
|
4
|
+
module Models
|
5
|
+
module AiGuard
|
6
|
+
class SingleEntityResult < Pangea::Internal::Type::BaseModel
|
7
|
+
# @!attribute action
|
8
|
+
# The action taken by this Detector
|
9
|
+
#
|
10
|
+
# @return [String, nil]
|
11
|
+
optional :action, String, nil?: true
|
12
|
+
|
13
|
+
# @!attribute entities
|
14
|
+
# Detected entities.
|
15
|
+
#
|
16
|
+
# @return [Pangea::Internal::Type::ArrayOf<String>, nil]
|
17
|
+
optional :entities, Pangea::Internal::Type::ArrayOf[String], nil?: true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Pangea
|
4
|
+
module Models
|
5
|
+
module AiGuard
|
6
|
+
class TextGuardMessageParam < Pangea::Internal::Type::BaseModel
|
7
|
+
# @!attribute role
|
8
|
+
#
|
9
|
+
# @return [String]
|
10
|
+
required :role, String
|
11
|
+
|
12
|
+
# @!attribute content
|
13
|
+
#
|
14
|
+
# @return [String]
|
15
|
+
required :content, String
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|