docsmind 0.3.0__tar.gz → 0.6.0__tar.gz

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 (503) hide show
  1. {docsmind-0.3.0 → docsmind-0.6.0}/CHANGELOG.md +76 -0
  2. {docsmind-0.3.0 → docsmind-0.6.0}/PKG-INFO +89 -19
  3. {docsmind-0.3.0 → docsmind-0.6.0}/README.md +86 -18
  4. {docsmind-0.3.0 → docsmind-0.6.0}/pyproject.toml +2 -1
  5. docsmind-0.6.0/src/docsmind/adapters/embeddings/__init__.py +22 -0
  6. docsmind-0.6.0/src/docsmind/adapters/embeddings/openai_embeddings.py +79 -0
  7. docsmind-0.6.0/src/docsmind/adapters/llm/__init__.py +31 -0
  8. docsmind-0.6.0/src/docsmind/adapters/llm/anthropic_llm.py +152 -0
  9. docsmind-0.6.0/src/docsmind/adapters/llm/openai_llm.py +182 -0
  10. docsmind-0.6.0/src/docsmind/adapters/storage/memory.py +83 -0
  11. docsmind-0.6.0/src/docsmind/adapters/storage/postgres/agent_store.py +190 -0
  12. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/adapters/storage/postgres/repository.py +356 -11
  13. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/adapters/storage/postgres/tables.py +37 -0
  14. docsmind-0.6.0/src/docsmind/adapters/vision/__init__.py +29 -0
  15. docsmind-0.6.0/src/docsmind/adapters/vision/captioners.py +114 -0
  16. docsmind-0.6.0/src/docsmind/agent/agent.py +517 -0
  17. docsmind-0.6.0/src/docsmind/agent/catalog.py +85 -0
  18. docsmind-0.6.0/src/docsmind/agent/harness/__init__.py +2 -0
  19. docsmind-0.6.0/src/docsmind/agent/harness/context.py +154 -0
  20. docsmind-0.6.0/src/docsmind/agent/harness/memory.py +119 -0
  21. docsmind-0.6.0/src/docsmind/agent/harness/summarizer.py +67 -0
  22. docsmind-0.6.0/src/docsmind/agent/harness/tokens.py +36 -0
  23. docsmind-0.6.0/src/docsmind/agent/loop.py +131 -0
  24. docsmind-0.6.0/src/docsmind/agent/orchestrator.py +41 -0
  25. docsmind-0.6.0/src/docsmind/agent/planner.py +38 -0
  26. docsmind-0.6.0/src/docsmind/agent/prompts.py +93 -0
  27. docsmind-0.6.0/src/docsmind/agent/sources.py +95 -0
  28. docsmind-0.6.0/src/docsmind/agent/subagents/specs.py +44 -0
  29. docsmind-0.6.0/src/docsmind/agent/tools/__init__.py +25 -0
  30. docsmind-0.6.0/src/docsmind/agent/tools/base.py +150 -0
  31. docsmind-0.6.0/src/docsmind/agent/tools/delegate.py +49 -0
  32. docsmind-0.6.0/src/docsmind/agent/tools/documents.py +112 -0
  33. docsmind-0.6.0/src/docsmind/agent/tools/search.py +140 -0
  34. docsmind-0.6.0/src/docsmind/agent/util.py +53 -0
  35. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/cli/app.py +3 -0
  36. docsmind-0.6.0/src/docsmind/cli/chat.py +44 -0
  37. docsmind-0.6.0/src/docsmind/cli/enrich.py +95 -0
  38. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/client.py +44 -5
  39. docsmind-0.6.0/src/docsmind/config.py +84 -0
  40. docsmind-0.6.0/src/docsmind/domain/agent.py +147 -0
  41. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/domain/citations.py +5 -0
  42. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/domain/errors.py +27 -0
  43. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/domain/ports.py +63 -6
  44. docsmind-0.6.0/src/docsmind/enrichment/__init__.py +9 -0
  45. docsmind-0.6.0/src/docsmind/enrichment/pricing.py +192 -0
  46. docsmind-0.6.0/src/docsmind/enrichment/service.py +331 -0
  47. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/ingestion/parsers/pdf.py +3 -0
  48. docsmind-0.6.0/src/docsmind/retrieval/fusion.py +31 -0
  49. docsmind-0.6.0/src/docsmind/retrieval/hybrid.py +45 -0
  50. docsmind-0.6.0/src/docsmind/retrieval/keyword.py +48 -0
  51. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/server/app.py +4 -2
  52. docsmind-0.6.0/src/docsmind/server/jobs.py +119 -0
  53. docsmind-0.6.0/src/docsmind/server/routes/chat.py +161 -0
  54. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/server/routes/documents.py +11 -1
  55. docsmind-0.6.0/src/docsmind/server/routes/enrichment.py +94 -0
  56. docsmind-0.6.0/src/docsmind/server/ui/assets/index-CqXag2rP.js +5425 -0
  57. docsmind-0.6.0/src/docsmind/server/ui/assets/index-QYKdGecG.css +1 -0
  58. docsmind-0.6.0/src/docsmind/server/ui/favicon.svg +1 -0
  59. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/server/ui/index.html +3 -3
  60. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/LICENSE +177 -0
  61. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-H.bcmap +0 -0
  62. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-EUC-V.bcmap +0 -0
  63. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-H.bcmap +0 -0
  64. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-H.bcmap +0 -0
  65. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-RKSJ-V.bcmap +0 -0
  66. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/78-V.bcmap +0 -0
  67. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap +0 -0
  68. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap +0 -0
  69. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap +0 -0
  70. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap +0 -0
  71. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap +0 -0
  72. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap +0 -0
  73. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap +0 -0
  74. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap +0 -0
  75. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap +0 -0
  76. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Add-H.bcmap +0 -0
  77. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-H.bcmap +0 -0
  78. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Add-RKSJ-V.bcmap +0 -0
  79. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Add-V.bcmap +0 -0
  80. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap +0 -0
  81. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap +0 -0
  82. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap +0 -0
  83. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap +0 -0
  84. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap +0 -0
  85. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap +0 -0
  86. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap +0 -0
  87. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap +0 -0
  88. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-0.bcmap +0 -0
  89. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-1.bcmap +0 -0
  90. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-2.bcmap +0 -0
  91. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-3.bcmap +0 -0
  92. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-4.bcmap +0 -0
  93. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-5.bcmap +0 -0
  94. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap +0 -0
  95. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap +0 -0
  96. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap +0 -0
  97. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap +0 -0
  98. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap +0 -0
  99. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap +0 -0
  100. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap +0 -0
  101. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap +0 -0
  102. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap +0 -0
  103. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap +0 -0
  104. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap +0 -0
  105. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap +0 -0
  106. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap +0 -0
  107. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/B5-H.bcmap +0 -0
  108. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/B5-V.bcmap +0 -0
  109. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-H.bcmap +0 -0
  110. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/B5pc-V.bcmap +0 -0
  111. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-H.bcmap +0 -0
  112. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS-EUC-V.bcmap +0 -0
  113. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-H.bcmap +0 -0
  114. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS1-V.bcmap +0 -0
  115. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-H.bcmap +0 -0
  116. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/CNS2-V.bcmap +3 -0
  117. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-H.bcmap +0 -0
  118. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETHK-B5-V.bcmap +0 -0
  119. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-H.bcmap +0 -0
  120. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETen-B5-V.bcmap +0 -0
  121. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-H.bcmap +3 -0
  122. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/ETenms-B5-V.bcmap +0 -0
  123. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-H.bcmap +0 -0
  124. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/EUC-V.bcmap +0 -0
  125. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-H.bcmap +0 -0
  126. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap +0 -0
  127. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap +0 -0
  128. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Ext-V.bcmap +0 -0
  129. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-H.bcmap +0 -0
  130. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GB-EUC-V.bcmap +0 -0
  131. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GB-H.bcmap +4 -0
  132. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GB-V.bcmap +0 -0
  133. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-H.bcmap +0 -0
  134. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBK-EUC-V.bcmap +0 -0
  135. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-H.bcmap +0 -0
  136. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBK2K-V.bcmap +0 -0
  137. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-H.bcmap +0 -0
  138. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBKp-EUC-V.bcmap +0 -0
  139. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-H.bcmap +0 -0
  140. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-EUC-V.bcmap +0 -0
  141. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-H.bcmap +0 -0
  142. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBT-V.bcmap +0 -0
  143. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap +0 -0
  144. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap +0 -0
  145. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-H.bcmap +0 -0
  146. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/GBpc-EUC-V.bcmap +0 -0
  147. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/H.bcmap +0 -0
  148. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-H.bcmap +0 -0
  149. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKdla-B5-V.bcmap +0 -0
  150. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-H.bcmap +0 -0
  151. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKdlb-B5-V.bcmap +0 -0
  152. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-H.bcmap +0 -0
  153. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKgccs-B5-V.bcmap +0 -0
  154. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-H.bcmap +0 -0
  155. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKm314-B5-V.bcmap +0 -0
  156. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-H.bcmap +0 -0
  157. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKm471-B5-V.bcmap +0 -0
  158. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-H.bcmap +0 -0
  159. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/HKscs-B5-V.bcmap +0 -0
  160. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Hankaku.bcmap +0 -0
  161. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Hiragana.bcmap +0 -0
  162. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-H.bcmap +0 -0
  163. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-EUC-V.bcmap +0 -0
  164. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-H.bcmap +0 -0
  165. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-H.bcmap +0 -0
  166. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-Johab-V.bcmap +0 -0
  167. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSC-V.bcmap +0 -0
  168. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-H.bcmap +0 -0
  169. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap +0 -0
  170. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap +0 -0
  171. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCms-UHC-V.bcmap +0 -0
  172. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap +0 -0
  173. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap +0 -0
  174. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Katakana.bcmap +0 -0
  175. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/LICENSE +36 -0
  176. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-H.bcmap +0 -0
  177. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/NWP-V.bcmap +0 -0
  178. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-H.bcmap +0 -0
  179. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/RKSJ-V.bcmap +0 -0
  180. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/Roman.bcmap +0 -0
  181. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap +0 -0
  182. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap +0 -0
  183. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap +0 -0
  184. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap +0 -0
  185. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap +0 -0
  186. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap +0 -0
  187. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap +0 -0
  188. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap +0 -0
  189. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap +0 -0
  190. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap +0 -0
  191. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap +0 -0
  192. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap +0 -0
  193. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap +0 -0
  194. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap +0 -0
  195. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap +0 -0
  196. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap +0 -0
  197. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap +0 -0
  198. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap +0 -0
  199. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap +0 -0
  200. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap +0 -0
  201. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap +0 -0
  202. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap +0 -0
  203. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap +0 -0
  204. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap +0 -0
  205. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap +0 -0
  206. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap +0 -0
  207. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap +0 -0
  208. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap +0 -0
  209. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap +0 -0
  210. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap +0 -0
  211. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap +0 -0
  212. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap +0 -0
  213. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap +0 -0
  214. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap +0 -0
  215. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap +0 -0
  216. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap +0 -0
  217. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap +0 -0
  218. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap +0 -0
  219. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap +0 -0
  220. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap +0 -0
  221. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap +0 -0
  222. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap +0 -0
  223. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap +0 -0
  224. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap +0 -0
  225. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap +0 -0
  226. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap +0 -0
  227. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap +0 -0
  228. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/V.bcmap +0 -0
  229. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/cmaps/WP-Symbol.bcmap +0 -0
  230. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/iccs/CGATS001Compat-v2-micro.icc +0 -0
  231. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/iccs/LICENSE +116 -0
  232. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/altText_add.svg +3 -0
  233. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/altText_disclaimer.svg +3 -0
  234. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/altText_done.svg +3 -0
  235. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/altText_spinner.svg +30 -0
  236. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/altText_warning.svg +3 -0
  237. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-check.svg +11 -0
  238. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-comment.svg +16 -0
  239. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-help.svg +26 -0
  240. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-insert.svg +10 -0
  241. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-key.svg +11 -0
  242. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-newparagraph.svg +11 -0
  243. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-noicon.svg +7 -0
  244. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-note.svg +42 -0
  245. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-paperclip.svg +6 -0
  246. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-paragraph.svg +16 -0
  247. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/annotation-pushpin.svg +7 -0
  248. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/checkmark.svg +5 -0
  249. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/comment-actionsButton.svg +3 -0
  250. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/comment-closeButton.svg +3 -0
  251. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/comment-editButton.svg +8 -0
  252. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/comment-popup-editButton.svg +5 -0
  253. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeHighlight.svg +6 -0
  254. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/cursor-editorFreeText.svg +3 -0
  255. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/cursor-editorInk.svg +4 -0
  256. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/cursor-editorTextHighlight.svg +8 -0
  257. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-delete.svg +5 -0
  258. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/editor-toolbar-edit.svg +3 -0
  259. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/findbarButton-next.svg +3 -0
  260. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/findbarButton-previous.svg +3 -0
  261. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/gv-toolbarButton-download.svg +3 -0
  262. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/loading-icon.gif +0 -0
  263. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/loading.svg +1 -0
  264. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/messageBar_closingButton.svg +3 -0
  265. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/messageBar_info.svg +3 -0
  266. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/messageBar_warning.svg +3 -0
  267. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/pages_closeButton.svg +3 -0
  268. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/pages_selected.svg +7 -0
  269. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/pages_viewArrow.svg +3 -0
  270. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/pages_viewButton.svg +3 -0
  271. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-documentProperties.svg +3 -0
  272. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-firstPage.svg +3 -0
  273. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-handTool.svg +3 -0
  274. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-lastPage.svg +3 -0
  275. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCcw.svg +3 -0
  276. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-rotateCw.svg +3 -0
  277. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.svg +3 -0
  278. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollPage.svg +3 -0
  279. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollVertical.svg +3 -0
  280. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.svg +3 -0
  281. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-selectTool.svg +3 -0
  282. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadEven.svg +3 -0
  283. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadNone.svg +3 -0
  284. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/secondaryToolbarButton-spreadOdd.svg +3 -0
  285. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/signature-properties-row-check.svg +4 -0
  286. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-bookmark.svg +3 -0
  287. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-currentOutlineItem.svg +3 -0
  288. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-download.svg +4 -0
  289. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorFreeText.svg +5 -0
  290. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorHighlight.svg +6 -0
  291. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorInk.svg +4 -0
  292. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorSignature.svg +6 -0
  293. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-editorStamp.svg +8 -0
  294. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrow.svg +3 -0
  295. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-menuArrowNova.svg +3 -0
  296. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-openFile.svg +3 -0
  297. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageDown.svg +3 -0
  298. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-pageUp.svg +3 -0
  299. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-presentationMode.svg +3 -0
  300. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-print.svg +3 -0
  301. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-search.svg +3 -0
  302. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.svg +3 -0
  303. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesError.svg +7 -0
  304. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-signaturePropertiesVerified.svg +7 -0
  305. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewAttachments.svg +3 -0
  306. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewLayers.svg +3 -0
  307. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewOutline.svg +3 -0
  308. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewThumbnail.svg +3 -0
  309. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-viewsManagerToggle.svg +3 -0
  310. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomIn.svg +3 -0
  311. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/toolbarButton-zoomOut.svg +3 -0
  312. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/treeitem-collapsed.svg +1 -0
  313. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/images/treeitem-expanded.svg +1 -0
  314. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ach/viewer.ftl +184 -0
  315. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/af/viewer.ftl +163 -0
  316. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/an/viewer.ftl +207 -0
  317. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ar/viewer.ftl +807 -0
  318. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ast/viewer.ftl +156 -0
  319. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/az/viewer.ftl +207 -0
  320. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/be/viewer.ftl +822 -0
  321. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/bg/viewer.ftl +392 -0
  322. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/bn/viewer.ftl +202 -0
  323. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/bo/viewer.ftl +206 -0
  324. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/bqi/viewer.ftl +307 -0
  325. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/br/viewer.ftl +299 -0
  326. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/brx/viewer.ftl +175 -0
  327. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/bs/viewer.ftl +560 -0
  328. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ca/viewer.ftl +563 -0
  329. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/cak/viewer.ftl +243 -0
  330. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ckb/viewer.ftl +198 -0
  331. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/cs/viewer.ftl +836 -0
  332. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/cy/viewer.ftl +864 -0
  333. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/da/viewer.ftl +711 -0
  334. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/de/viewer.ftl +808 -0
  335. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/dsb/viewer.ftl +836 -0
  336. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/el/viewer.ftl +808 -0
  337. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/en-CA/viewer.ftl +808 -0
  338. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/en-GB/viewer.ftl +808 -0
  339. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/en-US/viewer.ftl +873 -0
  340. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/eo/viewer.ftl +808 -0
  341. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/es-AR/viewer.ftl +808 -0
  342. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/es-CL/viewer.ftl +808 -0
  343. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/es-ES/viewer.ftl +783 -0
  344. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/es-MX/viewer.ftl +720 -0
  345. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/et/viewer.ftl +221 -0
  346. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/eu/viewer.ftl +812 -0
  347. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/fa/viewer.ftl +808 -0
  348. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ff/viewer.ftl +206 -0
  349. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/fi/viewer.ftl +808 -0
  350. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/fr/viewer.ftl +804 -0
  351. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/fur/viewer.ftl +620 -0
  352. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/fy-NL/viewer.ftl +808 -0
  353. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ga-IE/viewer.ftl +164 -0
  354. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/gd/viewer.ftl +245 -0
  355. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/gl/viewer.ftl +563 -0
  356. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/gn/viewer.ftl +788 -0
  357. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/gu-IN/viewer.ftl +206 -0
  358. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/he/viewer.ftl +808 -0
  359. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/hi-IN/viewer.ftl +205 -0
  360. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/hr/viewer.ftl +695 -0
  361. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/hsb/viewer.ftl +836 -0
  362. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/hu/viewer.ftl +808 -0
  363. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/hy-AM/viewer.ftl +618 -0
  364. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/hye/viewer.ftl +221 -0
  365. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ia/viewer.ftl +808 -0
  366. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/id/viewer.ftl +561 -0
  367. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/is/viewer.ftl +544 -0
  368. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/it/viewer.ftl +808 -0
  369. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ja/viewer.ftl +752 -0
  370. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ka/viewer.ftl +808 -0
  371. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/kab/viewer.ftl +599 -0
  372. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/kk/viewer.ftl +808 -0
  373. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/km/viewer.ftl +222 -0
  374. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/kn/viewer.ftl +166 -0
  375. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ko/viewer.ftl +752 -0
  376. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/lij/viewer.ftl +206 -0
  377. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/lo/viewer.ftl +245 -0
  378. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/locale.json +1 -0
  379. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/lt/viewer.ftl +221 -0
  380. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ltg/viewer.ftl +205 -0
  381. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/lv/viewer.ftl +269 -0
  382. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/meh/viewer.ftl +48 -0
  383. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/mk/viewer.ftl +719 -0
  384. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ml/viewer.ftl +489 -0
  385. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/mr/viewer.ftl +194 -0
  386. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ms/viewer.ftl +206 -0
  387. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/my/viewer.ftl +157 -0
  388. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/nb-NO/viewer.ftl +808 -0
  389. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ne-NP/viewer.ftl +185 -0
  390. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/nl/viewer.ftl +808 -0
  391. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/nn-NO/viewer.ftl +808 -0
  392. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/oc/viewer.ftl +372 -0
  393. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/pa-IN/viewer.ftl +808 -0
  394. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/pl/viewer.ftl +821 -0
  395. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/pt-BR/viewer.ftl +808 -0
  396. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/pt-PT/viewer.ftl +808 -0
  397. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/rm/viewer.ftl +611 -0
  398. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ro/viewer.ftl +822 -0
  399. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ru/viewer.ftl +822 -0
  400. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/sat/viewer.ftl +257 -0
  401. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/sc/viewer.ftl +442 -0
  402. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/scn/viewer.ftl +32 -0
  403. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/sco/viewer.ftl +217 -0
  404. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/si/viewer.ftl +214 -0
  405. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/sk/viewer.ftl +836 -0
  406. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/skr/viewer.ftl +437 -0
  407. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/sl/viewer.ftl +836 -0
  408. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/son/viewer.ftl +157 -0
  409. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/sq/viewer.ftl +707 -0
  410. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/sr/viewer.ftl +822 -0
  411. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/sv-SE/viewer.ftl +808 -0
  412. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/szl/viewer.ftl +207 -0
  413. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ta/viewer.ftl +182 -0
  414. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/te/viewer.ftl +196 -0
  415. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/tg/viewer.ftl +713 -0
  416. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/th/viewer.ftl +687 -0
  417. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/tl/viewer.ftl +207 -0
  418. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/tr/viewer.ftl +808 -0
  419. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/trs/viewer.ftl +160 -0
  420. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/uk/viewer.ftl +699 -0
  421. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/ur/viewer.ftl +206 -0
  422. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/uz/viewer.ftl +140 -0
  423. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/vi/viewer.ftl +752 -0
  424. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/wo/viewer.ftl +93 -0
  425. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/xh/viewer.ftl +163 -0
  426. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/zh-CN/viewer.ftl +733 -0
  427. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/locale/zh-TW/viewer.ftl +752 -0
  428. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitDingbats.pfb +0 -0
  429. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixed.pfb +0 -0
  430. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBold.pfb +0 -0
  431. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedBoldItalic.pfb +0 -0
  432. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitFixedItalic.pfb +0 -0
  433. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerif.pfb +0 -0
  434. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBold.pfb +0 -0
  435. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifBoldItalic.pfb +0 -0
  436. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSerifItalic.pfb +0 -0
  437. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/FoxitSymbol.pfb +0 -0
  438. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_FOXIT +27 -0
  439. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LICENSE_LIBERATION +363 -0
  440. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Bold.ttf +0 -0
  441. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-BoldItalic.ttf +0 -0
  442. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Italic.ttf +0 -0
  443. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/standard_fonts/LiberationSans-Regular.ttf +0 -0
  444. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/viewer.css +8265 -0
  445. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/viewer.html +1236 -0
  446. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/viewer.mjs +26437 -0
  447. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_JBIG2 +196 -0
  448. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_OPENJPEG +39 -0
  449. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  450. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_OPENJPEG +22 -0
  451. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_PDFJS_QCMS +19 -0
  452. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/LICENSE_QCMS +21 -0
  453. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/jbig2.wasm +0 -0
  454. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/jbig2_nowasm_fallback.js +15 -0
  455. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg.wasm +0 -0
  456. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/openjpeg_nowasm_fallback.js +17 -0
  457. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/qcms_bg.wasm +0 -0
  458. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.js +16 -0
  459. docsmind-0.6.0/src/docsmind/server/ui/pdfjs/web/wasm/quickjs-eval.wasm +0 -0
  460. docsmind-0.3.0/src/docsmind/cli/chat.py +0 -26
  461. docsmind-0.3.0/src/docsmind/config.py +0 -51
  462. docsmind-0.3.0/src/docsmind/ingestion/parsers/__init__.py +0 -0
  463. docsmind-0.3.0/src/docsmind/retrieval/__init__.py +0 -0
  464. docsmind-0.3.0/src/docsmind/server/__init__.py +0 -0
  465. docsmind-0.3.0/src/docsmind/server/routes/__init__.py +0 -0
  466. docsmind-0.3.0/src/docsmind/server/ui/assets/index-DSQOFo_H.css +0 -1
  467. docsmind-0.3.0/src/docsmind/server/ui/assets/index-QBP12Bcv.js +0 -5385
  468. docsmind-0.3.0/src/docsmind/server/ui/favicon.svg +0 -1
  469. docsmind-0.3.0/src/docsmind/server/ui/icons.svg +0 -24
  470. {docsmind-0.3.0 → docsmind-0.6.0}/.gitignore +0 -0
  471. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/__init__.py +0 -0
  472. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/adapters/__init__.py +0 -0
  473. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/adapters/blobs/__init__.py +0 -0
  474. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/adapters/blobs/filesystem.py +0 -0
  475. {docsmind-0.3.0/src/docsmind/adapters/embeddings → docsmind-0.6.0/src/docsmind/adapters/storage}/__init__.py +0 -0
  476. {docsmind-0.3.0/src/docsmind/adapters/llm → docsmind-0.6.0/src/docsmind/adapters/storage/postgres}/__init__.py +0 -0
  477. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/adapters/storage/postgres/engine.py +0 -0
  478. {docsmind-0.3.0/src/docsmind/adapters/storage → docsmind-0.6.0/src/docsmind/adapters/tracing}/__init__.py +0 -0
  479. {docsmind-0.3.0/src/docsmind/adapters/storage/postgres → docsmind-0.6.0/src/docsmind/agent}/__init__.py +0 -0
  480. {docsmind-0.3.0/src/docsmind/adapters/tracing → docsmind-0.6.0/src/docsmind/agent/subagents}/__init__.py +0 -0
  481. {docsmind-0.3.0/src/docsmind/adapters/vision → docsmind-0.6.0/src/docsmind/agent/subagents/change_analysis}/__init__.py +0 -0
  482. {docsmind-0.3.0/src/docsmind/agent → docsmind-0.6.0/src/docsmind/cli}/__init__.py +0 -0
  483. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/cli/db.py +0 -0
  484. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/cli/diff.py +0 -0
  485. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/cli/doctor.py +0 -0
  486. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/cli/ingest.py +0 -0
  487. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/cli/inspect.py +0 -0
  488. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/cli/serve.py +0 -0
  489. {docsmind-0.3.0/src/docsmind/agent/subagents → docsmind-0.6.0/src/docsmind/domain}/__init__.py +0 -0
  490. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/domain/changes.py +0 -0
  491. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/domain/documents.py +0 -0
  492. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/domain/tables.py +0 -0
  493. {docsmind-0.3.0/src/docsmind/agent/subagents/change_analysis → docsmind-0.6.0/src/docsmind/ingestion}/__init__.py +0 -0
  494. {docsmind-0.3.0/src/docsmind/agent/tools → docsmind-0.6.0/src/docsmind/ingestion/chunking}/__init__.py +0 -0
  495. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/ingestion/chunking/page.py +0 -0
  496. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/ingestion/chunking/structural.py +0 -0
  497. {docsmind-0.3.0/src/docsmind/cli → docsmind-0.6.0/src/docsmind/ingestion/enrichment}/__init__.py +0 -0
  498. {docsmind-0.3.0/src/docsmind/domain → docsmind-0.6.0/src/docsmind/ingestion/parsers}/__init__.py +0 -0
  499. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/ingestion/pipeline.py +0 -0
  500. {docsmind-0.3.0 → docsmind-0.6.0}/src/docsmind/py.typed +0 -0
  501. {docsmind-0.3.0/src/docsmind/ingestion → docsmind-0.6.0/src/docsmind/retrieval}/__init__.py +0 -0
  502. {docsmind-0.3.0/src/docsmind/ingestion/chunking → docsmind-0.6.0/src/docsmind/server}/__init__.py +0 -0
  503. {docsmind-0.3.0/src/docsmind/ingestion/enrichment → docsmind-0.6.0/src/docsmind/server/routes}/__init__.py +0 -0
