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.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/.ignore +2 -0
  3. data/README.md +1 -0
  4. data/lib/pangea/client.rb +51 -0
  5. data/lib/pangea/errors.rb +113 -0
  6. data/lib/pangea/internal/transport/base_client.rb +346 -0
  7. data/lib/pangea/internal/transport/pooled_net_requester.rb +191 -0
  8. data/lib/pangea/internal/type/array_of.rb +119 -0
  9. data/lib/pangea/internal/type/base_model.rb +289 -0
  10. data/lib/pangea/internal/type/boolean.rb +44 -0
  11. data/lib/pangea/internal/type/converter.rb +228 -0
  12. data/lib/pangea/internal/type/hash_of.rb +166 -0
  13. data/lib/pangea/internal/type/request_parameters.rb +38 -0
  14. data/lib/pangea/internal/type/union.rb +66 -0
  15. data/lib/pangea/internal/type/unknown.rb +50 -0
  16. data/lib/pangea/internal/util.rb +429 -0
  17. data/lib/pangea/internal.rb +12 -0
  18. data/lib/pangea/models/ai_guard/classification_result.rb +33 -0
  19. data/lib/pangea/models/ai_guard/hardening_result.rb +27 -0
  20. data/lib/pangea/models/ai_guard/language_result.rb +20 -0
  21. data/lib/pangea/models/ai_guard/malicious_entity_result.rb +42 -0
  22. data/lib/pangea/models/ai_guard/prompt_injection_result.rb +33 -0
  23. data/lib/pangea/models/ai_guard/redact_entity_result.rb +43 -0
  24. data/lib/pangea/models/ai_guard/single_entity_result.rb +21 -0
  25. data/lib/pangea/models/ai_guard/text_guard_message_param.rb +19 -0
  26. data/lib/pangea/models/ai_guard/text_guard_params.rb +24 -0
  27. data/lib/pangea/models/ai_guard/text_guard_result.rb +308 -0
  28. data/lib/pangea/models/ai_guard/topic_result.rb +33 -0
  29. data/lib/pangea/models/pangea_response.rb +67 -0
  30. data/lib/pangea/request_options.rb +35 -0
  31. data/lib/pangea/services/ai_guard.rb +62 -0
  32. data/lib/pangea/version.rb +5 -0
  33. data/lib/pangea.rb +45 -0
  34. data/manifest.yaml +6 -0
  35. data/rbi/lib/pangea/client.rbi +25 -0
  36. data/rbi/lib/pangea/internal/internal.rbi +28 -0
  37. data/rbi/lib/pangea/internal/transport/base_client.rbi +18 -0
  38. data/rbi/lib/pangea/internal/type/array_of.rbi +66 -0
  39. data/rbi/lib/pangea/internal/type/base_model.rbi +33 -0
  40. data/rbi/lib/pangea/internal/type/boolean.rbi +46 -0
  41. data/rbi/lib/pangea/internal/type/converter.rbi +38 -0
  42. data/rbi/lib/pangea/internal/type/request_parameters.rbi +20 -0
  43. data/rbi/lib/pangea/internal/type/union.rbi +21 -0
  44. data/rbi/lib/pangea/internal/type/unknown.rbi +20 -0
  45. data/rbi/lib/pangea/internal.rbi +7 -0
  46. data/rbi/lib/pangea/models/ai_guard/text_guard_message_param.rbi +15 -0
  47. data/rbi/lib/pangea/models/ai_guard/text_guard_result.rbi +13 -0
  48. data/rbi/lib/pangea/models/pangea_response.rbi +31 -0
  49. data/rbi/lib/pangea/request_options.rbi +17 -0
  50. data/rbi/lib/pangea/services/ai_guard.rbi +28 -0
  51. data/rbi/lib/pangea/version.rbi +5 -0
  52. data/sig/pangea/client.rbs +12 -0
  53. data/sig/pangea/internal/transport/base_client.rbs +14 -0
  54. data/sig/pangea/internal/type/base_model.rbs +12 -0
  55. data/sig/pangea/internal/type/boolean.rbs +10 -0
  56. data/sig/pangea/internal/type/converter.rbs +9 -0
  57. data/sig/pangea/internal/type/request_parameters.rbs +15 -0
  58. data/sig/pangea/models/pangea_response.rbs +12 -0
  59. data/sig/pangea/models/text_guard_result.rbs +19 -0
  60. data/sig/pangea/request_options.rbs +34 -0
  61. data/sig/pangea/services/ai_guard.rbs +12 -0
  62. data/sig/pangea/version.rbs +3 -0
  63. 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,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Pangea
4
+ # @api private
5
+ module Internal
6
+ OMIT =
7
+ Object.new.tap do
8
+ _1.define_singleton_method(:inspect) { "#<#{Pangea::Internal}::OMIT>" }
9
+ end
10
+ .freeze
11
+ end
12
+ 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