sim-atlas 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sim_atlas-0.0.1/.gitignore +338 -0
- sim_atlas-0.0.1/.gitlab-ci.yml +44 -0
- sim_atlas-0.0.1/AGENTS.md +114 -0
- sim_atlas-0.0.1/CLAUDE.md +1 -0
- sim_atlas-0.0.1/LICENSE +28 -0
- sim_atlas-0.0.1/PKG-INFO +32 -0
- sim_atlas-0.0.1/README.md +0 -0
- sim_atlas-0.0.1/pyproject.toml +101 -0
- sim_atlas-0.0.1/src/sim_atlas/__init__.py +0 -0
- sim_atlas-0.0.1/src/sim_atlas/agent/__init__.py +3 -0
- sim_atlas-0.0.1/src/sim_atlas/agent/_prompt.py +66 -0
- sim_atlas-0.0.1/src/sim_atlas/agent/_runner.py +213 -0
- sim_atlas-0.0.1/src/sim_atlas/agent/_sse.py +71 -0
- sim_atlas-0.0.1/src/sim_atlas/agent/tools/__init__.py +229 -0
- sim_atlas-0.0.1/src/sim_atlas/agent/tools/_errors.py +2 -0
- sim_atlas-0.0.1/src/sim_atlas/agent/tools/_graph.py +328 -0
- sim_atlas-0.0.1/src/sim_atlas/agent/tools/_search.py +255 -0
- sim_atlas-0.0.1/src/sim_atlas/ai.py +180 -0
- sim_atlas-0.0.1/src/sim_atlas/cli/__init__.py +4 -0
- sim_atlas-0.0.1/src/sim_atlas/cli/server.py +37 -0
- sim_atlas-0.0.1/src/sim_atlas/cli/token.py +38 -0
- sim_atlas-0.0.1/src/sim_atlas/exceptions.py +6 -0
- sim_atlas-0.0.1/src/sim_atlas/file_system_storage.py +480 -0
- sim_atlas-0.0.1/src/sim_atlas/main.py +329 -0
- sim_atlas-0.0.1/src/sim_atlas/models.py +348 -0
- sim_atlas-0.0.1/src/sim_atlas/security.py +39 -0
- sim_atlas-0.0.1/src/sim_atlas/settings.py +228 -0
- sim_atlas-0.0.1/src/sim_atlas/static/frontend/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- sim_atlas-0.0.1/src/sim_atlas/static/frontend/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- sim_atlas-0.0.1/src/sim_atlas/static/frontend/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- sim_atlas-0.0.1/src/sim_atlas/static/frontend/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- sim_atlas-0.0.1/src/sim_atlas/static/frontend/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- sim_atlas-0.0.1/src/sim_atlas/static/frontend/assets/index-Bj1UJeA8.css +1 -0
- sim_atlas-0.0.1/src/sim_atlas/static/frontend/assets/index-vns5LrWm.js +82 -0
- sim_atlas-0.0.1/src/sim_atlas/static/frontend/index.html +14 -0
- sim_atlas-0.0.1/src/sim_atlas/static/ide/assets/index-D7pRfJJj.js +116 -0
- sim_atlas-0.0.1/src/sim_atlas/static/ide/assets/index-DeIeWIGr.css +1 -0
- sim_atlas-0.0.1/src/sim_atlas/static/ide/index.html +16 -0
- sim_atlas-0.0.1/src/sim_atlas/storage_interface.py +96 -0
- sim_atlas-0.0.1/src/sim_atlas/type_utils.py +185 -0
- sim_atlas-0.0.1/src/sim_atlas/voyage_ai.py +25 -0
- sim_atlas-0.0.1/tests/__init__.py +0 -0
- sim_atlas-0.0.1/tests/test_agent_runner.py +138 -0
- sim_atlas-0.0.1/tests/test_file_system_storage.py +18 -0
- sim_atlas-0.0.1/tests/test_main.py +436 -0
- sim_atlas-0.0.1/tests/test_settings.py +151 -0
- sim_atlas-0.0.1/tests/test_storage_interface.py +661 -0
- sim_atlas-0.0.1/update_static_data +14 -0
- sim_atlas-0.0.1/uv.lock +3203 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
*.json
|
|
2
|
+
*.pkl
|
|
3
|
+
|
|
4
|
+
# Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,node
|
|
5
|
+
# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,python,node
|
|
6
|
+
|
|
7
|
+
### Node ###
|
|
8
|
+
# Logs
|
|
9
|
+
logs
|
|
10
|
+
*.log
|
|
11
|
+
npm-debug.log*
|
|
12
|
+
yarn-debug.log*
|
|
13
|
+
yarn-error.log*
|
|
14
|
+
lerna-debug.log*
|
|
15
|
+
.pnpm-debug.log*
|
|
16
|
+
|
|
17
|
+
# Diagnostic reports (https://nodejs.org/api/report.html)
|
|
18
|
+
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
|
19
|
+
|
|
20
|
+
# Runtime data
|
|
21
|
+
pids
|
|
22
|
+
*.pid
|
|
23
|
+
*.seed
|
|
24
|
+
*.pid.lock
|
|
25
|
+
|
|
26
|
+
# Directory for instrumented libs generated by jscoverage/JSCover
|
|
27
|
+
lib-cov
|
|
28
|
+
|
|
29
|
+
# Coverage directory used by tools like istanbul
|
|
30
|
+
coverage
|
|
31
|
+
*.lcov
|
|
32
|
+
|
|
33
|
+
# nyc test coverage
|
|
34
|
+
.nyc_output
|
|
35
|
+
|
|
36
|
+
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
|
37
|
+
.grunt
|
|
38
|
+
|
|
39
|
+
# Bower dependency directory (https://bower.io/)
|
|
40
|
+
bower_components
|
|
41
|
+
|
|
42
|
+
# node-waf configuration
|
|
43
|
+
.lock-wscript
|
|
44
|
+
|
|
45
|
+
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
|
46
|
+
build/Release
|
|
47
|
+
|
|
48
|
+
# Dependency directories
|
|
49
|
+
node_modules/
|
|
50
|
+
jspm_packages/
|
|
51
|
+
|
|
52
|
+
# Snowpack dependency directory (https://snowpack.dev/)
|
|
53
|
+
web_modules/
|
|
54
|
+
|
|
55
|
+
# TypeScript cache
|
|
56
|
+
*.tsbuildinfo
|
|
57
|
+
|
|
58
|
+
# Optional npm cache directory
|
|
59
|
+
.npm
|
|
60
|
+
|
|
61
|
+
# Optional eslint cache
|
|
62
|
+
.eslintcache
|
|
63
|
+
|
|
64
|
+
# Optional stylelint cache
|
|
65
|
+
.stylelintcache
|
|
66
|
+
|
|
67
|
+
# Microbundle cache
|
|
68
|
+
.rpt2_cache/
|
|
69
|
+
.rts2_cache_cjs/
|
|
70
|
+
.rts2_cache_es/
|
|
71
|
+
.rts2_cache_umd/
|
|
72
|
+
|
|
73
|
+
# Optional REPL history
|
|
74
|
+
.node_repl_history
|
|
75
|
+
|
|
76
|
+
# Output of 'npm pack'
|
|
77
|
+
*.tgz
|
|
78
|
+
|
|
79
|
+
# Yarn Integrity file
|
|
80
|
+
.yarn-integrity
|
|
81
|
+
|
|
82
|
+
# dotenv environment variable files
|
|
83
|
+
.env
|
|
84
|
+
.env.development.local
|
|
85
|
+
.env.test.local
|
|
86
|
+
.env.production.local
|
|
87
|
+
.env.local
|
|
88
|
+
|
|
89
|
+
# parcel-bundler cache (https://parceljs.org/)
|
|
90
|
+
.cache
|
|
91
|
+
.parcel-cache
|
|
92
|
+
|
|
93
|
+
# Next.js build output
|
|
94
|
+
.next
|
|
95
|
+
out
|
|
96
|
+
|
|
97
|
+
# Nuxt.js build / generate output
|
|
98
|
+
.nuxt
|
|
99
|
+
dist
|
|
100
|
+
|
|
101
|
+
# Gatsby files
|
|
102
|
+
.cache/
|
|
103
|
+
# Comment in the public line in if your project uses Gatsby and not Next.js
|
|
104
|
+
# https://nextjs.org/blog/next-9-1#public-directory-support
|
|
105
|
+
# public
|
|
106
|
+
|
|
107
|
+
# vuepress build output
|
|
108
|
+
.vuepress/dist
|
|
109
|
+
|
|
110
|
+
# vuepress v2.x temp and cache directory
|
|
111
|
+
.temp
|
|
112
|
+
|
|
113
|
+
# Docusaurus cache and generated files
|
|
114
|
+
.docusaurus
|
|
115
|
+
|
|
116
|
+
# Serverless directories
|
|
117
|
+
.serverless/
|
|
118
|
+
|
|
119
|
+
# FuseBox cache
|
|
120
|
+
.fusebox/
|
|
121
|
+
|
|
122
|
+
# DynamoDB Local files
|
|
123
|
+
.dynamodb/
|
|
124
|
+
|
|
125
|
+
# TernJS port file
|
|
126
|
+
.tern-port
|
|
127
|
+
|
|
128
|
+
# Stores VSCode versions used for testing VSCode extensions
|
|
129
|
+
.vscode-test
|
|
130
|
+
|
|
131
|
+
# yarn v2
|
|
132
|
+
.yarn/cache
|
|
133
|
+
.yarn/unplugged
|
|
134
|
+
.yarn/build-state.yml
|
|
135
|
+
.yarn/install-state.gz
|
|
136
|
+
.pnp.*
|
|
137
|
+
|
|
138
|
+
### Node Patch ###
|
|
139
|
+
# Serverless Webpack directories
|
|
140
|
+
.webpack/
|
|
141
|
+
|
|
142
|
+
# Optional stylelint cache
|
|
143
|
+
|
|
144
|
+
# SvelteKit build / generate output
|
|
145
|
+
.svelte-kit
|
|
146
|
+
|
|
147
|
+
### Python ###
|
|
148
|
+
# Byte-compiled / optimized / DLL files
|
|
149
|
+
__pycache__/
|
|
150
|
+
*.py[cod]
|
|
151
|
+
*$py.class
|
|
152
|
+
|
|
153
|
+
# C extensions
|
|
154
|
+
*.so
|
|
155
|
+
|
|
156
|
+
# Distribution / packaging
|
|
157
|
+
.Python
|
|
158
|
+
build/
|
|
159
|
+
develop-eggs/
|
|
160
|
+
dist/
|
|
161
|
+
downloads/
|
|
162
|
+
eggs/
|
|
163
|
+
.eggs/
|
|
164
|
+
lib/
|
|
165
|
+
lib64/
|
|
166
|
+
parts/
|
|
167
|
+
sdist/
|
|
168
|
+
var/
|
|
169
|
+
wheels/
|
|
170
|
+
share/python-wheels/
|
|
171
|
+
*.egg-info/
|
|
172
|
+
.installed.cfg
|
|
173
|
+
*.egg
|
|
174
|
+
MANIFEST
|
|
175
|
+
|
|
176
|
+
# PyInstaller
|
|
177
|
+
# Usually these files are written by a python script from a template
|
|
178
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
179
|
+
*.manifest
|
|
180
|
+
*.spec
|
|
181
|
+
|
|
182
|
+
# Installer logs
|
|
183
|
+
pip-log.txt
|
|
184
|
+
pip-delete-this-directory.txt
|
|
185
|
+
|
|
186
|
+
# Unit test / coverage reports
|
|
187
|
+
htmlcov/
|
|
188
|
+
.tox/
|
|
189
|
+
.nox/
|
|
190
|
+
.coverage
|
|
191
|
+
.coverage.*
|
|
192
|
+
nosetests.xml
|
|
193
|
+
coverage.xml
|
|
194
|
+
*.cover
|
|
195
|
+
*.py,cover
|
|
196
|
+
.hypothesis/
|
|
197
|
+
.pytest_cache/
|
|
198
|
+
cover/
|
|
199
|
+
|
|
200
|
+
# Translations
|
|
201
|
+
*.mo
|
|
202
|
+
*.pot
|
|
203
|
+
|
|
204
|
+
# Django stuff:
|
|
205
|
+
local_settings.py
|
|
206
|
+
db.sqlite3
|
|
207
|
+
db.sqlite3-journal
|
|
208
|
+
|
|
209
|
+
# Flask stuff:
|
|
210
|
+
instance/
|
|
211
|
+
.webassets-cache
|
|
212
|
+
|
|
213
|
+
# Scrapy stuff:
|
|
214
|
+
.scrapy
|
|
215
|
+
|
|
216
|
+
# Sphinx documentation
|
|
217
|
+
docs/_build/
|
|
218
|
+
|
|
219
|
+
# PyBuilder
|
|
220
|
+
.pybuilder/
|
|
221
|
+
target/
|
|
222
|
+
|
|
223
|
+
# Jupyter Notebook
|
|
224
|
+
.ipynb_checkpoints
|
|
225
|
+
|
|
226
|
+
# IPython
|
|
227
|
+
profile_default/
|
|
228
|
+
ipython_config.py
|
|
229
|
+
|
|
230
|
+
# pyenv
|
|
231
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
232
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
233
|
+
# .python-version
|
|
234
|
+
|
|
235
|
+
# pipenv
|
|
236
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
237
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
238
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
239
|
+
# install all needed dependencies.
|
|
240
|
+
#Pipfile.lock
|
|
241
|
+
|
|
242
|
+
# poetry
|
|
243
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
244
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
245
|
+
# commonly ignored for libraries.
|
|
246
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
247
|
+
#poetry.lock
|
|
248
|
+
|
|
249
|
+
# pdm
|
|
250
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
251
|
+
#pdm.lock
|
|
252
|
+
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
253
|
+
# in version control.
|
|
254
|
+
# https://pdm.fming.dev/#use-with-ide
|
|
255
|
+
.pdm.toml
|
|
256
|
+
|
|
257
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
258
|
+
__pypackages__/
|
|
259
|
+
|
|
260
|
+
# Celery stuff
|
|
261
|
+
celerybeat-schedule
|
|
262
|
+
celerybeat.pid
|
|
263
|
+
|
|
264
|
+
# SageMath parsed files
|
|
265
|
+
*.sage.py
|
|
266
|
+
|
|
267
|
+
# Environments
|
|
268
|
+
.venv
|
|
269
|
+
env/
|
|
270
|
+
venv/
|
|
271
|
+
ENV/
|
|
272
|
+
env.bak/
|
|
273
|
+
venv.bak/
|
|
274
|
+
|
|
275
|
+
# Spyder project settings
|
|
276
|
+
.spyderproject
|
|
277
|
+
.spyproject
|
|
278
|
+
|
|
279
|
+
# Rope project settings
|
|
280
|
+
.ropeproject
|
|
281
|
+
|
|
282
|
+
# mkdocs documentation
|
|
283
|
+
/site
|
|
284
|
+
|
|
285
|
+
# mypy
|
|
286
|
+
.mypy_cache/
|
|
287
|
+
.dmypy.json
|
|
288
|
+
dmypy.json
|
|
289
|
+
|
|
290
|
+
# Pyre type checker
|
|
291
|
+
.pyre/
|
|
292
|
+
|
|
293
|
+
# pytype static type analyzer
|
|
294
|
+
.pytype/
|
|
295
|
+
|
|
296
|
+
# Cython debug symbols
|
|
297
|
+
cython_debug/
|
|
298
|
+
|
|
299
|
+
# PyCharm
|
|
300
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
301
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
302
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
303
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
304
|
+
#.idea/
|
|
305
|
+
|
|
306
|
+
### Python Patch ###
|
|
307
|
+
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
|
|
308
|
+
poetry.toml
|
|
309
|
+
|
|
310
|
+
# ruff
|
|
311
|
+
.ruff_cache/
|
|
312
|
+
|
|
313
|
+
# LSP config files
|
|
314
|
+
pyrightconfig.json
|
|
315
|
+
|
|
316
|
+
### VisualStudioCode ###
|
|
317
|
+
.vscode/*
|
|
318
|
+
!.vscode/settings.json
|
|
319
|
+
!.vscode/tasks.json
|
|
320
|
+
!.vscode/launch.json
|
|
321
|
+
!.vscode/extensions.json
|
|
322
|
+
!.vscode/*.code-snippets
|
|
323
|
+
|
|
324
|
+
# Local History for Visual Studio Code
|
|
325
|
+
.history/
|
|
326
|
+
|
|
327
|
+
# Built Visual Studio Code Extensions
|
|
328
|
+
*.vsix
|
|
329
|
+
|
|
330
|
+
### VisualStudioCode Patch ###
|
|
331
|
+
# Ignore all local history of files
|
|
332
|
+
.history
|
|
333
|
+
.ionide
|
|
334
|
+
|
|
335
|
+
# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,python,node
|
|
336
|
+
.sim_atlas/
|
|
337
|
+
|
|
338
|
+
*.toml
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
workflow:
|
|
2
|
+
rules:
|
|
3
|
+
- if: '$CI_PIPELINE_SOURCE == "push"'
|
|
4
|
+
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
5
|
+
|
|
6
|
+
variables:
|
|
7
|
+
SIM_ATLAS_JWT_SECRET: "ci-dummy-secret"
|
|
8
|
+
SIM_ATLAS_LLM_API_KEY: "ci-dummy-api-key"
|
|
9
|
+
SIM_ATLAS_LLM_BASE_URL: "http://localhost:11434/v1"
|
|
10
|
+
SIM_ATLAS_LLM_EMBEDDING_MODEL: "ci-dummy-embedding-model"
|
|
11
|
+
SIM_ATLAS_LLM_CHAT_MODEL: "ci-dummy-chat-model"
|
|
12
|
+
SIM_ATLAS_VOYAGE_API_KEY: "ci-dummy-voyage-api-key"
|
|
13
|
+
|
|
14
|
+
default:
|
|
15
|
+
interruptible: true
|
|
16
|
+
|
|
17
|
+
backend_lint_and_type_check:
|
|
18
|
+
image: python:3.12
|
|
19
|
+
before_script:
|
|
20
|
+
- python -m pip install --upgrade pip
|
|
21
|
+
- python -m pip install uv
|
|
22
|
+
script:
|
|
23
|
+
- cd backend
|
|
24
|
+
- uv sync --dev
|
|
25
|
+
- uv run ruff check .
|
|
26
|
+
- uv run ruff format --check .
|
|
27
|
+
- uv run pyright
|
|
28
|
+
|
|
29
|
+
backend_test_and_coverage:
|
|
30
|
+
image: python:3.12
|
|
31
|
+
before_script:
|
|
32
|
+
- python -m pip install --upgrade pip
|
|
33
|
+
- python -m pip install uv
|
|
34
|
+
script:
|
|
35
|
+
- cd backend
|
|
36
|
+
- uv sync --dev
|
|
37
|
+
- uv run coverage run -m pytest
|
|
38
|
+
- uv run coverage report
|
|
39
|
+
- uv run coverage html
|
|
40
|
+
coverage: '/TOTAL.*\s+(\d+%)$/'
|
|
41
|
+
artifacts:
|
|
42
|
+
paths:
|
|
43
|
+
- backend/htmlcov/
|
|
44
|
+
expose_as: Coverage Report
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# backend
|
|
2
|
+
|
|
3
|
+
FastAPI REST API with MCP tool exposure and AI integration.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
uv run pytest # run tests
|
|
9
|
+
uv run coverage run -m pytest # run tests with coverage
|
|
10
|
+
uv run ruff check . # lint
|
|
11
|
+
uv run ruff format --check . # check formatting
|
|
12
|
+
uv run pyright # type-check (strict mode)
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Key Patterns
|
|
16
|
+
|
|
17
|
+
- **Storage**: always interact via `storage_interface.py` (`StorageInterface`), never directly via `file_system_storage.py`; use `get_storage_backend()` (also in `storage_interface.py`) to instantiate the backend
|
|
18
|
+
- **Dependency injection**: use `Depends()` for storage (`get_storage` in `main.py`) and auth (`get_current_user` in `security.py`); settings are NOT injected via `Depends()` — call `load_settings()` directly (it is `lru_cache`-cached)
|
|
19
|
+
- **Models**: Pydantic v2; all schemas in `models.py`; three distinct types: `NodeRequest` (API write input), `NodeMetadata` (internal storage schema), `NodeResponse` (API read output); `NdArray` is a custom Pydantic type for gzip-compressed numpy arrays (embeddings)
|
|
20
|
+
- **Auth**: JWT tokens carried in `x-api-key` header; `get_current_user` dependency enforces auth on write routes; read routes are public
|
|
21
|
+
- **MCP**: only `semantic_search`, `hybrid_search`, and `agent_stream` are exposed as MCP tools (see `include_operations` in `main.py`); keep those route signatures clean — they double as tool signatures
|
|
22
|
+
- **AI**: docstring enrichment via OpenAI-compatible API (`ai.py`); embeddings via VoyageAI (`voyage_ai.py`); agent in `agent/` — SSE streaming (`_sse.py`), agentic loop (`_runner.py`), system prompt (`_prompt.py`), observability (`_observability.py`), tools in `agent/tools/`; all AI features raise `AINotConfiguredError` (from `exceptions.py`) when the required settings are absent
|
|
23
|
+
- **Config**: all settings via `settings.py` (`pydantic-settings`); loaded from TOML files at `/etc/sim_atlas/config.toml`, `~/.sim_atlas/config.toml`, or `.sim_atlas/config.toml`; never hardcode secrets or URLs
|
|
24
|
+
- **CLI**: entry points live in `cli/` (`server.py` starts the server, `token.py` issues JWT tokens)
|
|
25
|
+
|
|
26
|
+
## Libraries
|
|
27
|
+
|
|
28
|
+
- **pydantic**: [Documentation](https://pydantic.dev/docs/validation/latest/llms.txt)
|
|
29
|
+
- **pydantic-settings**: [Documentation](https://pydantic.dev/docs/validation/latest/llms.txt)
|
|
30
|
+
- **langfuse**: [Documentation](https://langfuse.com/llms-docs.txt)
|
|
31
|
+
|
|
32
|
+
## Think Before Coding
|
|
33
|
+
|
|
34
|
+
**Don't assume. Don't hide confusion. Surface tradeoffs.**
|
|
35
|
+
|
|
36
|
+
Before implementing:
|
|
37
|
+
- State your assumptions explicitly. If uncertain, ask.
|
|
38
|
+
- If multiple interpretations exist, present them - don't pick silently.
|
|
39
|
+
- If a simpler approach exists, say so. Push back when warranted.
|
|
40
|
+
- If something is unclear, stop. Name what's confusing. Ask.
|
|
41
|
+
|
|
42
|
+
## Simplicity First
|
|
43
|
+
|
|
44
|
+
**Minimum code that solves the problem. Nothing speculative.**
|
|
45
|
+
|
|
46
|
+
- No features beyond what was asked.
|
|
47
|
+
- No abstractions for single-use code.
|
|
48
|
+
- No "flexibility" or "configurability" that wasn't requested.
|
|
49
|
+
- No error handling for impossible scenarios.
|
|
50
|
+
- If you write 200 lines and it could be 50, rewrite it.
|
|
51
|
+
|
|
52
|
+
Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.
|
|
53
|
+
|
|
54
|
+
## Surgical Changes
|
|
55
|
+
|
|
56
|
+
**Touch only what you must. Clean up only your own mess.**
|
|
57
|
+
|
|
58
|
+
When editing existing code:
|
|
59
|
+
- Don't "improve" adjacent code, comments, or formatting.
|
|
60
|
+
- Don't refactor things that aren't broken.
|
|
61
|
+
- Match existing style, even if you'd do it differently.
|
|
62
|
+
- If you notice unrelated dead code, mention it - don't delete it.
|
|
63
|
+
|
|
64
|
+
When your changes create orphans:
|
|
65
|
+
- Remove imports/variables/functions that YOUR changes made unused.
|
|
66
|
+
- Don't remove pre-existing dead code unless asked.
|
|
67
|
+
|
|
68
|
+
The test: Every changed line should trace directly to the user's request.
|
|
69
|
+
|
|
70
|
+
## Code Quality — Write It Right First Time
|
|
71
|
+
|
|
72
|
+
**Run `uv run ruff check . && uv run ruff format --check . && uv run pyright` before declaring done. Fix all errors before moving on.**
|
|
73
|
+
|
|
74
|
+
### Type safety (Pyright strict)
|
|
75
|
+
- Annotate every function parameter and return type — no implicit `Any`.
|
|
76
|
+
- Use `X | Y` union syntax (Python 3.10+), never `Optional[X]` or `Union[X, Y]`.
|
|
77
|
+
- Prefer `X | None` over wrapping in `Optional`.
|
|
78
|
+
- Use `list[X]`, `dict[K, V]`, `tuple[X, ...]` (lowercase), not `List`, `Dict`, `Tuple` from `typing`.
|
|
79
|
+
- Only import from `typing` what has no builtin equivalent: `TypeVar`, `Protocol`, `TypedDict`, `Literal`, `overload`, `cast`, `TYPE_CHECKING`.
|
|
80
|
+
- Narrow types explicitly with `isinstance` checks or `assert` before use; don't cast blindly.
|
|
81
|
+
- Never use `# type: ignore` without a specific error code and a comment explaining why.
|
|
82
|
+
|
|
83
|
+
### Ruff lint rules enforced (see pyproject.toml)
|
|
84
|
+
- **UP**: use modern Python syntax — `X | Y`, `type` aliases, `match` where appropriate.
|
|
85
|
+
- **I**: imports are sorted — stdlib → third-party → local, one blank line between groups.
|
|
86
|
+
- **F**: no unused imports or variables; remove them (don't comment them out).
|
|
87
|
+
- **B**: no mutable default arguments, no `assert` in production logic.
|
|
88
|
+
- **SIM**: simplify boolean returns, `if`/`else` chains, and `with` blocks.
|
|
89
|
+
- **C4**: prefer comprehensions over `map`/`filter`; avoid unnecessary `list()` wrapping.
|
|
90
|
+
- **ERA**: no commented-out code.
|
|
91
|
+
- **PL**: Pylint rules — avoid too-many-branches, too-many-return-statements, etc.
|
|
92
|
+
|
|
93
|
+
### Formatting (ruff format)
|
|
94
|
+
- 88-character line limit (E501 is ignored so long lines won't error, but keep them readable).
|
|
95
|
+
- Use double quotes for strings.
|
|
96
|
+
- Trailing commas in multi-line collections.
|
|
97
|
+
|
|
98
|
+
## Goal-Driven Execution
|
|
99
|
+
|
|
100
|
+
**Define success criteria. Loop until verified.**
|
|
101
|
+
|
|
102
|
+
Transform tasks into verifiable goals:
|
|
103
|
+
- "Add validation" → "Write tests for invalid inputs, then make them pass"
|
|
104
|
+
- "Fix the bug" → "Write a test that reproduces it, then make it pass"
|
|
105
|
+
- "Refactor X" → "Ensure tests pass before and after"
|
|
106
|
+
|
|
107
|
+
For multi-step tasks, state a brief plan:
|
|
108
|
+
```
|
|
109
|
+
1. [Step] → verify: [check]
|
|
110
|
+
2. [Step] → verify: [check]
|
|
111
|
+
3. [Step] → verify: [check]
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
AGENTS.md
|
sim_atlas-0.0.1/LICENSE
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
BSD 3-Clause License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026, Sebastian Eibl
|
|
4
|
+
|
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
|
7
|
+
|
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
|
9
|
+
list of conditions and the following disclaimer.
|
|
10
|
+
|
|
11
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
|
13
|
+
and/or other materials provided with the distribution.
|
|
14
|
+
|
|
15
|
+
3. Neither the name of the copyright holder nor the names of its
|
|
16
|
+
contributors may be used to endorse or promote products derived from
|
|
17
|
+
this software without specific prior written permission.
|
|
18
|
+
|
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
20
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
21
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
22
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
23
|
+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
24
|
+
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
25
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
26
|
+
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
27
|
+
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
sim_atlas-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sim-atlas
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Search and discovery platform for simulation nodes — Python functions, workflow definitions, and pyiron nodes used in scientific computing.
|
|
5
|
+
Author-email: Sebastian Eibl <sebastian.eibl@mpcdf.mpg.de>
|
|
6
|
+
Maintainer-email: Sebastian Eibl <sebastian.eibl@mpcdf.mpg.de>
|
|
7
|
+
License-Expression: BSD-3-Clause
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Keywords: pyiron
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Environment :: Web Environment
|
|
12
|
+
Classifier: Framework :: FastAPI
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Scientific/Engineering
|
|
21
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
22
|
+
Requires-Python: >=3.12
|
|
23
|
+
Requires-Dist: fastapi-mcp>=0.4.0
|
|
24
|
+
Requires-Dist: fastapi[standard]>=0.122.0
|
|
25
|
+
Requires-Dist: langfuse>=4.6.1
|
|
26
|
+
Requires-Dist: numpy>=1.21
|
|
27
|
+
Requires-Dist: openai>=2.8.1
|
|
28
|
+
Requires-Dist: pydantic-settings[toml]>=2.13.1
|
|
29
|
+
Requires-Dist: pyjwt>=2.12.1
|
|
30
|
+
Requires-Dist: python-workflow-definition>=0.1.2
|
|
31
|
+
Requires-Dist: tqdm>=4.67.3
|
|
32
|
+
Requires-Dist: voyageai>=0.3.7
|
|
File without changes
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "sim-atlas"
|
|
3
|
+
version = "0.0.1"
|
|
4
|
+
description = "Search and discovery platform for simulation nodes — Python functions, workflow definitions, and pyiron nodes used in scientific computing."
|
|
5
|
+
authors = [
|
|
6
|
+
{ name = "Sebastian Eibl", email = "sebastian.eibl@mpcdf.mpg.de"},
|
|
7
|
+
]
|
|
8
|
+
maintainers = [
|
|
9
|
+
{ name = "Sebastian Eibl", email = "sebastian.eibl@mpcdf.mpg.de"},
|
|
10
|
+
]
|
|
11
|
+
readme = "README.md"
|
|
12
|
+
requires-python = ">=3.12"
|
|
13
|
+
license = "BSD-3-Clause"
|
|
14
|
+
license-files = ["LICEN[CS]E*"]
|
|
15
|
+
keywords = ["pyiron"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 3 - Alpha",
|
|
18
|
+
"Environment :: Web Environment",
|
|
19
|
+
"Framework :: FastAPI",
|
|
20
|
+
"Intended Audience :: Developers",
|
|
21
|
+
"Intended Audience :: Science/Research",
|
|
22
|
+
"Operating System :: OS Independent",
|
|
23
|
+
"Programming Language :: Python",
|
|
24
|
+
"Programming Language :: Python :: 3",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
"Programming Language :: Python :: 3.13",
|
|
27
|
+
"Topic :: Scientific/Engineering",
|
|
28
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
29
|
+
]
|
|
30
|
+
dependencies = [
|
|
31
|
+
"fastapi-mcp>=0.4.0",
|
|
32
|
+
"fastapi[standard]>=0.122.0",
|
|
33
|
+
"langfuse>=4.6.1",
|
|
34
|
+
"numpy>=1.21",
|
|
35
|
+
"openai>=2.8.1",
|
|
36
|
+
"pydantic-settings[toml]>=2.13.1",
|
|
37
|
+
"pyjwt>=2.12.1",
|
|
38
|
+
"python-workflow-definition>=0.1.2",
|
|
39
|
+
"tqdm>=4.67.3",
|
|
40
|
+
"voyageai>=0.3.7",
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
[dependency-groups]
|
|
44
|
+
dev = [
|
|
45
|
+
"coverage>=7.13.5",
|
|
46
|
+
"pyright>=1.1.407",
|
|
47
|
+
"pytest>=9.0.2",
|
|
48
|
+
"ruff>=0.14.6",
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
[build-system]
|
|
52
|
+
requires = ["hatchling"]
|
|
53
|
+
build-backend = "hatchling.build"
|
|
54
|
+
|
|
55
|
+
[project.scripts]
|
|
56
|
+
sim-atlas-access-token = "sim_atlas.cli:token"
|
|
57
|
+
sim-atlas = "sim_atlas.cli:backend"
|
|
58
|
+
|
|
59
|
+
[tool.fastapi]
|
|
60
|
+
entrypoint = "sim_atlas.main:app"
|
|
61
|
+
|
|
62
|
+
[tool.ruff.lint]
|
|
63
|
+
select = [
|
|
64
|
+
# pycodestyle
|
|
65
|
+
"E",
|
|
66
|
+
# Pyflakes
|
|
67
|
+
"F",
|
|
68
|
+
# pyupgrade
|
|
69
|
+
"UP",
|
|
70
|
+
# flake8-bugbear
|
|
71
|
+
"B",
|
|
72
|
+
# flake8-simplify
|
|
73
|
+
"SIM",
|
|
74
|
+
# isort
|
|
75
|
+
"I",
|
|
76
|
+
# flake8-comprehensions
|
|
77
|
+
"C4",
|
|
78
|
+
# eradicate
|
|
79
|
+
"ERA",
|
|
80
|
+
# pylint
|
|
81
|
+
"PL",
|
|
82
|
+
]
|
|
83
|
+
ignore = [
|
|
84
|
+
"E501", # line too long
|
|
85
|
+
"PLR0912", # Too many branches
|
|
86
|
+
"PLR0915", # Too many statements
|
|
87
|
+
"PLR0913", # Too many arguments in function definition
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
[tool.pyright]
|
|
91
|
+
typeCheckingMode = "strict"
|
|
92
|
+
reportMissingTypeStubs = false
|
|
93
|
+
|
|
94
|
+
[pytest]
|
|
95
|
+
strict = true
|
|
96
|
+
|
|
97
|
+
[[tool.uv.index]]
|
|
98
|
+
name = "testpypi"
|
|
99
|
+
url = "https://test.pypi.org/simple/"
|
|
100
|
+
publish-url = "https://test.pypi.org/legacy/"
|
|
101
|
+
explicit = true
|
|
File without changes
|