@@ -2,6 +2,82 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [0.6.0] - 2026-11-10
6
+
7
+ ### Added
8
+
9
+ - Workspace: clicking a source card or citation chip opens the cited PDF page in a side panel
10
+ next to the chat.
11
+ - Images/Tables galleries: full-view lightbox (blurred backdrop, arrow-key navigation) with
12
+ the full image caption beneath.
13
+ - Chunk preview shows the embedding vector on one truncated line, expandable to the full
14
+ vector (`GET /api/documents/{version_id}/chunks/{chunk_id}/embedding`; chunk list now
15
+ includes `embedding_model`, `embedding_dims`, `embedding_preview`).
16
+ - Agents: clicking a node opens a details panel next to the graph, like the source panel in the
17
+ Workspace. For an agent (the Mind, subagents, router and planner) it shows the description,
18
+ model, step budget, tools, the full system prompt (formatted or raw, with copy), the context
19
+ blocks the harness adds and a description of the user prompt. For a tool it shows the
20
+ description the model reads, which agents can use it and its arguments (type, required,
21
+ default, constraints) with the JSON Schema. Tool chips and "Available to" chips navigate
22
+ between panels; Escape or clicking the empty graph closes it.
23
+
24
+ ### Changed
25
+
26
+ - `GET /api/agent`: every agent and stage now includes `system_prompt`, `context` (blocks with
27
+ `label`, `text`, `cached`) and `user_prompt`; every tool now includes `instructions` (the
28
+ description sent to the model) and `parameters` (its JSON Schema), in addition to `name` and
29
+ `description`.
30
+
31
+ ### Fixed
32
+
33
+ - Image captions are now shown in the gallery and refresh when a captioning job finishes.
34
+ - Captioning prompt no longer marks logos and banners as "decorative".
35
+
36
+ ## [0.5.0] - 2026-11-02
37
+
38
+ ### Changed
39
+
40
+ - Agents view is now an interactive graph: the Mind in the centre, its tools around it, and the
41
+ subagents with their own tools beyond. Hover (or tap) a node for its description. Names are
42
+ shown as "Change Analyzer", not `change_analyzer`; the router and planner appear as dashed
43
+ stages of the Mind (one model call, no tools), not as subagents.
44
+ - `GET /api/agent`: `tools` are now `{name, description}` objects (plain-language summaries),
45
+ and a new `stages` list describes the router and planner.
46
+
47
+ ### Added
48
+
49
+ - On-demand enrichment for both pending roadmap items:
50
+ - Embeddings: estimate by token count, confirmation step, resumable run (`docsmind embed`,
51
+ `POST /api/enrichment/embeddings/{estimate,run}`).
52
+ - Image captioning: estimate by image count/resolution + output-token range, confirmation step,
53
+ resumable run (`docsmind caption`, `POST /api/enrichment/captions/{estimate,run}`).
54
+ - Enrichment status + background jobs API:
55
+ `GET /api/enrichment/status`, `GET /api/enrichment/jobs/{job_id}`,
56
+ `POST /api/enrichment/jobs/{job_id}/cancel`.
57
+ - Frontend Document details now shows "not embedded yet" / "not captioned yet" alerts with
58
+ estimate-and-proceed dialogs and job progress/cancel controls.
59
+ - Hybrid retrieval path: keyword search fused with vector similarity when embeddings are present,
60
+ with automatic fallback to keyword-only when embeddings or API access are unavailable.
61
+
62
+ ## [0.4.0] - 2026-10-31
63
+
64
+ ### Added
65
+
66
+ - The Mind: a chat agent (orchestrator, planner, tool-using executor, parallel subagents)
67
+ with a deterministic harness (context builder with prompt-cache breakpoint, summarizer,
68
+ memory writer). Answers carry verified `[S#]` citations.
69
+ - Provider-neutral LLM layer with OpenAI and Anthropic streaming adapters.
70
+ - Tools: `search`, `grep`, `read_pages`, `get_outline`, `list_documents`, `delegate`;
71
+ subagents: `researcher`, `change_analyzer`.
72
+ - Migration `0004`: `conversations`, `messages`, `agent_memory` tables (run `docsmind db upgrade`).
73
+ - HTTP: `POST /api/chat` (SSE), `GET/DELETE /api/conversations`, `GET /api/agent`.
74
+ - UI: streaming chat in Workspace with live agent activity, markdown answers, citation chips
75
+ and source cards that open the PDF at the cited page; Activity lists saved conversations;
76
+ Agents reads the real registry. New frontend deps: `react-markdown`, `remark-gfm`.
77
+ - `Docsmind.chat_result()`; `chat`/`achat` accept `conversation_id`; `docsmind chat` REPL keeps
78
+ the conversation.
79
+ - Config: `agent_*` settings, `openai_base_url`, `openai_reasoning_effort`.
80
+
5
81
  ## [0.3.0] - 2026-10-03
