{"id":50694878,"url":"https://github.com/jmurray10/semanticembed-sdk","last_synced_at":"2026-06-09T06:01:36.416Z","repository":{"id":347807473,"uuid":"1181354210","full_name":"jmurray10/semanticembed-sdk","owner":"jmurray10","description":" 6D structural risk analysis for directed graphs — AI agent pipelines, microservices, CI/CD. Sub-millisecond. Patent pending.","archived":false,"fork":false,"pushed_at":"2026-05-05T04:31:34.000Z","size":360,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-05T06:27:56.169Z","etag":null,"topics":["ai-agents","autogen","aws-cdk","cloudformation","crewai","datadog","dynatrace","graph-analysis","honeycomb","infrastructure-as-code","langgraph","microservices","observability","opentelemetry","pulumi","python","risk-analysis","sdk","spof-detection","topology"],"latest_commit_sha":null,"homepage":" https://pypi.org/project/semanticembed/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jmurray10.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-14T03:11:16.000Z","updated_at":"2026-05-05T04:31:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jmurray10/semanticembed-sdk","commit_stats":null,"previous_names":["jmurray10/semanticembed-sdk"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/jmurray10/semanticembed-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmurray10%2Fsemanticembed-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmurray10%2Fsemanticembed-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmurray10%2Fsemanticembed-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmurray10%2Fsemanticembed-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jmurray10","download_url":"https://codeload.github.com/jmurray10/semanticembed-sdk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmurray10%2Fsemanticembed-sdk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34093774,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","autogen","aws-cdk","cloudformation","crewai","datadog","dynatrace","graph-analysis","honeycomb","infrastructure-as-code","langgraph","microservices","observability","opentelemetry","pulumi","python","risk-analysis","sdk","spof-detection","topology"],"created_at":"2026-06-09T06:00:35.612Z","updated_at":"2026-06-09T06:01:36.409Z","avatar_url":"https://github.com/jmurray10.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SemanticEmbed SDK\n\n[![PyPI](https://img.shields.io/pypi/v/semanticembed.svg)](https://pypi.org/project/semanticembed/)\n[![Python](https://img.shields.io/pypi/pyversions/semanticembed.svg)](https://pypi.org/project/semanticembed/)\n[![CI](https://github.com/jmurray10/semanticembed-sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/jmurray10/semanticembed-sdk/actions/workflows/ci.yml)\n[![License](https://img.shields.io/badge/license-source--available-blue.svg)](LICENSE-FAQ.md)\n[![Free tier](https://img.shields.io/badge/free%20tier-50%20nodes%2C%20no%20signup-brightgreen.svg)](#install)\n[![Patent Pending](https://img.shields.io/badge/patent-%2363%2F994%2C075-orange.svg)](LICENSE-FAQ.md#patent)\n[![Changelog](https://img.shields.io/badge/changelog-current-success.svg)](CHANGELOG.md)\n\n**Structural risk for directed graphs — especially AI agent pipelines.** Six numbers per node. Sub-millisecond server-side compute.\n\nSemanticEmbed computes a 6-dimensional structural encoding for every node in a directed graph. From a bare edge list — no runtime telemetry, no historical data, no tuning — it produces six complementary measurements that capture distinct aspects of each node's structural role (depth, lateral redundancy, community, throughput, path criticality, broadcast vs aggregation).\n\n**Designed for the topologies traditional observability misses:**\n\n- **AI agent pipelines** — vendor concentration, gateway bottlenecks, guardrail SPOFs in LangGraph / CrewAI / AutoGen workflows\n- **Microservices** — SPOFs, amplification cascades, convergence sinks across compose / k8s / Istio\n- **CI/CD and data pipelines** — build graph fragility, ETL bottlenecks, drift gates\n\n\u003e **Live demos:**\n\u003e - **[Hugging Face Space](https://huggingface.co/spaces/jmurray10/semanticembed-agent-risk)** — zero-install. Paste a LangGraph / CrewAI / AutoGen file, get the encoding + risk findings.\n\u003e - **[Demo dashboard](https://semanticembed-dashboard.vercel.app/)** — interactive 6D explorer with 4 reference apps (sign-in required; click \"Try Demo\" on the login page for a no-account walkthrough).\n\n\u003e **Validated against production incidents.** In a blind test against a live production Dynatrace environment (108 services, 569 topology-relevant incidents over 30 days), **79.6%** of incidents (453/569) occurred on nodes that 6D structural analysis had flagged as risky — from the call graph alone, before any incident occurred. See [validation methodology](docs/validation_methodology.md).\n\n---\n\n## Why 6D?\n\nObservability tools tell you **what broke**. SemanticEmbed tells you **what will break** — from topology alone.\n\n- **No agents, no instrumentation** — just an edge list\n- **Sub-millisecond server-side compute** — the encoding kernel itself runs in \u003c1 ms on a 100-node graph; full HTTP round-trip via the cloud API is typically 0.5–2 s including network\n- **Works on any directed graph** — AI agent pipelines, microservices, data workflows, CI/CD\n- **Complementary structural axes** — six dimensions, each captures risk signals the others cannot\n- **14 deterministic edge parsers + 3 live connectors** — go from real infra to encoded result in 2 lines\n\n---\n\n## Install\n\n```bash\npip install semanticembed              # core\npip install 'semanticembed[extract]'   # adds pyyaml for k8s/CFN/CDK parsing\npip install 'semanticembed[agent-claude]'  # adds Claude agent CLI\n```\n\n**Free tier:** up to 50 nodes per graph, no signup. See [CHANGELOG](CHANGELOG.md) for what's new.\n\n---\n\n## Quick Start — from real infra to risk in 2 lines\n\n```python\nimport semanticembed as se\n\n# Auto-discover edges from any directory: docker-compose, k8s, terraform,\n# CloudFormation, AWS CDK, Pulumi, GitHub Actions, package.json,\n# pyproject.toml, OTel traces, Python imports, LangGraph, CrewAI, AutoGen.\nedges, sources = se.extract.from_directory(\".\")\nprint(f\"Found {len(edges)} edges from {sources}\")\n\n# 6D encode + structural risk analysis (sub-millisecond on the server side).\nresult = se.encode(edges)\nprint(result.table)\nprint(se.report(result))\n```\n\nOutput:\n\n```\nSTRUCTURAL RISK REPORT\n======================\n\nAMPLIFICATION RISKS (high fanout, high criticality):\n  - api-gateway    | fanout=0.667 | criticality=0.556\n\nCONVERGENCE SINKS (low independence, many upstream callers):\n  - database       | independence=0.000\n\nSTRUCTURAL SPOF (low independence, high upstream dependency):\n  - api-gateway    | independence=0.000 | every request flows through this node\n```\n\n**Or try it without installing** — [open the Quickstart in Google Colab](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/01_quickstart.ipynb).\n\n---\n\n## What It Finds That Other Tools Miss\n\n| Your current tools | SemanticEmbed |\n|---|---|\n| This service has high latency | This service is on 89% of all paths (structural SPOF) |\n| This service had 5 errors | This service fans out to 12 downstream services (amplification risk) |\n| This service is healthy | This service has zero lateral redundancy (convergence sink) |\n\nRuntime monitoring tells you what is slow **now**. Structural analysis tells you what **will** cause cascading failures regardless of current load.\n\n---\n\n## The Six Dimensions\n\nEvery node gets six complementary structural measurements:\n\n| Dimension | What It Measures | Risk Signal |\n|-----------|-----------------|-------------|\n| **Depth** | Position in the execution pipeline (0.0 = entry, 1.0 = deepest) | Deep nodes accumulate upstream latency |\n| **Independence** | Lateral redundancy at the same pipeline stage | Low independence = structural chokepoint |\n| **Hierarchy** | Module or group membership | Cross-module dependencies = blast radius |\n| **Throughput** | Fraction of total traffic flowing through the node | High throughput + low independence = hidden bottleneck |\n| **Criticality** | Fraction of end-to-end paths depending on this node | High criticality = SPOF |\n| **Fanout** | Broadcaster (1.0) vs aggregator (0.0) | High fanout = amplification risk |\n\nThese six properties capture complementary structural information. The\nrisk patterns documented below combine specific axes; no single axis is a\ncomplete risk signal on its own.\n\nSee [docs/dimensions.md](docs/dimensions.md) for axis definitions, the\nformal invariance properties of the encoding, and the empirical\ncorrelation results vs standard graph centrality.\n\n---\n\n## Use Cases\n\n**Microservice architectures** -- Find SPOFs, amplification cascades, and convergence bottlenecks in any service mesh. Works with Kubernetes, Istio, OTel traces, or static architecture diagrams.\n\n**AI agent pipelines** -- Identify vendor concentration risk, gateway bottlenecks, and guardrail single points of failure in LLM orchestration graphs.\n\n**CI/CD and data pipelines** -- Detect structural fragility in build graphs, ETL workflows, and deployment pipelines before they cause cascading failures.\n\n**Architecture drift monitoring** -- Compare structural fingerprints across releases. Know exactly which services changed structural role and by how much.\n\n---\n\n## What's new in v0.7\n\n- **Modern AutoGen patterns + lenient edge parser + better error messages** (v0.7.3)\n- **`live.from_dynatrace` / `from_honeycomb` / `from_datadog`** — pull real call edges from running infra (v0.5–v0.7)\n- **OpenTelemetry trace ingestion** — auto-detects OTLP / Jaeger / Zipkin (v0.3)\n- **AI agent framework parsers** — `from_langgraph`, `from_crewai`, `from_autogen`, AST-only, no need to install the framework (v0.4)\n- **IaC parsers** — CloudFormation, AWS CDK (Python), Pulumi (Python) (v0.6)\n- **Async surface** — `await aencode(...)`, `aencode_diff()` runs both encodes in parallel (v0.7.1)\n- **`encode(cache=True)`** — skip the HTTP round trip on repeat calls (v0.4.1)\n- **`dedupe_edges`** — canonicalize names when blending multiple sources (v0.3)\n- **One-retry-on-5xx** — every connector handles transient failures (v0.7.2)\n- **`semanticembed-agent` console script** — interactive shell for non-programmer users (v0.5.1)\n\nFull details in the [CHANGELOG](CHANGELOG.md).\n\n---\n\n## Notebooks\n\nStep-by-step Colab notebooks. Click to open, run in your browser.\n\n| Notebook | Use Case | What You Learn |\n|----------|----------|---------------|\n| [01 - Quickstart](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/01_quickstart.ipynb) | Getting started | Install, encode a graph, read the risk report |\n| [02 - Dimensions Deep Dive](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/02_dimensions.ipynb) | Understanding 6D | What each dimension means, with worked examples |\n| [03 - Drift Detection](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/03_drift_detection.ipynb) | Architecture drift | Compare graph versions, detect structural changes |\n| [04 - Bring Your Own Graph](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/04_bring_your_own.ipynb) | Any graph | Load from JSON, OTel traces, or Kubernetes |\n| [05 - AI Agent Pipelines](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/05_ai_agent_pipelines.ipynb) | AI/LLM agents | Vendor concentration, gateway bottlenecks, guardrail SPOFs |\n| [06 - CI/CD \u0026 Data Pipelines](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/06_cicd_pipelines.ipynb) | CI/CD \u0026 ETL | Build graph fragility, pipeline bottlenecks, drift gates |\n| [07 - OpenTelemetry](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/07_opentelemetry.ipynb) | OTel traces | Extract edges from traces, structural analysis, CI/CD gates |\n| [08 - Qwen Compression](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/08_qwen_compression.ipynb) | LLM compression | Structural pruning of Qwen2.5-7B, 10% speedup at Grade A |\n| [09 - Quantum Reachability (IBM Q free tier)](https://colab.research.google.com/github/jmurray10/semanticembed-sdk/blob/main/notebooks/09_quantum_reachability.ipynb) | Quantum cross-validation | Continuous-time quantum walk on a directed graph, run on IBM Q Open Plan, cross-checked vs SDK criticality |\n\n---\n\n## Extract Edges from Infrastructure\n\nDon't have an edge list? The `extract` module parses common infrastructure files automatically.\n\n```python\nimport semanticembed as se\n\n# From Docker Compose\nedges = se.extract.from_docker_compose(\"docker-compose.yml\")\n\n# From Kubernetes manifests\nedges = se.extract.from_kubernetes(\"k8s/\")\n\n# From GitHub Actions workflows\nedges = se.extract.from_github_actions(\".github/workflows\")\n\n# From Terraform\nedges = se.extract.from_terraform(\"infra/\")\n\n# From CloudFormation (YAML or JSON)\nedges = se.extract.from_cloudformation(\"template.yaml\")\n\n# From AWS CDK (Python)\nedges = se.extract.from_aws_cdk(\"app.py\")\n\n# From Pulumi (Python)\nedges = se.extract.from_pulumi(\"__main__.py\")\n\n# From Python imports (module dependency graph)\nedges = se.extract.from_python_imports(\"src/\")\n\n# From Node.js monorepo (inter-package dependencies)\nedges = se.extract.from_package_json_workspaces(\".\")\n\n# From OpenTelemetry traces (OTLP / Jaeger / Zipkin JSON)\nedges = se.extract.from_otel_traces(\"traces.json\")\n\n# From AI agent frameworks (AST-only — no need to install the framework)\nedges = se.extract.from_langgraph(\"workflow.py\")   # StateGraph.add_edge / add_conditional_edges / set_entry_point\nedges = se.extract.from_crewai(\"crew.py\")          # Task(agent=...) / Task(context=...) / Crew(manager_agent=...)\nedges = se.extract.from_autogen(\"agents.py\")       # GroupChat(agents=...) / initiate_chat(...)\n\n# Auto-detect everything in a directory\nedges, sources = se.extract.from_directory(\".\")\nprint(f\"Found {len(edges)} edges from {sources}\")\n\n# Then encode as usual\nresult = se.encode(edges)\nprint(result.table)\n```\n\nRequires `pyyaml` for YAML parsing: `pip install 'semanticembed[extract]'`\n\n### Trace ingestion (highest-fidelity edges)\n\nCompose / k8s / Terraform describe deployment, not actual call edges. **Real\nruntime traces are the only source with the actual call graph.** v0.3.0 ships\na deterministic parser for the three common JSON formats:\n\n- **OTLP** (OpenTelemetry Collector / SDK exports): `{\"resourceSpans\": [...]}`\n- **Jaeger** (`jaeger-query` API, `jaeger-cli`): `{\"data\": [{\"spans\": [...]}]}`\n- **Zipkin** (Zipkin v2 API): top-level array with `localEndpoint.serviceName`\n\nEdges are emitted at the **service level** — same-service spans roll up. Place\na `traces.json` (or `otel.json` / `jaeger.json` / `zipkin.json`) at your repo\nroot and `from_directory()` will pick it up.\n\n### Live observability connectors\n\nStatic analysis is great for repos. For *running* infra, pull traces directly:\n\n```python\nfrom semanticembed import live\n\n# Dynatrace — Smartscape services + call relationships\nedges = live.from_dynatrace(\n    env_url=\"https://abc12345.live.dynatrace.com\",\n    api_token=os.environ[\"DYNATRACE_API_TOKEN\"],\n)\n\n# Honeycomb — Query API over a dataset\nedges = live.from_honeycomb(\n    dataset=\"my-app-prod\",\n    api_key=os.environ[\"HONEYCOMB_API_KEY\"],\n    lookback_seconds=900,\n)\n\n# Datadog — Spans Search API\nedges = live.from_datadog(\n    api_key=os.environ[\"DD_API_KEY\"],\n    app_key=os.environ[\"DD_APP_KEY\"],\n    env=\"prod\",\n    lookback=\"now-30m\",\n)\n```\n\n### AI agent frameworks\n\nThe three popular Python agent frameworks each have an explicit graph-building\nAPI. Static AST parsing extracts the actual call graph the framework will run.\nThe SDK does **not** import or run the framework — you don't need\n`pip install langgraph` to extract from a LangGraph script.\n\n**LangGraph** — `g.add_edge`, `g.add_conditional_edges` (with explicit\n`path_map`), `g.set_entry_point`, `g.set_finish_point`. The sentinels `START`\nand `END` are emitted as literal node names.\n\n**CrewAI** — `Task(agent=researcher)` produces `researcher -\u003e task_var`;\n`Task(context=[t1, t2])` produces `t1 -\u003e task_var` / `t2 -\u003e task_var`;\n`Crew(manager_agent=mgr)` adds a `mgr -\u003e agent` fan-out.\n\n**AutoGen** — `GroupChat(agents=[a, b, c])` with an explicit\n`GroupChatManager` produces a star (`manager -\u003e a`, `-\u003e b`, `-\u003e c`).\nWithout a manager, it's fully connected. `x.initiate_chat(y)` always\nproduces `x -\u003e y`.\n\n`from_directory()` auto-detects these by scanning Python files for the\nrelevant `import` statements and only running the matching parser on those\nfiles (cheap and accurate vs. walking the whole tree).\n\n### Blending sources cleanly\n\nCombining traces + compose + Python imports usually produces the same logical\nservice under several names (`auth-svc`, `auth_svc`, `AuthService`). Use\n`dedupe_edges` to canonicalize:\n\n```python\ncompose_edges, _ = se.extract.from_directory(\".\")\ntrace_edges = se.extract.from_otel_traces(\"traces.json\")\n\nedges = se.dedupe_edges(\n    list(compose_edges) + trace_edges,\n    normalize=\"snake\",                          # AuthService -\u003e auth_service\n    aliases={\"auth_svc\": \"auth_service\"},       # explicit overrides\n)\nresult = se.encode(edges)\n```\n\nModes: `\"none\"` (default), `\"snake\"`, `\"lower\"`, `\"kebab\"`. Self-loops are\ndropped by default.\n\n---\n\n## LLM-Powered Analysis\n\nGet plain-language explanations and actionable recommendations using your own LLM key.\n\n```python\nimport semanticembed as se\n\nresult = se.encode(edges)\n\n# One-shot analysis (OpenAI, Anthropic, or local Ollama)\nprint(se.explain(result, model=\"gpt-4o-mini\", api_key=\"sk-...\"))\nprint(se.explain(result, model=\"claude-sonnet-4-5\", api_key=\"sk-ant-...\"))\nprint(se.explain(result, model=\"ollama/llama3\"))  # local, no key needed\n\n# Follow-up questions\nanswer = se.ask(result, \"What happens if the database goes down?\",\n                model=\"gpt-4o-mini\", api_key=\"sk-...\")\n```\n\nThe LLM sees only the encoding output (6D vectors, risk report) -- never the algorithm.\n\n---\n\n## Structural Diff\n\nCompare two graph versions in one call:\n\n```python\nchanges = se.encode_diff(edges_v1, edges_v2)\nfor node, deltas in changes.items():\n    for dim, info in deltas.items():\n        print(f\"{node}.{dim}: {info['before']:.3f} -\u003e {info['after']:.3f}\")\n```\n\n---\n\n## Agent\n\nAn autonomous agent that scans your repo, extracts edges, encodes, and explains results interactively. Choose your LLM backend:\n\n```bash\n# Claude agent (installs the agent code + the Anthropic agent SDK)\npip install 'semanticembed[agent-claude]'\nexport ANTHROPIC_API_KEY=sk-ant-...\nsemanticembed-agent              # interactive\nsemanticembed-agent --ask \"What is my biggest SPOF?\"\n\n# Gemini agent\npip install 'semanticembed[agent-gemini]'\nexport GOOGLE_API_KEY=...\nsemanticembed-gemini-agent\n```\n\nBoth binaries are also reachable as `python -m semanticembed.agent` /\n`python -m semanticembed.agent.gemini_agent`.\n\nThe agent has 7 tools: scan, extract (docker-compose, k8s, Python imports), encode, diff, and simulate architecture changes. See [src/semanticembed/agent/README.md](src/semanticembed/agent/README.md) for full docs.\n\n### What gets sent where\n\nBe explicit about data egress before pointing the agent at private architecture:\n\n- **Claude agent** (`semanticembed-agent` / `python -m semanticembed.agent`): the LLM reads tool outputs as conversation context, so the contents of `docker-compose.yml`, Kubernetes manifests, Terraform `.tf` files, Python source, and `package.json` files in your project go to **Anthropic's API** along with your prompts. Conversation history is governed by Anthropic's data-use policies.\n- **Gemini agent** (`semanticembed-gemini-agent` / `python -m semanticembed.agent.gemini_agent`): same data flow, sent to **Google's API** instead.\n- **Claude Code skill** (`skill/analyze.py`): runs **inside Claude Code** — uses the parent agent for any natural-language extraction, the SDK for the deterministic scan + encoding. No second LLM, no Ollama dependency.\n- **Cloud `encode()` call**: only the **edge list** (node names, e.g. `[\"frontend\", \"auth\"]`) goes to the SemanticEmbed Railway endpoint. File contents are never sent.\n\nIf your topology is sensitive, pre-extract edges deterministically with `se.extract.from_directory()` and call `se.encode()` directly — that path sends only the edge list.\n\n---\n\n## Example Graphs\n\nThe `examples/` directory contains ready-to-encode edge lists and parsable\nframework files. None of the `.py` examples need to be runnable — the SDK\nparses them via AST without importing the framework.\n\n**Edge-list JSON** — load with `se.encode_file(path)`:\n\n| File | Application | Nodes | Edges |\n|------|------------|-------|-------|\n| [google_online_boutique.json](examples/google_online_boutique.json) | Google Online Boutique (microservices) | 11 | 15 |\n| [weaveworks_sock_shop.json](examples/weaveworks_sock_shop.json) | Weaveworks Sock Shop (microservices) | 14 | 15 |\n| [ai_agent_pipeline.json](examples/ai_agent_pipeline.json) | Multi-agent LLM orchestration | 12 | 15 |\n| [cicd_pipeline.json](examples/cicd_pipeline.json) | CI/CD build pipeline | 12 | 17 |\n| [sample_pipeline.json](examples/sample_pipeline.json) | Minimal 7-node starter | 7 | 8 |\n\n**AI-framework Python sources** — parse with the matching extractor:\n\n| File | Extractor | Edges |\n|------|-----------|-------|\n| [langgraph_research_agent.py](examples/langgraph_research_agent.py) | `from_langgraph` | 6 |\n| [crewai_content_pipeline.py](examples/crewai_content_pipeline.py) | `from_crewai` | 11 |\n| [autogen_codereview.py](examples/autogen_codereview.py) | `from_autogen` | 5 |\n\n---\n\n## React Components\n\nDrop-in React components for rendering SDK results. See [examples/react/](examples/react/) for the full source.\n\n| Component | What it renders |\n|-----------|----------------|\n| `useSemanticEmbed.ts` | React hook — call `encode()` from your frontend |\n| `RiskTable.tsx` | Sortable risk table with severity badges |\n| `RadarChart.tsx` | 6D radar chart comparing node profiles |\n| `TopologySummary.tsx` | KPI cards + risk breakdown |\n\n```tsx\nimport { useSemanticEmbed } from './useSemanticEmbed';\nimport { RiskTable } from './RiskTable';\n\nfunction App() {\n  const { result, loading, encode } = useSemanticEmbed();\n  return (\n    \u003c\u003e\n      \u003cbutton onClick={() =\u003e encode([[\"A\",\"B\"],[\"B\",\"C\"],[\"C\",\"D\"]])}\u003eAnalyze\u003c/button\u003e\n      {result \u0026\u0026 \u003cRiskTable risks={result.risks} /\u003e}\n    \u003c/\u003e\n  );\n}\n```\n\n---\n\n## Input Format\n\nSemanticEmbed accepts any directed graph as an edge list.\n\n```python\n# Python tuples\nedges = [(\"A\", \"B\"), (\"B\", \"C\")]\nresult = encode(edges)\n\n# JSON file\nresult = encode_file(\"my_graph.json\")\n```\n\nJSON format:\n\n```json\n{\n  \"edges\": [\n    {\"source\": \"A\", \"target\": \"B\"},\n    {\"source\": \"B\", \"target\": \"C\"}\n  ]\n}\n```\n\nSee [docs/input_format.md](docs/input_format.md) for the full spec.\n\n---\n\n## Documentation\n\n| Document | Description |\n|----------|-------------|\n| [docs/getting_started.md](docs/getting_started.md) | Install, encode, read results, export -- one page |\n| [docs/api_reference.md](docs/api_reference.md) | Every function, class, parameter, and return type |\n| [docs/dimensions.md](docs/dimensions.md) | The six structural dimensions -- full reference |\n| [docs/input_format.md](docs/input_format.md) | Edge list input specification |\n| [docs/output_format.md](docs/output_format.md) | Encoding output and risk report format |\n\n---\n\n## License\n\n**Source-available, with a free tier — no signup, no credit card.** The free\ntier encodes graphs up to 50 nodes; the paid tier unlocks larger graphs and\ncontinuous monitoring. The client, parsers, and connectors in this repo are\npublic source, so you can read exactly what runs and what leaves your machine.\n\nThis is the same \"source-available SDK, proprietary service\" model Stripe,\nSnowflake, and Anthropic use: the encoding algorithm runs server-side and is\npatent-pending (#63/994,075), but everything in this repo is yours to read.\nSee [LICENSE](LICENSE) and [LICENSE-FAQ](LICENSE-FAQ.md) for terms.\n\n**Patent pending.** Application #63/994,075.\n\n---\n\n## Contact\n\nBuilt by **Jeff Murray** ([@jmurray10](https://github.com/jmurray10)).\n\n- Email: **jeffmurr@seas.upenn.edu**\n- LinkedIn: [linkedin.com/in/jeff-murray-ai](https://www.linkedin.com/in/jeff-murray-ai)\n- GitHub: [@jmurray10](https://github.com/jmurray10)\n- License inquiries, design partnerships, and YC/investor introductions: same email.\n\nFor algorithm / encoding / scoring questions (server-side, not in this\nrepo): same email — please put `[encoding]` in the subject line.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmurray10%2Fsemanticembed-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjmurray10%2Fsemanticembed-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmurray10%2Fsemanticembed-sdk/lists"}