File size: 74,329 Bytes
016b413
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
<!doctype html><html lang=en class=no-js> <head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=description content="AI-Native Drug Repurposing Research Agent"><meta name=author content="DeepCritical Team"><link href=https://deepcritical.github.io/GradioDemo/configuration/ rel=canonical><link href=../getting-started/examples/ rel=prev><link href=CONFIGURATION/ rel=next><link rel=icon href=../assets/images/favicon.png><meta name=generator content="mkdocs-1.6.1, mkdocs-material-9.7.0"><title>Configuration Guide - DeepCritical</title><link rel=stylesheet href=../assets/stylesheets/main.618322db.min.css><link rel=stylesheet href=../assets/stylesheets/palette.ab4e12ef.min.css><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"><style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style><script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script></head> <body dir=ltr data-md-color-scheme=default data-md-color-primary=orange data-md-color-accent=red> <input class=md-toggle data-md-toggle=drawer type=checkbox id=__drawer autocomplete=off> <input class=md-toggle data-md-toggle=search type=checkbox id=__search autocomplete=off> <label class=md-overlay for=__drawer></label> <div data-md-component=skip> <a href=#configuration-guide class=md-skip> Skip to content </a> </div> <div data-md-component=announce> </div> <header class=md-header data-md-component=header> <nav class="md-header__inner md-grid" aria-label=Header> <a href=.. title=DeepCritical class="md-header__button md-logo" aria-label=DeepCritical data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg> </a> <label class="md-header__button md-icon" for=__drawer> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg> </label> <div class=md-header__title data-md-component=header-title> <div class=md-header__ellipsis> <div class=md-header__topic> <span class=md-ellipsis> DeepCritical </span> </div> <div class=md-header__topic data-md-component=header-topic> <span class=md-ellipsis> Configuration Guide </span> </div> </div> </div> <form class=md-header__option data-md-component=palette> <input class=md-option data-md-color-media data-md-color-scheme=default data-md-color-primary=orange data-md-color-accent=red aria-label="Switch to dark mode" type=radio name=__palette id=__palette_0> <label class="md-header__button md-icon" title="Switch to dark mode" for=__palette_1 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> <input class=md-option data-md-color-media data-md-color-scheme=slate data-md-color-primary=orange data-md-color-accent=red aria-label="Switch to light mode" type=radio name=__palette id=__palette_1> <label class="md-header__button md-icon" title="Switch to light mode" for=__palette_0 hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg> </label> </form> <script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script> <label class="md-header__button md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> </label> <div class=md-search data-md-component=search role=dialog> <label class=md-search__overlay for=__search></label> <div class=md-search__inner role=search> <form class=md-search__form name=search> <input type=text class=md-search__input name=query aria-label=Search placeholder=Search autocapitalize=off autocorrect=off autocomplete=off spellcheck=false data-md-component=search-query required> <label class="md-search__icon md-icon" for=__search> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg> </label> <nav class=md-search__options aria-label=Search> <button type=reset class="md-search__icon md-icon" title=Clear aria-label=Clear tabindex=-1> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg> </button> </nav> <div class=md-search__suggest data-md-component=search-suggest></div> </form> <div class=md-search__output> <div class=md-search__scrollwrap tabindex=0 data-md-scrollfix> <div class=md-search-result data-md-component=search-result> <div class=md-search-result__meta> Initializing search </div> <ol class=md-search-result__list role=presentation></ol> </div> </div> </div> </div> </div> <div class=md-header__source> <a href=https://github.com/DeepCritical/GradioDemo title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </div> <div class=md-source__repository> DeepCritical/GradioDemo </div> </a> </div> </nav> </header> <div class=md-container data-md-component=container> <nav class=md-tabs aria-label=Tabs data-md-component=tabs> <div class=md-grid> <ul class=md-tabs__list> <li class=md-tabs__item> <a href=.. class=md-tabs__link> Home </a> </li> <li class=md-tabs__item> <a href=../overview/architecture/ class=md-tabs__link> Overview </a> </li> <li class=md-tabs__item> <a href=../getting-started/installation/ class=md-tabs__link> Getting Started </a> </li> <li class="md-tabs__item md-tabs__item--active"> <a href=./ class=md-tabs__link> Configuration </a> </li> <li class=md-tabs__item> <a href=../architecture/graph-orchestration/ class=md-tabs__link> Architecture </a> </li> <li class=md-tabs__item> <a href=../api/agents/ class=md-tabs__link> API Reference </a> </li> <li class=md-tabs__item> <a href=../contributing/ class=md-tabs__link> Contributing </a> </li> <li class=md-tabs__item> <a href=../license/ class=md-tabs__link> License </a> </li> <li class=md-tabs__item> <a href=../team/ class=md-tabs__link> Team </a> </li> </ul> </div> </nav> <main class=md-main data-md-component=main> <div class="md-main__inner md-grid"> <div class="md-sidebar md-sidebar--primary" data-md-component=sidebar data-md-type=navigation> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--primary md-nav--lifted" aria-label=Navigation data-md-level=0> <label class=md-nav__title for=__drawer> <a href=.. title=DeepCritical class="md-nav__button md-logo" aria-label=DeepCritical data-md-component=logo> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg> </a> DeepCritical </label> <div class=md-nav__source> <a href=https://github.com/DeepCritical/GradioDemo title="Go to repository" class=md-source data-md-component=source> <div class="md-source__icon md-icon"> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </div> <div class=md-source__repository> DeepCritical/GradioDemo </div> </a> </div> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=.. class=md-nav__link> <span class=md-ellipsis> Home </span> </a> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_2> <label class=md-nav__link for=__nav_2 id=__nav_2_label tabindex=0> <span class=md-ellipsis> Overview </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_2_label aria-expanded=false> <label class=md-nav__title for=__nav_2> <span class="md-nav__icon md-icon"></span> Overview </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../overview/architecture/ class=md-nav__link> <span class=md-ellipsis> Architecture Overview </span> </a> </li> <li class=md-nav__item> <a href=../overview/features/ class=md-nav__link> <span class=md-ellipsis> Features </span> </a> </li> <li class=md-nav__item> <a href=../overview/quick-start/ class=md-nav__link> <span class=md-ellipsis> Quick Start </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_3> <label class=md-nav__link for=__nav_3 id=__nav_3_label tabindex=0> <span class=md-ellipsis> Getting Started </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_3_label aria-expanded=false> <label class=md-nav__title for=__nav_3> <span class="md-nav__icon md-icon"></span> Getting Started </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../getting-started/installation/ class=md-nav__link> <span class=md-ellipsis> Installation </span> </a> </li> <li class=md-nav__item> <a href=../getting-started/quick-start/ class=md-nav__link> <span class=md-ellipsis> Quick Start Guide </span> </a> </li> <li class=md-nav__item> <a href=../getting-started/mcp-integration/ class=md-nav__link> <span class=md-ellipsis> MCP Integration </span> </a> </li> <li class=md-nav__item> <a href=../getting-started/examples/ class=md-nav__link> <span class=md-ellipsis> Examples </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested"> <input class="md-nav__toggle md-toggle " type=checkbox id=__nav_4 checked> <label class=md-nav__link for=__nav_4 id=__nav_4_label tabindex> <span class=md-ellipsis> Configuration </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_4_label aria-expanded=true> <label class=md-nav__title for=__nav_4> <span class="md-nav__icon md-icon"></span> Configuration </label> <ul class=md-nav__list data-md-scrollfix> <li class="md-nav__item md-nav__item--active"> <input class="md-nav__toggle md-toggle" type=checkbox id=__toc> <label class="md-nav__link md-nav__link--active" for=__toc> <span class=md-ellipsis> Configuration Guide </span> <span class="md-nav__icon md-icon"></span> </label> <a href=./ class="md-nav__link md-nav__link--active"> <span class=md-ellipsis> Configuration Guide </span> </a> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#overview class=md-nav__link> <span class=md-ellipsis> Overview </span> </a> </li> <li class=md-nav__item> <a href=#quick-start class=md-nav__link> <span class=md-ellipsis> Quick Start </span> </a> </li> <li class=md-nav__item> <a href=#configuration-system-architecture class=md-nav__link> <span class=md-ellipsis> Configuration System Architecture </span> </a> <nav class=md-nav aria-label="Configuration System Architecture"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#settings-class class=md-nav__link> <span class=md-ellipsis> Settings Class </span> </a> </li> <li class=md-nav__item> <a href=#singleton-instance class=md-nav__link> <span class=md-ellipsis> Singleton Instance </span> </a> </li> </ul> </nav> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=CONFIGURATION/ class=md-nav__link> <span class=md-ellipsis> Configuration Guide </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_5> <label class=md-nav__link for=__nav_5 id=__nav_5_label tabindex=0> <span class=md-ellipsis> Architecture </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_5_label aria-expanded=false> <label class=md-nav__title for=__nav_5> <span class="md-nav__icon md-icon"></span> Architecture </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../architecture/graph-orchestration/ class=md-nav__link> <span class=md-ellipsis> Graph Orchestration Architecture </span> </a> </li> <li class=md-nav__item> <a href=../architecture/graph_orchestration/ class=md-nav__link> <span class=md-ellipsis> Graph Orchestration Architecture </span> </a> </li> <li class=md-nav__item> <a href=../architecture/workflows/ class=md-nav__link> <span class=md-ellipsis> DeepCritical Workflow - Simplified Magentic Architecture </span> </a> </li> <li class=md-nav__item> <a href=../architecture/workflow-diagrams/ class=md-nav__link> <span class=md-ellipsis> DeepCritical Workflow - Simplified Magentic Architecture </span> </a> </li> <li class=md-nav__item> <a href=../architecture/agents/ class=md-nav__link> <span class=md-ellipsis> Agents Architecture </span> </a> </li> <li class=md-nav__item> <a href=../architecture/orchestrators/ class=md-nav__link> <span class=md-ellipsis> Orchestrators Architecture </span> </a> </li> <li class=md-nav__item> <a href=../architecture/tools/ class=md-nav__link> <span class=md-ellipsis> Tools Architecture </span> </a> </li> <li class=md-nav__item> <a href=../architecture/middleware/ class=md-nav__link> <span class=md-ellipsis> Middleware Architecture </span> </a> </li> <li class=md-nav__item> <a href=../architecture/services/ class=md-nav__link> <span class=md-ellipsis> Services Architecture </span> </a> </li> </ul> </nav> </li> <li class="md-nav__item md-nav__item--nested"> <input class="md-nav__toggle md-toggle md-toggle--indeterminate" type=checkbox id=__nav_6> <label class=md-nav__link for=__nav_6 id=__nav_6_label tabindex=0> <span class=md-ellipsis> API Reference </span> <span class="md-nav__icon md-icon"></span> </label> <nav class=md-nav data-md-level=1 aria-labelledby=__nav_6_label aria-expanded=false> <label class=md-nav__title for=__nav_6> <span class="md-nav__icon md-icon"></span> API Reference </label> <ul class=md-nav__list data-md-scrollfix> <li class=md-nav__item> <a href=../api/agents/ class=md-nav__link> <span class=md-ellipsis> Agents API Reference </span> </a> </li> <li class=md-nav__item> <a href=../api/tools/ class=md-nav__link> <span class=md-ellipsis> Tools API Reference </span> </a> </li> <li class=md-nav__item> <a href=../api/orchestrators/ class=md-nav__link> <span class=md-ellipsis> Orchestrators API Reference </span> </a> </li> <li class=md-nav__item> <a href=../api/services/ class=md-nav__link> <span class=md-ellipsis> Services API Reference </span> </a> </li> <li class=md-nav__item> <a href=../api/models/ class=md-nav__link> <span class=md-ellipsis> Models API Reference </span> </a> </li> </ul> </nav> </li> <li class=md-nav__item> <a href=../contributing/ class=md-nav__link> <span class=md-ellipsis> Contributing </span> </a> </li> <li class=md-nav__item> <a href=../license/ class=md-nav__link> <span class=md-ellipsis> License </span> </a> </li> <li class=md-nav__item> <a href=../team/ class=md-nav__link> <span class=md-ellipsis> Team </span> </a> </li> </ul> </nav> </div> </div> </div> <div class="md-sidebar md-sidebar--secondary" data-md-component=sidebar data-md-type=toc> <div class=md-sidebar__scrollwrap> <div class=md-sidebar__inner> <nav class="md-nav md-nav--secondary" aria-label="Table of contents"> <label class=md-nav__title for=__toc> <span class="md-nav__icon md-icon"></span> Table of contents </label> <ul class=md-nav__list data-md-component=toc data-md-scrollfix> <li class=md-nav__item> <a href=#overview class=md-nav__link> <span class=md-ellipsis> Overview </span> </a> </li> <li class=md-nav__item> <a href=#quick-start class=md-nav__link> <span class=md-ellipsis> Quick Start </span> </a> </li> <li class=md-nav__item> <a href=#configuration-system-architecture class=md-nav__link> <span class=md-ellipsis> Configuration System Architecture </span> </a> <nav class=md-nav aria-label="Configuration System Architecture"> <ul class=md-nav__list> <li class=md-nav__item> <a href=#settings-class class=md-nav__link> <span class=md-ellipsis> Settings Class </span> </a> </li> <li class=md-nav__item> <a href=#singleton-instance class=md-nav__link> <span class=md-ellipsis> Singleton Instance </span> </a> </li> </ul> </nav> </li> </ul> </nav> </div> </div> </div> <div class=md-content data-md-component=content> <article class="md-content__inner md-typeset"> <h1 id=configuration-guide>Configuration Guide<a class=headerlink href=#configuration-guide title="Permanent link">&para;</a></h1> <h2 id=overview>Overview<a class=headerlink href=#overview title="Permanent link">&para;</a></h2> <p>DeepCritical uses <strong>Pydantic Settings</strong> for centralized configuration management. All settings are defined in the <code>Settings</code> class in <code>src/utils/config.py</code> and can be configured via environment variables or a <code>.env</code> file.</p> <p>The configuration system provides:</p> <ul> <li><strong>Type Safety</strong>: Strongly-typed fields with Pydantic validation</li> <li><strong>Environment File Support</strong>: Automatically loads from <code>.env</code> file (if present)</li> <li><strong>Case-Insensitive</strong>: Environment variables are case-insensitive</li> <li><strong>Singleton Pattern</strong>: Global <code>settings</code> instance for easy access throughout the codebase</li> <li><strong>Validation</strong>: Automatic validation on load with helpful error messages</li> </ul> <h2 id=quick-start>Quick Start<a class=headerlink href=#quick-start title="Permanent link">&para;</a></h2> <ol> <li>Create a <code>.env</code> file in the project root</li> <li>Set at least one LLM API key (<code>OPENAI_API_KEY</code>, <code>ANTHROPIC_API_KEY</code>, or <code>HF_TOKEN</code>)</li> <li>Optionally configure other services as needed</li> <li>The application will automatically load and validate your configuration</li> </ol> <h2 id=configuration-system-architecture>Configuration System Architecture<a class=headerlink href=#configuration-system-architecture title="Permanent link">&para;</a></h2> <h3 id=settings-class>Settings Class<a class=headerlink href=#settings-class title="Permanent link">&para;</a></h3> <p>The [<code>Settings</code>][settings-class] class extends <code>BaseSettings</code> from <code>pydantic_settings</code> and defines all application configuration:</p> <p>```13:21:src/utils/config.py class Settings(BaseSettings): """Strongly-typed application settings."""</p> <div class=highlight><pre><span></span><code>model_config = SettingsConfigDict(
    env_file=&quot;.env&quot;,
    env_file_encoding=&quot;utf-8&quot;,
    case_sensitive=False,
    extra=&quot;ignore&quot;,
)
</code></pre></div> <p>``` <a href=https://github.com/DeepCritical/GradioDemo/blob/main/src/utils/config.py#L13-L21>View source</a> </p> <h3 id=singleton-instance>Singleton Instance<a class=headerlink href=#singleton-instance title="Permanent link">&para;</a></h3> <p>A global <code>settings</code> instance is available for import: ```234:235:src/utils/config.py</p> <h1 id=singleton-for-easy-import>Singleton for easy import<a class=headerlink href=#singleton-for-easy-import title="Permanent link">&para;</a></h1> <p>settings = get_settings() ```</p> <p><a href=https://github.com/DeepCritical/GradioDemo/blob/main/src/utils/config.py#L234-L235>View source</a></p> <h3 id=usage-pattern>Usage Pattern<a class=headerlink href=#usage-pattern title="Permanent link">&para;</a></h3> <p>Access configuration throughout the codebase:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-1-1 name=__codelineno-1-1 href=#__codelineno-1-1></a><span class=kn>from</span><span class=w> </span><span class=nn>src.utils.config</span><span class=w> </span><span class=kn>import</span> <span class=n>settings</span>
<a id=__codelineno-1-2 name=__codelineno-1-2 href=#__codelineno-1-2></a>
<a id=__codelineno-1-3 name=__codelineno-1-3 href=#__codelineno-1-3></a><span class=c1># Check if API keys are available</span>
<a id=__codelineno-1-4 name=__codelineno-1-4 href=#__codelineno-1-4></a><span class=k>if</span> <span class=n>settings</span><span class=o>.</span><span class=n>has_openai_key</span><span class=p>:</span>
<a id=__codelineno-1-5 name=__codelineno-1-5 href=#__codelineno-1-5></a>    <span class=c1># Use OpenAI</span>
<a id=__codelineno-1-6 name=__codelineno-1-6 href=#__codelineno-1-6></a>    <span class=k>pass</span>
<a id=__codelineno-1-7 name=__codelineno-1-7 href=#__codelineno-1-7></a>
<a id=__codelineno-1-8 name=__codelineno-1-8 href=#__codelineno-1-8></a><span class=c1># Access configuration values</span>
<a id=__codelineno-1-9 name=__codelineno-1-9 href=#__codelineno-1-9></a><span class=n>max_iterations</span> <span class=o>=</span> <span class=n>settings</span><span class=o>.</span><span class=n>max_iterations</span>
<a id=__codelineno-1-10 name=__codelineno-1-10 href=#__codelineno-1-10></a><span class=n>web_search_provider</span> <span class=o>=</span> <span class=n>settings</span><span class=o>.</span><span class=n>web_search_provider</span>
</code></pre></div> <h2 id=required-configuration>Required Configuration<a class=headerlink href=#required-configuration title="Permanent link">&para;</a></h2> <h3 id=llm-provider>LLM Provider<a class=headerlink href=#llm-provider title="Permanent link">&para;</a></h3> <p>You must configure at least one LLM provider. The system supports:</p> <ul> <li><strong>OpenAI</strong>: Requires <code>OPENAI_API_KEY</code></li> <li><strong>Anthropic</strong>: Requires <code>ANTHROPIC_API_KEY</code></li> <li><strong>HuggingFace</strong>: Optional <code>HF_TOKEN</code> or <code>HUGGINGFACE_API_KEY</code> (can work without key for public models)</li> </ul> <h4 id=openai-configuration>OpenAI Configuration<a class=headerlink href=#openai-configuration title="Permanent link">&para;</a></h4> <div class=highlight><pre><span></span><code><a id=__codelineno-2-1 name=__codelineno-2-1 href=#__codelineno-2-1></a><span class=nv>LLM_PROVIDER</span><span class=o>=</span>openai
<a id=__codelineno-2-2 name=__codelineno-2-2 href=#__codelineno-2-2></a><span class=nv>OPENAI_API_KEY</span><span class=o>=</span>your_openai_api_key_here
<a id=__codelineno-2-3 name=__codelineno-2-3 href=#__codelineno-2-3></a><span class=nv>OPENAI_MODEL</span><span class=o>=</span>gpt-5.1
</code></pre></div> <p>The default model is defined in the <code>Settings</code> class:</p> <p>```29:29:src/utils/config.py openai_model: str = Field(default="gpt-5.1", description="OpenAI model name") <div class=highlight><pre><span></span><code><a id=__codelineno-3-1 name=__codelineno-3-1 href=#__codelineno-3-1></a>#### Anthropic Configuration
<a id=__codelineno-3-2 name=__codelineno-3-2 href=#__codelineno-3-2></a>
<a id=__codelineno-3-3 name=__codelineno-3-3 href=#__codelineno-3-3></a>```bash
<a id=__codelineno-3-4 name=__codelineno-3-4 href=#__codelineno-3-4></a>LLM_PROVIDER=anthropic
<a id=__codelineno-3-5 name=__codelineno-3-5 href=#__codelineno-3-5></a>ANTHROPIC_API_KEY=your_anthropic_api_key_here
<a id=__codelineno-3-6 name=__codelineno-3-6 href=#__codelineno-3-6></a>ANTHROPIC_MODEL=claude-sonnet-4-5-20250929
</code></pre></div></p> <p>The default model is defined in the <code>Settings</code> class:</p> <p>```30:32:src/utils/config.py anthropic_model: str = Field( default="claude-sonnet-4-5-20250929", description="Anthropic model" ) <div class=highlight><pre><span></span><code><a id=__codelineno-4-1 name=__codelineno-4-1 href=#__codelineno-4-1></a>#### HuggingFace Configuration
<a id=__codelineno-4-2 name=__codelineno-4-2 href=#__codelineno-4-2></a>
<a id=__codelineno-4-3 name=__codelineno-4-3 href=#__codelineno-4-3></a>HuggingFace can work without an API key for public models, but an API key provides higher rate limits:
<a id=__codelineno-4-4 name=__codelineno-4-4 href=#__codelineno-4-4></a>
<a id=__codelineno-4-5 name=__codelineno-4-5 href=#__codelineno-4-5></a>```bash
<a id=__codelineno-4-6 name=__codelineno-4-6 href=#__codelineno-4-6></a># Option 1: Using HF_TOKEN (preferred)
<a id=__codelineno-4-7 name=__codelineno-4-7 href=#__codelineno-4-7></a>HF_TOKEN=your_huggingface_token_here
<a id=__codelineno-4-8 name=__codelineno-4-8 href=#__codelineno-4-8></a>
<a id=__codelineno-4-9 name=__codelineno-4-9 href=#__codelineno-4-9></a># Option 2: Using HUGGINGFACE_API_KEY (alternative)
<a id=__codelineno-4-10 name=__codelineno-4-10 href=#__codelineno-4-10></a>HUGGINGFACE_API_KEY=your_huggingface_api_key_here
<a id=__codelineno-4-11 name=__codelineno-4-11 href=#__codelineno-4-11></a>
<a id=__codelineno-4-12 name=__codelineno-4-12 href=#__codelineno-4-12></a># Default model
<a id=__codelineno-4-13 name=__codelineno-4-13 href=#__codelineno-4-13></a>HUGGINGFACE_MODEL=meta-llama/Llama-3.1-8B-Instruct
</code></pre></div></p> <p>The HuggingFace token can be set via either environment variable:</p> <p>```33:35:src/utils/config.py hf_token: str | None = Field( default=None, alias="HF_TOKEN", description="HuggingFace API token" ) <div class=highlight><pre><span></span><code><a id=__codelineno-5-1 name=__codelineno-5-1 href=#__codelineno-5-1></a>```57:59:src/utils/config.py
<a id=__codelineno-5-2 name=__codelineno-5-2 href=#__codelineno-5-2></a>    huggingface_api_key: str | None = Field(
<a id=__codelineno-5-3 name=__codelineno-5-3 href=#__codelineno-5-3></a>        default=None, description=&quot;HuggingFace API token (HF_TOKEN or HUGGINGFACE_API_KEY)&quot;
<a id=__codelineno-5-4 name=__codelineno-5-4 href=#__codelineno-5-4></a>    )
</code></pre></div></p> <h2 id=optional-configuration>Optional Configuration<a class=headerlink href=#optional-configuration title="Permanent link">&para;</a></h2> <h3 id=embedding-configuration>Embedding Configuration<a class=headerlink href=#embedding-configuration title="Permanent link">&para;</a></h3> <p>DeepCritical supports multiple embedding providers for semantic search and RAG:</p> <div class=highlight><pre><span></span><code><a id=__codelineno-6-1 name=__codelineno-6-1 href=#__codelineno-6-1></a><span class=c1># Embedding Provider: &quot;openai&quot;, &quot;local&quot;, or &quot;huggingface&quot;</span>
<a id=__codelineno-6-2 name=__codelineno-6-2 href=#__codelineno-6-2></a><span class=nv>EMBEDDING_PROVIDER</span><span class=o>=</span><span class=nb>local</span>
<a id=__codelineno-6-3 name=__codelineno-6-3 href=#__codelineno-6-3></a>
<a id=__codelineno-6-4 name=__codelineno-6-4 href=#__codelineno-6-4></a><span class=c1># OpenAI Embedding Model (used by LlamaIndex RAG)</span>
<a id=__codelineno-6-5 name=__codelineno-6-5 href=#__codelineno-6-5></a><span class=nv>OPENAI_EMBEDDING_MODEL</span><span class=o>=</span>text-embedding-3-small
<a id=__codelineno-6-6 name=__codelineno-6-6 href=#__codelineno-6-6></a>
<a id=__codelineno-6-7 name=__codelineno-6-7 href=#__codelineno-6-7></a><span class=c1># Local Embedding Model (sentence-transformers, used by EmbeddingService)</span>
<a id=__codelineno-6-8 name=__codelineno-6-8 href=#__codelineno-6-8></a><span class=nv>LOCAL_EMBEDDING_MODEL</span><span class=o>=</span>all-MiniLM-L6-v2
<a id=__codelineno-6-9 name=__codelineno-6-9 href=#__codelineno-6-9></a>
<a id=__codelineno-6-10 name=__codelineno-6-10 href=#__codelineno-6-10></a><span class=c1># HuggingFace Embedding Model</span>
<a id=__codelineno-6-11 name=__codelineno-6-11 href=#__codelineno-6-11></a><span class=nv>HUGGINGFACE_EMBEDDING_MODEL</span><span class=o>=</span>sentence-transformers/all-MiniLM-L6-v2
</code></pre></div> <p>The embedding provider configuration:</p> <p>```47:50:src/utils/config.py embedding_provider: Literal["openai", "local", "huggingface"] = Field( default="local", description="Embedding provider to use", ) <div class=highlight><pre><span></span><code><a id=__codelineno-7-1 name=__codelineno-7-1 href=#__codelineno-7-1></a>**Note**: OpenAI embeddings require `OPENAI_API_KEY`. The local provider (default) uses sentence-transformers and requires no API key.
<a id=__codelineno-7-2 name=__codelineno-7-2 href=#__codelineno-7-2></a>
<a id=__codelineno-7-3 name=__codelineno-7-3 href=#__codelineno-7-3></a>### Web Search Configuration
<a id=__codelineno-7-4 name=__codelineno-7-4 href=#__codelineno-7-4></a>
<a id=__codelineno-7-5 name=__codelineno-7-5 href=#__codelineno-7-5></a>DeepCritical supports multiple web search providers:
<a id=__codelineno-7-6 name=__codelineno-7-6 href=#__codelineno-7-6></a>
<a id=__codelineno-7-7 name=__codelineno-7-7 href=#__codelineno-7-7></a>```bash
<a id=__codelineno-7-8 name=__codelineno-7-8 href=#__codelineno-7-8></a># Web Search Provider: &quot;serper&quot;, &quot;searchxng&quot;, &quot;brave&quot;, &quot;tavily&quot;, or &quot;duckduckgo&quot;
<a id=__codelineno-7-9 name=__codelineno-7-9 href=#__codelineno-7-9></a># Default: &quot;duckduckgo&quot; (no API key required)
<a id=__codelineno-7-10 name=__codelineno-7-10 href=#__codelineno-7-10></a>WEB_SEARCH_PROVIDER=duckduckgo
<a id=__codelineno-7-11 name=__codelineno-7-11 href=#__codelineno-7-11></a>
<a id=__codelineno-7-12 name=__codelineno-7-12 href=#__codelineno-7-12></a># Serper API Key (for Google search via Serper)
<a id=__codelineno-7-13 name=__codelineno-7-13 href=#__codelineno-7-13></a>SERPER_API_KEY=your_serper_api_key_here
<a id=__codelineno-7-14 name=__codelineno-7-14 href=#__codelineno-7-14></a>
<a id=__codelineno-7-15 name=__codelineno-7-15 href=#__codelineno-7-15></a># SearchXNG Host URL (for self-hosted search)
<a id=__codelineno-7-16 name=__codelineno-7-16 href=#__codelineno-7-16></a>SEARCHXNG_HOST=http://localhost:8080
<a id=__codelineno-7-17 name=__codelineno-7-17 href=#__codelineno-7-17></a>
<a id=__codelineno-7-18 name=__codelineno-7-18 href=#__codelineno-7-18></a># Brave Search API Key
<a id=__codelineno-7-19 name=__codelineno-7-19 href=#__codelineno-7-19></a>BRAVE_API_KEY=your_brave_api_key_here
<a id=__codelineno-7-20 name=__codelineno-7-20 href=#__codelineno-7-20></a>
<a id=__codelineno-7-21 name=__codelineno-7-21 href=#__codelineno-7-21></a># Tavily API Key
<a id=__codelineno-7-22 name=__codelineno-7-22 href=#__codelineno-7-22></a>TAVILY_API_KEY=your_tavily_api_key_here
</code></pre></div></p> <p>The web search provider configuration:</p> <p>```71:74:src/utils/config.py web_search_provider: Literal["serper", "searchxng", "brave", "tavily", "duckduckgo"] = Field( default="duckduckgo", description="Web search provider to use", ) <div class=highlight><pre><span></span><code><a id=__codelineno-8-1 name=__codelineno-8-1 href=#__codelineno-8-1></a>**Note**: DuckDuckGo is the default and requires no API key, making it ideal for development and testing.
<a id=__codelineno-8-2 name=__codelineno-8-2 href=#__codelineno-8-2></a>
<a id=__codelineno-8-3 name=__codelineno-8-3 href=#__codelineno-8-3></a>### PubMed Configuration
<a id=__codelineno-8-4 name=__codelineno-8-4 href=#__codelineno-8-4></a>
<a id=__codelineno-8-5 name=__codelineno-8-5 href=#__codelineno-8-5></a>PubMed search supports optional NCBI API key for higher rate limits:
<a id=__codelineno-8-6 name=__codelineno-8-6 href=#__codelineno-8-6></a>
<a id=__codelineno-8-7 name=__codelineno-8-7 href=#__codelineno-8-7></a>```bash
<a id=__codelineno-8-8 name=__codelineno-8-8 href=#__codelineno-8-8></a># NCBI API Key (optional, for higher rate limits: 10 req/sec vs 3 req/sec)
<a id=__codelineno-8-9 name=__codelineno-8-9 href=#__codelineno-8-9></a>NCBI_API_KEY=your_ncbi_api_key_here
</code></pre></div></p> <p>The PubMed tool uses this configuration:</p> <p>```22:29:src/tools/pubmed.py def <strong>init</strong>(self, api_key: str | None = None) -&gt; None: self.api_key = api_key or settings.ncbi_api_key # Ignore placeholder values from .env.example if self.api_key == "your-ncbi-key-here": self.api_key = None</p> <div class=highlight><pre><span></span><code>    # Use shared rate limiter
    self._limiter = get_pubmed_limiter(self.api_key)
</code></pre></div> <p>``` </p> <h3 id=agent-configuration>Agent Configuration<a class=headerlink href=#agent-configuration title="Permanent link">&para;</a></h3> <p>Control agent behavior and research loop execution: ```bash</p> <h1 id=maximum-iterations-per-research-loop-1-50-default-10>Maximum iterations per research loop (1-50, default: 10)<a class=headerlink href=#maximum-iterations-per-research-loop-1-50-default-10 title="Permanent link">&para;</a></h1> <p>MAX_ITERATIONS=10 </p> <h1 id=search-timeout-in-seconds>Search timeout in seconds<a class=headerlink href=#search-timeout-in-seconds title="Permanent link">&para;</a></h1> <p>SEARCH_TIMEOUT=30 </p> <h1 id=use-graph-based-execution-for-research-flows>Use graph-based execution for research flows<a class=headerlink href=#use-graph-based-execution-for-research-flows title="Permanent link">&para;</a></h1> <p>USE_GRAPH_EXECUTION=false ```</p> <p>The agent configuration fields:</p> <p>```80:85:src/utils/config.py # Agent Configuration max_iterations: int = Field(default=10, ge=1, le=50) search_timeout: int = Field(default=30, description="Seconds to wait for search") use_graph_execution: bool = Field( default=False, description="Use graph-based execution for research flows" ) <div class=highlight><pre><span></span><code><a id=__codelineno-10-1 name=__codelineno-10-1 href=#__codelineno-10-1></a>### Budget &amp; Rate Limiting Configuration
<a id=__codelineno-10-2 name=__codelineno-10-2 href=#__codelineno-10-2></a>
<a id=__codelineno-10-3 name=__codelineno-10-3 href=#__codelineno-10-3></a>Control resource limits for research loops:
<a id=__codelineno-10-4 name=__codelineno-10-4 href=#__codelineno-10-4></a>
<a id=__codelineno-10-5 name=__codelineno-10-5 href=#__codelineno-10-5></a>```bash
<a id=__codelineno-10-6 name=__codelineno-10-6 href=#__codelineno-10-6></a># Default token budget per research loop (1000-1000000, default: 100000)
<a id=__codelineno-10-7 name=__codelineno-10-7 href=#__codelineno-10-7></a>DEFAULT_TOKEN_LIMIT=100000
<a id=__codelineno-10-8 name=__codelineno-10-8 href=#__codelineno-10-8></a>
<a id=__codelineno-10-9 name=__codelineno-10-9 href=#__codelineno-10-9></a># Default time limit per research loop in minutes (1-120, default: 10)
<a id=__codelineno-10-10 name=__codelineno-10-10 href=#__codelineno-10-10></a>DEFAULT_TIME_LIMIT_MINUTES=10
<a id=__codelineno-10-11 name=__codelineno-10-11 href=#__codelineno-10-11></a>
<a id=__codelineno-10-12 name=__codelineno-10-12 href=#__codelineno-10-12></a># Default iterations limit per research loop (1-50, default: 10)
<a id=__codelineno-10-13 name=__codelineno-10-13 href=#__codelineno-10-13></a>DEFAULT_ITERATIONS_LIMIT=10
</code></pre></div></p> <p>The budget configuration with validation:</p> <p>```87:105:src/utils/config.py # Budget &amp; Rate Limiting Configuration default_token_limit: int = Field( default=100000, ge=1000, le=1000000, description="Default token budget per research loop", ) default_time_limit_minutes: int = Field( default=10, ge=1, le=120, description="Default time limit per research loop (minutes)", ) default_iterations_limit: int = Field( default=10, ge=1, le=50, description="Default iterations limit per research loop", ) <div class=highlight><pre><span></span><code><a id=__codelineno-11-1 name=__codelineno-11-1 href=#__codelineno-11-1></a>### RAG Service Configuration
<a id=__codelineno-11-2 name=__codelineno-11-2 href=#__codelineno-11-2></a>
<a id=__codelineno-11-3 name=__codelineno-11-3 href=#__codelineno-11-3></a>Configure the Retrieval-Augmented Generation service:
<a id=__codelineno-11-4 name=__codelineno-11-4 href=#__codelineno-11-4></a>
<a id=__codelineno-11-5 name=__codelineno-11-5 href=#__codelineno-11-5></a>```bash
<a id=__codelineno-11-6 name=__codelineno-11-6 href=#__codelineno-11-6></a># ChromaDB collection name for RAG
<a id=__codelineno-11-7 name=__codelineno-11-7 href=#__codelineno-11-7></a>RAG_COLLECTION_NAME=deepcritical_evidence
<a id=__codelineno-11-8 name=__codelineno-11-8 href=#__codelineno-11-8></a>
<a id=__codelineno-11-9 name=__codelineno-11-9 href=#__codelineno-11-9></a># Number of top results to retrieve from RAG (1-50, default: 5)
<a id=__codelineno-11-10 name=__codelineno-11-10 href=#__codelineno-11-10></a>RAG_SIMILARITY_TOP_K=5
<a id=__codelineno-11-11 name=__codelineno-11-11 href=#__codelineno-11-11></a>
<a id=__codelineno-11-12 name=__codelineno-11-12 href=#__codelineno-11-12></a># Automatically ingest evidence into RAG
<a id=__codelineno-11-13 name=__codelineno-11-13 href=#__codelineno-11-13></a>RAG_AUTO_INGEST=true
</code></pre></div></p> <p>The RAG configuration:</p> <p>```127:141:src/utils/config.py # RAG Service Configuration rag_collection_name: str = Field( default="deepcritical_evidence", description="ChromaDB collection name for RAG", ) rag_similarity_top_k: int = Field( default=5, ge=1, le=50, description="Number of top results to retrieve from RAG", ) rag_auto_ingest: bool = Field( default=True, description="Automatically ingest evidence into RAG", ) <div class=highlight><pre><span></span><code><a id=__codelineno-12-1 name=__codelineno-12-1 href=#__codelineno-12-1></a>### ChromaDB Configuration
<a id=__codelineno-12-2 name=__codelineno-12-2 href=#__codelineno-12-2></a>
<a id=__codelineno-12-3 name=__codelineno-12-3 href=#__codelineno-12-3></a>Configure the vector database for embeddings and RAG:
<a id=__codelineno-12-4 name=__codelineno-12-4 href=#__codelineno-12-4></a>
<a id=__codelineno-12-5 name=__codelineno-12-5 href=#__codelineno-12-5></a>```bash
<a id=__codelineno-12-6 name=__codelineno-12-6 href=#__codelineno-12-6></a># ChromaDB storage path
<a id=__codelineno-12-7 name=__codelineno-12-7 href=#__codelineno-12-7></a>CHROMA_DB_PATH=./chroma_db
<a id=__codelineno-12-8 name=__codelineno-12-8 href=#__codelineno-12-8></a>
<a id=__codelineno-12-9 name=__codelineno-12-9 href=#__codelineno-12-9></a># Whether to persist ChromaDB to disk
<a id=__codelineno-12-10 name=__codelineno-12-10 href=#__codelineno-12-10></a>CHROMA_DB_PERSIST=true
<a id=__codelineno-12-11 name=__codelineno-12-11 href=#__codelineno-12-11></a>
<a id=__codelineno-12-12 name=__codelineno-12-12 href=#__codelineno-12-12></a># ChromaDB server host (for remote ChromaDB, optional)
<a id=__codelineno-12-13 name=__codelineno-12-13 href=#__codelineno-12-13></a>CHROMA_DB_HOST=localhost
<a id=__codelineno-12-14 name=__codelineno-12-14 href=#__codelineno-12-14></a>
<a id=__codelineno-12-15 name=__codelineno-12-15 href=#__codelineno-12-15></a># ChromaDB server port (for remote ChromaDB, optional)
<a id=__codelineno-12-16 name=__codelineno-12-16 href=#__codelineno-12-16></a>CHROMA_DB_PORT=8000
</code></pre></div></p> <p>The ChromaDB configuration:</p> <p>```113:125:src/utils/config.py chroma_db_path: str = Field(default="./chroma_db", description="ChromaDB storage path") chroma_db_persist: bool = Field( default=True, description="Whether to persist ChromaDB to disk", ) chroma_db_host: str | None = Field( default=None, description="ChromaDB server host (for remote ChromaDB)", ) chroma_db_port: int | None = Field( default=None, description="ChromaDB server port (for remote ChromaDB)", ) <div class=highlight><pre><span></span><code><a id=__codelineno-13-1 name=__codelineno-13-1 href=#__codelineno-13-1></a>### External Services
<a id=__codelineno-13-2 name=__codelineno-13-2 href=#__codelineno-13-2></a>
<a id=__codelineno-13-3 name=__codelineno-13-3 href=#__codelineno-13-3></a>#### Modal Configuration
<a id=__codelineno-13-4 name=__codelineno-13-4 href=#__codelineno-13-4></a>
<a id=__codelineno-13-5 name=__codelineno-13-5 href=#__codelineno-13-5></a>Modal is used for secure sandbox execution of statistical analysis:
<a id=__codelineno-13-6 name=__codelineno-13-6 href=#__codelineno-13-6></a>
<a id=__codelineno-13-7 name=__codelineno-13-7 href=#__codelineno-13-7></a>```bash
<a id=__codelineno-13-8 name=__codelineno-13-8 href=#__codelineno-13-8></a># Modal Token ID (for Modal sandbox execution)
<a id=__codelineno-13-9 name=__codelineno-13-9 href=#__codelineno-13-9></a>MODAL_TOKEN_ID=your_modal_token_id_here
<a id=__codelineno-13-10 name=__codelineno-13-10 href=#__codelineno-13-10></a>
<a id=__codelineno-13-11 name=__codelineno-13-11 href=#__codelineno-13-11></a># Modal Token Secret
<a id=__codelineno-13-12 name=__codelineno-13-12 href=#__codelineno-13-12></a>MODAL_TOKEN_SECRET=your_modal_token_secret_here
</code></pre></div></p> <p>The Modal configuration:</p> <p>```110:112:src/utils/config.py # External Services modal_token_id: str | None = Field(default=None, description="Modal token ID") modal_token_secret: str | None = Field(default=None, description="Modal token secret") <div class=highlight><pre><span></span><code><a id=__codelineno-14-1 name=__codelineno-14-1 href=#__codelineno-14-1></a>### Logging Configuration
<a id=__codelineno-14-2 name=__codelineno-14-2 href=#__codelineno-14-2></a>
<a id=__codelineno-14-3 name=__codelineno-14-3 href=#__codelineno-14-3></a>Configure structured logging:
<a id=__codelineno-14-4 name=__codelineno-14-4 href=#__codelineno-14-4></a>
<a id=__codelineno-14-5 name=__codelineno-14-5 href=#__codelineno-14-5></a>```bash
<a id=__codelineno-14-6 name=__codelineno-14-6 href=#__codelineno-14-6></a># Log Level: &quot;DEBUG&quot;, &quot;INFO&quot;, &quot;WARNING&quot;, or &quot;ERROR&quot;
<a id=__codelineno-14-7 name=__codelineno-14-7 href=#__codelineno-14-7></a>LOG_LEVEL=INFO
</code></pre></div></p> <p>The logging configuration:</p> <p>```107:108:src/utils/config.py # Logging log_level: Literal["DEBUG", "INFO", "WARNING", "ERROR"] = "INFO" <div class=highlight><pre><span></span><code><a id=__codelineno-15-1 name=__codelineno-15-1 href=#__codelineno-15-1></a>Logging is configured via the `configure_logging()` function:
<a id=__codelineno-15-2 name=__codelineno-15-2 href=#__codelineno-15-2></a>
<a id=__codelineno-15-3 name=__codelineno-15-3 href=#__codelineno-15-3></a>```212:231:src/utils/config.py
<a id=__codelineno-15-4 name=__codelineno-15-4 href=#__codelineno-15-4></a>def configure_logging(settings: Settings) -&gt; None:
<a id=__codelineno-15-5 name=__codelineno-15-5 href=#__codelineno-15-5></a>    &quot;&quot;&quot;Configure structured logging with the configured log level.&quot;&quot;&quot;
<a id=__codelineno-15-6 name=__codelineno-15-6 href=#__codelineno-15-6></a>    # Set stdlib logging level from settings
<a id=__codelineno-15-7 name=__codelineno-15-7 href=#__codelineno-15-7></a>    logging.basicConfig(
<a id=__codelineno-15-8 name=__codelineno-15-8 href=#__codelineno-15-8></a>        level=getattr(logging, settings.log_level),
<a id=__codelineno-15-9 name=__codelineno-15-9 href=#__codelineno-15-9></a>        format=&quot;%(message)s&quot;,
<a id=__codelineno-15-10 name=__codelineno-15-10 href=#__codelineno-15-10></a>    )
<a id=__codelineno-15-11 name=__codelineno-15-11 href=#__codelineno-15-11></a>
<a id=__codelineno-15-12 name=__codelineno-15-12 href=#__codelineno-15-12></a>    structlog.configure(
<a id=__codelineno-15-13 name=__codelineno-15-13 href=#__codelineno-15-13></a>        processors=[
<a id=__codelineno-15-14 name=__codelineno-15-14 href=#__codelineno-15-14></a>            structlog.stdlib.filter_by_level,
<a id=__codelineno-15-15 name=__codelineno-15-15 href=#__codelineno-15-15></a>            structlog.stdlib.add_logger_name,
<a id=__codelineno-15-16 name=__codelineno-15-16 href=#__codelineno-15-16></a>            structlog.stdlib.add_log_level,
<a id=__codelineno-15-17 name=__codelineno-15-17 href=#__codelineno-15-17></a>            structlog.processors.TimeStamper(fmt=&quot;iso&quot;),
<a id=__codelineno-15-18 name=__codelineno-15-18 href=#__codelineno-15-18></a>            structlog.processors.JSONRenderer(),
<a id=__codelineno-15-19 name=__codelineno-15-19 href=#__codelineno-15-19></a>        ],
<a id=__codelineno-15-20 name=__codelineno-15-20 href=#__codelineno-15-20></a>        wrapper_class=structlog.stdlib.BoundLogger,
<a id=__codelineno-15-21 name=__codelineno-15-21 href=#__codelineno-15-21></a>        context_class=dict,
<a id=__codelineno-15-22 name=__codelineno-15-22 href=#__codelineno-15-22></a>        logger_factory=structlog.stdlib.LoggerFactory(),
<a id=__codelineno-15-23 name=__codelineno-15-23 href=#__codelineno-15-23></a>    )
</code></pre></div></p> <h2 id=configuration-properties>Configuration Properties<a class=headerlink href=#configuration-properties title="Permanent link">&para;</a></h2> <p>The <code>Settings</code> class provides helpful properties for checking configuration state:</p> <h3 id=api-key-availability>API Key Availability<a class=headerlink href=#api-key-availability title="Permanent link">&para;</a></h3> <p>Check which API keys are available:</p> <p>```171:189:src/utils/config.py @property def has_openai_key(self) -&gt; bool: """Check if OpenAI API key is available.""" return bool(self.openai_api_key)</p> <div class=highlight><pre><span></span><code>@property
def has_anthropic_key(self) -&gt; bool:
    &quot;&quot;&quot;Check if Anthropic API key is available.&quot;&quot;&quot;
    return bool(self.anthropic_api_key)