6
82
 
7
83
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: docsmind
3
- Version: 0.3.0
3
+ Version: 0.6.0
4
4
  Summary: Chat with your documents. Version-aware retrieval, change analysis, and an editable table workspace, backed by Postgres/pgvector.
5
5
  Project-URL: Homepage, https://github.com/yauheniya-ai/docsmind
6
6
  Project-URL: Repository, https://github.com/yauheniya-ai/docsmind
@@ -45,6 +45,8 @@ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
45
45
  Requires-Dist: pytest>=8.0; extra == 'dev'
46
46
  Requires-Dist: ruff>=0.5; extra == 'dev'
47
47
  Requires-Dist: testcontainers[postgres]>=4.4; extra == 'dev'
48
+ Provides-Extra: langfuse
49
+ Requires-Dist: langfuse>=2.0; extra == 'langfuse'
48
50
  Provides-Extra: mlflow
49
51
  Requires-Dist: mlflow>=2.14; extra == 'mlflow'
50
52
  Provides-Extra: openai
@@ -68,9 +70,8 @@ Description-Content-Type: text/markdown
68
70
  Chat with your documents. Track what changed between versions, and why it matters.
69
71
 
70
72
  `docsmind` ingests PDFs (and soon DOCX/text) into a version-aware Postgres/pgvector
