Skip to content

Commit 57554ae

Browse files
✨ add support for RAG metadata and better errors (#215)
1 parent c95f455 commit 57554ae

15 files changed

+356
-142
lines changed

lib/mindee/errors/mindee_http_error_v2.rb

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,44 @@
11
# frozen_string_literal: true
22

33
require_relative 'mindee_error'
4+
require_relative '../parsing/v2/error_item'
45

56
module Mindee
67
module Errors
78
# API V2 HttpError
89
class MindeeHTTPErrorV2 < MindeeError
9-
# @return [Integer]
10+
# @return [Integer] The HTTP status code returned by the server.
1011
attr_reader :status
11-
# @return [String]
12+
# @return [String] A human-readable explanation specific to the occurrence of the problem.
1213
attr_reader :detail
14+
# @return [String] A short, human-readable summary of the problem.
15+
attr_reader :title
16+
# @return [String] A machine-readable code specific to the occurrence of the problem.
17+
attr_reader :code
18+
# @return [Array<ErrorItem>] A list of explicit error details.
19+
attr_reader :errors
1320

1421
# @param http_error [Hash, Parsing::V2::ErrorResponse]
1522
def initialize(http_error)
1623
if http_error.is_a?(Parsing::V2::ErrorResponse)
1724
http_error = { 'detail' => http_error.detail,
18-
'status' => http_error.status }
25+
'status' => http_error.status,
26+
'title' => http_error.title,
27+
'code' => http_error.code,
28+
'errors' => http_error.errors }
1929
end
2030
@status = http_error['status']
2131
@detail = http_error['detail']
22-
super("HTTP error: #{@status} - #{@detail}")
32+
@title = http_error['title']
33+
@code = http_error['code']
34+
@errors = if http_error.key?('errors')
35+
http_error['errors'].map do |error|
36+
Parsing::V2::ErrorItem.new(error)
37+
end
38+
else
39+
[]
40+
end
41+
super("HTTP #{@status} - #{@title} :: #{@code} - #{@detail}")
2342
end
2443
end
2544
end
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# frozen_string_literal: true
2+
3+
require_relative 'mindee_error'
4+
5+
module Mindee
6+
module Errors
7+
# Unknown HTTP error for the V2 API.
8+
class MindeeHTTPUnknownErrorV2 < MindeeHTTPErrorV2
9+
def initialize(http_error)
10+
super({ 'detail' => "Couldn't deserialize server error. Found: #{http_error}",
11+
'status' => -1,
12+
'title' => 'Unknown Error',
13+
'code' => '000-000',
14+
'errors' => nil })
15+
end
16+
end
17+
end
18+
end
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# frozen_string_literal: true
2+
3+
module Mindee
4+
module Parsing
5+
module V2
6+
# Individual error item.
7+
class ErrorItem
8+
# @return [String, nil] A JSON Pointer to the location of the body property.
9+
attr_reader :pointer
10+
# @return [String, nil] Explicit information on the issue.
11+
attr_reader :detail
12+
13+
# @param server_response [Hash] Raw JSON parsed into a Hash.
14+
def initialize(server_response)
15+
@pointer = server_response['pointer']
16+
@detail = server_response['detail']
17+
end
18+
end
19+
end
20+
end
21+
end

lib/mindee/parsing/v2/error_response.rb

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,36 @@ module Parsing
55
module V2
66
# Encapsulates information returned by the API when an error occurs.
77
class ErrorResponse
8-
# @return [Integer] HTTP status code.
8+
# @return [Integer] The HTTP status code returned by the server.
99
attr_reader :status
10-
# @return [String] Error detail.
10+
# @return [String] A human-readable explanation specific to the occurrence of the problem.
1111
attr_reader :detail
12+
# @return [String] A short, human-readable summary of the problem.
13+
attr_reader :title
14+
# @return [String] A machine-readable code specific to the occurrence of the problem.
15+
attr_reader :code
16+
# @return [Array<ErrorItem>] A list of explicit error details.
17+
attr_reader :errors
1218

