Compare commits

...
Author SHA1 Message Date
Zohaib Hassnain 98900af751 Merge branch 'main' into docs-fix-model-ids 2026-09-03 22:29:39 +05:00
Zohaib Hassnain 8bceff105c docs(llms): sweep retired model as qodo found 2026-09-03 22:29:23 +05:00
Zohaib HassnainandMohd Kaif f45499b5a7 fix(deps): unblock python 3.9 core install (#1445)
Co-authored-by: Mohd Kaif <98801504+KaifAhmad1@users.noreply.github.com>
2026-09-03 22:51:43 +05:30
Zohaib Hassnain b574e2e6b4 docs: replace retired claude-sonnet-4-20250514 model id 2026-09-03 22:18:52 +05:00
Zohaib Hassnain c04adcd1a9 docs(semantic-extraction): fix summary output and model ID (#1448)
* docs(semantic-extraction): fix summary print and the model id

* chore: correct model id

* docs: make triplet valid split meaningful
2026-09-03 22:14:23 +05:00
Zohaib Hassnain a85cf913a5 docs(reasoning): clarify Datalog query result ordering (#1447)
* docs(reasoning): note DatalogReasoner.query() result is not guaranteed

* keep lists[dict] shape
2026-09-03 21:58:39 +05:00
10 changed files with 87 additions and 53 deletions
+5 -5
View File
@@ -195,7 +195,7 @@ apt29_intel = context.retrieve(
```python ```python
from semantica.llms import LiteLLM from semantica.llms import LiteLLM
llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") llm = LiteLLM(model="anthropic/claude-sonnet-5")
result = context.query_with_reasoning( result = context.query_with_reasoning(
"What are APT29's known TTPs against healthcare infrastructure, " "What are APT29's known TTPs against healthcare infrastructure, "
@@ -281,7 +281,7 @@ context.store(
link_entities=True, link_entities=True,
) )
llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") llm = LiteLLM(model="anthropic/claude-sonnet-5")
result = context.query_with_reasoning( result = context.query_with_reasoning(
"Trace the C2 infrastructure chain for APT29 operations targeting " "Trace the C2 infrastructure chain for APT29 operations targeting "
"ITAR-controlled contractors in 2025. Include IP ranges, ASNs, and TTPs.", "ITAR-controlled contractors in 2025. Include IP ranges, ASNs, and TTPs.",
@@ -351,7 +351,7 @@ Parent: wmiprvse.exe
Sigma match: T1053.005 Scheduled Task/Job Sigma match: T1053.005 Scheduled Task/Job
""" """
llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") llm = LiteLLM(model="anthropic/claude-sonnet-5")
triage = soc_context.query_with_reasoning( triage = soc_context.query_with_reasoning(
"Triage this SIEM alert and identify the correct response runbook:\n{}".format(alert_text), "Triage this SIEM alert and identify the correct response runbook:\n{}".format(alert_text),
llm_provider=llm, llm_provider=llm,
@@ -425,7 +425,7 @@ Patient: 68F, AF, CKD stage 3b (eGFR 32). On warfarin (INR target 2.03.0).
Presenting for elective hip replacement. Concurrent: amiodarone 200mg, atorvastatin 40mg. Presenting for elective hip replacement. Concurrent: amiodarone 200mg, atorvastatin 40mg.
""" """
llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") llm = LiteLLM(model="anthropic/claude-sonnet-5")
answer = clinical_context.query_with_reasoning( answer = clinical_context.query_with_reasoning(
"What is the evidence-based warfarin bridging protocol for this patient " "What is the evidence-based warfarin bridging protocol for this patient "
"given CKD and amiodarone interaction risk?\n\n{}".format(patient_context), "given CKD and amiodarone interaction risk?\n\n{}".format(patient_context),
@@ -495,7 +495,7 @@ compliance_context.store(
extract_relationships=True, extract_relationships=True,
) )
llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") llm = LiteLLM(model="anthropic/claude-sonnet-5")
answer = compliance_context.query_with_reasoning( answer = compliance_context.query_with_reasoning(
"Under Basel III CRE20, what are the RWA calculation requirements for " "Under Basel III CRE20, what are the RWA calculation requirements for "
"commercial real estate exposures with LTV > 80%? " "commercial real estate exposures with LTV > 80%? "
+8 -8
View File
@@ -275,20 +275,20 @@ print(data)
**LiteLLM** is a universal adapter that provides a single interface to over 100 different LLM providers, including Anthropic Claude, Azure OpenAI, AWS Bedrock, Google Vertex AI, and local Ollama instances. It acts as a translation layer, converting your unified API calls into provider-specific requests, enabling easy switching between providers without code changes. **LiteLLM** is a universal adapter that provides a single interface to over 100 different LLM providers, including Anthropic Claude, Azure OpenAI, AWS Bedrock, Google Vertex AI, and local Ollama instances. It acts as a translation layer, converting your unified API calls into provider-specific requests, enabling easy switching between providers without code changes.
`LiteLLM` is the Swiss Army knife. It wraps the `litellm` library, which speaks to every major provider using a unified completion API. The model string encodes both provider and model name: `"anthropic/claude-sonnet-4-20250514"`, `"azure/gpt-4o"`, `"bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0"`, `"ollama/llama3.2"`. Change the string, change the provider — no other code changes needed. `LiteLLM` is the Swiss Army knife. It wraps the `litellm` library, which speaks to every major provider using a unified completion API. The model string encodes both provider and model name: `"anthropic/claude-sonnet-5"`, `"azure/gpt-4o"`, `"bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0"`, `"ollama/llama3.2"`. Change the string, change the provider — no other code changes needed.
```python ```python
from semantica.llms import LiteLLM from semantica.llms import LiteLLM
# Anthropic Claude — highest accuracy for complex reasoning # Anthropic Claude — highest accuracy for complex reasoning
llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") llm = LiteLLM(model="anthropic/claude-sonnet-5")
# Reads ANTHROPIC_API_KEY from environment # Reads ANTHROPIC_API_KEY from environment
# Azure OpenAI — compliance and data-residency requirements # Azure OpenAI — compliance and data-residency requirements
llm = LiteLLM(model="azure/gpt-4o", api_key="YOUR_AZURE_KEY") llm = LiteLLM(model="azure/gpt-4o", api_key="YOUR_AZURE_KEY")
# AWS Bedrock — existing cloud agreement, no new vendor # AWS Bedrock — existing cloud agreement, no new vendor
llm = LiteLLM(model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0") llm = LiteLLM(model="bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0")
# Google Vertex AI # Google Vertex AI
llm = LiteLLM(model="vertex_ai/gemini-1.5-pro") llm = LiteLLM(model="vertex_ai/gemini-1.5-pro")
@@ -306,7 +306,7 @@ The environment-variable convention for each provider: `ANTHROPIC_API_KEY`, `AZU
import os import os
PROVIDER_MAP = { PROVIDER_MAP = {
"prod": "anthropic/claude-sonnet-4-20250514", "prod": "anthropic/claude-sonnet-5",
"staging": "openai/gpt-4o-mini", "staging": "openai/gpt-4o-mini",
"local": "ollama/llama3.2", "local": "ollama/llama3.2",
"azure": "azure/gpt-4o", "azure": "azure/gpt-4o",
@@ -378,7 +378,7 @@ print("FAST: {} (conf={:.0%})".format(fast_result["response"], fast_result["con
# Tier 2: deep answer with Claude if confidence is below threshold # Tier 2: deep answer with Claude if confidence is below threshold
if fast_result["confidence"] < 0.85: if fast_result["confidence"] < 0.85:
deep_llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") deep_llm = LiteLLM(model="anthropic/claude-sonnet-5")
deep_result = context.query_with_reasoning( deep_result = context.query_with_reasoning(
query, llm_provider=deep_llm, max_results=15, max_hops=3 query, llm_provider=deep_llm, max_results=15, max_hops=3
) )
@@ -574,7 +574,7 @@ print("TRIAGE: {} (conf={:.0%})".format(triage["response"], triage["confidence"]
# Tier 2: escalate to Claude for deep analysis if Tier 1 is uncertain # Tier 2: escalate to Claude for deep analysis if Tier 1 is uncertain
if triage["confidence"] < 0.88: if triage["confidence"] < 0.88:
deep_llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") deep_llm = LiteLLM(model="anthropic/claude-sonnet-5")
deep = context.query_with_reasoning( deep = context.query_with_reasoning(
"Full MITRE ATT&CK analysis of this alert: identify the attack chain, " "Full MITRE ATT&CK analysis of this alert: identify the attack chain, "
"blast radius, affected systems, and recommended containment steps.", "blast radius, affected systems, and recommended containment steps.",
@@ -630,7 +630,7 @@ for d in drugs:
# trastuzumab (conf=0.98), pertuzumab (conf=0.97), docetaxel (conf=0.96) # trastuzumab (conf=0.98), pertuzumab (conf=0.97), docetaxel (conf=0.96)
# Report synthesis with Claude — switch to azure/gpt-4o for HIPAA by changing one string # Report synthesis with Claude — switch to azure/gpt-4o for HIPAA by changing one string
report_llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") report_llm = LiteLLM(model="anthropic/claude-sonnet-5")
# For HIPAA-constrained Azure deployment: # For HIPAA-constrained Azure deployment:
# report_llm = LiteLLM(model="azure/gpt-4o", api_key="YOUR_AZURE_KEY") # report_llm = LiteLLM(model="azure/gpt-4o", api_key="YOUR_AZURE_KEY")
@@ -682,7 +682,7 @@ question = (
# Two-provider consensus — same query, same graph, different LLMs # Two-provider consensus — same query, same graph, different LLMs
gpt4o = OpenAI(model="gpt-4o", api_key="YOUR_OAI_KEY") gpt4o = OpenAI(model="gpt-4o", api_key="YOUR_OAI_KEY")
claude = LiteLLM(model="anthropic/claude-sonnet-4-20250514") claude = LiteLLM(model="anthropic/claude-sonnet-5")
answer_a = context.query_with_reasoning(question, llm_provider=gpt4o, max_results=10) answer_a = context.query_with_reasoning(question, llm_provider=gpt4o, max_results=10)
answer_b = context.query_with_reasoning(question, llm_provider=claude, max_results=10) answer_b = context.query_with_reasoning(question, llm_provider=claude, max_results=10)
+4 -4
View File
@@ -197,7 +197,7 @@ reasoning_agent.load("./pipeline/enriched_intel/")
# All memories, graph nodes, and vector embeddings from both ingestion agents are now available. # All memories, graph nodes, and vector embeddings from both ingestion agents are now available.
# Use a high-capability model for the synthesis step # Use a high-capability model for the synthesis step
llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") llm = LiteLLM(model="anthropic/claude-sonnet-5")
synthesis = reasoning_agent.query_with_reasoning( synthesis = reasoning_agent.query_with_reasoning(
"Summarize the APT29 exploitation of CVE-2024-3400: affected products, " "Summarize the APT29 exploitation of CVE-2024-3400: affected products, "
@@ -428,7 +428,7 @@ tier1.store(
# --- Tier 2: deep investigation when Tier 1 confidence is low --- # --- Tier 2: deep investigation when Tier 1 confidence is low ---
if triage["confidence"] < 0.90: if triage["confidence"] < 0.90:
deep_llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") deep_llm = LiteLLM(model="anthropic/claude-sonnet-5")
investigation = tier2.query_with_reasoning( investigation = tier2.query_with_reasoning(
"Full MITRE ATT&CK analysis of incident {}. " "Full MITRE ATT&CK analysis of incident {}. "
@@ -533,7 +533,7 @@ t1.start(); t2.start()
t1.join(); t2.join() t1.join(); t2.join()
# Chief agent synthesizes across literature and experimental data # Chief agent synthesizes across literature and experimental data
llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") llm = LiteLLM(model="anthropic/claude-sonnet-5")
synthesis = chief.query_with_reasoning( synthesis = chief.query_with_reasoning(
"Identify the top two candidate compounds for KRAS G12C NSCLC that show " "Identify the top two candidate compounds for KRAS G12C NSCLC that show "
@@ -576,7 +576,7 @@ credit_officer = make_desk_agent()
committee_chair = make_desk_agent() committee_chair = make_desk_agent()
app_id = "LOAN-2025-88421" app_id = "LOAN-2025-88421"
llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") llm = LiteLLM(model="anthropic/claude-sonnet-5")
# --- Risk Desk: PD/LGD/EL analysis --- # --- Risk Desk: PD/LGD/EL analysis ---
risk_desk.store( risk_desk.store(
+1 -1
View File
@@ -477,7 +477,7 @@ regs = [
] ]
# Use an LLM to extract the conceptual model from regulatory prose # Use an LLM to extract the conceptual model from regulatory prose
llm_gen = LLMOntologyGenerator(provider="anthropic", model="claude-sonnet-4-20250514") llm_gen = LLMOntologyGenerator(provider="anthropic", model="claude-sonnet-5")
ontology = llm_gen.generate_ontology_from_text( ontology = llm_gen.generate_ontology_from_text(
"\n\n".join(r.text[:8000] for r in regs) # token-safe excerpt per document "\n\n".join(r.text[:8000] for r in regs) # token-safe excerpt per document
) )
+21 -16
View File
@@ -100,14 +100,15 @@ ner = NamedEntityRecognizer(
methods=["llm", "ml", "pattern"], methods=["llm", "ml", "pattern"],
confidence_threshold=0.75, confidence_threshold=0.75,
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
) )
entities = ner.extract_entities(report) entities = ner.extract_entities(report)
for e in entities: for e in entities:
print("[{:>5.2f}] {:15s} {}".format(e.confidence, e.label, e.text)) print("[{:>5.2f}] {:15s} {}".format(e.confidence, e.label, e.text))
# Expected output (abbreviated): # Illustrative output — exact labels and scores depend on the method and model.
# Abbreviated:
# [ 0.94] THREAT_ACTOR GAMMA-7 # [ 0.94] THREAT_ACTOR GAMMA-7
# [ 0.91] THREAT_ACTOR DELTA-3 # [ 0.91] THREAT_ACTOR DELTA-3
# [ 0.97] MALWARE HAMMERTOSS # [ 0.97] MALWARE HAMMERTOSS
@@ -262,16 +263,18 @@ from semantica.semantic_extract import TripletExtractor
tri = TripletExtractor( tri = TripletExtractor(
method="llm", method="llm",
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
include_temporal=True, # attach time context to triplets when available include_temporal=True, # attach time context to triplets when available
include_provenance=True, # embed source document reference in each triplet include_provenance=True, # embed source document reference in each triplet
validate=False, # return raw triplets; validate explicitly below
) )
# Feed in the entities and relations you already extracted — the extractor # Feed in the entities and relations you already extracted — the extractor
# uses them to constrain and validate what it produces # uses them to constrain what it produces
triplets = tri.extract_triplets(report, entities, relations) triplets = tri.extract_triplets(report, entities, relations)
# Filter malformed triplets before serialisation # Filter malformed triplets before serialisation
# (extract_triplets validates automatically unless validate=False, as above)
valid = tri.validate_triplets(triplets) valid = tri.validate_triplets(triplets)
print("Valid: {}/{}".format(len(valid), len(triplets))) print("Valid: {}/{}".format(len(valid), len(triplets)))
@@ -320,7 +323,7 @@ def ingest_intel_report(
methods=[method, "pattern"], methods=[method, "pattern"],
confidence_threshold=0.70, confidence_threshold=0.70,
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
) )
entities = ner.extract_entities(text) entities = ner.extract_entities(text)
classified = ner.classify_entities(entities) classified = ner.classify_entities(entities)
@@ -335,7 +338,7 @@ def ingest_intel_report(
relation_types=["deployed", "targets", "exploits", "operates_from", "provided_to"], relation_types=["deployed", "targets", "exploits", "operates_from", "provided_to"],
confidence_threshold=0.65, confidence_threshold=0.65,
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
) )
relations = rel.extract_relations(text, entities) relations = rel.extract_relations(text, entities)
@@ -347,9 +350,10 @@ def ingest_intel_report(
tri = TripletExtractor( tri = TripletExtractor(
method=method, method=method,
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
include_temporal=True, include_temporal=True,
include_provenance=True, include_provenance=True,
validate=False, # keep raw triplets so the summary can report rejections
) )
triplets = tri.extract_triplets(text, entities, relations) triplets = tri.extract_triplets(text, entities, relations)
valid = tri.validate_triplets(triplets) valid = tri.validate_triplets(triplets)
@@ -377,6 +381,7 @@ def ingest_intel_report(
"coref_chains": len(chains), "coref_chains": len(chains),
"relations": len(relations), "relations": len(relations),
"events": len(events), "events": len(events),
"triplets_total": len(triplets),
"triplets_valid": len(valid), "triplets_valid": len(valid),
"graph_nodes": graph_stats.get("graph_nodes", 0), "graph_nodes": graph_stats.get("graph_nodes", 0),
"graph_edges": graph_stats.get("graph_edges", 0), "graph_edges": graph_stats.get("graph_edges", 0),
@@ -402,7 +407,7 @@ for text, doc_id in reports:
summary["relations"], summary["relations"],
summary["events"], summary["events"],
summary["triplets_valid"], summary["triplets_valid"],
len(summary["rdf_turtle"]), summary["triplets_total"],
)) ))
``` ```
@@ -421,7 +426,7 @@ ner = NamedEntityRecognizer(
methods=["llm", "pattern"], methods=["llm", "pattern"],
confidence_threshold=0.75, confidence_threshold=0.75,
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
) )
entities = ner.extract_entities(fintel_text) entities = ner.extract_entities(fintel_text)
grouped = ner.classify_entities(entities) grouped = ner.classify_entities(entities)
@@ -438,14 +443,14 @@ rel = RelationExtractor(
relation_types=["operates_from", "deployed", "targets", "exploits"], relation_types=["operates_from", "deployed", "targets", "exploits"],
confidence_threshold=0.70, confidence_threshold=0.70,
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
) )
relations = rel.extract_relations(fintel_text, entities) relations = rel.extract_relations(fintel_text, entities)
tri = TripletExtractor( tri = TripletExtractor(
method="llm", method="llm",
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
include_temporal=True, include_temporal=True,
include_provenance=True, include_provenance=True,
) )
@@ -544,14 +549,14 @@ rel = RelationExtractor(
relation_types=["treats", "causes_adverse_event", "has_efficacy", "evaluated_in"], relation_types=["treats", "causes_adverse_event", "has_efficacy", "evaluated_in"],
confidence_threshold=0.65, confidence_threshold=0.65,
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
) )
relations = rel.extract_relations(paper, entities) relations = rel.extract_relations(paper, entities)
tri = TripletExtractor( tri = TripletExtractor(
method="llm", method="llm",
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
triplet_types=["treats", "has_efficacy", "causes_adverse_event"], triplet_types=["treats", "has_efficacy", "causes_adverse_event"],
include_temporal=True, include_temporal=True,
include_provenance=True, include_provenance=True,
@@ -595,7 +600,7 @@ ner = NamedEntityRecognizer(
methods=["llm", "ml", "pattern"], methods=["llm", "ml", "pattern"],
confidence_threshold=0.70, confidence_threshold=0.70,
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
) )
entities = ner.extract_entities(credit_memo) entities = ner.extract_entities(credit_memo)
grouped = ner.classify_entities(entities) grouped = ner.classify_entities(entities)
@@ -612,14 +617,14 @@ rel = RelationExtractor(
relation_types=["guaranteed_by", "secured_by", "classified_as", "exposed_to"], relation_types=["guaranteed_by", "secured_by", "classified_as", "exposed_to"],
confidence_threshold=0.65, confidence_threshold=0.65,
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
) )
relations = rel.extract_relations(credit_memo, entities) relations = rel.extract_relations(credit_memo, entities)
tri = TripletExtractor( tri = TripletExtractor(
method="llm", method="llm",
provider="anthropic", provider="anthropic",
llm_model="claude-sonnet-4-6", llm_model="claude-sonnet-5",
include_temporal=True, include_temporal=True,
include_provenance=True, include_provenance=True,
) )
+7 -7
View File
@@ -129,7 +129,7 @@ from semantica.llms import Groq, OpenAI, LiteLLM, HuggingFaceLLM
from semantica.llms import LiteLLM from semantica.llms import LiteLLM
llm = LiteLLM( llm = LiteLLM(
model="anthropic/claude-sonnet-4-20250514", model="anthropic/claude-sonnet-5",
api_key=os.getenv("ANTHROPIC_API_KEY"), api_key=os.getenv("ANTHROPIC_API_KEY"),
temperature=0.0, temperature=0.0,
) )
@@ -198,7 +198,7 @@ llm = Groq(api_key=os.getenv("GROQ_API_KEY"), model="llama-3.1-8b-instant")
# Method 3: Multiple providers via LiteLLM # Method 3: Multiple providers via LiteLLM
providers = { providers = {
"fast": LiteLLM(model="groq/llama-3.1-8b-instant", api_key=os.getenv("GROQ_API_KEY")), "fast": LiteLLM(model="groq/llama-3.1-8b-instant", api_key=os.getenv("GROQ_API_KEY")),
"smart": LiteLLM(model="anthropic/claude-sonnet-4-20250514", api_key=os.getenv("ANTHROPIC_API_KEY")) "smart": LiteLLM(model="anthropic/claude-sonnet-5", api_key=os.getenv("ANTHROPIC_API_KEY"))
} }
``` ```
@@ -252,7 +252,7 @@ from semantica.llms import LiteLLM
# pip install "semantica[llm-litellm]" # pip install "semantica[llm-litellm]"
# Anthropic Claude # Anthropic Claude
llm = LiteLLM(model="anthropic/claude-opus-4-5", api_key=os.getenv("ANTHROPIC_API_KEY")) llm = LiteLLM(model="anthropic/claude-opus-4-7", api_key=os.getenv("ANTHROPIC_API_KEY"))
# Google Gemini # Google Gemini
llm = LiteLLM(model="gemini/gemini-1.5-pro", api_key=os.getenv("GOOGLE_API_KEY")) llm = LiteLLM(model="gemini/gemini-1.5-pro", api_key=os.getenv("GOOGLE_API_KEY"))
@@ -267,7 +267,7 @@ llm = LiteLLM(model="deepseek/deepseek-chat", api_key=os.getenv("DEEP
llm = LiteLLM(model="azure/gpt-4o", api_key=os.getenv("AZURE_API_KEY")) llm = LiteLLM(model="azure/gpt-4o", api_key=os.getenv("AZURE_API_KEY"))
# AWS Bedrock # AWS Bedrock
llm = LiteLLM(model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0") llm = LiteLLM(model="bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0")
# Novita AI # Novita AI
llm = LiteLLM(model="novita/deepseek/deepseek-v3.2", api_key=os.getenv("NOVITA_API_KEY")) llm = LiteLLM(model="novita/deepseek/deepseek-v3.2", api_key=os.getenv("NOVITA_API_KEY"))
@@ -297,12 +297,12 @@ from semantica.llms import LiteLLM
# Pattern: LiteLLM(model="<provider>/<model-name>") # Pattern: LiteLLM(model="<provider>/<model-name>")
providers = { providers = {
"Anthropic": LiteLLM(model="anthropic/claude-opus-4-5", api_key=os.getenv("ANTHROPIC_API_KEY")), "Anthropic": LiteLLM(model="anthropic/claude-opus-4-7", api_key=os.getenv("ANTHROPIC_API_KEY")),
"Gemini": LiteLLM(model="gemini/gemini-1.5-pro", api_key=os.getenv("GOOGLE_API_KEY")), "Gemini": LiteLLM(model="gemini/gemini-1.5-pro", api_key=os.getenv("GOOGLE_API_KEY")),
"Ollama": LiteLLM(model="ollama/llama3.2:3b", api_base="http://localhost:11434"), "Ollama": LiteLLM(model="ollama/llama3.2:3b", api_base="http://localhost:11434"),
"DeepSeek": LiteLLM(model="deepseek/deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY")), "DeepSeek": LiteLLM(model="deepseek/deepseek-chat", api_key=os.getenv("DEEPSEEK_API_KEY")),
"Azure": LiteLLM(model="azure/gpt-4o", api_key=os.getenv("AZURE_API_KEY")), "Azure": LiteLLM(model="azure/gpt-4o", api_key=os.getenv("AZURE_API_KEY")),
"Bedrock": LiteLLM(model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0"), "Bedrock": LiteLLM(model="bedrock/anthropic.claude-sonnet-4-5-20250929-v1:0"),
"Cohere": LiteLLM(model="cohere/command-r-plus", api_key=os.getenv("COHERE_API_KEY")), "Cohere": LiteLLM(model="cohere/command-r-plus", api_key=os.getenv("COHERE_API_KEY")),
"Novita AI": LiteLLM(model="novita/deepseek/deepseek-v3.2", api_key=os.getenv("NOVITA_API_KEY")), "Novita AI": LiteLLM(model="novita/deepseek/deepseek-v3.2", api_key=os.getenv("NOVITA_API_KEY")),
} }
@@ -416,7 +416,7 @@ for text in texts:
| :---------- | :--------------------------- | :----------- | | :---------- | :--------------------------- | :----------- |
| **Entity Extraction** | `Groq("llama-3.3-70b-versatile")` | Fast, good accuracy for structured tasks | | **Entity Extraction** | `Groq("llama-3.3-70b-versatile")` | Fast, good accuracy for structured tasks |
| **Relation Extraction** | `OpenAI("gpt-4o")` | Best at complex relationship reasoning | | **Relation Extraction** | `OpenAI("gpt-4o")` | Best at complex relationship reasoning |
| **Complex Analysis** | `LiteLLM("anthropic/claude-sonnet-4-20250514")` | Highest reasoning capability | | **Complex Analysis** | `LiteLLM("anthropic/claude-sonnet-5")` | Highest reasoning capability |
| **High Volume/Cost** | `LiteLLM("deepseek/deepseek-chat")` | Lowest cost per token | | **High Volume/Cost** | `LiteLLM("deepseek/deepseek-chat")` | Lowest cost per token |
### Error Handling ### Error Handling
+1 -1
View File
@@ -323,7 +323,7 @@ all_facts = datalog.derive_all()
# Query with variable pattern: variables start with uppercase or ? # Query with variable pattern: variables start with uppercase or ?
results = datalog.query("ancestor(alice, ?Z)") results = datalog.query("ancestor(alice, ?Z)")
# → [{"Z": "bob"}, {"Z": "charlie"}, {"Z": "dave"}] # → a list of binding dicts: [{"Z": "bob"}, {"Z": "charlie"}, {"Z": "dave"}] (order not guaranteed)
# Clear and start over # Clear and start over
datalog.clear() datalog.clear()
+36 -7
View File
@@ -47,7 +47,11 @@ dependencies = [
"numpy>=2.0.2", "numpy>=2.0.2",
"pandas>=1.3.0", "pandas>=1.3.0",
"scipy>=1.13.1", "scipy>=1.13.1",
"scikit-learn>=1.7.2", # 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'",
"umap-learn>=0.5.12", "umap-learn>=0.5.12",
# thinc (spacy's core dep) dropped Python 3.9 wheels at 8.3.10, and later # thinc (spacy's core dep) dropped Python 3.9 wheels at 8.3.10, and later
# spacy patch releases (3.8.8+) require thinc>=8.3.9-only-on-3.10+ ranges, # spacy patch releases (3.8.8+) require thinc>=8.3.9-only-on-3.10+ ranges,
@@ -66,24 +70,49 @@ dependencies = [
"seaborn>=0.13.2", "seaborn>=0.13.2",
"plotly>=6.8.0", "plotly>=6.8.0",
"ipywidgets>=8.0.0", "ipywidgets>=8.0.0",
"requests>=2.34.2", # 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'",
"GitPython>=3.1.58", "GitPython>=3.1.58",
"chardet>=7.4.3", # 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", "protobuf>=5.29.1,<8.0",
"grpcio>=1.81.1", # 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'",
"beautifulsoup4>=4.15.0", "beautifulsoup4>=4.15.0",
"lxml>=6.1.1", "lxml>=6.1.1",
"python-docx>=1.2.0", "python-docx>=1.2.0",
"openpyxl>=3.1.5", "openpyxl>=3.1.5",
"pillow>=12.2.0", # 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'",
"librosa>=0.9.0", "librosa>=0.9.0",
"opencv-python>=4.13.0.92", "opencv-python>=4.13.0.92",
"faiss-cpu>=1.7.0", "faiss-cpu>=1.7.0",
"fastembed>=0.2.0", "fastembed>=0.2.0",
"onnxruntime>=1.20.1", # onnxruntime stopped shipping cp39 wheels at 1.20.0 (its PyPI metadata
# still claims requires_python >=3.9, but no matching wheel exists), so an
# unqualified >=1.20.1 floor is unsatisfiable on 3.9. Cap 3.9 to the last
# release with a cp39 wheel; 3.10+ is left unconstrained.
"onnxruntime>=1.19.2,<1.20.0; python_version < '3.10'",
"onnxruntime>=1.20.1; python_version >= '3.10'",
"tokenizers>=0.15.0", "tokenizers>=0.15.0",
"pydantic>=2.13.4", "pydantic>=2.13.4",
"click>=8.4.2", # 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", "rich>=12.5.0",
"tqdm>=4.68.3", "tqdm>=4.68.3",
"pyyaml>=6.0", "pyyaml>=6.0",
+1 -1
View File
@@ -35,7 +35,7 @@ Example Usage:
>>> llm = LiteLLM(model="openai/gpt-4o", api_key="your-key") >>> llm = LiteLLM(model="openai/gpt-4o", api_key="your-key")
>>> response = llm.generate("Hello, world!") >>> response = llm.generate("Hello, world!")
>>> # Or use other providers via LiteLLM >>> # Or use other providers via LiteLLM
>>> llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") >>> llm = LiteLLM(model="anthropic/claude-sonnet-5")
>>> response = llm.generate("Hello, world!") >>> response = llm.generate("Hello, world!")
>>> >>>
>>> # Anthropic provider >>> # Anthropic provider
+3 -3
View File
@@ -31,7 +31,7 @@ class LiteLLM:
Provides unified interface to 100+ LLM providers through LiteLLM library. Provides unified interface to 100+ LLM providers through LiteLLM library.
Supports providers like OpenAI, Anthropic, Groq, Azure, Bedrock, Vertex AI, etc. Supports providers like OpenAI, Anthropic, Groq, Azure, Bedrock, Vertex AI, etc.
Model format: "provider/model-name" (e.g., "openai/gpt-4o", "anthropic/claude-sonnet-4-20250514", "groq/llama-3.1-8b-instant") Model format: "provider/model-name" (e.g., "openai/gpt-4o", "anthropic/claude-sonnet-5", "groq/llama-3.1-8b-instant")
Example: Example:
>>> from semantica.llms import LiteLLM >>> from semantica.llms import LiteLLM
@@ -39,7 +39,7 @@ class LiteLLM:
>>> response = llm.generate("What is AI?") >>> response = llm.generate("What is AI?")
>>> >>>
>>> # Use with different providers >>> # Use with different providers
>>> llm = LiteLLM(model="anthropic/claude-sonnet-4-20250514") >>> llm = LiteLLM(model="anthropic/claude-sonnet-5")
>>> response = llm.generate("Hello!") >>> response = llm.generate("Hello!")
""" """
@@ -54,7 +54,7 @@ class LiteLLM:
Args: Args:
model: Model identifier in format "provider/model-name" model: Model identifier in format "provider/model-name"
Examples: "openai/gpt-4o", "anthropic/claude-sonnet-4-20250514", Examples: "openai/gpt-4o", "anthropic/claude-sonnet-5",
"groq/llama-3.1-8b-instant", "azure/gpt-4", etc. "groq/llama-3.1-8b-instant", "azure/gpt-4", etc.
api_key: API key (optional, can use environment variables) api_key: API key (optional, can use environment variables)
**kwargs: Additional LiteLLM options (temperature, max_tokens, etc.) **kwargs: Additional LiteLLM options (temperature, max_tokens, etc.)