Commit Graph
1227 Commits
Author SHA1 Message Date
ZohaibHassan16 44f817ee71 Merge branch 'feat/gitgraph' of https://github.com/ZohaibHassan16/semantica into feat/gitgraph 2026-03-19 02:26:06 +05:00
ZohaibHassan16 5d6051bee1 fix: resolve qodo issues 2026-03-19 02:25:17 +05:00
Zohaib e3a0c84b90 Merge branch 'main' into feat/gitgraph 2026-03-19 01:56:46 +05:00
ZohaibHassan16 6bbb8f929f add unit tests 2026-03-19 01:50:48 +05:00
ZohaibHassan16 b1e5c9e3c9 WIP: Foundation 2026-03-18 22:35:39 +05:00
Mohd Kaif fe64b8ad8a Merge pull request #387 from ZohaibHassan16/fix/issue-382-reasoner-dead-code
fix(reasoning): Remove overwritten regex pattern and unreachable return
2026-03-18 17:39:08 +05:30
Mohd Kaif 65a00de408 Merge branch 'main' into fix/issue-382-reasoner-dead-code 2026-03-18 17:07:26 +05:30
KaifAhmad1andClaude Sonnet 4.6 e9a2f87325 docs(changelog): add entry for PR #387 reasoning dead code fix
Documents the removal of the overwritten regex pattern and unreachable
return statement in _match_pattern, and the surfacing of regex errors.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 17:06:43 +05:30
Mohd Kaif ed27b98c53 Add Agno integration documentation 2026-03-18 15:55:49 +05:30
Mohd Kaif 353a6c605d Enhance Agno integration details in README
Expanded the description of the Agno integration with detailed components and installation instructions.
2026-03-18 15:36:45 +05:30
Mohd Kaif 0659509c14 Merge pull request #391 from Hawksight-AI/integrations
feat(integrations): Agno Agentic Framework — Decision Intelligence, Context Graphs & GraphRAG
2026-03-18 15:19:25 +05:30
KaifAhmad1andClaude Sonnet 4.6 b2a2d24b14 fix: address all Qodo code review issues in Agno integration
Package & distribution
- pyproject.toml: add integrations* to packages.find include so pip
  install semantica[agno] ships the integration

context_store.py
- upsert_memory(): run NERExtractor after store() to index entities
  into the ContextGraph
- delete_memory() / drop_table() / clear(): call AgentContext.forget()
  to propagate deletions to vector/graph storage
- find_precedents(): pass limit parameter to find_precedents_advanced()
- retrieve(): pass limit as max_results to AgentContext.retrieve()
- add get_context_for_prompt() for automatic system-prompt injection

knowledge_graph.py
- __init__: wire graph_builder.graph_store = self._graph so build()
  persists into the ContextGraph
- add internal AgentContext for vector retrieval (shared ContextGraph)
- search(): use AgentContext.retrieve() for vector similarity; keyword
  scoring as fallback
- _ingest_text(): add paragraph-level chunking before NER/relation
  extraction (parse → split → NER → relation extract → graph build)
- get_graph_context(): return structured subgraph with edge types via
  ContextGraph.get_neighbors()
- load_urls(): validate scheme (http/https only) to prevent SSRF

decision_kit.py
- check_policy(): replace broken PolicyEngine.check_compliance() call
  with inline _eval_rule() that evaluates simple field-op-value rules;
  return compliant=False (not True) on failure — closes security bug

kg_toolkit.py
- add_to_graph(): fix add_node(node_id=, node_type=) and
  add_edge(source_id=, target_id=, edge_type=) to match real API
- query_graph(): use find_nodes() (no label param) + keyword filter
- find_related(): use get_neighbors(node_id=) returning List[Dict]
- infer_facts() / export_subgraph(): use find_nodes() public API
  instead of private _nodes dict

shared_context.py
- _AgentScopedStore: store shared context as self._context (not
  self._ctx) so all inherited AgnoContextStore methods work correctly

tests/integrations/agno/test_kg_toolkit.py
- _FakeGraph: rewrite to match real ContextGraph signatures —
  find_nodes(node_type=), add_node(node_id, node_type, **),
  add_edge(source_id, target_id, edge_type, **),
  get_neighbors(node_id, hops=1, ...) returning List[Dict]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 04:21:48 +05:30
