mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
Closes #1107, closes #1101. Every RDF export mints terms in https://semantica.dev/ns#, and nothing declared what those terms meant. The namespace returns 404 and no vocabulary shipped with the package, so a consumer receiving an export could not tell semantica:text from a typo of it: in the open world an undeclared IRI is unknown rather than wrong, and every RDF tool treats the two alike. Closed-world checking is what separates them, and it needs a document to check against. semantica/ontology/vocabulary/semantica-ns.ttl declares the fourteen terms the exporters actually emit, drawn from the emitting call sites rather than from what a vocabulary ought to contain. It ships inside the package so it loads without a network round trip, and is the same document intended to be served at the namespace IRI once hosting and content negotiation are sorted. tests/ontology/test_vocabulary.py ties the document to the code: every term the serializers can write must be declared, so adding a term to an exporter without declaring it fails the build rather than shipping an undeclared IRI. The vocabulary alone would not have made those IRIs resolve, because the fallback path minted them from Python's builtin hash(). That is randomised per process, so the same entity received a different IRI on every run and exports could not be diffed, deduplicated against an earlier load, or joined to a provenance record written by an earlier process. Minting now uses SHA-256 and writes a full IRI in the declared namespace rather than semantica:entity_N, which inside angle brackets is an IRI in the scheme "semantica" rather than the prefix expansion, and so never joined with anything written through the prefix. The same applies to the default entity and relationship types in the Turtle path. 134 export tests and 91 ontology tests pass. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
287 lines
8.5 KiB
TOML
287 lines
8.5 KiB
TOML
[build-system]
|
|
requires = ["setuptools==84.0.0", "wheel==0.48.0"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[project]
|
|
name = "semantica"
|
|
version = "0.6.5"
|
|
description = "Accountability and context layer for AI agents. 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" }]
|
|
|
|
requires-python = ">=3.8"
|
|
|
|
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.8",
|
|
"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>=1.7.2",
|
|
"umap-learn>=0.5.12",
|
|
"spacy>=3.4.0",
|
|
"transformers>=4.20.0",
|
|
"torch>=1.13.1",
|
|
"sentence-transformers>=2.2.0",
|
|
"rdflib>=6.2.0",
|
|
"networkx>=2.8.0",
|
|
"matplotlib>=3.9.4",
|
|
"seaborn>=0.13.2",
|
|
"plotly>=6.8.0",
|
|
"ipywidgets>=8.0.0",
|
|
"requests>=2.34.2",
|
|
"GitPython>=3.1.58",
|
|
"chardet>=7.4.3",
|
|
"protobuf>=5.29.1,<8.0",
|
|
"grpcio>=1.81.1",
|
|
"beautifulsoup4>=4.15.0",
|
|
"lxml>=6.1.1",
|
|
"python-docx>=1.2.0",
|
|
"openpyxl>=3.1.5",
|
|
"pillow>=12.2.0",
|
|
"librosa>=0.9.0",
|
|
"opencv-python>=4.13.0.92",
|
|
"faiss-cpu>=1.7.0",
|
|
"fastembed>=0.2.0",
|
|
"onnxruntime>=1.20.1",
|
|
"tokenizers>=0.15.0",
|
|
"pydantic>=2.13.4",
|
|
"click>=8.4.2",
|
|
"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",
|
|
"gensim>=4.4.0",
|
|
"httpx<0.29.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.18.0"]
|
|
llm-ollama = ["ollama>=0.1.0"]
|
|
llm-deepseek = ["openai>=1.0.0"]
|
|
llm-litellm = ["litellm>=1.83.9"]
|
|
llm-instructor = ["instructor>=1.15.3"]
|
|
|
|
llm-all = [
|
|
"semantica[llm-openai,llm-groq,llm-gemini,llm-anthropic,llm-ollama,llm-deepseek,llm-litellm,llm-instructor]"
|
|
]
|
|
|
|
# ---- Document Parsing ----
|
|
parse-docling = ["docling>=2.107.0"]
|
|
|
|
# ---- SHACL Validation ----
|
|
shacl = ["pyshacl>=0.25.0"]
|
|
|
|
# ---- Database Connectors ----
|
|
db-snowflake = ["snowflake-connector-python>=4.6.0", "cryptography>=49.0.0"]
|
|
db-databricks = ["databricks-sdk>=0.60.0", "databricks-sql-connector>=4.0.0"]
|
|
db-arrow = ["pyarrow>=24.0.0"]
|
|
ingest-parquet = ["pyarrow>=24.0.0"]
|
|
ingest-arrow = ["pyarrow>=24.0.0"]
|
|
|
|
db-all = [
|
|
"semantica[db-snowflake,db-databricks,db-arrow]"
|
|
]
|
|
|
|
# ---- Embedding / Models ----
|
|
models-huggingface = [
|
|
"transformers>=4.20.0",
|
|
"torch>=1.13.1"
|
|
]
|
|
|
|
# ---- 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-all = [
|
|
"semantica[graph-neo4j,graph-falkordb,graph-amazon-neptune,graph-apache-age]"
|
|
]
|
|
|
|
# ---- Triplet Store Backends ----
|
|
tripletstore-oxigraph = ["pyoxigraph>=0.5.0"]
|
|
|
|
# ---- Vector Store Backends ----
|
|
vectorstore-qdrant = ["qdrant-client>=1.0.0"]
|
|
vectorstore-weaviate = ["weaviate-client>=4.0.0"]
|
|
vectorstore-pinecone = ["pinecone-client>=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]"
|
|
]
|
|
|
|
# ---- 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"
|
|
]
|
|
|
|
# ---- 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.
|
|
crewai = ["crewai>=0.80.0"]
|
|
|
|
# ---- 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>=4.6.0",
|
|
"jupyter>=1.0.0",
|
|
"ipykernel>=6.15.0"
|
|
]
|
|
|
|
# Explorer Dashboard
|
|
explorer = [
|
|
"fastapi>=0.109.2",
|
|
"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,infra,cloud,monitoring,watch,llm-all,models-huggingface,split-all,graph-all,tripletstore-oxigraph,vectorstore-all,parse-docling,ingest-parquet,ingest-arrow,shacl,explorer]",
|
|
"semantica[dev,viz,infra,cloud,monitoring,watch,llm-all,models-huggingface,split-all,graph-all,tripletstore-oxigraph,vectorstore-all,parse-docling,ingest-parquet,ingest-arrow,shacl,agno]"
|
|
]
|
|
|
|
# ---------------- 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*"]
|
|
|
|
[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')",
|
|
]
|