smart_rag 0.1.0 → 0.2.1

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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/.env.example +252 -0
  3. data/.rspec +2 -0
  4. data/AGENTS.md +33 -0
  5. data/API_DOCUMENTATION.md +828 -0
  6. data/CHANGELOG.md +16 -1
  7. data/ER-diagram.mmd +144 -0
  8. data/Gemfile +50 -0
  9. data/Gemfile.lock +398 -0
  10. data/Hybrid_Reranking.md +171 -0
  11. data/README.en.md +420 -28
  12. data/README.md +534 -63
  13. data/Rakefile +268 -0
  14. data/SETUP_GUIDE.md +650 -0
  15. data/SmartChunking.md +180 -0
  16. data/USAGE_EXAMPLES.md +1002 -0
  17. data/config/llm_config.yml +4 -2
  18. data/config/smart_rag.yml +45 -1
  19. data/config.ru +15 -0
  20. data/db/migrations/006_create_text_search_configs.rb +3 -2
  21. data/db/migrations/008_create_embeddings.rb +5 -4
  22. data/db/migrations/012_add_metadata_to_source_sections.rb +11 -0
  23. data/db/migrations/013_create_media_jobs.rb +25 -0
  24. data/db/migrations/014_add_media_job_operations_indexes.rb +11 -0
  25. data/db/migrations/015_add_media_leases_and_objects.rb +80 -0
  26. data/db/migrations/016_add_document_principals_and_staging_references.rb +38 -0
  27. data/db/migrations/017_add_media_job_request_fingerprint.rb +48 -0
  28. data/db/seeds/text_search_configs.sql +3 -3
  29. data/design.md +1057 -0
  30. data/docs/API_DOCUMENTATION.md +838 -0
  31. data/docs/DOCUMENTATION_INDEX.en.md +60 -0
  32. data/docs/DOCUMENTATION_INDEX.md +65 -0
  33. data/docs/FIX_SUMMARY.md +256 -0
  34. data/docs/FIX_SUMMARY_COMPLETE.md +273 -0
  35. data/docs/Hybrid_Reranking.md +171 -0
  36. data/docs/MIGRATION_GUIDE.md +151 -0
  37. data/docs/PERFORMANCE_GUIDE.md +58 -0
  38. data/docs/SETUP_GUIDE.md +659 -0
  39. data/docs/SmartChunking.md +180 -0
  40. data/docs/USAGE_EXAMPLES.md +1008 -0
  41. data/docs/design.md +1057 -0
  42. data/docs/evidence_pack.md +211 -0
  43. data/docs/requirements.md +376 -0
  44. data/docs/retrieval_plan.md +251 -0
  45. data/docs/smartrag_improvement_plan.md +201 -0
  46. data/docs/smartrag_refactor.md +216 -0
  47. data/docs/todo.md +931 -0
  48. data/examples/common.rb +1 -1
  49. data/exe/smart-rag-db +163 -0
  50. data/exe/smart-rag-media-worker +34 -0
  51. data/lib/smart_rag/config.rb +12 -0
  52. data/lib/smart_rag/core/document_processor.rb +80 -16
  53. data/lib/smart_rag/core/local_content_store.rb +51 -0
  54. data/lib/smart_rag/core/media_extractors.rb +140 -0
  55. data/lib/smart_rag/core/media_job_queue.rb +353 -0
  56. data/lib/smart_rag/core/media_metadata_extractor.rb +188 -0
  57. data/lib/smart_rag/core/media_object_registry.rb +79 -0
  58. data/lib/smart_rag/core/media_processor.rb +228 -0
  59. data/lib/smart_rag/core/media_safety_policy.rb +61 -0
  60. data/lib/smart_rag/core/s3_content_store.rb +78 -0
  61. data/lib/smart_rag/core/transcript_normalizer.rb +44 -0
  62. data/lib/smart_rag/core/video_semantic_extractor.rb +130 -0
  63. data/lib/smart_rag/http_access_policy.rb +86 -0
  64. data/lib/smart_rag/http_app.rb +188 -0
  65. data/lib/smart_rag/models/embedding.rb +1 -1
  66. data/lib/smart_rag/models/research_topic.rb +1 -1
  67. data/lib/smart_rag/models/research_topic_section.rb +5 -0
  68. data/lib/smart_rag/models/research_topic_tag.rb +5 -0
  69. data/lib/smart_rag/models/search_log.rb +1 -1
  70. data/lib/smart_rag/models/section_fts.rb +5 -0
  71. data/lib/smart_rag/models/section_tag.rb +5 -0
  72. data/lib/smart_rag/models/source_document.rb +1 -1
  73. data/lib/smart_rag/models/source_section.rb +1 -1
  74. data/lib/smart_rag/models/tag.rb +1 -1
  75. data/lib/smart_rag/models/text_search_config.rb +5 -0
  76. data/lib/smart_rag/retrieve.rb +72 -1
  77. data/lib/smart_rag/services/embedding_service.rb +1 -1
  78. data/lib/smart_rag/services/fulltext_search_service.rb +11 -13
  79. data/lib/smart_rag/services/hybrid_search_service.rb +15 -11
  80. data/lib/smart_rag/services/summarization_service.rb +1 -1
  81. data/lib/smart_rag/services/tag_service.rb +1 -1
  82. data/lib/smart_rag/version.rb +1 -1
  83. data/lib/smart_rag.rb +264 -30
  84. data/patch_language.rb +27 -0
  85. data/requirements.md +376 -0
  86. data/source_documents_export.json +11072 -0
  87. data/todo.md +931 -0
  88. data/workers/analyze_content.rb +6 -2
  89. data/workers/get_embedding.rb +1 -1
  90. metadata +151 -38