@property
def has_huggingface_key(self) -&gt; bool:
    &quot;&quot;&quot;Check if HuggingFace API key is available.&quot;&quot;&quot;
    return bool(self.huggingface_api_key or self.hf_token)

@property
def has_any_llm_key(self) -&gt; bool:
    &quot;&quot;&quot;Check if any LLM API key is available.&quot;&quot;&quot;
    return self.has_openai_key or self.has_anthropic_key or self.has_huggingface_key
</code></pre></div> <p><code>**Usage:**</code>python from src.utils.config import settings </p> <h1 id=check-api-key-availability>Check API key availability<a class=headerlink href=#check-api-key-availability title="Permanent link">&para;</a></h1> <p>if settings.has_openai_key: # Use OpenAI pass if settings.has_anthropic_key: # Use Anthropic pass if settings.has_huggingface_key: # Use HuggingFace pass if settings.has_any_llm_key: # At least one LLM is available pass ```</p> <h3 id=service-availability>Service Availability<a class=headerlink href=#service-availability title="Permanent link">&para;</a></h3> <p>Check if external services are configured:</p> <p>```143:146:src/utils/config.py @property def modal_available(self) -&gt; bool: """Check if Modal credentials are configured.""" return bool(self.modal_token_id and self.modal_token_secret) <div class=highlight><pre><span></span><code><a id=__codelineno-17-1 name=__codelineno-17-1 href=#__codelineno-17-1></a>```191:204:src/utils/config.py
<a id=__codelineno-17-2 name=__codelineno-17-2 href=#__codelineno-17-2></a>    @property
<a id=__codelineno-17-3 name=__codelineno-17-3 href=#__codelineno-17-3></a>    def web_search_available(self) -&gt; bool:
<a id=__codelineno-17-4 name=__codelineno-17-4 href=#__codelineno-17-4></a>        &quot;&quot;&quot;Check if web search is available (either no-key provider or API key present).&quot;&quot;&quot;
<a id=__codelineno-17-5 name=__codelineno-17-5 href=#__codelineno-17-5></a>        if self.web_search_provider == &quot;duckduckgo&quot;:
<a id=__codelineno-17-6 name=__codelineno-17-6 href=#__codelineno-17-6></a>            return True  # No API key required
<a id=__codelineno-17-7 name=__codelineno-17-7 href=#__codelineno-17-7></a>        if self.web_search_provider == &quot;serper&quot;:
<a id=__codelineno-17-8 name=__codelineno-17-8 href=#__codelineno-17-8></a>            return bool(self.serper_api_key)
<a id=__codelineno-17-9 name=__codelineno-17-9 href=#__codelineno-17-9></a>        if self.web_search_provider == &quot;searchxng&quot;:
<a id=__codelineno-17-10 name=__codelineno-17-10 href=#__codelineno-17-10></a>            return bool(self.searchxng_host)
<a id=__codelineno-17-11 name=__codelineno-17-11 href=#__codelineno-17-11></a>        if self.web_search_provider == &quot;brave&quot;:
<a id=__codelineno-17-12 name=__codelineno-17-12 href=#__codelineno-17-12></a>            return bool(self.brave_api_key)
<a id=__codelineno-17-13 name=__codelineno-17-13 href=#__codelineno-17-13></a>        if self.web_search_provider == &quot;tavily&quot;:
<a id=__codelineno-17-14 name=__codelineno-17-14 href=#__codelineno-17-14></a>            return bool(self.tavily_api_key)
<a id=__codelineno-17-15 name=__codelineno-17-15 href=#__codelineno-17-15></a>        return False
</code></pre></div></p> <p><strong>Usage:</strong></p> <div class=highlight><pre><span></span><code><a id=__codelineno-18-1 name=__codelineno-18-1 href=#__codelineno-18-1></a><span class=kn>from</span><span class=w> </span><span class=nn>src.utils.config</span><span class=w> </span><span class=kn>import</span> <span class=n>settings</span>
<a id=__codelineno-18-2 name=__codelineno-18-2 href=#__codelineno-18-2></a>
<a id=__codelineno-18-3 name=__codelineno-18-3 href=#__codelineno-18-3></a><span class=c1># Check service availability</span>
<a id=__codelineno-18-4 name=__codelineno-18-4 href=#__codelineno-18-4></a><span class=k>if</span> <span class=n>settings</span><span class=o>.</span><span class=n>modal_available</span><span class=p>:</span>
<a id=__codelineno-18-5 name=__codelineno-18-5 href=#__codelineno-18-5></a>    <span class=c1># Use Modal sandbox</span>
<a id=__codelineno-18-6 name=__codelineno-18-6 href=#__codelineno-18-6></a>    <span class=k>pass</span>
<a id=__codelineno-18-7 name=__codelineno-18-7 href=#__codelineno-18-7></a>
<a id=__codelineno-18-8 name=__codelineno-18-8 href=#__codelineno-18-8></a><span class=k>if</span> <span class=n>settings</span><span class=o>.</span><span class=n>web_search_available</span><span class=p>:</span>
<a id=__codelineno-18-9 name=__codelineno-18-9 href=#__codelineno-18-9></a>    <span class=c1># Web search is configured</span>
<a id=__codelineno-18-10 name=__codelineno-18-10 href=#__codelineno-18-10></a>    <span class=k>pass</span>
</code></pre></div> <h3 id=api-key-retrieval>API Key Retrieval<a class=headerlink href=#api-key-retrieval title="Permanent link">&para;</a></h3> <p>Get the API key for the configured provider:</p> <p>```148:160:src/utils/config.py def get_api_key(self) -&gt; str: """Get the API key for the configured provider.""" if self.llm_provider == "openai": if not self.openai_api_key: raise ConfigurationError("OPENAI_API_KEY not set") return self.openai_api_key</p> <div class=highlight><pre><span></span><code>    if self.llm_provider == &quot;anthropic&quot;:
        if not self.anthropic_api_key:
            raise ConfigurationError(&quot;ANTHROPIC_API_KEY not set&quot;)
        return self.anthropic_api_key

    raise ConfigurationError(f&quot;Unknown LLM provider: {self.llm_provider}&quot;)