1319
# @param server_response [Hash] Raw JSON parsed into a Hash.
1420
def initialize(server_response)
1521
@status = server_response['status']
1622
@detail = server_response['detail']
23+
@title = server_response['title']
24+
@code = server_response['code']
25+
@errors = if server_response.key?('errors')
26+
server_response['errors'].map do |error|
27+
ErrorItem.new(error)
28+
end
29+
else
30+
[]
31+
end
1732
end
1833

1934
# String representation.
2035
# @return [String]
2136
def to_s
22-
"Error\n=====\n:Status: #{@status}\n:Detail: #{@detail}"
37+
"HTTP #{@status} - #{@title} :: #{@code} - #{@detail}"
2338
end
2439

2540
# Hash representation

lib/mindee/parsing/v2/inference_result.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
require_relative 'field/inference_fields'
44
require_relative 'raw_text'
5+
require_relative 'rag_metadata'
56

67
module Mindee
78
module Parsing
@@ -12,6 +13,8 @@ class InferenceResult
1213
attr_reader :fields
1314
# @return [Mindee::Parsing::V2::RawText, nil] Optional extra data.
1415
attr_reader :raw_text
16+
# @return [Mindee::Parsing::V2::RAGMetadata, nil] Optional RAG metadata.
17+
attr_reader :rag
1518

1619
# @param server_response [Hash] Hash version of the JSON returned by the API.
1720
def initialize(server_response)
@@ -20,6 +23,7 @@ def initialize(server_response)
2023
@fields = Field::InferenceFields.new(server_response['fields'])
2124

2225
@raw_text = server_response['raw_text'] ? RawText.new(server_response['raw_text']) : nil
26+
@rag = (V2::RAGMetadata.new(server_response['rag']) if server_response.key?('rag') && server_response['rag'])
2327
end
2428

2529
# String representation.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# frozen_string_literal: true
2+
3+
module Mindee
4+
module Parsing
5+
module V2
6+
# Metadata about the RAG operation.
7+
class RAGMetadata
8+
# The UUID of the matched document used during the RAG operation.
9+
attr_accessor :retrieved_document_id
10+
11+
def initialize(server_response)
12+
@retrieved_document_id = server_response.fetch('retrieved_document_id', nil)
13+
end
14+
end
15+
end
16+
end
17+
end

sig/mindee/errors/mindee_http_error_v2.rbs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ module Mindee
33
module Errors
44
# API V2 HttpError
55
class MindeeHTTPErrorV2 < MindeeError
6-
76
attr_reader detail: String
87
attr_reader status: Integer
8+
attr_reader code: String
9+
attr_reader title: String
10+
attr_reader errors: Array[Parsing::V2::ErrorItem]
11+
912
def initialize: (Hash[String, untyped] | Parsing::V2::ErrorResponse) -> void
1013
end
1114
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# lib/mindee/errors/mindee_http_unknown_error_v2.rb
2+
module Mindee
3+
module Errors
4+
# Unknown HTTP error for the V2 API.
5+
class MindeeHTTPUnknownErrorV2 < MindeeHTTPErrorV2
6+
def initialize: (Hash[String|Symbol, untyped]) -> void
7+
end
8+
end
9+
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# lib/mindee/parsing/v2/error_item.rb
2+
module Mindee
3+
module Parsing
4+
module V2
5+
class ErrorItem
6+
attr_reader pointer: String
7+
attr_reader detail: String|nil
8+
9+
def initialize: (Hash[String|Symbol, untyped]) -> void
10+
end
11+
end
12+
end
13+
end

sig/mindee/parsing/v2/error_response.rbs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ module Mindee
55
class ErrorResponse
66
attr_reader detail: String
77
attr_reader status: Integer
8+
attr_reader code: String
9+
attr_reader title: String
10+
attr_reader errors: Array[ErrorItem]
811
def initialize: (Hash[String | Symbol, untyped]) -> void
912

1013
def as_hash: -> Hash[Symbol, String | Integer]

0 commit comments

Comments
 (0)