Spaces:
Sleeping
Sleeping
Nikolay Ponomarev commited on
Commit ·
24eb4d9
1
Parent(s): 2eb263c
Finance help
Browse files- .idea/.gitignore +3 -0
- .idea/dbnavigator.xml +425 -0
- .idea/finance_help.iml +8 -0
- .idea/inspectionProfiles/Project_Default.xml +14 -0
- .idea/inspectionProfiles/profiles_settings.xml +6 -0
- .idea/misc.xml +7 -0
- .idea/modules.xml +8 -0
- .idea/vcs.xml +6 -0
- Dockerfile +26 -0
- app.py +264 -0
- requirements.txt +4 -0
- start.sh +48 -0
.idea/.gitignore
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Default ignored files
|
| 2 |
+
/shelf/
|
| 3 |
+
/workspace.xml
|
.idea/dbnavigator.xml
ADDED
|
@@ -0,0 +1,425 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="DBNavigator.Project.DDLFileAttachmentManager">
|
| 4 |
+
<mappings />
|
| 5 |
+
<preferences />
|
| 6 |
+
</component>
|
| 7 |
+
<component name="DBNavigator.Project.DatabaseAssistantManager">
|
| 8 |
+
<assistants />
|
| 9 |
+
</component>
|
| 10 |
+
<component name="DBNavigator.Project.DatabaseFileManager">
|
| 11 |
+
<open-files />
|
| 12 |
+
</component>
|
| 13 |
+
<component name="DBNavigator.Project.Settings">
|
| 14 |
+
<connections />
|
| 15 |
+
<browser-settings>
|
| 16 |
+
<general>
|
| 17 |
+
<display-mode value="TABBED" />
|
| 18 |
+
<navigation-history-size value="100" />
|
| 19 |
+
<show-object-details value="false" />
|
| 20 |
+
<enable-sticky-paths value="true" />
|
| 21 |
+
</general>
|
| 22 |
+
<filters>
|
| 23 |
+
<object-type-filter>
|
| 24 |
+
<object-type name="SCHEMA" enabled="true" />
|
| 25 |
+
<object-type name="USER" enabled="true" />
|
| 26 |
+
<object-type name="ROLE" enabled="true" />
|
| 27 |
+
<object-type name="PRIVILEGE" enabled="true" />
|
| 28 |
+
<object-type name="CHARSET" enabled="true" />
|
| 29 |
+
<object-type name="TABLE" enabled="true" />
|
| 30 |
+
<object-type name="VIEW" enabled="true" />
|
| 31 |
+
<object-type name="MATERIALIZED_VIEW" enabled="true" />
|
| 32 |
+
<object-type name="NESTED_TABLE" enabled="true" />
|
| 33 |
+
<object-type name="COLUMN" enabled="true" />
|
| 34 |
+
<object-type name="INDEX" enabled="true" />
|
| 35 |
+
<object-type name="CONSTRAINT" enabled="true" />
|
| 36 |
+
<object-type name="DATASET_TRIGGER" enabled="true" />
|
| 37 |
+
<object-type name="DATABASE_TRIGGER" enabled="true" />
|
| 38 |
+
<object-type name="SYNONYM" enabled="true" />
|
| 39 |
+
<object-type name="SEQUENCE" enabled="true" />
|
| 40 |
+
<object-type name="PROCEDURE" enabled="true" />
|
| 41 |
+
<object-type name="FUNCTION" enabled="true" />
|
| 42 |
+
<object-type name="PACKAGE" enabled="true" />
|
| 43 |
+
<object-type name="TYPE" enabled="true" />
|
| 44 |
+
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
|
| 45 |
+
<object-type name="ARGUMENT" enabled="true" />
|
| 46 |
+
<object-type name="JAVA_CLASS" enabled="true" />
|
| 47 |
+
<object-type name="JAVA_INNER_CLASS" enabled="true" />
|
| 48 |
+
<object-type name="JAVA_FIELD" enabled="true" />
|
| 49 |
+
<object-type name="JAVA_METHOD" enabled="true" />
|
| 50 |
+
<object-type name="DIMENSION" enabled="true" />
|
| 51 |
+
<object-type name="CLUSTER" enabled="true" />
|
| 52 |
+
<object-type name="DBLINK" enabled="true" />
|
| 53 |
+
<object-type name="CREDENTIAL" enabled="true" />
|
| 54 |
+
<object-type name="AI_PROFILE" enabled="true" />
|
| 55 |
+
</object-type-filter>
|
| 56 |
+
</filters>
|
| 57 |
+
<sorting>
|
| 58 |
+
<object-type name="COLUMN" sorting-type="NAME" />
|
| 59 |
+
<object-type name="FUNCTION" sorting-type="NAME" />
|
| 60 |
+
<object-type name="PROCEDURE" sorting-type="NAME" />
|
| 61 |
+
<object-type name="ARGUMENT" sorting-type="POSITION" />
|
| 62 |
+
<object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" />
|
| 63 |
+
</sorting>
|
| 64 |
+
<default-editors>
|
| 65 |
+
<object-type name="VIEW" editor-type="SELECTION" />
|
| 66 |
+
<object-type name="PACKAGE" editor-type="SELECTION" />
|
| 67 |
+
<object-type name="TYPE" editor-type="SELECTION" />
|
| 68 |
+
</default-editors>
|
| 69 |
+
</browser-settings>
|
| 70 |
+
<navigation-settings>
|
| 71 |
+
<lookup-filters>
|
| 72 |
+
<lookup-objects>
|
| 73 |
+
<object-type name="SCHEMA" enabled="true" />
|
| 74 |
+
<object-type name="USER" enabled="false" />
|
| 75 |
+
<object-type name="ROLE" enabled="false" />
|
| 76 |
+
<object-type name="PRIVILEGE" enabled="false" />
|
| 77 |
+
<object-type name="CHARSET" enabled="false" />
|
| 78 |
+
<object-type name="TABLE" enabled="true" />
|
| 79 |
+
<object-type name="VIEW" enabled="true" />
|
| 80 |
+
<object-type name="MATERIALIZED VIEW" enabled="true" />
|
| 81 |
+
<object-type name="INDEX" enabled="true" />
|
| 82 |
+
<object-type name="CONSTRAINT" enabled="true" />
|
| 83 |
+
<object-type name="DATASET TRIGGER" enabled="true" />
|
| 84 |
+
<object-type name="DATABASE TRIGGER" enabled="true" />
|
| 85 |
+
<object-type name="SYNONYM" enabled="false" />
|
| 86 |
+
<object-type name="SEQUENCE" enabled="true" />
|
| 87 |
+
<object-type name="PROCEDURE" enabled="true" />
|
| 88 |
+
<object-type name="FUNCTION" enabled="true" />
|
| 89 |
+
<object-type name="PACKAGE" enabled="true" />
|
| 90 |
+
<object-type name="TYPE" enabled="true" />
|
| 91 |
+
<object-type name="JAVA CLASS" enabled="true" />
|
| 92 |
+
<object-type name="INNER CLASS" enabled="true" />
|
| 93 |
+
<object-type name="JAVA FIELD" enabled="true" />
|
| 94 |
+
<object-type name="JAVA METHOD" enabled="true" />
|
| 95 |
+
<object-type name="JAVA PARAMETER" enabled="true" />
|
| 96 |
+
<object-type name="DIMENSION" enabled="false" />
|
| 97 |
+
<object-type name="CLUSTER" enabled="false" />
|
| 98 |
+
<object-type name="DBLINK" enabled="false" />
|
| 99 |
+
<object-type name="CREDENTIAL" enabled="false" />
|
| 100 |
+
</lookup-objects>
|
| 101 |
+
<force-database-load value="false" />
|
| 102 |
+
<prompt-connection-selection value="true" />
|
| 103 |
+
<prompt-schema-selection value="true" />
|
| 104 |
+
</lookup-filters>
|
| 105 |
+
</navigation-settings>
|
| 106 |
+
<dataset-grid-settings>
|
| 107 |
+
<general>
|
| 108 |
+
<enable-zooming value="true" />
|
| 109 |
+
<enable-column-tooltip value="true" />
|
| 110 |
+
</general>
|
| 111 |
+
<sorting>
|
| 112 |
+
<nulls-first value="true" />
|
| 113 |
+
<max-sorting-columns value="4" />
|
| 114 |
+
</sorting>
|
| 115 |
+
<audit-columns>
|
| 116 |
+
<column-names value="" />
|
| 117 |
+
<visible value="true" />
|
| 118 |
+
<editable value="false" />
|
| 119 |
+
</audit-columns>
|
| 120 |
+
</dataset-grid-settings>
|
| 121 |
+
<dataset-editor-settings>
|
| 122 |
+
<text-editor-popup>
|
| 123 |
+
<active value="false" />
|
| 124 |
+
<active-if-empty value="false" />
|
| 125 |
+
<data-length-threshold value="100" />
|
| 126 |
+
<popup-delay value="1000" />
|
| 127 |
+
</text-editor-popup>
|
| 128 |
+
<values-actions-popup>
|
| 129 |
+
<show-popup-button value="true" />
|
| 130 |
+
<element-count-threshold value="1000" />
|
| 131 |
+
<data-length-threshold value="250" />
|
| 132 |
+
</values-actions-popup>
|
| 133 |
+
<general>
|
| 134 |
+
<fetch-block-size value="100" />
|
| 135 |
+
<fetch-timeout value="30" />
|
| 136 |
+
<trim-whitespaces value="true" />
|
| 137 |
+
<convert-empty-strings-to-null value="true" />
|
| 138 |
+
<select-content-on-cell-edit value="true" />
|
| 139 |
+
<large-value-preview-active value="true" />
|
| 140 |
+
</general>
|
| 141 |
+
<filters>
|
| 142 |
+
<prompt-filter-dialog value="true" />
|
| 143 |
+
<default-filter-type value="BASIC" />
|
| 144 |
+
</filters>
|
| 145 |
+
<qualified-text-editor text-length-threshold="300">
|
| 146 |
+
<content-types>
|
| 147 |
+
<content-type name="Text" enabled="true" />
|
| 148 |
+
<content-type name="Properties" enabled="true" />
|
| 149 |
+
<content-type name="XML" enabled="true" />
|
| 150 |
+
<content-type name="DTD" enabled="true" />
|
| 151 |
+
<content-type name="HTML" enabled="true" />
|
| 152 |
+
<content-type name="XHTML" enabled="true" />
|
| 153 |
+
<content-type name="SQL" enabled="true" />
|
| 154 |
+
<content-type name="PL/SQL" enabled="true" />
|
| 155 |
+
<content-type name="JSON" enabled="true" />
|
| 156 |
+
<content-type name="JSON5" enabled="true" />
|
| 157 |
+
<content-type name="YAML" enabled="true" />
|
| 158 |
+
</content-types>
|
| 159 |
+
</qualified-text-editor>
|
| 160 |
+
<record-navigation>
|
| 161 |
+
<navigation-target value="VIEWER" />
|
| 162 |
+
</record-navigation>
|
| 163 |
+
</dataset-editor-settings>
|
| 164 |
+
<code-editor-settings>
|
| 165 |
+
<general>
|
| 166 |
+
<show-object-navigation-gutter value="false" />
|
| 167 |
+
<show-spec-declaration-navigation-gutter value="true" />
|
| 168 |
+
<enable-spellchecking value="true" />
|
| 169 |
+
<enable-reference-spellchecking value="false" />
|
| 170 |
+
</general>
|
| 171 |
+
<confirmations>
|
| 172 |
+
<save-changes value="false" />
|
| 173 |
+
<revert-changes value="true" />
|
| 174 |
+
<exit-on-changes value="ASK" />
|
| 175 |
+
</confirmations>
|
| 176 |
+
</code-editor-settings>
|
| 177 |
+
<code-completion-settings>
|
| 178 |
+
<filters>
|
| 179 |
+
<basic-filter>
|
| 180 |
+
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
|
| 181 |
+
<filter-element type="RESERVED_WORD" id="function" selected="true" />
|
| 182 |
+
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
|
| 183 |
+
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
|
| 184 |
+
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
|
| 185 |
+
<filter-element type="OBJECT" id="schema" selected="true" />
|
| 186 |
+
<filter-element type="OBJECT" id="role" selected="true" />
|
| 187 |
+
<filter-element type="OBJECT" id="user" selected="true" />
|
| 188 |
+
<filter-element type="OBJECT" id="privilege" selected="true" />
|
| 189 |
+
<user-schema>
|
| 190 |
+
<filter-element type="OBJECT" id="table" selected="true" />
|
| 191 |
+
<filter-element type="OBJECT" id="view" selected="true" />
|
| 192 |
+
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
| 193 |
+
<filter-element type="OBJECT" id="index" selected="true" />
|
| 194 |
+
<filter-element type="OBJECT" id="constraint" selected="true" />
|
| 195 |
+
<filter-element type="OBJECT" id="trigger" selected="true" />
|
| 196 |
+
<filter-element type="OBJECT" id="synonym" selected="false" />
|
| 197 |
+
<filter-element type="OBJECT" id="sequence" selected="true" />
|
| 198 |
+
<filter-element type="OBJECT" id="procedure" selected="true" />
|
| 199 |
+
<filter-element type="OBJECT" id="function" selected="true" />
|
| 200 |
+
<filter-element type="OBJECT" id="package" selected="true" />
|
| 201 |
+
<filter-element type="OBJECT" id="type" selected="true" />
|
| 202 |
+
<filter-element type="OBJECT" id="dimension" selected="true" />
|
| 203 |
+
<filter-element type="OBJECT" id="cluster" selected="true" />
|
| 204 |
+
<filter-element type="OBJECT" id="dblink" selected="true" />
|
| 205 |
+
</user-schema>
|
| 206 |
+
<public-schema>
|
| 207 |
+
<filter-element type="OBJECT" id="table" selected="false" />
|
| 208 |
+
<filter-element type="OBJECT" id="view" selected="false" />
|
| 209 |
+
<filter-element type="OBJECT" id="materialized view" selected="false" />
|
| 210 |
+
<filter-element type="OBJECT" id="index" selected="false" />
|
| 211 |
+
<filter-element type="OBJECT" id="constraint" selected="false" />
|
| 212 |
+
<filter-element type="OBJECT" id="trigger" selected="false" />
|
| 213 |
+
<filter-element type="OBJECT" id="synonym" selected="false" />
|
| 214 |
+
<filter-element type="OBJECT" id="sequence" selected="false" />
|
| 215 |
+
<filter-element type="OBJECT" id="procedure" selected="false" />
|
| 216 |
+
<filter-element type="OBJECT" id="function" selected="false" />
|
| 217 |
+
<filter-element type="OBJECT" id="package" selected="false" />
|
| 218 |
+
<filter-element type="OBJECT" id="type" selected="false" />
|
| 219 |
+
<filter-element type="OBJECT" id="dimension" selected="false" />
|
| 220 |
+
<filter-element type="OBJECT" id="cluster" selected="false" />
|
| 221 |
+
<filter-element type="OBJECT" id="dblink" selected="false" />
|
| 222 |
+
</public-schema>
|
| 223 |
+
<any-schema>
|
| 224 |
+
<filter-element type="OBJECT" id="table" selected="true" />
|
| 225 |
+
<filter-element type="OBJECT" id="view" selected="true" />
|
| 226 |
+
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
| 227 |
+
<filter-element type="OBJECT" id="index" selected="true" />
|
| 228 |
+
<filter-element type="OBJECT" id="constraint" selected="true" />
|
| 229 |
+
<filter-element type="OBJECT" id="trigger" selected="true" />
|
| 230 |
+
<filter-element type="OBJECT" id="synonym" selected="true" />
|
| 231 |
+
<filter-element type="OBJECT" id="sequence" selected="true" />
|
| 232 |
+
<filter-element type="OBJECT" id="procedure" selected="true" />
|
| 233 |
+
<filter-element type="OBJECT" id="function" selected="true" />
|
| 234 |
+
<filter-element type="OBJECT" id="package" selected="true" />
|
| 235 |
+
<filter-element type="OBJECT" id="type" selected="true" />
|
| 236 |
+
<filter-element type="OBJECT" id="dimension" selected="true" />
|
| 237 |
+
<filter-element type="OBJECT" id="cluster" selected="true" />
|
| 238 |
+
<filter-element type="OBJECT" id="dblink" selected="true" />
|
| 239 |
+
</any-schema>
|
| 240 |
+
</basic-filter>
|
| 241 |
+
<extended-filter>
|
| 242 |
+
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
|
| 243 |
+
<filter-element type="RESERVED_WORD" id="function" selected="true" />
|
| 244 |
+
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
|
| 245 |
+
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
|
| 246 |
+
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
|
| 247 |
+
<filter-element type="OBJECT" id="schema" selected="true" />
|
| 248 |
+
<filter-element type="OBJECT" id="user" selected="true" />
|
| 249 |
+
<filter-element type="OBJECT" id="role" selected="true" />
|
| 250 |
+
<filter-element type="OBJECT" id="privilege" selected="true" />
|
| 251 |
+
<user-schema>
|
| 252 |
+
<filter-element type="OBJECT" id="table" selected="true" />
|
| 253 |
+
<filter-element type="OBJECT" id="view" selected="true" />
|
| 254 |
+
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
| 255 |
+
<filter-element type="OBJECT" id="index" selected="true" />
|
| 256 |
+
<filter-element type="OBJECT" id="constraint" selected="true" />
|
| 257 |
+
<filter-element type="OBJECT" id="trigger" selected="true" />
|
| 258 |
+
<filter-element type="OBJECT" id="synonym" selected="true" />
|
| 259 |
+
<filter-element type="OBJECT" id="sequence" selected="true" />
|
| 260 |
+
<filter-element type="OBJECT" id="procedure" selected="true" />
|
| 261 |
+
<filter-element type="OBJECT" id="function" selected="true" />
|
| 262 |
+
<filter-element type="OBJECT" id="package" selected="true" />
|
| 263 |
+
<filter-element type="OBJECT" id="type" selected="true" />
|
| 264 |
+
<filter-element type="OBJECT" id="dimension" selected="true" />
|
| 265 |
+
<filter-element type="OBJECT" id="cluster" selected="true" />
|
| 266 |
+
<filter-element type="OBJECT" id="dblink" selected="true" />
|
| 267 |
+
</user-schema>
|
| 268 |
+
<public-schema>
|
| 269 |
+
<filter-element type="OBJECT" id="table" selected="true" />
|
| 270 |
+
<filter-element type="OBJECT" id="view" selected="true" />
|
| 271 |
+
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
| 272 |
+
<filter-element type="OBJECT" id="index" selected="true" />
|
| 273 |
+
<filter-element type="OBJECT" id="constraint" selected="true" />
|
| 274 |
+
<filter-element type="OBJECT" id="trigger" selected="true" />
|
| 275 |
+
<filter-element type="OBJECT" id="synonym" selected="true" />
|
| 276 |
+
<filter-element type="OBJECT" id="sequence" selected="true" />
|
| 277 |
+
<filter-element type="OBJECT" id="procedure" selected="true" />
|
| 278 |
+
<filter-element type="OBJECT" id="function" selected="true" />
|
| 279 |
+
<filter-element type="OBJECT" id="package" selected="true" />
|
| 280 |
+
<filter-element type="OBJECT" id="type" selected="true" />
|
| 281 |
+
<filter-element type="OBJECT" id="dimension" selected="true" />
|
| 282 |
+
<filter-element type="OBJECT" id="cluster" selected="true" />
|
| 283 |
+
<filter-element type="OBJECT" id="dblink" selected="true" />
|
| 284 |
+
</public-schema>
|
| 285 |
+
<any-schema>
|
| 286 |
+
<filter-element type="OBJECT" id="table" selected="true" />
|
| 287 |
+
<filter-element type="OBJECT" id="view" selected="true" />
|
| 288 |
+
<filter-element type="OBJECT" id="materialized view" selected="true" />
|
| 289 |
+
<filter-element type="OBJECT" id="index" selected="true" />
|
| 290 |
+
<filter-element type="OBJECT" id="constraint" selected="true" />
|
| 291 |
+
<filter-element type="OBJECT" id="trigger" selected="true" />
|
| 292 |
+
<filter-element type="OBJECT" id="synonym" selected="true" />
|
| 293 |
+
<filter-element type="OBJECT" id="sequence" selected="true" />
|
| 294 |
+
<filter-element type="OBJECT" id="procedure" selected="true" />
|
| 295 |
+
<filter-element type="OBJECT" id="function" selected="true" />
|
| 296 |
+
<filter-element type="OBJECT" id="package" selected="true" />
|
| 297 |
+
<filter-element type="OBJECT" id="type" selected="true" />
|
| 298 |
+
<filter-element type="OBJECT" id="dimension" selected="true" />
|
| 299 |
+
<filter-element type="OBJECT" id="cluster" selected="true" />
|
| 300 |
+
<filter-element type="OBJECT" id="dblink" selected="true" />
|
| 301 |
+
</any-schema>
|
| 302 |
+
</extended-filter>
|
| 303 |
+
</filters>
|
| 304 |
+
<sorting enabled="true">
|
| 305 |
+
<sorting-element type="RESERVED_WORD" id="keyword" />
|
| 306 |
+
<sorting-element type="RESERVED_WORD" id="datatype" />
|
| 307 |
+
<sorting-element type="OBJECT" id="column" />
|
| 308 |
+
<sorting-element type="OBJECT" id="table" />
|
| 309 |
+
<sorting-element type="OBJECT" id="view" />
|
| 310 |
+
<sorting-element type="OBJECT" id="materialized view" />
|
| 311 |
+
<sorting-element type="OBJECT" id="index" />
|
| 312 |
+
<sorting-element type="OBJECT" id="constraint" />
|
| 313 |
+
<sorting-element type="OBJECT" id="trigger" />
|
| 314 |
+
<sorting-element type="OBJECT" id="synonym" />
|
| 315 |
+
<sorting-element type="OBJECT" id="sequence" />
|
| 316 |
+
<sorting-element type="OBJECT" id="procedure" />
|
| 317 |
+
<sorting-element type="OBJECT" id="function" />
|
| 318 |
+
<sorting-element type="OBJECT" id="package" />
|
| 319 |
+
<sorting-element type="OBJECT" id="type" />
|
| 320 |
+
<sorting-element type="OBJECT" id="dimension" />
|
| 321 |
+
<sorting-element type="OBJECT" id="cluster" />
|
| 322 |
+
<sorting-element type="OBJECT" id="dblink" />
|
| 323 |
+
<sorting-element type="OBJECT" id="schema" />
|
| 324 |
+
<sorting-element type="OBJECT" id="role" />
|
| 325 |
+
<sorting-element type="OBJECT" id="user" />
|
| 326 |
+
<sorting-element type="RESERVED_WORD" id="function" />
|
| 327 |
+
<sorting-element type="RESERVED_WORD" id="parameter" />
|
| 328 |
+
</sorting>
|
| 329 |
+
<format>
|
| 330 |
+
<enforce-code-style-case value="true" />
|
| 331 |
+
</format>
|
| 332 |
+
</code-completion-settings>
|
| 333 |
+
<execution-engine-settings>
|
| 334 |
+
<statement-execution>
|
| 335 |
+
<fetch-block-size value="100" />
|
| 336 |
+
<execution-timeout value="20" />
|
| 337 |
+
<debug-execution-timeout value="600" />
|
| 338 |
+
<focus-result value="false" />
|
| 339 |
+
<prompt-execution value="false" />
|
| 340 |
+
</statement-execution>
|
| 341 |
+
<script-execution>
|
| 342 |
+
<command-line-interfaces />
|
| 343 |
+
<execution-timeout value="300" />
|
| 344 |
+
</script-execution>
|
| 345 |
+
<method-execution>
|
| 346 |
+
<execution-timeout value="30" />
|
| 347 |
+
<debug-execution-timeout value="600" />
|
| 348 |
+
<parameter-history-size value="10" />
|
| 349 |
+
</method-execution>
|
| 350 |
+
</execution-engine-settings>
|
| 351 |
+
<operation-settings>
|
| 352 |
+
<transactions>
|
| 353 |
+
<uncommitted-changes>
|
| 354 |
+
<on-project-close value="ASK" />
|
| 355 |
+
<on-disconnect value="ASK" />
|
| 356 |
+
<on-autocommit-toggle value="ASK" />
|
| 357 |
+
</uncommitted-changes>
|
| 358 |
+
<multiple-uncommitted-changes>
|
| 359 |
+
<on-commit value="ASK" />
|
| 360 |
+
<on-rollback value="ASK" />
|
| 361 |
+
</multiple-uncommitted-changes>
|
| 362 |
+
</transactions>
|
| 363 |
+
<session-browser>
|
| 364 |
+
<disconnect-session value="ASK" />
|
| 365 |
+
<kill-session value="ASK" />
|
| 366 |
+
<reload-on-filter-change value="false" />
|
| 367 |
+
</session-browser>
|
| 368 |
+
<compiler>
|
| 369 |
+
<compile-type value="KEEP" />
|
| 370 |
+
<compile-dependencies value="ASK" />
|
| 371 |
+
<always-show-controls value="false" />
|
| 372 |
+
</compiler>
|
| 373 |
+
</operation-settings>
|
| 374 |
+
<ddl-file-settings>
|
| 375 |
+
<extensions>
|
| 376 |
+
<mapping file-type-id="VIEW" extensions="vw" />
|
| 377 |
+
<mapping file-type-id="TRIGGER" extensions="trg" />
|
| 378 |
+
<mapping file-type-id="PROCEDURE" extensions="prc" />
|
| 379 |
+
<mapping file-type-id="FUNCTION" extensions="fnc" />
|
| 380 |
+
<mapping file-type-id="PACKAGE" extensions="pkg" />
|
| 381 |
+
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
|
| 382 |
+
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
|
| 383 |
+
<mapping file-type-id="TYPE" extensions="tpe" />
|
| 384 |
+
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
|
| 385 |
+
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
|
| 386 |
+
<mapping file-type-id="JAVA_SOURCE" extensions="sql" />
|
| 387 |
+
</extensions>
|
| 388 |
+
<general>
|
| 389 |
+
<lookup-ddl-files value="true" />
|
| 390 |
+
<create-ddl-files value="false" />
|
| 391 |
+
<synchronize-ddl-files value="true" />
|
| 392 |
+
<use-qualified-names value="false" />
|
| 393 |
+
<make-scripts-rerunnable value="true" />
|
| 394 |
+
</general>
|
| 395 |
+
</ddl-file-settings>
|
| 396 |
+
<assistant-settings>
|
| 397 |
+
<credential-settings>
|
| 398 |
+
<credentials />
|
| 399 |
+
</credential-settings>
|
| 400 |
+
</assistant-settings>
|
| 401 |
+
<general-settings>
|
| 402 |
+
<regional-settings>
|
| 403 |
+
<date-format value="MEDIUM" />
|
| 404 |
+
<number-format value="UNGROUPED" />
|
| 405 |
+
<locale value="SYSTEM_DEFAULT" />
|
| 406 |
+
<use-custom-formats value="false" />
|
| 407 |
+
</regional-settings>
|
| 408 |
+
<environment>
|
| 409 |
+
<environment-types>
|
| 410 |
+
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
|
| 411 |
+
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
|
| 412 |
+
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
|
| 413 |
+
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
|
| 414 |
+
</environment-types>
|
| 415 |
+
<visibility-settings>
|
| 416 |
+
<connection-tabs value="true" />
|
| 417 |
+
<dialog-headers value="true" />
|
| 418 |
+
<object-editor-tabs value="true" />
|
| 419 |
+
<script-editor-tabs value="false" />
|
| 420 |
+
<execution-result-tabs value="true" />
|
| 421 |
+
</visibility-settings>
|
| 422 |
+
</environment>
|
| 423 |
+
</general-settings>
|
| 424 |
+
</component>
|
| 425 |
+
</project>
|
.idea/finance_help.iml
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<module type="PYTHON_MODULE" version="4">
|
| 3 |
+
<component name="NewModuleRootManager">
|
| 4 |
+
<content url="file://$MODULE_DIR$" />
|
| 5 |
+
<orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
|
| 6 |
+
<orderEntry type="sourceFolder" forTests="false" />
|
| 7 |
+
</component>
|
| 8 |
+
</module>
|
.idea/inspectionProfiles/Project_Default.xml
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<component name="InspectionProjectProfileManager">
|
| 2 |
+
<profile version="1.0">
|
| 3 |
+
<option name="myName" value="Project Default" />
|
| 4 |
+
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
| 5 |
+
<option name="ignoredPackages">
|
| 6 |
+
<value>
|
| 7 |
+
<list size="1">
|
| 8 |
+
<item index="0" class="java.lang.String" itemvalue="aiogram" />
|
| 9 |
+
</list>
|
| 10 |
+
</value>
|
| 11 |
+
</option>
|
| 12 |
+
</inspection_tool>
|
| 13 |
+
</profile>
|
| 14 |
+
</component>
|
.idea/inspectionProfiles/profiles_settings.xml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<component name="InspectionProjectProfileManager">
|
| 2 |
+
<settings>
|
| 3 |
+
<option name="USE_PROJECT_PROFILE" value="false" />
|
| 4 |
+
<version value="1.0" />
|
| 5 |
+
</settings>
|
| 6 |
+
</component>
|
.idea/misc.xml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="Black">
|
| 4 |
+
<option name="sdkName" value="Python 3.11" />
|
| 5 |
+
</component>
|
| 6 |
+
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
|
| 7 |
+
</project>
|
.idea/modules.xml
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="ProjectModuleManager">
|
| 4 |
+
<modules>
|
| 5 |
+
<module fileurl="file://$PROJECT_DIR$/.idea/finance_help.iml" filepath="$PROJECT_DIR$/.idea/finance_help.iml" />
|
| 6 |
+
</modules>
|
| 7 |
+
</component>
|
| 8 |
+
</project>
|
.idea/vcs.xml
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<project version="4">
|
| 3 |
+
<component name="VcsDirectoryMappings">
|
| 4 |
+
<mapping directory="" vcs="Git" />
|
| 5 |
+
</component>
|
| 6 |
+
</project>
|
Dockerfile
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM ubuntu:22.04
|
| 2 |
+
|
| 3 |
+
ENV DEBIAN_FRONTEND=noninteractive
|
| 4 |
+
RUN apt-get update && apt-get install -y \
|
| 5 |
+
curl ca-certificates python3 python3-pip bash && \
|
| 6 |
+
rm -rf /var/lib/apt/lists/*
|
| 7 |
+
|
| 8 |
+
# Install Ollama
|
| 9 |
+
RUN curl -fsSL https://ollama.com/install.sh | sh
|
| 10 |
+
|
| 11 |
+
WORKDIR /app
|
| 12 |
+
COPY requirements.txt /app/requirements.txt
|
| 13 |
+
RUN pip3 install --no-cache-dir -r /app/requirements.txt
|
| 14 |
+
|
| 15 |
+
COPY app.py /app/app.py
|
| 16 |
+
COPY start.sh /app/start.sh
|
| 17 |
+
RUN chmod +x /app/start.sh
|
| 18 |
+
|
| 19 |
+
# Ollama listens on localhost by default; set host explicitly
|
| 20 |
+
ENV OLLAMA_HOST=0.0.0.0:11434
|
| 21 |
+
|
| 22 |
+
# For Gradio on Spaces
|
| 23 |
+
ENV GRADIO_SERVER_NAME=0.0.0.0
|
| 24 |
+
ENV GRADIO_SERVER_PORT=7860
|
| 25 |
+
|
| 26 |
+
CMD ["/app/start.sh"]
|
app.py
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import re
|
| 3 |
+
import html as ihtml
|
| 4 |
+
import textwrap
|
| 5 |
+
import requests
|
| 6 |
+
import gradio as gr
|
| 7 |
+
import litellm
|
| 8 |
+
from smolagents import CodeAgent, LiteLLMModel, tool
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
MODEL_NAME = os.getenv(
|
| 12 |
+
"MODEL_NAME",
|
| 13 |
+
"danielsheep/Qwen3-Coder-30B-A3B-Instruct-1M-Unsloth:UD-IQ3_XXS",
|
| 14 |
+
)
|
| 15 |
+
OLLAMA_BASE = os.getenv("OLLAMA_URL", "http://127.0.0.1:11434")
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
def make_model():
|
| 19 |
+
return LiteLLMModel(
|
| 20 |
+
model_id=f"ollama_chat/{MODEL_NAME}",
|
| 21 |
+
api_base=OLLAMA_BASE,
|
| 22 |
+
num_ctx=16384,
|
| 23 |
+
temperature=0.2,
|
| 24 |
+
max_tokens=4096,
|
| 25 |
+
)
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def _strip_html(raw_html: str) -> str:
|
| 29 |
+
"""Грубое преобразование HTML -> текст, чтобы агенты не тащили сырой HTML в ответ."""
|
| 30 |
+
raw_html = ihtml.unescape(raw_html)
|
| 31 |
+
raw_html = re.sub(r"(?is)<(script|style).*?>.*?</\1>", " ", raw_html)
|
| 32 |
+
raw_html = re.sub(r"(?is)<br\s*/?>", "\n", raw_html)
|
| 33 |
+
raw_html = re.sub(r"(?is)</p\s*>", "\n", raw_html)
|
| 34 |
+
raw_html = re.sub(r"(?is)<.*?>", " ", raw_html)
|
| 35 |
+
raw_html = re.sub(r"[ \t]+", " ", raw_html)
|
| 36 |
+
raw_html = re.sub(r"\n{3,}", "\n\n", raw_html)
|
| 37 |
+
return raw_html.strip()
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
@tool
|
| 41 |
+
def web_search(query: str) -> str:
|
| 42 |
+
"""Ищет краткую информацию в интернете по текстовому запросу (через DuckDuckGo HTML).
|
| 43 |
+
Args:
|
| 44 |
+
query: Текстовый поисковый запрос.
|
| 45 |
+
"""
|
| 46 |
+
resp = requests.get(
|
| 47 |
+
"https://duckduckgo.com/html/",
|
| 48 |
+
params={"q": query},
|
| 49 |
+
timeout=10,
|
| 50 |
+
headers={"User-Agent": "financial-aid-navigator-demo"},
|
| 51 |
+
)
|
| 52 |
+
resp.raise_for_status()
|
| 53 |
+
text = _strip_html(resp.text)
|
| 54 |
+
return text[:4500]
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
def run_fin_aid_multi_agent(case_description: str, region: str, urgency: str, allow_internet: bool):
|
| 58 |
+
model = make_model()
|
| 59 |
+
tools = [web_search] if allow_internet else []
|
| 60 |
+
|
| 61 |
+
if allow_internet:
|
| 62 |
+
web_hint_triage = """
|
| 63 |
+
В сгенерированном коде НЕ используй import requests и другие сетевые библиотеки.
|
| 64 |
+
Для доступа в интернет у тебя есть ТОЛЬКО инструмент web_search(query: str).
|
| 65 |
+
ОБЯЗАТЕЛЬНО: минимум 2 раза вызвать web_search:
|
| 66 |
+
1) по запросу вида "emergency financial assistance <регион>" или "rent assistance <регион>";
|
| 67 |
+
2) по запросу вида "how to avoid financial aid scams" или "debt relief scams warning".
|
| 68 |
+
Не вставляй сырой HTML — только извлечённые выводы.
|
| 69 |
+
"""
|
| 70 |
+
web_hint_actions = """
|
| 71 |
+
В сгенерированном коде НЕ используй import requests.
|
| 72 |
+
Интернет — только через web_search(query: str).
|
| 73 |
+
Используй результаты поиска, чтобы дополнить список вариантов помощи (гос/НКО/долги/жильё/коммунальные),
|
| 74 |
+
и добавь предупреждения о мошенничестве.
|
| 75 |
+
"""
|
| 76 |
+
web_hint_writer = """
|
| 77 |
+
В сгенерированном коде НЕ используй import requests.
|
| 78 |
+
Интернет — только через web_search(query: str).
|
| 79 |
+
Можно уточнить формулировки и типовые источники помощи, но не вставляй сырой HTML.
|
| 80 |
+
"""
|
| 81 |
+
else:
|
| 82 |
+
web_hint_common = """
|
| 83 |
+
Интернет недоступен, инструмент web_search отсутствует.
|
| 84 |
+
Не пытайся импортировать requests или вызывать web_search.
|
| 85 |
+
Опирайся только на свои знания и общие принципы.
|
| 86 |
+
"""
|
| 87 |
+
web_hint_triage = web_hint_common
|
| 88 |
+
web_hint_actions = web_hint_common
|
| 89 |
+
web_hint_writer = web_hint_common
|
| 90 |
+
|
| 91 |
+
# Агент 1: Триаж / разбор ситуации
|
| 92 |
+
triage = CodeAgent(
|
| 93 |
+
tools=tools,
|
| 94 |
+
model=model,
|
| 95 |
+
add_base_tools=False,
|
| 96 |
+
max_steps=6,
|
| 97 |
+
)
|
| 98 |
+
triage_prompt = f"""
|
| 99 |
+
Ты агент Triage.
|
| 100 |
+
Всегда отвечай на РУССКОМ языке.
|
| 101 |
+
{web_hint_triage}
|
| 102 |
+
|
| 103 |
+
Цель: быстро разобрать ситуацию человека и определить приоритеты.
|
| 104 |
+
Важные правила:
|
| 105 |
+
- НЕ проси и НЕ предлагай вводить чувствительные данные: номера карт, CVV, пароли, коды из SMS, полные паспорта/ID.
|
| 106 |
+
- Можно предлагать безопасные категории данных (диапазоны сумм, тип дохода, примерные расходы, статус аренды).
|
| 107 |
+
- Никаких индивидуальных инвестсоветов. Фокус: кризисная поддержка, бюджет, варианты помощи.
|
| 108 |
+
|
| 109 |
+
Сформируй внутренний результат со структурой:
|
| 110 |
+
- Краткое резюме ситуации (2–4 предложения)
|
| 111 |
+
- Допущения (список)
|
| 112 |
+
- Приоритеты по срочности (список: "сегодня", "на неделе", "в течение месяца")
|
| 113 |
+
- Риски (список: выселение/отключения/штрафы/коллекторы/мошенники/псих.перегрузка)
|
| 114 |
+
- Какие данные подготовить (безопасный список)
|
| 115 |
+
- Вопросы для уточнения (до 8 вопросов)
|
| 116 |
+
|
| 117 |
+
Срочность: {urgency}
|
| 118 |
+
Регион: {region}
|
| 119 |
+
Описание ситуации:
|
| 120 |
+
{case_description}
|
| 121 |
+
"""
|
| 122 |
+
triage_result = triage.run(textwrap.dedent(triage_prompt))
|
| 123 |
+
|
| 124 |
+
# Агент 2: Генератор действий и вариантов помощи (структура данных)
|
| 125 |
+
actions_agent = CodeAgent(
|
| 126 |
+
tools=tools,
|
| 127 |
+
model=model,
|
| 128 |
+
add_base_tools=False,
|
| 129 |
+
max_steps=7,
|
| 130 |
+
)
|
| 131 |
+
actions_prompt = f"""
|
| 132 |
+
Ты агент Actions.
|
| 133 |
+
Всегда отвечай на РУССКОМ языке.
|
| 134 |
+
{web_hint_actions}
|
| 135 |
+
|
| 136 |
+
На основе результата Triage сформируй ПИТОНОВСКИЙ СПИСОК словарей actions (и больше ничего).
|
| 137 |
+
Каждый элемент — словарь с полями:
|
| 138 |
+
- "bucket": "urgent" | "short_term" | "mid_term"
|
| 139 |
+
- "title": краткий заголовок
|
| 140 |
+
- "steps": список шагов (3–8 пунктов)
|
| 141 |
+
- "expected_outcome": 1 строка
|
| 142 |
+
- "documents": список (что подготовить)
|
| 143 |
+
- "warnings": список (риски/мошенники/ошибки)
|
| 144 |
+
|
| 145 |
+
Дополнительно: создай список resources (тоже питоновский список словарей), где каждый словарь:
|
| 146 |
+
- "type": "government" | "ngo" | "debt_counseling" | "housing" | "utilities" | "other"
|
| 147 |
+
- "name": название/категория
|
| 148 |
+
- "what_it_helps_with": 1 строка
|
| 149 |
+
- "how_to_start": 1 строка (что сделать первым)
|
| 150 |
+
- "notes": 1 строка
|
| 151 |
+
|
| 152 |
+
ВАЖНО:
|
| 153 |
+
- Если интернет доступен, используй web_search результаты, но НЕ вставляй HTML.
|
| 154 |
+
- Если конкретных названий по региону нет, давай понятные категории ("муниципальная помощь с арендой", "служба соцзащиты", "некоммерческие фонды").
|
| 155 |
+
|
| 156 |
+
Вход (Triage):
|
| 157 |
+
{triage_result}
|
| 158 |
+
"""
|
| 159 |
+
actions_struct = actions_agent.run(textwrap.dedent(actions_prompt))
|
| 160 |
+
|
| 161 |
+
# Агент 3: Писатель — финальный Markdown отчёт (через python-код с переменной report)
|
| 162 |
+
writer = CodeAgent(
|
| 163 |
+
tools=tools,
|
| 164 |
+
model=model,
|
| 165 |
+
add_base_tools=False,
|
| 166 |
+
max_steps=4,
|
| 167 |
+
)
|
| 168 |
+
writer_prompt = f"""
|
| 169 |
+
Ты агент Writer.
|
| 170 |
+
Всегда отвечай на РУССКОМ языке.
|
| 171 |
+
{web_hint_writer}
|
| 172 |
+
|
| 173 |
+
Твоя задача — СФОРМИРОВАТЬ ГОТОВЫЙ ОТЧЁТ ДЛЯ ЧЕЛОВЕКА в формате Markdown.
|
| 174 |
+
КРИТИЧЕСКИ ВАЖНО: это ФИНАЛЬНЫЙ шаг. Ты должен сгенерировать Python-код,
|
| 175 |
+
который создаёт переменную report (многострочная строка Markdown) и возвращает её
|
| 176 |
+
как последнее выражение (без print, без return).
|
| 177 |
+
|
| 178 |
+
Формат кода:
|
| 179 |
+
report = \"\"\"
|
| 180 |
+
...markdown...
|
| 181 |
+
\"\"\"
|
| 182 |
+
report
|
| 183 |
+
|
| 184 |
+
Структура отчёта:
|
| 185 |
+
# План финансовой помощи
|
| 186 |
+
## Важно
|
| 187 |
+
- (дисклеймер: не юр/фин совет; при угрозе выселения/насилия/суицида — обращаться в местные службы)
|
| 188 |
+
- (не сообщать коды, CVV, пароли; осторожно со "моментальными списаниями" и предоплатами)
|
| 189 |
+
## Сводка ситуации
|
| 190 |
+
## Приоритеты
|
| 191 |
+
### Сегодня (24–72 часа)
|
| 192 |
+
### На неделе
|
| 193 |
+
### В течение месяца
|
| 194 |
+
## Варианты помощи в регионе
|
| 195 |
+
- список пунктов на основе resources
|
| 196 |
+
## Пошаговый план
|
| 197 |
+
- сгруппируй по urgent/short_term/mid_term
|
| 198 |
+
## Мини-бюджет на 30 дней
|
| 199 |
+
- как быстро стабилизировать: урезание расходов, переговоры, отсрочки/рассрочки (общие принципы)
|
| 200 |
+
## Анти-мошенничество
|
| 201 |
+
- признаки скама и что проверять
|
| 202 |
+
## Что подготовить
|
| 203 |
+
## Вопросы для уточнения
|
| 204 |
+
|
| 205 |
+
Важные требования:
|
| 206 |
+
- Используй информацию из Triage и структуру actions/resources.
|
| 207 |
+
- НЕ включай Python-структуры (dict/list) в Markdown — только читабельный текст.
|
| 208 |
+
- НЕ запрашивай и НЕ перечисляй чувствительные данные (номера карт, CVV, пароли, SMS-коды).
|
| 209 |
+
- Не используй web_search после того, как report сформирован.
|
| 210 |
+
|
| 211 |
+
Вход (Triage):
|
| 212 |
+
{triage_result}
|
| 213 |
+
|
| 214 |
+
Вход (Actions структуры):
|
| 215 |
+
{actions_struct}
|
| 216 |
+
"""
|
| 217 |
+
result = writer.run(textwrap.dedent(writer_prompt))
|
| 218 |
+
final_markdown = str(result).strip() if result is not None else ""
|
| 219 |
+
return final_markdown
|
| 220 |
+
|
| 221 |
+
|
| 222 |
+
with gr.Blocks(title="Financial Aid Navigator (Multi-agent)") as demo:
|
| 223 |
+
gr.Markdown("# Financial Aid Navigator (Multi-agent, Ollama + Qwen)")
|
| 224 |
+
gr.Markdown(f"- Model: `{MODEL_NAME}`\n- Ollama: `{OLLAMA_BASE}`")
|
| 225 |
+
|
| 226 |
+
region = gr.Textbox(
|
| 227 |
+
label="Регион",
|
| 228 |
+
placeholder="Например: Нидерланды, Амстердам / Казахстан, Алматы / Польша, Варшава",
|
| 229 |
+
lines=1,
|
| 230 |
+
)
|
| 231 |
+
urgency = gr.Dropdown(
|
| 232 |
+
["срочно (24–72 часа)", "в течение недели", "не срочно (в течение месяца)"],
|
| 233 |
+
value="в течение недели",
|
| 234 |
+
label="Срочность",
|
| 235 |
+
)
|
| 236 |
+
case_description = gr.Textbox(
|
| 237 |
+
label="Описание ситуации",
|
| 238 |
+
lines=9,
|
| 239 |
+
placeholder=(
|
| 240 |
+
"Опишите кратко: что случилось, есть ли долги/просрочки, аренда/ипотека, "
|
| 241 |
+
"примерный уровень доходов/расходов (можно диапазонами), что самое срочное."
|
| 242 |
+
),
|
| 243 |
+
)
|
| 244 |
+
allow_internet = gr.Checkbox(
|
| 245 |
+
label="Разрешить агенту поиск в интернете (web_search)",
|
| 246 |
+
value=False,
|
| 247 |
+
)
|
| 248 |
+
|
| 249 |
+
run_btn = gr.Button("Сформировать план помощи")
|
| 250 |
+
output = gr.Markdown()
|
| 251 |
+
|
| 252 |
+
run_btn.click(
|
| 253 |
+
fn=run_fin_aid_multi_agent,
|
| 254 |
+
inputs=[case_description, region, urgency, allow_internet],
|
| 255 |
+
outputs=[output],
|
| 256 |
+
)
|
| 257 |
+
|
| 258 |
+
|
| 259 |
+
def main():
|
| 260 |
+
demo.launch()
|
| 261 |
+
|
| 262 |
+
|
| 263 |
+
if __name__ == "__main__":
|
| 264 |
+
main()
|
requirements.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
requests~=2.32.3
|
| 2 |
+
gradio>=4.0.0
|
| 3 |
+
smolagents[litellm]>=0.4.0
|
| 4 |
+
litellm>=1.0.0
|
start.sh
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
set -euo pipefail
|
| 3 |
+
|
| 4 |
+
MODEL_NAME="${MODEL_NAME:-danielsheep/Qwen3-Coder-30B-A3B-Instruct-1M-Unsloth:UD-IQ3_XXS}"
|
| 5 |
+
OLLAMA_URL="${OLLAMA_URL:-http://127.0.0.1:11434}"
|
| 6 |
+
|
| 7 |
+
# Get the directory where the script is located
|
| 8 |
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
| 9 |
+
cd "$SCRIPT_DIR"
|
| 10 |
+
|
| 11 |
+
# Create virtual environment if it doesn't exist
|
| 12 |
+
if [ ! -d "venv" ]; then
|
| 13 |
+
echo "Creating virtual environment..."
|
| 14 |
+
python3 -m venv venv
|
| 15 |
+
fi
|
| 16 |
+
|
| 17 |
+
# Activate virtual environment
|
| 18 |
+
echo "Activating virtual environment..."
|
| 19 |
+
source venv/bin/activate
|
| 20 |
+
|
| 21 |
+
# Install requirements
|
| 22 |
+
echo "Installing requirements..."
|
| 23 |
+
pip install --upgrade pip
|
| 24 |
+
pip install -r requirements.txt
|
| 25 |
+
|
| 26 |
+
# Start Ollama server in background
|
| 27 |
+
ollama serve > /tmp/ollama.log 2>&1 &
|
| 28 |
+
OLLAMA_PID=$!
|
| 29 |
+
|
| 30 |
+
# Wait until Ollama is ready
|
| 31 |
+
python3 - << 'PY'
|
| 32 |
+
import time, urllib.request
|
| 33 |
+
url = "http://127.0.0.1:11434/api/tags"
|
| 34 |
+
for _ in range(120):
|
| 35 |
+
try:
|
| 36 |
+
urllib.request.urlopen(url, timeout=1).read()
|
| 37 |
+
print("Ollama is up")
|
| 38 |
+
raise SystemExit(0)
|
| 39 |
+
except Exception:
|
| 40 |
+
time.sleep(1)
|
| 41 |
+
raise SystemExit("Ollama did not start")
|
| 42 |
+
PY
|
| 43 |
+
|
| 44 |
+
# Pull model (first run will download it)
|
| 45 |
+
ollama pull "${MODEL_NAME}"
|
| 46 |
+
|
| 47 |
+
# Start Gradio app
|
| 48 |
+
exec python3 app.py
|