</code></pre></div> <p><code>For OpenAI-specific operations (e.g., Magentic mode):</code>162:169:src/utils/config.py def get_openai_api_key(self) -&gt; str: """Get OpenAI API key (required for Magentic function calling).""" if not self.openai_api_key: raise ConfigurationError( "OPENAI_API_KEY not set. Magentic mode requires OpenAI for function calling. " "Use mode='simple' for other providers." ) return self.openai_api_key ```</p> <h2 id=configuration-usage-in-codebase>Configuration Usage in Codebase<a class=headerlink href=#configuration-usage-in-codebase title="Permanent link">&para;</a></h2> <p>The configuration system is used throughout the codebase:</p> <h3 id=llm-factory>LLM Factory<a class=headerlink href=#llm-factory title="Permanent link">&para;</a></h3> <p>The LLM factory uses settings to create appropriate models:</p> <p>```129:144:src/utils/llm_factory.py if settings.llm_provider == "huggingface": model_name = settings.huggingface_model or "meta-llama/Llama-3.1-8B-Instruct" hf_provider = HuggingFaceProvider(api_key=settings.hf_token) return HuggingFaceModel(model_name, provider=hf_provider)</p> <div class=highlight><pre><span></span><code>if settings.llm_provider == &quot;openai&quot;:
    if not settings.openai_api_key:
        raise ConfigurationError(&quot;OPENAI_API_KEY not set for pydantic-ai&quot;)
    provider = OpenAIProvider(api_key=settings.openai_api_key)
    return OpenAIModel(settings.openai_model, provider=provider)