data/CHANGELOG.md CHANGED
@@ -1,8 +1,20 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.2.1 - 2026-09-15
4
+
5
+ ### Changed
6
+ - 升级 `smart_prompt` 依赖至 `~> 0.5.4`。
7
+
8
+ ## 0.2.0 - 2026-08-14
4
9
 
5
10
  ### Added
11
+ - 新增图片、音频、视频和通用媒体导入 API,以及可降级为 `partial` 的媒体元数据与语义提取。
12
+ - 新增 Rack HTTP 服务、Bearer 认证、principal 隔离和 PostgreSQL 配额控制。
13
+ - 新增 PostgreSQL 持久化媒体任务队列、取消/重试、heartbeat lease、卡死任务恢复和保留期清理。
14
+ - 新增本地与 S3/MinIO 内容寻址存储、对象引用计数和垃圾回收。
15
+ - 新增按 principal 隔离的幂等键与规范化请求指纹;冲突请求返回 `idempotency_conflict`。
16
+ - 新增数据库迁移 012-017,覆盖 section metadata、媒体任务、租约、对象引用、文档所有权和请求指纹。
17
+ - 新增 `smart-rag-media-worker` 可执行文件和 Rack `config.ru` 启动入口。
6
18
  - 新增 `retrieve(plan:)` 结构化检索入口(`RetrievalPlan -> EvidencePack`)。
7
19
  - 新增 `SmartRAG::Retrieve` 执行器:支持多 query、mode 映射、signals、provenance、stats、explain。
8
20
  - 新增索引治理接口:
@@ -22,6 +34,9 @@
22
34
  - `prepare_release_indexes(document_id: nil, dry_run: false)`
23
35
 
24
36
  ### Changed
37
+ - 文档、检索、统计和媒体任务 API 支持 principal 所有权过滤。
38
+ - 文档与 section metadata 在全文、混合和结构化检索结果中统一合并。
39
+ - URL 下载新增私网地址限制、主机白名单、重定向上限、超时和流式大小限制。
25
40
  - `retrieve` 现支持 `global_filters.source_type` 与 `global_filters.source_uri_prefix` 的执行过滤。
26
41
  - `retrieve` 新增 `global_filters.topic_ids` 的执行过滤(按 section-topic 关系过滤)。
27
42
  - `retrieve` 新增 `budget.diversity.by_source` 执行约束。
