{"id":49081394,"url":"https://github.com/sup3rus3r/obsidian-networks","last_synced_at":"2026-04-20T13:14:44.800Z","repository":{"id":341982037,"uuid":"1171934176","full_name":"sup3rus3r/obsidian-networks","owner":"sup3rus3r","description":"Build real ML models without writing training code Upload your dataset + describe your goal → AI generates ready-to-train TensorFlow/Keras code + models — No ML experience required.","archived":false,"fork":false,"pushed_at":"2026-04-11T17:36:27.000Z","size":2689,"stargazers_count":9,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-11T19:23:50.376Z","etag":null,"topics":["ai-agents","anthropic","artificial-intelligence","datasets","llm","lmstudio","machine-learning","open-source","openai","reinforcement-learning","tensorflow"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sup3rus3r.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-03T19:15:30.000Z","updated_at":"2026-04-11T17:36:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sup3rus3r/obsidian-networks","commit_stats":null,"previous_names":["sup3rus3r/obsidian-networks"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/sup3rus3r/obsidian-networks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sup3rus3r%2Fobsidian-networks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sup3rus3r%2Fobsidian-networks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sup3rus3r%2Fobsidian-networks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sup3rus3r%2Fobsidian-networks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sup3rus3r","download_url":"https://codeload.github.com/sup3rus3r/obsidian-networks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sup3rus3r%2Fobsidian-networks/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32048567,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T11:35:06.609Z","status":"ssl_error","status_checked_at":"2026-04-20T11:34:48.899Z","response_time":94,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","anthropic","artificial-intelligence","datasets","llm","lmstudio","machine-learning","open-source","openai","reinforcement-learning","tensorflow"],"created_at":"2026-04-20T13:14:44.479Z","updated_at":"2026-04-20T13:14:44.793Z","avatar_url":"https://github.com/sup3rus3r.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"frontend/public/logo.svg\" alt=\"Obsidian Networks\" width=\"280\" /\u003e\n\n---\n\nObsidian Networks is an open-source platform that takes a problem described in plain language and builds a working ML solution from it — reading the relevant research, selecting an architecture, writing and running the code, and returning something you can actually use.\n\nYou describe the problem. It handles the rest: literature search, architecture selection, code generation, training, debugging. The output is a trained model and a Jupyter notebook you can open and modify.\n\nIt runs entirely on your own hardware. No data leaves your machine. No API calls to a training service. No account required beyond whatever LLM provider you choose to use.\n\nResearch Labs goes further — instead of solving one problem, it runs an open-ended architecture search. Eight agents work in a loop across multiple generations: generating candidates, training them, scoring them, and recursing on the ones worth keeping. You set a domain and a goal, and it runs until it has something to show you.\n\n**Built in pursuit of AGI. Open source under AGPL v3.**\n\n---\n\n[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](LICENSE)\n[![GitHub Stars](https://img.shields.io/github/stars/sup3rus3r/obsidian-networks?style=social)](https://github.com/sup3rus3r/obsidian-networks/stargazers)\n[![GitHub Forks](https://img.shields.io/github/forks/sup3rus3r/obsidian-networks?style=social)](https://github.com/sup3rus3r/obsidian-networks/network/members)\n[![GitHub Issues](https://img.shields.io/github/issues/sup3rus3r/obsidian-networks)](https://github.com/sup3rus3r/obsidian-networks/issues)\n[![Python](https://img.shields.io/badge/Python-3.11+-3776AB?logo=python\u0026logoColor=white)](https://www.python.org/)\n[![Next.js](https://img.shields.io/badge/Next.js-16-000000?logo=next.js\u0026logoColor=white)](https://nextjs.org/)\n[![FastAPI](https://img.shields.io/badge/FastAPI-0.128+-009688?logo=fastapi\u0026logoColor=white)](https://fastapi.tiangolo.com/)\n[![TensorFlow](https://img.shields.io/badge/TensorFlow-2.18+-FF6F00?logo=tensorflow\u0026logoColor=white)](https://www.tensorflow.org/)\n[![Redis](https://img.shields.io/badge/Redis-7-DC382D?logo=redis\u0026logoColor=white)](https://redis.io/)\n\n---\n\n**If you find this project useful, please consider giving it a star!** It helps others discover the project and motivates continued development.\n\n[**Give it a Star ⭐**](https://github.com/sup3rus3r/obsidian-networks)\n\n\u003c/div\u003e\n\n---\n\n## Screenshots\n\n\u003cdiv align=\"center\"\u003e\n\n**Main Platform — Research, Plan, Build**\n\n\u003cimg src=\"docs/images/image.png\" alt=\"Obsidian Networks main platform — research plan and model builder\" width=\"900\" /\u003e\n\n*The platform reads academic literature, forms a cited plan, and generates a production training script — all in one conversation.*\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n**Research Labs — Discovered Architectures Leaderboard**\n\n\u003cimg src=\"docs/images/image2.png\" alt=\"Obsidian Networks Research Labs — architecture leaderboard with score breakdown\" width=\"900\" /\u003e\n\n*Eight agents run continuously, scoring each candidate on novelty, efficiency, soundness, and generalisation. Top performers seed the next generation.*\n\n\u003c/div\u003e\n\n---\n\n## How It Works\n\nYou describe what you need. Everything else happens automatically.\n\n**Research** — The platform goes to the source. It searches academic literature, reads papers, selects the ones that matter for your specific problem, and builds a private knowledge base from them — just for this session. It does not guess. It does not improvise from memory. It reads.\n\n**Plan** — From that knowledge base, it forms a plan. Every decision — what approach to take, how to structure it, what to measure — is drawn from what it found in the literature and presented to you with citations. You read it. You approve it. Nothing is built until you do.\n\n**Build** — Once you give the go-ahead, it builds exactly what was planned. The output is clean, readable, and yours to keep — a complete working script wrapped in a Jupyter notebook you can open anywhere.\n\n**Train** — Click one button. It runs on your machine, in your environment. You watch it work in real time — metrics, charts, progress — as it trains. When it finishes, you download the result.\n\nThat is the whole process. No configuration. No expertise required. No waiting on someone else.\n\n---\n\n## Research Labs\n\nBeyond building a single model, Obsidian Networks includes Research Labs — a multi-generation architecture discovery engine that searches an entire design space on your behalf, grounded in real academic research at every step.\n\nYou set a domain (vision, text, audio, time series, graph, multimodal, tabular, recommendation, or generative), a research goal in plain language, and how many candidates and generations to run. Eight specialised AI agents then execute in a coordinated pipeline:\n\n### The Pipeline\n\n**1. Researcher** — Uses an LLM to generate targeted arXiv search queries from your specific research goal — not generic domain keywords. For each candidate slot, it generates an independent pair of queries covering a different sub-area of the literature, so each candidate in a generation draws from entirely different papers and mechanisms. It reads the abstracts, selects the 3–4 most relevant papers per slot, downloads the full PDFs, extracts the complete text (methods sections, equations, pseudocode, results), and chunks it into a per-session FAISS vector store. Papers accumulate across generations, so later generations have a richer store to draw from.\n\n**2. Mathematician** — Queries the session vector store with targeted questions about mathematical mechanisms, attention formulations, loss functions, and novel training objectives. Gets back actual content from the papers — real equations and methods sections — not abstract summaries. Derives one independent set of mechanisms per candidate slot from its assigned papers, so each candidate starts from a genuinely different mathematical hypothesis. Mechanisms are expressed in SymPy syntax (e.g. `softmax(Q_t @ K_t.T / sqrt(d)) @ V_t`) and validated against the SymPy library to ensure they are real mathematics, not hallucinations. When the Critic flags low novelty in a previous generation, those directions are injected here and steered away from in the next round.\n\n**3. Architect** — Takes the validated mechanisms and proposes architecture mutations against base domain templates (CNNs, Transformers, LSTMs, GANs, GNNs, etc.). It knows which mutation combinations have already failed in previous generations and is explicitly instructed to avoid repeating them. Domain-specific skill files provide additional guidance: known-good mutation combinations, known dead ends, and common failure patterns for each of the nine supported domains.\n\n**4. Coder** — In the first generation, generates a complete, self-contained TensorFlow/Keras training script for each proposed architecture, embedding the derived mathematical mechanisms as actual custom `tf.keras.layers.Layer` subclasses. In subsequent generations, uses an agentic code editor to make surgical improvements to the previous winner's code rather than regenerating from scratch — the editor reads the existing code, identifies what to fundamentally change, and applies targeted edits. If a generated script does not implement the required custom layers, a targeted retry forces the mechanism to be implemented correctly before safety validation.\n\n**5. Trainer** — Runs each generated script in an isolated subprocess. Captures training metrics, hardware usage, parameter counts, and training time. Automatically diagnoses and retries on recoverable failures (syntax errors, import issues, dimension mismatches).\n\n**6. Evaluator** — Loads the trained checkpoint and evaluates it on held-out synthetic test data appropriate for the domain. Returns domain-specific metrics: accuracy for classification, MSE for regression and forecasting, reconstruction loss for generative models, node accuracy for graphs. Applies per-domain random-chance thresholds to detect models that did not learn — these are flagged as `training_failed` rather than passed forward as evaluated results.\n\n**7. Validator** — Checks each architecture against real-data performance when enabled. Computes a generalisation score from the ratio of real-data loss to synthetic-data loss and flags overfitting using domain-specific thresholds (stricter for vision and tabular domains, more permissive for timeseries and generative domains where train/real gaps are expected).\n\n**8. Critic** — Scores every candidate on four axes: **Novelty** (embedding distance from all previously archived candidates in a running FAISS index), **Efficiency** (parameter count and inference speed relative to performance), **Soundness** (rated by an LLM judge against a five-criterion architectural rubric), **Generalization** (real-data gap from the Validator). Decides which candidates are worth recursing on in the next generation. After scoring, it programmatically analyses which candidates scored low on novelty, identifies which mutation operators were overexplored, and writes a novelty feedback report into the pipeline context — consumed by the Mathematician and Architect in the next generation to steer exploration toward genuinely new territory.\n\n### How Generations Work\n\nAfter each generation, the top-scoring candidates seed the next one — the Architect prioritises their base templates and the Mathematician derives new mechanisms to push them further. Candidates that scored poorly are recorded as **failure patterns** (name, mutations tried, score, reason) and passed forward so the Architect never repeats the same dead ends.\n\nIf a generation produces no candidates worth recursing on, the session does not start from scratch. Instead it seeds the next generation from the best candidate found so far — even if it scored poorly — so the Architect continues building on that structural direction rather than exploring blind. The Researcher fetches fresh papers and the Mathematician derives new mechanisms, giving the architecture a new mathematical angle without losing the progress already made.\n\nAfter three consecutive generations without a strong candidate, the session pauses and asks you whether to keep going or stop. If you continue, the failure counter resets and exploration resumes with the same best-so-far seed. If you stop, the session closes and you keep whatever was found. You control both the number of candidates per generation and the maximum number of generations, either via slider (up to 20) or by typing any number directly.\n\n### Agent Skills\n\nEach agent in the pipeline is guided by hand-authored skill files — structured Markdown documents that encode domain expertise the agents would otherwise need to rediscover on every run.\n\nSkill files follow Anthropic's open Agent Skills standard: a YAML frontmatter block advertising the skill's name, agent, and applicable domains, followed by a Markdown body containing procedural guidance — not a description of what the agent does, but concrete instructions for *how to do it well* in each domain. Skill bodies are injected into agent system prompts at runtime so every LLM call in a generation has access to the relevant expertise.\n\nThe skill library currently covers:\n\n- **Architect** — nine domain skills (vision, language, timeseries, graph, audio, tabular, generative, recommendation, multimodal), each containing known-good mutation combinations, dead ends to avoid, and common failure patterns for that domain\n- **Researcher** — nine domain skills with high-value arXiv query angles and paper selection criteria that target novel architecture papers with extractable mechanisms, avoiding generic benchmarking papers\n- **Coder** — nine domain skills with correct Keras/TF implementation patterns, synthetic data generation recipes, and common implementation errors flagged per domain\n- **Mathematician** — a skill on novel mechanism derivation: a three-step process for identifying genuinely new mathematics (Tier 1) vs renamed standard operations (Tier 3, which are rejected), with SymPy expression standards and novelty feedback integration instructions\n- **Critic** — a scoring skill containing a five-criterion soundness rubric used by the LLM judge, plus novelty score interpretation guidance\n- **Validator** — a soundness skill with per-domain overfitting thresholds that calibrate the generalisation gap detector for each domain's expected train/real distribution shift\n- **Evaluator** — a metrics skill with per-domain random-chance baselines used to flag models that trained but did not learn\n\nSkills accumulate institutional knowledge across sessions without modifying any code. Adding a new skill file immediately improves agent behaviour in the relevant domain on the next run.\n\n### Research Lineage\n\nEvery candidate card shows its full research lineage: which papers informed the design, what mathematical mechanisms were derived from them (including their SymPy expressions), and the rationale for why those specific mutations were proposed. This is not post-hoc explanation — the papers and mechanisms are the actual inputs to the code generator.\n\n### What You See\n\nA live feed of agent activity as each generation runs. When it completes, a ranked leaderboard of discovered architectures with score breakdowns, training metrics, and research lineage. Every architecture is downloadable as a production training script.\n\nThis is architecture search that used to require a dedicated research team and months of ablation studies. Now it runs overnight on your own hardware.\n\n---\n\n## What You Can Solve\n\n**Prediction from data** — If you have a spreadsheet and a question — who will churn, what will sell, which patient is at risk, when will the part fail — upload it, describe what you want to know, and get a working model. No ML background needed.\n\n**Forecasting over time** — If your data has a time dimension and you need to see what comes next, the platform handles the complexity of temporal modelling correctly. No data leakage. No manual windowing. Just describe the goal.\n\n**Decision-making and control** — Describe a problem where something needs to learn to act — a trading strategy, a controller, an agent that optimises a process — and receive a complete environment and training loop built around it.\n\n**Vision and video** — Describe what you need to see or detect. The platform asks the right questions, understands your constraints, and builds the architecture to match. No dataset upload required — just a clear description of the problem.\n\n**Language and understanding** — From text classification to attention-based architectures for complex language tasks, built on current research rather than dated templates.\n\n**Generation** — If the goal is to create rather than predict — synthetic data, novel images, learned representations — the platform builds the right generative architecture for it.\n\n---\n\n## Real-World Use Cases\n\n**Early warning in a hospital ward.** Nurses document vitals and lab results every shift. Nobody has time to read all of it. Upload the EHR export, describe what deterioration looks like in your cohort, and get a model that flags the patients most likely to crash overnight — built on the sepsis prediction literature, trained on your data, not some generic benchmark.\n\n**Predictive maintenance without the ML team.** Three years of vibration and temperature sensor logs from a production line. The failures are in there — they always were. Describe what a failure event looks like and the platform finds the temporal patterns that precede it, handles the lag windows correctly, and hands back something the maintenance team can actually use.\n\n**Credit risk that doesn't stop at logistic regression.** There's always more signal in the data than a linear model can reach. Upload the application features, describe what default looks like, and get a deep tabular model trained on current research — with a full methodology writeup that explains every decision, ready to go in front of a risk committee.\n\n**Climate forecasting on a small team's budget.** Thirty years of regional precipitation readings and a multi-step forecasting question that keeps getting pushed back because nobody has time to implement it properly. Describe the horizon and the spatial structure. The platform reads the literature, picks the right architecture, handles the windowing, and trains. What was sitting in a backlog for two years gets done in an afternoon.\n\n**Gene expression classification with 20,000 features and 400 samples.** Most tools don't handle this well — they ignore the dimensionality problem or the class imbalance or both. Describe the tissue classes and the known imbalance. The platform finds the papers that specifically address this setup and builds accordingly.\n\n**Recommendations that don't collapse on new users.** No interaction history, no embeddings, nothing to work from. Cold start is a solved problem in the research literature but a hard one to implement from scratch. Describe the constraint, describe the content, and get an architecture built around it rather than one that just pretends the problem doesn't exist.\n\n**Finding a better execution policy without a six-week ablation study.** You have a working approach but suspect there's something better. Set a research goal in Research Labs, point it at the RL domain, and let it run. Eight agents generate candidates, train them, score them on novelty and efficiency, and recurse on the top performers. By morning there's a ranked leaderboard. The answer to \"is there something better?\" used to require a dedicated research sprint. Now it runs while you sleep.\n\n---\n\n## GPU Acceleration\n\nResearch Labs runs on CPU by default. This is fine for exploring how the system works, but CPU training produces weak metrics — which means lower scores, less recursion, and a leaderboard that reflects infrastructure limits more than architecture quality. For real research runs, attach a GPU.\n\nThree options are supported. Set the relevant variables in your `.env` file.\n\n---\n\n### Option 1 — Local GPU (NVIDIA)\n\nIf your machine has an NVIDIA GPU and [nvidia-container-toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html) installed:\n\n**`.env`**\n```env\nTRAINING_DOCKER_IMAGE=obsidian-trainer:latest\nRESEARCH_ARTIFACTS_DIR=/research_artifacts\n```\n\n**`docker-compose.yml`** — add this to the `research-worker` service:\n```yaml\nresearch-worker:\n  deploy:\n    resources:\n      reservations:\n        devices:\n          - driver: nvidia\n            count: all\n            capabilities: [gpu]\n```\n\nThen rebuild:\n```bash\ndocker compose up --build\n```\n\n---\n\n### Option 2 — RunPod (Serverless Cloud GPU)\n\n[RunPod](https://www.runpod.io) lets you run GPU jobs on demand and pay only for what you use. No idle cost between research sessions.\n\n1. Create an account at [runpod.io](https://www.runpod.io)\n2. Deploy a serverless endpoint using the Obsidian worker image\n3. Copy your API key from **Settings → API Keys** and your endpoint ID from the serverless dashboard\n\n**`.env`**\n```env\nRUNPOD_API_KEY=your_runpod_api_key\nRUNPOD_ENDPOINT_ID=your_endpoint_id\n```\n\nNo changes to `docker-compose.yml` needed.\n\n---\n\n### Option 3 — Lambda Labs (On-Demand Cloud GPU)\n\n[Lambda Labs](https://lambdalabs.com) offers on-demand GPU instances at competitive rates.\n\n1. Create an account at [lambdalabs.com](https://lambdalabs.com)\n2. Generate an API key from **API Keys** in your dashboard\n\n**`.env`**\n```env\nLAMBDA_API_KEY=your_lambda_api_key\n```\n\nNo changes to `docker-compose.yml` needed.\n\n---\n\n### Priority Order\n\nWhen a research session starts, the platform picks the first available provider in this order:\n\n```\nLocal Docker GPU → RunPod → Lambda Labs → CPU fallback\n```\n\nCPU fallback always runs — it just produces limited training results. If you have cloud credentials set, they will be used automatically when a local GPU is not available.\n\n---\n\n## It Fixes Its Own Mistakes\n\nCode fails sometimes. That is not a problem here. When something does not compile or run correctly, the platform diagnoses what went wrong, rewrites what it needs to, and tries again — on its own, without you having to do anything. You will see it happen in the chat. By the time you look back, it has usually already fixed it.\n\n---\n\n## Choosing an AI Provider\n\nThe platform works with Anthropic (Claude), OpenAI (GPT-4o), or any local model via LM Studio. From testing, Claude gives the best results — it reads more thoroughly, reasons more carefully, and produces cleaner output with less fixing needed. GPT-4o is a solid second. Local models work well at larger sizes; smaller ones occasionally skip research steps or need a retry.\n\nIf privacy matters most and you want everything running locally with no API costs, use LM Studio with the largest model your hardware supports. If you want the best output with minimal friction, use Claude.\n\n---\n\n## Quick Start\n\n### What you need\n\n| Tool | Purpose |\n|------|---------|\n| [Docker Desktop](https://www.docker.com/products/docker-desktop/) | Runs the entire platform in containers |\n| [Git](https://git-scm.com/downloads) | To clone the repository |\n| An LLM API key | Anthropic, OpenAI, or a local LM Studio server |\n\nDocker Desktop includes everything needed on Windows and macOS. On Linux, install Docker Engine and Docker Compose separately.\n\n### Step 1 — Clone and configure\n\n```bash\ngit clone https://github.com/sup3rus3r/obsidian-networks.git\ncd obsidian-networks\n\ncp .env.example .env\n```\n\nOpen `.env` in any text editor and fill in two things:\n- `AUTH_SECRET` — a random string used to secure sessions. Generate one by running: `openssl rand -base64 32`\n- Your API key — `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, or `LMSTUDIO_BASE_URL` depending on which provider you're using\n\n### Step 2 — Start the platform\n\n```bash\ndocker compose up --build\n```\n\nOpen [http://localhost:3000](http://localhost:3000) in your browser.\n\n### Local Development (without Docker)\n\nIf you prefer to run the stack directly on your machine — requires Linux or WSL2, Python 3.11+, Node.js 18+, and Redis installed locally:\n\n```bash\ngit clone https://github.com/sup3rus3r/obsidian-networks.git\ncd obsidian-networks\n\ncd backend \u0026\u0026 pip install uv \u0026\u0026 uv sync \u0026\u0026 cd ..\ncd frontend \u0026\u0026 npm install \u0026\u0026 cd ..\n\ncp .env.example .env\nnpm run dev\n```\n\nThis starts everything in one terminal with colour-coded output. Open [http://localhost:3000](http://localhost:3000).\n\n---\n\n## Environment Variables\n\nAll configuration lives in the `.env` file at the repo root.\n\n| Variable | Default | What it does |\n|----------|---------|--------------|\n| `AUTH_SECRET` | — | **Required.** Secures session cookies. Generate with `openssl rand -base64 32` |\n| `AI_PROVIDER` | `anthropic` | Which AI to use: `anthropic`, `openai`, or `lmstudio` |\n| `AI_MODEL` | provider default | Override the specific model, e.g. `claude-sonnet-4-6` or `gpt-4o` |\n| `ANTHROPIC_API_KEY` | — | Required when using Anthropic |\n| `OPENAI_API_KEY` | — | Required when using OpenAI |\n| `LMSTUDIO_BASE_URL` | `http://localhost:1234/v1` | Required when using LM Studio |\n| `SESSION_TTL_HOURS` | `4` | How long before uploaded files and session data are automatically deleted |\n| `MAX_FILE_SIZE_MB` | `500` | Maximum size of dataset uploads |\n| `MAX_TRAINING_MINUTES` | `10` | How long a training job is allowed to run before being stopped |\n| `MAX_MEMORY_GB` | `12` | Maximum memory the training worker can use |\n| `MAX_EPOCHS` | `200` | Maximum number of training epochs any generated script can run |\n| `NEXT_PUBLIC_UPLOAD_URL` | `http://localhost:8000` | The backend URL used for large file uploads. Change this to your server's public address when deploying |\n| `TRAINING_DOCKER_IMAGE` | — | Local GPU: the Docker image used for training jobs (requires nvidia-container-toolkit) |\n| `RESEARCH_ARTIFACTS_DIR` | `/research_artifacts` | Where training checkpoints and outputs are stored |\n| `RUNPOD_API_KEY` | — | RunPod serverless GPU: API key from your RunPod dashboard |\n| `RUNPOD_ENDPOINT_ID` | — | RunPod serverless GPU: endpoint ID from your RunPod serverless console |\n| `LAMBDA_API_KEY` | — | Lambda Labs GPU: API key from your Lambda dashboard |\n| `GPU_POLL_INTERVAL_S` | `15` | How often (in seconds) to check on remote GPU job status |\n\n---\n\n## Sample Datasets\n\nTwo datasets are included so you can try the platform immediately after setup.\n\n**`heart_failure_dataset.csv`** — 918 patients with 11 clinical features including age, chest pain type, blood pressure, cholesterol, and ECG results. The goal is to predict whether a patient has heart disease.\n\nTry: *\"Build a binary classifier to predict heart disease. Use a deep neural network with dropout regularisation.\"*\n\n**`energy_consumption_sample.csv`** — Hourly energy consumption readings over time. The goal is to forecast future consumption.\n\nTry: *\"Forecast energy consumption for the next 24 hours using an LSTM.\"*\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|------------|\n| Frontend | Next.js 16, React 19, TypeScript, Tailwind CSS 4 |\n| AI / Streaming | Vercel AI SDK 6, Anthropic / OpenAI / LM Studio |\n| Backend API | FastAPI, Python 3.11 |\n| Task Queue | Celery 5, Redis 7 |\n| ML Runtime | TensorFlow 2.18+, Keras 3, NumPy 2.x, Pandas, scikit-learn, Gymnasium |\n| Research | FAISS vector store, sentence-transformers, pypdf, arXiv API, Context7 |\n| Research Labs | 8-agent autonomous loop, MongoDB, FAISS novelty index, agent skill files |\n| Deployment | Docker, Docker Compose |\n\n---\n\n## Security\n\nGenerated scripts are checked for dangerous code before they ever run. Imports are restricted to a safe allowlist of known ML libraries. Calls to system commands, file execution, and anything that could affect your machine outside the sandbox are blocked.\n\nTraining runs happen inside an isolated subprocess with a hard time limit, a memory cap, and a file size limit. The worker container runs with additional Docker-level restrictions — blocked system calls, dropped Linux capabilities, and process limits — to prevent any generated code from escaping its sandbox.\n\nYour uploaded files are stored in a private per-session directory that no other session can access, and everything is automatically deleted after the session expires.\n\n---\n\n## Contributing\n\nContributions are welcome — bug reports, feature requests, documentation improvements, and pull requests alike. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before submitting.\n\n---\n\n## License\n\nObsidian Networks is released under the [GNU Affero General Public License v3.0](LICENSE).\n\nYou are free to run, modify, and distribute this software. If you deploy a modified version as a network service, the AGPL requires you to make your modified source code available to users under the same terms.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\nMade with care by [Mohammed Khan](https://github.com/sup3rus3r)\n\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsup3rus3r%2Fobsidian-networks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsup3rus3r%2Fobsidian-networks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsup3rus3r%2Fobsidian-networks/lists"}