if settings.llm_provider == &quot;anthropic&quot;:
    if not settings.anthropic_api_key:
        raise ConfigurationError(&quot;ANTHROPIC_API_KEY not set for pydantic-ai&quot;)
    anthropic_provider = AnthropicProvider(api_key=settings.anthropic_api_key)
    return AnthropicModel(settings.anthropic_model, provider=anthropic_provider)
</code></pre></div> <p>``` </p> <h3 id=embedding-service>Embedding Service<a class=headerlink href=#embedding-service title="Permanent link">&para;</a></h3> <p>The embedding service uses local embedding model configuration: <code>29:31:src/services/embeddings.py def __init__(self, model_name: str | None = None): self._model_name = model_name or settings.local_embedding_model self._model = SentenceTransformer(self._model_name)</code></p> <h3 id=orchestrator-factory>Orchestrator Factory<a class=headerlink href=#orchestrator-factory title="Permanent link">&para;</a></h3> <p>The orchestrator factory uses settings to determine mode:</p> <p>```69:80:src/orchestrator_factory.py def _determine_mode(explicit_mode: str | None) -&gt; str: """Determine which mode to use.""" if explicit_mode: if explicit_mode in ("magentic", "advanced"): return "advanced" return "simple"</p> <div class=highlight><pre><span></span><code># Auto-detect: advanced if paid API key available
if settings.has_openai_key:
    return &quot;advanced&quot;