KaifAhmad1andClaude Sonnet 4.6 e315ad849d docs: update CHANGELOG and README with Agno integration
- Add Agno Agentic Framework Integration entry under [Unreleased] in CHANGELOG
- Update README: rename section to "Agentic Frameworks", add Agno bullet

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 03:33:52 +05:30
KaifAhmad1andClaude Sonnet 4.6 62c7970b32 feat(integrations): add Agno agentic framework integration (#249)
Implements the full Semantica × Agno integration stack as described in
issue #249, wiring Semantica's semantic intelligence layer into Agno's
agent/team primitives via five focused components.

## New components

### integrations/agno/
- `AgnoContextStore`    — graph-backed MemoryDb (AgentMemory/storage)
- `AgnoKnowledgeGraph`  — relational AgentKnowledge with multi-hop GraphRAG
- `AgnoDecisionKit`     — Agno Toolkit: 6 decision-intelligence tools
- `AgnoKGToolkit`       — Agno Toolkit: 7 knowledge-graph tools
- `AgnoSharedContext`   — team-level shared ContextGraph with role scoping

### tests/integrations/agno/
- 110 tests, 0 failures
- conftest.py installs comprehensive agno stubs for offline testing
- Covers MemoryDb protocol, tool registration, shared memory pool,
  thread-safety, GraphRAG search, NER/relation extraction, and inference

### cookbook/integrations/
- agno_decision_intelligence.ipynb     (finance/loan underwriting)
- agno_graphrag_context.ipynb          (regulatory compliance GraphRAG)
- agno_multi_agent_shared_context.ipynb (multi-agent product strategy team)

### docs/integrations/agno.md
- Full reference documentation with examples for all 5 components

## pyproject.toml
- Added `agno = ["agno>=1.0.0"]` optional dependency
- Added agno to the `all` extra

## Design notes
- Zero breaking changes — fully additive
- Graceful degradation when agno is not installed
- Auto-creates VectorStore(backend="faiss") when none provided
- _tools always populated for inspection regardless of agno install state
- Works with both real agno package and offline stubs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 03:25:14 +05:30
Mohd Kaif 4235840a9e Merge pull request #390 from Hawksight-AI/utils
ci: Optimize CI/CD Workflows — Scope Triggers to Avoid Redundant Runs
2026-03-18 01:12:44 +05:30
KaifAhmad1andClaude Sonnet 4.6 e3c33cf23b ci: remove test step — rely on benchmark and security workflows only
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 01:10:13 +05:30
KaifAhmad1andClaude Sonnet 4.6 868109fa34 ci: skip heavy/integration tests to reduce CI runtime
- Register 'integration' pytest mark in pyproject.toml to eliminate
  PytestUnknownMarkWarning across the test suite
- Add -m "not integration" and --ignore for external-service tests,
  notebook tests, comprehensive real-world tests, and API-key-dependent
  tests (Groq, Novita, Snowflake, Neptune, HF deepdive)
- Keeps fast unit tests: context, kg, semantic_extract, reasoning,
  pipeline, export, deduplication, parse, normalize, utils, provenance

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 01:08:03 +05:30
KaifAhmad1andClaude Sonnet 4.6 2e5ad9d28b fix: address Qodo review issues in CI workflows
- Replace '*.md' with '**/*.md' in paths-ignore across ci.yml,
  benchmark.yml, and security-scan.yml — '*.md' only matches root-level
  markdown; '**/*.md' covers all subdirectories (cookbook/, docs/, etc.)
- Add cache: 'pip' to setup-python in ci.yml to avoid re-downloading
  heavy packages (torch, spacy, faiss) on every run
- Update security-scan PR comment text to accurately reflect that it
  skips doc/markdown-only PRs, not "every PR"

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 00:38:44 +05:30
KaifAhmad1andClaude Sonnet 4.6 6c61e34ad4 fix: guard centrality values against MagicMock in analyze_decision_influence
When centrality_calculator falls back to basic implementation on a mocked
networkx call, measure_data['centrality'].get() can return a MagicMock.
MagicMock silently supports __mul__ and __add__, so the arithmetic on
influence_score produces a MagicMock instead of raising, causing the
isinstance(influence_score, (int, float)) assertion to fail in tests.

Guard each centrality value with isinstance(val, (int, float)) and default
to 0.0 for any non-numeric value before storing it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 00:28:34 +05:30
KaifAhmad1andClaude Sonnet 4.6 9a6c07417e fix: correct Entity import path in test_novita_integration
semantica.semantic_extract.models does not exist; Entity is defined in
ner_extractor.py and exported from semantica.semantic_extract directly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 00:17:08 +05:30
KaifAhmad1andClaude Sonnet 4.6 89fe0df40b fix: replace Presentation type annotation with Any in pptx_parser
Method signature 'def _extract_metadata(self, prs: Presentation)' references
Presentation at class-definition time (evaluated on import), causing NameError
since Presentation is no longer imported at module level. Replace with Any.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 00:11:58 +05:30
KaifAhmad1andClaude Sonnet 4.6 500d0239e0 fix: make python-pptx import lazy in pptx_parser to fix CI collection error
python-pptx is not in [dev] extras so it's absent in CI, causing
ModuleNotFoundError during test collection via parse/__init__.py.
Moved import inside the parse method with a clear install hint.

This is the last known bare top-level optional import — sqlalchemy
(db_ingestor.py) and pdfplumber (pdf_parser.py) were fixed in prior commits.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 00:01:10 +05:30
KaifAhmad1andClaude Sonnet 4.6 e18e6d1a00 fix: make pdfplumber import lazy in pdf_parser to fix CI collection error
pdfplumber (and unused PIL) were imported at module level but pdfplumber is
not installed in the [dev] extras used by CI, causing ModuleNotFoundError
during pytest collection via the parse/__init__.py import chain.
Moved import inside the method that uses it with a clear error message.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 23:29:13 +05:30
KaifAhmad1andClaude Sonnet 4.6 753bf18ce7 fix: make sqlalchemy import lazy in db_ingestor to fix CI collection error
sqlalchemy was imported at module level but is not a declared dependency,
causing ModuleNotFoundError during pytest collection in CI when only [dev]
extras are installed. Moved all sqlalchemy imports inside the methods that
use them; replaced Engine type annotations with Any to avoid import-time
resolution.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 23:23:45 +05:30
KaifAhmad1andClaude Sonnet 4.6 1aee4dfd29 ci: scope workflows to avoid redundant docs deploys and benchmark runs
- docs.yml: remove semantica/** path trigger (was deploying docs on every
  source code push); add release:[published] so docs still deploy on releases
- benchmark.yml: remove pull_request trigger (heavy deps - torch/spacy/faiss);
  add paths-ignore for doc-only main pushes; add workflow_dispatch for manual runs
- ci.yml: add paths-ignore so doc-only changes skip build; add pytest step
  so tests actually run in CI (was build-only before)
- security-scan.yml: add paths-ignore on push/pull_request; schedule runs unaffected

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 23:15:18 +05:30
Mohd Kaif 572d2da64a Merge pull request #374 from Alex-wuhu/novita-integration
Add Novita AI provider integration
2026-03-17 22:59:02 +05:30
Mohd Kaif 3f55a34eff Merge branch 'main' into novita-integration 2026-03-17 22:34:33 +05:30
KaifAhmad1andClaude Sonnet 4.6 2dbc502720 docs: add Novita AI provider to CHANGELOG and README
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 22:33:37 +05:30
KaifAhmad1andClaude Sonnet 4.6 c5fb2d24fd fix: correct Novita base_url to /v1 and add proper test assertions
- Fix base_url from 'https://api.novita.ai/openai' to 'https://api.novita.ai/v1'
  to match the OpenAI-compatible endpoint convention used by other providers
  (Groq uses /openai/v1, Novita docs specify /v1)
- Rewrite test_novita_integration.py with proper pytest assertions and
  pytestmark skip when NOVITA_API_KEY is unset; tests now fail on errors
  instead of silently printing and returning

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 22:29:09 +05:30
Mohd Kaif 9c09851658 Merge pull request #371 from ZohaibHassan16/datalog#368
feat: implement Datalog Reasoner
2026-03-17 17:39:53 +05:30
Mohd Kaif 2cea2708a6 Merge branch 'main' into datalog#368 2026-03-17 17:07:45 +05:30
KaifAhmad1andClaude Sonnet 4.6 b80c91ccb9 docs: update CHANGELOG for DatalogReasoner (PR #371, Issue #368)
Documents the new native Datalog reasoning engine under [Unreleased],
including semi-naive fixpoint evaluation, recursive rule support,
query interface, ContextGraph integration, and all bug fixes applied
during review.

Contributors: @ZohaibHassan16 (implementation), @KaifAhmad1 (review & fixes)

Co-Authored-By: KaifAhmad1 <kaifahmad087@gmail.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 17:06:51 +05:30
KaifAhmad1andClaude Sonnet 4.6 ad9ea48d26 fix: resolve review issues in DatalogReasoner
- Remove forced progress_tracker.enabled=True (was mutating global singleton)
- Wrap derive_all() fixpoint loop in try/finally so stop_tracking is always called
- Add _derived flag to cache fixpoint result; query() no longer re-runs derive_all() on every call
- Reset _derived to False in add_fact(), add_rule(), and clear()
- Warn (instead of silently drop) when add_fact() receives an unrecognised dict format
- Fix syntax error on line 9 of test file (stray dashes caused SyntaxError, broke CI)
- Add missing TestContextGraphIntegration tests: test_edge_becomes_fact and test_derive_after_load
- All 18 tests pass

Co-Authored-By: KaifAhmad1 <kaifahmad087@gmail.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-17 17:01:26 +05:30
Mohd Kaif 62f2c0af92 Merge pull request #367 from ZohaibHassan16/clean-ontology-diff
feat: implement ontology diff
2026-03-16 22:29:10 +05:30
KaifAhmad1andZohaibHassan16 24166bbfa9 docs: update CHANGELOG for ontology diff & migration (PR #367)
Co-authored-by: ZohaibHassan16 <zohaib179949@gmail.com>
Co-authored-by: KaifAhmad1 <kaifahmad087@gmail.com>
2026-03-16 22:08:02 +05:30
KaifAhmad1andZohaibHassan16 665771f230 fix: address all review feedback on ontology diff implementation
- Fix typo in ChangeCategory enum: "potenitally_breaking" → "potentially_breaking"
- Fix missing space in _classify_change description string: "New{type}" → "New {type}"
- Add null-value guard in _analyze_field_changes for unset constraint fields
- Make ChangeLogAnalyzer stateless: pass report as arg to _generate_recommendations
- Remove no-op __init__ from ChangeLogAnalyzer
- Replace non-portable emoji markers in recommendations with plain-text tags
- Extend diff_ontologies to cover individuals and axioms (not just classes/properties)
- Fix exception chaining in compare_versions: raise ... from e
- Remove silent ImportError swallow for GraphValidator (it is a first-party module)
- Add comment on deferred VersionManager import explaining circular-import reason
- Fix import-before-docstring in test_managers.py
- Add tests: version-not-found error path, individuals/axioms diff coverage,
  null constraint flagged as breaking
- Fix broken Markdown link syntax in docs JSON example block
- Update docs recommendations example to match new plain-text tag format

Co-authored-by: ZohaibHassan16 <zohaib179949@gmail.com>
Co-authored-by: KaifAhmad1 <kaifahmad087@gmail.com>
2026-03-16 22:05:12 +05:30
Mohd Kaif 9d4d682883 Merge branch 'main' into clean-ontology-diff 2026-03-16 21:48:47 +05:30
Mohd Kaif 399416f6ea Merge pull request #361 from ZohaibHassan16/onto-alignment
feat: implement ontology alignment API(#324)
2026-03-16 19:38:23 +05:30
ZohaibHassan16 32d0fe105c fix(reasoning): surface regex matching errors and verify pattern matcher integrity 2026-03-16 16:56:36 +05:00
Mohd Kaif 9bb71a45f2 Merge branch 'main' into onto-alignment 2026-03-16 16:43:07 +05:30
ZohaibHassan16 060ff47826 fix(reasoning): Remove overwritten regex pattern and unreachable return 2026-03-16 08:50:02 +05:00
Alex-wuhu de03d05600 Add Novita AI provider integration
- Add NovitaProvider class implementing OpenAI-compatible API
- Support for Novita AI API endpoint (https://api.novita.ai/openai)
- Configure via NOVITA_API_KEY environment variable or constructor
- Register 'novita' as built-in provider
- Update config.py to load NOVITA_API_KEY from environment
- Add test_novita_integration.py for provider testing

Default model: deepseek/deepseek-v3.2
2026-03-15 00:33:28 +08:00
Mohd Kaif c077944457 Merge pull request #373 from Hawksight-AI/context
Context Fix context explainability outputs and replace raw IDs with human-readable metadata
2026-03-14 15:11:58 +05:30
KaifAhmad1 b309451398 Fix review issues in context explainability PR 2026-03-14 14:47:20 +05:30
KaifAhmad1 0c1bdc0cee Update changelog for context explainability fixes 2026-03-13 06:33:29 +05:30
KaifAhmad1 c2a6e944fe Improve context explainability outputs 2026-03-13 06:31:38 +05:30
Mohd Kaif 0dc5eb6075 Merge branch 'main' into onto-alignment 2026-03-13 00:04:28 +05:30
KaifAhmad1andClaude Sonnet 4.6 5a316a4641 docs: update CHANGELOG for ontology alignment PR #361
Add Unreleased entry for the ontology alignment feature covering:
- all new APIs (create_alignment, get_alignments, list_alignments,
  suggest_alignments, expand_entity_uri, build_values_clause,
  get_alignment_predicates)
- post-review fixes: tracker leak, relatedMatch gap, SPARQL injection
  in list_alignments and build_values_clause, predicate validation,
  and E2E test correctness
- contributors: @ZohaibHassan16 (implementation), @KaifAhmad1 (review & fixes)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-13 00:01:27 +05:30
KaifAhmad1andClaude Sonnet 4.6 39c9fc97b4 fix: resolve all remaining review issues in ontology alignment API
- fix(query_engine): progress tracker leak in expand_entity_uri
  stop_tracking was only called inside the `if hasattr(execute_sparql)`
  block; backends without execute_sparql silently leaked a tracker entry.
  Now stop_tracking(completed) is always reached on the happy path, and
  stop_tracking(failed) is reached on exception.

- fix(query_engine): add skos:relatedMatch to expand_entity_uri FILTER
  get_alignment_predicates() exposed relatedMatch but the SPARQL filter
  did not include it, making relatedMatch alignments invisible.

- fix(query_engine): sanitize URIs in build_values_clause
  URIs were interpolated raw into <{uri}> angle-bracket literals.
  A URI containing > would break the VALUES clause. Now _sanitize_uri
  is applied to every URI before wrapping.

- fix(engine): add skos:relatedMatch to get_alignments and list_alignments
  FILTER lists now consistent with get_alignment_predicates().

- fix(engine): close SPARQL injection vector in list_alignments
  Previously only " was escaped in the ontology_uri filter string.
  A URI containing } would break out of the WHERE block. Now \, ", {
  and } are all percent-encoded before interpolation.

- fix(engine): validate predicate is a full URI in create_alignment
  Passing a CURIE like "owl:equivalentClass" silently stored a broken
  triple that get_alignments() could never find. Now raises ProcessingError
  with a clear message if the predicate does not start with http/https.

- fix(tests): rewrite E2E test to actually be end-to-end
  test_end_to_end_cross_ontology_uri_flow was mocking expand_entity_uri
  itself, so it only tested build_values_clause string formatting.
  Now uses a real mock backend with execute_sparql, calls the real
  expand_entity_uri, and asserts both the backend was queried and the
  resulting SPARQL template contains both URIs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 23:40:37 +05:30
ZohaibHassan16 f043367a73 fix: resolve DatalogReasoner gaps and bugs 2026-03-12 10:30:25 +05:00