71
- store, and gives you an agent, **the Mind**, to chat with them. A built-in subagent,
72
- **diffra**, will do change analysis between document versions: what changed, where, and
73
- its compliance implications, with citations back to exact pages.
73
+ store, and gives you an agent, **the Mind**, to analyze them. Built-in subagents
74
+ will perform specialized tasks.
74
75
 
75
76
  > **Alpha.** Ingestion and inspection work today. Embeddings, chat and change analysis
76
77
  > are designed and scaffolded but not implemented yet; see [What works today](#what-works-today).
@@ -85,9 +86,9 @@ its compliance implications, with citations back to exact pages.
85
86
  | ✅ `docsmind doctor` | Checks database, blob storage and API keys, and tells you what to fix |
86
87
  | ✅ Table extraction | Extract and store tables skipping repeating ones (e.g. headers or footers) |
87
88
  | ✅ server + UI | FastAPI backend (`docsmind serve`) + React UI (`frontend/`): add documents, browse indexed content, image and table galleries |
88
- | 🚧 Chat agent (the Mind) | `docsmind chat` exists as a command, without an agent behind it yet |
89
- | 🚧 Image captioning | Images are extracted and stored; vision captioning is next |
90
- | 🚧 Embeddings + hybrid search | Chunks are stored without embeddings for now |
89
+ | ✅ Chat agent (the Mind) | Routes each question, plans complex ones, searches/reads your documents with tools, delegates to subagents, and answers with verified `[S#]` citations. Streams to the UI over SSE; conversations are saved |
90
+ | ✅ Image captioning (on demand) | The UI/CLI shows what's uncaptioned, estimates cost from image count/resolution, asks for confirmation, then captions only what's missing |
91
+ | ✅ Embeddings + hybrid search (on demand) | The UI/CLI shows what's unembedded, estimates cost from token counts, asks for confirmation, then embeds only what's missing; search uses keyword+semantic fusion when available |
91
92
  | 🚧 Change analysis (diffra) | `docsmind diff` exists as a command, without an implementation yet |
92
93
  | 🚧 DOCX/text parsers, S3/Supabase blob storage | Planned |
93
94
 
@@ -100,7 +101,7 @@ pip install "docsmind[all]"
100
101
  ```
101
102
 
102
103
  Extras: `docsmind[openai]`, `docsmind[anthropic]`, `docsmind[server]` (FastAPI, serves the bundled UI),
103
- `docsmind[mlflow]` (tracing/eval export). Requires Python 3.10+.
104
+ `docsmind[mlflow]` / `docsmind[langfuse]` (tracing/eval export, planned). Requires Python 3.10+.
104
105
 
105
106
  ## Quickstart
106
107
 
@@ -130,8 +131,9 @@ docsmind doctor
130
131
  ```
131
132
 
132
133
  Configuration is environment-driven (`DOCSMIND_*`, or a `.env` file). Copy
133
- `.env.example` to `.env` to see every option. Model API keys aren't needed yet;
134
- they'll be required once embeddings and chat land.
134
+ `.env.example` to `.env` to see every option. Chat needs an LLM key
135
+ (`DOCSMIND_LLM_PROVIDER` plus `DOCSMIND_ANTHROPIC_API_KEY` or `DOCSMIND_OPENAI_API_KEY`);
136
+ ingestion and browsing don't.
135
137
 
136
138
  ### 2. Ingest a PDF
137
139
 
@@ -187,13 +189,78 @@ cd ../docsmind
187
189
  python scripts/bundle_frontend.py
188
190
  ```
189
191
 
190
- ### 5. Coming next
192
+ ### 5. Ask the Mind
193
+
194
+ In the UI, open **Workspace** and ask a question (needs `docsmind[openai]` or `docsmind[anthropic]`
195
+ plus an API key). From the terminal or Python:
196
+
197
+ ```bash
198
+ docsmind chat "What are our data retention obligations?" # one-shot
199
+ docsmind chat # REPL, keeps the conversation
200
+ ```
191
201
 
192
202
  ```python
193
- print(dm.chat("What are our data retention obligations?")) # planned
194
- change_set = dm.compare(v1.id, v2.id) # planned (diffra)
203
+ result = dm.chat_result("What are our data retention obligations?")
204
+ print(result.answer, result.citations)
205
+ change_set = dm.compare(v1.id, v2.id) # planned (diffra)
206
+ ```
207
+
208
+ ## How the Mind works
209
+
210
+ ```
211
+ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
212
+ | ^
213
+ +--complex--> Planner --+ Harness feeds every role:
214
+ context builder, prompt cache,
215
+ summarizer, memory
216
+ ```
217
+
218
+ - **Orchestrator**: one cheap call that routes the question (`simple` or `complex`) and rewrites
219
+ it as a standalone question using the conversation so far.
220
+ - **Planner** (complex only): a short list of steps the executor follows.
221
+ - **Executor**: a bounded tool loop (`search`, `grep`, `read_pages`, `get_outline`,
222
+ `list_documents`, `delegate`). The last step forces an answer; tool errors go back to the
223
+ model, not the user; old tool results are elided when the context grows.
224
+ - **Subagents** (`researcher`, `change_analyzer`): fresh context, a subset of the tools, run in
225
+ parallel, cannot delegate further.
226
+ - **Harness**: deterministic code, not another agent. It orders the prompt stable-first so the
227
+ prefix caches, summarizes long histories, and saves durable notes to memory after each answer.
228
+ - **Citations**: tools register passages as `S1, S2, ...`; the model cites `[S#]`; invented
229
+ handles are dropped and the rest renumbered by first appearance. Document text is treated as
230
+ untrusted data, never as instructions.
231
+ - **Search** is Postgres full-text (ranked) plus exact-text grep; when embeddings exist, semantic vector matches are fused in via reciprocal rank fusion.
232
+
233
+ ### On-demand enrichment
234
+
235
+ Embeddings and image captions are **not** created during ingest. They are opt-in because they call paid APIs.
236
+
237
+ - In the **Document details** page, warning cards show what's missing ("not embedded yet" / "not captioned yet").
238
+ - Clicking **Estimate & run** opens a confirmation dialog with model, token/image counts, and estimated USD cost.
239
+ - Running is idempotent and resumable: it only processes missing rows; cancel/retry is safe.
240
+
241
+ From CLI:
242
+
243
+ ```bash
244
+ docsmind embed [--version-id <id>] [-y]
245
+ docsmind caption [--version-id <id>] [-y]
195
246
  ```
196
247
 
248
+ HTTP:
249
+
250
+ - `GET /api/enrichment/status`
251
+ - `POST /api/enrichment/{embeddings|captions}/estimate`
252
+ - `POST /api/enrichment/{embeddings|captions}/run`
253
+ - `GET /api/enrichment/jobs/{job_id}`
254
+ - `POST /api/enrichment/jobs/{job_id}/cancel`
255
+
256
+ Tuning (all `DOCSMIND_*`): `AGENT_FAST_MODEL` (router/summarizer/memory model, defaults to
257
+ `LLM_MODEL`), `AGENT_MAX_STEPS`, `AGENT_SUBAGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
258
+ `OPENAI_REASONING_EFFORT`, `OPENAI_BASE_URL`. See `.env.example`.
259
+
260
+ HTTP: `POST /api/chat` streams Server-Sent Events (`route`, `plan`, `tool_start`, `tool_end`,
261
+ `subagent_start`, `subagent_end`, `token`, `note`, `answer`, `error`, `done`);
262
+ `GET /api/conversations[/{id}]`, `DELETE /api/conversations/{id}`, `GET /api/agent`.
263
+
197
264
  ## How ingestion works
198
265
 
199
266
  Ingestion is deliberately simple and predictable. There's no layout guessing, because
@@ -226,7 +293,10 @@ heuristics that work on one PDF break on the next.
226
293
  | `docsmind db up` / `upgrade` / `psql` | Start local Postgres, apply migrations, open psql |
227
294
  | `docsmind doctor` | Check your setup |
228
295
  | `docsmind serve [--host] [--port] [--reload]` | Run the FastAPI backend for the `frontend/` UI |
229
- | `docsmind chat`, `docsmind diff` | Planned |
296
+ | `docsmind chat [question] [-c <collection>]` | Ask the Mind once, or start a REPL that keeps the conversation |
297
+ | `docsmind embed [--version-id <id>] [-y]` | Estimate cost and create missing embeddings on demand |
298
+ | `docsmind caption [--version-id <id>] [-y]` | Estimate cost and create missing image captions on demand |
299
+ | `docsmind diff` | Planned |
230
300
 
231
301
  ## Architecture
232
302
 
@@ -238,7 +308,7 @@ src/docsmind/
238
308
  │
239
309
  ├── domain/ # pure data + interfaces, no I/O
240
310
  │ ├── documents.py # Document, DocumentVersion, Section, Chunk, Image, ParsedDocument
241
- │ ├── changes.py # Change, ChangeSet, ImpactAssessment (diffra)
311
+ │ ├── changes.py # Change, ChangeSet, ImpactAssessment
242
312
  │ ├── citations.py # Citation
243
313
  │ ├── tables.py # AgentTable, TableRevision
244
314
  │ └── ports.py # LLM, Embedder, VisionCaptioner, VectorStore, BlobStore, Parser
@@ -255,9 +325,9 @@ src/docsmind/
255
325
  │ ├── llm/ embeddings/ vision/ tracing/ # planned
256
326
  │
257
327
  ├── cli/ # Typer app: ingest, versions, fulltext, outline, chunks, db, doctor
258
- ├── retrieval/ # hybrid vector + keyword search (planned)
259
- ├── agent/ # the Mind + diffra subagent (planned)
260
- └── server/ # FastAPI app + routes backing frontend/ (documents: ingest, read back content/images/tables)
328
+ ├── retrieval/ # keyword (full-text) search helpers; vector search planned
329
+ ├── agent/ # the Mind: orchestrator, planner, tool loop, tools, subagents, harness
330
+ └── server/ # FastAPI app + routes backing frontend/ (documents, chat SSE, conversations)
261
331
 
262
332
  alembic/ tests/ examples/ docs/
263
333
  ```
@@ -276,7 +346,7 @@ over `/api/*`, and loads extracted images/tables straight from disk via `/blobs/
276
346
  ### Design notes
277
347
 
278
348
  - **Ports and adapters, once.** `domain/ports.py` defines every external dependency as a
279
- `Protocol`. The core never imports `openai`, `anthropic` or `mlflow` directly. Only
349
+ `Protocol`. The core never imports `openai`, `anthropic`, `mlflow` or `langfuse` directly. Only
280
350
  adapters do, and lazily, so a bare `pip install docsmind` doesn't pull in SDKs you're
281
351
  not using.
282
352
  - **Text and images share one retrieval path.** An image becomes a chunk
@@ -11,9 +11,8 @@
11
11
  Chat with your documents. Track what changed between versions, and why it matters.
12
12
 
13
13
  `docsmind` ingests PDFs (and soon DOCX/text) into a version-aware Postgres/pgvector
14
- store, and gives you an agent, **the Mind**, to chat with them. A built-in subagent,
15
- **diffra**, will do change analysis between document versions: what changed, where, and
16
- its compliance implications, with citations back to exact pages.
14
+ store, and gives you an agent, **the Mind**, to analyze them. Built-in subagents
15
+ will perform specialized tasks.
17
16
 
18
17
  > **Alpha.** Ingestion and inspection work today. Embeddings, chat and change analysis
19
18
  > are designed and scaffolded but not implemented yet; see [What works today](#what-works-today).
@@ -28,9 +27,9 @@ its compliance implications, with citations back to exact pages.
28
27
  | ✅ `docsmind doctor` | Checks database, blob storage and API keys, and tells you what to fix |
29
28
  | ✅ Table extraction | Extract and store tables skipping repeating ones (e.g. headers or footers) |
30
29
  | ✅ server + UI | FastAPI backend (`docsmind serve`) + React UI (`frontend/`): add documents, browse indexed content, image and table galleries |
31
- | 🚧 Chat agent (the Mind) | `docsmind chat` exists as a command, without an agent behind it yet |
32
- | 🚧 Image captioning | Images are extracted and stored; vision captioning is next |
33
- | 🚧 Embeddings + hybrid search | Chunks are stored without embeddings for now |
30
+ | ✅ Chat agent (the Mind) | Routes each question, plans complex ones, searches/reads your documents with tools, delegates to subagents, and answers with verified `[S#]` citations. Streams to the UI over SSE; conversations are saved |
31
+ | ✅ Image captioning (on demand) | The UI/CLI shows what's uncaptioned, estimates cost from image count/resolution, asks for confirmation, then captions only what's missing |
32
+ | ✅ Embeddings + hybrid search (on demand) | The UI/CLI shows what's unembedded, estimates cost from token counts, asks for confirmation, then embeds only what's missing; search uses keyword+semantic fusion when available |
34
33
  | 🚧 Change analysis (diffra) | `docsmind diff` exists as a command, without an implementation yet |
35
34
  | 🚧 DOCX/text parsers, S3/Supabase blob storage | Planned |
36
35
 
@@ -43,7 +42,7 @@ pip install "docsmind[all]"
43
42
  ```
44
43
 
45
44
  Extras: `docsmind[openai]`, `docsmind[anthropic]`, `docsmind[server]` (FastAPI, serves the bundled UI),
46
- `docsmind[mlflow]` (tracing/eval export). Requires Python 3.10+.
45
+ `docsmind[mlflow]` / `docsmind[langfuse]` (tracing/eval export, planned). Requires Python 3.10+.
47
46
 
48
47
  ## Quickstart
49
48
 
@@ -73,8 +72,9 @@ docsmind doctor
73
72
  ```
74
73
 
75
74
  Configuration is environment-driven (`DOCSMIND_*`, or a `.env` file). Copy
76
- `.env.example` to `.env` to see every option. Model API keys aren't needed yet;
77
- they'll be required once embeddings and chat land.
75
+ `.env.example` to `.env` to see every option. Chat needs an LLM key
76
+ (`DOCSMIND_LLM_PROVIDER` plus `DOCSMIND_ANTHROPIC_API_KEY` or `DOCSMIND_OPENAI_API_KEY`);
77
+ ingestion and browsing don't.
78
78
 
79
79
  ### 2. Ingest a PDF
80
80
 
@@ -130,13 +130,78 @@ cd ../docsmind
130
130
  python scripts/bundle_frontend.py
131
131
  ```
132
132
 
133
- ### 5. Coming next
133
+ ### 5. Ask the Mind
134
+
135
+ In the UI, open **Workspace** and ask a question (needs `docsmind[openai]` or `docsmind[anthropic]`
136
+ plus an API key). From the terminal or Python:
137
+
138
+ ```bash
139
+ docsmind chat "What are our data retention obligations?" # one-shot
140
+ docsmind chat # REPL, keeps the conversation
141
+ ```
134
142
 
135
143
  ```python
136
- print(dm.chat("What are our data retention obligations?")) # planned
137
- change_set = dm.compare(v1.id, v2.id) # planned (diffra)
144
+ result = dm.chat_result("What are our data retention obligations?")
145
+ print(result.answer, result.citations)
146
+ change_set = dm.compare(v1.id, v2.id) # planned (diffra)
147
+ ```
148
+
149
+ ## How the Mind works
150
+
151
+ ```
152
+ Question -> Orchestrator --simple--> Executor <-> Tools / Subagents -> Answer
153
+ | ^
154
+ +--complex--> Planner --+ Harness feeds every role:
155
+ context builder, prompt cache,
156
+ summarizer, memory
157
+ ```
158
+
159
+ - **Orchestrator**: one cheap call that routes the question (`simple` or `complex`) and rewrites
160
+ it as a standalone question using the conversation so far.
161
+ - **Planner** (complex only): a short list of steps the executor follows.
162
+ - **Executor**: a bounded tool loop (`search`, `grep`, `read_pages`, `get_outline`,
163
+ `list_documents`, `delegate`). The last step forces an answer; tool errors go back to the
164
+ model, not the user; old tool results are elided when the context grows.
165
+ - **Subagents** (`researcher`, `change_analyzer`): fresh context, a subset of the tools, run in
166
+ parallel, cannot delegate further.
167
+ - **Harness**: deterministic code, not another agent. It orders the prompt stable-first so the
168
+ prefix caches, summarizes long histories, and saves durable notes to memory after each answer.
169
+ - **Citations**: tools register passages as `S1, S2, ...`; the model cites `[S#]`; invented
170
+ handles are dropped and the rest renumbered by first appearance. Document text is treated as
171
+ untrusted data, never as instructions.
172
+ - **Search** is Postgres full-text (ranked) plus exact-text grep; when embeddings exist, semantic vector matches are fused in via reciprocal rank fusion.
173
+
174
+ ### On-demand enrichment
175
+
176
+ Embeddings and image captions are **not** created during ingest. They are opt-in because they call paid APIs.
177
+
178
+ - In the **Document details** page, warning cards show what's missing ("not embedded yet" / "not captioned yet").
179
+ - Clicking **Estimate & run** opens a confirmation dialog with model, token/image counts, and estimated USD cost.
180
+ - Running is idempotent and resumable: it only processes missing rows; cancel/retry is safe.
181
+
182
+ From CLI:
183
+
184
+ ```bash
185
+ docsmind embed [--version-id <id>] [-y]
186
+ docsmind caption [--version-id <id>] [-y]
138
187
  ```
139
188
 
189
+ HTTP:
190
+
191
+ - `GET /api/enrichment/status`
192
+ - `POST /api/enrichment/{embeddings|captions}/estimate`
193
+ - `POST /api/enrichment/{embeddings|captions}/run`
194
+ - `GET /api/enrichment/jobs/{job_id}`
195
+ - `POST /api/enrichment/jobs/{job_id}/cancel`
196
+
197
+ Tuning (all `DOCSMIND_*`): `AGENT_FAST_MODEL` (router/summarizer/memory model, defaults to
198
+ `LLM_MODEL`), `AGENT_MAX_STEPS`, `AGENT_SUBAGENT_MAX_STEPS`, `AGENT_MEMORY_ENABLED`,
199
+ `OPENAI_REASONING_EFFORT`, `OPENAI_BASE_URL`. See `.env.example`.
200
+
201
+ HTTP: `POST /api/chat` streams Server-Sent Events (`route`, `plan`, `tool_start`, `tool_end`,
202
+ `subagent_start`, `subagent_end`, `token`, `note`, `answer`, `error`, `done`);
203
+ `GET /api/conversations[/{id}]`, `DELETE /api/conversations/{id}`, `GET /api/agent`.
204
+
140
205
  ## How ingestion works
141
206
 
142
207
  Ingestion is deliberately simple and predictable. There's no layout guessing, because
@@ -169,7 +234,10 @@ heuristics that work on one PDF break on the next.
169
234
  | `docsmind db up` / `upgrade` / `psql` | Start local Postgres, apply migrations, open psql |
170
235
  | `docsmind doctor` | Check your setup |
171
236
  | `docsmind serve [--host] [--port] [--reload]` | Run the FastAPI backend for the `frontend/` UI |
172
- | `docsmind chat`, `docsmind diff` | Planned |
237
+ | `docsmind chat [question] [-c <collection>]` | Ask the Mind once, or start a REPL that keeps the conversation |
238
+ | `docsmind embed [--version-id <id>] [-y]` | Estimate cost and create missing embeddings on demand |
239
+ | `docsmind caption [--version-id <id>] [-y]` | Estimate cost and create missing image captions on demand |
240
+ | `docsmind diff` | Planned |
173
241
 
174
242
  ## Architecture
175
243
 
@@ -181,7 +249,7 @@ src/docsmind/
181
249
  │
182
250
  ├── domain/ # pure data + interfaces, no I/O
183
251
  │ ├── documents.py # Document, DocumentVersion, Section, Chunk, Image, ParsedDocument
184
- │ ├── changes.py # Change, ChangeSet, ImpactAssessment (diffra)
252
+ │ ├── changes.py # Change, ChangeSet, ImpactAssessment
185
253
  │ ├── citations.py # Citation
186
254
  │ ├── tables.py # AgentTable, TableRevision
187
255
  │ └── ports.py # LLM, Embedder, VisionCaptioner, VectorStore, BlobStore, Parser
@@ -198,9 +266,9 @@ src/docsmind/
198
266
  │ ├── llm/ embeddings/ vision/ tracing/ # planned
199
267
  │
200
268
  ├── cli/ # Typer app: ingest, versions, fulltext, outline, chunks, db, doctor
201
- ├── retrieval/ # hybrid vector + keyword search (planned)
202
- ├── agent/ # the Mind + diffra subagent (planned)
203
- └── server/ # FastAPI app + routes backing frontend/ (documents: ingest, read back content/images/tables)
269
+ ├── retrieval/ # keyword (full-text) search helpers; vector search planned
270
+ ├── agent/ # the Mind: orchestrator, planner, tool loop, tools, subagents, harness
271
+ └── server/ # FastAPI app + routes backing frontend/ (documents, chat SSE, conversations)
204
272
 
205
273
  alembic/ tests/ examples/ docs/
206
274
  ```
@@ -219,7 +287,7 @@ over `/api/*`, and loads extracted images/tables straight from disk via `/blobs/
219
287
  ### Design notes
220
288
 
221
289
  - **Ports and adapters, once.** `domain/ports.py` defines every external dependency as a
222
- `Protocol`. The core never imports `openai`, `anthropic` or `mlflow` directly. Only
290
+ `Protocol`. The core never imports `openai`, `anthropic`, `mlflow` or `langfuse` directly. Only
223
291
  adapters do, and lazily, so a bare `pip install docsmind` doesn't pull in SDKs you're
224
292
  not using.
225
293
  - **Text and images share one retrieval path.** An image becomes a chunk
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "docsmind"
7
- version = "0.3.0"
7
+ version = "0.6.0"
8
8
  description = "Chat with your documents. Version-aware retrieval, change analysis, and an editable table workspace, backed by Postgres/pgvector."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -46,6 +46,7 @@ openai = ["openai>=1.30"]
46
46
  anthropic = ["anthropic>=0.34"]
47
47
  server = ["fastapi>=0.111", "uvicorn[standard]>=0.30", "python-multipart>=0.0.9"]
48
48
  mlflow = ["mlflow>=2.14"]
49
+ langfuse = ["langfuse>=2.0"]
49
50
  dev = ["pytest>=8.0", "pytest-asyncio>=0.23", "testcontainers[postgres]>=4.4", "ruff>=0.5", "mypy>=1.10"]
50
51
  all = ["docsmind[openai,anthropic,server]"]
51
52
 
@@ -0,0 +1,22 @@
1
+ """Embedding providers. Today: OpenAI (and OpenAI-compatible gateways)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from docsmind.config import DocsmindConfig
6
+ from docsmind.domain.errors import EnrichmentConfigurationError
7
+
8
+
9
+ def create_embedder(config: DocsmindConfig):
10
+ if config.embedding_provider == "openai":
11
+ from docsmind.adapters.embeddings.openai_embeddings import OpenAIEmbedder
12
+
13
+ return OpenAIEmbedder(
14
+ api_key=config.openai_api_key,
15
+ model=config.embedding_model,
16
+ dimensions=config.embedding_dimensions,
17
+ base_url=config.openai_base_url,
18
+ batch_size=config.embedding_batch_size,
19
+ )
20
+ raise EnrichmentConfigurationError(
21
+ f"Unknown embedding_provider {config.embedding_provider!r}. Supported: openai."
22
+ )
@@ -0,0 +1,79 @@
1
+ """OpenAI (and OpenAI-compatible) embeddings adapter. Satisfies `domain.ports.Embedder`."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from docsmind.domain.errors import EnrichmentConfigurationError
6
+
7
+ # The API rejects inputs over 8191 tokens; page chunks are far smaller, but a
8
+ # dense page of tiny text can get there. Truncate rather than fail the batch.
9
+ MAX_INPUT_TOKENS = 8000
10
+ _MAX_REQUEST_TOKENS = 250_000 # API limit is 300k tokens per request
11
+
12
+
13
+ class OpenAIEmbedder:
14
+ def __init__(
15
+ self,
16
+ *,
17
+ api_key: str | None,
18
+ model: str,
19
+ dimensions: int,
20
+ base_url: str | None = None,
21
+ batch_size: int = 64,
22
+ timeout: float = 120.0,
23
+ ) -> None:
24
+ if not api_key:
25
+ raise EnrichmentConfigurationError(
26
+ "OpenAI API key is not set. Add DOCSMIND_OPENAI_API_KEY to your .env to create embeddings."
27
+ )
28
+ try:
29
+ from openai import AsyncOpenAI
30
+ except ImportError as exc: # pragma: no cover - import guard
31
+ raise EnrichmentConfigurationError(
32
+ 'The openai package is not installed. Run `pip install "docsmind[openai]"`.'
33
+ ) from exc
34
+ self.model_name = model
35
+ self.dimensions = dimensions
36
+ self._batch_size = max(1, batch_size)
37
+ self._client = AsyncOpenAI(api_key=api_key, base_url=base_url, max_retries=4, timeout=timeout)
38
+
39
+ async def embed(self, texts: list[str]) -> list[list[float]]:
40
+ vectors: list[list[float]] = []
41
+ for batch in self._batches([_truncate(t) for t in texts]):
42
+ kwargs: dict = {"model": self.model_name, "input": batch}
43
+ # Only the v3 models accept (and need) a `dimensions` argument.
44
+ if "text-embedding-3" in self.model_name:
45
+ kwargs["dimensions"] = self.dimensions
46
+ response = await self._client.embeddings.create(**kwargs)
47
+ ordered = sorted(response.data, key=lambda d: d.index)
48
+ vectors.extend([list(d.embedding) for d in ordered])
49
+ if len(vectors) != len(texts):
50
+ raise RuntimeError(f"Embeddings API returned {len(vectors)} vectors for {len(texts)} inputs.")
51
+ return vectors
52
+
53
+ def _batches(self, texts: list[str]):
54
+ batch: list[str] = []
55
+ tokens = 0
56
+ for text in texts:
57
+ estimate = max(1, len(text) // 3) # conservative: ~3 chars/token
58
+ if batch and (len(batch) >= self._batch_size or tokens + estimate > _MAX_REQUEST_TOKENS):
59
+ yield batch
60
+ batch, tokens = [], 0
61
+ batch.append(text)
62
+ tokens += estimate
63
+ if batch:
64
+ yield batch
65
+
66
+
67
+ def _truncate(text: str) -> str:
68
+ # The API also rejects empty strings; a single space embeds harmlessly.
69
+ text = text if text.strip() else " "
70
+ try:
71
+ import tiktoken
72
+
73
+ encoding = tiktoken.get_encoding("cl100k_base")
74
+ tokens = encoding.encode(text, disallowed_special=())
75
+ if len(tokens) > MAX_INPUT_TOKENS:
76
+ return encoding.decode(tokens[:MAX_INPUT_TOKENS])
77
+ return text
78
+ except Exception: # noqa: BLE001 - fall back to a character cap
79
+ return text[: MAX_INPUT_TOKENS * 3]
@@ -0,0 +1,31 @@
1
+ """LLM adapter registry. SDKs are imported lazily inside each adapter, so a
2
+ bare `pip install docsmind` never needs openai/anthropic installed."""
3
+
4
+ from __future__ import annotations
5
+
6
+ from docsmind.config import DocsmindConfig
7
+ from docsmind.domain.errors import LLMConfigurationError
8
+ from docsmind.domain.ports import LLM
9
+
10
+
11
+ def create_llm(config: DocsmindConfig, *, model: str | None = None) -> LLM:
12
+ """Build the configured LLM. `model` overrides `config.llm_model` (used
13
+ for the fast model that routes, summarizes and writes memory)."""
14
+ provider = config.llm_provider.lower()
15
+ model = model or config.llm_model
16
+ if provider == "openai":
17
+ from docsmind.adapters.llm.openai_llm import OpenAILLM
18
+
19
+ return OpenAILLM(
20
+ api_key=config.openai_api_key,
21
+ model=model,
22
+ base_url=config.openai_base_url,
23
+ reasoning_effort=config.openai_reasoning_effort,
24
+ )
25
+ if provider == "anthropic":
26
+ from docsmind.adapters.llm.anthropic_llm import AnthropicLLM
27
+
28
+ return AnthropicLLM(api_key=config.anthropic_api_key, model=model)
29
+ raise LLMConfigurationError(
30
+ f"Unknown DOCSMIND_LLM_PROVIDER '{config.llm_provider}'. Use 'anthropic' or 'openai'."
31
+ )