{"id":28105093,"url":"https://github.com/shcherbak-ai/contextgem","last_synced_at":"2025-05-13T21:51:03.160Z","repository":{"id":286513270,"uuid":"871373324","full_name":"shcherbak-ai/contextgem","owner":"shcherbak-ai","description":"ContextGem: Effortless LLM extraction from documents","archived":false,"fork":false,"pushed_at":"2025-05-08T22:52:23.000Z","size":10202,"stargazers_count":313,"open_issues_count":1,"forks_count":26,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-05-08T23:33:12.730Z","etag":null,"topics":["ai","contract-analysis","data-extraction","document-intelligence","docx","docx2md","docx2txt","generative-ai","legaltech","llm","llm-extraction","llm-framework","llm-pipeline","llms","nlp","prompt-engineering","text-analysis","unstructured-data"],"latest_commit_sha":null,"homepage":"https://contextgem.dev/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shcherbak-ai.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":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-10-11T20:36:09.000Z","updated_at":"2025-05-08T23:11:00.000Z","dependencies_parsed_at":"2025-05-08T23:28:22.356Z","dependency_job_id":"eb4edc89-c133-4de9-992c-ab9ff9c10627","html_url":"https://github.com/shcherbak-ai/contextgem","commit_stats":null,"previous_names":["shcherbak-ai/contextgem"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shcherbak-ai%2Fcontextgem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shcherbak-ai%2Fcontextgem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shcherbak-ai%2Fcontextgem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shcherbak-ai%2Fcontextgem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shcherbak-ai","download_url":"https://codeload.github.com/shcherbak-ai/contextgem/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254036476,"owners_count":22003651,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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","contract-analysis","data-extraction","document-intelligence","docx","docx2md","docx2txt","generative-ai","legaltech","llm","llm-extraction","llm-framework","llm-pipeline","llms","nlp","prompt-engineering","text-analysis","unstructured-data"],"created_at":"2025-05-13T21:51:02.454Z","updated_at":"2025-05-13T21:51:03.137Z","avatar_url":"https://github.com/shcherbak-ai.png","language":"Python","funding_links":[],"categories":["关系抽取_信息抽取","数据 Data","Machine Learning","5. Retrieval-Augmented Generation (RAG) \u0026 Knowledge","AI \u0026 LLM","Machine Learning Datasets \u0026 Corpora"],"sub_categories":["大语言对话模型及数据","LLM Apps \u0026 Interfaces","Data Extraction \u0026 Processing Tools"],"readme":"![ContextGem](https://contextgem.dev/_static/contextgem_readme_header.png \"ContextGem - Effortless LLM extraction from documents\")\n\n# ContextGem: Effortless LLM extraction from documents\n\n[![tests](https://github.com/shcherbak-ai/contextgem/actions/workflows/ci-tests.yml/badge.svg?branch=main)](https://github.com/shcherbak-ai/contextgem/actions/workflows/ci-tests.yml)\n[![Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/SergiiShcherbak/daaee00e1dfff7a29ca10a922ec3becd/raw/coverage.json)](https://github.com/shcherbak-ai/contextgem/actions)\n[![docs](https://github.com/shcherbak-ai/contextgem/actions/workflows/docs.yml/badge.svg?branch=main)](https://github.com/shcherbak-ai/contextgem/actions/workflows/docs.yml)\n[![documentation](https://img.shields.io/badge/docs-latest-blue.svg)](https://shcherbak-ai.github.io/contextgem/)\n[![License](https://img.shields.io/badge/License-Apache_2.0-bright.svg)](https://opensource.org/licenses/Apache-2.0)\n![PyPI](https://img.shields.io/pypi/v/contextgem)\n[![Python Versions](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)](https://www.python.org/downloads/)\n[![Code Security](https://github.com/shcherbak-ai/contextgem/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/shcherbak-ai/contextgem/actions/workflows/codeql.yml)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat)](https://pycqa.github.io/isort/)\n[![Pydantic v2](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/pydantic/pydantic/main/docs/badge/v2.json)](https://pydantic.dev)\n[![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/)\n[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-blue?logo=pre-commit\u0026logoColor=white)](https://github.com/pre-commit/pre-commit)\n[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](CODE_OF_CONDUCT.md)\n[![DeepWiki](https://img.shields.io/static/v1?label=DeepWiki\u0026message=Chat%20with%20Code\u0026labelColor=%23283593\u0026color=%237E57C2\u0026style=flat-square)](https://deepwiki.com/shcherbak-ai/contextgem)\n\n\u003cimg src=\"https://contextgem.dev/_static/tab_solid.png\" alt=\"ContextGem: 2nd Product of the week\" width=\"250\"\u003e\n\u003cbr/\u003e\u003cbr/\u003e\n\nContextGem is a free, open-source LLM framework that makes it radically easier to extract structured data and insights from documents — with minimal code.\n\n\n## 💎 Why ContextGem?\n\nMost popular LLM frameworks for extracting structured data from documents require extensive boilerplate code to extract even basic information. This significantly increases development time and complexity.\n\nContextGem addresses this challenge by providing a flexible, intuitive framework that extracts structured data and insights from documents with minimal effort. Complex, most time-consuming parts are handled with **powerful abstractions**, eliminating boilerplate code and reducing development overhead.\n\nRead more on the project [motivation](https://contextgem.dev/motivation.html) in the documentation.\n\n\n## ⭐ Key features\n\n\u003ctable\u003e\n    \u003cthead\u003e\n        \u003ctr style=\"text-align: left; opacity: 0.8;\"\u003e\n            \u003cth style=\"width: 75%\"\u003eBuilt-in abstractions\u003c/th\u003e\n            \u003cth style=\"width: 10%\"\u003e\u003cstrong\u003eContextGem\u003c/strong\u003e\u003c/th\u003e\n            \u003cth style=\"width: 15%\"\u003eOther LLM frameworks*\u003c/th\u003e\n        \u003c/tr\u003e\n    \u003c/thead\u003e\n    \u003ctbody\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Automated dynamic prompts\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e◯\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Automated data modelling and validators\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e◯\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Precise granular reference mapping (paragraphs \u0026 sentences)\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e◯\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Justifications (reasoning backing the extraction)\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e◯\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Neural segmentation (SaT)\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e◯\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Multilingual support (I/O without prompting)\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e◯\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Single, unified extraction pipeline (declarative, reusable, fully serializable)\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e🟡\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Grouped LLMs with role-specific tasks\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e🟡\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Nested context extraction\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e🟡\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Unified, fully serializable results storage model (document)\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e🟡\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Extraction task calibration with examples\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e🟡\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Built-in concurrent I/O processing\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e🟡\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Automated usage \u0026 costs tracking\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e🟡\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Fallback and retry logic\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003e\n                Multiple LLM providers\n            \u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n            \u003ctd\u003e🟢\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/tbody\u003e\n\u003c/table\u003e\n\n🟢 - fully supported - no additional setup required\u003cbr\u003e\n🟡 - partially supported - requires additional setup\u003cbr\u003e\n◯ - not supported - requires custom logic\n\n\\* See [descriptions](https://contextgem.dev/motivation.html#the-contextgem-solution) of ContextGem abstractions and [comparisons](https://contextgem.dev/vs_other_frameworks.html) of specific implementation examples using ContextGem and other popular open-source LLM frameworks.\n\n\n## 💡 With **minimal code**, you can:\n\n- **Extract structured data** from documents (text, images)\n- **Identify and analyze key aspects** (topics, themes, categories) within documents\n- **Extract specific concepts** (entities, facts, conclusions, assessments) from documents\n- **Build complex extraction workflows** through a simple, intuitive API\n- **Create multi-level extraction pipelines** (aspects containing concepts, hierarchical aspects)\n\n\u003cbr/\u003e\n\n![ContextGem extraction example](https://contextgem.dev/_static/readme_code_snippet.png \"ContextGem extraction example\")\n\n\n## 📦 Installation\n\n```bash\npip install -U contextgem\n```\n\n\n## 🚀 Quick start\n\n```python\n# Quick Start Example - Extracting anomalies from a document, with source references and justifications\n\nimport os\n\nfrom contextgem import Document, DocumentLLM, StringConcept\n\n# Sample document text (shortened for brevity)\ndoc = Document(\n    raw_text=(\n        \"Consultancy Agreement\\n\"\n        \"This agreement between Company A (Supplier) and Company B (Customer)...\\n\"\n        \"The term of the agreement is 1 year from the Effective Date...\\n\"\n        \"The Supplier shall provide consultancy services as described in Annex 2...\\n\"\n        \"The Customer shall pay the Supplier within 30 calendar days of receiving an invoice...\\n\"\n        \"The purple elephant danced gracefully on the moon while eating ice cream.\\n\"  # 💎 anomaly\n        \"This agreement is governed by the laws of Norway...\\n\"\n    ),\n)\n\n# Attach a document-level concept\ndoc.concepts = [\n    StringConcept(\n        name=\"Anomalies\",  # in longer contexts, this concept is hard to capture with RAG\n        description=\"Anomalies in the document\",\n        add_references=True,\n        reference_depth=\"sentences\",\n        add_justifications=True,\n        justification_depth=\"brief\",\n        # see the docs for more configuration options\n    )\n    # add more concepts to the document, if needed\n    # see the docs for available concepts: StringConcept, JsonObjectConcept, etc.\n]\n# Or use `doc.add_concepts([...])`\n\n# Define an LLM for extracting information from the document\nllm = DocumentLLM(\n    model=\"openai/gpt-4o-mini\",  # or another provider/LLM\n    api_key=os.environ.get(\n        \"CONTEXTGEM_OPENAI_API_KEY\"\n    ),  # your API key for the LLM provider\n    # see the docs for more configuration options\n)\n\n# Extract information from the document\ndoc = llm.extract_all(doc)  # or use async version `await llm.extract_all_async(doc)`\n\n# Access extracted information in the document object\nprint(\n    doc.concepts[0].extracted_items\n)  # extracted items with references \u0026 justifications\n# or `doc.get_concept_by_name(\"Anomalies\").extracted_items`\n\n```\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/shcherbak-ai/contextgem/blob/main/dev/notebooks/readme/quickstart_concept.ipynb)\n\n---\n\nSee more examples in the documentation:\n\n### Basic usage examples\n- [Aspect Extraction from Document](https://contextgem.dev/quickstart.html#aspect-extraction-from-document)\n- [Extracting Aspect with Sub-Aspects](https://contextgem.dev/quickstart.html#extracting-aspect-with-sub-aspects)\n- [Concept Extraction from Aspect](https://contextgem.dev/quickstart.html#concept-extraction-from-aspect)\n- [Concept Extraction from Document (text)](https://contextgem.dev/quickstart.html#concept-extraction-from-document-text)\n- [Concept Extraction from Document (vision)](https://contextgem.dev/quickstart.html#concept-extraction-from-document-vision)\n- [LLM chat interface](https://contextgem.dev/quickstart.html#lightweight-llm-chat-interface)\n\n### Advanced usage examples\n- [Extracting Aspects Containing Concepts](https://contextgem.dev/advanced_usage.html#extracting-aspects-with-concepts)\n- [Extracting Aspects and Concepts from a Document](https://contextgem.dev/advanced_usage.html#extracting-aspects-and-concepts-from-a-document)\n- [Using a Multi-LLM Pipeline to Extract Data from Several Documents](https://contextgem.dev/advanced_usage.html#using-a-multi-llm-pipeline-to-extract-data-from-several-documents)\n\n\n## 🔄 Document converters\n\nTo create a ContextGem document for LLM analysis, you can either pass raw text directly, or use built-in converters that handle various file formats.\n\n### 📄 DOCX converter\n\nContextGem provides built-in converter to easily transform DOCX files into LLM-ready data.\n\n- Extracts information that other open-source tools often do not capture: misaligned tables, comments, footnotes, textboxes, headers/footers, and embedded images\n- Preserves document structure with rich metadata for improved LLM analysis\n\n```python\n# Using ContextGem's DocxConverter\n\nfrom contextgem import DocxConverter\n\nconverter = DocxConverter()\n\n# Convert a DOCX file to an LLM-ready ContextGem Document\n# from path\ndocument = converter.convert(\"path/to/document.docx\")\n# or from file object\nwith open(\"path/to/document.docx\", \"rb\") as docx_file_object:\n    document = converter.convert(docx_file_object)\n\n# You can also use it as a standalone text extractor\ndocx_text = converter.convert_to_text_format(\n    \"path/to/document.docx\",\n    output_format=\"markdown\",  # or \"raw\"\n)\n\n```\n\nLearn more about [DOCX converter features](https://contextgem.dev/converters/docx.html) in the documentation.\n\n\n## 🎯 Focused document analysis\n\nContextGem leverages LLMs' long context windows to deliver superior extraction accuracy from individual documents. Unlike RAG approaches that often [struggle with complex concepts and nuanced insights](https://www.linkedin.com/pulse/raging-contracts-pitfalls-rag-contract-review-shcherbak-ai-ptg3f), ContextGem capitalizes on [continuously expanding context capacity](https://arxiv.org/abs/2502.12962), evolving LLM capabilities, and decreasing costs. This focused approach enables direct information extraction from complete documents, eliminating retrieval inconsistencies while optimizing for in-depth single-document analysis. While this delivers higher accuracy for individual documents, ContextGem does not currently support cross-document querying or corpus-wide retrieval - for these use cases, modern RAG systems (e.g., LlamaIndex, Haystack) remain more appropriate.\n\nRead more on [how ContextGem works](https://contextgem.dev/how_it_works.html) in the documentation.\n\n\n## 🤖 Supported LLMs\n\nContextGem supports both cloud-based and local LLMs through [LiteLLM](https://github.com/BerriAI/litellm) integration:\n- **Cloud LLMs**: OpenAI, Anthropic, Google, Azure OpenAI, and more\n- **Local LLMs**: Run models locally using providers like Ollama, LM Studio, etc.\n- **Model Architectures**: Works with both reasoning/CoT-capable (e.g. o4-mini) and non-reasoning models (e.g. gpt-4.1)\n- **Simple API**: Unified interface for all LLMs with easy provider switching\n\nLearn more about [supported LLM providers and models](https://contextgem.dev/llms/supported_llms.html) and how to [configure LLMs](https://contextgem.dev/llms/llm_config.html) in the documentation.\n\n\n## ⚡ Optimizations\n\nContextGem documentation offers guidance on optimization strategies to maximize performance, minimize costs, and enhance extraction accuracy:\n\n- [Optimizing for Accuracy](https://contextgem.dev/optimizations/optimization_accuracy.html)\n- [Optimizing for Speed](https://contextgem.dev/optimizations/optimization_speed.html)\n- [Optimizing for Cost](https://contextgem.dev/optimizations/optimization_cost.html)\n- [Dealing with Long Documents](https://contextgem.dev/optimizations/optimization_long_docs.html)\n- [Choosing the Right LLM(s)](https://contextgem.dev/optimizations/optimization_choosing_llm.html)\n\n\n## 💾 Serializing results\n\nContextGem allows you to save and load Document objects, pipelines, and LLM configurations with built-in serialization methods:\n\n- Save processed documents to avoid repeating expensive LLM calls\n- Transfer extraction results between systems\n- Persist pipeline and LLM configurations for later reuse\n\nLearn more about [serialization options](https://contextgem.dev/serialization.html) in the documentation.\n\n\n## 📚 Documentation\n\nFull documentation is available at [contextgem.dev](https://contextgem.dev).\n\nA raw text version of the full documentation is available at [`docs/docs-raw-for-llm.txt`](https://github.com/shcherbak-ai/contextgem/blob/main/docs/docs-raw-for-llm.txt). This file is automatically generated and contains all documentation in a format optimized for LLM ingestion (e.g. for Q\u0026A).\n\nYou can also explore the repository through [DeepWiki](https://deepwiki.com/shcherbak-ai/contextgem), an AI-powered conversational interface that provides visual architecture maps and natural language Q\u0026A for the codebase.\n\n\n## 💬 Community\n\nIf you have a feature request or a bug report, feel free to [open an issue](https://github.com/shcherbak-ai/contextgem/issues/new) on GitHub. If you'd like to discuss a topic or get general advice on using ContextGem for your project, start a thread in [GitHub Discussions](https://github.com/shcherbak-ai/contextgem/discussions/new/).\n\n\n## 🤝 Contributing\n\nWe welcome contributions from the community - whether it's fixing a typo or developing a completely new feature! To get started, please check out our [Contributor Guidelines](https://github.com/shcherbak-ai/contextgem/blob/main/CONTRIBUTING.md).\n\n\n## 🔐 Security\n\nThis project is automatically scanned for security vulnerabilities using [CodeQL](https://codeql.github.com/). We also use [Snyk](https://snyk.io) as needed for supplementary dependency checks.\n\nSee [SECURITY](https://github.com/shcherbak-ai/contextgem/blob/main/SECURITY.md) file for details.\n\n\n## 💖 Acknowledgements\n\nContextGem relies on these excellent open-source packages:\n\n- [pydantic](https://github.com/pydantic/pydantic): The gold standard for data validation\n- [Jinja2](https://github.com/pallets/jinja): Fast, expressive template engine that powers our dynamic prompt rendering\n- [litellm](https://github.com/BerriAI/litellm): Unified interface to multiple LLM providers with seamless provider switching\n- [wtpsplit](https://github.com/segment-any-text/wtpsplit): State-of-the-art text segmentation tool\n- [loguru](https://github.com/Delgan/loguru): Simple yet powerful logging that enhances debugging and observability\n- [python-ulid](https://github.com/mdomke/python-ulid): Efficient ULID generation\n- [PyTorch](https://github.com/pytorch/pytorch): Industry-standard machine learning framework\n- [aiolimiter](https://github.com/mjpieters/aiolimiter): Powerful rate limiting for async operations\n\n\n## 🌱 Support the project\n\nContextGem is just getting started, and your support means the world to us! If you find ContextGem useful, the best way to help is by sharing it with others and giving the project a ⭐. Your feedback and contributions are what make this project grow!\n\n\n## 📄 License \u0026 Contact\n\nThis project is licensed under the Apache 2.0 License - see the [LICENSE](https://github.com/shcherbak-ai/contextgem/blob/main/LICENSE) and [NOTICE](https://github.com/shcherbak-ai/contextgem/blob/main/NOTICE) files for details.\n\nCopyright © 2025 [Shcherbak AI AS](https://shcherbak.ai), an AI engineering company building tools for AI/ML/NLP developers.\n\nShcherbak AI is now part of Microsoft for Startups.\n\n[Connect with us on LinkedIn](https://www.linkedin.com/in/sergii-shcherbak-10068866/) for questions or collaboration ideas.\n\nBuilt with ❤️ in Oslo, Norway.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshcherbak-ai%2Fcontextgem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshcherbak-ai%2Fcontextgem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshcherbak-ai%2Fcontextgem/lists"}