return &quot;simple&quot;
</code></pre></div> <p>``` </p> <h2 id=environment-variables-reference>Environment Variables Reference<a class=headerlink href=#environment-variables-reference title="Permanent link">&para;</a></h2> <h3 id=required-at-least-one-llm>Required (at least one LLM)<a class=headerlink href=#required-at-least-one-llm title="Permanent link">&para;</a></h3> <ul> <li><code>OPENAI_API_KEY</code> - OpenAI API key (required for OpenAI provider)</li> <li><code>ANTHROPIC_API_KEY</code> - Anthropic API key (required for Anthropic provider)</li> <li><code>HF_TOKEN</code> or <code>HUGGINGFACE_API_KEY</code> - HuggingFace API token (optional, can work without for public models) </li> </ul> <h4 id=llm-configuration-variables>LLM Configuration Variables<a class=headerlink href=#llm-configuration-variables title="Permanent link">&para;</a></h4> <ul> <li><code>LLM_PROVIDER</code> - Provider to use: <code>"openai"</code>, <code>"anthropic"</code>, or <code>"huggingface"</code> (default: <code>"huggingface"</code>)</li> <li><code>OPENAI_MODEL</code> - OpenAI model name (default: <code>"gpt-5.1"</code>)</li> <li><code>ANTHROPIC_MODEL</code> - Anthropic model name (default: <code>"claude-sonnet-4-5-20250929"</code>)</li> <li><code>HUGGINGFACE_MODEL</code> - HuggingFace model ID (default: <code>"meta-llama/Llama-3.1-8B-Instruct"</code>) </li> </ul> <h4 id=embedding-configuration-variables>Embedding Configuration Variables<a class=headerlink href=#embedding-configuration-variables title="Permanent link">&para;</a></h4> <ul> <li><code>EMBEDDING_PROVIDER</code> - Provider: <code>"openai"</code>, <code>"local"</code>, or <code>"huggingface"</code> (default: <code>"local"</code>)</li> <li><code>OPENAI_EMBEDDING_MODEL</code> - OpenAI embedding model (default: <code>"text-embedding-3-small"</code>)</li> <li><code>LOCAL_EMBEDDING_MODEL</code> - Local sentence-transformers model (default: <code>"all-MiniLM-L6-v2"</code>)</li> <li><code>HUGGINGFACE_EMBEDDING_MODEL</code> - HuggingFace embedding model (default: <code>"sentence-transformers/all-MiniLM-L6-v2"</code>) </li> </ul> <h4 id=web-search-configuration-variables>Web Search Configuration Variables<a class=headerlink href=#web-search-configuration-variables title="Permanent link">&para;</a></h4> <ul> <li><code>WEB_SEARCH_PROVIDER</code> - Provider: <code>"serper"</code>, <code>"searchxng"</code>, <code>"brave"</code>, <code>"tavily"</code>, or <code>"duckduckgo"</code> (default: <code>"duckduckgo"</code>)</li> <li><code>SERPER_API_KEY</code> - Serper API key (required for Serper provider)</li> <li><code>SEARCHXNG_HOST</code> - SearchXNG host URL (required for SearchXNG provider)</li> <li><code>BRAVE_API_KEY</code> - Brave Search API key (required for Brave provider)</li> <li><code>TAVILY_API_KEY</code> - Tavily API key (required for Tavily provider) </li> </ul> <h4 id=pubmed-configuration-variables>PubMed Configuration Variables<a class=headerlink href=#pubmed-configuration-variables title="Permanent link">&para;</a></h4> <ul> <li><code>NCBI_API_KEY</code> - NCBI API key (optional, increases rate limit from 3 to 10 req/sec) </li> </ul> <h4 id=agent-configuration-variables>Agent Configuration Variables<a class=headerlink href=#agent-configuration-variables title="Permanent link">&para;</a></h4> <ul> <li><code>MAX_ITERATIONS</code> - Maximum iterations per research loop (1-50, default: <code>10</code>)</li> <li><code>SEARCH_TIMEOUT</code> - Search timeout in seconds (default: <code>30</code>)</li> <li><code>USE_GRAPH_EXECUTION</code> - Use graph-based execution (default: <code>false</code>) </li> </ul> <h4 id=budget-configuration-variables>Budget Configuration Variables<a class=headerlink href=#budget-configuration-variables title="Permanent link">&para;</a></h4> <ul> <li><code>DEFAULT_TOKEN_LIMIT</code> - Default token budget per research loop (1000-1000000, default: <code>100000</code>)</li> <li><code>DEFAULT_TIME_LIMIT_MINUTES</code> - Default time limit in minutes (1-120, default: <code>10</code>)</li> <li><code>DEFAULT_ITERATIONS_LIMIT</code> - Default iterations limit (1-50, default: <code>10</code>) </li> </ul> <h4 id=rag-configuration-variables>RAG Configuration Variables<a class=headerlink href=#rag-configuration-variables title="Permanent link">&para;</a></h4> <ul> <li><code>RAG_COLLECTION_NAME</code> - ChromaDB collection name (default: <code>"deepcritical_evidence"</code>)</li> <li><code>RAG_SIMILARITY_TOP_K</code> - Number of top results to retrieve (1-50, default: <code>5</code>)</li> <li><code>RAG_AUTO_INGEST</code> - Automatically ingest evidence into RAG (default: <code>true</code>) </li> </ul> <h4 id=chromadb-configuration-variables>ChromaDB Configuration Variables<a class=headerlink href=#chromadb-configuration-variables title="Permanent link">&para;</a></h4> <ul> <li><code>CHROMA_DB_PATH</code> - ChromaDB storage path (default: <code>"./chroma_db"</code>)</li> <li><code>CHROMA_DB_PERSIST</code> - Whether to persist ChromaDB to disk (default: <code>true</code>)</li> <li><code>CHROMA_DB_HOST</code> - ChromaDB server host (optional, for remote ChromaDB)</li> <li><code>CHROMA_DB_PORT</code> - ChromaDB server port (optional, for remote ChromaDB) </li> </ul> <h4 id=external-services-variables>External Services Variables<a class=headerlink href=#external-services-variables title="Permanent link">&para;</a></h4> <ul> <li><code>MODAL_TOKEN_ID</code> - Modal token ID (optional, for Modal sandbox execution)</li> <li><code>MODAL_TOKEN_SECRET</code> - Modal token secret (optional, for Modal sandbox execution) </li> </ul> <h4 id=logging-configuration-variables>Logging Configuration Variables<a class=headerlink href=#logging-configuration-variables title="Permanent link">&para;</a></h4> <ul> <li><code>LOG_LEVEL</code> - Log level: <code>"DEBUG"</code>, <code>"INFO"</code>, <code>"WARNING"</code>, or <code>"ERROR"</code> (default: <code>"INFO"</code>) </li> </ul> <h2 id=validation>Validation<a class=headerlink href=#validation title="Permanent link">&para;</a></h2> <p>Settings are validated on load using Pydantic validation: - <strong>Type Checking</strong>: All fields are strongly typed - <strong>Range Validation</strong>: Numeric fields have min/max constraints (e.g., <code>ge=1, le=50</code> for <code>max_iterations</code>) - <strong>Literal Validation</strong>: Enum fields only accept specific values (e.g., <code>Literal["openai", "anthropic", "huggingface"]</code>) - <strong>Required Fields</strong>: API keys are checked when accessed via <code>get_api_key()</code> or <code>get_openai_api_key()</code> </p> <h3 id=validation-examples>Validation Examples<a class=headerlink href=#validation-examples title="Permanent link">&para;</a></h3> <p>The <code>max_iterations</code> field has range validation: <code>81:81:src/utils/config.py max_iterations: int = Field(default=10, ge=1, le=50)</code></p> <p>The <code>llm_provider</code> field has literal validation:</p> <p>```26:28:src/utils/config.py llm_provider: Literal["openai", "anthropic", "huggingface"] = Field( default="openai", description="Which LLM provider to use" ) <div class=highlight><pre><span></span><code><a id=__codelineno-22-1 name=__codelineno-22-1 href=#__codelineno-22-1></a>## Error Handling
<a id=__codelineno-22-2 name=__codelineno-22-2 href=#__codelineno-22-2></a>
<a id=__codelineno-22-3 name=__codelineno-22-3 href=#__codelineno-22-3></a>Configuration errors raise `ConfigurationError` from `src/utils/exceptions.py`:
<a id=__codelineno-22-4 name=__codelineno-22-4 href=#__codelineno-22-4></a>
<a id=__codelineno-22-5 name=__codelineno-22-5 href=#__codelineno-22-5></a>```22:25:src/utils/exceptions.py
<a id=__codelineno-22-6 name=__codelineno-22-6 href=#__codelineno-22-6></a>class ConfigurationError(DeepCriticalError):
<a id=__codelineno-22-7 name=__codelineno-22-7 href=#__codelineno-22-7></a>    &quot;&quot;&quot;Raised when configuration is invalid.&quot;&quot;&quot;
<a id=__codelineno-22-8 name=__codelineno-22-8 href=#__codelineno-22-8></a>
<a id=__codelineno-22-9 name=__codelineno-22-9 href=#__codelineno-22-9></a>    pass
</code></pre></div></p> <h3 id=error-handling-example>Error Handling Example<a class=headerlink href=#error-handling-example title="Permanent link">&para;</a></h3> <div class=highlight><pre><span></span><code><a id=__codelineno-23-1 name=__codelineno-23-1 href=#__codelineno-23-1></a><span class=kn>from</span><span class=w> </span><span class=nn>src.utils.config</span><span class=w> </span><span class=kn>import</span> <span class=n>settings</span>
<a id=__codelineno-23-2 name=__codelineno-23-2 href=#__codelineno-23-2></a><span class=kn>from</span><span class=w> </span><span class=nn>src.utils.exceptions</span><span class=w> </span><span class=kn>import</span> <span class=n>ConfigurationError</span>
<a id=__codelineno-23-3 name=__codelineno-23-3 href=#__codelineno-23-3></a>
<a id=__codelineno-23-4 name=__codelineno-23-4 href=#__codelineno-23-4></a><span class=k>try</span><span class=p>:</span>
<a id=__codelineno-23-5 name=__codelineno-23-5 href=#__codelineno-23-5></a>    <span class=n>api_key</span> <span class=o>=</span> <span class=n>settings</span><span class=o>.</span><span class=n>get_api_key</span><span class=p>()</span>
<a id=__codelineno-23-6 name=__codelineno-23-6 href=#__codelineno-23-6></a><span class=k>except</span> <span class=n>ConfigurationError</span> <span class=k>as</span> <span class=n>e</span><span class=p>:</span>
<a id=__codelineno-23-7 name=__codelineno-23-7 href=#__codelineno-23-7></a>    <span class=nb>print</span><span class=p>(</span><span class=sa>f</span><span class=s2>&quot;Configuration error: </span><span class=si>{</span><span class=n>e</span><span class=si>}</span><span class=s2>&quot;</span><span class=p>)</span>
</code></pre></div> <h3 id=common-configuration-errors>Common Configuration Errors<a class=headerlink href=#common-configuration-errors title="Permanent link">&para;</a></h3> <ol> <li><strong>Missing API Key</strong>: When <code>get_api_key()</code> is called but the required API key is not set</li> <li><strong>Invalid Provider</strong>: When <code>llm_provider</code> is set to an unsupported value</li> <li><strong>Out of Range</strong>: When numeric values exceed their min/max constraints</li> <li><strong>Invalid Literal</strong>: When enum fields receive unsupported values</li> </ol> <h2 id=configuration-best-practices>Configuration Best Practices<a class=headerlink href=#configuration-best-practices title="Permanent link">&para;</a></h2> <ol> <li><strong>Use <code>.env</code> File</strong>: Store sensitive keys in <code>.env</code> file (add to <code>.gitignore</code>)</li> <li><strong>Check Availability</strong>: Use properties like <code>has_openai_key</code> before accessing API keys</li> <li><strong>Handle Errors</strong>: Always catch <code>ConfigurationError</code> when calling <code>get_api_key()</code></li> <li><strong>Validate Early</strong>: Configuration is validated on import, so errors surface immediately</li> <li><strong>Use Defaults</strong>: Leverage sensible defaults for optional configuration</li> </ol> <h2 id=future-enhancements>Future Enhancements<a class=headerlink href=#future-enhancements title="Permanent link">&para;</a></h2> <p>The following configurations are planned for future phases:</p> <ol> <li><strong>Additional LLM Providers</strong>: DeepSeek, OpenRouter, Gemini, Perplexity, Azure OpenAI, Local models</li> <li><strong>Model Selection</strong>: Reasoning/main/fast model configuration</li> <li><strong>Service Integration</strong>: Additional service integrations and configurations</li> </ol> </article> </div> <script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script> </div> <button type=button class="md-top md-icon" data-md-component=top hidden> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg> Back to top </button> </main> <footer class=md-footer> <div class="md-footer-meta md-typeset"> <div class="md-footer-meta__inner md-grid"> <div class=md-copyright> <div class=md-copyright__highlight> Copyright &copy; 2024 DeepCritical Team </div> Made with <a href=https://squidfunk.github.io/mkdocs-material/ target=_blank rel=noopener> Material for MkDocs </a> </div> <div class=md-social> <a href=https://github.com/DeepCritical/GradioDemo target=_blank rel=noopener title=github.com class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 512 512"><!-- Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg> </a> <a href=https://huggingface.co/spaces/DataQuests/DeepCritical target=_blank rel=noopener title=huggingface.co class=md-social__link> <svg xmlns=http://www.w3.org/2000/svg viewbox="0 0 24 24"><path d="M16.36 14c.08-.66.14-1.32.14-2s-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2m-5.15 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95a8.03 8.03 0 0 1-4.33 3.56M14.34 14H9.66c-.1-.66-.16-1.32-.16-2s.06-1.35.16-2h4.68c.09.65.16 1.32.16 2s-.07 1.34-.16 2M12 19.96c-.83-1.2-1.5-2.53-1.91-3.96h3.82c-.41 1.43-1.08 2.76-1.91 3.96M8 8H5.08A7.92 7.92 0 0 1 9.4 4.44C8.8 5.55 8.35 6.75 8 8m-2.92 8H8c.35 1.25.8 2.45 1.4 3.56A8 8 0 0 1 5.08 16m-.82-2C4.1 13.36 4 12.69 4 12s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2s.06 1.34.14 2M12 4.03c.83 1.2 1.5 2.54 1.91 3.97h-3.82c.41-1.43 1.08-2.77 1.91-3.97M18.92 8h-2.95a15.7 15.7 0 0 0-1.38-3.56c1.84.63 3.37 1.9 4.33 3.56M12 2C6.47 2 2 6.5 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2"/></svg> </a> </div> </div> </div> </footer> </div> <div class=md-dialog data-md-component=dialog> <div class="md-dialog__inner md-typeset"></div> </div> <script id=__config type=application/json>{"annotate": null, "base": "..", "features": ["navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.suggest", "search.highlight", "content.code.annotate", "content.code.copy"], "search": "../assets/javascripts/workers/search.7a47a382.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script> <script src=../assets/javascripts/bundle.e71a0d61.min.js></script> </body> </html>