data/ER-diagram.mmd ADDED
@@ -0,0 +1,144 @@
1
+ erDiagram
2
+ %% Main tables - Core domain
3
+ source_documents {
4
+ integer id PK
5
+ varchar title "NOT NULL"
6
+ text url
7
+ varchar author
8
+ date publication_date
9
+ varchar language "DEFAULT 'en'"
10
+ text description
11
+ integer download_state "DEFAULT 0, NOT NULL"
12
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
13
+ timestamp updated_at "DEFAULT CURRENT_TIMESTAMP"
14
+ }
15
+
16
+ source_sections {
17
+ integer id PK
18
+ integer document_id FK "NOT NULL"
19
+ text content "NOT NULL"
20
+ varchar section_title
21
+ integer section_number "DEFAULT 0"
22
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
23
+ timestamp updated_at "DEFAULT CURRENT_TIMESTAMP"
24
+ }
25
+
26
+ tags {
27
+ integer id PK
28
+ varchar name "NOT NULL, UNIQUE"
29
+ integer parent_id FK
30
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
31
+ }
32
+
33
+ research_topics {
34
+ integer id PK
35
+ varchar name "NOT NULL"
36
+ text description
37
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
38
+ }
39
+
40
+ %% Many-to-many relationship tables
41
+ section_tags {
42
+ integer section_id PK,FK "NOT NULL"
43
+ integer tag_id PK,FK "NOT NULL"
44
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
45
+ }
46
+
47
+ research_topic_sections {
48
+ integer research_topic_id PK,FK "NOT NULL"
49
+ integer section_id PK,FK "NOT NULL"
50
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
51
+ }
52
+
53
+ research_topic_tags {
54
+ integer research_topic_id PK,FK "NOT NULL"
55
+ integer tag_id PK,FK "NOT NULL"
56
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
57
+ }
58
+
59
+ %% Full-text search optimized table
60
+ section_fts {
61
+ integer section_id PK,FK "NOT NULL"
62
+ integer document_id FK
63
+ text language "DEFAULT 'en'"
64
+ tsvector fts_title
65
+ tsvector fts_content
66
+ tsvector fts_combined
67
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
68
+ timestamp updated_at "DEFAULT CURRENT_TIMESTAMP"
69
+ }
70
+
71
+ %% Embeddings for vector search
72
+ embeddings {
73
+ integer id PK
74
+ integer source_id FK "NOT NULL"
75
+ vector(1024) vector "NOT NULL"
76
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
77
+ }
78
+
79
+ %% Search analytics and logs
80
+ search_logs {
81
+ integer id PK
82
+ text query "NOT NULL"
83
+ varchar search_type
84
+ integer execution_time_ms
85
+ integer results_count
86
+ vector(1024) query_vector
87
+ integer[] result_ids
88
+ jsonb filters
89
+ timestamp created_at "DEFAULT CURRENT_TIMESTAMP"
90
+ }
91
+
92
+ %% Configuration tables
93
+ text_search_configs {
94
+ text language_code PK "NOT NULL"
95
+ text config_name "NOT NULL"
96
+ boolean is_installed "DEFAULT true"
97
+ }
98
+
99
+ %% Database schema version tracking
100
+ schema_info {
101
+ integer version PK "NOT NULL"
102
+ }
103
+
104
+ %% Relationships
105
+ source_documents ||--o{ source_sections : "has many"
106
+ source_documents ||--o{ section_fts : "has many"
107
+ source_documents ||--o{ section_tags : "has many"
108
+ source_documents ||--o{ embeddings : "has many (via sections)"
109
+
110
+ source_sections }o--|| source_documents : "belongs to"
111
+ source_sections ||--o{ section_tags : "has many"
112
+ source_sections ||--o{ research_topic_sections : "has many"
113
+ source_sections ||--o{ embeddings : "has one"
114
+ source_sections ||--|| section_fts : "has one"
115
+
116
+ tags ||--o{ section_tags : "tags many sections"
117
+ tags ||--o{ research_topic_tags : "tags many topics"
118
+ tags }o--o{ tags : "self-referencing parent"
119
+
120
+ research_topics ||--o{ research_topic_sections : "has many sections"
121
+ research_topics ||--o{ research_topic_tags : "has many tags"
122
+
123
+ section_tags }o--|| source_sections : "section belongs to"
124
+ section_tags }o--|| tags : "tag belongs to"
125
+
126
+ research_topic_sections }o--|| research_topics : "topic belongs to"
127
+ research_topic_sections }o--|| source_sections : "section belongs to"
128
+
129
+ research_topic_tags }o--|| research_topics : "topic belongs to"
130
+ research_topic_tags }o--|| tags : "tag belongs to"
131
+
132
+ section_fts }o--|| source_sections : "section has FTS"
133
+ section_fts }o--|| source_documents : "document has FTS"
134
+
135
+ embeddings }o--|| source_sections : "embedding belongs to"
136
+
137
+ %% Indexes (not in Mermaid standard, but important for understanding)
138
+ %% All tables have appropriate indexes on PKs and FKs
139
+ %% source_documents: indexes on download_state, created_at, language
140
+ %% source_sections: indexes on document_id, section_number
141
+ %% section_tags: unique index on (section_id, tag_id)
142
+ %% section_fts: GIN indexes on tsvector columns
143
+ %% embeddings: index on source_id
144
+ %% search_logs: indexes on created_at, search_type, execution_time_ms
data/Gemfile ADDED
@@ -0,0 +1,50 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in smart_rag.gemspec
4
+ gemspec
5
+
6
+ gem "rake", "~> 13.0"
7
+ gem "rspec", "~> 3.0"
8
+ gem "minitest", "~> 5.0"
9
+
10
+ # Database dependencies
11
+ gem "sequel", "~> 5.0"
12
+ gem "pg", "~> 1.0"
13
+ gem "pgvector"
14
+
15
+ # HTTP client for API calls
16
+ gem "httparty", "~> 0.20"
17
+
18
+ # XML/HTML parsing
19
+ gem "nokogiri", "~> 1.0"
20
+
21
+ # Document conversion
22
+ gem "markitdown", "~> 0.1"
23
+
24
+ # Configuration
25
+ gem "yaml", "~> 0.2"
26
+
27
+ # LLM integration
28
+ gem "smart_prompt", "~> 0.5.4"
29
+ gem "numo-narray", github: "ruby-numo/numo-narray"
30
+
31
+ # Concurrent programming
32
+ gem "concurrent-ruby", "~> 1.0"
33
+
34
+ gem "dotenv", "~> 2.8"
35
+
36
+ # Development dependencies
37
+ group :development, :test do
38
+ gem "simplecov", "~> 0.21"
39
+ gem "rubocop", "~> 1.0"
40
+ gem "factory_bot", "~> 6.0"
41
+ gem "database_cleaner-sequel", "~> 2.0"
42
+ gem "faker", "~> 3.0"
43
+ gem "pry", "~> 0.14"
44
+ end
45
+
46
+ gem "rdbg", "~> 0.1.0"
47
+
48
+ gem "ostruct", "~> 0.6.3"
49
+
50
+ gem "benchmark", "~> 0.5.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,398 @@
1
+ GIT
2
+ remote: https://github.com/ruby-numo/numo-narray.git
3
+ revision: 95c05257349b954c027c2284834408736244662a
4
+ specs:
5
+ numo-narray (0.9.2.1)
6
+
7
+ PATH
8
+ remote: .
9
+ specs:
10
+ smart_rag (0.2.1)
11
+ aws-sdk-s3 (~> 1.0)
12
+ concurrent-ruby (~> 1.0)
13
+ dotenv (~> 2.8)
14
+ ostruct (~> 0.6)
15
+ pg (~> 1.0)
16
+ puma (>= 6.0, < 8)
17
+ rack (>= 2.2, < 4)
18
+ sequel (~> 5.0)
19
+ smart_prompt (~> 0.5.4)
20
+
21
+ GEM
22
+ remote: https://rubygems.org/
23
+ specs:
24
+ activemodel (8.1.2)
25
+ activesupport (= 8.1.2)
26
+ activerecord (8.1.2)
27
+ activemodel (= 8.1.2)
28
+ activesupport (= 8.1.2)
29
+ timeout (>= 0.4.0)
30
+ activesupport (8.1.2)
31
+ base64
32
+ bigdecimal
33
+ concurrent-ruby (~> 1.0, >= 1.3.1)
34
+ connection_pool (>= 2.2.5)
35
+ drb
36
+ i18n (>= 1.6, < 2)
37
+ json
38
+ logger (>= 1.4.2)
39
+ minitest (>= 5.1)
40
+ securerandom (>= 0.3)
41
+ tzinfo (~> 2.0, >= 2.0.5)
42
+ uri (>= 0.13.1)
43
+ addressable (2.8.9)
44
+ public_suffix (>= 2.0.2, < 8.0)
45
+ anthropic (1.70.0)
46
+ base64 (~> 0.1)
47
+ cgi (~> 0.1)
48
+ connection_pool (>= 2, < 4)
49
+ standardwebhooks (~> 1.0)
50
+ ast (2.4.3)
51
+ aws-eventstream (1.4.0)
52
+ aws-partitions (1.1280.0)
53
+ aws-sdk-core (3.254.1)
54
+ aws-eventstream (~> 1, >= 1.3.0)
55
+ aws-partitions (~> 1, >= 1.992.0)
56
+ aws-sigv4 (~> 1.9)
57
+ base64
58
+ bigdecimal
59
+ jmespath (~> 1, >= 1.6.1)
60
+ logger
61
+ aws-sdk-kms (1.130.0)
62
+ aws-sdk-core (~> 3, >= 3.254.0)
63
+ aws-sigv4 (~> 1.5)
64
+ aws-sdk-s3 (1.229.0)
65
+ aws-sdk-core (~> 3, >= 3.254.1)
66
+ aws-sdk-kms (~> 1)
67
+ aws-sigv4 (~> 1.5)
68
+ aws-sigv4 (1.12.1)
69
+ aws-eventstream (~> 1, >= 1.0.2)
70
+ base64 (0.3.0)
71
+ benchmark (0.5.0)
72
+ bigdecimal (4.0.1)
73
+ cgi (0.5.2)
74
+ childprocess (5.1.0)
75
+ logger (~> 1.5)
76
+ coderay (1.1.3)
77
+ concurrent-ruby (1.3.6)
78
+ connection_pool (3.0.2)
79
+ csv (3.3.5)
80
+ database_cleaner (2.1.0)
81
+ database_cleaner-active_record (>= 2, < 3)
82
+ database_cleaner-active_record (2.2.2)
83
+ activerecord (>= 5.a)
84
+ database_cleaner-core (~> 2.0)
85
+ database_cleaner-core (2.0.1)
86
+ database_cleaner-sequel (2.0.2)
87
+ database_cleaner-core (~> 2.0.0)
88
+ sequel
89
+ date (3.5.1)
90
+ debug (1.11.1)
91
+ irb (~> 1.10)
92
+ reline (>= 0.3.8)
93
+ diff-lcs (1.6.2)
94
+ docile (1.4.1)
95
+ dotenv (2.8.1)
96
+ drb (2.2.3)
97
+ erb (6.0.2)
98
+ event_stream_parser (1.0.0)
99
+ factory_bot (6.5.6)
100
+ activesupport (>= 6.1.0)
101
+ faker (3.6.1)
102
+ i18n (>= 1.8.11, < 2)
103
+ faraday (2.14.3)
104
+ faraday-net_http (>= 2.0, < 3.5)
105
+ json
106
+ logger
107
+ faraday-multipart (1.2.0)
108
+ multipart-post (~> 2.0)
109
+ faraday-net_http (3.4.4)
110
+ net-http (~> 0.5)
111
+ httparty (0.24.2)
112
+ csv
113
+ mini_mime (>= 1.0.0)
114
+ multi_xml (>= 0.5.2)
115
+ i18n (1.14.8)
116
+ concurrent-ruby (~> 1.0)
117
+ io-console (0.8.2)
118
+ irb (1.17.0)
119
+ pp (>= 0.6.0)
120
+ prism (>= 1.3.0)
121
+ rdoc (>= 4.0.0)
122
+ reline (>= 0.4.2)
123
+ jmespath (1.6.2)
124
+ json (2.19.9)
125
+ json-schema (6.2.0)
126
+ addressable (~> 2.8)
127
+ bigdecimal (>= 3.1, < 5)
128
+ language_server-protocol (3.17.0.5)
129
+ lint_roller (1.1.0)
130
+ logger (1.7.0)
131
+ markitdown (0.3.3)
132
+ nokogiri
133
+ mcp (0.8.0)
134
+ json-schema (>= 4.1)
135
+ method_source (1.1.0)
136
+ mini_mime (1.1.5)
137
+ minitest (5.27.0)
138
+ multi_xml (0.8.1)
139
+ bigdecimal (>= 3.1, < 5)
140
+ multipart-post (2.4.1)
141
+ net-http (0.9.1)
142
+ uri (>= 0.11.1)
143
+ nio4r (2.7.5)
144
+ nokogiri (1.19.1-x64-mingw-ucrt)
145
+ racc (~> 1.4)
146
+ nokogiri (1.19.1-x86_64-linux-gnu)
147
+ racc (~> 1.4)
148
+ ostruct (0.6.3)
149
+ parallel (1.27.0)
150
+ parser (3.3.10.2)
151
+ ast (~> 2.4.1)
152
+ racc
153
+ pg (1.6.3-x64-mingw-ucrt)
154
+ pg (1.6.3-x86_64-linux)
155
+ pgvector (0.3.2)
156
+ pp (0.6.3)
157
+ prettyprint
158
+ prettyprint (0.2.0)
159
+ prism (1.9.0)
160
+ pry (0.16.0)
161
+ coderay (~> 1.1)
162
+ method_source (~> 1.0)
163
+ reline (>= 0.6.0)
164
+ psych (5.3.1)
165
+ date
166
+ stringio
167
+ public_suffix (7.0.5)
168
+ puma (7.2.1)
169
+ nio4r (~> 2.0)
170
+ racc (1.8.1)
171
+ rack (3.2.7)
172
+ rainbow (3.1.1)
173
+ rake (13.3.1)
174
+ rdbg (0.1.0)
175
+ debug (>= 1.2.2)
176
+ rdoc (7.2.0)
177
+ erb
178
+ psych (>= 4.0.0)
179
+ tsort
180
+ regexp_parser (2.11.3)
181
+ reline (0.6.3)
182
+ io-console (~> 0.5)
183
+ retriable (3.1.2)
184
+ rspec (3.13.2)
185
+ rspec-core (~> 3.13.0)
186
+ rspec-expectations (~> 3.13.0)
187
+ rspec-mocks (~> 3.13.0)
188
+ rspec-core (3.13.6)
189
+ rspec-support (~> 3.13.0)
190
+ rspec-expectations (3.13.5)
191
+ diff-lcs (>= 1.2.0, < 2.0)
192
+ rspec-support (~> 3.13.0)
193
+ rspec-mocks (3.13.8)
194
+ diff-lcs (>= 1.2.0, < 2.0)
195
+ rspec-support (~> 3.13.0)
196
+ rspec-support (3.13.7)
197
+ rubocop (1.85.1)
198
+ json (~> 2.3)
199
+ language_server-protocol (~> 3.17.0.2)
200
+ lint_roller (~> 1.1.0)
201
+ mcp (~> 0.6)
202
+ parallel (~> 1.10)
203
+ parser (>= 3.3.0.2)
204
+ rainbow (>= 2.2.2, < 4.0)
205
+ regexp_parser (>= 2.9.3, < 3.0)
206
+ rubocop-ast (>= 1.49.0, < 2.0)
207
+ ruby-progressbar (~> 1.7)
208
+ unicode-display_width (>= 2.4.0, < 4.0)
209
+ rubocop-ast (1.49.0)
210
+ parser (>= 3.3.7.2)
211
+ prism (~> 1.7)
212
+ ruby-openai (8.3.0)
213
+ event_stream_parser (>= 0.3.0, < 2.0.0)
214
+ faraday (>= 1)
215
+ faraday-multipart (>= 1)
216
+ ruby-progressbar (1.13.0)
217
+ safe_ruby (1.0.5)
218
+ childprocess (~> 5)
219
+ securerandom (0.4.1)
220
+ sequel (5.102.0)
221
+ bigdecimal
222
+ simplecov (0.22.0)
223
+ docile (~> 1.1)
224
+ simplecov-html (~> 0.11)
225
+ simplecov_json_formatter (~> 0.1)
226
+ simplecov-html (0.13.2)
227
+ simplecov_json_formatter (0.1.4)
228
+ smart_prompt (0.5.4)
229
+ anthropic (~> 1.14)
230
+ base64 (~> 0.3.0)
231
+ json (~> 2.19.4)
232
+ numo-narray (~> 0.9.2.1)
233
+ retriable (~> 3.1.2)
234
+ ruby-openai (~> 8.3.0)
235
+ safe_ruby (~> 1.0.5)
236
+ tiktoken_ruby (~> 0.0.6)
237
+ yaml (~> 0.4.0)
238
+ standardwebhooks (1.1.0)
239
+ stringio (3.2.0)
240
+ tiktoken_ruby (0.0.17-x64-mingw-ucrt)
241
+ tiktoken_ruby (0.0.17-x86_64-linux)
242
+ timeout (0.6.0)
243
+ tsort (0.2.0)
244
+ tzinfo (2.0.6)
245
+ concurrent-ruby (~> 1.0)
246
+ unicode-display_width (3.2.0)
247
+ unicode-emoji (~> 4.1)
248
+ unicode-emoji (4.2.0)
249
+ uri (1.1.1)
250
+ yaml (0.4.0)
251
+
252
+ PLATFORMS
253
+ x64-mingw-ucrt
254
+ x86_64-linux
255
+
256
+ DEPENDENCIES
257
+ benchmark (~> 0.5.0)
258
+ bundler (~> 4.0)
259
+ concurrent-ruby (~> 1.0)
260
+ database_cleaner (~> 2.0)
261
+ database_cleaner-sequel (~> 2.0)
262
+ dotenv (~> 2.8)
263
+ factory_bot (~> 6.0)
264
+ faker (~> 3.0)
265
+ httparty (~> 0.20)
266
+ markitdown (~> 0.1)
267
+ minitest (~> 5.0)
268
+ nokogiri (~> 1.0)
269
+ numo-narray!
270
+ ostruct (~> 0.6.3)
271
+ pg (~> 1.0)
272
+ pgvector
273
+ pry (~> 0.14)
274
+ rake (~> 13.0)
275
+ rdbg (~> 0.1.0)
276
+ rspec (~> 3.0)
277
+ rubocop (~> 1.0)
278
+ sequel (~> 5.0)
279
+ simplecov (~> 0.21)
280
+ smart_prompt (~> 0.5.4)
281
+ smart_rag!
282
+ yaml (~> 0.2)
283
+
284
+ CHECKSUMS
285
+ activemodel (8.1.2) sha256=e21358c11ce68aed3f9838b7e464977bc007b4446c6e4059781e1d5c03bcf33e
286
+ activerecord (8.1.2) sha256=acfbe0cadfcc50fa208011fe6f4eb01cae682ebae0ef57145ba45380c74bcc44
287
+ activesupport (8.1.2) sha256=88842578ccd0d40f658289b0e8c842acfe9af751afee2e0744a7873f50b6fdae
288
+ addressable (2.8.9) sha256=cc154fcbe689711808a43601dee7b980238ce54368d23e127421753e46895485
289
+ anthropic (1.70.0) sha256=9ce99591e5037c2c65f5e0a9b322d496b9791a9751cd82f8dd639958a02d5703
290
+ ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383
291
+ aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b
292
+ aws-partitions (1.1280.0) sha256=4c5f5f0765603a738d6e212ae228ae6e5129696e907e4a2854c03d55ff9524bc
293
+ aws-sdk-core (3.254.1) sha256=518089e32134c3478cd4ec63d07fb966546a45e9e4cbf5f80d2cf16d5699d29b
294
+ aws-sdk-kms (1.130.0) sha256=a2e83662ca31b77a2a19c9aa2f40a98165a67270c18c718fe1c70d0cbd7cd749
295
+ aws-sdk-s3 (1.229.0) sha256=7dd11a111875b3505d2ec0a0a383a6aab6c1badb3d4e94e7fbb958a24451f596
296
+ aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00
297
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
298
+ benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
299
+ bigdecimal (4.0.1) sha256=8b07d3d065a9f921c80ceaea7c9d4ae596697295b584c296fe599dd0ad01c4a7
300
+ bundler (4.0.14) sha256=d09a0a965cf772266a7e49e83610be7c2f4e49e61134c42a56804bb383cc24b8
301
+ cgi (0.5.2) sha256=61ca30298171190fd4fa0d8018e57ada456eae9b7a2b78526debf7f0a0e6f8bb
302
+ childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec
303
+ coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b
304
+ concurrent-ruby (1.3.6) sha256=6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab
305
+ connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a
306
+ csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f
307
+ database_cleaner (2.1.0) sha256=1dcba26e3b1576da692fc6bac10136a4744da5bcc293d248aae19640c65d89cd
308
+ database_cleaner-active_record (2.2.2) sha256=88296b9f3088c31f7c0d4fcec10f68e4b71c96698043916de59b04debec10388
309
+ database_cleaner-core (2.0.1) sha256=8646574c32162e59ed7b5258a97a208d3c44551b854e510994f24683865d846c
310
+ database_cleaner-sequel (2.0.2) sha256=f1e6566a1a34d7425ff94b447e2c16181bc215555aff3dfe463b7977b621d4bf
311
+ date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
312
+ debug (1.11.1) sha256=2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6
313
+ diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
314
+ docile (1.4.1) sha256=96159be799bfa73cdb721b840e9802126e4e03dfc26863db73647204c727f21e
315
+ dotenv (2.8.1) sha256=c5944793349ae03c432e1780a2ca929d60b88c7d14d52d630db0508c3a8a17d8
316
+ drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373
317
+ erb (6.0.2) sha256=9fe6264d44f79422c87490a1558479bd0e7dad4dd0e317656e67ea3077b5242b
318
+ event_stream_parser (1.0.0) sha256=a2683bab70126286f8184dc88f7968ffc4028f813161fb073ec90d171f7de3c8
319
+ factory_bot (6.5.6) sha256=12beb373214dccc086a7a63763d6718c49769d5606f0501e0a4442676917e077
320
+ faker (3.6.1) sha256=c513d23c1d26b426283e913b25e0b714576011d7c1ad368a9ac6ea2113a1ccde
321
+ faraday (2.14.3) sha256=1882247e6766615c8220b4392bf1d27f6ebb63d8e28267587cef1fb0bf37f278
322
+ faraday-multipart (1.2.0) sha256=7d89a949693714176f612323ca13746a2ded204031a6ba528adee788694ef757
323
+ faraday-net_http (3.4.4) sha256=0e78af151747ed1b00f33e25973b4bc220d7f16c00c39676817c8b12331eb588
324
+ httparty (0.24.2) sha256=8fca6a54aa0c4aa4303a0fd33e5e2156175d6a5334f714263b458abd7fda9c38
325
+ i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5
326
+ io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
327
+ irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae
328
+ jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1
329
+ json (2.19.9) sha256=9b9025b7cdddafa38d316eca0b2358488e42d417045c1b90d216a9fefe46b79a
330
+ json-schema (6.2.0) sha256=e8bff46ed845a22c1ab2bd0d7eccf831c01fe23bb3920caa4c74db4306813666
331
+ language_server-protocol (3.17.0.5) sha256=fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc
332
+ lint_roller (1.1.0) sha256=2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87
333
+ logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203
334
+ markitdown (0.3.3) sha256=7f51293e19704a57ac1b15c4d5ad6b9780e73cc6af4a3f8b59fd6a14e43e8d26
335
+ mcp (0.8.0) sha256=ae8bd146bb8e168852866fd26f805f52744f6326afb3211e073f78a95e0c34fb
336
+ method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
337
+ mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
338
+ minitest (5.27.0) sha256=2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5
339
+ multi_xml (0.8.1) sha256=addba0290bac34e9088bfe73dc4878530297a82a7bbd66cb44dcd0a4b86edf5a
340
+ multipart-post (2.4.1) sha256=9872d03a8e552020ca096adadbf5e3cb1cd1cdd6acd3c161136b8a5737cdb4a8
341
+ net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996
342
+ nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
343
+ nokogiri (1.19.1-x64-mingw-ucrt) sha256=110d92ae57694ae7866670d298a5d04cd150fae5a6a7849957d66f171e6aec9b
344
+ nokogiri (1.19.1-x86_64-linux-gnu) sha256=1a4902842a186b4f901078e692d12257678e6133858d0566152fe29cdb98456a
345
+ numo-narray (0.9.2.1)
346
+ ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912
347
+ parallel (1.27.0) sha256=4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130
348
+ parser (3.3.10.2) sha256=6f60c84aa4bdcedb6d1a2434b738fe8a8136807b6adc8f7f53b97da9bc4e9357
349
+ pg (1.6.3-x64-mingw-ucrt) sha256=cdff974cbde6935e07b8f5cc3c2af7d320bc5263bde06acaae08302194ebf5e1
350
+ pg (1.6.3-x86_64-linux) sha256=5d9e188c8f7a0295d162b7b88a768d8452a899977d44f3274d1946d67920ae8d
351
+ pgvector (0.3.2) sha256=b47cbfb8dcc1aa7adcecc4d6583bd2a6bfff358dad56467488daf4f6efdef3b5
352
+ pp (0.6.3) sha256=2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6
353
+ prettyprint (0.2.0) sha256=2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193
354
+ prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
355
+ pry (0.16.0) sha256=d76c69065698ed1f85e717bd33d7942c38a50868f6b0673c636192b3d1b6054e
356
+ psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974
357
+ public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
358
+ puma (7.2.1) sha256=d7bf0e9cabd532e0d401e142cd94e3ac531e993610e2d80e6fbf9c26961414b0
359
+ racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
360
+ rack (3.2.7) sha256=93e13e1c24f93556671d85d2d79fa228c3485815c50d7e2f265b5330c6528fb7
361
+ rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
362
+ rake (13.3.1) sha256=8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c
363
+ rdbg (0.1.0) sha256=2111bd41521929e4f469e8b7c1d00b1b7f4d6ab421dd3158cd160a8dcab3ad86
364
+ rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192
365
+ regexp_parser (2.11.3) sha256=ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4
366
+ reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
367
+ retriable (3.1.2) sha256=0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0
368
+ rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587
369
+ rspec-core (3.13.6) sha256=a8823c6411667b60a8bca135364351dda34cd55e44ff94c4be4633b37d828b2d
370
+ rspec-expectations (3.13.5) sha256=33a4d3a1d95060aea4c94e9f237030a8f9eae5615e9bd85718fe3a09e4b58836
371
+ rspec-mocks (3.13.8) sha256=086ad3d3d17533f4237643de0b5c42f04b66348c28bf6b9c2d3f4a3b01af1d47
372
+ rspec-support (3.13.7) sha256=0640e5570872aafefd79867901deeeeb40b0c9875a36b983d85f54fb7381c47c
373
+ rubocop (1.85.1) sha256=3dbcf9e961baa4c376eeeb2a03913dca5e3987033b04d38fa538aa1e7406cc77
374
+ rubocop-ast (1.49.0) sha256=49c3676d3123a0923d333e20c6c2dbaaae2d2287b475273fddee0c61da9f71fd
375
+ ruby-openai (8.3.0) sha256=566dc279c42f4afed68a7a363dce2e594078abfc36b4e043102020b9a387ca69
376
+ ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
377
+ safe_ruby (1.0.5) sha256=ec43cd08da87b754c5ae741883f45d44e5d867deca9c46e01a70b6ff20c0bb20
378
+ securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1
379
+ sequel (5.102.0) sha256=c25bb85a44ae59b3ed41ca7c32c33316cf81a6fcaeabedb4036ba141dde70919
380
+ simplecov (0.22.0) sha256=fe2622c7834ff23b98066bb0a854284b2729a569ac659f82621fc22ef36213a5
381
+ simplecov-html (0.13.2) sha256=bd0b8e54e7c2d7685927e8d6286466359b6f16b18cb0df47b508e8d73c777246
382
+ simplecov_json_formatter (0.1.4) sha256=529418fbe8de1713ac2b2d612aa3daa56d316975d307244399fa4838c601b428
383
+ smart_prompt (0.5.4) sha256=81d5e052cf05d63051a68e946e0ba25bcd280dca5e43ce96664551a33656e5bc
384
+ smart_rag (0.2.1)
385
+ standardwebhooks (1.1.0) sha256=356ba711c14def4fb27310e4163b26bd5cccf325212c3440cabadd825e4be11f
386
+ stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1
387
+ tiktoken_ruby (0.0.17-x64-mingw-ucrt) sha256=8bd2f8e2c38ee9052a8cd4fc83fcb41362beb476d8885ac121125cd4dd065596
388
+ tiktoken_ruby (0.0.17-x86_64-linux) sha256=c5bfe3067b0d0776028be2112a18f9031d69ed250427a575a4a0b51a0507906b
389
+ timeout (0.6.0) sha256=6d722ad619f96ee383a0c557ec6eb8c4ecb08af3af62098a0be5057bf00de1af
390
+ tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
391
+ tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
392
+ unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
393
+ unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
394
+ uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6
395
+ yaml (0.4.0) sha256=240e69d1e6ce3584d6085978719a0faa6218ae426e034d8f9b02fb54d3471942
396
+
397
+ BUNDLED WITH
398
+ 4.0.14