Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證AI-powered tender intelligence for Canadian contractors — opportunity recommendations, citation-verified compliance, and bid risk simulation.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Citation-verified compliance intelligence for Canadian public tenders.
Under Canada's Contract A framework, one missed mandatory clause voids an otherwise winning bid. Estimators read 34–93-page tender packages under deadline pressure, and the clauses that disqualify them are often buried deep — page 75 of a 93-page RFT. TenderSentry extracts every mandatory requirement, proves each one with a verbatim quote and true page number, and tells a contractor whether they can even submit.
Every displayed requirement carries a verbatim quote and a true page number, verified by exact-substring match against the source PDF. If the model's quote can't be found on the cited page, the requirement is repaired or dropped — never shown. No hallucinated compliance advice, ever.
flowchart LR
A[Tender PDF] --> B[Page-tagged<br/>provenance store]
B --> C[Map-reduce extraction<br/>GPT-4o, temperature 0]
C --> D{Hallucination guard<br/>exact-substring check}
D -->|quote verified| E[Phase classifier]
D -->|not found| X[Dropped<br/>never displayed]
E --> F[Qualification engine<br/>rules + LLM judge]
F --> G[Bid board<br/>quote + page on every card]
The entire codebase was built through Codex working against written specs across the Build Week window. That spec-first workflow produced the extraction pipeline, hallucination guard, phase classifier, qualification engine, Streamlit UI, and accompanying test suite.
The configured OpenAI model is gpt-4o. It is used for map-reduce requirement extraction, phase classification, and the fuzzy qualification judge. All three call sites use temperature 0 and JSON-object response mode. Extracted requirements then pass through the hallucination guard: each verbatim quote is normalized and checked against its cited source page, cross-page repair is attempted when necessary, and any quote that still cannot be verified is dropped before classification, qualification, or display.
| Tender | Pages | Extracted | Verified | Dropped by guard | Verdict |
|---|---|---|---|---|---|
| Federal crane rental RFSO | 55 | 98 | 92 | 6 | No bid (fax submission required) |
| Muskoka Lakes T-2026-31 | 34 | 33 | 31 | 2 | No bid (physical delivery required) |
| Augusta PW-2026-04 | 65 | 88 | 87 | 1 | No bid (physical delivery to clerk's office) |
| Kincardine CS-2025-01 | 93 | 79 | 76 | 3 | Review (33 items for human judgment) |
12 fabricated or unverifiable requirements were caught and dropped by the guard before any human saw them.
Buried clauses it surfaced, with citations:
pip install -r requirements.txt
cp .env.example .env # add your OPENAI_API_KEY
python3 -m extract.pipeline <tender_id> --force # extraction + verification
python3 -m match.engine <tender_id> --force # qualification
streamlit run ui/app.py
Tender PDFs live in data/tenders/<tender_id>/raw/. The firm profile is data/profile.json.
data/ is committed, and what regeneratesCommitted, because something downstream reads it and could not rebuild it:
| Path | Why it is in git |
|---|---|
data/tendersentry-slim.db | The daily refresh runs against it. A projection of the full database, rebuilt by scripts/build_slim_db.py after every retrain, and stamped with the source it came from. |
data/statcan/bcpi-*.json | The 4 KB price-index slice the scale estimator deflates with. |
model/artifacts/scale-estimator.* | The fitted estimators. Published band figures are unreproducible without them. |
web/data/** | The serving artifacts the site imports statically. |
Gitignored, because each is a cache or a working file that regenerates on demand:
data/tendersentry.db (the full database), data/seao/ (downloaded weekly OCDS
files), data/model_cache/ (sentence-transformer vectors), data/statcan/*.csv,
data/rankings/, data/census/.
data/open_tender_notices.csv was tracked and is now gitignored.
docs/STATE-20260830.md §10 left this open as UNVERIFIED; it is answered. Nothing
reads it as data. Both references — ingest/canadabuys.py:334 and
notices/canadabuys.py:130 — pass it to fetch_notices_csv as a download
destination, and that function re-downloads whenever the file on disk is older than
24 hours (ingest/canadabuys.py:42). It is a download cache, exactly like
data/seao/. Keeping it tracked was actively harmful: the daily workflow stages only
web/data and the slim database, so the committed copy would have frozen at its
2026-07-29 state while the database it fed moved on — 6 MB in git disagreeing with
everything derived from it. Regenerate with
python3 -m notices.ingest --source canadabuys.
bonding_capacity in <region>) is downgraded to fuzzy judgment with a logged warning.Built solo during OpenAI Build Week, July 2026.