mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-09-10 04:00:35 +00:00
* fix(parse): stop infinite recursion in default method dispatch
parse_document and its five sibling dispatchers (parse_web_content,
parse_structured_data, parse_email, parse_code, parse_media) were
registered in the method registry under their own task's "default"
name. Every dispatcher begins with method_registry.get(<task>, method),
so calling e.g. parse_document(file, method="default") found itself in
the registry and re-entered infinitely until RecursionError --
`semantica parse <any file>` crashed before any parsing ran.
Drop the six self-registrations. "default" remains the built-in code
path; users can still register their own "default" (or any other name)
to override it, and the existing "docling" registration is unaffected.
Verified: `semantica parse demo.pdf` now parses successfully (was
RecursionError). No repo code or tests consume
get_parse_method("document", "default"), so removing the entries
changes no behavior besides fixing the crash.
Co-Authored-By: Claude Code <noreply@anthropic.com>
* fix(deps): make resolution satisfiable on Python 3.9 and add parse-pdf extra
Dependency fixes so `uv lock` / `pip install semantica[all]` resolves
across the supported matrix (3.9-3.12):
- requires-python >=3.8 was unsatisfiable (numpy>=2.0.2 needs >=3.9) and
3.9.0/3.9.1 can never resolve (every cryptography release excludes
them) -> bump to >=3.9.2 and drop the 3.8 classifier.
- Split recently-raised floors that dropped 3.9 into marker pairs
(3.9-capped / 3.10-unconstrained), following the pattern already used
for scikit-learn/requests/etc.: pyarrow extras (>=24 needs 3.10),
pre-commit 4.6, snowflake-connector 4.6, fastapi 0.129 + starlette 0.53
(older fastapi caps starlette<0.53).
- Gate docling, litellm (its only 3.9 release pins
python-dotenv==1.0.1, conflicting with the >=1.2.1 core floor), and
crewai (no un-yanked 3.9 release) to >=3.10.
Also add a parse-pdf extra: the default PDFParser requires pdfplumber,
but no extra installed it, so `semantica parse file.pdf` failed on a
default install. Follows the parse-docling convention.
Co-Authored-By: Claude Code <noreply@anthropic.com>
* fix(vector-store): make the qdrant backend usable through VectorStore
The qdrant backend could not be used at all through the VectorStore
facade in 0.6.8 - every path raised:
1. store_vectors() only dispatched to backend add/add_vectors methods;
QdrantStore exposes insert_vectors, so vs.store() raised
NotImplementedError. Add an insert_vectors branch (uuid-generated
ids, metadata -> payloads).
2. QdrantStore required an explicit create_collection() before any read
or write, unlike FAISSStore's automatic index creation. Lazily attach
the configured collection (config key "collection", default
"semantica_default") on first insert/search, reusing an existing one.
3. search_points() called client.search(), removed from qdrant-client in
favor of query_points() - use it when available, fall back otherwise.
4. store() silently dropped plain-string documents (it only extracted
doc.metadata), so payloads lost the source text; keep them under
payload "document".
Verified end-to-end against a Qdrant 5 server (docker): embed ->
store -> semantic search returns correctly ranked results whose payloads
carry the original documents.
Co-Authored-By: Claude Code <noreply@anthropic.com>
* fix(vector-store): address Qodo review findings on the qdrant write path
Four findings from the Qodo review of #1508:
1. store_vectors() returned QdrantStore.insert_vectors()' upsert status
dict although the facade promises the stored vector IDs (decision
storage indexes the result at position 0). Return the generated or
caller-supplied IDs after a successful insert instead.
2. insert_vectors() pairs points with zip(vectors, ids), so a shorter
non-empty id list silently dropped the unpaired vectors while the
completion message still reported the full batch as inserted. Reject
the mismatch with ValidationError before any write.
3. _ensure_default_collection() looked up the legacy "collection" config
key, so the documented collection_name=... option was ignored and
lazy init always fell back to semantica_default. Prefer
collection_name, keep "collection" as an alias.
4. The new parse-pdf extra was missing from both aggregate "all"
bundles, so semantica[all] still shipped without pdfplumber and the
default PDFParser raised ProcessingError on first use.
Also removes the now-stale strict xfail for qdrant's write dispatch in
test_backend_facade_contract.py — that marker exists precisely to fail
once the wiring lands.
Co-Authored-By: Claude Code <noreply@anthropic.com>
* test(vector-store): migrate qdrant mocks to the query_points API
The qdrant search path now prefers client.query_points() (qdrant-client
removed client.search), but these tests still mocked the legacy call.
A MagicMock exposes query_points too, so the code took the modern path,
read .points off an unconfigured mock, and all three tests failed on
the branch. Return the hits in response.points as the real client does.
Co-Authored-By: Claude Code <noreply@anthropic.com>
* fix(ci): regenerate requirements-ci.txt for the parse-pdf extra
The CI lockfile check re-resolves pyproject.toml --extra all and diffs
the pinned versions against requirements-ci.txt. The parse-pdf extra
added pdfplumber (+pdfminer-six) to the 'all' bundle without refreshing
the lockfile, so the diff failed and the build job exited 1.
Regenerated with the command from the file header. Only the two new
pins and their 'via' comments changed - every other version is
identical. Verified locally with the CI's own check command (diff of
pkg==ver lines exits clean).
Co-Authored-By: Claude Code <noreply@anthropic.com>
* fix(tests): update stale default-method-registration assertion
test_parse_methods_dynamic_default_resolution asserted that "default"
resolves through the registry to parse_document, which was true only
because of the self-registration this PR removes (it's what caused the
infinite recursion in the first place). Update the assertion to match
the intended post-fix state: "default" is not registered at all, and
falls through to the built-in dispatch path unconditionally.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
---------
Co-authored-by: yanyu <yanyu@polixir.com>
Co-authored-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Mohd Kaif <98801504+KaifAhmad1@users.noreply.github.com>
Co-authored-by: KaifAhmad1 <kaifahmad087@gmail.com>
366 lines
13 KiB
TOML
366 lines
13 KiB
TOML
[build-system]
|
|
requires = ["setuptools==84.0.0", "wheel==0.48.0"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "semantica"
|
|
version = "0.7.0"
|
|
description = "Graph-Native Infrastructure for Context and Accountable AI Systems: context graphs, decision intelligence, full provenance tracking, and explainable reasoning engines — every AI decision traceable, every output auditable."
|
|
readme = "README.md"
|
|
license = { text = "MIT" }
|
|
|
|
authors = [{ name = "Semantica", email = "kaif@getsemantica.ai" }]
|
|
maintainers = [{ name = "Semantica", email = "kaif@getsemantica.ai" }]
|
|
|
|
# 3.8 is already unsatisfiable in practice (numpy>=2.0.2 requires >=3.9) and is
|
|
# not exercised by the Install Matrix (3.9-3.12). The floor is 3.9.2 rather
|
|
# than 3.9.0 because cryptography (db-snowflake) excludes 3.9.0/3.9.1 from
|
|
# every release's requires-python, so those patch levels can never resolve.
|
|
requires-python = ">=3.9.2"
|
|
|
|
classifiers = [
|
|
"Development Status :: 5 - Production/Stable",
|
|
"Intended Audience :: Developers",
|
|
"Intended Audience :: Science/Research",
|
|
"Intended Audience :: Information Technology",
|
|
"License :: OSI Approved :: MIT License",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3.9",
|
|
"Programming Language :: Python :: 3.10",
|
|
"Programming Language :: Python :: 3.11",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
"Topic :: Scientific/Engineering :: Information Analysis",
|
|
"Topic :: Text Processing :: Linguistic",
|
|
"Topic :: Database :: Database Engines/Servers",
|
|
"Topic :: Software Development :: Libraries :: Python Modules"
|
|
]
|
|
|
|
keywords = [
|
|
"knowledge-graph", "context-graph", "ai-agents", "llm", "decision-intelligence",
|
|
"provenance", "explainability", "reasoning-engine", "entity-extraction",
|
|
"relation-extraction", "graph-rag", "knowledge-intelligence", "semantic-layer",
|
|
"nlp", "embeddings", "ontology", "rdf", "triplet-extraction", "agentic-ai",
|
|
"knowledge-base", "entity-resolution", "w3c-prov", "audit-trail"
|
|
]
|
|
|
|
# ---------------- CORE DEPENDENCIES (SAFE DEFAULT) ----------------
|
|
dependencies = [
|
|
"numpy>=2.0.2",
|
|
"pandas>=1.3.0",
|
|
"scipy>=1.13.1",
|
|
# scikit-learn dropped Python 3.9 support at 1.7.0 (requires_python >=3.10),
|
|
# so an unqualified >=1.7.2 floor is unsatisfiable on 3.9. Cap 3.9 to the
|
|
# last 3.9-compatible release line; 3.10+ is left unconstrained.
|
|
"scikit-learn>=1.6.1,<1.7.0; python_version < '3.10'",
|
|
"scikit-learn>=1.7.2; python_version >= '3.10'",
|
|
"rdflib>=6.2.0",
|
|
"networkx>=2.8.0",
|
|
# requests dropped Python 3.9 support at 2.33.0 (requires_python >=3.10),
|
|
# so an unqualified >=2.34.2 floor is unsatisfiable on 3.9. Cap 3.9 to the
|
|
# last 3.9-compatible release; 3.10+ is left unconstrained.
|
|
"requests>=2.32.5,<2.33.0; python_version < '3.10'",
|
|
"requests>=2.34.2; python_version >= '3.10'",
|
|
# chardet dropped Python 3.9 support at 6.0.0 (requires_python >=3.10), so
|
|
# an unqualified >=7.4.3 floor is unsatisfiable on 3.9. Cap 3.9 to the last
|
|
# 3.9-compatible release; 3.10+ is left unconstrained.
|
|
"chardet>=5.2.0,<6.0.0; python_version < '3.10'",
|
|
"chardet>=7.4.3; python_version >= '3.10'",
|
|
"protobuf>=5.29.1,<8.0",
|
|
# grpcio dropped Python 3.9 support at 1.81.0 (requires_python >=3.10), so
|
|
# an unqualified >=1.81.1 floor is unsatisfiable on 3.9. Cap 3.9 to the last
|
|
# 3.9-compatible release; 3.10+ is left unconstrained.
|
|
"grpcio>=1.80.0,<1.81.0; python_version < '3.10'",
|
|
"grpcio>=1.81.1; python_version >= '3.10'",
|
|
# pillow dropped Python 3.9 support at 12.0.0 (requires_python >=3.10), so
|
|
# an unqualified >=12.2.0 floor is unsatisfiable on 3.9. Cap 3.9 to the last
|
|
# 3.9-compatible release; 3.10+ is left unconstrained.
|
|
"pillow>=11.3.0,<12.0.0; python_version < '3.10'",
|
|
"pillow>=12.2.0; python_version >= '3.10'",
|
|
"pydantic>=2.13.4",
|
|
# click dropped Python 3.9 support at 8.2.0 (requires_python >=3.10), so an
|
|
# unqualified >=8.4.2 floor is unsatisfiable on 3.9. Cap 3.9 to the last
|
|
# 3.9-compatible release; 3.10+ is left unconstrained.
|
|
"click>=8.1.8,<8.2.0; python_version < '3.10'",
|
|
"click>=8.4.2; python_version >= '3.10'",
|
|
"rich>=12.5.0",
|
|
"tqdm>=4.68.3",
|
|
"pyyaml>=6.0",
|
|
"toml>=0.10.0",
|
|
"python-dotenv>=1.2.1",
|
|
"loguru>=0.7.3",
|
|
"structlog>=22.1.0",
|
|
"httpx<0.29.0",
|
|
"pyarrow>=14.0.0"
|
|
]
|
|
|
|
[project.urls]
|
|
Homepage = "https://getsemantica.ai"
|
|
Documentation = "https://docs.getsemantica.ai"
|
|
Repository = "https://github.com/semantica-agi/semantica"
|
|
Changelog = "https://github.com/semantica-agi/semantica/blob/main/CHANGELOG.md"
|
|
"Bug Tracker" = "https://github.com/semantica-agi/semantica/issues"
|
|
Discord = "https://discord.gg/sV34vps5hH"
|
|
|
|
# ---------------- OPTIONAL DEPENDENCIES ----------------
|
|
[project.optional-dependencies]
|
|
|
|
# ---- LLM Providers ----
|
|
llm-openai = ["openai>=1.0.0"]
|
|
llm-groq = ["groq>=0.4.0"]
|
|
llm-gemini = ["google-genai>=0.1.0"]
|
|
llm-anthropic = ["anthropic>=0.122.0"]
|
|
llm-ollama = ["ollama>=0.1.0"]
|
|
llm-deepseek = ["openai>=1.0.0"]
|
|
llm-novita = ["openai>=1.0.0"]
|
|
# litellm>=1.83.10 requires Python>=3.10, and the last 3.9-compatible release
|
|
# (1.83.9) pins python-dotenv==1.0.1, which conflicts with our >=1.2.1 core
|
|
# floor — so no litellm satisfies 3.9 at all. Gate it to 3.10+.
|
|
llm-litellm = ["litellm>=1.83.9; python_version >= '3.10'"]
|
|
llm-instructor = ["instructor>=1.15.3"]
|
|
|
|
llm-all = [
|
|
"semantica[llm-openai,llm-groq,llm-gemini,llm-anthropic,llm-ollama,llm-deepseek,llm-novita,llm-litellm,llm-instructor]"
|
|
]
|
|
|
|
# ---- Document Parsing ----
|
|
documents = [
|
|
"python-docx>=1.2.0",
|
|
"openpyxl>=3.1.5",
|
|
"lxml>=6.1.1",
|
|
"beautifulsoup4>=4.15.0"
|
|
]
|
|
# every docling release requires Python>=3.10 (no 3.9-compatible version
|
|
# exists to cap to), so gate it like google-adk below rather than split it.
|
|
parse-docling = ["docling>=2.107.0; python_version >= '3.10'"]
|
|
# pdfplumber powers the default PDFParser; not pulled in by any other extra.
|
|
parse-pdf = ["pdfplumber>=0.10.0"]
|
|
|
|
# ---- SHACL Validation ----
|
|
shacl = ["pyshacl>=0.25.0"]
|
|
|
|
# ---- Database Connectors ----
|
|
# snowflake-connector-python dropped Python 3.9 support at 4.6.0
|
|
# (requires_python >=3.10), so an unqualified >=4.6.0 floor is unsatisfiable
|
|
# on 3.9. Cap 3.9 below it; 3.10+ keeps the newer floor.
|
|
db-snowflake = [
|
|
"snowflake-connector-python>=4.6.0; python_version >= '3.10'",
|
|
"snowflake-connector-python>=3.13.0,<4.6.0; python_version < '3.10'",
|
|
"cryptography>=49.0.0"
|
|
]
|
|
db-databricks = ["databricks-sdk>=0.60.0", "databricks-sql-connector>=4.0.0"]
|
|
# pyarrow dropped Python 3.9 support at 24.0.0 (requires_python >=3.10), so an
|
|
# unqualified >=24.0.0 floor is unsatisfiable on 3.9. Cap 3.9 below the last
|
|
# 3.9-compatible release line; 3.10+ is left unconstrained.
|
|
db-arrow = [
|
|
"pyarrow>=24.0.0; python_version >= '3.10'",
|
|
"pyarrow>=14.0.0,<24.0.0; python_version < '3.10'"
|
|
]
|
|
db-salesforce = ["simple-salesforce>=1.12.0"]
|
|
ingest-parquet = [
|
|
"pyarrow>=24.0.0; python_version >= '3.10'",
|
|
"pyarrow>=14.0.0,<24.0.0; python_version < '3.10'"
|
|
]
|
|
ingest-arrow = [
|
|
"pyarrow>=24.0.0; python_version >= '3.10'",
|
|
"pyarrow>=14.0.0,<24.0.0; python_version < '3.10'"
|
|
]
|
|
ingest-sap = ["requests>=2.28.0"]
|
|
ingest-git = ["GitPython>=3.1.58"]
|
|
|
|
db-all = [
|
|
"semantica[db-snowflake,db-databricks,db-salesforce,db-arrow]"
|
|
]
|
|
|
|
# ---- Embedding / Models ----
|
|
models-huggingface = [
|
|
"transformers>=4.20.0",
|
|
"torch>=1.13.1"
|
|
]
|
|
embeddings-local = [
|
|
"sentence-transformers>=2.2.0",
|
|
"fastembed>=0.2.0",
|
|
"onnxruntime>=1.19.2,<1.20.0; python_version < '3.10'",
|
|
"onnxruntime>=1.20.1; python_version >= '3.10'",
|
|
"tokenizers>=0.15.0"
|
|
]
|
|
nlp-spacy = [
|
|
"spacy>=3.4.0,<3.8.8; python_version < '3.10'",
|
|
"spacy>=3.4.0; python_version >= '3.10'"
|
|
]
|
|
|
|
# ---- Graph Backends ----
|
|
graph-neo4j = ["neo4j>=5.0.0"]
|
|
graph-falkordb = ["falkordb>=1.0.0", "redis>=4.3.0"]
|
|
graph-amazon-neptune = ["boto3>=1.24.0", "neo4j>=5.0.0"]
|
|
graph-apache-age = ["psycopg2-binary>=2.9.0"]
|
|
graph-embeddings = ["gensim>=4.4.0"]
|
|
|
|
graph-all = [
|
|
"semantica[graph-neo4j,graph-falkordb,graph-amazon-neptune,graph-apache-age,graph-embeddings]"
|
|
]
|
|
|
|
# ---- Triplet Store Backends ----
|
|
tripletstore-oxigraph = ["pyoxigraph>=0.5.0"]
|
|
|
|
# ---- Vector Store Backends ----
|
|
vectorstore-faiss = ["faiss-cpu>=1.7.0"]
|
|
vectorstore-qdrant = ["qdrant-client>=1.10.0"]
|
|
vectorstore-weaviate = ["weaviate-client>=4.0.0"]
|
|
vectorstore-pinecone = ["pinecone>=3.0.0"]
|
|
vectorstore-milvus = ["pymilvus>=2.0.0"]
|
|
vectorstore-pgvector = ["psycopg[binary,pool]>=3.0.0", "pgvector>=0.2.0"]
|
|
vectorstore-sqlite = ["sqlite-vec>=0.1.1"]
|
|
|
|
vectorstore-all = [
|
|
"semantica[vectorstore-qdrant,vectorstore-weaviate,vectorstore-pinecone,vectorstore-milvus,vectorstore-pgvector,vectorstore-sqlite,vectorstore-faiss]"
|
|
]
|
|
|
|
# ---- Infra / Queues / Workers ----
|
|
infra = [
|
|
"redis>=4.3.0",
|
|
"celery>=5.2.0",
|
|
"kafka-python>=3.0.2",
|
|
"pulsar-client>=3.0.0",
|
|
"pika>=1.3.0"
|
|
]
|
|
|
|
# ---- Cloud Providers ----
|
|
cloud = [
|
|
"boto3>=1.24.0",
|
|
"azure-storage-blob>=12.30.0",
|
|
"google-cloud-storage>=2.5.0"
|
|
]
|
|
|
|
# ---- Monitoring (FIXED) ----
|
|
monitoring = [
|
|
"prometheus-client>=0.14.0",
|
|
"opentelemetry-api>=1.30.0,<2.0.0",
|
|
"opentelemetry-sdk>=1.30.0,<2.0.0",
|
|
"opentelemetry-semantic-conventions>=0.58b0,<0.65",
|
|
"opentelemetry-instrumentation>=0.62b1,<0.65"
|
|
]
|
|
|
|
# ---- Visualization ----
|
|
viz = [
|
|
"pyvis>=0.3.0",
|
|
"graphviz>=0.21",
|
|
"d3blocks>=1.0.0",
|
|
"matplotlib>=3.9.4",
|
|
"seaborn>=0.13.2",
|
|
"plotly>=6.8.0",
|
|
"ipywidgets>=8.0.0",
|
|
"umap-learn>=0.5.12"
|
|
]
|
|
|
|
# ---- Media ----
|
|
media = [
|
|
"librosa>=0.9.0",
|
|
"opencv-python>=4.13.0.92"
|
|
]
|
|
|
|
# ---- GPU ----
|
|
gpu = [
|
|
"faiss-gpu>=1.7.0",
|
|
"cupy>=10.0.0"
|
|
]
|
|
|
|
# ---- Agentic Framework Integrations ----
|
|
agno = ["agno>=1.0.0"]
|
|
# crewai core provides BaseTool and BaseKnowledgeSource; crewai-tools is not
|
|
# needed (it pulls vulnerable transitive deps like chromadb) and would only
|
|
# duplicate the prebuilt tooling users can install separately.
|
|
# No un-yanked crewai release supports Python 3.9 (all require >=3.10), so
|
|
# gate the extra to 3.10+.
|
|
crewai = ["crewai>=0.80.0; python_version >= '3.10'"]
|
|
langchain = ["langchain-core>=0.3.0"]
|
|
google-adk = ["google-adk>=1.27.0; python_version >= '3.10'"]
|
|
|
|
# ---- File Watching ----
|
|
watch = ["watchdog>=6.0.0"]
|
|
|
|
# ---- Splitting / Chunking ----
|
|
split-tiktoken = ["tiktoken>=0.5.0"]
|
|
split-community = ["python-louvain>=0.16"]
|
|
split-topic = ["bertopic>=0.15.0", "gensim>=4.4.0"]
|
|
|
|
split-all = [
|
|
"semantica[split-tiktoken,split-community,split-topic]"
|
|
]
|
|
|
|
# ---- Dev ----
|
|
dev = [
|
|
"pytest>=7.1.0",
|
|
"pytest-cov>=7.1.0",
|
|
"pytest-asyncio>=0.19.0",
|
|
"black>=22.6.0",
|
|
"isort>=6.1.0",
|
|
"flake8>=4.0.0",
|
|
"mypy>=0.971",
|
|
# pre-commit dropped Python 3.9 support at 4.6.0 (requires_python >=3.10).
|
|
# Cap 3.9 below it; 3.10+ keeps the >=4.6.0 floor.
|
|
"pre-commit>=4.0.0,<4.6.0; python_version < '3.10'",
|
|
"pre-commit>=4.6.0; python_version >= '3.10'",
|
|
"jupyter>=1.0.0",
|
|
"ipykernel>=6.15.0"
|
|
]
|
|
|
|
# Explorer Dashboard
|
|
# fastapi dropped Python 3.9 support at 0.129.0 (requires_python >=3.10), and
|
|
# every fastapi below that caps starlette<0.53.0 — so the 3.10+ starlette
|
|
# floor is unsatisfiable on 3.9. Cap both on 3.9; 3.10+ keeps the newer floors.
|
|
explorer = [
|
|
"fastapi>=0.109.2,<0.129.0; python_version < '3.10'",
|
|
"fastapi>=0.109.2; python_version >= '3.10'",
|
|
"starlette>=0.36.3,<0.53.0; python_version < '3.10'",
|
|
"starlette>=0.53.0; python_version >= '3.10'",
|
|
"uvicorn[standard]>=0.22.0",
|
|
"websockets>=15.0.1",
|
|
"python-multipart>=0.0.7",
|
|
"defusedxml>=0.7.1"
|
|
]
|
|
explorer-lite = [
|
|
"streamlit>=1.25.0",
|
|
"streamlit-agraph>=0.0.45"
|
|
]
|
|
|
|
# Everything (cross-platform — gpu excluded; install semantica[gpu] separately on Linux)
|
|
# NOTE: the ``crewai`` extra is intentionally NOT in ``all``: crewai hard-requires
|
|
# ``chromadb~=1.1.0``, which carries a pre-authentication code-injection advisory
|
|
# (CVE-2026-45829) with no fixed release — including it here would fail the CI
|
|
# dependency-audit/security gates. Install it explicitly via ``semantica[crewai]``.
|
|
all = [
|
|
"semantica[dev,viz,media,infra,cloud,monitoring,watch,llm-all,models-huggingface,embeddings-local,nlp-spacy,documents,ingest-git,graph-embeddings,split-all,graph-all,tripletstore-oxigraph,vectorstore-all,parse-docling,parse-pdf,ingest-parquet,ingest-arrow,shacl,explorer,agno,langchain,google-adk]"
|
|
]
|
|
|
|
# ---------------- ENTRYPOINTS ----------------
|
|
[project.scripts]
|
|
semantica = "semantica.cli:main"
|
|
semantica-server = "semantica.server:main"
|
|
semantica-worker = "semantica.worker:main"
|
|
semantica-explorer = "semantica.explorer:main"
|
|
semantica-mcp = "semantica.mcp_server:main"
|
|
|
|
# ---------------- TOOLING ----------------
|
|
[tool.setuptools.packages.find]
|
|
where = ["."]
|
|
include = ["semantica*", "integrations*", "semantica_mcp*"]
|
|
|
|
[tool.setuptools.package-data]
|
|
# Explicit patterns are more reliable than **/* across setuptools versions.
|
|
# static/* covers index.html / favicon; static/assets/* covers all JS/CSS chunks.
|
|
"semantica" = ["static/*", "static/assets/*", "ontology/vocabulary/*.ttl"]
|
|
|
|
[tool.black]
|
|
line-length = 88
|
|
|
|
[tool.isort]
|
|
profile = "black"
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
markers = [
|
|
"integration: marks tests that require external services or API keys (deselect with '-m not integration')",
|
|
]
|