From 4c7abd583278649b5285081bf9970199d29f4410 Mon Sep 17 00:00:00 2001 From: babayaga Date: Thu, 3 Apr 2025 20:37:25 +0200 Subject: [PATCH] directory | systems:research :) --- .astro/collections/resources.schema.json | 2 +- .astro/data-store.json | 2 +- .kbot/params.json | 2 +- src/base/kbot-templates.ts | 1 - src/base/kbot.ts | 3 - src/config/config.ts | 1 - src/model/directory/item.ts | 18 - systems/research/gpt-researcher/.dockerignore | 2 + .../.github/ISSUE_TEMPLATE/bug_report.md | 38 + .../.github/ISSUE_TEMPLATE/feature_request.md | 20 + .../gpt-researcher/.github/dependabot.yml | 15 + .../.github/workflows/docker-build.yml | 45 + systems/research/gpt-researcher/.gitignore | 53 + .../research/gpt-researcher/.python-version | 1 + .../gpt-researcher/CODE_OF_CONDUCT.md | 123 + .../research/gpt-researcher/CONTRIBUTING.md | 42 + systems/research/gpt-researcher/Dockerfile | 54 + systems/research/gpt-researcher/LICENSE | 201 + systems/research/gpt-researcher/Procfile | 1 + .../research/gpt-researcher/README-ja_JP.md | 159 + .../research/gpt-researcher/README-ko_KR.md | 242 + .../research/gpt-researcher/README-zh_CN.md | 158 + systems/research/gpt-researcher/README.md | 241 + .../gpt-researcher/backend/__init__.py | 1 + .../gpt-researcher/backend/chat/__init__.py | 1 + .../gpt-researcher/backend/chat/chat.py | 106 + .../gpt-researcher/backend/memory/__init__.py | 0 .../gpt-researcher/backend/memory/draft.py | 10 + .../gpt-researcher/backend/memory/research.py | 20 + .../backend/report_type/__init__.py | 7 + .../report_type/basic_report/__init__.py | 0 .../report_type/basic_report/basic_report.py | 52 + .../report_type/deep_research/README.md | 129 + .../report_type/deep_research/__init__.py | 0 .../report_type/deep_research/example.py | 324 + .../backend/report_type/deep_research/main.py | 33 + .../report_type/detailed_report/README.md | 12 + .../report_type/detailed_report/__init__.py | 0 .../detailed_report/detailed_report.py | 151 + .../gpt-researcher/backend/server/__init__.py | 0 .../gpt-researcher/backend/server/app.py | 16 + .../backend/server/logging_config.py | 83 + .../gpt-researcher/backend/server/server.py | 204 + .../backend/server/server_utils.py | 320 + .../backend/server/websocket_manager.py | 145 + .../research/gpt-researcher/backend/utils.py | 92 + systems/research/gpt-researcher/citation.cff | 10 + systems/research/gpt-researcher/cli.py | 155 + .../gpt-researcher/docker-compose.yml | 70 + systems/research/gpt-researcher/docs/CNAME | 1 + .../research/gpt-researcher/docs/README.md | 31 + .../gpt-researcher/docs/babel.config.js | 3 + .../architecture.png | Bin 0 -> 143143 bytes .../blog/2023-09-22-gpt-researcher/index.md | 88 + .../2023-09-22-gpt-researcher/planner.jpeg | Bin 0 -> 135677 bytes .../2023-11-12-openai-assistant/diagram-1.png | Bin 0 -> 21252 bytes .../diagram-assistant.jpeg | Bin 0 -> 62656 bytes .../blog/2023-11-12-openai-assistant/index.md | 259 + .../architecture.jpeg | Bin 0 -> 93005 bytes .../blog-langgraph.jpeg | Bin 0 -> 391989 bytes .../blog/2024-05-19-gptr-langgraph/index.md | 223 + .../2024-09-7-hybrid-research/gptr-hybrid.png | Bin 0 -> 194577 bytes .../blog/2024-09-7-hybrid-research/index.md | 182 + .../blog/2025-02-26-deep-research/index.md | 216 + .../index.md | 91 + .../gpt-researcher/docs/blog/authors.yml | 11 + .../docs/discord-bot/Dockerfile | 6 + .../docs/discord-bot/Dockerfile.dev | 7 + .../docs/discord-bot/commands/ask.js | 10 + .../docs/discord-bot/deploy-commands.js | 32 + .../docs/discord-bot/gptr-webhook.js | 92 + .../gpt-researcher/docs/discord-bot/index.js | 170 + .../docs/discord-bot/package.json | 21 + .../gpt-researcher/docs/discord-bot/server.js | 29 + .../gpt-researcher/docs/docs/contribute.md | 5 + .../docs/docs/examples/custom_prompt.py | 73 + .../docs/docs/examples/detailed_report.md | 82 + .../docs/docs/examples/examples.ipynb | 261 + .../docs/docs/examples/examples.md | 77 + .../docs/docs/examples/hybrid_research.md | 125 + .../docs/docs/examples/pip-run.ipynb | 85 + .../docs/docs/examples/sample_report.py | 47 + .../docs/docs/examples/sample_sources_only.py | 20 + .../research/gpt-researcher/docs/docs/faq.md | 34 + .../gpt-researcher/context/azure-storage.md | 26 + .../gpt-researcher/context/data-ingestion.md | 154 + .../context/filtering-by-domain.md | 61 + .../context/img/gptr-hybrid.png | Bin 0 -> 198033 bytes .../context/img/nextjs-filter-by-domain.JPG | Bin 0 -> 62882 bytes .../context/img/vanilla-filter-by-domains.png | Bin 0 -> 442082 bytes .../docs/gpt-researcher/context/local-docs.md | 22 + .../context/tailored-research.md | 147 + .../gpt-researcher/context/vector-stores.md | 155 + .../gpt-researcher/frontend/discord-bot.md | 73 + .../gpt-researcher/frontend/embed-script.md | 30 + .../frontend/img/bot-permissions.png | Bin 0 -> 2321550 bytes .../frontend/img/oath2-url-generator.png | Bin 0 -> 739382 bytes .../gpt-researcher/frontend/introduction.md | 17 + .../frontend/nextjs-frontend.md | 99 + .../gpt-researcher/frontend/react-package.md | 44 + .../frontend/vanilla-js-frontend.md | 24 + .../frontend/visualizing-websockets.md | 23 + .../gpt-researcher/getting-started/cli.md | 81 + .../getting-started-with-docker.md | 40 + .../getting-started/getting-started.md | 104 + .../getting-started/how-to-choose.md | 128 + .../getting-started/introduction.md | 58 + .../getting-started/linux-deployment.md | 167 + .../gpt-researcher/gptr/automated-tests.md | 43 + .../docs/docs/gpt-researcher/gptr/config.md | 56 + .../docs/gpt-researcher/gptr/deep_research.md | 122 + .../docs/docs/gpt-researcher/gptr/example.md | 32 + .../docs/gpt-researcher/gptr/npm-package.md | 25 + .../docs/gpt-researcher/gptr/pip-package.md | 320 + .../gptr/querying-the-backend.md | 106 + .../docs/docs/gpt-researcher/gptr/scraping.md | 201 + .../gpt-researcher/gptr/troubleshooting.md | 56 + .../handling-logs/all-about-logs.md | 170 + .../handling-logs/langsmith-logs.md | 28 + .../handling-logs/langsmith.png | Bin 0 -> 392421 bytes .../handling-logs/simple-logs-example.md | 64 + .../docs/docs/gpt-researcher/llms/llms.md | 331 + .../gpt-researcher/llms/running-with-azure.md | 26 + .../llms/running-with-ollama.md | 99 + .../gpt-researcher/llms/supported-llms.md | 27 + .../gpt-researcher/llms/testing-your-llm.md | 30 + .../mcp-server/advanced-usage.md | 231 + .../mcp-server/claude-integration.md | 133 + .../mcp-server/getting-started.md | 150 + .../gpt-researcher/multi_agents/langgraph.md | 148 + .../search-engines/retrievers.md | 75 + .../search-engines/test-your-retriever.md | 68 + .../docs/docs/reference/config/config.md | 127 + .../docs/docs/reference/config/singleton.md | 31 + .../docs/docs/reference/processing/html.md | 43 + .../docs/docs/reference/processing/text.md | 103 + .../docs/docs/reference/sidebar.json | 5 + .../gpt-researcher/docs/docs/roadmap.md | 9 + .../gpt-researcher/docs/docs/welcome.md | 13 + .../gpt-researcher/docs/docusaurus.config.js | 131 + .../gpt-researcher/docs/npm/Readme.md | 104 + .../research/gpt-researcher/docs/npm/index.js | 123 + .../gpt-researcher/docs/npm/package.json | 28 + .../research/gpt-researcher/docs/package.json | 56 + .../gpt-researcher/docs/pydoc-markdown.yml | 16 + .../research/gpt-researcher/docs/sidebars.js | 136 + .../docs/src/components/HomepageFeatures.js | 78 + .../components/HomepageFeatures.module.css | 13 + .../gpt-researcher/docs/src/css/custom.css | 100 + .../gpt-researcher/docs/src/pages/index.js | 40 + .../docs/src/pages/index.module.css | 25 + .../gpt-researcher/docs/static/.nojekyll | 0 .../research/gpt-researcher/docs/static/CNAME | 1 + .../docs/static/img/architecture.png | Bin 0 -> 143143 bytes .../docs/static/img/banner1.jpg | Bin 0 -> 10214 bytes .../docs/static/img/examples.png | Bin 0 -> 26638 bytes .../docs/static/img/gptr-logo.png | Bin 0 -> 61864 bytes .../docs/static/img/leaderboard.png | Bin 0 -> 235547 bytes .../docs/static/img/multi-agent.png | Bin 0 -> 28254 bytes .../research/gpt-researcher/evals/README.md | 144 + .../research/gpt-researcher/evals/__init__.py | 0 .../evals/simple_evals/.gitignore | 4 + .../evals/simple_evals/__init__.py | 0 .../evals/simple_evals/logs/.gitkeep | 0 .../evals/simple_evals/logs/README.md | 49 + .../SimpleQA Eval 100 Problems 2-22-25.txt | 157626 +++++++++++++++ .../problems/Simple QA Test Set.csv | 4333 + .../evals/simple_evals/requirements.txt | 2 + .../evals/simple_evals/run_eval.py | 196 + .../evals/simple_evals/simpleqa_eval.py | 172 + .../gpt-researcher/frontend/README.md | 85 + .../gpt-researcher/frontend/index.html | 215 + .../frontend/nextjs/.babelrc.build.json | 14 + .../frontend/nextjs/.dockerignore | 57 + .../frontend/nextjs/.eslintrc.json | 12 + .../frontend/nextjs/.example.env | 3 + .../gpt-researcher/frontend/nextjs/.gitignore | 38 + .../frontend/nextjs/.prettierrc | 1 + .../gpt-researcher/frontend/nextjs/Dockerfile | 11 + .../frontend/nextjs/Dockerfile.dev | 6 + .../gpt-researcher/frontend/nextjs/README.md | 96 + .../frontend/nextjs/actions/apiActions.ts | 108 + .../frontend/nextjs/app/globals.css | 166 + .../frontend/nextjs/app/layout.tsx | 60 + .../frontend/nextjs/app/page.tsx | 375 + .../frontend/nextjs/components/Footer.tsx | 64 + .../frontend/nextjs/components/Header.tsx | 59 + .../frontend/nextjs/components/Hero.tsx | 100 + .../nextjs/components/HumanFeedback.tsx | 44 + .../nextjs/components/Images/ImageModal.tsx | 94 + .../nextjs/components/Images/ImagesAlbum.tsx | 81 + .../nextjs/components/Langgraph/Langgraph.js | 48 + .../nextjs/components/LoadingDots.tsx | 15 + .../ResearchBlocks/AccessReport.tsx | 75 + .../components/ResearchBlocks/Answer.tsx | 74 + .../ResearchBlocks/ImageSection.tsx | 25 + .../components/ResearchBlocks/LogsSection.tsx | 44 + .../components/ResearchBlocks/Question.tsx | 28 + .../components/ResearchBlocks/Sources.tsx | 38 + .../ResearchBlocks/elements/InputArea.tsx | 126 + .../ResearchBlocks/elements/LogMessage.tsx | 98 + .../ResearchBlocks/elements/SourceCard.tsx | 40 + .../ResearchBlocks/elements/SubQuestions.tsx | 42 + .../nextjs/components/ResearchResults.tsx | 81 + .../nextjs/components/ResearchSidebar.tsx | 162 + .../nextjs/components/Settings/ChatBox.tsx | 86 + .../nextjs/components/Settings/FileUpload.tsx | 81 + .../nextjs/components/Settings/Modal.tsx | 104 + .../nextjs/components/Settings/Settings.css | 289 + .../components/Settings/ToneSelector.tsx | 30 + .../nextjs/components/SimilarTopics.tsx | 73 + .../nextjs/components/Task/Accordion.tsx | 161 + .../nextjs/components/Task/AgentLogs.tsx | 16 + .../nextjs/components/Task/Report.tsx | 16 + .../nextjs/components/Task/ResearchForm.tsx | 189 + .../nextjs/components/TypeAnimation.tsx | 11 + .../frontend/nextjs/config/task.ts | 37 + .../nextjs/helpers/findDifferences.ts | 48 + .../frontend/nextjs/helpers/getHost.ts | 28 + .../frontend/nextjs/hooks/useAnalytics.ts | 38 + .../nextjs/hooks/useResearchHistory.ts | 62 + .../frontend/nextjs/hooks/useWebSocket.ts | 111 + .../frontend/nextjs/next.config.mjs | 15 + .../frontend/nextjs/nginx/default.conf | 9 + .../frontend/nextjs/package.json | 95 + .../frontend/nextjs/package.lib.json | 94 + .../frontend/nextjs/postcss.config.mjs | 8 + .../frontend/nextjs/public/embed.js | 68 + .../frontend/nextjs/public/favicon.ico | Bin 0 -> 72140 bytes .../frontend/nextjs/public/img/F.svg | 9 + .../frontend/nextjs/public/img/Info.svg | 14 + .../frontend/nextjs/public/img/W.svg | 9 + .../agents/academicResearchAgentAvatar.png | Bin 0 -> 250609 bytes .../img/agents/businessAnalystAgentAvatar.png | Bin 0 -> 231610 bytes .../agents/computerSecurityanalystAvatar.png | Bin 0 -> 187238 bytes .../public/img/agents/defaultAgentAvatar.JPG | Bin 0 -> 48087 bytes .../public/img/agents/financeAgentAvatar.png | Bin 0 -> 238786 bytes .../public/img/agents/mathAgentAvatar.png | Bin 0 -> 229464 bytes .../public/img/agents/travelAgentAvatar.png | Bin 0 -> 226893 bytes .../public/img/arrow-circle-up-right.svg | 5 + .../nextjs/public/img/arrow-narrow-right.svg | 5 + .../frontend/nextjs/public/img/browser.svg | 7 + .../frontend/nextjs/public/img/chat-check.svg | 7 + .../frontend/nextjs/public/img/chat.svg | 9 + .../frontend/nextjs/public/img/copy-white.svg | 1 + .../frontend/nextjs/public/img/copy.svg | 10 + .../frontend/nextjs/public/img/dinosaur.svg | 1 + .../frontend/nextjs/public/img/discord.svg | 7 + .../nextjs/public/img/docker-blue.svg | 1 + .../frontend/nextjs/public/img/docker.svg | 9 + .../frontend/nextjs/public/img/dunk.svg | 1 + .../nextjs/public/img/github-blue.svg | 1 + .../nextjs/public/img/github-footer.svg | 10 + .../frontend/nextjs/public/img/github.svg | 7 + .../frontend/nextjs/public/img/globe.svg | 1 + .../frontend/nextjs/public/img/gptr-logo.png | Bin 0 -> 221134 bytes .../frontend/nextjs/public/img/hiker.svg | 1 + .../nextjs/public/img/icon _atom_.svg | 5 + .../nextjs/public/img/icon _dumbell_.svg | 7 + .../nextjs/public/img/icon _leaf_.svg | 5 + .../frontend/nextjs/public/img/image.svg | 7 + .../frontend/nextjs/public/img/indeed.svg | 9 + .../frontend/nextjs/public/img/link.svg | 10 + .../public/img/message-question-circle.svg | 1 + .../frontend/nextjs/public/img/news.svg | 35 + .../frontend/nextjs/public/img/search.svg | 1 + .../frontend/nextjs/public/img/share.svg | 5 + .../nextjs/public/img/similarTopics.svg | 3 + .../frontend/nextjs/public/img/sources.svg | 9 + .../frontend/nextjs/public/img/stock.svg | 7 + .../frontend/nextjs/public/img/stock2.svg | 22 + .../frontend/nextjs/public/img/thinking.svg | 1 + .../nextjs/public/img/white-books.svg | 1 + .../frontend/nextjs/public/img/x.svg | 3 + .../frontend/nextjs/public/next.svg | 1 + .../frontend/nextjs/public/vercel.svg | 1 + .../frontend/nextjs/rollup.config.js | 83 + .../frontend/nextjs/src/GPTResearcher.tsx | 321 + .../frontend/nextjs/src/index.css | 9 + .../frontend/nextjs/src/index.d.ts | 13 + .../frontend/nextjs/src/index.ts | 5 + .../nextjs/src/utils/imageTransformPlugin.js | 16 + .../frontend/nextjs/styles/markdown.css | 111 + .../frontend/nextjs/tailwind.config.ts | 31 + .../frontend/nextjs/tsconfig.json | 26 + .../frontend/nextjs/tsconfig.lib.json | 22 + .../frontend/nextjs/types/data.ts | 51 + .../frontend/nextjs/types/react-ga4.d.ts | 28 + .../nextjs/utils/consolidateBlocks.ts | 35 + .../frontend/nextjs/utils/dataProcessing.ts | 121 + .../gpt-researcher/frontend/pdf_styles.css | 53 + .../gpt-researcher/frontend/scripts.js | 303 + .../static/academicResearchAgentAvatar.png | Bin 0 -> 250609 bytes .../static/businessAnalystAgentAvatar.png | Bin 0 -> 231610 bytes .../static/computerSecurityanalystAvatar.png | Bin 0 -> 187238 bytes .../frontend/static/defaultAgentAvatar.JPG | Bin 0 -> 48087 bytes .../frontend/static/favicon.ico | Bin 0 -> 72140 bytes .../frontend/static/financeAgentAvatar.png | Bin 0 -> 238786 bytes .../frontend/static/gptr-logo.png | Bin 0 -> 61864 bytes .../frontend/static/mathAgentAvatar.png | Bin 0 -> 229464 bytes .../frontend/static/travelAgentAvatar.png | Bin 0 -> 226893 bytes .../gpt-researcher/frontend/styles.css | 261 + .../gpt-researcher/gpt_researcher/README.md | 86 + .../gpt-researcher/gpt_researcher/__init__.py | 3 + .../gpt_researcher/actions/__init__.py | 27 + .../gpt_researcher/actions/agent_creator.py | 74 + .../actions/markdown_processing.py | 112 + .../actions/query_processing.py | 131 + .../actions/report_generation.py | 274 + .../gpt_researcher/actions/retriever.py | 106 + .../gpt_researcher/actions/utils.py | 152 + .../gpt_researcher/actions/web_scraping.py | 101 + .../gpt-researcher/gpt_researcher/agent.py | 298 + .../gpt_researcher/config/__init__.py | 5 + .../gpt_researcher/config/config.py | 227 + .../config/variables/__init__.py | 0 .../gpt_researcher/config/variables/base.py | 34 + .../config/variables/default.py | 34 + .../config/variables/test_local.json | 3 + .../gpt_researcher/context/__init__.py | 4 + .../gpt_researcher/context/compression.py | 105 + .../gpt_researcher/context/retriever.py | 62 + .../gpt_researcher/document/__init__.py | 5 + .../document/azure_document_loader.py | 22 + .../gpt_researcher/document/document.py | 92 + .../document/langchain_document.py | 24 + .../document/online_document.py | 91 + .../gpt_researcher/llm_provider/__init__.py | 5 + .../llm_provider/generic/__init__.py | 3 + .../llm_provider/generic/base.py | 245 + .../gpt_researcher/memory/__init__.py | 1 + .../gpt_researcher/memory/embeddings.py | 121 + .../gpt-researcher/gpt_researcher/prompts.py | 527 + .../gpt_researcher/retrievers/__init__.py | 29 + .../retrievers/arxiv/__init__.py | 0 .../gpt_researcher/retrievers/arxiv/arxiv.py | 40 + .../retrievers/bing/__init__.py | 0 .../gpt_researcher/retrievers/bing/bing.py | 95 + .../retrievers/custom/__init__.py | 0 .../retrievers/custom/custom.py | 52 + .../retrievers/duckduckgo/__init__.py | 0 .../retrievers/duckduckgo/duckduckgo.py | 29 + .../gpt_researcher/retrievers/exa/__init__.py | 0 .../gpt_researcher/retrievers/exa/exa.py | 99 + .../retrievers/google/__init__.py | 0 .../retrievers/google/google.py | 100 + .../retrievers/pubmed_central/__init__.py | 0 .../pubmed_central/pubmed_central.py | 174 + .../retrievers/searchapi/__init__.py | 0 .../retrievers/searchapi/searchapi.py | 84 + .../retrievers/searx/__init__.py | 0 .../gpt_researcher/retrievers/searx/searx.py | 78 + .../retrievers/semantic_scholar/__init__.py | 0 .../semantic_scholar/semantic_scholar.py | 59 + .../retrievers/serpapi/__init__.py | 0 .../retrievers/serpapi/serpapi.py | 82 + .../retrievers/serper/__init__.py | 0 .../retrievers/serper/serper.py | 84 + .../retrievers/tavily/__init__.py | 0 .../retrievers/tavily/tavily_search.py | 121 + .../gpt_researcher/retrievers/utils.py | 42 + .../gpt_researcher/scraper/__init__.py | 21 + .../gpt_researcher/scraper/arxiv/__init__.py | 0 .../gpt_researcher/scraper/arxiv/arxiv.py | 28 + .../scraper/beautiful_soup/__init__.py | 0 .../scraper/beautiful_soup/beautiful_soup.py | 42 + .../scraper/browser/__init__.py | 0 .../gpt_researcher/scraper/browser/browser.py | 245 + .../scraper/browser/js/overlay.js | 29 + .../scraper/browser/nodriver_scraper.py | 228 + .../scraper/browser/processing/__init__.py | 0 .../scraper/browser/processing/html.py | 33 + .../browser/processing/scrape_skills.py | 31 + .../scraper/firecrawl/__init__.py | 0 .../scraper/firecrawl/firecrawl.py | 79 + .../scraper/pymupdf/__init__.py | 0 .../gpt_researcher/scraper/pymupdf/pymupdf.py | 68 + .../gpt_researcher/scraper/scraper.py | 194 + .../scraper/tavily_extract/__init__.py | 0 .../scraper/tavily_extract/tavily_extract.py | 62 + .../gpt_researcher/scraper/utils.py | 124 + .../scraper/web_base_loader/__init__.py | 0 .../web_base_loader/web_base_loader.py | 43 + .../gpt_researcher/skills/__init__.py | 13 + .../gpt_researcher/skills/browser.py | 93 + .../gpt_researcher/skills/context_manager.py | 80 + .../gpt_researcher/skills/curator.py | 78 + .../gpt_researcher/skills/deep_research.py | 404 + .../gpt_researcher/skills/researcher.py | 409 + .../gpt_researcher/skills/writer.py | 211 + .../gpt_researcher/utils/__init__.py | 0 .../gpt_researcher/utils/costs.py | 25 + .../gpt_researcher/utils/enum.py | 51 + .../gpt_researcher/utils/llm.py | 144 + .../gpt_researcher/utils/logger.py | 96 + .../gpt_researcher/utils/logging_config.py | 82 + .../gpt_researcher/utils/validators.py | 9 + .../gpt_researcher/utils/workers.py | 15 + .../gpt_researcher/vector_store/__init__.py | 3 + .../vector_store/vector_store.py | 43 + .../research/gpt-researcher/langgraph.json | 10 + systems/research/gpt-researcher/main.py | 37 + .../gpt-researcher/mcp-server/.env.example | 28 + .../gpt-researcher/mcp-server/Dockerfile | 16 + .../gpt-researcher/mcp-server/README.md | 97 + .../gpt-researcher/mcp-server/__init__.py | 8 + .../mcp-server/docker-compose.yml | 15 + .../mcp-server/requirements.txt | 12 + .../research/gpt-researcher/mcp-server/run.sh | 45 + .../gpt-researcher/mcp-server/server.py | 261 + .../mcp-server/tests/test_server.py | 102 + .../gpt-researcher/mcp-server/utils.py | 139 + .../gpt-researcher/multi_agents/README.md | 104 + .../gpt-researcher/multi_agents/__init__.py | 27 + .../gpt-researcher/multi_agents/agent.py | 16 + .../multi_agents/agents/__init__.py | 21 + .../multi_agents/agents/editor.py | 167 + .../multi_agents/agents/human.py | 52 + .../multi_agents/agents/orchestrator.py | 118 + .../multi_agents/agents/publisher.py | 71 + .../multi_agents/agents/researcher.py | 58 + .../multi_agents/agents/reviewer.py | 79 + .../multi_agents/agents/reviser.py | 74 + .../multi_agents/agents/utils/__init__.py | 0 .../multi_agents/agents/utils/file_formats.py | 101 + .../multi_agents/agents/utils/llms.py | 36 + .../multi_agents/agents/utils/pdf_styles.css | 53 + .../multi_agents/agents/utils/utils.py | 26 + .../multi_agents/agents/utils/views.py | 16 + .../multi_agents/agents/writer.py | 142 + .../multi_agents/langgraph.json | 10 + .../gpt-researcher/multi_agents/main.py | 61 + .../multi_agents/memory/__init__.py | 7 + .../multi_agents/memory/draft.py | 10 + .../multi_agents/memory/research.py | 21 + .../gpt-researcher/multi_agents/package.json | 15 + .../multi_agents/requirements.txt | 7 + .../gpt-researcher/multi_agents/task.json | 18 + systems/research/gpt-researcher/poetry.toml | 2 + .../research/gpt-researcher/pyproject.toml | 60 + .../research/gpt-researcher/requirements.txt | 35 + systems/research/gpt-researcher/setup.py | 47 + .../research/gpt-researcher/tests/__init__.py | 0 .../gpt-researcher/tests/docs/doc.pdf | Bin 0 -> 2215244 bytes .../tests/documents-report-source.py | 54 + .../gpt-researcher/tests/gptr-logs-handler.py | 34 + .../gpt-researcher/tests/report-types.py | 47 + .../gpt-researcher/tests/research_test.py | 110 + .../gpt-researcher/tests/test-loaders.py | 17 + .../gpt-researcher/tests/test-openai-llm.py | 31 + .../tests/test-your-embeddings.py | 56 + .../gpt-researcher/tests/test-your-llm.py | 24 + .../tests/test-your-retriever.py | 49 + .../gpt-researcher/tests/test_logging.py | 61 + .../tests/test_logging_output.py | 63 + .../gpt-researcher/tests/test_logs.py | 48 + .../tests/test_researcher_logging.py | 71 + .../gpt-researcher/tests/vector-store.py | 236 + 458 files changed, 189563 insertions(+), 26 deletions(-) create mode 100644 systems/research/gpt-researcher/.dockerignore create mode 100644 systems/research/gpt-researcher/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 systems/research/gpt-researcher/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 systems/research/gpt-researcher/.github/dependabot.yml create mode 100644 systems/research/gpt-researcher/.github/workflows/docker-build.yml create mode 100644 systems/research/gpt-researcher/.gitignore create mode 100644 systems/research/gpt-researcher/.python-version create mode 100644 systems/research/gpt-researcher/CODE_OF_CONDUCT.md create mode 100644 systems/research/gpt-researcher/CONTRIBUTING.md create mode 100644 systems/research/gpt-researcher/Dockerfile create mode 100644 systems/research/gpt-researcher/LICENSE create mode 100644 systems/research/gpt-researcher/Procfile create mode 100644 systems/research/gpt-researcher/README-ja_JP.md create mode 100644 systems/research/gpt-researcher/README-ko_KR.md create mode 100644 systems/research/gpt-researcher/README-zh_CN.md create mode 100644 systems/research/gpt-researcher/README.md create mode 100644 systems/research/gpt-researcher/backend/__init__.py create mode 100644 systems/research/gpt-researcher/backend/chat/__init__.py create mode 100644 systems/research/gpt-researcher/backend/chat/chat.py create mode 100644 systems/research/gpt-researcher/backend/memory/__init__.py create mode 100644 systems/research/gpt-researcher/backend/memory/draft.py create mode 100644 systems/research/gpt-researcher/backend/memory/research.py create mode 100644 systems/research/gpt-researcher/backend/report_type/__init__.py create mode 100644 systems/research/gpt-researcher/backend/report_type/basic_report/__init__.py create mode 100644 systems/research/gpt-researcher/backend/report_type/basic_report/basic_report.py create mode 100644 systems/research/gpt-researcher/backend/report_type/deep_research/README.md create mode 100644 systems/research/gpt-researcher/backend/report_type/deep_research/__init__.py create mode 100644 systems/research/gpt-researcher/backend/report_type/deep_research/example.py create mode 100644 systems/research/gpt-researcher/backend/report_type/deep_research/main.py create mode 100644 systems/research/gpt-researcher/backend/report_type/detailed_report/README.md create mode 100644 systems/research/gpt-researcher/backend/report_type/detailed_report/__init__.py create mode 100644 systems/research/gpt-researcher/backend/report_type/detailed_report/detailed_report.py create mode 100644 systems/research/gpt-researcher/backend/server/__init__.py create mode 100644 systems/research/gpt-researcher/backend/server/app.py create mode 100644 systems/research/gpt-researcher/backend/server/logging_config.py create mode 100644 systems/research/gpt-researcher/backend/server/server.py create mode 100644 systems/research/gpt-researcher/backend/server/server_utils.py create mode 100644 systems/research/gpt-researcher/backend/server/websocket_manager.py create mode 100644 systems/research/gpt-researcher/backend/utils.py create mode 100644 systems/research/gpt-researcher/citation.cff create mode 100644 systems/research/gpt-researcher/cli.py create mode 100644 systems/research/gpt-researcher/docker-compose.yml create mode 100644 systems/research/gpt-researcher/docs/CNAME create mode 100644 systems/research/gpt-researcher/docs/README.md create mode 100644 systems/research/gpt-researcher/docs/babel.config.js create mode 100644 systems/research/gpt-researcher/docs/blog/2023-09-22-gpt-researcher/architecture.png create mode 100644 systems/research/gpt-researcher/docs/blog/2023-09-22-gpt-researcher/index.md create mode 100644 systems/research/gpt-researcher/docs/blog/2023-09-22-gpt-researcher/planner.jpeg create mode 100644 systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/diagram-1.png create mode 100644 systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/diagram-assistant.jpeg create mode 100644 systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/index.md create mode 100644 systems/research/gpt-researcher/docs/blog/2024-05-19-gptr-langgraph/architecture.jpeg create mode 100644 systems/research/gpt-researcher/docs/blog/2024-05-19-gptr-langgraph/blog-langgraph.jpeg create mode 100644 systems/research/gpt-researcher/docs/blog/2024-05-19-gptr-langgraph/index.md create mode 100644 systems/research/gpt-researcher/docs/blog/2024-09-7-hybrid-research/gptr-hybrid.png create mode 100644 systems/research/gpt-researcher/docs/blog/2024-09-7-hybrid-research/index.md create mode 100644 systems/research/gpt-researcher/docs/blog/2025-02-26-deep-research/index.md create mode 100644 systems/research/gpt-researcher/docs/blog/2025-03-10-stepping-into-the-story/index.md create mode 100644 systems/research/gpt-researcher/docs/blog/authors.yml create mode 100644 systems/research/gpt-researcher/docs/discord-bot/Dockerfile create mode 100644 systems/research/gpt-researcher/docs/discord-bot/Dockerfile.dev create mode 100644 systems/research/gpt-researcher/docs/discord-bot/commands/ask.js create mode 100644 systems/research/gpt-researcher/docs/discord-bot/deploy-commands.js create mode 100644 systems/research/gpt-researcher/docs/discord-bot/gptr-webhook.js create mode 100644 systems/research/gpt-researcher/docs/discord-bot/index.js create mode 100644 systems/research/gpt-researcher/docs/discord-bot/package.json create mode 100644 systems/research/gpt-researcher/docs/discord-bot/server.js create mode 100644 systems/research/gpt-researcher/docs/docs/contribute.md create mode 100644 systems/research/gpt-researcher/docs/docs/examples/custom_prompt.py create mode 100644 systems/research/gpt-researcher/docs/docs/examples/detailed_report.md create mode 100644 systems/research/gpt-researcher/docs/docs/examples/examples.ipynb create mode 100644 systems/research/gpt-researcher/docs/docs/examples/examples.md create mode 100644 systems/research/gpt-researcher/docs/docs/examples/hybrid_research.md create mode 100644 systems/research/gpt-researcher/docs/docs/examples/pip-run.ipynb create mode 100644 systems/research/gpt-researcher/docs/docs/examples/sample_report.py create mode 100644 systems/research/gpt-researcher/docs/docs/examples/sample_sources_only.py create mode 100644 systems/research/gpt-researcher/docs/docs/faq.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/context/azure-storage.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/context/data-ingestion.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/context/filtering-by-domain.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/context/img/gptr-hybrid.png create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/context/img/nextjs-filter-by-domain.JPG create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/context/img/vanilla-filter-by-domains.png create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/context/local-docs.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/context/tailored-research.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/context/vector-stores.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/frontend/discord-bot.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/frontend/embed-script.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/frontend/img/bot-permissions.png create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/frontend/img/oath2-url-generator.png create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/frontend/introduction.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/frontend/nextjs-frontend.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/frontend/react-package.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/frontend/vanilla-js-frontend.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/frontend/visualizing-websockets.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/getting-started/cli.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/getting-started/getting-started-with-docker.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/getting-started/getting-started.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/getting-started/how-to-choose.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/getting-started/introduction.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/getting-started/linux-deployment.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/gptr/automated-tests.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/gptr/config.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/gptr/deep_research.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/gptr/example.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/gptr/npm-package.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/gptr/pip-package.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/gptr/querying-the-backend.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/gptr/scraping.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/gptr/troubleshooting.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/handling-logs/all-about-logs.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/handling-logs/langsmith-logs.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/handling-logs/langsmith.png create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/handling-logs/simple-logs-example.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/llms/llms.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/llms/running-with-azure.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/llms/running-with-ollama.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/llms/supported-llms.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/llms/testing-your-llm.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/mcp-server/advanced-usage.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/mcp-server/claude-integration.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/mcp-server/getting-started.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/multi_agents/langgraph.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/search-engines/retrievers.md create mode 100644 systems/research/gpt-researcher/docs/docs/gpt-researcher/search-engines/test-your-retriever.md create mode 100644 systems/research/gpt-researcher/docs/docs/reference/config/config.md create mode 100644 systems/research/gpt-researcher/docs/docs/reference/config/singleton.md create mode 100644 systems/research/gpt-researcher/docs/docs/reference/processing/html.md create mode 100644 systems/research/gpt-researcher/docs/docs/reference/processing/text.md create mode 100644 systems/research/gpt-researcher/docs/docs/reference/sidebar.json create mode 100644 systems/research/gpt-researcher/docs/docs/roadmap.md create mode 100644 systems/research/gpt-researcher/docs/docs/welcome.md create mode 100644 systems/research/gpt-researcher/docs/docusaurus.config.js create mode 100644 systems/research/gpt-researcher/docs/npm/Readme.md create mode 100644 systems/research/gpt-researcher/docs/npm/index.js create mode 100644 systems/research/gpt-researcher/docs/npm/package.json create mode 100644 systems/research/gpt-researcher/docs/package.json create mode 100644 systems/research/gpt-researcher/docs/pydoc-markdown.yml create mode 100644 systems/research/gpt-researcher/docs/sidebars.js create mode 100644 systems/research/gpt-researcher/docs/src/components/HomepageFeatures.js create mode 100644 systems/research/gpt-researcher/docs/src/components/HomepageFeatures.module.css create mode 100644 systems/research/gpt-researcher/docs/src/css/custom.css create mode 100644 systems/research/gpt-researcher/docs/src/pages/index.js create mode 100644 systems/research/gpt-researcher/docs/src/pages/index.module.css create mode 100644 systems/research/gpt-researcher/docs/static/.nojekyll create mode 100644 systems/research/gpt-researcher/docs/static/CNAME create mode 100644 systems/research/gpt-researcher/docs/static/img/architecture.png create mode 100644 systems/research/gpt-researcher/docs/static/img/banner1.jpg create mode 100644 systems/research/gpt-researcher/docs/static/img/examples.png create mode 100644 systems/research/gpt-researcher/docs/static/img/gptr-logo.png create mode 100644 systems/research/gpt-researcher/docs/static/img/leaderboard.png create mode 100644 systems/research/gpt-researcher/docs/static/img/multi-agent.png create mode 100644 systems/research/gpt-researcher/evals/README.md create mode 100644 systems/research/gpt-researcher/evals/__init__.py create mode 100644 systems/research/gpt-researcher/evals/simple_evals/.gitignore create mode 100644 systems/research/gpt-researcher/evals/simple_evals/__init__.py create mode 100644 systems/research/gpt-researcher/evals/simple_evals/logs/.gitkeep create mode 100644 systems/research/gpt-researcher/evals/simple_evals/logs/README.md create mode 100644 systems/research/gpt-researcher/evals/simple_evals/logs/SimpleQA Eval 100 Problems 2-22-25.txt create mode 100644 systems/research/gpt-researcher/evals/simple_evals/problems/Simple QA Test Set.csv create mode 100644 systems/research/gpt-researcher/evals/simple_evals/requirements.txt create mode 100644 systems/research/gpt-researcher/evals/simple_evals/run_eval.py create mode 100644 systems/research/gpt-researcher/evals/simple_evals/simpleqa_eval.py create mode 100644 systems/research/gpt-researcher/frontend/README.md create mode 100644 systems/research/gpt-researcher/frontend/index.html create mode 100644 systems/research/gpt-researcher/frontend/nextjs/.babelrc.build.json create mode 100644 systems/research/gpt-researcher/frontend/nextjs/.dockerignore create mode 100644 systems/research/gpt-researcher/frontend/nextjs/.eslintrc.json create mode 100644 systems/research/gpt-researcher/frontend/nextjs/.example.env create mode 100644 systems/research/gpt-researcher/frontend/nextjs/.gitignore create mode 100644 systems/research/gpt-researcher/frontend/nextjs/.prettierrc create mode 100644 systems/research/gpt-researcher/frontend/nextjs/Dockerfile create mode 100644 systems/research/gpt-researcher/frontend/nextjs/Dockerfile.dev create mode 100644 systems/research/gpt-researcher/frontend/nextjs/README.md create mode 100644 systems/research/gpt-researcher/frontend/nextjs/actions/apiActions.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/app/globals.css create mode 100644 systems/research/gpt-researcher/frontend/nextjs/app/layout.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/app/page.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Footer.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Header.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Hero.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/HumanFeedback.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Images/ImageModal.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Images/ImagesAlbum.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Langgraph/Langgraph.js create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/LoadingDots.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/AccessReport.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/Answer.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/ImageSection.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/LogsSection.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/Question.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/Sources.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/elements/InputArea.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/elements/LogMessage.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/elements/SourceCard.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchBlocks/elements/SubQuestions.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchResults.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/ResearchSidebar.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Settings/ChatBox.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Settings/FileUpload.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Settings/Modal.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Settings/Settings.css create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Settings/ToneSelector.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/SimilarTopics.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Task/Accordion.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Task/AgentLogs.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Task/Report.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/Task/ResearchForm.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/components/TypeAnimation.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/config/task.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/helpers/findDifferences.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/helpers/getHost.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/hooks/useAnalytics.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/hooks/useResearchHistory.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/hooks/useWebSocket.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/next.config.mjs create mode 100644 systems/research/gpt-researcher/frontend/nextjs/nginx/default.conf create mode 100644 systems/research/gpt-researcher/frontend/nextjs/package.json create mode 100644 systems/research/gpt-researcher/frontend/nextjs/package.lib.json create mode 100644 systems/research/gpt-researcher/frontend/nextjs/postcss.config.mjs create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/embed.js create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/favicon.ico create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/F.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/Info.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/W.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/agents/academicResearchAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/agents/businessAnalystAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/agents/computerSecurityanalystAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/agents/defaultAgentAvatar.JPG create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/agents/financeAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/agents/mathAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/agents/travelAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/arrow-circle-up-right.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/arrow-narrow-right.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/browser.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/chat-check.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/chat.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/copy-white.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/copy.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/dinosaur.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/discord.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/docker-blue.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/docker.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/dunk.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/github-blue.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/github-footer.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/github.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/globe.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/gptr-logo.png create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/hiker.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/icon _atom_.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/icon _dumbell_.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/icon _leaf_.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/image.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/indeed.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/link.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/message-question-circle.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/news.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/search.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/share.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/similarTopics.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/sources.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/stock.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/stock2.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/thinking.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/white-books.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/img/x.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/next.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/public/vercel.svg create mode 100644 systems/research/gpt-researcher/frontend/nextjs/rollup.config.js create mode 100644 systems/research/gpt-researcher/frontend/nextjs/src/GPTResearcher.tsx create mode 100644 systems/research/gpt-researcher/frontend/nextjs/src/index.css create mode 100644 systems/research/gpt-researcher/frontend/nextjs/src/index.d.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/src/index.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/src/utils/imageTransformPlugin.js create mode 100644 systems/research/gpt-researcher/frontend/nextjs/styles/markdown.css create mode 100644 systems/research/gpt-researcher/frontend/nextjs/tailwind.config.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/tsconfig.json create mode 100644 systems/research/gpt-researcher/frontend/nextjs/tsconfig.lib.json create mode 100644 systems/research/gpt-researcher/frontend/nextjs/types/data.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/types/react-ga4.d.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/utils/consolidateBlocks.ts create mode 100644 systems/research/gpt-researcher/frontend/nextjs/utils/dataProcessing.ts create mode 100644 systems/research/gpt-researcher/frontend/pdf_styles.css create mode 100644 systems/research/gpt-researcher/frontend/scripts.js create mode 100644 systems/research/gpt-researcher/frontend/static/academicResearchAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/static/businessAnalystAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/static/computerSecurityanalystAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/static/defaultAgentAvatar.JPG create mode 100644 systems/research/gpt-researcher/frontend/static/favicon.ico create mode 100644 systems/research/gpt-researcher/frontend/static/financeAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/static/gptr-logo.png create mode 100644 systems/research/gpt-researcher/frontend/static/mathAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/static/travelAgentAvatar.png create mode 100644 systems/research/gpt-researcher/frontend/styles.css create mode 100644 systems/research/gpt-researcher/gpt_researcher/README.md create mode 100644 systems/research/gpt-researcher/gpt_researcher/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/actions/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/actions/agent_creator.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/actions/markdown_processing.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/actions/query_processing.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/actions/report_generation.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/actions/retriever.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/actions/utils.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/actions/web_scraping.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/agent.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/config/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/config/config.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/config/variables/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/config/variables/base.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/config/variables/default.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/config/variables/test_local.json create mode 100644 systems/research/gpt-researcher/gpt_researcher/context/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/context/compression.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/context/retriever.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/document/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/document/azure_document_loader.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/document/document.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/document/langchain_document.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/document/online_document.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/llm_provider/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/llm_provider/generic/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/llm_provider/generic/base.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/memory/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/memory/embeddings.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/prompts.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/arxiv/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/arxiv/arxiv.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/bing/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/bing/bing.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/custom/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/custom/custom.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/duckduckgo/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/duckduckgo/duckduckgo.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/exa/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/exa/exa.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/google/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/google/google.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/pubmed_central/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/pubmed_central/pubmed_central.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/searchapi/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/searchapi/searchapi.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/searx/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/searx/searx.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/semantic_scholar/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/semantic_scholar/semantic_scholar.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/serpapi/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/serpapi/serpapi.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/serper/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/serper/serper.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/tavily/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/tavily/tavily_search.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/retrievers/utils.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/arxiv/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/arxiv/arxiv.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/beautiful_soup/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/beautiful_soup/beautiful_soup.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/browser/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/browser/browser.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/browser/js/overlay.js create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/browser/nodriver_scraper.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/browser/processing/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/browser/processing/html.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/browser/processing/scrape_skills.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/firecrawl/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/firecrawl/firecrawl.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/pymupdf/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/pymupdf/pymupdf.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/scraper.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/tavily_extract/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/tavily_extract/tavily_extract.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/utils.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/web_base_loader/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/scraper/web_base_loader/web_base_loader.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/skills/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/skills/browser.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/skills/context_manager.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/skills/curator.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/skills/deep_research.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/skills/researcher.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/skills/writer.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/utils/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/utils/costs.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/utils/enum.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/utils/llm.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/utils/logger.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/utils/logging_config.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/utils/validators.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/utils/workers.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/vector_store/__init__.py create mode 100644 systems/research/gpt-researcher/gpt_researcher/vector_store/vector_store.py create mode 100644 systems/research/gpt-researcher/langgraph.json create mode 100644 systems/research/gpt-researcher/main.py create mode 100644 systems/research/gpt-researcher/mcp-server/.env.example create mode 100644 systems/research/gpt-researcher/mcp-server/Dockerfile create mode 100644 systems/research/gpt-researcher/mcp-server/README.md create mode 100644 systems/research/gpt-researcher/mcp-server/__init__.py create mode 100644 systems/research/gpt-researcher/mcp-server/docker-compose.yml create mode 100644 systems/research/gpt-researcher/mcp-server/requirements.txt create mode 100644 systems/research/gpt-researcher/mcp-server/run.sh create mode 100644 systems/research/gpt-researcher/mcp-server/server.py create mode 100644 systems/research/gpt-researcher/mcp-server/tests/test_server.py create mode 100644 systems/research/gpt-researcher/mcp-server/utils.py create mode 100644 systems/research/gpt-researcher/multi_agents/README.md create mode 100644 systems/research/gpt-researcher/multi_agents/__init__.py create mode 100644 systems/research/gpt-researcher/multi_agents/agent.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/__init__.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/editor.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/human.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/orchestrator.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/publisher.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/researcher.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/reviewer.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/reviser.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/utils/__init__.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/utils/file_formats.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/utils/llms.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/utils/pdf_styles.css create mode 100644 systems/research/gpt-researcher/multi_agents/agents/utils/utils.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/utils/views.py create mode 100644 systems/research/gpt-researcher/multi_agents/agents/writer.py create mode 100644 systems/research/gpt-researcher/multi_agents/langgraph.json create mode 100644 systems/research/gpt-researcher/multi_agents/main.py create mode 100644 systems/research/gpt-researcher/multi_agents/memory/__init__.py create mode 100644 systems/research/gpt-researcher/multi_agents/memory/draft.py create mode 100644 systems/research/gpt-researcher/multi_agents/memory/research.py create mode 100644 systems/research/gpt-researcher/multi_agents/package.json create mode 100644 systems/research/gpt-researcher/multi_agents/requirements.txt create mode 100644 systems/research/gpt-researcher/multi_agents/task.json create mode 100644 systems/research/gpt-researcher/poetry.toml create mode 100644 systems/research/gpt-researcher/pyproject.toml create mode 100644 systems/research/gpt-researcher/requirements.txt create mode 100644 systems/research/gpt-researcher/setup.py create mode 100644 systems/research/gpt-researcher/tests/__init__.py create mode 100644 systems/research/gpt-researcher/tests/docs/doc.pdf create mode 100644 systems/research/gpt-researcher/tests/documents-report-source.py create mode 100644 systems/research/gpt-researcher/tests/gptr-logs-handler.py create mode 100644 systems/research/gpt-researcher/tests/report-types.py create mode 100644 systems/research/gpt-researcher/tests/research_test.py create mode 100644 systems/research/gpt-researcher/tests/test-loaders.py create mode 100644 systems/research/gpt-researcher/tests/test-openai-llm.py create mode 100644 systems/research/gpt-researcher/tests/test-your-embeddings.py create mode 100644 systems/research/gpt-researcher/tests/test-your-llm.py create mode 100644 systems/research/gpt-researcher/tests/test-your-retriever.py create mode 100644 systems/research/gpt-researcher/tests/test_logging.py create mode 100644 systems/research/gpt-researcher/tests/test_logging_output.py create mode 100644 systems/research/gpt-researcher/tests/test_logs.py create mode 100644 systems/research/gpt-researcher/tests/test_researcher_logging.py create mode 100644 systems/research/gpt-researcher/tests/vector-store.py diff --git a/.astro/collections/resources.schema.json b/.astro/collections/resources.schema.json index b52306a..487704f 100644 --- a/.astro/collections/resources.schema.json +++ b/.astro/collections/resources.schema.json @@ -23,7 +23,7 @@ "format": "unix-time" } ], - "default": "2025-04-01T17:24:12.665Z" + "default": "2025-04-03T18:32:26.199Z" }, "description": { "type": "string", diff --git a/.astro/data-store.json b/.astro/data-store.json index 3c34321..7534f1c 100644 --- a/.astro/data-store.json +++ b/.astro/data-store.json @@ -1 +1 @@ -[["Map",1,2,9,10,115,116,270,271,391,392],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.4.1","content-config-digest","6365aa78fa3e7fae","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"site\":\"https://creava.org\",\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":\"0.0.0.0\",\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[]},\"devToolbar\":{\"enabled\":false},\"markdown\":{\"syntaxHighlight\":\"shiki\",\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-light-default\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\",\"es\",\"fr\",\"it\",\"de\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":true,\"fallbackType\":\"redirect\"}},\"security\":{\"checkOrigin\":true},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"responsiveImages\":false,\"serializeConfig\":false},\"legacy\":{\"collections\":false}}","resources",["Map",11,12,25,26,92,93],"workflow",{"id":11,"data":13,"body":21,"filePath":22,"digest":23,"deferredRender":24},{"title":14,"pubDate":15,"description":16,"author":17,"image":18,"tags":20},"Untitled",["Date","2025-03-31T21:38:59.997Z"],"No description provided","Anonymous",{"url":19,"alt":19},"",[],"## Migration\r\n\r\n- json -> content/resources/howtos/*.mdx\r\n\r\n\r\n## Processing\r\n\r\n- content/resources/howtos/*.mdx + overlay -> \r\n filters (grammar,spelling,bullshit, rewrite) -> \r\n completions (resources ext/content) -> \r\n outputs (json-ld/pdf/md)\r\n\r\n## Editing\r\n\r\n- content/resources/howtos/*.mdx + overlay","src/content/resources/workflow.mdx","135d5c801dee7dd3",true,"community",{"id":25,"data":27,"body":37,"filePath":38,"digest":39,"rendered":40},{"title":28,"pubDate":29,"description":19,"author":30,"image":31,"tags":34},"Community Resources",["Date","2024-04-01T00:00:00.000Z"],"Polymech",{"url":32,"alt":33},"https://camillestyles.com/wp-content/uploads/2019/09/bc6764de-1.jpg","#_",[25,35,36],"blogging","c++","#### Articles\r\n\r\n- [Article: Plastic Gears Are the Future](https://www.machinedesign.com/materials/article/21836156/plastic-gears-are-the-future)\r\n\r\n- [Article: Will Stone Replace Steel and Concrete](https://www.construction-physics.com/p/will-stone-replace-steel-and-concrete)\r\n\r\n- [Article:Every Type of Plastic Used By LEGO](https://bricknerd.com/home/every-type-of-plastic-used-by-lego-5-20-22)\r\n\r\n#### Finance & Economy\r\n\r\n- [Panic At The Job Market](https://matt.sh/panic-at-the-job-market)\r\n\r\n- [Venture Capital - 2023](https://news.crunchbase.com/venture/monthly-vc-funding-recap-seed-downturn-july-2023/?utm_source=cb_daily&utm_medium=email&utm_campaign=20230703)\r\n\r\n- [Venture Capital - 2024](https://news.crunchbase.com/venture/global-funding-recap-q1-2024/)\r\n\r\n#### Technology\r\n\r\n- [Podcast : The Software behind Silicon](https://www.acquired.fm/episodes/the-software-behind-silicon-with-synopsys-founder-aart-de-geus-and-ceo-sassine-ghazi)\r\n\r\n- [Article : Advancing Plastic Recycling: Challenges and Opportunities in the Integration of 3D Printing and Distributed Recycling for a Circular Economy](https://mdpi.com/2073-4360/15/19/3881)\r\n\r\n- [Interview: AON3D Launches Hylo and Basis: The Future of 3D Printing Software and Hardware](https://3dprintingindustry.com/news/interview-aon3d-launches-hylo-and-basis-the-future-of-3d-printing-software-and-hardware-225751/)\r\n\r\n- [Resource : Collection of AI Tools](https://forum.osr-plastic.org/t/ai-tools/11060)\r\n\r\n- [Resource: The CTO Handbook](https://github.com/ZachGoldberg/Startup-CTO-Handbook/blob/main/StartupCTOHandbook.md)\r\n\r\n#### Opensource Projects\r\n\r\n- [Balancing Cube](https://willempennings.nl/balancing-cube/)\r\n\r\n- [6DOF Robot](https://www.anninrobotics.com/robot-kits)\r\n\r\n- [Distributed Manufacturing of Open Hardware: A Report of the Open Hardware Distribution & Documentation Working Group](https://openbioeconomy.org/outputs/distributed-manufacturing-of-open-hardware-a-report-of-the-open-hardware-distribution-documentation-working-group/)\r\n\r\n- [Paper: Distributed Manufacturing of OpenHardware](https://www.law.nyu.edu/sites/default/files/DistributedManufacturingofOpenHardware.pdf)\r\n\r\n#### Social Media\r\n\r\n- [Instagram - Vinyl Record Production](https://www.instagram.com/waxworkrecords)\r\n\r\n- [Instagram : Smartest Worker](https://www.instagram.com/smartest.worker)\r\n\r\n- [Article : What we Learned Making a Plastic Injection Mold with a Chinese Mold Maker](https://www.airgradient.com/blog/lessons-learned-plastic-injection-mold-making/)\r\n\r\n- [Instagram : New Talents \"manutechlab\"](https://www.instagram.com/p/C8r2Thqt4zt)\r\n\r\n- [Instagram : Robot based printing - \"The new raw\"](https://www.instagram.com/p/C9h4WXvsnpC)\r\n\r\n- [Instagram : Robot based printing, using concrete and other materials\"](https://www.instagram.com/p/C9VAtE6uY30)\r\n\r\n- [Instagram : 3D Printer using gravity](https://www.instagram.com/p/CvNOfKhotvS)\r\n\r\n- [Instagram : Ecollab8](https://www.instagram.com/ecollabo8/)\r\n\r\n#### Tiktok Cherries\r\n\r\n- [watchfulcoyote](https://www.tiktok.com/@watchfulcoyote) - on capitalism, slavery ...\r\n- [julianphilosophy](https://www.tiktok.com/@julianphilosophy) - philosophy and beyond\r\n- [nate.b.jones](https://www.tiktok.com/@nate.b.jones) - AI news\r\n- [@lizthedeveloper](https://www.tiktok.com/@lizthedeveloper) - AI news\r\n- [@christopherclaflin](https://www.tiktok.com/@christopherclaflin) - social media & the world\r\n- [@georebekah](https://www.tiktok.com/@georebekah) - politics, science\r\n- [@americanbaron](https://www.tiktok.com/@americanbaron) - philosophy & life\r\n- [@vagabondartist](https://www.tiktok.com/@vagabondartist) - leaving the USA\r\n- [@elle.cordova](https://www.tiktok.com/@elle.cordova) - creative wordsmith\r\n- [@pissedmagistus](https://www.tiktok.com/@pissedmagistus) - on capitalism & slavery\r\n- [@duarte_biz_gouveia](https://www.tiktok.com/@duarte_biz_gouveia/) - business coach\r\n- [@robertcroakofficial](https://www.tiktok.com/@robertcroakofficial/) - business coach\r\n- [@jennydinovi](https://www.tiktok.com/@jennydinovi/) - healing & self grow\r\n- [@drrachelbarr](https://www.tiktok.com/@drrachelbarr/) - practical neuro science\r\n- [@lexfridman](https://www.tiktok.com/@lexfridman) - tech podcast\r\n- [@shahidkbolsen](https://www.tiktok.com/@shahidkbolsen) - geo politics\r\n\r\n#### Culture\r\n\r\n- [Article: On Bullshit](http://www2.csudh.edu/ccauthen/576f12/frankfurt__harry_-_on_bullshit.pdf)\r\n\r\n- [Book: The parasitic mind](https://cdn.bookey.app/files/pdf/book/en/the-parasitic-mind.pdf)\r\n\r\n- [Video: Natural Law](https://www.youtube.com/watch?v=57UBuxnicOA&ab_channel=MarkPassio)\r\n\r\n- [Article: Reverse Engineering A Mysterious UDP Stream in My Hotel](https://www.gkbrk.com/2016/05/hotel-music/)\r\n\r\n- [Article: Why the creative industry needs to start talking about men's mental health](https://www.creativeboom.com/features/mens-mental-health-and-the-creative-industries/)\r\n- [Why the creative industry needs to start talking about men's mental health](https://www.creativeboom.com/features/mens-mental-health-and-the-creative-industries/)\r\n- [Interview: Evolution, Religion, and Happiness](https://www.youtube.com/watch?v=PTq6CYfikbg)\r\n- [Documentary: The Grab](https://www.imdb.com/title/tt21820452/)\r\n\r\n### Polymech - Resources\r\n\r\n- [Marketplace](https://shop.osr-plastic.org/)\r\n\r\n- [Howtos](https://forum.osr-plastic.org/c/wiki/howtos/72)\r\n\r\n- [Machine & Components Library](https://forum.osr-plastic.org/c/machines/49)\r\n\r\n- [Moulds - Library](https://files.polymech.io/files/machines/moulds/)\r\n\r\n- [Git Repository Machines](https://git.polymech.io/osr-plastic/osr-machines)\r\n\r\n- [Git Repository Code-Base](https://git.polymech.io/osr-plastic/osr-mono)\r\n\r\n- [Firmware](https://git.polymech.io/osr-plastic/osr-firmware)\r\n\r\n- [EMail](mailto:admin@osr-plastic.org)\r\n\r\n#### Talents\r\n\r\n- https://283bc.com/product.html\r\n- https://www.instagram.com/wedoo_workshop_bali\r\n- https://ko-fi.com/sotop_recycling (https://www.instagram.com/sotop_recycling/)\r\n- https://www.youtube.com/c/AndysMachines\r\n\r\n#### Plastic sheet providers\r\n\r\n- https://thegoodplasticcompany.com\r\n- https://www.sasminimum.com\r\n- https://belalbatros.com\r\n- https://thegoodplasticcompany.com\r\n- https://smile-plastics.com\r\n- https://www.resak.org\r\n- https://laplastiquerie.com\r\n\r\n#### Trade\r\n\r\n- [https://scrapo.com/](https://scrapo.com/)\r\n\r\n#### Data sets\r\n\r\n- [https://www.kaggle.com/](https://www.kaggle.com/search?q=plastic+datasetSize%3Asmall+datasetSize%3Amedium)\r\n- [https://www.oneplanetnetwork.org/knowledge-centre/resources](https://www.oneplanetnetwork.org/knowledge-centre/resources)\r\n\r\n#### Commercial Materials\r\n\r\n- [www.materialbank.eu](https://www.materialbank.eu/en/categories/materials/wallcovering)","src/content/resources/community.md","0ad0a33a7397124f",{"html":41,"metadata":42},"\u003Ch4 id=\"articles\">Articles\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.machinedesign.com/materials/article/21836156/plastic-gears-are-the-future\">Article: Plastic Gears Are the Future\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.construction-physics.com/p/will-stone-replace-steel-and-concrete\">Article: Will Stone Replace Steel and Concrete\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://bricknerd.com/home/every-type-of-plastic-used-by-lego-5-20-22\">Article:Every Type of Plastic Used By LEGO\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"finance--economy\">Finance & Economy\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://matt.sh/panic-at-the-job-market\">Panic At The Job Market\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://news.crunchbase.com/venture/monthly-vc-funding-recap-seed-downturn-july-2023/?utm_source=cb_daily&utm_medium=email&utm_campaign=20230703\">Venture Capital - 2023\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://news.crunchbase.com/venture/global-funding-recap-q1-2024/\">Venture Capital - 2024\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"technology\">Technology\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.acquired.fm/episodes/the-software-behind-silicon-with-synopsys-founder-aart-de-geus-and-ceo-sassine-ghazi\">Podcast : The Software behind Silicon\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://mdpi.com/2073-4360/15/19/3881\">Article : Advancing Plastic Recycling: Challenges and Opportunities in the Integration of 3D Printing and Distributed Recycling for a Circular Economy\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://3dprintingindustry.com/news/interview-aon3d-launches-hylo-and-basis-the-future-of-3d-printing-software-and-hardware-225751/\">Interview: AON3D Launches Hylo and Basis: The Future of 3D Printing Software and Hardware\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://forum.osr-plastic.org/t/ai-tools/11060\">Resource : Collection of AI Tools\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://github.com/ZachGoldberg/Startup-CTO-Handbook/blob/main/StartupCTOHandbook.md\">Resource: The CTO Handbook\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"opensource-projects\">Opensource Projects\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://willempennings.nl/balancing-cube/\">Balancing Cube\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.anninrobotics.com/robot-kits\">6DOF Robot\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://openbioeconomy.org/outputs/distributed-manufacturing-of-open-hardware-a-report-of-the-open-hardware-distribution-documentation-working-group/\">Distributed Manufacturing of Open Hardware: A Report of the Open Hardware Distribution & Documentation Working Group\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.law.nyu.edu/sites/default/files/DistributedManufacturingofOpenHardware.pdf\">Paper: Distributed Manufacturing of OpenHardware\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"social-media\">Social Media\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/waxworkrecords\">Instagram - Vinyl Record Production\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/smartest.worker\">Instagram : Smartest Worker\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.airgradient.com/blog/lessons-learned-plastic-injection-mold-making/\">Article : What we Learned Making a Plastic Injection Mold with a Chinese Mold Maker\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/p/C8r2Thqt4zt\">Instagram : New Talents “manutechlab”\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/p/C9h4WXvsnpC\">Instagram : Robot based printing - “The new raw”\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/p/C9VAtE6uY30\">Instagram : Robot based printing, using concrete and other materials”\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/p/CvNOfKhotvS\">Instagram : 3D Printer using gravity\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/ecollabo8/\">Instagram : Ecollab8\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"tiktok-cherries\">Tiktok Cherries\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@watchfulcoyote\">watchfulcoyote\u003C/a> - on capitalism, slavery …\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@julianphilosophy\">julianphilosophy\u003C/a> - philosophy and beyond\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@nate.b.jones\">nate.b.jones\u003C/a> - AI news\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@lizthedeveloper\">@lizthedeveloper\u003C/a> - AI news\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@christopherclaflin\">@christopherclaflin\u003C/a> - social media & the world\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@georebekah\">@georebekah\u003C/a> - politics, science\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@americanbaron\">@americanbaron\u003C/a> - philosophy & life\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@vagabondartist\">@vagabondartist\u003C/a> - leaving the USA\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@elle.cordova\">@elle.cordova\u003C/a> - creative wordsmith\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@pissedmagistus\">@pissedmagistus\u003C/a> - on capitalism & slavery\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@duarte_biz_gouveia/\">@duarte_biz_gouveia\u003C/a> - business coach\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@robertcroakofficial/\">@robertcroakofficial\u003C/a> - business coach\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@jennydinovi/\">@jennydinovi\u003C/a> - healing & self grow\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@drrachelbarr/\">@drrachelbarr\u003C/a> - practical neuro science\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@lexfridman\">@lexfridman\u003C/a> - tech podcast\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@shahidkbolsen\">@shahidkbolsen\u003C/a> - geo politics\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"culture\">Culture\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"http://www2.csudh.edu/ccauthen/576f12/frankfurt__harry_-_on_bullshit.pdf\">Article: On Bullshit\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://cdn.bookey.app/files/pdf/book/en/the-parasitic-mind.pdf\">Book: The parasitic mind\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.youtube.com/watch?v=57UBuxnicOA&ab_channel=MarkPassio\">Video: Natural Law\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.gkbrk.com/2016/05/hotel-music/\">Article: Reverse Engineering A Mysterious UDP Stream in My Hotel\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.creativeboom.com/features/mens-mental-health-and-the-creative-industries/\">Article: Why the creative industry needs to start talking about men’s mental health\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.creativeboom.com/features/mens-mental-health-and-the-creative-industries/\">Why the creative industry needs to start talking about men’s mental health\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.youtube.com/watch?v=PTq6CYfikbg\">Interview: Evolution, Religion, and Happiness\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.imdb.com/title/tt21820452/\">Documentary: The Grab\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"polymech---resources\">Polymech - Resources\u003C/h3>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://shop.osr-plastic.org/\">Marketplace\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://forum.osr-plastic.org/c/wiki/howtos/72\">Howtos\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://forum.osr-plastic.org/c/machines/49\">Machine & Components Library\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://files.polymech.io/files/machines/moulds/\">Moulds - Library\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-machines\">Git Repository Machines\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono\">Git Repository Code-Base\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-firmware\">Firmware\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"mailto:admin@osr-plastic.org\">EMail\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"talents\">Talents\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://283bc.com/product.html\">https://283bc.com/product.html\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.instagram.com/wedoo_workshop_bali\">https://www.instagram.com/wedoo_workshop_bali\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://ko-fi.com/sotop_recycling\">https://ko-fi.com/sotop_recycling\u003C/a> (\u003Ca href=\"https://www.instagram.com/sotop_recycling/\">https://www.instagram.com/sotop_recycling/\u003C/a>)\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.youtube.com/c/AndysMachines\">https://www.youtube.com/c/AndysMachines\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"plastic-sheet-providers\">Plastic sheet providers\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://thegoodplasticcompany.com\">https://thegoodplasticcompany.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.sasminimum.com\">https://www.sasminimum.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://belalbatros.com\">https://belalbatros.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://thegoodplasticcompany.com\">https://thegoodplasticcompany.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://smile-plastics.com\">https://smile-plastics.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.resak.org\">https://www.resak.org\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://laplastiquerie.com\">https://laplastiquerie.com\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"trade\">Trade\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://scrapo.com/\">https://scrapo.com/\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"data-sets\">Data sets\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://www.kaggle.com/search?q=plastic+datasetSize%3Asmall+datasetSize%3Amedium\">https://www.kaggle.com/\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.oneplanetnetwork.org/knowledge-centre/resources\">https://www.oneplanetnetwork.org/knowledge-centre/resources\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"commercial-materials\">Commercial Materials\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://www.materialbank.eu/en/categories/materials/wallcovering\">www.materialbank.eu\u003C/a>\u003C/li>\n\u003C/ul>",{"headings":43,"localImagePaths":85,"remoteImagePaths":86,"frontmatter":87,"imagePaths":91},[44,48,51,54,57,60,63,66,70,73,76,79,82],{"depth":45,"slug":46,"text":47},4,"articles","Articles",{"depth":45,"slug":49,"text":50},"finance--economy","Finance & Economy",{"depth":45,"slug":52,"text":53},"technology","Technology",{"depth":45,"slug":55,"text":56},"opensource-projects","Opensource Projects",{"depth":45,"slug":58,"text":59},"social-media","Social Media",{"depth":45,"slug":61,"text":62},"tiktok-cherries","Tiktok Cherries",{"depth":45,"slug":64,"text":65},"culture","Culture",{"depth":67,"slug":68,"text":69},3,"polymech---resources","Polymech - Resources",{"depth":45,"slug":71,"text":72},"talents","Talents",{"depth":45,"slug":74,"text":75},"plastic-sheet-providers","Plastic sheet providers",{"depth":45,"slug":77,"text":78},"trade","Trade",{"depth":45,"slug":80,"text":81},"data-sets","Data sets",{"depth":45,"slug":83,"text":84},"commercial-materials","Commercial Materials",[],[],{"pubDate":88,"title":28,"author":30,"description":19,"image":89,"tags":90},["Date","2024-04-01T00:00:00.000Z"],{"url":32,"alt":33},[25,35,36],[],"software",{"id":92,"data":94,"body":101,"filePath":102,"digest":103,"rendered":104},{"title":95,"pubDate":96,"description":97,"author":30,"image":98,"tags":99},"Software",["Date","2024-04-01T00:00:00.000Z"],"Overview software package",{"url":32,"alt":33},[100,35,36],"astro","We are pleased to share the tools that support us to develop open-source hardware and content technology for the public domain.\r\n\r\n[***Polymech-CAD***](https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-cad) helps us to maintain and publish thousands of parts and designs.\r\n\r\n[***Polymech-Language***](https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osrl) helps us with content creation as newsletters, documentation, manuals knowledgebases for various formats and platforms.\r\n\r\n[***Polymech-AI***](https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-ai) leverages OpenAI to create dynamic, question-driven content, keeping articles up-to-date instead of static and often fast outdated content. It also helps us with daily research, design and maintainence tasks.\r\n\r\n[***Polymech-Code-Bot***](https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-code-bot) As alternative to [bolt.new](https://bolt.new) and similar AI aided tools, we introduced a terminal variant that helps with data & code transformation, translations and reseach.\r\n\r\nWe are currently porting all packages to more recent standards, enabling free trade, modern content creation. That includes migrating content from PreciousPlastic and others sources due to massive corruption and censorship cases. See [here](https://forum.osr-plastic.org/t/preciousplastic-review/11066) more details.\r\n\r\n---","src/content/resources/software.md","c4896e1a6968e4b3",{"html":105,"metadata":106},"\u003Cp>We are pleased to share the tools that support us to develop open-source hardware and content technology for the public domain.\u003C/p>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-cad\">\u003Cem>\u003Cstrong>Polymech-CAD\u003C/strong>\u003C/em>\u003C/a> helps us to maintain and publish thousands of parts and designs.\u003C/p>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osrl\">\u003Cem>\u003Cstrong>Polymech-Language\u003C/strong>\u003C/em>\u003C/a> helps us with content creation as newsletters, documentation, manuals knowledgebases for various formats and platforms.\u003C/p>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-ai\">\u003Cem>\u003Cstrong>Polymech-AI\u003C/strong>\u003C/em>\u003C/a> leverages OpenAI to create dynamic, question-driven content, keeping articles up-to-date instead of static and often fast outdated content. It also helps us with daily research, design and maintainence tasks.\u003C/p>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-code-bot\">\u003Cem>\u003Cstrong>Polymech-Code-Bot\u003C/strong>\u003C/em>\u003C/a> As alternative to \u003Ca href=\"https://bolt.new\">bolt.new\u003C/a> and similar AI aided tools, we introduced a terminal variant that helps with data & code transformation, translations and reseach.\u003C/p>\n\u003Cp>We are currently porting all packages to more recent standards, enabling free trade, modern content creation. That includes migrating content from PreciousPlastic and others sources due to massive corruption and censorship cases. See \u003Ca href=\"https://forum.osr-plastic.org/t/preciousplastic-review/11066\">here\u003C/a> more details.\u003C/p>\n\u003Chr>",{"headings":107,"localImagePaths":108,"remoteImagePaths":109,"frontmatter":110,"imagePaths":114},[],[],[],{"pubDate":111,"title":95,"author":30,"description":97,"image":112,"tags":113},["Date","2024-04-01T00:00:00.000Z"],{"url":32,"alt":33},[100,35,36],[],"infopages",["Map",117,118,127,128,142,143,185,186,200,201,247,248],"contact",{"id":117,"data":119,"body":123,"filePath":124,"digest":125,"legacyId":126,"deferredRender":24},{"title":120,"description":121,"layout":122},"Contact","Contact Plastic Hub","@layouts/Markup.astro","import { Img } from 'imagetools/components'\r\nimport { default_image } from '@/app/config.js'\r\nimport GalleryK from \"@/components/polymech/gallery.astro\"\r\n\r\n\u003CImg src={default_image().src} alt=\"Contact\" />\r\n\r\n## {frontmatter.title} \r\n\r\n## Administration & Sales \r\n\r\n[sales@plastic-hub.com](mailto:/sales@plastic-hub.com)\r\n\r\nAnne Barbier - +34 691 952 287\r\n\r\nAddress - Factory\r\n\r\nPolígono Can Clapers\r\nCarrer Can peric 11, 1B\r\n08181 Sentmenat ~ Spain\r\n\r\nVAT - ID : ESY0100830N\r\n\r\n[Get Directions](https://www.google.com/maps/place/Plastic+Hub/@41.6093789,2.1399009,17z/data=!3m1!4b1!4m5!3m4!1s0x12a4eb80cfabbbfd:0x2cd16f2aff436ed!8m2!3d41.6094019!4d2.1421267)\r\n\r\n[Gallery](https://photos.app.goo.gl/cyVD5hGv3uHfuyKU6)","src/content/infopages/contact.mdx","33fdeb08a6a9fd7e","contact.mdx","about",{"id":127,"data":129,"filePath":132,"digest":133,"rendered":134,"legacyId":141},{"page":130,"pubDate":131},"About",["Date","2024-01-01T00:00:00.000Z"],"src/content/infopages/about.md","41aad46e60fd00db",{"html":19,"metadata":135},{"headings":136,"localImagePaths":137,"remoteImagePaths":138,"frontmatter":139,"imagePaths":140},[],[],[],{"page":130,"pubDate":131},[],"about.md","dpa",{"id":142,"data":144,"body":147,"filePath":148,"digest":149,"rendered":150,"legacyId":184},{"page":145,"pubDate":146},"DPA",["Date","2024-01-01T00:00:00.000Z"],"# Data Processing Agreement (DPA)\n\n## Introduction\n\nThis Data Processing Agreement (\"Agreement\") outlines the terms and responsibilities related to the processing of personal data by [Processor's Name] (\"Processor\") on behalf of [Controller's Name] (\"Controller\"), in accordance with the requirements of data protection laws applicable to the processing of personal data.\n\n## Definitions\n\n- **Personal Data**: Any information relating to an identified or identifiable natural person.\n- **Processing**: Any operation or set of operations which is performed on personal data or on sets of personal data.\n- **Data Subject**: An identified or identifiable natural person whose personal data is processed by the Processor on behalf of the Controller.\n\n## Scope and Purpose\n\nThe purpose of this Agreement is to ensure the lawful and compliant processing of Personal Data by the Processor, as instructed by the Controller, and to define the rights and obligations of both parties.\n\n## Data Processing Terms\n\n1. **Processing Instructions**: The Processor agrees to process personal data only based on documented instructions from the Controller, unless required to do so by law.\n2. **Security of Processing**: The Processor shall implement appropriate technical and organizational measures to ensure a level of security appropriate to the risk.\n3. **Subprocessing**: The Processor shall not engage another processor without prior specific or general written authorization from the Controller.\n4. **Data Subject Rights**: The Processor shall assist the Controller in ensuring compliance with the data subjects' rights under the applicable data protection laws.\n5. **Data Breach Notification**: The Processor shall notify the Controller without undue delay upon becoming aware of a personal data breach.\n\n## Duration and Termination\n\nThis Agreement shall remain in effect as long as the Processor is processing Personal Data on behalf of the Controller. Upon termination, the Processor shall, at the choice of the Controller, delete or return all Personal Data to the Controller and delete existing copies unless EU law or the national law of an EU member state requires storage of the personal data.\n\n## Governing Law\n\nThis Agreement shall be governed by the laws of [Jurisdiction].\n\n## Signature\n\nThis Agreement has been entered into on the date of the last signature below.\n\n[Controller's Name] Signature: ___________________________ Date: ___________\n\n[Processor's Name] Signature: _____________________________ Date: ___________","src/content/infopages/dpa.md","45dfdc6d1d729847",{"html":151,"metadata":152},"\u003Ch1 id=\"data-processing-agreement-dpa\">Data Processing Agreement (DPA)\u003C/h1>\n\u003Ch2 id=\"introduction\">Introduction\u003C/h2>\n\u003Cp>This Data Processing Agreement (“Agreement”) outlines the terms and responsibilities related to the processing of personal data by [Processor’s Name] (“Processor”) on behalf of [Controller’s Name] (“Controller”), in accordance with the requirements of data protection laws applicable to the processing of personal data.\u003C/p>\n\u003Ch2 id=\"definitions\">Definitions\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Personal Data\u003C/strong>: Any information relating to an identified or identifiable natural person.\u003C/li>\n\u003Cli>\u003Cstrong>Processing\u003C/strong>: Any operation or set of operations which is performed on personal data or on sets of personal data.\u003C/li>\n\u003Cli>\u003Cstrong>Data Subject\u003C/strong>: An identified or identifiable natural person whose personal data is processed by the Processor on behalf of the Controller.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"scope-and-purpose\">Scope and Purpose\u003C/h2>\n\u003Cp>The purpose of this Agreement is to ensure the lawful and compliant processing of Personal Data by the Processor, as instructed by the Controller, and to define the rights and obligations of both parties.\u003C/p>\n\u003Ch2 id=\"data-processing-terms\">Data Processing Terms\u003C/h2>\n\u003Col>\n\u003Cli>\u003Cstrong>Processing Instructions\u003C/strong>: The Processor agrees to process personal data only based on documented instructions from the Controller, unless required to do so by law.\u003C/li>\n\u003Cli>\u003Cstrong>Security of Processing\u003C/strong>: The Processor shall implement appropriate technical and organizational measures to ensure a level of security appropriate to the risk.\u003C/li>\n\u003Cli>\u003Cstrong>Subprocessing\u003C/strong>: The Processor shall not engage another processor without prior specific or general written authorization from the Controller.\u003C/li>\n\u003Cli>\u003Cstrong>Data Subject Rights\u003C/strong>: The Processor shall assist the Controller in ensuring compliance with the data subjects’ rights under the applicable data protection laws.\u003C/li>\n\u003Cli>\u003Cstrong>Data Breach Notification\u003C/strong>: The Processor shall notify the Controller without undue delay upon becoming aware of a personal data breach.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"duration-and-termination\">Duration and Termination\u003C/h2>\n\u003Cp>This Agreement shall remain in effect as long as the Processor is processing Personal Data on behalf of the Controller. Upon termination, the Processor shall, at the choice of the Controller, delete or return all Personal Data to the Controller and delete existing copies unless EU law or the national law of an EU member state requires storage of the personal data.\u003C/p>\n\u003Ch2 id=\"governing-law\">Governing Law\u003C/h2>\n\u003Cp>This Agreement shall be governed by the laws of [Jurisdiction].\u003C/p>\n\u003Ch2 id=\"signature\">Signature\u003C/h2>\n\u003Cp>This Agreement has been entered into on the date of the last signature below.\u003C/p>\n\u003Cp>[Controller’s Name] Signature: ___________________________ Date: ___________\u003C/p>\n\u003Cp>[Processor’s Name] Signature: _____________________________ Date: ___________\u003C/p>",{"headings":153,"localImagePaths":180,"remoteImagePaths":181,"frontmatter":182,"imagePaths":183},[154,158,162,165,168,171,174,177],{"depth":155,"slug":156,"text":157},1,"data-processing-agreement-dpa","Data Processing Agreement (DPA)",{"depth":159,"slug":160,"text":161},2,"introduction","Introduction",{"depth":159,"slug":163,"text":164},"definitions","Definitions",{"depth":159,"slug":166,"text":167},"scope-and-purpose","Scope and Purpose",{"depth":159,"slug":169,"text":170},"data-processing-terms","Data Processing Terms",{"depth":159,"slug":172,"text":173},"duration-and-termination","Duration and Termination",{"depth":159,"slug":175,"text":176},"governing-law","Governing Law",{"depth":159,"slug":178,"text":179},"signature","Signature",[],[],{"page":145,"pubDate":146},[],"dpa.md","cookies",{"id":185,"data":187,"filePath":190,"digest":191,"rendered":192,"legacyId":199},{"page":188,"pubDate":189},"Cookies",["Date","2024-01-01T00:00:00.000Z"],"src/content/infopages/cookies.md","edcd54ab141950aa",{"html":19,"metadata":193},{"headings":194,"localImagePaths":195,"remoteImagePaths":196,"frontmatter":197,"imagePaths":198},[],[],[],{"page":188,"pubDate":189},[],"cookies.md","terms",{"id":200,"data":202,"body":205,"filePath":206,"digest":207,"rendered":208,"legacyId":246},{"page":203,"pubDate":204},"Terms",["Date","2024-01-01T00:00:00.000Z"],"All the terms that you agree to when you sign up for a Lexington product.\n-------------------------------------------------------------------------\n\nFrom everyone at Lexington, thank you for using our products! We build them to help you do your best work. There are millions of people using Lexington products every day. Because we don’t know every one of our customers personally, we have to put in place some Terms of Service to help keep the ship afloat.\n\nWhen we say “Company”, “we”, “our”, or “us” in this document, we are referring to [Lexington LLC](#_). We spun off Highrise HQ, LLC in the past, but it has since rejoined Lexington LLC.\n\nWhen we say “Services”, we mean our websites, including Lexington.com, hey.com, and Lexington.com, and any product created and maintained by Lexington LLC. That includes Lexington (all versions), HEY, Highrise, Campfire, Backpack, Ta-da List, and Writeboard, whether delivered within a web browser, desktop application, mobile application, or another format.\n\nWhen we say “You” or “your”, we are referring to the people or organizations that own an account with one or more of our Services. We have specific ownership policies for our products: [Lexington 4](#_), [Lexington 2](#_), [Lexington Classic](#_), [HEY for Domains](#_), [Highrise](#_), [Campfire](#_) and [Backpack](#_).\n\nWe may update these Terms of Service (\"Terms\") in the future. You can track all changes made since mid-2018 [on GitHub](#_). Typically these changes have been to clarify some of these terms by linking to an expanded related policy. Whenever we make a significant change to our policies, we will refresh the date at the top of this page and take any other appropriate steps to notify account holders.\n\nWhen you use our Services, now or in the future, you are agreeing to the latest Terms. There may be times where we do not exercise or enforce a right or provision of the Terms; however, that does not mean we are waiving that right or provision. **These Terms do contain a limitation of our liability.**\n\nIf you violate any of the Terms, we may terminate your account. That’s a broad statement and it means you need to place a lot of trust in us. We do our best to deserve that trust by being open about [who we are](#_), [how we work](#_), and keeping an open door to [your feedback](#_).\n\nAccount Terms\n-------------\n\n1. You are responsible for maintaining the security of your account and password and for ensuring that any of your users do the same. The Company cannot and will not be liable for any loss or damage from your failure to comply with this security obligation. We recommend all users set up [two-factor authentication](#_) for added security. In some of our Services, we may require it.\n2. You may not use the Services for any purpose outlined in our [Use Restrictions policy](#_), and you may not permit any of your users to do so, either.\n3. You are responsible for all content posted to and activity that occurs under your account, including content posted by and activity of any users in your account.\n4. You must be a human. Accounts registered by “bots” or other automated methods are not permitted.\n\nPayment, Refunds, and Plan Changes\n----------------------------------\n\n1. If you are using a free version of one of our Services, it is really free: we do not ask you for your credit card and — just like for customers who pay for our Services — we do not sell your data.\n2. For paid Services that offer a free trial, we explain the length of trial when you sign up. After the trial period, you need to pay in advance to keep using the Service. If you do not pay, we will freeze your account and it will be inaccessible until you make payment. If your account has been frozen for a while, we will queue it up for auto-cancellation. See our [Cancellation policy](#_) for more details.\n3. If you are upgrading from a free plan to a paid plan, we will charge your card immediately and your billing cycle starts on the day of upgrade. For other upgrades or downgrades in plan level, the new rate starts from the next billing cycle.\n4. All fees are exclusive of all taxes, levies, or duties imposed by taxing authorities. Where required, we will collect those taxes on behalf of the taxing authority and remit those taxes to taxing authorities. See our [Taxes policy](#_) for more details. Otherwise, you are responsible for payment of all taxes, levies, or duties.\n5. We process refunds according to our [Fair Refund policy](#_).\n\nCancellation and Termination\n----------------------------\n\n1. You are solely responsible for properly canceling your account. Within each of our Services, we provide a simple no-questions-asked cancellation link. You can find instructions for how to cancel your account in our [Cancellation policy](#_). An email or phone request to cancel your account is not automatically considered cancellation. If you need help canceling your account, you can always [contact our Support team](#_).\n2. All of your content will be inaccessible from the Services immediately upon account cancellation. Within 30 days, all content will be permanently deleted from active systems and logs. Within 60 days, all content will be permanently deleted from our backups. We cannot recover this information once it has been permanently deleted. If you want to export any data before your account is canceled, we‘ve provided instructions for [HEY](#_), [Lexington 4](#_), [Lexington 2](#_), [Lexington Classic](#_), [Highrise](#_), [Campfire](#_), and [Backpack](#_).\n3. If you cancel the Service before the end of your current paid up month, your cancellation will take effect immediately, and you will not be charged again. We do not automatically prorate unused time in the last billing cycle. See our [Fair Refund policy](#_) for more details.\n4. We have the right to suspend or terminate your account and refuse any and all current or future use of our Services for any reason at any time. Suspension means you and any other users on your account will not be able to access the account or any content in the account. Termination will furthermore result in the deletion of your account or your access to your account, and the forfeiture and relinquishment of all content in your account. We also reserve the right to refuse the use of the Services to anyone for any reason at any time. We have this clause because statistically speaking, out of the hundreds of thousands of accounts on our Services, there is at least one doing something nefarious. There are some things we staunchly stand against and this clause is how we exercise that stance. For more details, see our [Use Restrictions policy](#_).\n5. Verbal, physical, written or other abuse (including threats of abuse or retribution) of a Company employee or officer will result in immediate account termination.\n\nModifications to the Service and Prices\n---------------------------------------\n\n1. We make a promise to our customers to support our Services [until the end of the Internet](#_). That means when it comes to security, privacy, and customer support, we will continue to maintain any legacy Services. Sometimes it becomes technically impossible to continue a feature or we redesign a part of our Services because we think it could be better or we decide to close new signups of a product. We reserve the right at any time to modify or discontinue, temporarily or permanently, any part of our Services with or without notice.\n2. Sometimes we change the pricing structure for our products. When we do that, we tend to exempt existing customers from those changes. However, we may choose to change the prices for existing customers. If we do so, we will give at least 30 days notice and will notify you via the email address on record. We may also post a notice about changes on our websites or the affected Services themselves.\n\nUptime, Security, and Privacy\n-----------------------------\n\n1. Your use of the Services is at your sole risk. We provide these Services on an “as is” and “as available” basis. We do not offer service-level agreements for most of our Services — here’s [the one exception](#_) — but do take uptime of our applications seriously. Visit [https://www.37status.com](#_) to see the status of our Services.\n2. We reserve the right to temporarily disable your account if your usage significantly exceeds the average usage of other customers of the Services. Of course, we’ll reach out to the account owner before taking any action except in rare cases where the level of use may negatively impact the performance of the Service for other customers.\n3. We take many measures to protect and secure your data through backups, redundancies, and encryption. We enforce encryption for data transmission from the public Internet. There are some edge cases where we may send your data through our network unencrypted. Please refer to our [Security Overview](#_) for full details and our [Security Response page](#_) for how to report a security incident or threat.\n4. When you use our Services, you entrust us with your data. We take that trust to heart. You agree that Lexington may process your data as described in our [Privacy Policy](#_) and for no other purpose. We as humans can access your data for the following reasons:\n\n * **To help you with support requests you make.** We’ll ask for express consent before accessing your account.\n * **On the rare occasions when an error occurs that stops an automated process partway through.** We get automated alerts when such errors occur. When we can fix the issue and restart automated processing without looking at any personal data, we do. In rare cases, we have to look at a minimum amount of personal data to fix the issue. In these rare cases, we aim to fix the root cause to prevent the errors from recurring.\n * **To safeguard Lexington.** We’ll look at logs and metadata as part of our work to ensure the security of your data and the Services as a whole. If necessary, we may also access accounts as part of an [abuse report investigation](#_).\n * **To the extent required by applicable law.** As a US company with all data infrastructure located in the US, we only preserve or share customer data if compelled by a US government authority with a legally binding order or proper request under the Stored Communications Act, or in limited circumstances in the event of an emergency request. If a non-US authority approaches Lexington for assistance, our default stance is to refuse unless the order has been approved by the US government, which compels us to comply through procedures outlined in an established mutual legal assistance treaty or agreement mechanism. If Lexington is audited by a tax authority, we only share the bare minimum billing information needed to complete the audit.\n5. We use third party vendors and hosting partners to provide the necessary hardware, software, networking, storage, and related technology required to run the Services. You can see a list of all subprocessors who handle personal data for [Lexington](#_), [HEY](#_), [Highrise](#_), [Campfire](#_), and [Backpack](#_), as well as a list of [Company processors](#_).\n\n6. Under the California Consumer Privacy Act (“CCPA”), Lexington is a “service provider”, not a “business” or “third party”, with respect to your use of the Services. That means we process any data you share with us only for the purpose you signed up for and as described in these Terms, the [Privacy policy](#_), and [other policies](#_). We do not retain, use, disclose, or sell any of that information for any other commercial purposes unless we have your explicit permission. And on the flip-side, you agree to comply with your requirements under the CCPA and not use Lexington’s Services in a way that violates the regulations.\n7. These Terms incorporate the [Lexington Data Processing Addendum (“DPA”)](#_) when the EU General Data Protection Regulation (“GDPR”) or United Kingdom General Data Protection Regulation (“UK GDPR”) applies to your use of Lexington Services to process Customer Data as defined in the DPA. The DPA linked above supersedes any previously agreed data processing addendum between you and Lexington LLC relating to your use of the Lexington Services.\n\nCopyright and Content Ownership\n-------------------------------\n\n1. All content posted on the Services must comply with U.S. copyright law. We provide details on [how to file a copyright infringement claim](#_).\n2. You give us a limited license to use the content posted by you and your users in order to provide the Services to you, but we claim no ownership rights over those materials. All materials you submit to the Services remain yours.\n3. We do not pre-screen content, but we reserve the right (but not the obligation) in our sole discretion to refuse or remove any content that is available via the Service.\n4. The Company or its licensors own all right, title, and interest in and to the Services, including all intellectual property rights therein, and you obtain no ownership rights in the Services as a result of your use. You may not duplicate, copy, or reuse any portion of the HTML, CSS, JavaScript, or visual design elements without express written permission from the Company. You must request permission to use the Company’s logos or any Service logos for promotional purposes. Please [email us](#_) requests to use logos. We reserve the right to rescind any permissions if you violate these Terms.\n5. You agree not to reproduce, duplicate, copy, sell, resell or exploit any portion of the Services, use of the Services, or access to the Services without the express written permission of the Company.\n\nFeatures and Bugs\n-----------------\n\nWe design our Services with care, based on our own experience and the experiences of customers who share their time and feedback. However, there is no such thing as a service that pleases everybody. We make no guarantees that our Services will meet your specific requirements or expectations.\n\nWe also test all of our features extensively before shipping them. As with any software, our Services inevitably have some bugs. We track the bugs reported to us and work through priority ones, especially any related to security or privacy. Not all reported bugs will get fixed and we don’t guarantee completely error-free Services.\n\nServices Adaptations and API Terms\n----------------------------------\n\nWe offer Application Program Interfaces (“API”s) for some of our Services (currently Lexington, Highrise, Campfire, and Backpack). Any use of the API, including through a third-party product that accesses the Services, is bound by these Terms plus the following specific terms:\n\n1. You expressly understand and agree that we are not liable for any damages or losses resulting from your use of the API or third-party products that access data via the API.\n2. Third parties may not access and employ the API if the functionality is part of an application that remotely records, monitors, or reports a Service user’s activity _other than time tracking_, both inside and outside the applications. The Company, in its sole discretion, will determine if an integration service violates this bylaw. A third party that has built and deployed an integration for the purpose of remote user surveillance will be required to remove that integration.\n3. Abuse or excessively frequent requests to the Services via the API may result in the temporary or permanent suspension of your account’s access to the API. The Company, in its sole discretion, will determine abuse or excessive usage of the API. If we need to suspend your account’s access, we will attempt to warn the account owner first. If your API usage could or has caused downtime, we may cut off access without prior notice.\n\nSome third-party providers have created integrations between our Services and theirs. You can find some of those integrations for Lexington at [https://Lexington.com/extras](#_) and for Highrise at [https://highrisehq.com/extras](#_). We are not liable or accountable for any of these third-party integrations.\n\nLiability\n---------\n\nWe mention liability throughout these Terms but to put it all in one section:\n\n**_You expressly understand and agree that the Company shall not be liable, in law or in equity, to you or to any third party for any direct, indirect, incidental, lost profits, special, consequential, punitive or exemplary damages, including, but not limited to, damages for loss of profits, goodwill, use, data or other intangible losses (even if the Company has been advised of the possibility of such damages), resulting from: (i) the use or the inability to use the Services; (ii) the cost of procurement of substitute goods and services resulting from any goods, data, information or services purchased or obtained or messages received or transactions entered into through or from the Services; (iii) unauthorized access to or alteration of your transmissions or data; (iv) statements or conduct of any third party on the service; (v) or any other matter relating to these Terms or the Services, whether as a breach of contract, tort (including negligence whether active or passive), or any other theory of liability._**\n\nIn other words: choosing to use our Services does mean you are making a bet on us. If the bet does not work out, that’s on you, not us. We do our darnedest to be as safe a bet as possible through careful management of the business; investments in security, infrastructure, and talent; and in general [giving a damn](#_). If you choose to use our Services, thank you for betting on us.\n\nIf you have a question about any of these Terms, please [contact our Support team](#_).","src/content/infopages/terms.md","c00802cb6420bd7b",{"html":209,"metadata":210},"\u003Ch2 id=\"all-the-terms-that-you-agree-to-when-you-sign-up-for-a-lexington-product\">All the terms that you agree to when you sign up for a Lexington product.\u003C/h2>\n\u003Cp>From everyone at Lexington, thank you for using our products! We build them to help you do your best work. There are millions of people using Lexington products every day. Because we don’t know every one of our customers personally, we have to put in place some Terms of Service to help keep the ship afloat.\u003C/p>\n\u003Cp>When we say “Company”, “we”, “our”, or “us” in this document, we are referring to \u003Ca href=\"#_\">Lexington LLC\u003C/a>. We spun off Highrise HQ, LLC in the past, but it has since rejoined Lexington LLC.\u003C/p>\n\u003Cp>When we say “Services”, we mean our websites, including Lexington.com, hey.com, and Lexington.com, and any product created and maintained by Lexington LLC. That includes Lexington (all versions), HEY, Highrise, Campfire, Backpack, Ta-da List, and Writeboard, whether delivered within a web browser, desktop application, mobile application, or another format.\u003C/p>\n\u003Cp>When we say “You” or “your”, we are referring to the people or organizations that own an account with one or more of our Services. We have specific ownership policies for our products: \u003Ca href=\"#_\">Lexington 4\u003C/a>, \u003Ca href=\"#_\">Lexington 2\u003C/a>, \u003Ca href=\"#_\">Lexington Classic\u003C/a>, \u003Ca href=\"#_\">HEY for Domains\u003C/a>, \u003Ca href=\"#_\">Highrise\u003C/a>, \u003Ca href=\"#_\">Campfire\u003C/a> and \u003Ca href=\"#_\">Backpack\u003C/a>.\u003C/p>\n\u003Cp>We may update these Terms of Service (“Terms”) in the future. You can track all changes made since mid-2018 \u003Ca href=\"#_\">on GitHub\u003C/a>. Typically these changes have been to clarify some of these terms by linking to an expanded related policy. Whenever we make a significant change to our policies, we will refresh the date at the top of this page and take any other appropriate steps to notify account holders.\u003C/p>\n\u003Cp>When you use our Services, now or in the future, you are agreeing to the latest Terms. There may be times where we do not exercise or enforce a right or provision of the Terms; however, that does not mean we are waiving that right or provision. \u003Cstrong>These Terms do contain a limitation of our liability.\u003C/strong>\u003C/p>\n\u003Cp>If you violate any of the Terms, we may terminate your account. That’s a broad statement and it means you need to place a lot of trust in us. We do our best to deserve that trust by being open about \u003Ca href=\"#_\">who we are\u003C/a>, \u003Ca href=\"#_\">how we work\u003C/a>, and keeping an open door to \u003Ca href=\"#_\">your feedback\u003C/a>.\u003C/p>\n\u003Ch2 id=\"account-terms\">Account Terms\u003C/h2>\n\u003Col>\n\u003Cli>You are responsible for maintaining the security of your account and password and for ensuring that any of your users do the same. The Company cannot and will not be liable for any loss or damage from your failure to comply with this security obligation. We recommend all users set up \u003Ca href=\"#_\">two-factor authentication\u003C/a> for added security. In some of our Services, we may require it.\u003C/li>\n\u003Cli>You may not use the Services for any purpose outlined in our \u003Ca href=\"#_\">Use Restrictions policy\u003C/a>, and you may not permit any of your users to do so, either.\u003C/li>\n\u003Cli>You are responsible for all content posted to and activity that occurs under your account, including content posted by and activity of any users in your account.\u003C/li>\n\u003Cli>You must be a human. Accounts registered by “bots” or other automated methods are not permitted.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"payment-refunds-and-plan-changes\">Payment, Refunds, and Plan Changes\u003C/h2>\n\u003Col>\n\u003Cli>If you are using a free version of one of our Services, it is really free: we do not ask you for your credit card and — just like for customers who pay for our Services — we do not sell your data.\u003C/li>\n\u003Cli>For paid Services that offer a free trial, we explain the length of trial when you sign up. After the trial period, you need to pay in advance to keep using the Service. If you do not pay, we will freeze your account and it will be inaccessible until you make payment. If your account has been frozen for a while, we will queue it up for auto-cancellation. See our \u003Ca href=\"#_\">Cancellation policy\u003C/a> for more details.\u003C/li>\n\u003Cli>If you are upgrading from a free plan to a paid plan, we will charge your card immediately and your billing cycle starts on the day of upgrade. For other upgrades or downgrades in plan level, the new rate starts from the next billing cycle.\u003C/li>\n\u003Cli>All fees are exclusive of all taxes, levies, or duties imposed by taxing authorities. Where required, we will collect those taxes on behalf of the taxing authority and remit those taxes to taxing authorities. See our \u003Ca href=\"#_\">Taxes policy\u003C/a> for more details. Otherwise, you are responsible for payment of all taxes, levies, or duties.\u003C/li>\n\u003Cli>We process refunds according to our \u003Ca href=\"#_\">Fair Refund policy\u003C/a>.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"cancellation-and-termination\">Cancellation and Termination\u003C/h2>\n\u003Col>\n\u003Cli>You are solely responsible for properly canceling your account. Within each of our Services, we provide a simple no-questions-asked cancellation link. You can find instructions for how to cancel your account in our \u003Ca href=\"#_\">Cancellation policy\u003C/a>. An email or phone request to cancel your account is not automatically considered cancellation. If you need help canceling your account, you can always \u003Ca href=\"#_\">contact our Support team\u003C/a>.\u003C/li>\n\u003Cli>All of your content will be inaccessible from the Services immediately upon account cancellation. Within 30 days, all content will be permanently deleted from active systems and logs. Within 60 days, all content will be permanently deleted from our backups. We cannot recover this information once it has been permanently deleted. If you want to export any data before your account is canceled, we‘ve provided instructions for \u003Ca href=\"#_\">HEY\u003C/a>, \u003Ca href=\"#_\">Lexington 4\u003C/a>, \u003Ca href=\"#_\">Lexington 2\u003C/a>, \u003Ca href=\"#_\">Lexington Classic\u003C/a>, \u003Ca href=\"#_\">Highrise\u003C/a>, \u003Ca href=\"#_\">Campfire\u003C/a>, and \u003Ca href=\"#_\">Backpack\u003C/a>.\u003C/li>\n\u003Cli>If you cancel the Service before the end of your current paid up month, your cancellation will take effect immediately, and you will not be charged again. We do not automatically prorate unused time in the last billing cycle. See our \u003Ca href=\"#_\">Fair Refund policy\u003C/a> for more details.\u003C/li>\n\u003Cli>We have the right to suspend or terminate your account and refuse any and all current or future use of our Services for any reason at any time. Suspension means you and any other users on your account will not be able to access the account or any content in the account. Termination will furthermore result in the deletion of your account or your access to your account, and the forfeiture and relinquishment of all content in your account. We also reserve the right to refuse the use of the Services to anyone for any reason at any time. We have this clause because statistically speaking, out of the hundreds of thousands of accounts on our Services, there is at least one doing something nefarious. There are some things we staunchly stand against and this clause is how we exercise that stance. For more details, see our \u003Ca href=\"#_\">Use Restrictions policy\u003C/a>.\u003C/li>\n\u003Cli>Verbal, physical, written or other abuse (including threats of abuse or retribution) of a Company employee or officer will result in immediate account termination.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"modifications-to-the-service-and-prices\">Modifications to the Service and Prices\u003C/h2>\n\u003Col>\n\u003Cli>We make a promise to our customers to support our Services \u003Ca href=\"#_\">until the end of the Internet\u003C/a>. That means when it comes to security, privacy, and customer support, we will continue to maintain any legacy Services. Sometimes it becomes technically impossible to continue a feature or we redesign a part of our Services because we think it could be better or we decide to close new signups of a product. We reserve the right at any time to modify or discontinue, temporarily or permanently, any part of our Services with or without notice.\u003C/li>\n\u003Cli>Sometimes we change the pricing structure for our products. When we do that, we tend to exempt existing customers from those changes. However, we may choose to change the prices for existing customers. If we do so, we will give at least 30 days notice and will notify you via the email address on record. We may also post a notice about changes on our websites or the affected Services themselves.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"uptime-security-and-privacy\">Uptime, Security, and Privacy\u003C/h2>\n\u003Col>\n\u003Cli>\n\u003Cp>Your use of the Services is at your sole risk. We provide these Services on an “as is” and “as available” basis. We do not offer service-level agreements for most of our Services — here’s \u003Ca href=\"#_\">the one exception\u003C/a> — but do take uptime of our applications seriously. Visit \u003Ca href=\"#_\">https://www.37status.com\u003C/a> to see the status of our Services.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>We reserve the right to temporarily disable your account if your usage significantly exceeds the average usage of other customers of the Services. Of course, we’ll reach out to the account owner before taking any action except in rare cases where the level of use may negatively impact the performance of the Service for other customers.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>We take many measures to protect and secure your data through backups, redundancies, and encryption. We enforce encryption for data transmission from the public Internet. There are some edge cases where we may send your data through our network unencrypted. Please refer to our \u003Ca href=\"#_\">Security Overview\u003C/a> for full details and our \u003Ca href=\"#_\">Security Response page\u003C/a> for how to report a security incident or threat.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>When you use our Services, you entrust us with your data. We take that trust to heart. You agree that Lexington may process your data as described in our \u003Ca href=\"#_\">Privacy Policy\u003C/a> and for no other purpose. We as humans can access your data for the following reasons:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>To help you with support requests you make.\u003C/strong> We’ll ask for express consent before accessing your account.\u003C/li>\n\u003Cli>\u003Cstrong>On the rare occasions when an error occurs that stops an automated process partway through.\u003C/strong> We get automated alerts when such errors occur. When we can fix the issue and restart automated processing without looking at any personal data, we do. In rare cases, we have to look at a minimum amount of personal data to fix the issue. In these rare cases, we aim to fix the root cause to prevent the errors from recurring.\u003C/li>\n\u003Cli>\u003Cstrong>To safeguard Lexington.\u003C/strong> We’ll look at logs and metadata as part of our work to ensure the security of your data and the Services as a whole. If necessary, we may also access accounts as part of an \u003Ca href=\"#_\">abuse report investigation\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>To the extent required by applicable law.\u003C/strong> As a US company with all data infrastructure located in the US, we only preserve or share customer data if compelled by a US government authority with a legally binding order or proper request under the Stored Communications Act, or in limited circumstances in the event of an emergency request. If a non-US authority approaches Lexington for assistance, our default stance is to refuse unless the order has been approved by the US government, which compels us to comply through procedures outlined in an established mutual legal assistance treaty or agreement mechanism. If Lexington is audited by a tax authority, we only share the bare minimum billing information needed to complete the audit.\u003C/li>\n\u003C/ul>\n\u003C/li>\n\u003Cli>\n\u003Cp>We use third party vendors and hosting partners to provide the necessary hardware, software, networking, storage, and related technology required to run the Services. You can see a list of all subprocessors who handle personal data for \u003Ca href=\"#_\">Lexington\u003C/a>, \u003Ca href=\"#_\">HEY\u003C/a>, \u003Ca href=\"#_\">Highrise\u003C/a>, \u003Ca href=\"#_\">Campfire\u003C/a>, and \u003Ca href=\"#_\">Backpack\u003C/a>, as well as a list of \u003Ca href=\"#_\">Company processors\u003C/a>.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Under the California Consumer Privacy Act (“CCPA”), Lexington is a “service provider”, not a “business” or “third party”, with respect to your use of the Services. That means we process any data you share with us only for the purpose you signed up for and as described in these Terms, the \u003Ca href=\"#_\">Privacy policy\u003C/a>, and \u003Ca href=\"#_\">other policies\u003C/a>. We do not retain, use, disclose, or sell any of that information for any other commercial purposes unless we have your explicit permission. And on the flip-side, you agree to comply with your requirements under the CCPA and not use Lexington’s Services in a way that violates the regulations.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>These Terms incorporate the \u003Ca href=\"#_\">Lexington Data Processing Addendum (“DPA”)\u003C/a> when the EU General Data Protection Regulation (“GDPR”) or United Kingdom General Data Protection Regulation (“UK GDPR”) applies to your use of Lexington Services to process Customer Data as defined in the DPA. The DPA linked above supersedes any previously agreed data processing addendum between you and Lexington LLC relating to your use of the Lexington Services.\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"copyright-and-content-ownership\">Copyright and Content Ownership\u003C/h2>\n\u003Col>\n\u003Cli>All content posted on the Services must comply with U.S. copyright law. We provide details on \u003Ca href=\"#_\">how to file a copyright infringement claim\u003C/a>.\u003C/li>\n\u003Cli>You give us a limited license to use the content posted by you and your users in order to provide the Services to you, but we claim no ownership rights over those materials. All materials you submit to the Services remain yours.\u003C/li>\n\u003Cli>We do not pre-screen content, but we reserve the right (but not the obligation) in our sole discretion to refuse or remove any content that is available via the Service.\u003C/li>\n\u003Cli>The Company or its licensors own all right, title, and interest in and to the Services, including all intellectual property rights therein, and you obtain no ownership rights in the Services as a result of your use. You may not duplicate, copy, or reuse any portion of the HTML, CSS, JavaScript, or visual design elements without express written permission from the Company. You must request permission to use the Company’s logos or any Service logos for promotional purposes. Please \u003Ca href=\"#_\">email us\u003C/a> requests to use logos. We reserve the right to rescind any permissions if you violate these Terms.\u003C/li>\n\u003Cli>You agree not to reproduce, duplicate, copy, sell, resell or exploit any portion of the Services, use of the Services, or access to the Services without the express written permission of the Company.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"features-and-bugs\">Features and Bugs\u003C/h2>\n\u003Cp>We design our Services with care, based on our own experience and the experiences of customers who share their time and feedback. However, there is no such thing as a service that pleases everybody. We make no guarantees that our Services will meet your specific requirements or expectations.\u003C/p>\n\u003Cp>We also test all of our features extensively before shipping them. As with any software, our Services inevitably have some bugs. We track the bugs reported to us and work through priority ones, especially any related to security or privacy. Not all reported bugs will get fixed and we don’t guarantee completely error-free Services.\u003C/p>\n\u003Ch2 id=\"services-adaptations-and-api-terms\">Services Adaptations and API Terms\u003C/h2>\n\u003Cp>We offer Application Program Interfaces (“API”s) for some of our Services (currently Lexington, Highrise, Campfire, and Backpack). Any use of the API, including through a third-party product that accesses the Services, is bound by these Terms plus the following specific terms:\u003C/p>\n\u003Col>\n\u003Cli>You expressly understand and agree that we are not liable for any damages or losses resulting from your use of the API or third-party products that access data via the API.\u003C/li>\n\u003Cli>Third parties may not access and employ the API if the functionality is part of an application that remotely records, monitors, or reports a Service user’s activity \u003Cem>other than time tracking\u003C/em>, both inside and outside the applications. The Company, in its sole discretion, will determine if an integration service violates this bylaw. A third party that has built and deployed an integration for the purpose of remote user surveillance will be required to remove that integration.\u003C/li>\n\u003Cli>Abuse or excessively frequent requests to the Services via the API may result in the temporary or permanent suspension of your account’s access to the API. The Company, in its sole discretion, will determine abuse or excessive usage of the API. If we need to suspend your account’s access, we will attempt to warn the account owner first. If your API usage could or has caused downtime, we may cut off access without prior notice.\u003C/li>\n\u003C/ol>\n\u003Cp>Some third-party providers have created integrations between our Services and theirs. You can find some of those integrations for Lexington at \u003Ca href=\"#_\">https://Lexington.com/extras\u003C/a> and for Highrise at \u003Ca href=\"#_\">https://highrisehq.com/extras\u003C/a>. We are not liable or accountable for any of these third-party integrations.\u003C/p>\n\u003Ch2 id=\"liability\">Liability\u003C/h2>\n\u003Cp>We mention liability throughout these Terms but to put it all in one section:\u003C/p>\n\u003Cp>\u003Cstrong>\u003Cem>You expressly understand and agree that the Company shall not be liable, in law or in equity, to you or to any third party for any direct, indirect, incidental, lost profits, special, consequential, punitive or exemplary damages, including, but not limited to, damages for loss of profits, goodwill, use, data or other intangible losses (even if the Company has been advised of the possibility of such damages), resulting from: (i) the use or the inability to use the Services; (ii) the cost of procurement of substitute goods and services resulting from any goods, data, information or services purchased or obtained or messages received or transactions entered into through or from the Services; (iii) unauthorized access to or alteration of your transmissions or data; (iv) statements or conduct of any third party on the service; (v) or any other matter relating to these Terms or the Services, whether as a breach of contract, tort (including negligence whether active or passive), or any other theory of liability.\u003C/em>\u003C/strong>\u003C/p>\n\u003Cp>In other words: choosing to use our Services does mean you are making a bet on us. If the bet does not work out, that’s on you, not us. We do our darnedest to be as safe a bet as possible through careful management of the business; investments in security, infrastructure, and talent; and in general \u003Ca href=\"#_\">giving a damn\u003C/a>. If you choose to use our Services, thank you for betting on us.\u003C/p>\n\u003Cp>If you have a question about any of these Terms, please \u003Ca href=\"#_\">contact our Support team\u003C/a>.\u003C/p>",{"headings":211,"localImagePaths":242,"remoteImagePaths":243,"frontmatter":244,"imagePaths":245},[212,215,218,221,224,227,230,233,236,239],{"depth":159,"slug":213,"text":214},"all-the-terms-that-you-agree-to-when-you-sign-up-for-a-lexington-product","All the terms that you agree to when you sign up for a Lexington product.",{"depth":159,"slug":216,"text":217},"account-terms","Account Terms",{"depth":159,"slug":219,"text":220},"payment-refunds-and-plan-changes","Payment, Refunds, and Plan Changes",{"depth":159,"slug":222,"text":223},"cancellation-and-termination","Cancellation and Termination",{"depth":159,"slug":225,"text":226},"modifications-to-the-service-and-prices","Modifications to the Service and Prices",{"depth":159,"slug":228,"text":229},"uptime-security-and-privacy","Uptime, Security, and Privacy",{"depth":159,"slug":231,"text":232},"copyright-and-content-ownership","Copyright and Content Ownership",{"depth":159,"slug":234,"text":235},"features-and-bugs","Features and Bugs",{"depth":159,"slug":237,"text":238},"services-adaptations-and-api-terms","Services Adaptations and API Terms",{"depth":159,"slug":240,"text":241},"liability","Liability",[],[],{"page":203,"pubDate":204},[],"terms.md","privacy",{"id":247,"data":249,"body":252,"filePath":253,"digest":254,"rendered":255,"legacyId":269},{"page":250,"pubDate":251},"Privacy",["Date","2024-01-01T00:00:00.000Z"],"California Resident Notice at Collection\n========================================\n\nIf you are a California resident, the California Consumer Privacy Act, as amended by the California Privacy Rights Act of 2020 (“**CCPA**”), requires us to provide some additional information to California residents. This Section only applies to you if you are a California resident, although please note that this information and the rights afforded herein are the same as offered to our other users in our main Privacy Policy. This Section does not apply to personal information we collect from our employees and job applicants in their capacity as employees and job applicants, as such information practices are described in separate policies.\n\nThe following chart details these activities:\n\n**Category of personal information**\n\n**Purposes of use**\n\n**Categories of Third Parties Information**\n\n**Categories of Third Parties**\n\nContact information (such as your full name, phone number, email address)\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes\n\nWe do not share/sell\n\nCustomer service interaction information (including optional surveys and when you ask for help)\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes\n\nWe do not share/sell\n\nProduct interaction information\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes\n\nWe do not share/sell\n\nInternet network and device information (such as mobile device information, IP address, and information about your interaction with the services)\n\nProvide the Services; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes;\n\nWe do not share/sell\n\nLogin information (such as your username and password)\n\nProvide the Services; Comply with law or defend our legal rights; Security/fraud prevention; Comply with law or defend our legal rights\n\nAffiliated entities; Service providers; Entities for legal purposes\n\nWe do not share/sell\n\nProfessional or employment information (such as the name and address of the company you work for and your title)\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes;\n\nWe do not share/sell\n\nOther information (any other information you choose to provide directly to us, including optional profile photos)\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes;\n\nWe do not sell/share\n\nFor more information about each category of personal information, purpose of use, and third parties to which we disclose personal information, please see the \"What we collect and why,\" and \"When we access or disclose you information\" sections of our Privacy Policy.\n\n**Your Choices Regarding “Sharing” and “Selling”**: You have the right to opt out of our sale/sharing of your personal information for purposes of online analytics and advertising. Currently, we do not sell or share your data as defined by the CCPA and we have not done so over the past 12 months from the effective date of this Privacy Policy.\n\n**Other CCPA Rights.** If we ever offer any financial incentives in exchange for your personal information, we will provide you with appropriate information about such incentives.\n\nThe CCPA also allows you to limit the use or disclosure of your “sensitive personal information” (as defined in the CCPA) if your sensitive personal information is used for certain purposes. Please note that we do not use or disclose sensitive personal information other than for business purposes for which you cannot opt out under the CCPA.\n\nPlease see the “Your rights with respect to your information” section of our Policy above for information about the additional rights you have with respect to your personal information under California law and how to exercise them.\n\nRetention of Your Personal Information. Please see the “Retention Of Your Information” section belowof our Privacy Policy for more information.\n\nShine the Light Disclosure\n--------------------------\n\nThe California \"Shine the Light\" law gives residents of California the right under certain circumstances to request information from us regarding the manner in which we disclose certain categories of personal information (as defined in the Shine the Light law) with third parties for their direct marketing purposes. We currently do not disclose your personal information to third parties for their own direct marketing purposes.","src/content/infopages/privacy.md","fb683f77a79791cb",{"html":256,"metadata":257},"\u003Ch1 id=\"california-resident-notice-at-collection\">California Resident Notice at Collection\u003C/h1>\n\u003Cp>If you are a California resident, the California Consumer Privacy Act, as amended by the California Privacy Rights Act of 2020 (“\u003Cstrong>CCPA\u003C/strong>”), requires us to provide some additional information to California residents. This Section only applies to you if you are a California resident, although please note that this information and the rights afforded herein are the same as offered to our other users in our main Privacy Policy. This Section does not apply to personal information we collect from our employees and job applicants in their capacity as employees and job applicants, as such information practices are described in separate policies.\u003C/p>\n\u003Cp>The following chart details these activities:\u003C/p>\n\u003Cp>\u003Cstrong>Category of personal information\u003C/strong>\u003C/p>\n\u003Cp>\u003Cstrong>Purposes of use\u003C/strong>\u003C/p>\n\u003Cp>\u003Cstrong>Categories of Third Parties Information\u003C/strong>\u003C/p>\n\u003Cp>\u003Cstrong>Categories of Third Parties\u003C/strong>\u003C/p>\n\u003Cp>Contact information (such as your full name, phone number, email address)\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Customer service interaction information (including optional surveys and when you ask for help)\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Product interaction information\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Internet network and device information (such as mobile device information, IP address, and information about your interaction with the services)\u003C/p>\n\u003Cp>Provide the Services; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes;\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Login information (such as your username and password)\u003C/p>\n\u003Cp>Provide the Services; Comply with law or defend our legal rights; Security/fraud prevention; Comply with law or defend our legal rights\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Professional or employment information (such as the name and address of the company you work for and your title)\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes;\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Other information (any other information you choose to provide directly to us, including optional profile photos)\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes;\u003C/p>\n\u003Cp>We do not sell/share\u003C/p>\n\u003Cp>For more information about each category of personal information, purpose of use, and third parties to which we disclose personal information, please see the “What we collect and why,” and “When we access or disclose you information” sections of our Privacy Policy.\u003C/p>\n\u003Cp>\u003Cstrong>Your Choices Regarding “Sharing” and “Selling”\u003C/strong>: You have the right to opt out of our sale/sharing of your personal information for purposes of online analytics and advertising. Currently, we do not sell or share your data as defined by the CCPA and we have not done so over the past 12 months from the effective date of this Privacy Policy.\u003C/p>\n\u003Cp>\u003Cstrong>Other CCPA Rights.\u003C/strong> If we ever offer any financial incentives in exchange for your personal information, we will provide you with appropriate information about such incentives.\u003C/p>\n\u003Cp>The CCPA also allows you to limit the use or disclosure of your “sensitive personal information” (as defined in the CCPA) if your sensitive personal information is used for certain purposes. Please note that we do not use or disclose sensitive personal information other than for business purposes for which you cannot opt out under the CCPA.\u003C/p>\n\u003Cp>Please see the “Your rights with respect to your information” section of our Policy above for information about the additional rights you have with respect to your personal information under California law and how to exercise them.\u003C/p>\n\u003Cp>Retention of Your Personal Information. Please see the “Retention Of Your Information” section belowof our Privacy Policy for more information.\u003C/p>\n\u003Ch2 id=\"shine-the-light-disclosure\">Shine the Light Disclosure\u003C/h2>\n\u003Cp>The California “Shine the Light” law gives residents of California the right under certain circumstances to request information from us regarding the manner in which we disclose certain categories of personal information (as defined in the Shine the Light law) with third parties for their direct marketing purposes. We currently do not disclose your personal information to third parties for their own direct marketing purposes.\u003C/p>",{"headings":258,"localImagePaths":265,"remoteImagePaths":266,"frontmatter":267,"imagePaths":268},[259,262],{"depth":155,"slug":260,"text":261},"california-resident-notice-at-collection","California Resident Notice at Collection",{"depth":159,"slug":263,"text":264},"shine-the-light-disclosure","Shine the Light Disclosure",[],[],{"page":250,"pubDate":251},[],"privacy.md","helpcenter",["Map",272,273,304,305,337,338,363,364],"1",{"id":272,"data":274,"body":277,"filePath":278,"digest":279,"rendered":280,"legacyId":303},{"title":275,"intro":276},"Getting Started with Our Platform","Welcome to our platform! This guide is designed to help new users navigate the initial setup process, understand the core features, and start using the platform effectively. Whether you're looking to collaborate on projects, manage tasks, or leverage our suite of tools, this article will provide you with all the information you need to get started.","## Setting Up Your Account\n\n1. **Sign Up**: Visit our homepage and click on the \"Sign Up\" button. Enter your details in the form provided and submit to create your account.\n2. **Verify Your Email**: After signing up, you'll receive an email from us. Click on the verification link to activate your account.\n3. **Log In**: Once your email is verified, log in to your account using your credentials.\n\n## Exploring the Dashboard\n\n- **Navigation Bar**: The navigation bar at the top allows you to access different sections of the platform, including your projects, settings, and account information.\n- **Dashboard Overview**: Your main dashboard provides a quick overview of your current projects, tasks, and any notifications.\n\n## Starting Your First Project\n\n1. **Create a New Project**: Click on the \"New Project\" button and fill in the project details.\n2. **Add Team Members**: Invite your teammates by entering their email addresses. They'll receive an invitation to join the project.\n3. **Begin Collaboration**: Start creating, designing, and sharing your work with team members in real-time.\n\n## Utilizing Support Resources\n\n- **Help Center**: For detailed guides and FAQs, visit our Help Center.\n- **Community Forums**: Join discussions, share ideas, and get help from other users in our community forums.\n- **Customer Support**: For direct assistance, contact our customer support team via email or live chat.\n\n## Conclusion\n\nWe're excited to have you on board and can't wait to see what you create using our platform. Remember, our Help Center and support team are here to assist you every step of the way. Happy creating!","src/content/helpcenter/1.md","08917b97fc70932f",{"html":281,"metadata":282},"\u003Ch2 id=\"setting-up-your-account\">Setting Up Your Account\u003C/h2>\n\u003Col>\n\u003Cli>\u003Cstrong>Sign Up\u003C/strong>: Visit our homepage and click on the “Sign Up” button. Enter your details in the form provided and submit to create your account.\u003C/li>\n\u003Cli>\u003Cstrong>Verify Your Email\u003C/strong>: After signing up, you’ll receive an email from us. Click on the verification link to activate your account.\u003C/li>\n\u003Cli>\u003Cstrong>Log In\u003C/strong>: Once your email is verified, log in to your account using your credentials.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"exploring-the-dashboard\">Exploring the Dashboard\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Navigation Bar\u003C/strong>: The navigation bar at the top allows you to access different sections of the platform, including your projects, settings, and account information.\u003C/li>\n\u003Cli>\u003Cstrong>Dashboard Overview\u003C/strong>: Your main dashboard provides a quick overview of your current projects, tasks, and any notifications.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"starting-your-first-project\">Starting Your First Project\u003C/h2>\n\u003Col>\n\u003Cli>\u003Cstrong>Create a New Project\u003C/strong>: Click on the “New Project” button and fill in the project details.\u003C/li>\n\u003Cli>\u003Cstrong>Add Team Members\u003C/strong>: Invite your teammates by entering their email addresses. They’ll receive an invitation to join the project.\u003C/li>\n\u003Cli>\u003Cstrong>Begin Collaboration\u003C/strong>: Start creating, designing, and sharing your work with team members in real-time.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"utilizing-support-resources\">Utilizing Support Resources\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Help Center\u003C/strong>: For detailed guides and FAQs, visit our Help Center.\u003C/li>\n\u003Cli>\u003Cstrong>Community Forums\u003C/strong>: Join discussions, share ideas, and get help from other users in our community forums.\u003C/li>\n\u003Cli>\u003Cstrong>Customer Support\u003C/strong>: For direct assistance, contact our customer support team via email or live chat.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>We’re excited to have you on board and can’t wait to see what you create using our platform. Remember, our Help Center and support team are here to assist you every step of the way. Happy creating!\u003C/p>",{"headings":283,"localImagePaths":299,"remoteImagePaths":300,"frontmatter":301,"imagePaths":302},[284,287,290,293,296],{"depth":159,"slug":285,"text":286},"setting-up-your-account","Setting Up Your Account",{"depth":159,"slug":288,"text":289},"exploring-the-dashboard","Exploring the Dashboard",{"depth":159,"slug":291,"text":292},"starting-your-first-project","Starting Your First Project",{"depth":159,"slug":294,"text":295},"utilizing-support-resources","Utilizing Support Resources",{"depth":159,"slug":297,"text":298},"conclusion","Conclusion",[],[],{"title":275,"intro":276},[],"1.md","2",{"id":304,"data":306,"body":309,"filePath":310,"digest":311,"rendered":312,"legacyId":336},{"title":307,"intro":308},"Troubleshooting Common Issues","Encountering issues while using our platform? This article covers solutions to some of the most common problems reported by our users. From login troubles to file synchronization errors, find step-by-step instructions to quickly resolve these issues and get back to your work.","## Login Problems\n\n- **Forgot Password**: If you've forgotten your password, use the \"Forgot Password\" link on the login page to reset it.\n- **Account Locked**: After multiple unsuccessful login attempts, your account may be locked. Wait 15 minutes before trying again, or contact support for immediate help.\n\n## File Synchronization Errors\n\n- **Check Your Internet Connection**: A stable internet connection is required for file syncing. Ensure your connection is active and stable.\n- **Update the App**: Running an outdated version can cause syncing issues. Make sure you're using the latest version of our app.\n\n## Collaboration Challenges\n\n- **Invitation Not Received**: If team members haven't received an invitation, ask them to check their spam folder. You can also resend the invitation from the project settings.\n- **Real-Time Editing Not Working**: Ensure all participants have the necessary permissions and are using compatible browsers or app versions.\n\n## Performance Issues\n\n- **Clear Your Cache**: A full cache can slow down the application. Clear your browser or app cache regularly.\n- **Check System Requirements**: Ensure your device meets the minimum system requirements for our platform.\n\n## Seeking Further Assistance\n\nIf you're still experiencing issues after following these steps, our customer support team is ready to help. Contact us via email, live chat, or submit a support ticket through our Help Center.\n\n## Conclusion\n\nWe understand that encountering issues can be frustrating. By following these troubleshooting steps, most common problems can be resolved quickly. Our support team is always here to assist with any unresolved issues, ensuring you can make the most of our platform without interruption.","src/content/helpcenter/2.md","bc508a913907b53f",{"html":313,"metadata":314},"\u003Ch2 id=\"login-problems\">Login Problems\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Forgot Password\u003C/strong>: If you’ve forgotten your password, use the “Forgot Password” link on the login page to reset it.\u003C/li>\n\u003Cli>\u003Cstrong>Account Locked\u003C/strong>: After multiple unsuccessful login attempts, your account may be locked. Wait 15 minutes before trying again, or contact support for immediate help.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"file-synchronization-errors\">File Synchronization Errors\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Check Your Internet Connection\u003C/strong>: A stable internet connection is required for file syncing. Ensure your connection is active and stable.\u003C/li>\n\u003Cli>\u003Cstrong>Update the App\u003C/strong>: Running an outdated version can cause syncing issues. Make sure you’re using the latest version of our app.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"collaboration-challenges\">Collaboration Challenges\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Invitation Not Received\u003C/strong>: If team members haven’t received an invitation, ask them to check their spam folder. You can also resend the invitation from the project settings.\u003C/li>\n\u003Cli>\u003Cstrong>Real-Time Editing Not Working\u003C/strong>: Ensure all participants have the necessary permissions and are using compatible browsers or app versions.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"performance-issues\">Performance Issues\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Clear Your Cache\u003C/strong>: A full cache can slow down the application. Clear your browser or app cache regularly.\u003C/li>\n\u003Cli>\u003Cstrong>Check System Requirements\u003C/strong>: Ensure your device meets the minimum system requirements for our platform.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"seeking-further-assistance\">Seeking Further Assistance\u003C/h2>\n\u003Cp>If you’re still experiencing issues after following these steps, our customer support team is ready to help. Contact us via email, live chat, or submit a support ticket through our Help Center.\u003C/p>\n\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>We understand that encountering issues can be frustrating. By following these troubleshooting steps, most common problems can be resolved quickly. Our support team is always here to assist with any unresolved issues, ensuring you can make the most of our platform without interruption.\u003C/p>",{"headings":315,"localImagePaths":332,"remoteImagePaths":333,"frontmatter":334,"imagePaths":335},[316,319,322,325,328,331],{"depth":159,"slug":317,"text":318},"login-problems","Login Problems",{"depth":159,"slug":320,"text":321},"file-synchronization-errors","File Synchronization Errors",{"depth":159,"slug":323,"text":324},"collaboration-challenges","Collaboration Challenges",{"depth":159,"slug":326,"text":327},"performance-issues","Performance Issues",{"depth":159,"slug":329,"text":330},"seeking-further-assistance","Seeking Further Assistance",{"depth":159,"slug":297,"text":298},[],[],{"title":307,"intro":308},[],"2.md","3",{"id":337,"data":339,"body":341,"filePath":342,"digest":343,"rendered":344,"legacyId":362},{"title":275,"intro":340},"This guide is designed to help new users navigate the initial setup process and explore key features of our platform. From creating an account to completing your first project, we'll walk you through each step to ensure a smooth start.","Welcome to our platform! We're excited to have you on board and are here to help you get started. This article will guide you through the basics of setting up your account, familiarizing yourself with our interface, and beginning your first project.\n\n#### Creating Your Account\n\n1. Visit our website and click on the \"Sign Up\" button.\n2. Fill in your personal details, including your name, email address, and preferred password.\n3. Confirm your email address by clicking on the verification link sent to your inbox.\n\n#### Navigating the Dashboard\n\nOnce you've logged in, you'll be taken to your dashboard. Here's a quick overview of what you'll find:\n\n- **Project Overview**: A summary of your current projects.\n- **Quick Access Toolbar**: Shortcuts to commonly used features.\n- **Notifications**: Alerts and updates related to your account and projects.\n\n#### Starting Your First Project\n\n1. Click on the \"Create New Project\" button.\n2. Enter a project name and select the project type from the dropdown menu.\n3. Follow the on-screen instructions to add tasks, assign team members, and set deadlines.\n\n#### Need More Help?\n\nIf you have any questions or encounter any issues, our support team is here to help. Visit our [Support Center](#) or contact us directly through the platform for assistance.\n\nWe hope this guide helps you get started on our platform. Happy creating!","src/content/helpcenter/3.md","50ed9186bda83912",{"html":345,"metadata":346},"\u003Cp>Welcome to our platform! We’re excited to have you on board and are here to help you get started. This article will guide you through the basics of setting up your account, familiarizing yourself with our interface, and beginning your first project.\u003C/p>\n\u003Ch4 id=\"creating-your-account\">Creating Your Account\u003C/h4>\n\u003Col>\n\u003Cli>Visit our website and click on the “Sign Up” button.\u003C/li>\n\u003Cli>Fill in your personal details, including your name, email address, and preferred password.\u003C/li>\n\u003Cli>Confirm your email address by clicking on the verification link sent to your inbox.\u003C/li>\n\u003C/ol>\n\u003Ch4 id=\"navigating-the-dashboard\">Navigating the Dashboard\u003C/h4>\n\u003Cp>Once you’ve logged in, you’ll be taken to your dashboard. Here’s a quick overview of what you’ll find:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Project Overview\u003C/strong>: A summary of your current projects.\u003C/li>\n\u003Cli>\u003Cstrong>Quick Access Toolbar\u003C/strong>: Shortcuts to commonly used features.\u003C/li>\n\u003Cli>\u003Cstrong>Notifications\u003C/strong>: Alerts and updates related to your account and projects.\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"starting-your-first-project\">Starting Your First Project\u003C/h4>\n\u003Col>\n\u003Cli>Click on the “Create New Project” button.\u003C/li>\n\u003Cli>Enter a project name and select the project type from the dropdown menu.\u003C/li>\n\u003Cli>Follow the on-screen instructions to add tasks, assign team members, and set deadlines.\u003C/li>\n\u003C/ol>\n\u003Ch4 id=\"need-more-help\">Need More Help?\u003C/h4>\n\u003Cp>If you have any questions or encounter any issues, our support team is here to help. Visit our \u003Ca href=\"#\">Support Center\u003C/a> or contact us directly through the platform for assistance.\u003C/p>\n\u003Cp>We hope this guide helps you get started on our platform. Happy creating!\u003C/p>",{"headings":347,"localImagePaths":358,"remoteImagePaths":359,"frontmatter":360,"imagePaths":361},[348,351,354,355],{"depth":45,"slug":349,"text":350},"creating-your-account","Creating Your Account",{"depth":45,"slug":352,"text":353},"navigating-the-dashboard","Navigating the Dashboard",{"depth":45,"slug":291,"text":292},{"depth":45,"slug":356,"text":357},"need-more-help","Need More Help?",[],[],{"title":275,"intro":340},[],"3.md","4",{"id":363,"data":365,"body":367,"filePath":368,"digest":369,"rendered":370,"legacyId":390},{"title":307,"intro":366},"Encountering issues? This article covers solutions to some of the most common problems users face on our platform, from login difficulties to project management hurdles.","Our platform is designed to offer a seamless user experience, but we understand that issues can sometimes arise. Below, we've compiled solutions to some of the most common challenges our users encounter.\n\n#### Issue 1: Trouble Logging In\n\nIf you're having difficulty logging into your account, consider the following steps:\n\n- Ensure you're using the correct email address and password.\n- If you've forgotten your password, use the \"Forgot Password\" feature to reset it.\n- Clear your browser's cache and cookies, and try logging in again.\n\n#### Issue 2: Missing Notifications\n\nNot receiving expected notifications can be frustrating. To fix this issue:\n\n- Check your account settings to ensure notifications are enabled.\n- Verify your email address is correct and update it if necessary.\n- Look in your email's spam or junk folder for any missed notifications.\n\n#### Issue 3: Project Updates Not Saving\n\nWhen changes to projects don't seem to save, try the following:\n\n- Refresh the page to ensure updates are reflected.\n- Check your internet connection to make sure you're online.\n- If the issue persists, contact our support team for assistance.\n\n#### Getting Further Assistance\n\nIf you've tried these solutions and still face issues, our support team is ready to help. Reach out through our [Help Center](#) or by using the contact form on our website for personalized assistance.\n\nRemember, our goal is to provide you with a smooth and productive experience on our platform. Don't hesitate to get in touch if you need help.","src/content/helpcenter/4.md","7f622e2df9a07bac",{"html":371,"metadata":372},"\u003Cp>Our platform is designed to offer a seamless user experience, but we understand that issues can sometimes arise. Below, we’ve compiled solutions to some of the most common challenges our users encounter.\u003C/p>\n\u003Ch4 id=\"issue-1-trouble-logging-in\">Issue 1: Trouble Logging In\u003C/h4>\n\u003Cp>If you’re having difficulty logging into your account, consider the following steps:\u003C/p>\n\u003Cul>\n\u003Cli>Ensure you’re using the correct email address and password.\u003C/li>\n\u003Cli>If you’ve forgotten your password, use the “Forgot Password” feature to reset it.\u003C/li>\n\u003Cli>Clear your browser’s cache and cookies, and try logging in again.\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"issue-2-missing-notifications\">Issue 2: Missing Notifications\u003C/h4>\n\u003Cp>Not receiving expected notifications can be frustrating. To fix this issue:\u003C/p>\n\u003Cul>\n\u003Cli>Check your account settings to ensure notifications are enabled.\u003C/li>\n\u003Cli>Verify your email address is correct and update it if necessary.\u003C/li>\n\u003Cli>Look in your email’s spam or junk folder for any missed notifications.\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"issue-3-project-updates-not-saving\">Issue 3: Project Updates Not Saving\u003C/h4>\n\u003Cp>When changes to projects don’t seem to save, try the following:\u003C/p>\n\u003Cul>\n\u003Cli>Refresh the page to ensure updates are reflected.\u003C/li>\n\u003Cli>Check your internet connection to make sure you’re online.\u003C/li>\n\u003Cli>If the issue persists, contact our support team for assistance.\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"getting-further-assistance\">Getting Further Assistance\u003C/h4>\n\u003Cp>If you’ve tried these solutions and still face issues, our support team is ready to help. Reach out through our \u003Ca href=\"#\">Help Center\u003C/a> or by using the contact form on our website for personalized assistance.\u003C/p>\n\u003Cp>Remember, our goal is to provide you with a smooth and productive experience on our platform. Don’t hesitate to get in touch if you need help.\u003C/p>",{"headings":373,"localImagePaths":386,"remoteImagePaths":387,"frontmatter":388,"imagePaths":389},[374,377,380,383],{"depth":45,"slug":375,"text":376},"issue-1-trouble-logging-in","Issue 1: Trouble Logging In",{"depth":45,"slug":378,"text":379},"issue-2-missing-notifications","Issue 2: Missing Notifications",{"depth":45,"slug":381,"text":382},"issue-3-project-updates-not-saving","Issue 3: Project Updates Not Saving",{"depth":45,"slug":384,"text":385},"getting-further-assistance","Getting Further Assistance",[],[],{"title":307,"intro":366},[],"4.md","howtos",["Map",393,394],"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-",{"id":393,"data":395,"filePath":393,"digest":608},{"slug":393,"id":393,"title":396,"type":397,"components":398,"item":399,"config":607},"Cut out shapes out of plastic sheets with a CNC ","howto",[],{"_createdBy":400,"mentions":401,"_deleted":402,"fileLink":19,"slug":393,"_modified":403,"previousSlugs":404,"_created":405,"description":406,"votedUsefulBy":407,"creatorCountry":411,"total_downloads":412,"title":396,"time":413,"files":414,"difficulty_level":415,"_id":416,"tags":417,"total_views":419,"_contentModifiedTimestamp":405,"cover_image":420,"comments":428,"moderatorFeedback":19,"steps":429,"moderation":526,"user":527,"category":600,"content":602,"keywords":603,"resources":604,"references":605,"brief":606},"gus-merckel",[],false,"2023-10-27T18:09:36.519Z",[393],"2023-08-23T18:20:09.098Z","This tutorial demonstrates the process of cutting HDPE sheets using an X-Carve CNC.\n\nFor a complete video in Spanish with subtitles, visit: [YouTube Video](https://www.youtube.com/watch?v=4LrrFz802To)",[408,409,410],"sigolene","mattia","uillinoispreciousplastics","mx",0,"\u003C 5 hours",[],"Medium","038gjWgLjiyYknbEjDeI",[418],"HDPE",232,{"name":421,"downloadUrl":422,"type":423,"fullPath":424,"updated":425,"size":426,"timeCreated":425,"contentType":423,"src":427},"IMG_20200605_142311.jpg","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=c272c174-1adc-45af-967b-771adce7295d","image/jpeg","uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg","2021-04-05T15:09:00.605Z",124661,"C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\img_20200605_142311.jpg",[],[430,449,461,480,506,518],{"title":431,"text":432,"images":433,"_animationKey":448},"Measure the plastic sheet","To proceed, measure your plastic sheet: height, width, and thickness. Our X-Carve machine operates with the CAM software Easel, which I find to be user-friendly for CNC milling.\n\nEasel allows you to simulate the material, and it includes HDPE in its cutting material list.",[434,441],{"fullPath":435,"name":436,"size":437,"type":423,"timeCreated":438,"contentType":423,"downloadUrl":439,"updated":438,"src":440,"alt":436},"uploads/howtos/pbo0Pe44aTngvlD04kGf/1.jpg","1.jpg",74095,"2021-03-26T19:42:05.766Z","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F1.jpg?alt=media&token=293d733d-05a5-494a-9340-47f4564f1939","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\1.jpg",{"contentType":423,"timeCreated":442,"updated":442,"size":443,"downloadUrl":444,"fullPath":445,"name":446,"type":423,"src":447,"alt":446},"2021-03-26T19:42:05.669Z",69665,"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F2.jpg?alt=media&token=004f50f1-97ac-4df4-9ba9-f463aa4cbca3","uploads/howtos/pbo0Pe44aTngvlD04kGf/2.jpg","2.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\2.jpg","unique1",{"text":450,"_animationKey":451,"images":452,"title":460},"## Instructions for Securing a Sheet with CNC Clamps\n\nTo secure the sheet to the table, use the CNC clamps from the X-Carve.","unique2",[453],{"updated":454,"size":455,"fullPath":456,"timeCreated":454,"name":457,"downloadUrl":458,"contentType":423,"type":423,"src":459,"alt":457},"2021-03-26T19:42:06.249Z",55544,"uploads/howtos/pbo0Pe44aTngvlD04kGf/3.jpg","3.jpg","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F3.jpg?alt=media&token=0b9c1914-1c75-429e-b34a-1e2b3706edef","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\3.jpg","Secure sheet ",{"title":462,"text":463,"images":464,"_animationKey":479},"Choosing a file to cut ","Open a vector design program like Inkscape to create or download a vector file from [The Noun Project](https://thenounproject.com).\n\nDownload the SVG file and import it into Easel.",[465,472],{"downloadUrl":466,"contentType":423,"timeCreated":467,"updated":467,"name":468,"size":469,"type":423,"fullPath":470,"src":471,"alt":468},"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F4.jpg?alt=media&token=1cd2d49d-9335-4bb1-ac2a-e625322ca604","2021-03-26T19:42:06.727Z","4.jpg",42952,"uploads/howtos/pbo0Pe44aTngvlD04kGf/4.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\4.jpg",{"size":473,"fullPath":474,"updated":475,"timeCreated":475,"downloadUrl":476,"name":477,"contentType":423,"type":423,"src":478,"alt":477},69255,"uploads/howtos/pbo0Pe44aTngvlD04kGf/5.jpg","2021-03-26T19:42:06.833Z","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F5.jpg?alt=media&token=7cca786a-7d47-43bb-900b-b8d101c276b4","5.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\5.jpg","unique3",{"text":481,"title":482,"images":483,"_animationKey":505},"With the file ready, select the desired cutting width and proceed to cut using the wizard:\n- Ensure the sheet is secured.\n- Specify the cutting bit; a 1/8 inch (3.175 mm) flat flute bit is used.\n- Set the machine's 0-0 coordinate, typically the lower left corner.\n- Raise the bit, and start the CNC Router.","Follow the cutting Wizzard",[484,491,498],{"timeCreated":485,"size":486,"fullPath":487,"updated":485,"downloadUrl":488,"contentType":423,"type":423,"name":489,"src":490,"alt":489},"2021-03-26T19:42:07.493Z",72226,"uploads/howtos/pbo0Pe44aTngvlD04kGf/6.jpg","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F6.jpg?alt=media&token=ba7195dd-7771-435f-a188-057457697332","6.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\6.jpg",{"fullPath":492,"size":493,"downloadUrl":494,"contentType":423,"type":423,"timeCreated":495,"updated":495,"name":496,"src":497,"alt":496},"uploads/howtos/pbo0Pe44aTngvlD04kGf/7.jpg",52424,"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F7.jpg?alt=media&token=a3d5820c-cfe2-484e-8f76-f861ab8b756d","2021-03-26T19:42:07.308Z","7.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\7.jpg",{"fullPath":499,"name":500,"type":423,"timeCreated":501,"size":502,"contentType":423,"downloadUrl":503,"updated":501,"src":504,"alt":500},"uploads/howtos/pbo0Pe44aTngvlD04kGf/8.jpg","8.jpg","2021-03-26T19:42:07.346Z",55264,"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F8.jpg?alt=media&token=1c9816d7-3a99-4f41-8d3c-acc2670240f6","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\8.jpg","uniquenisc2v",{"text":507,"images":508,"_animationKey":516,"title":517},"### Tutorial Step: Showcasing Your Finished Object\n\nNow, finish post-processing your glasses or object, and share it with others.",[509],{"fullPath":510,"contentType":423,"timeCreated":511,"downloadUrl":512,"name":513,"updated":511,"type":423,"size":514,"src":515,"alt":513},"uploads/howtos/pbo0Pe44aTngvlD04kGf/9.jpg","2021-03-26T19:42:08.147Z","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F9.jpg?alt=media&token=4dcfe37d-e1ad-41e5-a590-40b4c37c5e1a","9.jpg",82214,"C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\9.jpg","uniquesgl34","Post-production and show case",{"_animationKey":519,"title":520,"text":521,"images":522},"uniquem4y0yi","Hack it and try it yourself","You can attempt this project using various CNC machines, including manual routers or saws, as demonstrated in this [video](https://youtu.be/gxkcffQD3eQ). Sharing your work contributes to community development.\n\nShare your ideas and comments.",[523],{"contentType":423,"timeCreated":524,"fullPath":424,"type":423,"downloadUrl":525,"size":426,"updated":524,"name":421,"src":427,"alt":421},"2021-04-05T15:09:01.445Z","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=f94152ff-f923-4054-a3ad-d8ec588856fa","accepted",{"_modified":528,"_id":400,"subType":529,"moderation":526,"_deleted":402,"verified":402,"type":530,"location":531,"_created":528,"geo":534,"data":581,"detail":597},"2024-01-08T13:28:33.484Z","mix","workspace",{"lat":532,"lng":533},19.3935,-99.1656,{"latitude":532,"lookupSource":535,"longitude":533,"localityLanguageRequested":536,"continent":537,"continentCode":538,"countryName":539,"countryCode":540,"principalSubdivision":541,"principalSubdivisionCode":542,"city":543,"locality":544,"postcode":545,"plusCode":546,"localityInfo":547},"coordinates","en","North America","NA","Mexico","MX","Ciudad de Mexico","MX-CMX","Mexico City","Benito Juarez","03103","76F29RVM+CQ",{"administrative":548,"informative":566},[549,553,558,561],{"name":539,"description":550,"isoName":539,"order":159,"adminLevel":159,"isoCode":540,"wikidataId":551,"geonameId":552},"country in North America","Q96",3996063,{"name":543,"description":554,"order":555,"adminLevel":45,"wikidataId":556,"geonameId":557},"capital and largest city of Mexico",5,"Q1489",3530597,{"name":541,"description":554,"isoName":541,"order":559,"adminLevel":45,"isoCode":542,"wikidataId":556,"geonameId":560},6,3527646,{"name":544,"description":562,"order":563,"adminLevel":559,"wikidataId":564,"geonameId":565},"territorial demarcation of the Mexico City in Mexico",7,"Q2356998",3827406,[567,571,574,578],{"name":537,"description":568,"isoName":537,"order":155,"isoCode":538,"wikidataId":569,"geonameId":570},"continent and northern subcontinent of the Americas","Q49",6255149,{"name":572,"description":573,"order":67},"America/Mexico_City","time zone",{"name":575,"description":576,"order":45,"wikidataId":577},"Greater Mexico City","geographical object","Q665894",{"name":545,"description":579,"order":580},"postal code",8,{"urls":582,"description":592,"services":593,"title":595,"images":596},[583,586,589],{"name":584,"url":585},"Email","mailto:gustavomerckel@gmail.com",{"name":587,"url":588},"Facebook","https://www.facebook.com/pl%c3%a1stico-chido-110888520718193",{"name":590,"url":591},"sponsor the work","https://www.patreon.com/one_army","Plástico Chido builds and modifies the PP machines, and also experiments with CNC and Laser Cut",[594],{"welding":402,"assembling":402,"machining":402,"electronics":402,"molds":402},"Plástico Chido",[],{"services":598,"urls":599},[],[],{"label":601},"uncategorized","This tutorial demonstrates the process of cutting HDPE sheets using an X-Carve CNC.\n\nFor a complete video in Spanish with subtitles, visit: [YouTube Video](https://www.youtube.com/watch?v=4LrrFz802To)\n\n\nUser Location: Mexico City, Mexico\n\nTo proceed, measure your plastic sheet: height, width, and thickness. Our X-Carve machine operates with the CAM software Easel, which I find to be user-friendly for CNC milling.\n\nEasel allows you to simulate the material, and it includes HDPE in its cutting material list.\n\n## Instructions for Securing a Sheet with CNC Clamps\n\nTo secure the sheet to the table, use the CNC clamps from the X-Carve.\n\nOpen a vector design program like Inkscape to create or download a vector file from [The Noun Project](https://thenounproject.com).\n\nDownload the SVG file and import it into Easel.\n\nWith the file ready, select the desired cutting width and proceed to cut using the wizard:\n- Ensure the sheet is secured.\n- Specify the cutting bit; a 1/8 inch (3.175 mm) flat flute bit is used.\n- Set the machine's 0-0 coordinate, typically the lower left corner.\n- Raise the bit, and start the CNC Router.\n\n### Tutorial Step: Showcasing Your Finished Object\n\nNow, finish post-processing your glasses or object, and share it with others.\n\nYou can attempt this project using various CNC machines, including manual routers or saws, as demonstrated in this [video](https://youtu.be/gxkcffQD3eQ). Sharing your work contributes to community development.\n\nShare your ideas and comments.","CNC milling, X-Carve tutorial, Easel software, cutting HDPE sheets, CNC clamps, vector design with Inkscape, CNC router setup, HDPE sheet cutting, CNC project sharing, secure CNC material","To extract the required tools from the tutorial, here is the breakdown:\n\n### Software\n\n- **Easel** (CAM software for CNC milling)\n- **Inkscape** (vector design program)\n\n### Hardware\n\n- **X-Carve CNC machine**\n- **CNC clamps** (for sheet securing)\n- **1/8 inch (3.175 mm) flat flute cutting bit**\n\nThis setup enables precise cutting of HDPE sheets, while Inkscape facilitates vector file creation for designs. The X-Carve’s integration with Easel streamlines material simulation and toolpath generation[1][2].","## YouTube\n\n- [YouTube Video](https://www.youtube.com/watch?v=4LrrFz802To)\n- [CNC Project Demonstration](https://youtu.be/gxkcffQD3eQ)\n\n## Design Resources\n\n- [The Noun Project](https://thenounproject.com)","Cut HDPE sheets using X-Carve CNC. Friendly with Easel software. Secure, simulate, and cut with precise steps. Perfect for DIY CNC enthusiasts. Get started now!","{\n \"slug\": \"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\",\n \"id\": \"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\",\n \"title\": \"Cut out shapes out of plastic sheets with a CNC \",\n \"type\": \"howto\",\n \"components\": [],\n \"item\": {\n \"_createdBy\": \"gus-merckel\",\n \"mentions\": [],\n \"_deleted\": false,\n \"fileLink\": \"\",\n \"slug\": \"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\",\n \"_modified\": \"2023-10-27T18:09:36.519Z\",\n \"previousSlugs\": [\n \"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\"\n ],\n \"_created\": \"2023-08-23T18:20:09.098Z\",\n \"description\": \"This tutorial demonstrates the process of cutting HDPE sheets using an X-Carve CNC.\\n\\nFor a complete video in Spanish with subtitles, visit: [YouTube Video](https://www.youtube.com/watch?v=4LrrFz802To)\",\n \"votedUsefulBy\": [\n \"sigolene\",\n \"mattia\",\n \"uillinoispreciousplastics\"\n ],\n \"creatorCountry\": \"mx\",\n \"total_downloads\": 0,\n \"title\": \"Cut out shapes out of plastic sheets with a CNC \",\n \"time\": \"\u003C 5 hours\",\n \"files\": [],\n \"difficulty_level\": \"Medium\",\n \"_id\": \"038gjWgLjiyYknbEjDeI\",\n \"tags\": [\n \"HDPE\"\n ],\n \"total_views\": 232,\n \"_contentModifiedTimestamp\": \"2023-08-23T18:20:09.098Z\",\n \"cover_image\": {\n \"name\": \"IMG_20200605_142311.jpg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=c272c174-1adc-45af-967b-771adce7295d\",\n \"type\": \"image/jpeg\",\n \"fullPath\": \"uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg\",\n \"updated\": \"2021-04-05T15:09:00.605Z\",\n \"size\": 124661,\n \"timeCreated\": \"2021-04-05T15:09:00.605Z\",\n \"contentType\": \"image/jpeg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\img_20200605_142311.jpg\"\n },\n \"comments\": [],\n \"moderatorFeedback\": \"\",\n \"steps\": [\n {\n \"title\": \"Measure the plastic sheet\",\n \"text\": \"To proceed, measure your plastic sheet: height, width, and thickness. Our X-Carve machine operates with the CAM software Easel, which I find to be user-friendly for CNC milling.\\n\\nEasel allows you to simulate the material, and it includes HDPE in its cutting material list.\",\n \"images\": [\n {\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/1.jpg\",\n \"name\": \"1.jpg\",\n \"size\": 74095,\n \"type\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:05.766Z\",\n \"contentType\": \"image/jpeg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F1.jpg?alt=media&token=293d733d-05a5-494a-9340-47f4564f1939\",\n \"updated\": \"2021-03-26T19:42:05.766Z\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\1.jpg\",\n \"alt\": \"1.jpg\"\n },\n {\n \"contentType\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:05.669Z\",\n \"updated\": \"2021-03-26T19:42:05.669Z\",\n \"size\": 69665,\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F2.jpg?alt=media&token=004f50f1-97ac-4df4-9ba9-f463aa4cbca3\",\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/2.jpg\",\n \"name\": \"2.jpg\",\n \"type\": \"image/jpeg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\2.jpg\",\n \"alt\": \"2.jpg\"\n }\n ],\n \"_animationKey\": \"unique1\"\n },\n {\n \"text\": \"## Instructions for Securing a Sheet with CNC Clamps\\n\\nTo secure the sheet to the table, use the CNC clamps from the X-Carve.\",\n \"_animationKey\": \"unique2\",\n \"images\": [\n {\n \"updated\": \"2021-03-26T19:42:06.249Z\",\n \"size\": 55544,\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/3.jpg\",\n \"timeCreated\": \"2021-03-26T19:42:06.249Z\",\n \"name\": \"3.jpg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F3.jpg?alt=media&token=0b9c1914-1c75-429e-b34a-1e2b3706edef\",\n \"contentType\": \"image/jpeg\",\n \"type\": \"image/jpeg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\3.jpg\",\n \"alt\": \"3.jpg\"\n }\n ],\n \"title\": \"Secure sheet \"\n },\n {\n \"title\": \"Choosing a file to cut \",\n \"text\": \"Open a vector design program like Inkscape to create or download a vector file from [The Noun Project](https://thenounproject.com).\\n\\nDownload the SVG file and import it into Easel.\",\n \"images\": [\n {\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F4.jpg?alt=media&token=1cd2d49d-9335-4bb1-ac2a-e625322ca604\",\n \"contentType\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:06.727Z\",\n \"updated\": \"2021-03-26T19:42:06.727Z\",\n \"name\": \"4.jpg\",\n \"size\": 42952,\n \"type\": \"image/jpeg\",\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/4.jpg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\4.jpg\",\n \"alt\": \"4.jpg\"\n },\n {\n \"size\": 69255,\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/5.jpg\",\n \"updated\": \"2021-03-26T19:42:06.833Z\",\n \"timeCreated\": \"2021-03-26T19:42:06.833Z\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F5.jpg?alt=media&token=7cca786a-7d47-43bb-900b-b8d101c276b4\",\n \"name\": \"5.jpg\",\n \"contentType\": \"image/jpeg\",\n \"type\": \"image/jpeg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\5.jpg\",\n \"alt\": \"5.jpg\"\n }\n ],\n \"_animationKey\": \"unique3\"\n },\n {\n \"text\": \"With the file ready, select the desired cutting width and proceed to cut using the wizard:\\n- Ensure the sheet is secured.\\n- Specify the cutting bit; a 1/8 inch (3.175 mm) flat flute bit is used.\\n- Set the machine's 0-0 coordinate, typically the lower left corner.\\n- Raise the bit, and start the CNC Router.\",\n \"title\": \"Follow the cutting Wizzard\",\n \"images\": [\n {\n \"timeCreated\": \"2021-03-26T19:42:07.493Z\",\n \"size\": 72226,\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/6.jpg\",\n \"updated\": \"2021-03-26T19:42:07.493Z\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F6.jpg?alt=media&token=ba7195dd-7771-435f-a188-057457697332\",\n \"contentType\": \"image/jpeg\",\n \"type\": \"image/jpeg\",\n \"name\": \"6.jpg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\6.jpg\",\n \"alt\": \"6.jpg\"\n },\n {\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/7.jpg\",\n \"size\": 52424,\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F7.jpg?alt=media&token=a3d5820c-cfe2-484e-8f76-f861ab8b756d\",\n \"contentType\": \"image/jpeg\",\n \"type\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:07.308Z\",\n \"updated\": \"2021-03-26T19:42:07.308Z\",\n \"name\": \"7.jpg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\7.jpg\",\n \"alt\": \"7.jpg\"\n },\n {\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/8.jpg\",\n \"name\": \"8.jpg\",\n \"type\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:07.346Z\",\n \"size\": 55264,\n \"contentType\": \"image/jpeg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F8.jpg?alt=media&token=1c9816d7-3a99-4f41-8d3c-acc2670240f6\",\n \"updated\": \"2021-03-26T19:42:07.346Z\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\8.jpg\",\n \"alt\": \"8.jpg\"\n }\n ],\n \"_animationKey\": \"uniquenisc2v\"\n },\n {\n \"text\": \"### Tutorial Step: Showcasing Your Finished Object\\n\\nNow, finish post-processing your glasses or object, and share it with others.\",\n \"images\": [\n {\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/9.jpg\",\n \"contentType\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:08.147Z\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F9.jpg?alt=media&token=4dcfe37d-e1ad-41e5-a590-40b4c37c5e1a\",\n \"name\": \"9.jpg\",\n \"updated\": \"2021-03-26T19:42:08.147Z\",\n \"type\": \"image/jpeg\",\n \"size\": 82214,\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\9.jpg\",\n \"alt\": \"9.jpg\"\n }\n ],\n \"_animationKey\": \"uniquesgl34\",\n \"title\": \"Post-production and show case\"\n },\n {\n \"_animationKey\": \"uniquem4y0yi\",\n \"title\": \"Hack it and try it yourself\",\n \"text\": \"You can attempt this project using various CNC machines, including manual routers or saws, as demonstrated in this [video](https://youtu.be/gxkcffQD3eQ). Sharing your work contributes to community development.\\n\\nShare your ideas and comments.\",\n \"images\": [\n {\n \"contentType\": \"image/jpeg\",\n \"timeCreated\": \"2021-04-05T15:09:01.445Z\",\n \"fullPath\": \"uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg\",\n \"type\": \"image/jpeg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=f94152ff-f923-4054-a3ad-d8ec588856fa\",\n \"size\": 124661,\n \"updated\": \"2021-04-05T15:09:01.445Z\",\n \"name\": \"IMG_20200605_142311.jpg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\img_20200605_142311.jpg\",\n \"alt\": \"IMG_20200605_142311.jpg\"\n }\n ]\n }\n ],\n \"moderation\": \"accepted\",\n \"user\": {\n \"_modified\": \"2024-01-08T13:28:33.484Z\",\n \"_id\": \"gus-merckel\",\n \"subType\": \"mix\",\n \"moderation\": \"accepted\",\n \"_deleted\": false,\n \"verified\": false,\n \"type\": \"workspace\",\n \"location\": {\n \"lat\": 19.3935,\n \"lng\": -99.1656\n },\n \"_created\": \"2024-01-08T13:28:33.484Z\",\n \"geo\": {\n \"latitude\": 19.3935,\n \"lookupSource\": \"coordinates\",\n \"longitude\": -99.1656,\n \"localityLanguageRequested\": \"en\",\n \"continent\": \"North America\",\n \"continentCode\": \"NA\",\n \"countryName\": \"Mexico\",\n \"countryCode\": \"MX\",\n \"principalSubdivision\": \"Ciudad de Mexico\",\n \"principalSubdivisionCode\": \"MX-CMX\",\n \"city\": \"Mexico City\",\n \"locality\": \"Benito Juarez\",\n \"postcode\": \"03103\",\n \"plusCode\": \"76F29RVM+CQ\",\n \"localityInfo\": {\n \"administrative\": [\n {\n \"name\": \"Mexico\",\n \"description\": \"country in North America\",\n \"isoName\": \"Mexico\",\n \"order\": 2,\n \"adminLevel\": 2,\n \"isoCode\": \"MX\",\n \"wikidataId\": \"Q96\",\n \"geonameId\": 3996063\n },\n {\n \"name\": \"Mexico City\",\n \"description\": \"capital and largest city of Mexico\",\n \"order\": 5,\n \"adminLevel\": 4,\n \"wikidataId\": \"Q1489\",\n \"geonameId\": 3530597\n },\n {\n \"name\": \"Ciudad de Mexico\",\n \"description\": \"capital and largest city of Mexico\",\n \"isoName\": \"Ciudad de Mexico\",\n \"order\": 6,\n \"adminLevel\": 4,\n \"isoCode\": \"MX-CMX\",\n \"wikidataId\": \"Q1489\",\n \"geonameId\": 3527646\n },\n {\n \"name\": \"Benito Juarez\",\n \"description\": \"territorial demarcation of the Mexico City in Mexico\",\n \"order\": 7,\n \"adminLevel\": 6,\n \"wikidataId\": \"Q2356998\",\n \"geonameId\": 3827406\n }\n ],\n \"informative\": [\n {\n \"name\": \"North America\",\n \"description\": \"continent and northern subcontinent of the Americas\",\n \"isoName\": \"North America\",\n \"order\": 1,\n \"isoCode\": \"NA\",\n \"wikidataId\": \"Q49\",\n \"geonameId\": 6255149\n },\n {\n \"name\": \"America/Mexico_City\",\n \"description\": \"time zone\",\n \"order\": 3\n },\n {\n \"name\": \"Greater Mexico City\",\n \"description\": \"geographical object\",\n \"order\": 4,\n \"wikidataId\": \"Q665894\"\n },\n {\n \"name\": \"03103\",\n \"description\": \"postal code\",\n \"order\": 8\n }\n ]\n }\n },\n \"data\": {\n \"urls\": [\n {\n \"name\": \"Email\",\n \"url\": \"mailto:gustavomerckel@gmail.com\"\n },\n {\n \"name\": \"Facebook\",\n \"url\": \"https://www.facebook.com/pl%c3%a1stico-chido-110888520718193\"\n },\n {\n \"name\": \"sponsor the work\",\n \"url\": \"https://www.patreon.com/one_army\"\n }\n ],\n \"description\": \"Plástico Chido builds and modifies the PP machines, and also experiments with CNC and Laser Cut\",\n \"services\": [\n {\n \"welding\": false,\n \"assembling\": false,\n \"machining\": false,\n \"electronics\": false,\n \"molds\": false\n }\n ],\n \"title\": \"Plástico Chido\",\n \"images\": []\n },\n \"detail\": {\n \"services\": [],\n \"urls\": []\n }\n },\n \"category\": {\n \"label\": \"uncategorized\"\n },\n \"content\": \"This tutorial demonstrates the process of cutting HDPE sheets using an X-Carve CNC.\\n\\nFor a complete video in Spanish with subtitles, visit: [YouTube Video](https://www.youtube.com/watch?v=4LrrFz802To)\\n\\n\\nUser Location: Mexico City, Mexico\\n\\nTo proceed, measure your plastic sheet: height, width, and thickness. Our X-Carve machine operates with the CAM software Easel, which I find to be user-friendly for CNC milling.\\n\\nEasel allows you to simulate the material, and it includes HDPE in its cutting material list.\\n\\n## Instructions for Securing a Sheet with CNC Clamps\\n\\nTo secure the sheet to the table, use the CNC clamps from the X-Carve.\\n\\nOpen a vector design program like Inkscape to create or download a vector file from [The Noun Project](https://thenounproject.com).\\n\\nDownload the SVG file and import it into Easel.\\n\\nWith the file ready, select the desired cutting width and proceed to cut using the wizard:\\n- Ensure the sheet is secured.\\n- Specify the cutting bit; a 1/8 inch (3.175 mm) flat flute bit is used.\\n- Set the machine's 0-0 coordinate, typically the lower left corner.\\n- Raise the bit, and start the CNC Router.\\n\\n### Tutorial Step: Showcasing Your Finished Object\\n\\nNow, finish post-processing your glasses or object, and share it with others.\\n\\nYou can attempt this project using various CNC machines, including manual routers or saws, as demonstrated in this [video](https://youtu.be/gxkcffQD3eQ). Sharing your work contributes to community development.\\n\\nShare your ideas and comments.\",\n \"keywords\": \"CNC milling, X-Carve tutorial, Easel software, cutting HDPE sheets, CNC clamps, vector design with Inkscape, CNC router setup, HDPE sheet cutting, CNC project sharing, secure CNC material\",\n \"resources\": \"To extract the required tools from the tutorial, here is the breakdown:\\n\\n### Software\\n\\n- **Easel** (CAM software for CNC milling)\\n- **Inkscape** (vector design program)\\n\\n### Hardware\\n\\n- **X-Carve CNC machine**\\n- **CNC clamps** (for sheet securing)\\n- **1/8 inch (3.175 mm) flat flute cutting bit**\\n\\nThis setup enables precise cutting of HDPE sheets, while Inkscape facilitates vector file creation for designs. The X-Carve’s integration with Easel streamlines material simulation and toolpath generation[1][2].\",\n \"references\": \"## YouTube\\n\\n- [YouTube Video](https://www.youtube.com/watch?v=4LrrFz802To)\\n- [CNC Project Demonstration](https://youtu.be/gxkcffQD3eQ)\\n\\n## Design Resources\\n\\n- [The Noun Project](https://thenounproject.com)\",\n \"brief\": \"Cut HDPE sheets using X-Carve CNC. Friendly with Easel software. Secure, simulate, and cut with precise steps. Perfect for DIY CNC enthusiasts. Get started now!\"\n }\n}","80031e5f2ea8f221"] \ No newline at end of file +[["Map",1,2,9,10,115,116,280,281,401,402],"meta::meta",["Map",3,4,5,6,7,8],"astro-version","5.4.1","content-config-digest","6365aa78fa3e7fae","astro-config-digest","{\"root\":{},\"srcDir\":{},\"publicDir\":{},\"outDir\":{},\"cacheDir\":{},\"site\":\"https://creava.org\",\"compressHTML\":true,\"base\":\"/\",\"trailingSlash\":\"ignore\",\"output\":\"static\",\"scopedStyleStrategy\":\"attribute\",\"build\":{\"format\":\"directory\",\"client\":{},\"server\":{},\"assets\":\"_astro\",\"serverEntry\":\"entry.mjs\",\"redirects\":true,\"inlineStylesheets\":\"auto\",\"concurrency\":1},\"server\":{\"open\":false,\"host\":\"0.0.0.0\",\"port\":4321,\"streaming\":true,\"allowedHosts\":[]},\"redirects\":{},\"image\":{\"endpoint\":{\"route\":\"/_image\"},\"service\":{\"entrypoint\":\"astro/assets/services/sharp\",\"config\":{}},\"domains\":[],\"remotePatterns\":[]},\"devToolbar\":{\"enabled\":false},\"markdown\":{\"syntaxHighlight\":\"shiki\",\"shikiConfig\":{\"langs\":[],\"langAlias\":{},\"theme\":\"github-light-default\",\"themes\":{},\"wrap\":false,\"transformers\":[]},\"remarkPlugins\":[],\"rehypePlugins\":[],\"remarkRehype\":{},\"gfm\":true,\"smartypants\":true},\"i18n\":{\"defaultLocale\":\"en\",\"locales\":[\"en\",\"es\",\"fr\",\"it\",\"de\"],\"routing\":{\"prefixDefaultLocale\":false,\"redirectToDefaultLocale\":true,\"fallbackType\":\"redirect\"}},\"security\":{\"checkOrigin\":true},\"env\":{\"schema\":{},\"validateSecrets\":false},\"experimental\":{\"clientPrerender\":false,\"contentIntellisense\":false,\"responsiveImages\":false,\"serializeConfig\":false},\"legacy\":{\"collections\":false}}","resources",["Map",11,12,25,26,92,93],"workflow",{"id":11,"data":13,"body":21,"filePath":22,"digest":23,"deferredRender":24},{"title":14,"pubDate":15,"description":16,"author":17,"image":18,"tags":20},"Untitled",["Date","2025-03-31T21:38:59.997Z"],"No description provided","Anonymous",{"url":19,"alt":19},"",[],"## Migration\r\n\r\n- json -> content/resources/howtos/*.mdx\r\n\r\n\r\n## Processing\r\n\r\n- content/resources/howtos/*.mdx + overlay -> \r\n filters (grammar,spelling,bullshit, rewrite) -> \r\n completions (resources ext/content) -> \r\n outputs (json-ld/pdf/md)\r\n\r\n## Editing\r\n\r\n- content/resources/howtos/*.mdx + overlay","src/content/resources/workflow.mdx","135d5c801dee7dd3",true,"community",{"id":25,"data":27,"body":37,"filePath":38,"digest":39,"rendered":40},{"title":28,"pubDate":29,"description":19,"author":30,"image":31,"tags":34},"Community Resources",["Date","2024-04-01T00:00:00.000Z"],"Polymech",{"url":32,"alt":33},"https://camillestyles.com/wp-content/uploads/2019/09/bc6764de-1.jpg","#_",[25,35,36],"blogging","c++","#### Articles\r\n\r\n- [Article: Plastic Gears Are the Future](https://www.machinedesign.com/materials/article/21836156/plastic-gears-are-the-future)\r\n\r\n- [Article: Will Stone Replace Steel and Concrete](https://www.construction-physics.com/p/will-stone-replace-steel-and-concrete)\r\n\r\n- [Article:Every Type of Plastic Used By LEGO](https://bricknerd.com/home/every-type-of-plastic-used-by-lego-5-20-22)\r\n\r\n#### Finance & Economy\r\n\r\n- [Panic At The Job Market](https://matt.sh/panic-at-the-job-market)\r\n\r\n- [Venture Capital - 2023](https://news.crunchbase.com/venture/monthly-vc-funding-recap-seed-downturn-july-2023/?utm_source=cb_daily&utm_medium=email&utm_campaign=20230703)\r\n\r\n- [Venture Capital - 2024](https://news.crunchbase.com/venture/global-funding-recap-q1-2024/)\r\n\r\n#### Technology\r\n\r\n- [Podcast : The Software behind Silicon](https://www.acquired.fm/episodes/the-software-behind-silicon-with-synopsys-founder-aart-de-geus-and-ceo-sassine-ghazi)\r\n\r\n- [Article : Advancing Plastic Recycling: Challenges and Opportunities in the Integration of 3D Printing and Distributed Recycling for a Circular Economy](https://mdpi.com/2073-4360/15/19/3881)\r\n\r\n- [Interview: AON3D Launches Hylo and Basis: The Future of 3D Printing Software and Hardware](https://3dprintingindustry.com/news/interview-aon3d-launches-hylo-and-basis-the-future-of-3d-printing-software-and-hardware-225751/)\r\n\r\n- [Resource : Collection of AI Tools](https://forum.osr-plastic.org/t/ai-tools/11060)\r\n\r\n- [Resource: The CTO Handbook](https://github.com/ZachGoldberg/Startup-CTO-Handbook/blob/main/StartupCTOHandbook.md)\r\n\r\n#### Opensource Projects\r\n\r\n- [Balancing Cube](https://willempennings.nl/balancing-cube/)\r\n\r\n- [6DOF Robot](https://www.anninrobotics.com/robot-kits)\r\n\r\n- [Distributed Manufacturing of Open Hardware: A Report of the Open Hardware Distribution & Documentation Working Group](https://openbioeconomy.org/outputs/distributed-manufacturing-of-open-hardware-a-report-of-the-open-hardware-distribution-documentation-working-group/)\r\n\r\n- [Paper: Distributed Manufacturing of OpenHardware](https://www.law.nyu.edu/sites/default/files/DistributedManufacturingofOpenHardware.pdf)\r\n\r\n#### Social Media\r\n\r\n- [Instagram - Vinyl Record Production](https://www.instagram.com/waxworkrecords)\r\n\r\n- [Instagram : Smartest Worker](https://www.instagram.com/smartest.worker)\r\n\r\n- [Article : What we Learned Making a Plastic Injection Mold with a Chinese Mold Maker](https://www.airgradient.com/blog/lessons-learned-plastic-injection-mold-making/)\r\n\r\n- [Instagram : New Talents \"manutechlab\"](https://www.instagram.com/p/C8r2Thqt4zt)\r\n\r\n- [Instagram : Robot based printing - \"The new raw\"](https://www.instagram.com/p/C9h4WXvsnpC)\r\n\r\n- [Instagram : Robot based printing, using concrete and other materials\"](https://www.instagram.com/p/C9VAtE6uY30)\r\n\r\n- [Instagram : 3D Printer using gravity](https://www.instagram.com/p/CvNOfKhotvS)\r\n\r\n- [Instagram : Ecollab8](https://www.instagram.com/ecollabo8/)\r\n\r\n#### Tiktok Cherries\r\n\r\n- [watchfulcoyote](https://www.tiktok.com/@watchfulcoyote) - on capitalism, slavery ...\r\n- [julianphilosophy](https://www.tiktok.com/@julianphilosophy) - philosophy and beyond\r\n- [nate.b.jones](https://www.tiktok.com/@nate.b.jones) - AI news\r\n- [@lizthedeveloper](https://www.tiktok.com/@lizthedeveloper) - AI news\r\n- [@christopherclaflin](https://www.tiktok.com/@christopherclaflin) - social media & the world\r\n- [@georebekah](https://www.tiktok.com/@georebekah) - politics, science\r\n- [@americanbaron](https://www.tiktok.com/@americanbaron) - philosophy & life\r\n- [@vagabondartist](https://www.tiktok.com/@vagabondartist) - leaving the USA\r\n- [@elle.cordova](https://www.tiktok.com/@elle.cordova) - creative wordsmith\r\n- [@pissedmagistus](https://www.tiktok.com/@pissedmagistus) - on capitalism & slavery\r\n- [@duarte_biz_gouveia](https://www.tiktok.com/@duarte_biz_gouveia/) - business coach\r\n- [@robertcroakofficial](https://www.tiktok.com/@robertcroakofficial/) - business coach\r\n- [@jennydinovi](https://www.tiktok.com/@jennydinovi/) - healing & self grow\r\n- [@drrachelbarr](https://www.tiktok.com/@drrachelbarr/) - practical neuro science\r\n- [@lexfridman](https://www.tiktok.com/@lexfridman) - tech podcast\r\n- [@shahidkbolsen](https://www.tiktok.com/@shahidkbolsen) - geo politics\r\n\r\n#### Culture\r\n\r\n- [Article: On Bullshit](http://www2.csudh.edu/ccauthen/576f12/frankfurt__harry_-_on_bullshit.pdf)\r\n\r\n- [Book: The parasitic mind](https://cdn.bookey.app/files/pdf/book/en/the-parasitic-mind.pdf)\r\n\r\n- [Video: Natural Law](https://www.youtube.com/watch?v=57UBuxnicOA&ab_channel=MarkPassio)\r\n\r\n- [Article: Reverse Engineering A Mysterious UDP Stream in My Hotel](https://www.gkbrk.com/2016/05/hotel-music/)\r\n\r\n- [Article: Why the creative industry needs to start talking about men's mental health](https://www.creativeboom.com/features/mens-mental-health-and-the-creative-industries/)\r\n- [Why the creative industry needs to start talking about men's mental health](https://www.creativeboom.com/features/mens-mental-health-and-the-creative-industries/)\r\n- [Interview: Evolution, Religion, and Happiness](https://www.youtube.com/watch?v=PTq6CYfikbg)\r\n- [Documentary: The Grab](https://www.imdb.com/title/tt21820452/)\r\n\r\n### Polymech - Resources\r\n\r\n- [Marketplace](https://shop.osr-plastic.org/)\r\n\r\n- [Howtos](https://forum.osr-plastic.org/c/wiki/howtos/72)\r\n\r\n- [Machine & Components Library](https://forum.osr-plastic.org/c/machines/49)\r\n\r\n- [Moulds - Library](https://files.polymech.io/files/machines/moulds/)\r\n\r\n- [Git Repository Machines](https://git.polymech.io/osr-plastic/osr-machines)\r\n\r\n- [Git Repository Code-Base](https://git.polymech.io/osr-plastic/osr-mono)\r\n\r\n- [Firmware](https://git.polymech.io/osr-plastic/osr-firmware)\r\n\r\n- [EMail](mailto:admin@osr-plastic.org)\r\n\r\n#### Talents\r\n\r\n- https://283bc.com/product.html\r\n- https://www.instagram.com/wedoo_workshop_bali\r\n- https://ko-fi.com/sotop_recycling (https://www.instagram.com/sotop_recycling/)\r\n- https://www.youtube.com/c/AndysMachines\r\n\r\n#### Plastic sheet providers\r\n\r\n- https://thegoodplasticcompany.com\r\n- https://www.sasminimum.com\r\n- https://belalbatros.com\r\n- https://thegoodplasticcompany.com\r\n- https://smile-plastics.com\r\n- https://www.resak.org\r\n- https://laplastiquerie.com\r\n\r\n#### Trade\r\n\r\n- [https://scrapo.com/](https://scrapo.com/)\r\n\r\n#### Data sets\r\n\r\n- [https://www.kaggle.com/](https://www.kaggle.com/search?q=plastic+datasetSize%3Asmall+datasetSize%3Amedium)\r\n- [https://www.oneplanetnetwork.org/knowledge-centre/resources](https://www.oneplanetnetwork.org/knowledge-centre/resources)\r\n\r\n#### Commercial Materials\r\n\r\n- [www.materialbank.eu](https://www.materialbank.eu/en/categories/materials/wallcovering)","src/content/resources/community.md","0ad0a33a7397124f",{"html":41,"metadata":42},"\u003Ch4 id=\"articles\">Articles\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.machinedesign.com/materials/article/21836156/plastic-gears-are-the-future\">Article: Plastic Gears Are the Future\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.construction-physics.com/p/will-stone-replace-steel-and-concrete\">Article: Will Stone Replace Steel and Concrete\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://bricknerd.com/home/every-type-of-plastic-used-by-lego-5-20-22\">Article:Every Type of Plastic Used By LEGO\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"finance--economy\">Finance & Economy\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://matt.sh/panic-at-the-job-market\">Panic At The Job Market\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://news.crunchbase.com/venture/monthly-vc-funding-recap-seed-downturn-july-2023/?utm_source=cb_daily&utm_medium=email&utm_campaign=20230703\">Venture Capital - 2023\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://news.crunchbase.com/venture/global-funding-recap-q1-2024/\">Venture Capital - 2024\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"technology\">Technology\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.acquired.fm/episodes/the-software-behind-silicon-with-synopsys-founder-aart-de-geus-and-ceo-sassine-ghazi\">Podcast : The Software behind Silicon\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://mdpi.com/2073-4360/15/19/3881\">Article : Advancing Plastic Recycling: Challenges and Opportunities in the Integration of 3D Printing and Distributed Recycling for a Circular Economy\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://3dprintingindustry.com/news/interview-aon3d-launches-hylo-and-basis-the-future-of-3d-printing-software-and-hardware-225751/\">Interview: AON3D Launches Hylo and Basis: The Future of 3D Printing Software and Hardware\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://forum.osr-plastic.org/t/ai-tools/11060\">Resource : Collection of AI Tools\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://github.com/ZachGoldberg/Startup-CTO-Handbook/blob/main/StartupCTOHandbook.md\">Resource: The CTO Handbook\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"opensource-projects\">Opensource Projects\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://willempennings.nl/balancing-cube/\">Balancing Cube\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.anninrobotics.com/robot-kits\">6DOF Robot\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://openbioeconomy.org/outputs/distributed-manufacturing-of-open-hardware-a-report-of-the-open-hardware-distribution-documentation-working-group/\">Distributed Manufacturing of Open Hardware: A Report of the Open Hardware Distribution & Documentation Working Group\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.law.nyu.edu/sites/default/files/DistributedManufacturingofOpenHardware.pdf\">Paper: Distributed Manufacturing of OpenHardware\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"social-media\">Social Media\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/waxworkrecords\">Instagram - Vinyl Record Production\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/smartest.worker\">Instagram : Smartest Worker\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.airgradient.com/blog/lessons-learned-plastic-injection-mold-making/\">Article : What we Learned Making a Plastic Injection Mold with a Chinese Mold Maker\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/p/C8r2Thqt4zt\">Instagram : New Talents “manutechlab”\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/p/C9h4WXvsnpC\">Instagram : Robot based printing - “The new raw”\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/p/C9VAtE6uY30\">Instagram : Robot based printing, using concrete and other materials”\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/p/CvNOfKhotvS\">Instagram : 3D Printer using gravity\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.instagram.com/ecollabo8/\">Instagram : Ecollab8\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"tiktok-cherries\">Tiktok Cherries\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@watchfulcoyote\">watchfulcoyote\u003C/a> - on capitalism, slavery …\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@julianphilosophy\">julianphilosophy\u003C/a> - philosophy and beyond\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@nate.b.jones\">nate.b.jones\u003C/a> - AI news\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@lizthedeveloper\">@lizthedeveloper\u003C/a> - AI news\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@christopherclaflin\">@christopherclaflin\u003C/a> - social media & the world\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@georebekah\">@georebekah\u003C/a> - politics, science\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@americanbaron\">@americanbaron\u003C/a> - philosophy & life\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@vagabondartist\">@vagabondartist\u003C/a> - leaving the USA\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@elle.cordova\">@elle.cordova\u003C/a> - creative wordsmith\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@pissedmagistus\">@pissedmagistus\u003C/a> - on capitalism & slavery\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@duarte_biz_gouveia/\">@duarte_biz_gouveia\u003C/a> - business coach\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@robertcroakofficial/\">@robertcroakofficial\u003C/a> - business coach\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@jennydinovi/\">@jennydinovi\u003C/a> - healing & self grow\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@drrachelbarr/\">@drrachelbarr\u003C/a> - practical neuro science\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@lexfridman\">@lexfridman\u003C/a> - tech podcast\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.tiktok.com/@shahidkbolsen\">@shahidkbolsen\u003C/a> - geo politics\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"culture\">Culture\u003C/h4>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"http://www2.csudh.edu/ccauthen/576f12/frankfurt__harry_-_on_bullshit.pdf\">Article: On Bullshit\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://cdn.bookey.app/files/pdf/book/en/the-parasitic-mind.pdf\">Book: The parasitic mind\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.youtube.com/watch?v=57UBuxnicOA&ab_channel=MarkPassio\">Video: Natural Law\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.gkbrk.com/2016/05/hotel-music/\">Article: Reverse Engineering A Mysterious UDP Stream in My Hotel\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.creativeboom.com/features/mens-mental-health-and-the-creative-industries/\">Article: Why the creative industry needs to start talking about men’s mental health\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.creativeboom.com/features/mens-mental-health-and-the-creative-industries/\">Why the creative industry needs to start talking about men’s mental health\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.youtube.com/watch?v=PTq6CYfikbg\">Interview: Evolution, Religion, and Happiness\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://www.imdb.com/title/tt21820452/\">Documentary: The Grab\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch3 id=\"polymech---resources\">Polymech - Resources\u003C/h3>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://shop.osr-plastic.org/\">Marketplace\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://forum.osr-plastic.org/c/wiki/howtos/72\">Howtos\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://forum.osr-plastic.org/c/machines/49\">Machine & Components Library\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://files.polymech.io/files/machines/moulds/\">Moulds - Library\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-machines\">Git Repository Machines\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono\">Git Repository Code-Base\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-firmware\">Firmware\u003C/a>\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>\u003Ca href=\"mailto:admin@osr-plastic.org\">EMail\u003C/a>\u003C/p>\n\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"talents\">Talents\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://283bc.com/product.html\">https://283bc.com/product.html\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.instagram.com/wedoo_workshop_bali\">https://www.instagram.com/wedoo_workshop_bali\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://ko-fi.com/sotop_recycling\">https://ko-fi.com/sotop_recycling\u003C/a> (\u003Ca href=\"https://www.instagram.com/sotop_recycling/\">https://www.instagram.com/sotop_recycling/\u003C/a>)\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.youtube.com/c/AndysMachines\">https://www.youtube.com/c/AndysMachines\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"plastic-sheet-providers\">Plastic sheet providers\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://thegoodplasticcompany.com\">https://thegoodplasticcompany.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.sasminimum.com\">https://www.sasminimum.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://belalbatros.com\">https://belalbatros.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://thegoodplasticcompany.com\">https://thegoodplasticcompany.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://smile-plastics.com\">https://smile-plastics.com\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.resak.org\">https://www.resak.org\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://laplastiquerie.com\">https://laplastiquerie.com\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"trade\">Trade\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://scrapo.com/\">https://scrapo.com/\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"data-sets\">Data sets\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://www.kaggle.com/search?q=plastic+datasetSize%3Asmall+datasetSize%3Amedium\">https://www.kaggle.com/\u003C/a>\u003C/li>\n\u003Cli>\u003Ca href=\"https://www.oneplanetnetwork.org/knowledge-centre/resources\">https://www.oneplanetnetwork.org/knowledge-centre/resources\u003C/a>\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"commercial-materials\">Commercial Materials\u003C/h4>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https://www.materialbank.eu/en/categories/materials/wallcovering\">www.materialbank.eu\u003C/a>\u003C/li>\n\u003C/ul>",{"headings":43,"localImagePaths":85,"remoteImagePaths":86,"frontmatter":87,"imagePaths":91},[44,48,51,54,57,60,63,66,70,73,76,79,82],{"depth":45,"slug":46,"text":47},4,"articles","Articles",{"depth":45,"slug":49,"text":50},"finance--economy","Finance & Economy",{"depth":45,"slug":52,"text":53},"technology","Technology",{"depth":45,"slug":55,"text":56},"opensource-projects","Opensource Projects",{"depth":45,"slug":58,"text":59},"social-media","Social Media",{"depth":45,"slug":61,"text":62},"tiktok-cherries","Tiktok Cherries",{"depth":45,"slug":64,"text":65},"culture","Culture",{"depth":67,"slug":68,"text":69},3,"polymech---resources","Polymech - Resources",{"depth":45,"slug":71,"text":72},"talents","Talents",{"depth":45,"slug":74,"text":75},"plastic-sheet-providers","Plastic sheet providers",{"depth":45,"slug":77,"text":78},"trade","Trade",{"depth":45,"slug":80,"text":81},"data-sets","Data sets",{"depth":45,"slug":83,"text":84},"commercial-materials","Commercial Materials",[],[],{"pubDate":88,"title":28,"author":30,"description":19,"image":89,"tags":90},["Date","2024-04-01T00:00:00.000Z"],{"url":32,"alt":33},[25,35,36],[],"software",{"id":92,"data":94,"body":101,"filePath":102,"digest":103,"rendered":104},{"title":95,"pubDate":96,"description":97,"author":30,"image":98,"tags":99},"Software",["Date","2024-04-01T00:00:00.000Z"],"Overview software package",{"url":32,"alt":33},[100,35,36],"astro","We are pleased to share the tools that support us to develop open-source hardware and content technology for the public domain.\r\n\r\n[***Polymech-CAD***](https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-cad) helps us to maintain and publish thousands of parts and designs.\r\n\r\n[***Polymech-Language***](https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osrl) helps us with content creation as newsletters, documentation, manuals knowledgebases for various formats and platforms.\r\n\r\n[***Polymech-AI***](https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-ai) leverages OpenAI to create dynamic, question-driven content, keeping articles up-to-date instead of static and often fast outdated content. It also helps us with daily research, design and maintainence tasks.\r\n\r\n[***Polymech-Code-Bot***](https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-code-bot) As alternative to [bolt.new](https://bolt.new) and similar AI aided tools, we introduced a terminal variant that helps with data & code transformation, translations and reseach.\r\n\r\nWe are currently porting all packages to more recent standards, enabling free trade, modern content creation. That includes migrating content from PreciousPlastic and others sources due to massive corruption and censorship cases. See [here](https://forum.osr-plastic.org/t/preciousplastic-review/11066) more details.\r\n\r\n---","src/content/resources/software.md","c4896e1a6968e4b3",{"html":105,"metadata":106},"\u003Cp>We are pleased to share the tools that support us to develop open-source hardware and content technology for the public domain.\u003C/p>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-cad\">\u003Cem>\u003Cstrong>Polymech-CAD\u003C/strong>\u003C/em>\u003C/a> helps us to maintain and publish thousands of parts and designs.\u003C/p>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osrl\">\u003Cem>\u003Cstrong>Polymech-Language\u003C/strong>\u003C/em>\u003C/a> helps us with content creation as newsletters, documentation, manuals knowledgebases for various formats and platforms.\u003C/p>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-ai\">\u003Cem>\u003Cstrong>Polymech-AI\u003C/strong>\u003C/em>\u003C/a> leverages OpenAI to create dynamic, question-driven content, keeping articles up-to-date instead of static and often fast outdated content. It also helps us with daily research, design and maintainence tasks.\u003C/p>\n\u003Cp>\u003Ca href=\"https://git.polymech.io/osr-plastic/osr-mono/src/branch/master/packages/osr-code-bot\">\u003Cem>\u003Cstrong>Polymech-Code-Bot\u003C/strong>\u003C/em>\u003C/a> As alternative to \u003Ca href=\"https://bolt.new\">bolt.new\u003C/a> and similar AI aided tools, we introduced a terminal variant that helps with data & code transformation, translations and reseach.\u003C/p>\n\u003Cp>We are currently porting all packages to more recent standards, enabling free trade, modern content creation. That includes migrating content from PreciousPlastic and others sources due to massive corruption and censorship cases. See \u003Ca href=\"https://forum.osr-plastic.org/t/preciousplastic-review/11066\">here\u003C/a> more details.\u003C/p>\n\u003Chr>",{"headings":107,"localImagePaths":108,"remoteImagePaths":109,"frontmatter":110,"imagePaths":114},[],[],[],{"pubDate":111,"title":95,"author":30,"description":97,"image":112,"tags":113},["Date","2024-04-01T00:00:00.000Z"],{"url":32,"alt":33},[100,35,36],[],"infopages",["Map",117,118,138,139,153,154,195,196,210,211,257,258],"contact",{"id":117,"data":119,"body":120,"filePath":121,"digest":122,"rendered":123,"legacyId":137},{},"## Contact\r\n\r\n## Administration & Sales\r\n\r\n[sales@plastic-hub.com](mailto:/sales@plastic-hub.com)\r\n\r\nAnne Barbier - +34 691 952 287\r\n\r\nAddress - Factory\r\n\r\nPolígono Can Clapers\r\nCarrer Can peric 11, 1B\r\n08181 Sentmenat ~ Spain\r\n\r\nVAT - ID : ESY0100830N\r\n\r\n[Get Directions](https://www.google.com/maps/place/Plastic+Hub/@41.6093789,2.1399009,17z/data=!3m1!4b1!4m5!3m4!1s0x12a4eb80cfabbbfd:0x2cd16f2aff436ed!8m2!3d41.6094019!4d2.1421267)","src/content/infopages/contact.md","d35438007df95197",{"html":124,"metadata":125},"\u003Ch2 id=\"contact\">Contact\u003C/h2>\n\u003Ch2 id=\"administration--sales\">Administration & Sales\u003C/h2>\n\u003Cp>\u003Ca href=\"mailto:/sales@plastic-hub.com\">sales@plastic-hub.com\u003C/a>\u003C/p>\n\u003Cp>Anne Barbier - +34 691 952 287\u003C/p>\n\u003Cp>Address - Factory\u003C/p>\n\u003Cp>Polígono Can Clapers\r\nCarrer Can peric 11, 1B\r\n08181 Sentmenat ~ Spain\u003C/p>\n\u003Cp>VAT - ID : ESY0100830N\u003C/p>\n\u003Cp>\u003Ca href=\"https://www.google.com/maps/place/Plastic+Hub/@41.6093789,2.1399009,17z/data=!3m1!4b1!4m5!3m4!1s0x12a4eb80cfabbbfd:0x2cd16f2aff436ed!8m2!3d41.6094019!4d2.1421267\">Get Directions\u003C/a>\u003C/p>",{"headings":126,"localImagePaths":133,"remoteImagePaths":134,"frontmatter":135,"imagePaths":136},[127,130],{"depth":128,"slug":117,"text":129},2,"Contact",{"depth":128,"slug":131,"text":132},"administration--sales","Administration & Sales",[],[],{},[],"contact.md","about",{"id":138,"data":140,"filePath":143,"digest":144,"rendered":145,"legacyId":152},{"page":141,"pubDate":142},"About",["Date","2024-01-01T00:00:00.000Z"],"src/content/infopages/about.md","41aad46e60fd00db",{"html":19,"metadata":146},{"headings":147,"localImagePaths":148,"remoteImagePaths":149,"frontmatter":150,"imagePaths":151},[],[],[],{"page":141,"pubDate":142},[],"about.md","dpa",{"id":153,"data":155,"body":158,"filePath":159,"digest":160,"rendered":161,"legacyId":194},{"page":156,"pubDate":157},"DPA",["Date","2024-01-01T00:00:00.000Z"],"# Data Processing Agreement (DPA)\n\n## Introduction\n\nThis Data Processing Agreement (\"Agreement\") outlines the terms and responsibilities related to the processing of personal data by [Processor's Name] (\"Processor\") on behalf of [Controller's Name] (\"Controller\"), in accordance with the requirements of data protection laws applicable to the processing of personal data.\n\n## Definitions\n\n- **Personal Data**: Any information relating to an identified or identifiable natural person.\n- **Processing**: Any operation or set of operations which is performed on personal data or on sets of personal data.\n- **Data Subject**: An identified or identifiable natural person whose personal data is processed by the Processor on behalf of the Controller.\n\n## Scope and Purpose\n\nThe purpose of this Agreement is to ensure the lawful and compliant processing of Personal Data by the Processor, as instructed by the Controller, and to define the rights and obligations of both parties.\n\n## Data Processing Terms\n\n1. **Processing Instructions**: The Processor agrees to process personal data only based on documented instructions from the Controller, unless required to do so by law.\n2. **Security of Processing**: The Processor shall implement appropriate technical and organizational measures to ensure a level of security appropriate to the risk.\n3. **Subprocessing**: The Processor shall not engage another processor without prior specific or general written authorization from the Controller.\n4. **Data Subject Rights**: The Processor shall assist the Controller in ensuring compliance with the data subjects' rights under the applicable data protection laws.\n5. **Data Breach Notification**: The Processor shall notify the Controller without undue delay upon becoming aware of a personal data breach.\n\n## Duration and Termination\n\nThis Agreement shall remain in effect as long as the Processor is processing Personal Data on behalf of the Controller. Upon termination, the Processor shall, at the choice of the Controller, delete or return all Personal Data to the Controller and delete existing copies unless EU law or the national law of an EU member state requires storage of the personal data.\n\n## Governing Law\n\nThis Agreement shall be governed by the laws of [Jurisdiction].\n\n## Signature\n\nThis Agreement has been entered into on the date of the last signature below.\n\n[Controller's Name] Signature: ___________________________ Date: ___________\n\n[Processor's Name] Signature: _____________________________ Date: ___________","src/content/infopages/dpa.md","45dfdc6d1d729847",{"html":162,"metadata":163},"\u003Ch1 id=\"data-processing-agreement-dpa\">Data Processing Agreement (DPA)\u003C/h1>\n\u003Ch2 id=\"introduction\">Introduction\u003C/h2>\n\u003Cp>This Data Processing Agreement (“Agreement”) outlines the terms and responsibilities related to the processing of personal data by [Processor’s Name] (“Processor”) on behalf of [Controller’s Name] (“Controller”), in accordance with the requirements of data protection laws applicable to the processing of personal data.\u003C/p>\n\u003Ch2 id=\"definitions\">Definitions\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Personal Data\u003C/strong>: Any information relating to an identified or identifiable natural person.\u003C/li>\n\u003Cli>\u003Cstrong>Processing\u003C/strong>: Any operation or set of operations which is performed on personal data or on sets of personal data.\u003C/li>\n\u003Cli>\u003Cstrong>Data Subject\u003C/strong>: An identified or identifiable natural person whose personal data is processed by the Processor on behalf of the Controller.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"scope-and-purpose\">Scope and Purpose\u003C/h2>\n\u003Cp>The purpose of this Agreement is to ensure the lawful and compliant processing of Personal Data by the Processor, as instructed by the Controller, and to define the rights and obligations of both parties.\u003C/p>\n\u003Ch2 id=\"data-processing-terms\">Data Processing Terms\u003C/h2>\n\u003Col>\n\u003Cli>\u003Cstrong>Processing Instructions\u003C/strong>: The Processor agrees to process personal data only based on documented instructions from the Controller, unless required to do so by law.\u003C/li>\n\u003Cli>\u003Cstrong>Security of Processing\u003C/strong>: The Processor shall implement appropriate technical and organizational measures to ensure a level of security appropriate to the risk.\u003C/li>\n\u003Cli>\u003Cstrong>Subprocessing\u003C/strong>: The Processor shall not engage another processor without prior specific or general written authorization from the Controller.\u003C/li>\n\u003Cli>\u003Cstrong>Data Subject Rights\u003C/strong>: The Processor shall assist the Controller in ensuring compliance with the data subjects’ rights under the applicable data protection laws.\u003C/li>\n\u003Cli>\u003Cstrong>Data Breach Notification\u003C/strong>: The Processor shall notify the Controller without undue delay upon becoming aware of a personal data breach.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"duration-and-termination\">Duration and Termination\u003C/h2>\n\u003Cp>This Agreement shall remain in effect as long as the Processor is processing Personal Data on behalf of the Controller. Upon termination, the Processor shall, at the choice of the Controller, delete or return all Personal Data to the Controller and delete existing copies unless EU law or the national law of an EU member state requires storage of the personal data.\u003C/p>\n\u003Ch2 id=\"governing-law\">Governing Law\u003C/h2>\n\u003Cp>This Agreement shall be governed by the laws of [Jurisdiction].\u003C/p>\n\u003Ch2 id=\"signature\">Signature\u003C/h2>\n\u003Cp>This Agreement has been entered into on the date of the last signature below.\u003C/p>\n\u003Cp>[Controller’s Name] Signature: ___________________________ Date: ___________\u003C/p>\n\u003Cp>[Processor’s Name] Signature: _____________________________ Date: ___________\u003C/p>",{"headings":164,"localImagePaths":190,"remoteImagePaths":191,"frontmatter":192,"imagePaths":193},[165,169,172,175,178,181,184,187],{"depth":166,"slug":167,"text":168},1,"data-processing-agreement-dpa","Data Processing Agreement (DPA)",{"depth":128,"slug":170,"text":171},"introduction","Introduction",{"depth":128,"slug":173,"text":174},"definitions","Definitions",{"depth":128,"slug":176,"text":177},"scope-and-purpose","Scope and Purpose",{"depth":128,"slug":179,"text":180},"data-processing-terms","Data Processing Terms",{"depth":128,"slug":182,"text":183},"duration-and-termination","Duration and Termination",{"depth":128,"slug":185,"text":186},"governing-law","Governing Law",{"depth":128,"slug":188,"text":189},"signature","Signature",[],[],{"page":156,"pubDate":157},[],"dpa.md","cookies",{"id":195,"data":197,"filePath":200,"digest":201,"rendered":202,"legacyId":209},{"page":198,"pubDate":199},"Cookies",["Date","2024-01-01T00:00:00.000Z"],"src/content/infopages/cookies.md","edcd54ab141950aa",{"html":19,"metadata":203},{"headings":204,"localImagePaths":205,"remoteImagePaths":206,"frontmatter":207,"imagePaths":208},[],[],[],{"page":198,"pubDate":199},[],"cookies.md","terms",{"id":210,"data":212,"body":215,"filePath":216,"digest":217,"rendered":218,"legacyId":256},{"page":213,"pubDate":214},"Terms",["Date","2024-01-01T00:00:00.000Z"],"All the terms that you agree to when you sign up for a Lexington product.\n-------------------------------------------------------------------------\n\nFrom everyone at Lexington, thank you for using our products! We build them to help you do your best work. There are millions of people using Lexington products every day. Because we don’t know every one of our customers personally, we have to put in place some Terms of Service to help keep the ship afloat.\n\nWhen we say “Company”, “we”, “our”, or “us” in this document, we are referring to [Lexington LLC](#_). We spun off Highrise HQ, LLC in the past, but it has since rejoined Lexington LLC.\n\nWhen we say “Services”, we mean our websites, including Lexington.com, hey.com, and Lexington.com, and any product created and maintained by Lexington LLC. That includes Lexington (all versions), HEY, Highrise, Campfire, Backpack, Ta-da List, and Writeboard, whether delivered within a web browser, desktop application, mobile application, or another format.\n\nWhen we say “You” or “your”, we are referring to the people or organizations that own an account with one or more of our Services. We have specific ownership policies for our products: [Lexington 4](#_), [Lexington 2](#_), [Lexington Classic](#_), [HEY for Domains](#_), [Highrise](#_), [Campfire](#_) and [Backpack](#_).\n\nWe may update these Terms of Service (\"Terms\") in the future. You can track all changes made since mid-2018 [on GitHub](#_). Typically these changes have been to clarify some of these terms by linking to an expanded related policy. Whenever we make a significant change to our policies, we will refresh the date at the top of this page and take any other appropriate steps to notify account holders.\n\nWhen you use our Services, now or in the future, you are agreeing to the latest Terms. There may be times where we do not exercise or enforce a right or provision of the Terms; however, that does not mean we are waiving that right or provision. **These Terms do contain a limitation of our liability.**\n\nIf you violate any of the Terms, we may terminate your account. That’s a broad statement and it means you need to place a lot of trust in us. We do our best to deserve that trust by being open about [who we are](#_), [how we work](#_), and keeping an open door to [your feedback](#_).\n\nAccount Terms\n-------------\n\n1. You are responsible for maintaining the security of your account and password and for ensuring that any of your users do the same. The Company cannot and will not be liable for any loss or damage from your failure to comply with this security obligation. We recommend all users set up [two-factor authentication](#_) for added security. In some of our Services, we may require it.\n2. You may not use the Services for any purpose outlined in our [Use Restrictions policy](#_), and you may not permit any of your users to do so, either.\n3. You are responsible for all content posted to and activity that occurs under your account, including content posted by and activity of any users in your account.\n4. You must be a human. Accounts registered by “bots” or other automated methods are not permitted.\n\nPayment, Refunds, and Plan Changes\n----------------------------------\n\n1. If you are using a free version of one of our Services, it is really free: we do not ask you for your credit card and — just like for customers who pay for our Services — we do not sell your data.\n2. For paid Services that offer a free trial, we explain the length of trial when you sign up. After the trial period, you need to pay in advance to keep using the Service. If you do not pay, we will freeze your account and it will be inaccessible until you make payment. If your account has been frozen for a while, we will queue it up for auto-cancellation. See our [Cancellation policy](#_) for more details.\n3. If you are upgrading from a free plan to a paid plan, we will charge your card immediately and your billing cycle starts on the day of upgrade. For other upgrades or downgrades in plan level, the new rate starts from the next billing cycle.\n4. All fees are exclusive of all taxes, levies, or duties imposed by taxing authorities. Where required, we will collect those taxes on behalf of the taxing authority and remit those taxes to taxing authorities. See our [Taxes policy](#_) for more details. Otherwise, you are responsible for payment of all taxes, levies, or duties.\n5. We process refunds according to our [Fair Refund policy](#_).\n\nCancellation and Termination\n----------------------------\n\n1. You are solely responsible for properly canceling your account. Within each of our Services, we provide a simple no-questions-asked cancellation link. You can find instructions for how to cancel your account in our [Cancellation policy](#_). An email or phone request to cancel your account is not automatically considered cancellation. If you need help canceling your account, you can always [contact our Support team](#_).\n2. All of your content will be inaccessible from the Services immediately upon account cancellation. Within 30 days, all content will be permanently deleted from active systems and logs. Within 60 days, all content will be permanently deleted from our backups. We cannot recover this information once it has been permanently deleted. If you want to export any data before your account is canceled, we‘ve provided instructions for [HEY](#_), [Lexington 4](#_), [Lexington 2](#_), [Lexington Classic](#_), [Highrise](#_), [Campfire](#_), and [Backpack](#_).\n3. If you cancel the Service before the end of your current paid up month, your cancellation will take effect immediately, and you will not be charged again. We do not automatically prorate unused time in the last billing cycle. See our [Fair Refund policy](#_) for more details.\n4. We have the right to suspend or terminate your account and refuse any and all current or future use of our Services for any reason at any time. Suspension means you and any other users on your account will not be able to access the account or any content in the account. Termination will furthermore result in the deletion of your account or your access to your account, and the forfeiture and relinquishment of all content in your account. We also reserve the right to refuse the use of the Services to anyone for any reason at any time. We have this clause because statistically speaking, out of the hundreds of thousands of accounts on our Services, there is at least one doing something nefarious. There are some things we staunchly stand against and this clause is how we exercise that stance. For more details, see our [Use Restrictions policy](#_).\n5. Verbal, physical, written or other abuse (including threats of abuse or retribution) of a Company employee or officer will result in immediate account termination.\n\nModifications to the Service and Prices\n---------------------------------------\n\n1. We make a promise to our customers to support our Services [until the end of the Internet](#_). That means when it comes to security, privacy, and customer support, we will continue to maintain any legacy Services. Sometimes it becomes technically impossible to continue a feature or we redesign a part of our Services because we think it could be better or we decide to close new signups of a product. We reserve the right at any time to modify or discontinue, temporarily or permanently, any part of our Services with or without notice.\n2. Sometimes we change the pricing structure for our products. When we do that, we tend to exempt existing customers from those changes. However, we may choose to change the prices for existing customers. If we do so, we will give at least 30 days notice and will notify you via the email address on record. We may also post a notice about changes on our websites or the affected Services themselves.\n\nUptime, Security, and Privacy\n-----------------------------\n\n1. Your use of the Services is at your sole risk. We provide these Services on an “as is” and “as available” basis. We do not offer service-level agreements for most of our Services — here’s [the one exception](#_) — but do take uptime of our applications seriously. Visit [https://www.37status.com](#_) to see the status of our Services.\n2. We reserve the right to temporarily disable your account if your usage significantly exceeds the average usage of other customers of the Services. Of course, we’ll reach out to the account owner before taking any action except in rare cases where the level of use may negatively impact the performance of the Service for other customers.\n3. We take many measures to protect and secure your data through backups, redundancies, and encryption. We enforce encryption for data transmission from the public Internet. There are some edge cases where we may send your data through our network unencrypted. Please refer to our [Security Overview](#_) for full details and our [Security Response page](#_) for how to report a security incident or threat.\n4. When you use our Services, you entrust us with your data. We take that trust to heart. You agree that Lexington may process your data as described in our [Privacy Policy](#_) and for no other purpose. We as humans can access your data for the following reasons:\n\n * **To help you with support requests you make.** We’ll ask for express consent before accessing your account.\n * **On the rare occasions when an error occurs that stops an automated process partway through.** We get automated alerts when such errors occur. When we can fix the issue and restart automated processing without looking at any personal data, we do. In rare cases, we have to look at a minimum amount of personal data to fix the issue. In these rare cases, we aim to fix the root cause to prevent the errors from recurring.\n * **To safeguard Lexington.** We’ll look at logs and metadata as part of our work to ensure the security of your data and the Services as a whole. If necessary, we may also access accounts as part of an [abuse report investigation](#_).\n * **To the extent required by applicable law.** As a US company with all data infrastructure located in the US, we only preserve or share customer data if compelled by a US government authority with a legally binding order or proper request under the Stored Communications Act, or in limited circumstances in the event of an emergency request. If a non-US authority approaches Lexington for assistance, our default stance is to refuse unless the order has been approved by the US government, which compels us to comply through procedures outlined in an established mutual legal assistance treaty or agreement mechanism. If Lexington is audited by a tax authority, we only share the bare minimum billing information needed to complete the audit.\n5. We use third party vendors and hosting partners to provide the necessary hardware, software, networking, storage, and related technology required to run the Services. You can see a list of all subprocessors who handle personal data for [Lexington](#_), [HEY](#_), [Highrise](#_), [Campfire](#_), and [Backpack](#_), as well as a list of [Company processors](#_).\n\n6. Under the California Consumer Privacy Act (“CCPA”), Lexington is a “service provider”, not a “business” or “third party”, with respect to your use of the Services. That means we process any data you share with us only for the purpose you signed up for and as described in these Terms, the [Privacy policy](#_), and [other policies](#_). We do not retain, use, disclose, or sell any of that information for any other commercial purposes unless we have your explicit permission. And on the flip-side, you agree to comply with your requirements under the CCPA and not use Lexington’s Services in a way that violates the regulations.\n7. These Terms incorporate the [Lexington Data Processing Addendum (“DPA”)](#_) when the EU General Data Protection Regulation (“GDPR”) or United Kingdom General Data Protection Regulation (“UK GDPR”) applies to your use of Lexington Services to process Customer Data as defined in the DPA. The DPA linked above supersedes any previously agreed data processing addendum between you and Lexington LLC relating to your use of the Lexington Services.\n\nCopyright and Content Ownership\n-------------------------------\n\n1. All content posted on the Services must comply with U.S. copyright law. We provide details on [how to file a copyright infringement claim](#_).\n2. You give us a limited license to use the content posted by you and your users in order to provide the Services to you, but we claim no ownership rights over those materials. All materials you submit to the Services remain yours.\n3. We do not pre-screen content, but we reserve the right (but not the obligation) in our sole discretion to refuse or remove any content that is available via the Service.\n4. The Company or its licensors own all right, title, and interest in and to the Services, including all intellectual property rights therein, and you obtain no ownership rights in the Services as a result of your use. You may not duplicate, copy, or reuse any portion of the HTML, CSS, JavaScript, or visual design elements without express written permission from the Company. You must request permission to use the Company’s logos or any Service logos for promotional purposes. Please [email us](#_) requests to use logos. We reserve the right to rescind any permissions if you violate these Terms.\n5. You agree not to reproduce, duplicate, copy, sell, resell or exploit any portion of the Services, use of the Services, or access to the Services without the express written permission of the Company.\n\nFeatures and Bugs\n-----------------\n\nWe design our Services with care, based on our own experience and the experiences of customers who share their time and feedback. However, there is no such thing as a service that pleases everybody. We make no guarantees that our Services will meet your specific requirements or expectations.\n\nWe also test all of our features extensively before shipping them. As with any software, our Services inevitably have some bugs. We track the bugs reported to us and work through priority ones, especially any related to security or privacy. Not all reported bugs will get fixed and we don’t guarantee completely error-free Services.\n\nServices Adaptations and API Terms\n----------------------------------\n\nWe offer Application Program Interfaces (“API”s) for some of our Services (currently Lexington, Highrise, Campfire, and Backpack). Any use of the API, including through a third-party product that accesses the Services, is bound by these Terms plus the following specific terms:\n\n1. You expressly understand and agree that we are not liable for any damages or losses resulting from your use of the API or third-party products that access data via the API.\n2. Third parties may not access and employ the API if the functionality is part of an application that remotely records, monitors, or reports a Service user’s activity _other than time tracking_, both inside and outside the applications. The Company, in its sole discretion, will determine if an integration service violates this bylaw. A third party that has built and deployed an integration for the purpose of remote user surveillance will be required to remove that integration.\n3. Abuse or excessively frequent requests to the Services via the API may result in the temporary or permanent suspension of your account’s access to the API. The Company, in its sole discretion, will determine abuse or excessive usage of the API. If we need to suspend your account’s access, we will attempt to warn the account owner first. If your API usage could or has caused downtime, we may cut off access without prior notice.\n\nSome third-party providers have created integrations between our Services and theirs. You can find some of those integrations for Lexington at [https://Lexington.com/extras](#_) and for Highrise at [https://highrisehq.com/extras](#_). We are not liable or accountable for any of these third-party integrations.\n\nLiability\n---------\n\nWe mention liability throughout these Terms but to put it all in one section:\n\n**_You expressly understand and agree that the Company shall not be liable, in law or in equity, to you or to any third party for any direct, indirect, incidental, lost profits, special, consequential, punitive or exemplary damages, including, but not limited to, damages for loss of profits, goodwill, use, data or other intangible losses (even if the Company has been advised of the possibility of such damages), resulting from: (i) the use or the inability to use the Services; (ii) the cost of procurement of substitute goods and services resulting from any goods, data, information or services purchased or obtained or messages received or transactions entered into through or from the Services; (iii) unauthorized access to or alteration of your transmissions or data; (iv) statements or conduct of any third party on the service; (v) or any other matter relating to these Terms or the Services, whether as a breach of contract, tort (including negligence whether active or passive), or any other theory of liability._**\n\nIn other words: choosing to use our Services does mean you are making a bet on us. If the bet does not work out, that’s on you, not us. We do our darnedest to be as safe a bet as possible through careful management of the business; investments in security, infrastructure, and talent; and in general [giving a damn](#_). If you choose to use our Services, thank you for betting on us.\n\nIf you have a question about any of these Terms, please [contact our Support team](#_).","src/content/infopages/terms.md","c00802cb6420bd7b",{"html":219,"metadata":220},"\u003Ch2 id=\"all-the-terms-that-you-agree-to-when-you-sign-up-for-a-lexington-product\">All the terms that you agree to when you sign up for a Lexington product.\u003C/h2>\n\u003Cp>From everyone at Lexington, thank you for using our products! We build them to help you do your best work. There are millions of people using Lexington products every day. Because we don’t know every one of our customers personally, we have to put in place some Terms of Service to help keep the ship afloat.\u003C/p>\n\u003Cp>When we say “Company”, “we”, “our”, or “us” in this document, we are referring to \u003Ca href=\"#_\">Lexington LLC\u003C/a>. We spun off Highrise HQ, LLC in the past, but it has since rejoined Lexington LLC.\u003C/p>\n\u003Cp>When we say “Services”, we mean our websites, including Lexington.com, hey.com, and Lexington.com, and any product created and maintained by Lexington LLC. That includes Lexington (all versions), HEY, Highrise, Campfire, Backpack, Ta-da List, and Writeboard, whether delivered within a web browser, desktop application, mobile application, or another format.\u003C/p>\n\u003Cp>When we say “You” or “your”, we are referring to the people or organizations that own an account with one or more of our Services. We have specific ownership policies for our products: \u003Ca href=\"#_\">Lexington 4\u003C/a>, \u003Ca href=\"#_\">Lexington 2\u003C/a>, \u003Ca href=\"#_\">Lexington Classic\u003C/a>, \u003Ca href=\"#_\">HEY for Domains\u003C/a>, \u003Ca href=\"#_\">Highrise\u003C/a>, \u003Ca href=\"#_\">Campfire\u003C/a> and \u003Ca href=\"#_\">Backpack\u003C/a>.\u003C/p>\n\u003Cp>We may update these Terms of Service (“Terms”) in the future. You can track all changes made since mid-2018 \u003Ca href=\"#_\">on GitHub\u003C/a>. Typically these changes have been to clarify some of these terms by linking to an expanded related policy. Whenever we make a significant change to our policies, we will refresh the date at the top of this page and take any other appropriate steps to notify account holders.\u003C/p>\n\u003Cp>When you use our Services, now or in the future, you are agreeing to the latest Terms. There may be times where we do not exercise or enforce a right or provision of the Terms; however, that does not mean we are waiving that right or provision. \u003Cstrong>These Terms do contain a limitation of our liability.\u003C/strong>\u003C/p>\n\u003Cp>If you violate any of the Terms, we may terminate your account. That’s a broad statement and it means you need to place a lot of trust in us. We do our best to deserve that trust by being open about \u003Ca href=\"#_\">who we are\u003C/a>, \u003Ca href=\"#_\">how we work\u003C/a>, and keeping an open door to \u003Ca href=\"#_\">your feedback\u003C/a>.\u003C/p>\n\u003Ch2 id=\"account-terms\">Account Terms\u003C/h2>\n\u003Col>\n\u003Cli>You are responsible for maintaining the security of your account and password and for ensuring that any of your users do the same. The Company cannot and will not be liable for any loss or damage from your failure to comply with this security obligation. We recommend all users set up \u003Ca href=\"#_\">two-factor authentication\u003C/a> for added security. In some of our Services, we may require it.\u003C/li>\n\u003Cli>You may not use the Services for any purpose outlined in our \u003Ca href=\"#_\">Use Restrictions policy\u003C/a>, and you may not permit any of your users to do so, either.\u003C/li>\n\u003Cli>You are responsible for all content posted to and activity that occurs under your account, including content posted by and activity of any users in your account.\u003C/li>\n\u003Cli>You must be a human. Accounts registered by “bots” or other automated methods are not permitted.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"payment-refunds-and-plan-changes\">Payment, Refunds, and Plan Changes\u003C/h2>\n\u003Col>\n\u003Cli>If you are using a free version of one of our Services, it is really free: we do not ask you for your credit card and — just like for customers who pay for our Services — we do not sell your data.\u003C/li>\n\u003Cli>For paid Services that offer a free trial, we explain the length of trial when you sign up. After the trial period, you need to pay in advance to keep using the Service. If you do not pay, we will freeze your account and it will be inaccessible until you make payment. If your account has been frozen for a while, we will queue it up for auto-cancellation. See our \u003Ca href=\"#_\">Cancellation policy\u003C/a> for more details.\u003C/li>\n\u003Cli>If you are upgrading from a free plan to a paid plan, we will charge your card immediately and your billing cycle starts on the day of upgrade. For other upgrades or downgrades in plan level, the new rate starts from the next billing cycle.\u003C/li>\n\u003Cli>All fees are exclusive of all taxes, levies, or duties imposed by taxing authorities. Where required, we will collect those taxes on behalf of the taxing authority and remit those taxes to taxing authorities. See our \u003Ca href=\"#_\">Taxes policy\u003C/a> for more details. Otherwise, you are responsible for payment of all taxes, levies, or duties.\u003C/li>\n\u003Cli>We process refunds according to our \u003Ca href=\"#_\">Fair Refund policy\u003C/a>.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"cancellation-and-termination\">Cancellation and Termination\u003C/h2>\n\u003Col>\n\u003Cli>You are solely responsible for properly canceling your account. Within each of our Services, we provide a simple no-questions-asked cancellation link. You can find instructions for how to cancel your account in our \u003Ca href=\"#_\">Cancellation policy\u003C/a>. An email or phone request to cancel your account is not automatically considered cancellation. If you need help canceling your account, you can always \u003Ca href=\"#_\">contact our Support team\u003C/a>.\u003C/li>\n\u003Cli>All of your content will be inaccessible from the Services immediately upon account cancellation. Within 30 days, all content will be permanently deleted from active systems and logs. Within 60 days, all content will be permanently deleted from our backups. We cannot recover this information once it has been permanently deleted. If you want to export any data before your account is canceled, we‘ve provided instructions for \u003Ca href=\"#_\">HEY\u003C/a>, \u003Ca href=\"#_\">Lexington 4\u003C/a>, \u003Ca href=\"#_\">Lexington 2\u003C/a>, \u003Ca href=\"#_\">Lexington Classic\u003C/a>, \u003Ca href=\"#_\">Highrise\u003C/a>, \u003Ca href=\"#_\">Campfire\u003C/a>, and \u003Ca href=\"#_\">Backpack\u003C/a>.\u003C/li>\n\u003Cli>If you cancel the Service before the end of your current paid up month, your cancellation will take effect immediately, and you will not be charged again. We do not automatically prorate unused time in the last billing cycle. See our \u003Ca href=\"#_\">Fair Refund policy\u003C/a> for more details.\u003C/li>\n\u003Cli>We have the right to suspend or terminate your account and refuse any and all current or future use of our Services for any reason at any time. Suspension means you and any other users on your account will not be able to access the account or any content in the account. Termination will furthermore result in the deletion of your account or your access to your account, and the forfeiture and relinquishment of all content in your account. We also reserve the right to refuse the use of the Services to anyone for any reason at any time. We have this clause because statistically speaking, out of the hundreds of thousands of accounts on our Services, there is at least one doing something nefarious. There are some things we staunchly stand against and this clause is how we exercise that stance. For more details, see our \u003Ca href=\"#_\">Use Restrictions policy\u003C/a>.\u003C/li>\n\u003Cli>Verbal, physical, written or other abuse (including threats of abuse or retribution) of a Company employee or officer will result in immediate account termination.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"modifications-to-the-service-and-prices\">Modifications to the Service and Prices\u003C/h2>\n\u003Col>\n\u003Cli>We make a promise to our customers to support our Services \u003Ca href=\"#_\">until the end of the Internet\u003C/a>. That means when it comes to security, privacy, and customer support, we will continue to maintain any legacy Services. Sometimes it becomes technically impossible to continue a feature or we redesign a part of our Services because we think it could be better or we decide to close new signups of a product. We reserve the right at any time to modify or discontinue, temporarily or permanently, any part of our Services with or without notice.\u003C/li>\n\u003Cli>Sometimes we change the pricing structure for our products. When we do that, we tend to exempt existing customers from those changes. However, we may choose to change the prices for existing customers. If we do so, we will give at least 30 days notice and will notify you via the email address on record. We may also post a notice about changes on our websites or the affected Services themselves.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"uptime-security-and-privacy\">Uptime, Security, and Privacy\u003C/h2>\n\u003Col>\n\u003Cli>\n\u003Cp>Your use of the Services is at your sole risk. We provide these Services on an “as is” and “as available” basis. We do not offer service-level agreements for most of our Services — here’s \u003Ca href=\"#_\">the one exception\u003C/a> — but do take uptime of our applications seriously. Visit \u003Ca href=\"#_\">https://www.37status.com\u003C/a> to see the status of our Services.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>We reserve the right to temporarily disable your account if your usage significantly exceeds the average usage of other customers of the Services. Of course, we’ll reach out to the account owner before taking any action except in rare cases where the level of use may negatively impact the performance of the Service for other customers.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>We take many measures to protect and secure your data through backups, redundancies, and encryption. We enforce encryption for data transmission from the public Internet. There are some edge cases where we may send your data through our network unencrypted. Please refer to our \u003Ca href=\"#_\">Security Overview\u003C/a> for full details and our \u003Ca href=\"#_\">Security Response page\u003C/a> for how to report a security incident or threat.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>When you use our Services, you entrust us with your data. We take that trust to heart. You agree that Lexington may process your data as described in our \u003Ca href=\"#_\">Privacy Policy\u003C/a> and for no other purpose. We as humans can access your data for the following reasons:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>To help you with support requests you make.\u003C/strong> We’ll ask for express consent before accessing your account.\u003C/li>\n\u003Cli>\u003Cstrong>On the rare occasions when an error occurs that stops an automated process partway through.\u003C/strong> We get automated alerts when such errors occur. When we can fix the issue and restart automated processing without looking at any personal data, we do. In rare cases, we have to look at a minimum amount of personal data to fix the issue. In these rare cases, we aim to fix the root cause to prevent the errors from recurring.\u003C/li>\n\u003Cli>\u003Cstrong>To safeguard Lexington.\u003C/strong> We’ll look at logs and metadata as part of our work to ensure the security of your data and the Services as a whole. If necessary, we may also access accounts as part of an \u003Ca href=\"#_\">abuse report investigation\u003C/a>.\u003C/li>\n\u003Cli>\u003Cstrong>To the extent required by applicable law.\u003C/strong> As a US company with all data infrastructure located in the US, we only preserve or share customer data if compelled by a US government authority with a legally binding order or proper request under the Stored Communications Act, or in limited circumstances in the event of an emergency request. If a non-US authority approaches Lexington for assistance, our default stance is to refuse unless the order has been approved by the US government, which compels us to comply through procedures outlined in an established mutual legal assistance treaty or agreement mechanism. If Lexington is audited by a tax authority, we only share the bare minimum billing information needed to complete the audit.\u003C/li>\n\u003C/ul>\n\u003C/li>\n\u003Cli>\n\u003Cp>We use third party vendors and hosting partners to provide the necessary hardware, software, networking, storage, and related technology required to run the Services. You can see a list of all subprocessors who handle personal data for \u003Ca href=\"#_\">Lexington\u003C/a>, \u003Ca href=\"#_\">HEY\u003C/a>, \u003Ca href=\"#_\">Highrise\u003C/a>, \u003Ca href=\"#_\">Campfire\u003C/a>, and \u003Ca href=\"#_\">Backpack\u003C/a>, as well as a list of \u003Ca href=\"#_\">Company processors\u003C/a>.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>Under the California Consumer Privacy Act (“CCPA”), Lexington is a “service provider”, not a “business” or “third party”, with respect to your use of the Services. That means we process any data you share with us only for the purpose you signed up for and as described in these Terms, the \u003Ca href=\"#_\">Privacy policy\u003C/a>, and \u003Ca href=\"#_\">other policies\u003C/a>. We do not retain, use, disclose, or sell any of that information for any other commercial purposes unless we have your explicit permission. And on the flip-side, you agree to comply with your requirements under the CCPA and not use Lexington’s Services in a way that violates the regulations.\u003C/p>\n\u003C/li>\n\u003Cli>\n\u003Cp>These Terms incorporate the \u003Ca href=\"#_\">Lexington Data Processing Addendum (“DPA”)\u003C/a> when the EU General Data Protection Regulation (“GDPR”) or United Kingdom General Data Protection Regulation (“UK GDPR”) applies to your use of Lexington Services to process Customer Data as defined in the DPA. The DPA linked above supersedes any previously agreed data processing addendum between you and Lexington LLC relating to your use of the Lexington Services.\u003C/p>\n\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"copyright-and-content-ownership\">Copyright and Content Ownership\u003C/h2>\n\u003Col>\n\u003Cli>All content posted on the Services must comply with U.S. copyright law. We provide details on \u003Ca href=\"#_\">how to file a copyright infringement claim\u003C/a>.\u003C/li>\n\u003Cli>You give us a limited license to use the content posted by you and your users in order to provide the Services to you, but we claim no ownership rights over those materials. All materials you submit to the Services remain yours.\u003C/li>\n\u003Cli>We do not pre-screen content, but we reserve the right (but not the obligation) in our sole discretion to refuse or remove any content that is available via the Service.\u003C/li>\n\u003Cli>The Company or its licensors own all right, title, and interest in and to the Services, including all intellectual property rights therein, and you obtain no ownership rights in the Services as a result of your use. You may not duplicate, copy, or reuse any portion of the HTML, CSS, JavaScript, or visual design elements without express written permission from the Company. You must request permission to use the Company’s logos or any Service logos for promotional purposes. Please \u003Ca href=\"#_\">email us\u003C/a> requests to use logos. We reserve the right to rescind any permissions if you violate these Terms.\u003C/li>\n\u003Cli>You agree not to reproduce, duplicate, copy, sell, resell or exploit any portion of the Services, use of the Services, or access to the Services without the express written permission of the Company.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"features-and-bugs\">Features and Bugs\u003C/h2>\n\u003Cp>We design our Services with care, based on our own experience and the experiences of customers who share their time and feedback. However, there is no such thing as a service that pleases everybody. We make no guarantees that our Services will meet your specific requirements or expectations.\u003C/p>\n\u003Cp>We also test all of our features extensively before shipping them. As with any software, our Services inevitably have some bugs. We track the bugs reported to us and work through priority ones, especially any related to security or privacy. Not all reported bugs will get fixed and we don’t guarantee completely error-free Services.\u003C/p>\n\u003Ch2 id=\"services-adaptations-and-api-terms\">Services Adaptations and API Terms\u003C/h2>\n\u003Cp>We offer Application Program Interfaces (“API”s) for some of our Services (currently Lexington, Highrise, Campfire, and Backpack). Any use of the API, including through a third-party product that accesses the Services, is bound by these Terms plus the following specific terms:\u003C/p>\n\u003Col>\n\u003Cli>You expressly understand and agree that we are not liable for any damages or losses resulting from your use of the API or third-party products that access data via the API.\u003C/li>\n\u003Cli>Third parties may not access and employ the API if the functionality is part of an application that remotely records, monitors, or reports a Service user’s activity \u003Cem>other than time tracking\u003C/em>, both inside and outside the applications. The Company, in its sole discretion, will determine if an integration service violates this bylaw. A third party that has built and deployed an integration for the purpose of remote user surveillance will be required to remove that integration.\u003C/li>\n\u003Cli>Abuse or excessively frequent requests to the Services via the API may result in the temporary or permanent suspension of your account’s access to the API. The Company, in its sole discretion, will determine abuse or excessive usage of the API. If we need to suspend your account’s access, we will attempt to warn the account owner first. If your API usage could or has caused downtime, we may cut off access without prior notice.\u003C/li>\n\u003C/ol>\n\u003Cp>Some third-party providers have created integrations between our Services and theirs. You can find some of those integrations for Lexington at \u003Ca href=\"#_\">https://Lexington.com/extras\u003C/a> and for Highrise at \u003Ca href=\"#_\">https://highrisehq.com/extras\u003C/a>. We are not liable or accountable for any of these third-party integrations.\u003C/p>\n\u003Ch2 id=\"liability\">Liability\u003C/h2>\n\u003Cp>We mention liability throughout these Terms but to put it all in one section:\u003C/p>\n\u003Cp>\u003Cstrong>\u003Cem>You expressly understand and agree that the Company shall not be liable, in law or in equity, to you or to any third party for any direct, indirect, incidental, lost profits, special, consequential, punitive or exemplary damages, including, but not limited to, damages for loss of profits, goodwill, use, data or other intangible losses (even if the Company has been advised of the possibility of such damages), resulting from: (i) the use or the inability to use the Services; (ii) the cost of procurement of substitute goods and services resulting from any goods, data, information or services purchased or obtained or messages received or transactions entered into through or from the Services; (iii) unauthorized access to or alteration of your transmissions or data; (iv) statements or conduct of any third party on the service; (v) or any other matter relating to these Terms or the Services, whether as a breach of contract, tort (including negligence whether active or passive), or any other theory of liability.\u003C/em>\u003C/strong>\u003C/p>\n\u003Cp>In other words: choosing to use our Services does mean you are making a bet on us. If the bet does not work out, that’s on you, not us. We do our darnedest to be as safe a bet as possible through careful management of the business; investments in security, infrastructure, and talent; and in general \u003Ca href=\"#_\">giving a damn\u003C/a>. If you choose to use our Services, thank you for betting on us.\u003C/p>\n\u003Cp>If you have a question about any of these Terms, please \u003Ca href=\"#_\">contact our Support team\u003C/a>.\u003C/p>",{"headings":221,"localImagePaths":252,"remoteImagePaths":253,"frontmatter":254,"imagePaths":255},[222,225,228,231,234,237,240,243,246,249],{"depth":128,"slug":223,"text":224},"all-the-terms-that-you-agree-to-when-you-sign-up-for-a-lexington-product","All the terms that you agree to when you sign up for a Lexington product.",{"depth":128,"slug":226,"text":227},"account-terms","Account Terms",{"depth":128,"slug":229,"text":230},"payment-refunds-and-plan-changes","Payment, Refunds, and Plan Changes",{"depth":128,"slug":232,"text":233},"cancellation-and-termination","Cancellation and Termination",{"depth":128,"slug":235,"text":236},"modifications-to-the-service-and-prices","Modifications to the Service and Prices",{"depth":128,"slug":238,"text":239},"uptime-security-and-privacy","Uptime, Security, and Privacy",{"depth":128,"slug":241,"text":242},"copyright-and-content-ownership","Copyright and Content Ownership",{"depth":128,"slug":244,"text":245},"features-and-bugs","Features and Bugs",{"depth":128,"slug":247,"text":248},"services-adaptations-and-api-terms","Services Adaptations and API Terms",{"depth":128,"slug":250,"text":251},"liability","Liability",[],[],{"page":213,"pubDate":214},[],"terms.md","privacy",{"id":257,"data":259,"body":262,"filePath":263,"digest":264,"rendered":265,"legacyId":279},{"page":260,"pubDate":261},"Privacy",["Date","2024-01-01T00:00:00.000Z"],"California Resident Notice at Collection\n========================================\n\nIf you are a California resident, the California Consumer Privacy Act, as amended by the California Privacy Rights Act of 2020 (“**CCPA**”), requires us to provide some additional information to California residents. This Section only applies to you if you are a California resident, although please note that this information and the rights afforded herein are the same as offered to our other users in our main Privacy Policy. This Section does not apply to personal information we collect from our employees and job applicants in their capacity as employees and job applicants, as such information practices are described in separate policies.\n\nThe following chart details these activities:\n\n**Category of personal information**\n\n**Purposes of use**\n\n**Categories of Third Parties Information**\n\n**Categories of Third Parties**\n\nContact information (such as your full name, phone number, email address)\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes\n\nWe do not share/sell\n\nCustomer service interaction information (including optional surveys and when you ask for help)\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes\n\nWe do not share/sell\n\nProduct interaction information\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes\n\nWe do not share/sell\n\nInternet network and device information (such as mobile device information, IP address, and information about your interaction with the services)\n\nProvide the Services; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes;\n\nWe do not share/sell\n\nLogin information (such as your username and password)\n\nProvide the Services; Comply with law or defend our legal rights; Security/fraud prevention; Comply with law or defend our legal rights\n\nAffiliated entities; Service providers; Entities for legal purposes\n\nWe do not share/sell\n\nProfessional or employment information (such as the name and address of the company you work for and your title)\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes;\n\nWe do not share/sell\n\nOther information (any other information you choose to provide directly to us, including optional profile photos)\n\nProvide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\n\nAffiliated entities; Service providers; Entities for legal purposes;\n\nWe do not sell/share\n\nFor more information about each category of personal information, purpose of use, and third parties to which we disclose personal information, please see the \"What we collect and why,\" and \"When we access or disclose you information\" sections of our Privacy Policy.\n\n**Your Choices Regarding “Sharing” and “Selling”**: You have the right to opt out of our sale/sharing of your personal information for purposes of online analytics and advertising. Currently, we do not sell or share your data as defined by the CCPA and we have not done so over the past 12 months from the effective date of this Privacy Policy.\n\n**Other CCPA Rights.** If we ever offer any financial incentives in exchange for your personal information, we will provide you with appropriate information about such incentives.\n\nThe CCPA also allows you to limit the use or disclosure of your “sensitive personal information” (as defined in the CCPA) if your sensitive personal information is used for certain purposes. Please note that we do not use or disclose sensitive personal information other than for business purposes for which you cannot opt out under the CCPA.\n\nPlease see the “Your rights with respect to your information” section of our Policy above for information about the additional rights you have with respect to your personal information under California law and how to exercise them.\n\nRetention of Your Personal Information. Please see the “Retention Of Your Information” section belowof our Privacy Policy for more information.\n\nShine the Light Disclosure\n--------------------------\n\nThe California \"Shine the Light\" law gives residents of California the right under certain circumstances to request information from us regarding the manner in which we disclose certain categories of personal information (as defined in the Shine the Light law) with third parties for their direct marketing purposes. We currently do not disclose your personal information to third parties for their own direct marketing purposes.","src/content/infopages/privacy.md","fb683f77a79791cb",{"html":266,"metadata":267},"\u003Ch1 id=\"california-resident-notice-at-collection\">California Resident Notice at Collection\u003C/h1>\n\u003Cp>If you are a California resident, the California Consumer Privacy Act, as amended by the California Privacy Rights Act of 2020 (“\u003Cstrong>CCPA\u003C/strong>”), requires us to provide some additional information to California residents. This Section only applies to you if you are a California resident, although please note that this information and the rights afforded herein are the same as offered to our other users in our main Privacy Policy. This Section does not apply to personal information we collect from our employees and job applicants in their capacity as employees and job applicants, as such information practices are described in separate policies.\u003C/p>\n\u003Cp>The following chart details these activities:\u003C/p>\n\u003Cp>\u003Cstrong>Category of personal information\u003C/strong>\u003C/p>\n\u003Cp>\u003Cstrong>Purposes of use\u003C/strong>\u003C/p>\n\u003Cp>\u003Cstrong>Categories of Third Parties Information\u003C/strong>\u003C/p>\n\u003Cp>\u003Cstrong>Categories of Third Parties\u003C/strong>\u003C/p>\n\u003Cp>Contact information (such as your full name, phone number, email address)\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Customer service interaction information (including optional surveys and when you ask for help)\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Product interaction information\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Internet network and device information (such as mobile device information, IP address, and information about your interaction with the services)\u003C/p>\n\u003Cp>Provide the Services; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes;\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Login information (such as your username and password)\u003C/p>\n\u003Cp>Provide the Services; Comply with law or defend our legal rights; Security/fraud prevention; Comply with law or defend our legal rights\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Professional or employment information (such as the name and address of the company you work for and your title)\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes;\u003C/p>\n\u003Cp>We do not share/sell\u003C/p>\n\u003Cp>Other information (any other information you choose to provide directly to us, including optional profile photos)\u003C/p>\n\u003Cp>Provide the Services; Communicate with you; Analyze use of and improve the services; With your consent; Comply with law or defend our legal rights; Security/fraud prevention\u003C/p>\n\u003Cp>Affiliated entities; Service providers; Entities for legal purposes;\u003C/p>\n\u003Cp>We do not sell/share\u003C/p>\n\u003Cp>For more information about each category of personal information, purpose of use, and third parties to which we disclose personal information, please see the “What we collect and why,” and “When we access or disclose you information” sections of our Privacy Policy.\u003C/p>\n\u003Cp>\u003Cstrong>Your Choices Regarding “Sharing” and “Selling”\u003C/strong>: You have the right to opt out of our sale/sharing of your personal information for purposes of online analytics and advertising. Currently, we do not sell or share your data as defined by the CCPA and we have not done so over the past 12 months from the effective date of this Privacy Policy.\u003C/p>\n\u003Cp>\u003Cstrong>Other CCPA Rights.\u003C/strong> If we ever offer any financial incentives in exchange for your personal information, we will provide you with appropriate information about such incentives.\u003C/p>\n\u003Cp>The CCPA also allows you to limit the use or disclosure of your “sensitive personal information” (as defined in the CCPA) if your sensitive personal information is used for certain purposes. Please note that we do not use or disclose sensitive personal information other than for business purposes for which you cannot opt out under the CCPA.\u003C/p>\n\u003Cp>Please see the “Your rights with respect to your information” section of our Policy above for information about the additional rights you have with respect to your personal information under California law and how to exercise them.\u003C/p>\n\u003Cp>Retention of Your Personal Information. Please see the “Retention Of Your Information” section belowof our Privacy Policy for more information.\u003C/p>\n\u003Ch2 id=\"shine-the-light-disclosure\">Shine the Light Disclosure\u003C/h2>\n\u003Cp>The California “Shine the Light” law gives residents of California the right under certain circumstances to request information from us regarding the manner in which we disclose certain categories of personal information (as defined in the Shine the Light law) with third parties for their direct marketing purposes. We currently do not disclose your personal information to third parties for their own direct marketing purposes.\u003C/p>",{"headings":268,"localImagePaths":275,"remoteImagePaths":276,"frontmatter":277,"imagePaths":278},[269,272],{"depth":166,"slug":270,"text":271},"california-resident-notice-at-collection","California Resident Notice at Collection",{"depth":128,"slug":273,"text":274},"shine-the-light-disclosure","Shine the Light Disclosure",[],[],{"page":260,"pubDate":261},[],"privacy.md","helpcenter",["Map",282,283,314,315,347,348,373,374],"1",{"id":282,"data":284,"body":287,"filePath":288,"digest":289,"rendered":290,"legacyId":313},{"title":285,"intro":286},"Getting Started with Our Platform","Welcome to our platform! This guide is designed to help new users navigate the initial setup process, understand the core features, and start using the platform effectively. Whether you're looking to collaborate on projects, manage tasks, or leverage our suite of tools, this article will provide you with all the information you need to get started.","## Setting Up Your Account\n\n1. **Sign Up**: Visit our homepage and click on the \"Sign Up\" button. Enter your details in the form provided and submit to create your account.\n2. **Verify Your Email**: After signing up, you'll receive an email from us. Click on the verification link to activate your account.\n3. **Log In**: Once your email is verified, log in to your account using your credentials.\n\n## Exploring the Dashboard\n\n- **Navigation Bar**: The navigation bar at the top allows you to access different sections of the platform, including your projects, settings, and account information.\n- **Dashboard Overview**: Your main dashboard provides a quick overview of your current projects, tasks, and any notifications.\n\n## Starting Your First Project\n\n1. **Create a New Project**: Click on the \"New Project\" button and fill in the project details.\n2. **Add Team Members**: Invite your teammates by entering their email addresses. They'll receive an invitation to join the project.\n3. **Begin Collaboration**: Start creating, designing, and sharing your work with team members in real-time.\n\n## Utilizing Support Resources\n\n- **Help Center**: For detailed guides and FAQs, visit our Help Center.\n- **Community Forums**: Join discussions, share ideas, and get help from other users in our community forums.\n- **Customer Support**: For direct assistance, contact our customer support team via email or live chat.\n\n## Conclusion\n\nWe're excited to have you on board and can't wait to see what you create using our platform. Remember, our Help Center and support team are here to assist you every step of the way. Happy creating!","src/content/helpcenter/1.md","08917b97fc70932f",{"html":291,"metadata":292},"\u003Ch2 id=\"setting-up-your-account\">Setting Up Your Account\u003C/h2>\n\u003Col>\n\u003Cli>\u003Cstrong>Sign Up\u003C/strong>: Visit our homepage and click on the “Sign Up” button. Enter your details in the form provided and submit to create your account.\u003C/li>\n\u003Cli>\u003Cstrong>Verify Your Email\u003C/strong>: After signing up, you’ll receive an email from us. Click on the verification link to activate your account.\u003C/li>\n\u003Cli>\u003Cstrong>Log In\u003C/strong>: Once your email is verified, log in to your account using your credentials.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"exploring-the-dashboard\">Exploring the Dashboard\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Navigation Bar\u003C/strong>: The navigation bar at the top allows you to access different sections of the platform, including your projects, settings, and account information.\u003C/li>\n\u003Cli>\u003Cstrong>Dashboard Overview\u003C/strong>: Your main dashboard provides a quick overview of your current projects, tasks, and any notifications.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"starting-your-first-project\">Starting Your First Project\u003C/h2>\n\u003Col>\n\u003Cli>\u003Cstrong>Create a New Project\u003C/strong>: Click on the “New Project” button and fill in the project details.\u003C/li>\n\u003Cli>\u003Cstrong>Add Team Members\u003C/strong>: Invite your teammates by entering their email addresses. They’ll receive an invitation to join the project.\u003C/li>\n\u003Cli>\u003Cstrong>Begin Collaboration\u003C/strong>: Start creating, designing, and sharing your work with team members in real-time.\u003C/li>\n\u003C/ol>\n\u003Ch2 id=\"utilizing-support-resources\">Utilizing Support Resources\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Help Center\u003C/strong>: For detailed guides and FAQs, visit our Help Center.\u003C/li>\n\u003Cli>\u003Cstrong>Community Forums\u003C/strong>: Join discussions, share ideas, and get help from other users in our community forums.\u003C/li>\n\u003Cli>\u003Cstrong>Customer Support\u003C/strong>: For direct assistance, contact our customer support team via email or live chat.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>We’re excited to have you on board and can’t wait to see what you create using our platform. Remember, our Help Center and support team are here to assist you every step of the way. Happy creating!\u003C/p>",{"headings":293,"localImagePaths":309,"remoteImagePaths":310,"frontmatter":311,"imagePaths":312},[294,297,300,303,306],{"depth":128,"slug":295,"text":296},"setting-up-your-account","Setting Up Your Account",{"depth":128,"slug":298,"text":299},"exploring-the-dashboard","Exploring the Dashboard",{"depth":128,"slug":301,"text":302},"starting-your-first-project","Starting Your First Project",{"depth":128,"slug":304,"text":305},"utilizing-support-resources","Utilizing Support Resources",{"depth":128,"slug":307,"text":308},"conclusion","Conclusion",[],[],{"title":285,"intro":286},[],"1.md","2",{"id":314,"data":316,"body":319,"filePath":320,"digest":321,"rendered":322,"legacyId":346},{"title":317,"intro":318},"Troubleshooting Common Issues","Encountering issues while using our platform? This article covers solutions to some of the most common problems reported by our users. From login troubles to file synchronization errors, find step-by-step instructions to quickly resolve these issues and get back to your work.","## Login Problems\n\n- **Forgot Password**: If you've forgotten your password, use the \"Forgot Password\" link on the login page to reset it.\n- **Account Locked**: After multiple unsuccessful login attempts, your account may be locked. Wait 15 minutes before trying again, or contact support for immediate help.\n\n## File Synchronization Errors\n\n- **Check Your Internet Connection**: A stable internet connection is required for file syncing. Ensure your connection is active and stable.\n- **Update the App**: Running an outdated version can cause syncing issues. Make sure you're using the latest version of our app.\n\n## Collaboration Challenges\n\n- **Invitation Not Received**: If team members haven't received an invitation, ask them to check their spam folder. You can also resend the invitation from the project settings.\n- **Real-Time Editing Not Working**: Ensure all participants have the necessary permissions and are using compatible browsers or app versions.\n\n## Performance Issues\n\n- **Clear Your Cache**: A full cache can slow down the application. Clear your browser or app cache regularly.\n- **Check System Requirements**: Ensure your device meets the minimum system requirements for our platform.\n\n## Seeking Further Assistance\n\nIf you're still experiencing issues after following these steps, our customer support team is ready to help. Contact us via email, live chat, or submit a support ticket through our Help Center.\n\n## Conclusion\n\nWe understand that encountering issues can be frustrating. By following these troubleshooting steps, most common problems can be resolved quickly. Our support team is always here to assist with any unresolved issues, ensuring you can make the most of our platform without interruption.","src/content/helpcenter/2.md","bc508a913907b53f",{"html":323,"metadata":324},"\u003Ch2 id=\"login-problems\">Login Problems\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Forgot Password\u003C/strong>: If you’ve forgotten your password, use the “Forgot Password” link on the login page to reset it.\u003C/li>\n\u003Cli>\u003Cstrong>Account Locked\u003C/strong>: After multiple unsuccessful login attempts, your account may be locked. Wait 15 minutes before trying again, or contact support for immediate help.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"file-synchronization-errors\">File Synchronization Errors\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Check Your Internet Connection\u003C/strong>: A stable internet connection is required for file syncing. Ensure your connection is active and stable.\u003C/li>\n\u003Cli>\u003Cstrong>Update the App\u003C/strong>: Running an outdated version can cause syncing issues. Make sure you’re using the latest version of our app.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"collaboration-challenges\">Collaboration Challenges\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Invitation Not Received\u003C/strong>: If team members haven’t received an invitation, ask them to check their spam folder. You can also resend the invitation from the project settings.\u003C/li>\n\u003Cli>\u003Cstrong>Real-Time Editing Not Working\u003C/strong>: Ensure all participants have the necessary permissions and are using compatible browsers or app versions.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"performance-issues\">Performance Issues\u003C/h2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Clear Your Cache\u003C/strong>: A full cache can slow down the application. Clear your browser or app cache regularly.\u003C/li>\n\u003Cli>\u003Cstrong>Check System Requirements\u003C/strong>: Ensure your device meets the minimum system requirements for our platform.\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"seeking-further-assistance\">Seeking Further Assistance\u003C/h2>\n\u003Cp>If you’re still experiencing issues after following these steps, our customer support team is ready to help. Contact us via email, live chat, or submit a support ticket through our Help Center.\u003C/p>\n\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>We understand that encountering issues can be frustrating. By following these troubleshooting steps, most common problems can be resolved quickly. Our support team is always here to assist with any unresolved issues, ensuring you can make the most of our platform without interruption.\u003C/p>",{"headings":325,"localImagePaths":342,"remoteImagePaths":343,"frontmatter":344,"imagePaths":345},[326,329,332,335,338,341],{"depth":128,"slug":327,"text":328},"login-problems","Login Problems",{"depth":128,"slug":330,"text":331},"file-synchronization-errors","File Synchronization Errors",{"depth":128,"slug":333,"text":334},"collaboration-challenges","Collaboration Challenges",{"depth":128,"slug":336,"text":337},"performance-issues","Performance Issues",{"depth":128,"slug":339,"text":340},"seeking-further-assistance","Seeking Further Assistance",{"depth":128,"slug":307,"text":308},[],[],{"title":317,"intro":318},[],"2.md","3",{"id":347,"data":349,"body":351,"filePath":352,"digest":353,"rendered":354,"legacyId":372},{"title":285,"intro":350},"This guide is designed to help new users navigate the initial setup process and explore key features of our platform. From creating an account to completing your first project, we'll walk you through each step to ensure a smooth start.","Welcome to our platform! We're excited to have you on board and are here to help you get started. This article will guide you through the basics of setting up your account, familiarizing yourself with our interface, and beginning your first project.\n\n#### Creating Your Account\n\n1. Visit our website and click on the \"Sign Up\" button.\n2. Fill in your personal details, including your name, email address, and preferred password.\n3. Confirm your email address by clicking on the verification link sent to your inbox.\n\n#### Navigating the Dashboard\n\nOnce you've logged in, you'll be taken to your dashboard. Here's a quick overview of what you'll find:\n\n- **Project Overview**: A summary of your current projects.\n- **Quick Access Toolbar**: Shortcuts to commonly used features.\n- **Notifications**: Alerts and updates related to your account and projects.\n\n#### Starting Your First Project\n\n1. Click on the \"Create New Project\" button.\n2. Enter a project name and select the project type from the dropdown menu.\n3. Follow the on-screen instructions to add tasks, assign team members, and set deadlines.\n\n#### Need More Help?\n\nIf you have any questions or encounter any issues, our support team is here to help. Visit our [Support Center](#) or contact us directly through the platform for assistance.\n\nWe hope this guide helps you get started on our platform. Happy creating!","src/content/helpcenter/3.md","50ed9186bda83912",{"html":355,"metadata":356},"\u003Cp>Welcome to our platform! We’re excited to have you on board and are here to help you get started. This article will guide you through the basics of setting up your account, familiarizing yourself with our interface, and beginning your first project.\u003C/p>\n\u003Ch4 id=\"creating-your-account\">Creating Your Account\u003C/h4>\n\u003Col>\n\u003Cli>Visit our website and click on the “Sign Up” button.\u003C/li>\n\u003Cli>Fill in your personal details, including your name, email address, and preferred password.\u003C/li>\n\u003Cli>Confirm your email address by clicking on the verification link sent to your inbox.\u003C/li>\n\u003C/ol>\n\u003Ch4 id=\"navigating-the-dashboard\">Navigating the Dashboard\u003C/h4>\n\u003Cp>Once you’ve logged in, you’ll be taken to your dashboard. Here’s a quick overview of what you’ll find:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Project Overview\u003C/strong>: A summary of your current projects.\u003C/li>\n\u003Cli>\u003Cstrong>Quick Access Toolbar\u003C/strong>: Shortcuts to commonly used features.\u003C/li>\n\u003Cli>\u003Cstrong>Notifications\u003C/strong>: Alerts and updates related to your account and projects.\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"starting-your-first-project\">Starting Your First Project\u003C/h4>\n\u003Col>\n\u003Cli>Click on the “Create New Project” button.\u003C/li>\n\u003Cli>Enter a project name and select the project type from the dropdown menu.\u003C/li>\n\u003Cli>Follow the on-screen instructions to add tasks, assign team members, and set deadlines.\u003C/li>\n\u003C/ol>\n\u003Ch4 id=\"need-more-help\">Need More Help?\u003C/h4>\n\u003Cp>If you have any questions or encounter any issues, our support team is here to help. Visit our \u003Ca href=\"#\">Support Center\u003C/a> or contact us directly through the platform for assistance.\u003C/p>\n\u003Cp>We hope this guide helps you get started on our platform. Happy creating!\u003C/p>",{"headings":357,"localImagePaths":368,"remoteImagePaths":369,"frontmatter":370,"imagePaths":371},[358,361,364,365],{"depth":45,"slug":359,"text":360},"creating-your-account","Creating Your Account",{"depth":45,"slug":362,"text":363},"navigating-the-dashboard","Navigating the Dashboard",{"depth":45,"slug":301,"text":302},{"depth":45,"slug":366,"text":367},"need-more-help","Need More Help?",[],[],{"title":285,"intro":350},[],"3.md","4",{"id":373,"data":375,"body":377,"filePath":378,"digest":379,"rendered":380,"legacyId":400},{"title":317,"intro":376},"Encountering issues? This article covers solutions to some of the most common problems users face on our platform, from login difficulties to project management hurdles.","Our platform is designed to offer a seamless user experience, but we understand that issues can sometimes arise. Below, we've compiled solutions to some of the most common challenges our users encounter.\n\n#### Issue 1: Trouble Logging In\n\nIf you're having difficulty logging into your account, consider the following steps:\n\n- Ensure you're using the correct email address and password.\n- If you've forgotten your password, use the \"Forgot Password\" feature to reset it.\n- Clear your browser's cache and cookies, and try logging in again.\n\n#### Issue 2: Missing Notifications\n\nNot receiving expected notifications can be frustrating. To fix this issue:\n\n- Check your account settings to ensure notifications are enabled.\n- Verify your email address is correct and update it if necessary.\n- Look in your email's spam or junk folder for any missed notifications.\n\n#### Issue 3: Project Updates Not Saving\n\nWhen changes to projects don't seem to save, try the following:\n\n- Refresh the page to ensure updates are reflected.\n- Check your internet connection to make sure you're online.\n- If the issue persists, contact our support team for assistance.\n\n#### Getting Further Assistance\n\nIf you've tried these solutions and still face issues, our support team is ready to help. Reach out through our [Help Center](#) or by using the contact form on our website for personalized assistance.\n\nRemember, our goal is to provide you with a smooth and productive experience on our platform. Don't hesitate to get in touch if you need help.","src/content/helpcenter/4.md","7f622e2df9a07bac",{"html":381,"metadata":382},"\u003Cp>Our platform is designed to offer a seamless user experience, but we understand that issues can sometimes arise. Below, we’ve compiled solutions to some of the most common challenges our users encounter.\u003C/p>\n\u003Ch4 id=\"issue-1-trouble-logging-in\">Issue 1: Trouble Logging In\u003C/h4>\n\u003Cp>If you’re having difficulty logging into your account, consider the following steps:\u003C/p>\n\u003Cul>\n\u003Cli>Ensure you’re using the correct email address and password.\u003C/li>\n\u003Cli>If you’ve forgotten your password, use the “Forgot Password” feature to reset it.\u003C/li>\n\u003Cli>Clear your browser’s cache and cookies, and try logging in again.\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"issue-2-missing-notifications\">Issue 2: Missing Notifications\u003C/h4>\n\u003Cp>Not receiving expected notifications can be frustrating. To fix this issue:\u003C/p>\n\u003Cul>\n\u003Cli>Check your account settings to ensure notifications are enabled.\u003C/li>\n\u003Cli>Verify your email address is correct and update it if necessary.\u003C/li>\n\u003Cli>Look in your email’s spam or junk folder for any missed notifications.\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"issue-3-project-updates-not-saving\">Issue 3: Project Updates Not Saving\u003C/h4>\n\u003Cp>When changes to projects don’t seem to save, try the following:\u003C/p>\n\u003Cul>\n\u003Cli>Refresh the page to ensure updates are reflected.\u003C/li>\n\u003Cli>Check your internet connection to make sure you’re online.\u003C/li>\n\u003Cli>If the issue persists, contact our support team for assistance.\u003C/li>\n\u003C/ul>\n\u003Ch4 id=\"getting-further-assistance\">Getting Further Assistance\u003C/h4>\n\u003Cp>If you’ve tried these solutions and still face issues, our support team is ready to help. Reach out through our \u003Ca href=\"#\">Help Center\u003C/a> or by using the contact form on our website for personalized assistance.\u003C/p>\n\u003Cp>Remember, our goal is to provide you with a smooth and productive experience on our platform. Don’t hesitate to get in touch if you need help.\u003C/p>",{"headings":383,"localImagePaths":396,"remoteImagePaths":397,"frontmatter":398,"imagePaths":399},[384,387,390,393],{"depth":45,"slug":385,"text":386},"issue-1-trouble-logging-in","Issue 1: Trouble Logging In",{"depth":45,"slug":388,"text":389},"issue-2-missing-notifications","Issue 2: Missing Notifications",{"depth":45,"slug":391,"text":392},"issue-3-project-updates-not-saving","Issue 3: Project Updates Not Saving",{"depth":45,"slug":394,"text":395},"getting-further-assistance","Getting Further Assistance",[],[],{"title":317,"intro":376},[],"4.md","howtos",["Map",403,404],"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-",{"id":403,"data":405,"filePath":403,"digest":618},{"slug":403,"id":403,"title":406,"type":407,"components":408,"item":409,"config":617},"Cut out shapes out of plastic sheets with a CNC ","howto",[],{"_createdBy":410,"mentions":411,"_deleted":412,"fileLink":19,"slug":403,"_modified":413,"previousSlugs":414,"_created":415,"description":416,"votedUsefulBy":417,"creatorCountry":421,"total_downloads":422,"title":406,"time":423,"files":424,"difficulty_level":425,"_id":426,"tags":427,"total_views":429,"_contentModifiedTimestamp":415,"cover_image":430,"comments":438,"moderatorFeedback":19,"steps":439,"moderation":536,"user":537,"category":610,"content":612,"keywords":613,"resources":614,"references":615,"brief":616},"gus-merckel",[],false,"2023-10-27T18:09:36.519Z",[403],"2023-08-23T18:20:09.098Z","This guide outlines the process for cutting HDPE sheets using an X-Carve CNC. For a detailed demonstration, refer to the video available in Spanish with subtitles: [Watch Video](https://www.youtube.com/watch?v=4LrrFz802To).",[418,419,420],"sigolene","mattia","uillinoispreciousplastics","mx",0,"\u003C 5 hours",[],"Medium","038gjWgLjiyYknbEjDeI",[428],"HDPE",232,{"name":431,"downloadUrl":432,"type":433,"fullPath":434,"updated":435,"size":436,"timeCreated":435,"contentType":433,"src":437},"IMG_20200605_142311.jpg","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=c272c174-1adc-45af-967b-771adce7295d","image/jpeg","uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg","2021-04-05T15:09:00.605Z",124661,"C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\img_20200605_142311.jpg",[],[440,459,471,490,516,528],{"title":441,"text":442,"images":443,"_animationKey":458},"Measure the plastic sheet","To proceed, measure the plastic sheet's height, width, and thickness. The X-Carve machine operates with the CAM software Easel, which is user-friendly for CNC milling.\n\nEasel allows simulation of your material, and includes HDPE 2-Colors in its list of cutting materials.",[444,451],{"fullPath":445,"name":446,"size":447,"type":433,"timeCreated":448,"contentType":433,"downloadUrl":449,"updated":448,"src":450,"alt":446},"uploads/howtos/pbo0Pe44aTngvlD04kGf/1.jpg","1.jpg",74095,"2021-03-26T19:42:05.766Z","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F1.jpg?alt=media&token=293d733d-05a5-494a-9340-47f4564f1939","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\1.jpg",{"contentType":433,"timeCreated":452,"updated":452,"size":453,"downloadUrl":454,"fullPath":455,"name":456,"type":433,"src":457,"alt":456},"2021-03-26T19:42:05.669Z",69665,"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F2.jpg?alt=media&token=004f50f1-97ac-4df4-9ba9-f463aa4cbca3","uploads/howtos/pbo0Pe44aTngvlD04kGf/2.jpg","2.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\2.jpg","unique1",{"text":460,"_animationKey":461,"images":462,"title":470},"Using the clamps from the X-Carve, secure the sheet to the table.","unique2",[463],{"updated":464,"size":465,"fullPath":466,"timeCreated":464,"name":467,"downloadUrl":468,"contentType":433,"type":433,"src":469,"alt":467},"2021-03-26T19:42:06.249Z",55544,"uploads/howtos/pbo0Pe44aTngvlD04kGf/3.jpg","3.jpg","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F3.jpg?alt=media&token=0b9c1914-1c75-429e-b34a-1e2b3706edef","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\3.jpg","Secure sheet ",{"title":472,"text":473,"images":474,"_animationKey":489},"Choosing a file to cut ","### Instructions\n\nProceed by using software like Inkscape to create a vector file, or download one from a source such as [thenounproject.com](https://thenounproject.com).\n\nDownload the SVG file, which is a standard vector format, and import it into Easel.",[475,482],{"downloadUrl":476,"contentType":433,"timeCreated":477,"updated":477,"name":478,"size":479,"type":433,"fullPath":480,"src":481,"alt":478},"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F4.jpg?alt=media&token=1cd2d49d-9335-4bb1-ac2a-e625322ca604","2021-03-26T19:42:06.727Z","4.jpg",42952,"uploads/howtos/pbo0Pe44aTngvlD04kGf/4.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\4.jpg",{"size":483,"fullPath":484,"updated":485,"timeCreated":485,"downloadUrl":486,"name":487,"contentType":433,"type":433,"src":488,"alt":487},69255,"uploads/howtos/pbo0Pe44aTngvlD04kGf/5.jpg","2021-03-26T19:42:06.833Z","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F5.jpg?alt=media&token=7cca786a-7d47-43bb-900b-b8d101c276b4","5.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\5.jpg","unique3",{"text":491,"title":492,"images":493,"_animationKey":515},"With the file ready, choose the desired width for carving or cutting. Proceed with the following steps:\n\n- Ensure the sheet is securely fixed.\n- Specify the cutting bit: use a 1/8-inch (3.175 mm) flat flute bit.\n- Set the coordinate origin at the lower-left corner (0, 0).\n- Raise the bit and activate the CNC router.","Follow the cutting Wizzard",[494,501,508],{"timeCreated":495,"size":496,"fullPath":497,"updated":495,"downloadUrl":498,"contentType":433,"type":433,"name":499,"src":500,"alt":499},"2021-03-26T19:42:07.493Z",72226,"uploads/howtos/pbo0Pe44aTngvlD04kGf/6.jpg","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F6.jpg?alt=media&token=ba7195dd-7771-435f-a188-057457697332","6.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\6.jpg",{"fullPath":502,"size":503,"downloadUrl":504,"contentType":433,"type":433,"timeCreated":505,"updated":505,"name":506,"src":507,"alt":506},"uploads/howtos/pbo0Pe44aTngvlD04kGf/7.jpg",52424,"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F7.jpg?alt=media&token=a3d5820c-cfe2-484e-8f76-f861ab8b756d","2021-03-26T19:42:07.308Z","7.jpg","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\7.jpg",{"fullPath":509,"name":510,"type":433,"timeCreated":511,"size":512,"contentType":433,"downloadUrl":513,"updated":511,"src":514,"alt":510},"uploads/howtos/pbo0Pe44aTngvlD04kGf/8.jpg","8.jpg","2021-03-26T19:42:07.346Z",55264,"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F8.jpg?alt=media&token=1c9816d7-3a99-4f41-8d3c-acc2670240f6","C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\8.jpg","uniquenisc2v",{"text":517,"images":518,"_animationKey":526,"title":527},"### Instructions for Post-Processing\n\nTake your glasses or object, complete the post-processing, and share the results with others.",[519],{"fullPath":520,"contentType":433,"timeCreated":521,"downloadUrl":522,"name":523,"updated":521,"type":433,"size":524,"src":525,"alt":523},"uploads/howtos/pbo0Pe44aTngvlD04kGf/9.jpg","2021-03-26T19:42:08.147Z","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F9.jpg?alt=media&token=4dcfe37d-e1ad-41e5-a590-40b4c37c5e1a","9.jpg",82214,"C:\\Users\\zx\\Desktop\\osr\\osr-machines\\howtos\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\9.jpg","uniquesgl34","Post-production and show case",{"_animationKey":529,"title":530,"text":531,"images":532},"uniquem4y0yi","Hack it and try it yourself","This project can be attempted with various CNC machines, including manual routers or saws. The essential aspect is sharing your work to contribute to community growth.\n\nFeel free to share your ideas and comments.",[533],{"contentType":433,"timeCreated":534,"fullPath":434,"type":433,"downloadUrl":535,"size":436,"updated":534,"name":431,"src":437,"alt":431},"2021-04-05T15:09:01.445Z","https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=f94152ff-f923-4054-a3ad-d8ec588856fa","accepted",{"_modified":538,"_id":410,"subType":539,"moderation":536,"_deleted":412,"verified":412,"type":540,"location":541,"_created":538,"geo":544,"data":591,"detail":607},"2024-01-08T13:28:33.484Z","mix","workspace",{"lat":542,"lng":543},19.3935,-99.1656,{"latitude":542,"lookupSource":545,"longitude":543,"localityLanguageRequested":546,"continent":547,"continentCode":548,"countryName":549,"countryCode":550,"principalSubdivision":551,"principalSubdivisionCode":552,"city":553,"locality":554,"postcode":555,"plusCode":556,"localityInfo":557},"coordinates","en","North America","NA","Mexico","MX","Ciudad de Mexico","MX-CMX","Mexico City","Benito Juarez","03103","76F29RVM+CQ",{"administrative":558,"informative":576},[559,563,568,571],{"name":549,"description":560,"isoName":549,"order":128,"adminLevel":128,"isoCode":550,"wikidataId":561,"geonameId":562},"country in North America","Q96",3996063,{"name":553,"description":564,"order":565,"adminLevel":45,"wikidataId":566,"geonameId":567},"capital and largest city of Mexico",5,"Q1489",3530597,{"name":551,"description":564,"isoName":551,"order":569,"adminLevel":45,"isoCode":552,"wikidataId":566,"geonameId":570},6,3527646,{"name":554,"description":572,"order":573,"adminLevel":569,"wikidataId":574,"geonameId":575},"territorial demarcation of the Mexico City in Mexico",7,"Q2356998",3827406,[577,581,584,588],{"name":547,"description":578,"isoName":547,"order":166,"isoCode":548,"wikidataId":579,"geonameId":580},"continent and northern subcontinent of the Americas","Q49",6255149,{"name":582,"description":583,"order":67},"America/Mexico_City","time zone",{"name":585,"description":586,"order":45,"wikidataId":587},"Greater Mexico City","geographical object","Q665894",{"name":555,"description":589,"order":590},"postal code",8,{"urls":592,"description":602,"services":603,"title":605,"images":606},[593,596,599],{"name":594,"url":595},"Email","mailto:gustavomerckel@gmail.com",{"name":597,"url":598},"Facebook","https://www.facebook.com/pl%c3%a1stico-chido-110888520718193",{"name":600,"url":601},"sponsor the work","https://www.patreon.com/one_army","Plástico Chido builds and modifies the PP machines, and also experiments with CNC and Laser Cut",[604],{"welding":412,"assembling":412,"machining":412,"electronics":412,"molds":412},"Plástico Chido",[],{"services":608,"urls":609},[],[],{"label":611},"uncategorized","This guide outlines the process for cutting HDPE sheets using an X-Carve CNC. For a detailed demonstration, refer to the video available in Spanish with subtitles: [Watch Video](https://www.youtube.com/watch?v=4LrrFz802To).\n\n\nUser Location: Mexico City, Mexico\n\nTo proceed, measure the plastic sheet's height, width, and thickness. The X-Carve machine operates with the CAM software Easel, which is user-friendly for CNC milling.\n\nEasel allows simulation of your material, and includes HDPE 2-Colors in its list of cutting materials.\n\nUsing the clamps from the X-Carve, secure the sheet to the table.\n\n### Instructions\n\nProceed by using software like Inkscape to create a vector file, or download one from a source such as [thenounproject.com](https://thenounproject.com).\n\nDownload the SVG file, which is a standard vector format, and import it into Easel.\n\nWith the file ready, choose the desired width for carving or cutting. Proceed with the following steps:\n\n- Ensure the sheet is securely fixed.\n- Specify the cutting bit: use a 1/8-inch (3.175 mm) flat flute bit.\n- Set the coordinate origin at the lower-left corner (0, 0).\n- Raise the bit and activate the CNC router.\n\n### Instructions for Post-Processing\n\nTake your glasses or object, complete the post-processing, and share the results with others.\n\nThis project can be attempted with various CNC machines, including manual routers or saws. The essential aspect is sharing your work to contribute to community growth.\n\nFeel free to share your ideas and comments.","HDPE sheets, X-Carve CNC, Easel software, Mexico City CNC, CNC milling, vector file CNC, SVG file import, 1/8-inch cutting bit, CNC router guide, CNC community sharing","To extract the required tools from the tutorial, here are the essential components organized by category:\n\n### Software\n\n- Easel (CAM software for CNC milling) [1]\n- Inkscape (vector design tool) [1]\n\n### Hardware\n\n- X-Carve CNC machine [1]\n- 1/8-inch (3.175 mm) flat flute cutting bit [1]\n- Clamps (included with X-Carve) [1]\n- HDPE sheet (measured for dimensions) [1]\n- Manual routers/saws (alternative to CNC machines) [1]","## Youtube\n\n- [Cutting HDPE Sheets with X-Carve CNC](https://www.youtube.com/watch?v=4LrrFz802To)\n\n## Software\n\n- [Easel](https://www.inventables.com/technologies/easel)\n- [Inkscape](https://inkscape.org)\n\n## Opensource Designs\n\n- [The Noun Project (SVG files)](https://thenounproject.com)","Cut HDPE sheets with X-Carve CNC. Easy steps using Easel software. Secure the sheet, set origin, and start carving. Ideal for creators in Mexico City.","{\n \"slug\": \"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\",\n \"id\": \"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\",\n \"title\": \"Cut out shapes out of plastic sheets with a CNC \",\n \"type\": \"howto\",\n \"components\": [],\n \"item\": {\n \"_createdBy\": \"gus-merckel\",\n \"mentions\": [],\n \"_deleted\": false,\n \"fileLink\": \"\",\n \"slug\": \"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\",\n \"_modified\": \"2023-10-27T18:09:36.519Z\",\n \"previousSlugs\": [\n \"cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\"\n ],\n \"_created\": \"2023-08-23T18:20:09.098Z\",\n \"description\": \"This guide outlines the process for cutting HDPE sheets using an X-Carve CNC. For a detailed demonstration, refer to the video available in Spanish with subtitles: [Watch Video](https://www.youtube.com/watch?v=4LrrFz802To).\",\n \"votedUsefulBy\": [\n \"sigolene\",\n \"mattia\",\n \"uillinoispreciousplastics\"\n ],\n \"creatorCountry\": \"mx\",\n \"total_downloads\": 0,\n \"title\": \"Cut out shapes out of plastic sheets with a CNC \",\n \"time\": \"\u003C 5 hours\",\n \"files\": [],\n \"difficulty_level\": \"Medium\",\n \"_id\": \"038gjWgLjiyYknbEjDeI\",\n \"tags\": [\n \"HDPE\"\n ],\n \"total_views\": 232,\n \"_contentModifiedTimestamp\": \"2023-08-23T18:20:09.098Z\",\n \"cover_image\": {\n \"name\": \"IMG_20200605_142311.jpg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=c272c174-1adc-45af-967b-771adce7295d\",\n \"type\": \"image/jpeg\",\n \"fullPath\": \"uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg\",\n \"updated\": \"2021-04-05T15:09:00.605Z\",\n \"size\": 124661,\n \"timeCreated\": \"2021-04-05T15:09:00.605Z\",\n \"contentType\": \"image/jpeg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\img_20200605_142311.jpg\"\n },\n \"comments\": [],\n \"moderatorFeedback\": \"\",\n \"steps\": [\n {\n \"title\": \"Measure the plastic sheet\",\n \"text\": \"To proceed, measure the plastic sheet's height, width, and thickness. The X-Carve machine operates with the CAM software Easel, which is user-friendly for CNC milling.\\n\\nEasel allows simulation of your material, and includes HDPE 2-Colors in its list of cutting materials.\",\n \"images\": [\n {\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/1.jpg\",\n \"name\": \"1.jpg\",\n \"size\": 74095,\n \"type\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:05.766Z\",\n \"contentType\": \"image/jpeg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F1.jpg?alt=media&token=293d733d-05a5-494a-9340-47f4564f1939\",\n \"updated\": \"2021-03-26T19:42:05.766Z\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\1.jpg\",\n \"alt\": \"1.jpg\"\n },\n {\n \"contentType\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:05.669Z\",\n \"updated\": \"2021-03-26T19:42:05.669Z\",\n \"size\": 69665,\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F2.jpg?alt=media&token=004f50f1-97ac-4df4-9ba9-f463aa4cbca3\",\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/2.jpg\",\n \"name\": \"2.jpg\",\n \"type\": \"image/jpeg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\2.jpg\",\n \"alt\": \"2.jpg\"\n }\n ],\n \"_animationKey\": \"unique1\"\n },\n {\n \"text\": \"Using the clamps from the X-Carve, secure the sheet to the table.\",\n \"_animationKey\": \"unique2\",\n \"images\": [\n {\n \"updated\": \"2021-03-26T19:42:06.249Z\",\n \"size\": 55544,\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/3.jpg\",\n \"timeCreated\": \"2021-03-26T19:42:06.249Z\",\n \"name\": \"3.jpg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F3.jpg?alt=media&token=0b9c1914-1c75-429e-b34a-1e2b3706edef\",\n \"contentType\": \"image/jpeg\",\n \"type\": \"image/jpeg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\3.jpg\",\n \"alt\": \"3.jpg\"\n }\n ],\n \"title\": \"Secure sheet \"\n },\n {\n \"title\": \"Choosing a file to cut \",\n \"text\": \"### Instructions\\n\\nProceed by using software like Inkscape to create a vector file, or download one from a source such as [thenounproject.com](https://thenounproject.com).\\n\\nDownload the SVG file, which is a standard vector format, and import it into Easel.\",\n \"images\": [\n {\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F4.jpg?alt=media&token=1cd2d49d-9335-4bb1-ac2a-e625322ca604\",\n \"contentType\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:06.727Z\",\n \"updated\": \"2021-03-26T19:42:06.727Z\",\n \"name\": \"4.jpg\",\n \"size\": 42952,\n \"type\": \"image/jpeg\",\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/4.jpg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\4.jpg\",\n \"alt\": \"4.jpg\"\n },\n {\n \"size\": 69255,\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/5.jpg\",\n \"updated\": \"2021-03-26T19:42:06.833Z\",\n \"timeCreated\": \"2021-03-26T19:42:06.833Z\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F5.jpg?alt=media&token=7cca786a-7d47-43bb-900b-b8d101c276b4\",\n \"name\": \"5.jpg\",\n \"contentType\": \"image/jpeg\",\n \"type\": \"image/jpeg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\5.jpg\",\n \"alt\": \"5.jpg\"\n }\n ],\n \"_animationKey\": \"unique3\"\n },\n {\n \"text\": \"With the file ready, choose the desired width for carving or cutting. Proceed with the following steps:\\n\\n- Ensure the sheet is securely fixed.\\n- Specify the cutting bit: use a 1/8-inch (3.175 mm) flat flute bit.\\n- Set the coordinate origin at the lower-left corner (0, 0).\\n- Raise the bit and activate the CNC router.\",\n \"title\": \"Follow the cutting Wizzard\",\n \"images\": [\n {\n \"timeCreated\": \"2021-03-26T19:42:07.493Z\",\n \"size\": 72226,\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/6.jpg\",\n \"updated\": \"2021-03-26T19:42:07.493Z\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F6.jpg?alt=media&token=ba7195dd-7771-435f-a188-057457697332\",\n \"contentType\": \"image/jpeg\",\n \"type\": \"image/jpeg\",\n \"name\": \"6.jpg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\6.jpg\",\n \"alt\": \"6.jpg\"\n },\n {\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/7.jpg\",\n \"size\": 52424,\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F7.jpg?alt=media&token=a3d5820c-cfe2-484e-8f76-f861ab8b756d\",\n \"contentType\": \"image/jpeg\",\n \"type\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:07.308Z\",\n \"updated\": \"2021-03-26T19:42:07.308Z\",\n \"name\": \"7.jpg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\7.jpg\",\n \"alt\": \"7.jpg\"\n },\n {\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/8.jpg\",\n \"name\": \"8.jpg\",\n \"type\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:07.346Z\",\n \"size\": 55264,\n \"contentType\": \"image/jpeg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F8.jpg?alt=media&token=1c9816d7-3a99-4f41-8d3c-acc2670240f6\",\n \"updated\": \"2021-03-26T19:42:07.346Z\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\8.jpg\",\n \"alt\": \"8.jpg\"\n }\n ],\n \"_animationKey\": \"uniquenisc2v\"\n },\n {\n \"text\": \"### Instructions for Post-Processing\\n\\nTake your glasses or object, complete the post-processing, and share the results with others.\",\n \"images\": [\n {\n \"fullPath\": \"uploads/howtos/pbo0Pe44aTngvlD04kGf/9.jpg\",\n \"contentType\": \"image/jpeg\",\n \"timeCreated\": \"2021-03-26T19:42:08.147Z\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2Fpbo0Pe44aTngvlD04kGf%2F9.jpg?alt=media&token=4dcfe37d-e1ad-41e5-a590-40b4c37c5e1a\",\n \"name\": \"9.jpg\",\n \"updated\": \"2021-03-26T19:42:08.147Z\",\n \"type\": \"image/jpeg\",\n \"size\": 82214,\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\9.jpg\",\n \"alt\": \"9.jpg\"\n }\n ],\n \"_animationKey\": \"uniquesgl34\",\n \"title\": \"Post-production and show case\"\n },\n {\n \"_animationKey\": \"uniquem4y0yi\",\n \"title\": \"Hack it and try it yourself\",\n \"text\": \"This project can be attempted with various CNC machines, including manual routers or saws. The essential aspect is sharing your work to contribute to community growth.\\n\\nFeel free to share your ideas and comments.\",\n \"images\": [\n {\n \"contentType\": \"image/jpeg\",\n \"timeCreated\": \"2021-04-05T15:09:01.445Z\",\n \"fullPath\": \"uploads/howtos/038gjWgLjiyYknbEjDeI/IMG_20200605_142311.jpg\",\n \"type\": \"image/jpeg\",\n \"downloadUrl\": \"https://firebasestorage.googleapis.com/v0/b/onearmyworld.appspot.com/o/uploads%2Fhowtos%2F038gjWgLjiyYknbEjDeI%2FIMG_20200605_142311.jpg?alt=media&token=f94152ff-f923-4054-a3ad-d8ec588856fa\",\n \"size\": 124661,\n \"updated\": \"2021-04-05T15:09:01.445Z\",\n \"name\": \"IMG_20200605_142311.jpg\",\n \"src\": \"C:\\\\Users\\\\zx\\\\Desktop\\\\osr\\\\osr-machines\\\\howtos\\\\cut-out-shapes-out-of-plastic-sheets-with-a-cnc-\\\\img_20200605_142311.jpg\",\n \"alt\": \"IMG_20200605_142311.jpg\"\n }\n ]\n }\n ],\n \"moderation\": \"accepted\",\n \"user\": {\n \"_modified\": \"2024-01-08T13:28:33.484Z\",\n \"_id\": \"gus-merckel\",\n \"subType\": \"mix\",\n \"moderation\": \"accepted\",\n \"_deleted\": false,\n \"verified\": false,\n \"type\": \"workspace\",\n \"location\": {\n \"lat\": 19.3935,\n \"lng\": -99.1656\n },\n \"_created\": \"2024-01-08T13:28:33.484Z\",\n \"geo\": {\n \"latitude\": 19.3935,\n \"lookupSource\": \"coordinates\",\n \"longitude\": -99.1656,\n \"localityLanguageRequested\": \"en\",\n \"continent\": \"North America\",\n \"continentCode\": \"NA\",\n \"countryName\": \"Mexico\",\n \"countryCode\": \"MX\",\n \"principalSubdivision\": \"Ciudad de Mexico\",\n \"principalSubdivisionCode\": \"MX-CMX\",\n \"city\": \"Mexico City\",\n \"locality\": \"Benito Juarez\",\n \"postcode\": \"03103\",\n \"plusCode\": \"76F29RVM+CQ\",\n \"localityInfo\": {\n \"administrative\": [\n {\n \"name\": \"Mexico\",\n \"description\": \"country in North America\",\n \"isoName\": \"Mexico\",\n \"order\": 2,\n \"adminLevel\": 2,\n \"isoCode\": \"MX\",\n \"wikidataId\": \"Q96\",\n \"geonameId\": 3996063\n },\n {\n \"name\": \"Mexico City\",\n \"description\": \"capital and largest city of Mexico\",\n \"order\": 5,\n \"adminLevel\": 4,\n \"wikidataId\": \"Q1489\",\n \"geonameId\": 3530597\n },\n {\n \"name\": \"Ciudad de Mexico\",\n \"description\": \"capital and largest city of Mexico\",\n \"isoName\": \"Ciudad de Mexico\",\n \"order\": 6,\n \"adminLevel\": 4,\n \"isoCode\": \"MX-CMX\",\n \"wikidataId\": \"Q1489\",\n \"geonameId\": 3527646\n },\n {\n \"name\": \"Benito Juarez\",\n \"description\": \"territorial demarcation of the Mexico City in Mexico\",\n \"order\": 7,\n \"adminLevel\": 6,\n \"wikidataId\": \"Q2356998\",\n \"geonameId\": 3827406\n }\n ],\n \"informative\": [\n {\n \"name\": \"North America\",\n \"description\": \"continent and northern subcontinent of the Americas\",\n \"isoName\": \"North America\",\n \"order\": 1,\n \"isoCode\": \"NA\",\n \"wikidataId\": \"Q49\",\n \"geonameId\": 6255149\n },\n {\n \"name\": \"America/Mexico_City\",\n \"description\": \"time zone\",\n \"order\": 3\n },\n {\n \"name\": \"Greater Mexico City\",\n \"description\": \"geographical object\",\n \"order\": 4,\n \"wikidataId\": \"Q665894\"\n },\n {\n \"name\": \"03103\",\n \"description\": \"postal code\",\n \"order\": 8\n }\n ]\n }\n },\n \"data\": {\n \"urls\": [\n {\n \"name\": \"Email\",\n \"url\": \"mailto:gustavomerckel@gmail.com\"\n },\n {\n \"name\": \"Facebook\",\n \"url\": \"https://www.facebook.com/pl%c3%a1stico-chido-110888520718193\"\n },\n {\n \"name\": \"sponsor the work\",\n \"url\": \"https://www.patreon.com/one_army\"\n }\n ],\n \"description\": \"Plástico Chido builds and modifies the PP machines, and also experiments with CNC and Laser Cut\",\n \"services\": [\n {\n \"welding\": false,\n \"assembling\": false,\n \"machining\": false,\n \"electronics\": false,\n \"molds\": false\n }\n ],\n \"title\": \"Plástico Chido\",\n \"images\": []\n },\n \"detail\": {\n \"services\": [],\n \"urls\": []\n }\n },\n \"category\": {\n \"label\": \"uncategorized\"\n },\n \"content\": \"This guide outlines the process for cutting HDPE sheets using an X-Carve CNC. For a detailed demonstration, refer to the video available in Spanish with subtitles: [Watch Video](https://www.youtube.com/watch?v=4LrrFz802To).\\n\\n\\nUser Location: Mexico City, Mexico\\n\\nTo proceed, measure the plastic sheet's height, width, and thickness. The X-Carve machine operates with the CAM software Easel, which is user-friendly for CNC milling.\\n\\nEasel allows simulation of your material, and includes HDPE 2-Colors in its list of cutting materials.\\n\\nUsing the clamps from the X-Carve, secure the sheet to the table.\\n\\n### Instructions\\n\\nProceed by using software like Inkscape to create a vector file, or download one from a source such as [thenounproject.com](https://thenounproject.com).\\n\\nDownload the SVG file, which is a standard vector format, and import it into Easel.\\n\\nWith the file ready, choose the desired width for carving or cutting. Proceed with the following steps:\\n\\n- Ensure the sheet is securely fixed.\\n- Specify the cutting bit: use a 1/8-inch (3.175 mm) flat flute bit.\\n- Set the coordinate origin at the lower-left corner (0, 0).\\n- Raise the bit and activate the CNC router.\\n\\n### Instructions for Post-Processing\\n\\nTake your glasses or object, complete the post-processing, and share the results with others.\\n\\nThis project can be attempted with various CNC machines, including manual routers or saws. The essential aspect is sharing your work to contribute to community growth.\\n\\nFeel free to share your ideas and comments.\",\n \"keywords\": \"HDPE sheets, X-Carve CNC, Easel software, Mexico City CNC, CNC milling, vector file CNC, SVG file import, 1/8-inch cutting bit, CNC router guide, CNC community sharing\",\n \"resources\": \"To extract the required tools from the tutorial, here are the essential components organized by category:\\n\\n### Software\\n\\n- Easel (CAM software for CNC milling) [1]\\n- Inkscape (vector design tool) [1]\\n\\n### Hardware\\n\\n- X-Carve CNC machine [1]\\n- 1/8-inch (3.175 mm) flat flute cutting bit [1]\\n- Clamps (included with X-Carve) [1]\\n- HDPE sheet (measured for dimensions) [1]\\n- Manual routers/saws (alternative to CNC machines) [1]\",\n \"references\": \"## Youtube\\n\\n- [Cutting HDPE Sheets with X-Carve CNC](https://www.youtube.com/watch?v=4LrrFz802To)\\n\\n## Software\\n\\n- [Easel](https://www.inventables.com/technologies/easel)\\n- [Inkscape](https://inkscape.org)\\n\\n## Opensource Designs\\n\\n- [The Noun Project (SVG files)](https://thenounproject.com)\",\n \"brief\": \"Cut HDPE sheets with X-Carve CNC. Easy steps using Easel software. Secure the sheet, set origin, and start carving. Ideal for creators in Mexico City.\"\n }\n}","80031e5f2ea8f221"] \ No newline at end of file diff --git a/.kbot/params.json b/.kbot/params.json index 2556f93..c68ae33 100644 --- a/.kbot/params.json +++ b/.kbot/params.json @@ -3,7 +3,7 @@ "messages": [ { "role": "user", - "content": "Create a concise description for SEO meta (around 150-160 characters) from the text below. \n Disregard any links or image references. \n Return only the final meta description, no extra commentary.\n\nText to process:\nThis tutorial demonstrates the process of cutting HDPE sheets using an X-Carve CNC.\n\nFor a complete video in Spanish with subtitles, visit: [YouTube Video](https://www.youtube.com/watch?v=4LrrFz802To)\n\n\nUser Location: Mexico City, Mexico\n\nTo proceed, measure your plastic sheet: height, width, and thickness. Our X-Carve machine operates with the CAM software Easel, which I find to be user-friendly for CNC milling.\n\nEasel allows you to simulate the material, and it includes HDPE in its cutting material list.\n\n## Instructions for Securing a Sheet with CNC Clamps\n\nTo secure the sheet to the table, use the CNC clamps from the X-Carve.\n\nOpen a vector design program like Inkscape to create or download a vector file from [The Noun Project](https://thenounproject.com).\n\nDownload the SVG file and import it into Easel.\n\nWith the file ready, select the desired cutting width and proceed to cut using the wizard:\n- Ensure the sheet is secured.\n- Specify the cutting bit; a 1/8 inch (3.175 mm) flat flute bit is used.\n- Set the machine's 0-0 coordinate, typically the lower left corner.\n- Raise the bit, and start the CNC Router.\n\n### Tutorial Step: Showcasing Your Finished Object\n\nNow, finish post-processing your glasses or object, and share it with others.\n\nYou can attempt this project using various CNC machines, including manual routers or saws, as demonstrated in this [video](https://youtu.be/gxkcffQD3eQ). Sharing your work contributes to community development.\n\nShare your ideas and comments." + "content": "Create a concise description for SEO meta (around 150-160 characters) from the text below. \n Disregard any links or image references. \n Return only the final meta description, no extra commentary.\n\nText to process:\nThis guide outlines the process for cutting HDPE sheets using an X-Carve CNC. For a detailed demonstration, refer to the video available in Spanish with subtitles: [Watch Video](https://www.youtube.com/watch?v=4LrrFz802To).\n\n\nUser Location: Mexico City, Mexico\n\nTo proceed, measure the plastic sheet's height, width, and thickness. The X-Carve machine operates with the CAM software Easel, which is user-friendly for CNC milling.\n\nEasel allows simulation of your material, and includes HDPE 2-Colors in its list of cutting materials.\n\nUsing the clamps from the X-Carve, secure the sheet to the table.\n\n### Instructions\n\nProceed by using software like Inkscape to create a vector file, or download one from a source such as [thenounproject.com](https://thenounproject.com).\n\nDownload the SVG file, which is a standard vector format, and import it into Easel.\n\nWith the file ready, choose the desired width for carving or cutting. Proceed with the following steps:\n\n- Ensure the sheet is securely fixed.\n- Specify the cutting bit: use a 1/8-inch (3.175 mm) flat flute bit.\n- Set the coordinate origin at the lower-left corner (0, 0).\n- Raise the bit and activate the CNC router.\n\n### Instructions for Post-Processing\n\nTake your glasses or object, complete the post-processing, and share the results with others.\n\nThis project can be attempted with various CNC machines, including manual routers or saws. The essential aspect is sharing your work to contribute to community growth.\n\nFeel free to share your ideas and comments." }, { "role": "user", diff --git a/src/base/kbot-templates.ts b/src/base/kbot-templates.ts index ce76af0..a51a78c 100644 --- a/src/base/kbot-templates.ts +++ b/src/base/kbot-templates.ts @@ -3,7 +3,6 @@ import { sync as read } from "@polymech/fs/read"; import { sync as exists } from "@polymech/fs/exists"; import { z } from "zod"; import { logger } from "./index.js"; -import { resolveVariables } from "@polymech/commons/variables" import { OptionsSchema } from "@polymech/kbot-d" const InstructionSchema = z.object({ diff --git a/src/base/kbot.ts b/src/base/kbot.ts index 4b53b7f..850af89 100644 --- a/src/base/kbot.ts +++ b/src/base/kbot.ts @@ -25,9 +25,6 @@ export const filter = async (content: string, tpl: string = 'howto', opts: Props if (!templates[tpl]) { return content; } - if(context==='howto'){ - //debugger - } const template = typeof templates[tpl] === 'function' ? templates[tpl]() : templates[tpl]; const options = getFilterOptions(content, template, opts); const cache_key_obj = { diff --git a/src/config/config.ts b/src/config/config.ts index 049ad59..2953fc0 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -4,7 +4,6 @@ import { resolve, template } from '@polymech/commons' import { sync as read } from '@polymech/fs/read' import { sanitizeUri } from 'micromark-util-sanitize-uri' - // LLM export const LLM_CACHE = true diff --git a/src/model/directory/item.ts b/src/model/directory/item.ts index a932829..9a55e70 100644 --- a/src/model/directory/item.ts +++ b/src/model/directory/item.ts @@ -105,28 +105,10 @@ const complete = async (item: IUser) => { const configPath = path.join(item_path(item), 'config.json') const config = read(configPath, 'json') as IUser || {} // item = { ...item, ...config } - - if (!DIRECTORY_ANNOTATIONS) { - // return item - } - // commons: language, tone, bullshit filter, and a piece of love, just a bit, at least :) if (DIRECTORY_FILTER_LLM) { item.detail = await commons(item.detail || '') } - - item.detail = await applyFilters(item.detail || '', [validateLinks]) - - // Generate keywords using the keywords template - if (DIRECTORY_ADD_RESOURCES) { - item.data = await applyFilters(item.data, default_filters_markdown); - write(path.join(item_path(item), 'resources.md'), item.data as string) - } - - if (DIRECTORY_SEO_LLM) { - item.brief = await template_filter(item.detail, 'brief', TemplateContext.DIRECTORY); - } - item.detail = await applyFilters(item.detail || '', [validateLinks]) return item diff --git a/systems/research/gpt-researcher/.dockerignore b/systems/research/gpt-researcher/.dockerignore new file mode 100644 index 0000000..53e88ba --- /dev/null +++ b/systems/research/gpt-researcher/.dockerignore @@ -0,0 +1,2 @@ +.git +output/ diff --git a/systems/research/gpt-researcher/.github/ISSUE_TEMPLATE/bug_report.md b/systems/research/gpt-researcher/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..dd84ea7 --- /dev/null +++ b/systems/research/gpt-researcher/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/systems/research/gpt-researcher/.github/ISSUE_TEMPLATE/feature_request.md b/systems/research/gpt-researcher/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/systems/research/gpt-researcher/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/systems/research/gpt-researcher/.github/dependabot.yml b/systems/research/gpt-researcher/.github/dependabot.yml new file mode 100644 index 0000000..87855e8 --- /dev/null +++ b/systems/research/gpt-researcher/.github/dependabot.yml @@ -0,0 +1,15 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "pip" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "weekly" + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "weekly" diff --git a/systems/research/gpt-researcher/.github/workflows/docker-build.yml b/systems/research/gpt-researcher/.github/workflows/docker-build.yml new file mode 100644 index 0000000..c40e546 --- /dev/null +++ b/systems/research/gpt-researcher/.github/workflows/docker-build.yml @@ -0,0 +1,45 @@ +name: GPTR tests +run-name: ${{ github.actor }} ran the GPTR tests flow +permissions: + contents: read + pull-requests: write +on: + workflow_dispatch: # Add this line to enable manual triggering + # pull_request: + # types: [opened, synchronize] + +jobs: + docker: + runs-on: ubuntu-latest + environment: tests # Specify the environment to use for this job + env: + # Ensure these environment variables are set for the entire job + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + TAVILY_API_KEY: ${{ secrets.TAVILY_API_KEY }} + LANGCHAIN_API_KEY: ${{ secrets.LANGCHAIN_API_KEY }} + steps: + - name: Git checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + with: + driver: docker + + # - name: Build Docker images + # uses: docker/build-push-action@v4 + # with: + # push: false + # tags: gptresearcher/gpt-researcher:latest + # file: Dockerfile + + - name: Set up Docker Compose + run: | + sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + - name: Run tests with Docker Compose + run: | + docker-compose --profile test run --rm gpt-researcher-tests \ No newline at end of file diff --git a/systems/research/gpt-researcher/.gitignore b/systems/research/gpt-researcher/.gitignore new file mode 100644 index 0000000..d7cc912 --- /dev/null +++ b/systems/research/gpt-researcher/.gitignore @@ -0,0 +1,53 @@ +#Ignore env containing secrets +.env +.venv +.envrc + +#Ignore Virtual Env +env/ +venv/ +.venv/ + +# Other Environments +ENV/ +env.bak/ +venv.bak/ + +#Ignore generated outputs +outputs/ +*.lock +dist/ +gpt_researcher.egg-info/ + +#Ignore my local docs +my-docs/ + +#Ignore pycache +**/__pycache__/ + +#Ignore mypy cache +.mypy_cache/ +node_modules +.idea +.DS_Store +.docusaurus +build +docs/build + +.vscode/launch.json +.langgraph-data/ +.next/ +package-lock.json + +#Vim swp files +*.swp + +# Log files +logs/ +*.orig +*.log +server_log.txt + +#Cursor Rules +.cursorrules +CURSOR_RULES.md \ No newline at end of file diff --git a/systems/research/gpt-researcher/.python-version b/systems/research/gpt-researcher/.python-version new file mode 100644 index 0000000..2c07333 --- /dev/null +++ b/systems/research/gpt-researcher/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/systems/research/gpt-researcher/CODE_OF_CONDUCT.md b/systems/research/gpt-researcher/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..23f943d --- /dev/null +++ b/systems/research/gpt-researcher/CODE_OF_CONDUCT.md @@ -0,0 +1,123 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We, as members, contributors, and leaders, pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, sexual identity, or +orientation. + +We commit to acting and interacting in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward others +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission +- Other conduct that could reasonably be considered inappropriate in a professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior deemed inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that do not +align with this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies to all community spaces and also applies when +an individual is officially representing the community in public spaces. +Examples include using an official email address, posting via an official +social media account, or acting as an appointed representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +[Assaf.elovic@gmail.com](mailto:Assaf.elovic@gmail.com). +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period. This includes +avoiding interactions in community spaces and external channels like social media. +Violating these terms may lead to a temporary or permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any interaction or public +communication with the community for a specified period. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of groups of individuals. + +**Consequence**: A permanent ban from any public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/systems/research/gpt-researcher/CONTRIBUTING.md b/systems/research/gpt-researcher/CONTRIBUTING.md new file mode 100644 index 0000000..d665af3 --- /dev/null +++ b/systems/research/gpt-researcher/CONTRIBUTING.md @@ -0,0 +1,42 @@ +# Contributing to GPT Researcher + +First off, we'd like to welcome you and thank you for your interest and effort in contributing to our open-source project ❤️. Contributions of all forms are welcome—from new features and bug fixes to documentation and more. + +We are on a mission to build the #1 AI agent for comprehensive, unbiased, and factual research online, and we need your support to achieve this grand vision. + +Please take a moment to review this document to make the contribution process easy and effective for everyone involved. + +## Reporting Issues + +If you come across any issue or have an idea for an improvement, don't hesitate to create an issue on GitHub. Describe your problem in sufficient detail, providing as much relevant information as possible. This way, we can reproduce the issue before attempting to fix it or respond appropriately. + +## Contributing Code + +1. **Fork the repository and create your branch from `master`.** + If it’s not an urgent bug fix, branch from `master` and work on the feature or fix there. + +2. **Make your changes.** + Implement your changes following best practices for coding in the project's language. + +3. **Test your changes.** + Ensure that your changes pass all tests if any exist. If the project doesn’t have automated tests, test your changes manually to confirm they behave as expected. + +4. **Follow the coding style.** + Ensure your code adheres to the coding conventions used throughout the project, including indentation, accurate comments, etc. + +5. **Commit your changes.** + Make your Git commits informative and concise. This is very helpful for others when they look at the Git log. + +6. **Push to your fork and submit a pull request.** + When your work is ready and passes tests, push your branch to your fork of the repository and submit a pull request from there. + +7. **Pat yourself on the back and wait for review.** + Your work is done, congratulations! Now sit tight. The project maintainers will review your submission as soon as possible. They might suggest changes or ask for improvements. Both constructive conversation and patience are key to the collaboration process. + +## Documentation + +If you would like to contribute to the project's documentation, please follow the same steps: fork the repository, make your changes, test them, and submit a pull request. + +Documentation is a vital part of any software. It's not just about having good code; ensuring that users and contributors understand what's going on, how to use the software, or how to contribute is crucial. + +We're grateful for all our contributors, and we look forward to building the world's leading AI research agent hand-in-hand with you. Let's harness the power of open source and AI to change the world together! diff --git a/systems/research/gpt-researcher/Dockerfile b/systems/research/gpt-researcher/Dockerfile new file mode 100644 index 0000000..1294e01 --- /dev/null +++ b/systems/research/gpt-researcher/Dockerfile @@ -0,0 +1,54 @@ +# Stage 1: Browser and build tools installation +FROM python:3.11.4-slim-bullseye AS install-browser + +# Install Chromium, Chromedriver, Firefox, Geckodriver, and build tools in one layer +RUN apt-get update \ + && apt-get install -y gnupg wget ca-certificates --no-install-recommends \ + && wget -qO - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \ + && echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list \ + && apt-get update \ + && apt-get install -y google-chrome-stable chromium-driver \ + && google-chrome --version && chromedriver --version \ + && apt-get install -y --no-install-recommends firefox-esr build-essential \ + && wget https://github.com/mozilla/geckodriver/releases/download/v0.33.0/geckodriver-v0.33.0-linux64.tar.gz \ + && tar -xvzf geckodriver-v0.33.0-linux64.tar.gz \ + && chmod +x geckodriver \ + && mv geckodriver /usr/local/bin/ \ + && rm geckodriver-v0.33.0-linux64.tar.gz \ + && rm -rf /var/lib/apt/lists/* # Clean up apt lists to reduce image size + +# Stage 2: Python dependencies installation +FROM install-browser AS gpt-researcher-install + +ENV PIP_ROOT_USER_ACTION=ignore +WORKDIR /usr/src/app + +# Copy and install Python dependencies in a single layer to optimize cache usage +COPY ./requirements.txt ./requirements.txt +COPY ./multi_agents/requirements.txt ./multi_agents/requirements.txt + +RUN pip install --no-cache-dir -r requirements.txt && \ + pip install --no-cache-dir -r multi_agents/requirements.txt + +# Stage 3: Final stage with non-root user and app +FROM gpt-researcher-install AS gpt-researcher + +# Create a non-root user for security +RUN useradd -ms /bin/bash gpt-researcher && \ + chown -R gpt-researcher:gpt-researcher /usr/src/app && \ + # Add these lines to create and set permissions for outputs directory + mkdir -p /usr/src/app/outputs && \ + chown -R gpt-researcher:gpt-researcher /usr/src/app/outputs && \ + chmod 777 /usr/src/app/outputs + +USER gpt-researcher +WORKDIR /usr/src/app + +# Copy the rest of the application files with proper ownership +COPY --chown=gpt-researcher:gpt-researcher ./ ./ + +# Expose the application's port +EXPOSE 9000 + +# Define the default command to run the application +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "9000"] diff --git a/systems/research/gpt-researcher/LICENSE b/systems/research/gpt-researcher/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/systems/research/gpt-researcher/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/systems/research/gpt-researcher/Procfile b/systems/research/gpt-researcher/Procfile new file mode 100644 index 0000000..b0c6683 --- /dev/null +++ b/systems/research/gpt-researcher/Procfile @@ -0,0 +1 @@ +web: python -m uvicorn backend.server.server:app --host=0.0.0.0 --port=${PORT} \ No newline at end of file diff --git a/systems/research/gpt-researcher/README-ja_JP.md b/systems/research/gpt-researcher/README-ja_JP.md new file mode 100644 index 0000000..b62a98a --- /dev/null +++ b/systems/research/gpt-researcher/README-ja_JP.md @@ -0,0 +1,159 @@ +
+ +Logo + + +#### + +[![公式サイト](https://img.shields.io/badge/公式サイト-gptr.dev-blue?style=for-the-badge&logo=world&logoColor=white)](https://gptr.dev) +[![Documentation](https://img.shields.io/badge/Documentation-DOCS-f472b6?logo=googledocs&logoColor=white&style=for-the-badge)](https://docs.gptr.dev) +[![Discord Follow](https://img.shields.io/discord/1127851779011391548?style=for-the-badge&logo=discord&label=Chat%20on%20Discord)](https://discord.gg/QgZXvJAccX) + +[![PyPI version](https://img.shields.io/pypi/v/gpt-researcher?logo=pypi&logoColor=white&style=flat)](https://badge.fury.io/py/gpt-researcher) +![GitHub Release](https://img.shields.io/github/v/release/assafelovic/gpt-researcher?style=flat&logo=github) +[![Open In Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=yellow&label=%20&style=flat&logoSize=40)](https://colab.research.google.com/github/assafelovic/gpt-researcher/blob/master/docs/docs/examples/pip-run.ipynb) +[![Docker Image Version](https://img.shields.io/docker/v/elestio/gpt-researcher/latest?arch=amd64&style=flat&logo=docker&logoColor=white&color=1D63ED)](https://hub.docker.com/r/gptresearcher/gpt-researcher) +[![Twitter Follow](https://img.shields.io/twitter/follow/assaf_elovic?style=social)](https://twitter.com/assaf_elovic) + +[English](README.md) | +[中文](README-zh_CN.md) | +[日本語](README-ja_JP.md) | +[한국어](README-ko_KR.md) +
+ +# 🔎 GPT Researcher + +**GPT Researcher は、さまざまなタスクに対する包括的なオンラインリサーチのために設計された自律エージェントです。** + +このエージェントは、詳細で事実に基づいた偏りのない研究レポートを生成することができ、関連するリソース、アウトライン、およびレッスンに焦点を当てるためのカスタマイズオプションを提供します。最近の [Plan-and-Solve](https://arxiv.org/abs/2305.04091) および [RAG](https://arxiv.org/abs/2005.11401) 論文に触発され、GPT Researcher は速度、決定論、および信頼性の問題に対処し、同期操作ではなく並列化されたエージェント作業を通じてより安定したパフォーマンスと高速化を提供します。 + +**私たちの使命は、AIの力を活用して、個人や組織に正確で偏りのない事実に基づいた情報を提供することです。** + +## なぜGPT Researcherなのか? + +- 手動の研究タスクで客観的な結論を形成するには時間がかかることがあり、適切なリソースと情報を見つけるのに数週間かかることもあります。 +- 現在のLLMは過去の情報に基づいて訓練されており、幻覚のリスクが高く、研究タスクにはほとんど役に立ちません。 +- 現在のLLMは短いトークン出力に制限されており、長く詳細な研究レポート(2,000語以上)には不十分です。 +- Web検索を可能にするサービス(ChatGPT + Webプラグインなど)は、限られたリソースとコンテンツのみを考慮し、場合によっては表面的で偏った回答をもたらします。 +- Webソースの選択のみを使用すると、研究タスクの正しい結論を導く際にバイアスが生じる可能性があります。 + +## アーキテクチャ +主なアイデアは、「プランナー」と「実行」エージェントを実行することであり、プランナーは研究する質問を生成し、実行エージェントは生成された各研究質問に基づいて最も関連性の高い情報を探します。最後に、プランナーはすべての関連情報をフィルタリングおよび集約し、研究レポートを作成します。

+エージェントは、研究タスクを完了するために gpt-4o-mini と gpt-4o(128K コンテキスト)の両方を活用します。必要に応じてそれぞれを使用することでコストを最適化します。**平均的な研究タスクは完了するのに約3分かかり、コストは約0.1ドルです**。 + +
+ +
+ + +詳細説明: +* 研究クエリまたはタスクに基づいて特定のドメインエージェントを作成します。 +* 研究タスクに対する客観的な意見を形成する一連の研究質問を生成します。 +* 各研究質問に対して、与えられたタスクに関連する情報をオンラインリソースから収集するクローラーエージェントをトリガーします。 +* 各収集されたリソースについて、関連情報に基づいて要約し、そのソースを追跡します。 +* 最後に、すべての要約されたソースをフィルタリングおよび集約し、最終的な研究レポートを生成します。 + +## デモ +https://github.com/assafelovic/gpt-researcher/assets/13554167/a00c89a6-a295-4dd0-b58d-098a31c40fda + +## チュートリアル + - [動作原理](https://docs.gptr.dev/blog/building-gpt-researcher) + - [インストール方法](https://www.loom.com/share/04ebffb6ed2a4520a27c3e3addcdde20?sid=da1848e8-b1f1-42d1-93c3-5b0b9c3b24ea) + - [ライブデモ](https://www.loom.com/share/6a3385db4e8747a1913dd85a7834846f?sid=a740fd5b-2aa3-457e-8fb7-86976f59f9b8) + +## 特徴 +- 📝 研究、アウトライン、リソース、レッスンレポートを生成 +- 🌐 各研究で20以上のWebソースを集約し、客観的で事実に基づいた結論を形成 +- 🖥️ 使いやすいWebインターフェース(HTML/CSS/JS)を含む +- 🔍 JavaScriptサポート付きのWebソースをスクレイピング +- 📂 訪問および使用されたWebソースのコンテキストを追跡 +- 📄 研究レポートをPDF、Wordなどにエクスポート + +## 📖 ドキュメント + +完全なドキュメントについては、[こちら](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started)を参照してください: + +- 入門(インストール、環境設定、簡単な例) +- 操作例(デモ、統合、dockerサポート) +- 参考資料(API完全ドキュメント) +- Tavilyアプリケーションインターフェースの統合(コア概念の高度な説明) + +## クイックスタート +> **ステップ 0** - Python 3.11 以降をインストールします。[こちら](https://www.tutorialsteacher.com/python/install-python)を参照して、ステップバイステップのガイドを確認してください。 + +
+ +> **ステップ 1** - プロジェクトをダウンロードします + +```bash +$ git clone https://github.com/assafelovic/gpt-researcher.git +$ cd gpt-researcher +``` + +
+ +> **ステップ2** - 依存関係をインストールします +```bash +$ pip install -r requirements.txt +``` +
+ +> **ステップ 3** - OpenAI キーと Tavily API キーを使用して .env ファイルを作成するか、直接エクスポートします + +```bash +$ export OPENAI_API_KEY={Your OpenAI API Key here} +``` +```bash +$ export TAVILY_API_KEY={Your Tavily API Key here} +``` + +- **LLMには、[OpenAI GPT](https://platform.openai.com/docs/guides/gpt) を使用することをお勧めします**が、[Langchain Adapter](https://python.langchain.com/docs/guides/adapters/openai) がサポートする他の LLM モデル(オープンソースを含む)を使用することもできます。llm モデルとプロバイダーを config/config.py で変更するだけです。[このガイド](https://python.langchain.com/docs/integrations/llms/) に従って、LLM を Langchain と統合する方法を学んでください。 +- **検索エンジンには、[Tavily Search API](https://app.tavily.com)(LLM 用に最適化されています)を使用することをお勧めします**が、他の検索エンジンを選択することもできます。config/config.py で検索プロバイダーを「duckduckgo」、「googleAPI」、「googleSerp」、「searchapi」、「searx」に変更するだけです。次に、config.py ファイルに対応する env API キーを追加します。 +- **最適なパフォーマンスを得るために、[OpenAI GPT](https://platform.openai.com/docs/guides/gpt) モデルと [Tavily Search API](https://app.tavily.com) を使用することを強くお勧めします。** +
+ +> **ステップ 4** - FastAPI を使用してエージェントを実行します + +```bash +$ uvicorn main:app --reload +``` +
+ +> **ステップ 5** - 任意のブラウザで http://localhost:8000 にアクセスして、リサーチを楽しんでください! + +Docker の使い方や機能とサービスの詳細については、[ドキュメント](https://docs.gptr.dev) ページをご覧ください。 + +## 🚀 貢献 +私たちは貢献を大歓迎します!興味がある場合は、[貢献](CONTRIBUTING.md) をご覧ください。 + +私たちの[ロードマップ](https://trello.com/b/3O7KBePw/gpt-researcher-roadmap) ページを確認し、私たちの使命に参加することに興味がある場合は、[Discord コミュニティ](https://discord.gg/QgZXvJAccX) を通じてお問い合わせください。 + +## ✉️ サポート / お問い合わせ +- [コミュニティディスカッション](https://discord.gg/spBgZmm3Xe) +- 私たちのメール: support@tavily.com + +## 🛡 免責事項 + +このプロジェクト「GPT Researcher」は実験的なアプリケーションであり、明示または黙示のいかなる保証もなく「現状のまま」提供されます。私たちは学術目的のためにMITライセンスの下でコードを共有しています。ここに記載されている内容は学術的なアドバイスではなく、学術論文や研究論文での使用を推奨するものではありません。 + +私たちの客観的な研究主張に対する見解: +1. 私たちのスクレイピングシステムの主な目的は、不正確な事実を減らすことです。どうやって解決するのか?私たちがスクレイピングするサイトが多ければ多いほど、誤ったデータの可能性は低くなります。各研究で20の情報を収集し、それらがすべて間違っている可能性は非常に低いです。 +2. 私たちの目標はバイアスを排除することではなく、可能な限りバイアスを減らすことです。**私たちはここでコミュニティとして最も効果的な人間と機械の相互作用を探求しています**。 +3. 研究プロセスでは、人々も自分が研究しているトピックに対してすでに意見を持っているため、バイアスがかかりやすいです。このツールは多くの意見を収集し、偏った人が決して読まないであろう多様な見解を均等に説明します。 + +**GPT-4 言語モデルの使用は、トークンの使用により高額な費用がかかる可能性があることに注意してください**。このプロジェクトを利用することで、トークンの使用状況と関連する費用を監視および管理する責任があることを認めたことになります。OpenAI API の使用状況を定期的に確認し、予期しない料金が発生しないように必要な制限やアラートを設定することを強くお勧めします。 + +--- + +

+ + + + + Star History Chart + + +

diff --git a/systems/research/gpt-researcher/README-ko_KR.md b/systems/research/gpt-researcher/README-ko_KR.md new file mode 100644 index 0000000..602479a --- /dev/null +++ b/systems/research/gpt-researcher/README-ko_KR.md @@ -0,0 +1,242 @@ +
+ +Logo + + +#### + +[![Website](https://img.shields.io/badge/Official%20Website-gptr.dev-teal?style=for-the-badge&logo=world&logoColor=white&color=0891b2)](https://gptr.dev) +[![Documentation](https://img.shields.io/badge/Documentation-DOCS-f472b6?logo=googledocs&logoColor=white&style=for-the-badge)](https://docs.gptr.dev) +[![Discord Follow](https://img.shields.io/discord/1127851779011391548?style=for-the-badge&logo=discord&label=Chat%20on%20Discord)](https://discord.gg/QgZXvJAccX) + +[![PyPI version](https://img.shields.io/pypi/v/gpt-researcher?logo=pypi&logoColor=white&style=flat)](https://badge.fury.io/py/gpt-researcher) +![GitHub Release](https://img.shields.io/github/v/release/assafelovic/gpt-researcher?style=flat&logo=github) +[![Open In Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=yellow&label=%20&style=flat&logoSize=40)](https://colab.research.google.com/github/assafelovic/gpt-researcher/blob/master/docs/docs/examples/pip-run.ipynb) +[![Docker Image Version](https://img.shields.io/docker/v/elestio/gpt-researcher/latest?arch=amd64&style=flat&logo=docker&logoColor=white&color=1D63ED)](https://hub.docker.com/r/gptresearcher/gpt-researcher) +[![Twitter Follow](https://img.shields.io/twitter/follow/assaf_elovic?style=social)](https://twitter.com/assaf_elovic) + +[English](README.md) | +[中文](README-zh_CN.md) | +[日本語](README-ja_JP.md) | +[한국어](README-ko_KR.md) +
+ +# 🔎 GPT Researcher + +**GPT Researcher는 다양한 작업을 대해 포괄적인 온라인 연구를 수행하도록 설계된 자율 에이전트입니다.** + +이 에이전트는 세부적이고 사실에 기반하며 편견 없는 연구 보고서를 생성할 수 있으며, 관련 리소스와 개요에 초점을 맞춘 맞춤형 옵션을 제공합니다. 최근 발표된 [Plan-and-Solve](https://arxiv.org/abs/2305.04091) 및 [RAG](https://arxiv.org/abs/2005.11401) 논문에서 영감을 받아 GPT Researcher는 잘못된 정보, 속도, 결정론적 접근 방식, 신뢰성 문제를 해결하고, 동기화 작업이 아닌 병렬 에이전트 작업을 통해 더 안정적이고 빠른 성능을 제공합니다. + +**우리의 목표는 AI의 힘을 활용하여 개인과 조직에게 정확하고 편향 없는 사실에 기반한 정보를 제공하는 것입니다.** + +## 왜 GPT Researcher인가? + +- 직접 수행하는 연구 과정은 객관적인 결론을 도출하는 데 시간이 오래 걸리며, 적절한 리소스와 정보를 찾는 데 몇 주가 걸릴 수 있습니다. +- 현재의 대규모 언어 모델(LLM)은 과거 정보에 기반해 훈련되었으며, 환각 현상이 발생할 위험이 높아 연구 작업에는 적합하지 않습니다. +- 현재 LLM은 짧은 토큰 출력으로 제한되며, 2,000단어 이상의 길고 자세한 연구 보고서를 작성하는 데는 충분하지 않습니다. +- 웹 검색을 지원하는 서비스(예: ChatGPT 또는 Perplexity)는 제한된 리소스와 콘텐츠만을 고려하여 경우에 따라 피상적이고 편향된 답변을 제공합니다. +- 웹 소스만을 사용하면 연구 작업에서 올바른 결론을 도출할 때 편향이 발생할 수 있습니다. + +## 데모 +https://github.com/user-attachments/assets/092e9e71-7e27-475d-8c4f-9dddd28934a3 + +## 아키텍처 +주요 아이디어는 "플래너"와 "실행" 에이전트를 실행하는 것으로, 플래너는 연구할 질문을 생성하고, 실행 에이전트는 생성된 각 연구 질문에 따라 가장 관련성 높은 정보를 찾습니다. 마지막으로 플래너는 모든 관련 정보를 필터링하고 집계하여 연구 보고서를 작성합니다. +

+에이전트는 `gpt-4o-mini`와 `gpt-4o`(128K 컨텍스트)를 활용하여 연구 작업을 완료합니다. 필요에 따라 각각을 사용하여 비용을 최적화합니다. **평균 연구 작업은 약 2분이 소요되며, 비용은 약 $0.005입니다.**. + +
+ +
+ +구체적으로: +* 연구 쿼리 또는 작업을 기반으로 도메인별 에이전트를 생성합니다. +* 주어진 작업에 대해 객관적인 의견을 형성할 수 있는 일련의 연구 질문을 생성합니다. +* 각 연구 질문에 대해 크롤러 에이전트를 실행하여 작업과 관련된 정보를 온라인 리소스에서 수집합니다. +* 수집된 각 리소스에서 관련 정보를 요약하고 출처를 기록합니다. +* 마지막으로, 요약된 모든 정보를 필터링하고 집계하여 최종 연구 보고서를 생성합니다. + +## 튜토리얼 + - [동작원리](https://docs.gptr.dev/blog/building-gpt-researcher) + - [설치방법](https://www.loom.com/share/04ebffb6ed2a4520a27c3e3addcdde20?sid=da1848e8-b1f1-42d1-93c3-5b0b9c3b24ea) + - [라이브 데모](https://www.loom.com/share/6a3385db4e8747a1913dd85a7834846f?sid=a740fd5b-2aa3-457e-8fb7-86976f59f9b8) + + +## 기능 +- 📝 로컬 문서 및 웹 소스를 사용하여 연구, 개요, 리소스 및 학습 보고서 생성 +- 📜 2,000단어 이상의 길고 상세한 연구 보고서 생성 가능 +- 🌐 연구당 20개 이상의 웹 소스를 집계하여 객관적이고 사실에 기반한 결론 도출 +- 🖥️ 경량 HTML/CSS/JS와 프로덕션용 (NextJS + Tailwind) UX/UI 포함 +- 🔍 자바스크립트 지원 웹 소스 스크래핑 기능 +- 📂 연구 과정에서 맥락과 메모리 추적 및 유지 +- 📄 연구 보고서를 PDF, Word 등으로 내보내기 지원 + +## 📖 문서 + +전체 문서(설치, 환경 설정, 간단한 예시)를 보려면 [여기](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started)를 참조하세요. + +- 시작하기 (설치, 환경 설정, 간단한 예시) +- 맞춤 설정 및 구성 +- 사용 방법 예시 (데모, 통합, 도커 지원) +- 참고자료 (전체 API 문서) + +## ⚙️ 시작하기 +### 설치 +> **1단계** - Python 3.11 또는 그 이상의 버전을 설치하세요. [여기](https://www.tutorialsteacher.com/python/install-python)를 참조하여 단계별 가이드를 확인하세요. + +> **2단계** - 프로젝트를 다운로드하고 해당 디렉토리로 이동하세요. + +```bash +git clone https://github.com/assafelovic/gpt-researcher.git +cd gpt-researcher +``` + +> **3단계** - 두 가지 방법으로 API 키를 설정하세요: 직접 export하거나 `.env` 파일에 저장하세요. + +Linux/Windows에서 임시 설정을 하려면 export 방법을 사용하세요: + +```bash +export OPENAI_API_KEY={OpenAI API 키 입력} +export TAVILY_API_KEY={Tavily API 키 입력} +``` + +더 영구적인 설정을 원한다면, 현재의 `gpt-researcher` 디렉토리에 `.env` 파일을 생성하고 환경 변수를 입력하세요 (export 없이). + +- 기본 LLM은 [GPT](https://platform.openai.com/docs/guides/gpt)이지만, `claude`, `ollama3`, `gemini`, `mistral` 등 다른 LLM도 사용할 수 있습니다. LLM 제공자를 변경하는 방법은 [LLMs 문서](https://docs.gptr.dev/docs/gpt-researcher/llms/llms)를 참조하세요. 이 프로젝트는 OpenAI GPT 모델에 최적화되어 있습니다. +- 기본 검색기는 [Tavily](https://app.tavily.com)이지만, `duckduckgo`, `google`, `bing`, `searchapi`, `serper`, `searx`, `arxiv`, `exa` 등의 검색기를 사용할 수 있습니다. 검색 제공자를 변경하는 방법은 [검색기 문서](https://docs.gptr.dev/docs/gpt-researcher/retrievers)를 참조하세요. + +### 빠른 시작 + +> **1단계** - 필요한 종속성 설치 + +```bash +pip install -r requirements.txt +``` + +> **2단계** - FastAPI로 에이전트 실행 + +```bash +python -m uvicorn main:app --reload +``` + +> **3단계** - 브라우저에서 http://localhost:8000 으로 이동하여 연구를 시작하세요! + +
+ +**[Poetry](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started#poetry) 또는 [가상 환경](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started#virtual-environment)에 대해 배우고 싶다면, [문서](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started)를 참조하세요.** + +### PIP 패키지로 실행하기 +```bash +pip install gpt-researcher +``` + +```python +... +from gpt_researcher import GPTResearcher + +query = "왜 Nvidia 주식이 오르고 있나요?" +researcher = GPTResearcher(query=query, report_type="research_report") +# 주어진 질문에 대한 연구 수행 +research_result = await researcher.conduct_research() +# 보고서 작성 +report = await researcher.write_report() +... +``` + +**더 많은 예제와 구성 옵션은 [PIP 문서](https://docs.gptr.dev/docs/gpt-researcher/gptr/pip-package)를 참조하세요.** + +## Docker로 실행 + +> **1단계** - [Docker 설치](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started-with-docker) + +> **2단계** - `.env.example` 파일을 복사하고 API 키를 추가한 후, 파일을 `.env`로 저장하세요. + +> **3단계** - docker-compose 파일에서 실행하고 싶지 않은 서비스를 주석 처리하세요. + +```bash +$ docker-compose up --build +``` + +> **4단계** - docker-compose 파일에서 아무 것도 주석 처리하지 않았다면, 기본적으로 두 가지 프로세스가 시작됩니다: + - localhost:8000에서 실행 중인 Python 서버
+ - localhost:3000에서 실행 중인 React 앱
+ +브라우저에서 localhost:3000으로 이동하여 연구를 시작하세요! + +## 📄 로컬 문서로 연구하기 + +GPT Researcher를 사용하여 로컬 문서를 기반으로 연구 작업을 수행할 수 있습니다. 현재 지원되는 파일 형식은 PDF, 일반 텍스트, CSV, Excel, Markdown, PowerPoint, Word 문서입니다. + +1단계: `DOC_PATH` 환경 변수를 설정하여 문서가 있는 폴더를 지정하세요. + +```bash +export DOC_PATH="./my-docs" +``` + +2단계: + - 프론트엔드 앱을 localhost:8000에서 실행 중이라면, "Report Source" 드롭다운 옵션에서 "My Documents"를 선택하세요. + - GPT Researcher를 [PIP 패키지](https://docs.tavily.com/guides/gpt-researcher/gpt-researcher#pip-package)로 실행 중이라면, `report_source` 인수를 "local"로 설정하여 `GPTResearcher` 클래스를 인스턴스화하세요. [코드 예제](https://docs.gptr.dev/docs/gpt-researcher/context/tailored-research)를 참조하세요. + +## 👪 다중 에이전트 어시스턴트 + +AI가 프롬프트 엔지니어링 및 RAG에서 다중 에이전트 시스템으로 발전함에 따라, 우리는 [LangGraph](https://python.langchain.com/v0.1/docs/langgraph/)로 구축된 새로운 다중 에이전트 어시스턴트를 소개합니다. + +LangGraph를 사용하면 여러 에이전트의 전문 기술을 활용하여 연구 과정의 깊이와 질을 크게 향상시킬 수 있습니다. 최근 [STORM](https://arxiv.org/abs/2402.14207) 논문에서 영감을 받아, 이 프로젝트는 AI 에이전트 팀이 주제에 대한 연구를 계획에서 출판까지 함께 수행하는 방법을 보여줍니다. + +평균 실행은 5-6 페이지 분량의 연구 보고서를 PDF, Docx, Markdown 형식으로 생성합니다. + +[여기](https://github.com/assafelovic/gpt-researcher/tree/master/multi_agents)에서 확인하거나 [문서](https://docs.gptr.dev/docs/gpt-researcher/multi_agents/langgraph)에서 자세한 내용을 참조하세요. + +## 🖥️ 프론트엔드 애플리케이션 + +GPT-Researcher는 사용자 경험을 개선하고 연구 프로세스를 간소화하기 위해 향상된 프론트엔드를 제공합니다. 프론트엔드는 다음과 같은 기능을 제공합니다: + +- 연구 쿼리를 입력할 수 있는 직관적인 인터페이스 +- 연구 작업의 실시간 진행 상황 추적 +- 연구 결과의 대화형 디스플레이 +- 맞춤형 연구 경험을 위한 설정 가능 + +두 가지 배포 옵션이 있습니다: +1. FastAPI로 제공되는 경량 정적 프론트엔드 +2. 고급 기능을 제공하는 NextJS 애플리케이션 + +프론트엔드 기능에 대한 자세한 설치 방법 및 정보를 원하시면 [문서 페이지](https://docs.gptr.dev/docs/gpt-researcher/frontend/introduction)를 참조하세요. + +## 🚀 기여하기 +우리는 기여를 적극 환영합니다! 관심이 있다면 [기여 가이드](https://github.com/assafelovic/gpt-researcher/blob/master/CONTRIBUTING.md)를 확인해 주세요. + +[로드맵](https://trello.com/b/3O7KBePw/gpt-researcher-roadmap) 페이지를 확인하고, 우리 [Discord 커뮤니티](https://discord.gg/QgZXvJAccX)에 가입하여 우리의 목표에 함께 참여해 주세요. + + + + +## ✉️ 지원 / 문의 +- [커뮤니티 Discord](https://discord.gg/spBgZmm3Xe) +- 저자 이메일: assaf.elovic@gmail.com + +## 🛡️ 면책 조항 + +이 프로젝트인 GPT Researcher는 실험적인 응용 프로그램이며, 명시적이거나 묵시적인 보증 없이 "있는 그대로" 제공됩니다. 우리는 이 코드를 학술적 목적으로 Apache 2 라이선스 하에 공유하고 있습니다. 여기에 있는 것은 학술적 조언이 아니며, 학술 또는 연구 논문에 사용하는 것을 권장하지 않습니다. + +편향되지 않은 연구 주장에 대한 우리의 견해: +1. GPT Researcher의 주요 목표는 잘못된 정보와 편향된 사실을 줄이는 것입니다. 그 방법은 무엇일까요? 우리는 더 많은 사이트를 스크래핑할수록 잘못된 데이터의 가능성이 줄어든다고 가정합니다. 여러 사이트에서 정보를 스크래핑하고 가장 빈번한 정보를 선택하면, 모든 정보가 틀릴 확률은 매우 낮습니다. +2. 우리는 편향을 완전히 제거하려고 하지는 않지만, 가능한 한 줄이는 것을 목표로 합니다. **우리는 인간과 LLM의 가장 효과적인 상호작용을 찾기 위한 커뮤니티입니다.** +3. 연구에서 사람들도 이미 자신이 연구하는 주제에 대해 의견을 가지고 있기 때문에 편향되는 경향이 있습니다. 이 도구는 많은 의견을 스크래핑하며, 편향된 사람이라면 결코 읽지 않았을 다양한 견해를 고르게 설명합니다. + +**GPT-4 모델을 사용할 경우, 토큰 사용량 때문에 비용이 많이 들 수 있습니다.** 이 프로젝트를 사용하는 경우, 자신의 토큰 사용량 및 관련 비용을 모니터링하고 관리하는 것은 본인의 책임입니다. OpenAI API 사용량을 정기적으로 확인하고, 예상치 못한 비용을 방지하기 위해 필요한 한도를 설정하거나 알림을 설정하는 것이 좋습니다. + + +--- + +

+ + + + + Star History Chart + + +

diff --git a/systems/research/gpt-researcher/README-zh_CN.md b/systems/research/gpt-researcher/README-zh_CN.md new file mode 100644 index 0000000..9cec2d5 --- /dev/null +++ b/systems/research/gpt-researcher/README-zh_CN.md @@ -0,0 +1,158 @@ +
+ +Logo + + +#### + +[![Website](https://img.shields.io/badge/Official%20Website-gptr.dev-teal?style=for-the-badge&logo=world&logoColor=white&color=0891b2)](https://gptr.dev) +[![Documentation](https://img.shields.io/badge/Documentation-DOCS-f472b6?logo=googledocs&logoColor=white&style=for-the-badge)](https://docs.gptr.dev) +[![Discord Follow](https://img.shields.io/discord/1127851779011391548?style=for-the-badge&logo=discord&label=Chat%20on%20Discord)](https://discord.gg/QgZXvJAccX) + +[![PyPI version](https://img.shields.io/pypi/v/gpt-researcher?logo=pypi&logoColor=white&style=flat)](https://badge.fury.io/py/gpt-researcher) +![GitHub Release](https://img.shields.io/github/v/release/assafelovic/gpt-researcher?style=flat&logo=github) +[![Open In Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=yellow&label=%20&style=flat&logoSize=40)](https://colab.research.google.com/github/assafelovic/gpt-researcher/blob/master/docs/docs/examples/pip-run.ipynb) +[![Docker Image Version](https://img.shields.io/docker/v/elestio/gpt-researcher/latest?arch=amd64&style=flat&logo=docker&logoColor=white&color=1D63ED)](https://hub.docker.com/r/gptresearcher/gpt-researcher) +[![Twitter Follow](https://img.shields.io/twitter/follow/assaf_elovic?style=social)](https://twitter.com/assaf_elovic) + +[English](README.md) | +[中文](README-zh_CN.md) | +[日本語](README-ja_JP.md) | +[한국어](README-ko_KR.md) +
+ +# 🔎 GPT Researcher + +**GPT Researcher 是一个智能体代理,专为各种任务的综合在线研究而设计。** + +代理可以生成详细、正式且客观的研究报告,并提供自定义选项,专注于相关资源、结构框架和经验报告。受最近发表的[Plan-and-Solve](https://arxiv.org/abs/2305.04091) 和[RAG](https://arxiv.org/abs/2005.11401) 论文的启发,GPT Researcher 解决了速度、确定性和可靠性等问题,通过并行化的代理运行,而不是同步操作,提供了更稳定的性能和更高的速度。 + +**我们的使命是利用人工智能的力量,为个人和组织提供准确、客观和事实的信息。** + +## 为什么选择GPT Researcher? + +- 因为人工研究任务形成客观结论可能需要时间和经历,有时甚至需要数周才能找到正确的资源和信息。 +- 目前的LLM是根据历史和过时的信息进行训练的,存在严重的幻觉风险,因此几乎无法胜任研究任务。 +- 网络搜索的解决方案(例如 ChatGPT + Web 插件)仅考虑有限的资源和内容,在某些情况下会导致肤浅的结论或不客观的答案。 +- 只使用部分资源可能会在确定研究问题或任务的正确结论时产生偏差。 + +## 架构 +主要思想是运行“**计划者**”和“**执行**”代理,而**计划者**生成问题进行研究,“**执行**”代理根据每个生成的研究问题寻找最相关的信息。最后,“**计划者**”过滤和聚合所有相关信息并创建研究报告。

+代理同时利用 gpt-40-mini 和 gpt-4o(128K 上下文)来完成一项研究任务。我们仅在必要时使用这两种方法对成本进行优化。**研究任务平均耗时约 3 分钟,成本约为 ~0.1 美元**。 + +
+ +
+ + +详细说明: +* 根据研究搜索或任务创建特定领域的代理。 +* 生成一组研究问题,这些问题共同形成答案对任何给定任务的客观意见。 +* 针对每个研究问题,触发一个爬虫代理,从在线资源中搜索与给定任务相关的信息。 +* 对于每一个抓取的资源,根据相关信息进行汇总,并跟踪其来源。 +* 最后,对所有汇总的资料来源进行过滤和汇总,并生成最终研究报告。 + +## 演示 +https://github.com/assafelovic/gpt-researcher/assets/13554167/a00c89a6-a295-4dd0-b58d-098a31c40fda + +## 教程 + - [运行原理](https://docs.gptr.dev/blog/building-gpt-researcher) + - [如何安装](https://www.loom.com/share/04ebffb6ed2a4520a27c3e3addcdde20?sid=da1848e8-b1f1-42d1-93c3-5b0b9c3b24ea) + - [现场演示](https://www.loom.com/share/6a3385db4e8747a1913dd85a7834846f?sid=a740fd5b-2aa3-457e-8fb7-86976f59f9b8) + +## 特性 +- 📝 生成研究问题、大纲、资源和课题报告 +- 🌐 每项研究汇总超过20个网络资源,形成客观和真实的结论 +- 🖥️ 包括易于使用的web界面 (HTML/CSS/JS) +- 🔍 支持JavaScript网络资源抓取功能 +- 📂 追踪访问过和使用过的网络资源和来源 +- 📄 将研究报告导出为PDF或其他格式... + +## 📖 文档 + +请参阅[此处](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started),了解完整文档: + +- 入门(安装、设置环境、简单示例) +- 操作示例(演示、集成、docker 支持) +- 参考资料(API完整文档) +- Tavily 应用程序接口集成(核心概念的高级解释) + +## 快速开始 +> **步骤 0** - 安装 Python 3.11 或更高版本。[参见此处](https://www.tutorialsteacher.com/python/install-python) 获取详细指南。 + +
+ +> **步骤 1** - 下载项目 + +```bash +$ git clone https://github.com/assafelovic/gpt-researcher.git +$ cd gpt-researcher +``` + +
+ +> **步骤2** -安装依赖项 +```bash +$ pip install -r requirements.txt +``` +
+ +> **第 3 步** - 使用 OpenAI 密钥和 Tavily API 密钥创建 .env 文件,或直接导出该文件 + +```bash +$ export OPENAI_API_KEY={Your OpenAI API Key here} +``` +```bash +$ export TAVILY_API_KEY={Your Tavily API Key here} +``` + +- **LLM,我们推荐使用 [OpenAI GPT](https://platform.openai.com/docs/guides/gpt)**,但您也可以使用 [Langchain Adapter](https://python.langchain.com/docs/guides/adapters/openai) 支持的任何其他 LLM 模型(包括开源),只需在 config/config.py 中更改 llm 模型和提供者即可。请按照 [这份指南](https://python.langchain.com/docs/integrations/llms/) 学习如何将 LLM 与 Langchain 集成。 +- **对于搜索引擎,我们推荐使用 [Tavily Search API](https://app.tavily.com)(已针对 LLM 进行优化)**,但您也可以选择其他搜索引擎,只需将 config/config.py 中的搜索提供程序更改为 "duckduckgo"、"googleAPI"、"searchapi"、"googleSerp "或 "searx "即可。然后在 config.py 文件中添加相应的 env API 密钥。 +- **我们强烈建议使用 [OpenAI GPT](https://platform.openai.com/docs/guides/gpt) 模型和 [Tavily Search API](https://app.tavily.com) 以获得最佳性能。** +
+ +> **第 4 步** - 使用 FastAPI 运行代理 + +```bash +$ uvicorn main:app --reload +``` +
+ +> **第 5 步** - 在任何浏览器上访问 http://localhost:8000,享受研究乐趣! + +要了解如何开始使用 Docker 或了解有关功能和服务的更多信息,请访问 [documentation](https://docs.gptr.dev) 页面。 + +## 🚀 贡献 +我们非常欢迎您的贡献!如果您感兴趣,请查看 [contributing](CONTRIBUTING.md)。 + +如果您有兴趣加入我们的任务,请查看我们的 [路线图](https://trello.com/b/3O7KBePw/gpt-researcher-roadmap) 页面,并通过我们的 [Discord 社区](https://discord.gg/QgZXvJAccX) 联系我们。 + +## ✉️ 支持 / 联系我们 +- [社区讨论区](https://discord.gg/spBgZmm3Xe) +- 我们的邮箱: support@tavily.com + +## 🛡 免责声明 + +本项目 "GPT Researcher "是一个实验性应用程序,按 "现状 "提供,不做任何明示或暗示的保证。我们根据 MIT 许可分享用于学术目的的代码。本文不提供任何学术建议,也不建议在学术或研究论文中使用。 + +我们对客观研究主张的看法: +1. 我们抓取系统的全部目的是减少不正确的事实。如何解决?我们抓取的网站越多,错误数据的可能性就越小。我们每项研究都会收集20条信息,它们全部错误的可能性极低。 +2. 我们的目标不是消除偏见,而是尽可能减少偏见。**作为一个社区,我们在这里探索最有效的人机互动**。 +3. 在研究过程中,人们也容易产生偏见,因为大多数人对自己研究的课题都有自己的看法。这个工具可以搜罗到许多观点,并均匀地解释各种不同的观点,而有偏见的人是绝对读不到这些观点的。 + +**请注意,使用 GPT-4 语言模型可能会因使用令牌而产生高昂费用**。使用本项目即表示您承认有责任监控和管理自己的令牌使用情况及相关费用。强烈建议您定期检查 OpenAI API 的使用情况,并设置任何必要的限制或警报,以防止发生意外费用。 + +--- + +

+ + + + + Star History Chart + + +

diff --git a/systems/research/gpt-researcher/README.md b/systems/research/gpt-researcher/README.md new file mode 100644 index 0000000..db65b10 --- /dev/null +++ b/systems/research/gpt-researcher/README.md @@ -0,0 +1,241 @@ +
+ +Logo + +#### + +[![Website](https://img.shields.io/badge/Official%20Website-gptr.dev-teal?style=for-the-badge&logo=world&logoColor=white&color=0891b2)](https://gptr.dev) +[![Documentation](https://img.shields.io/badge/Documentation-DOCS-f472b6?logo=googledocs&logoColor=white&style=for-the-badge)](https://docs.gptr.dev) +[![Discord Follow](https://dcbadge.vercel.app/api/server/QgZXvJAccX?style=for-the-badge&theme=clean-inverted&?compact=true)](https://discord.gg/QgZXvJAccX) + +[![PyPI version](https://img.shields.io/pypi/v/gpt-researcher?logo=pypi&logoColor=white&style=flat)](https://badge.fury.io/py/gpt-researcher) +![GitHub Release](https://img.shields.io/github/v/release/assafelovic/gpt-researcher?style=flat&logo=github) +[![Open In Colab](https://img.shields.io/static/v1?message=Open%20in%20Colab&logo=googlecolab&labelColor=grey&color=yellow&label=%20&style=flat&logoSize=40)](https://colab.research.google.com/github/assafelovic/gpt-researcher/blob/master/docs/docs/examples/pip-run.ipynb) +[![Docker Image Version](https://img.shields.io/docker/v/elestio/gpt-researcher/latest?arch=amd64&style=flat&logo=docker&logoColor=white&color=1D63ED)](https://hub.docker.com/r/gptresearcher/gpt-researcher) +[![Twitter Follow](https://img.shields.io/twitter/follow/assaf_elovic?style=social)](https://twitter.com/assaf_elovic) + +[English](README.md) | [中文](README-zh_CN.md) | [日本語](README-ja_JP.md) | [한국어](README-ko_KR.md) + +
+ +# 🔎 GPT Researcher + +**GPT Researcher is an open deep research agent designed for both web and local research on any given task.** + +The agent produces detailed, factual, and unbiased research reports with citations. GPT Researcher provides a full suite of customization options to create tailor made and domain specific research agents. Inspired by the recent [Plan-and-Solve](https://arxiv.org/abs/2305.04091) and [RAG](https://arxiv.org/abs/2005.11401) papers, GPT Researcher addresses misinformation, speed, determinism, and reliability by offering stable performance and increased speed through parallelized agent work. + +**Our mission is to empower individuals and organizations with accurate, unbiased, and factual information through AI.** + +## Why GPT Researcher? + +- Objective conclusions for manual research can take weeks, requiring vast resources and time. +- LLMs trained on outdated information can hallucinate, becoming irrelevant for current research tasks. +- Current LLMs have token limitations, insufficient for generating long research reports. +- Limited web sources in existing services lead to misinformation and shallow results. +- Selective web sources can introduce bias into research tasks. + +## Demo +https://github.com/user-attachments/assets/2cc38f6a-9f66-4644-9e69-a46c40e296d4 + +## Architecture + +The core idea is to utilize 'planner' and 'execution' agents. The planner generates research questions, while the execution agents gather relevant information. The publisher then aggregates all findings into a comprehensive report. + +
+ +
+ +Steps: +* Create a task-specific agent based on a research query. +* Generate questions that collectively form an objective opinion on the task. +* Use a crawler agent for gathering information for each question. +* Summarize and source-track each resource. +* Filter and aggregate summaries into a final research report. + +## Tutorials + - [How it Works](https://docs.gptr.dev/blog/building-gpt-researcher) + - [How to Install](https://www.loom.com/share/04ebffb6ed2a4520a27c3e3addcdde20?sid=da1848e8-b1f1-42d1-93c3-5b0b9c3b24ea) + - [Live Demo](https://www.loom.com/share/6a3385db4e8747a1913dd85a7834846f?sid=a740fd5b-2aa3-457e-8fb7-86976f59f9b8) + +## Features + +- 📝 Generate detailed research reports using web and local documents. +- 🖼️ Smart image scraping and filtering for reports. +- 📜 Generate detailed reports exceeding 2,000 words. +- 🌐 Aggregate over 20 sources for objective conclusions. +- 🖥️ Frontend available in lightweight (HTML/CSS/JS) and production-ready (NextJS + Tailwind) versions. +- 🔍 JavaScript-enabled web scraping. +- 📂 Maintains memory and context throughout research. +- 📄 Export reports to PDF, Word, and other formats. + +## ✨ Deep Research + +GPT Researcher now includes Deep Research - an advanced recursive research workflow that explores topics with agentic depth and breadth. This feature employs a tree-like exploration pattern, diving deeper into subtopics while maintaining a comprehensive view of the research subject. + +- 🌳 Tree-like exploration with configurable depth and breadth +- ⚡️ Concurrent processing for faster results +- 🤝 Smart context management across research branches +- ⏱️ Takes ~5 minutes per deep research +- 💰 Costs ~$0.4 per research (using `o3-mini` on "high" reasoning effort) + +[Learn more about Deep Research](https://docs.gptr.dev/docs/gpt-researcher/gptr/deep_research) in our documentation. + +## 📖 Documentation + +See the [Documentation](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started) for: +- Installation and setup guides +- Configuration and customization options +- How-To examples +- Full API references + +## ⚙️ Getting Started + +### Installation + +1. Install Python 3.11 or later. [Guide](https://www.tutorialsteacher.com/python/install-python). +2. Clone the project and navigate to the directory: + + ```bash + git clone https://github.com/assafelovic/gpt-researcher.git + cd gpt-researcher + ``` + +3. Set up API keys by exporting them or storing them in a `.env` file. + + ```bash + export OPENAI_API_KEY={Your OpenAI API Key here} + export TAVILY_API_KEY={Your Tavily API Key here} + ``` + +4. Install dependencies and start the server: + + ```bash + pip install -r requirements.txt + python -m uvicorn main:app --reload + ``` + +Visit [http://localhost:8000](http://localhost:8000) to start. + +For other setups (e.g., Poetry or virtual environments), check the [Getting Started page](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started). + +## Run as PIP package +```bash +pip install gpt-researcher + +``` +### Example Usage: +```python +... +from gpt_researcher import GPTResearcher + +query = "why is Nvidia stock going up?" +researcher = GPTResearcher(query=query, report_type="research_report") +# Conduct research on the given query +research_result = await researcher.conduct_research() +# Write the report +report = await researcher.write_report() +... +``` + +**For more examples and configurations, please refer to the [PIP documentation](https://docs.gptr.dev/docs/gpt-researcher/gptr/pip-package) page.** + + +## Run with Docker + +> **Step 1** - [Install Docker](https://docs.gptr.dev/docs/gpt-researcher/getting-started/getting-started-with-docker) + +> **Step 2** - Clone the '.env.example' file, add your API Keys to the cloned file and save the file as '.env' + +> **Step 3** - Within the docker-compose file comment out services that you don't want to run with Docker. + +```bash +docker-compose up --build +``` + +If that doesn't work, try running it without the dash: +```bash +docker compose up --build +``` + +> **Step 4** - By default, if you haven't uncommented anything in your docker-compose file, this flow will start 2 processes: + - the Python server running on localhost:8000
+ - the React app running on localhost:3000
+ +Visit localhost:3000 on any browser and enjoy researching! + + +## 📄 Research on Local Documents + +You can instruct the GPT Researcher to run research tasks based on your local documents. Currently supported file formats are: PDF, plain text, CSV, Excel, Markdown, PowerPoint, and Word documents. + +Step 1: Add the env variable `DOC_PATH` pointing to the folder where your documents are located. + +```bash +export DOC_PATH="./my-docs" +``` + +Step 2: + - If you're running the frontend app on localhost:8000, simply select "My Documents" from the "Report Source" Dropdown Options. + - If you're running GPT Researcher with the [PIP package](https://docs.tavily.com/guides/gpt-researcher/gpt-researcher#pip-package), pass the `report_source` argument as "local" when you instantiate the `GPTResearcher` class [code sample here](https://docs.gptr.dev/docs/gpt-researcher/context/tailored-research). + + +## 👪 Multi-Agent Assistant +As AI evolves from prompt engineering and RAG to multi-agent systems, we're excited to introduce our new multi-agent assistant built with [LangGraph](https://python.langchain.com/v0.1/docs/langgraph/). + +By using LangGraph, the research process can be significantly improved in depth and quality by leveraging multiple agents with specialized skills. Inspired by the recent [STORM](https://arxiv.org/abs/2402.14207) paper, this project showcases how a team of AI agents can work together to conduct research on a given topic, from planning to publication. + +An average run generates a 5-6 page research report in multiple formats such as PDF, Docx and Markdown. + +Check it out [here](https://github.com/assafelovic/gpt-researcher/tree/master/multi_agents) or head over to our [documentation](https://docs.gptr.dev/docs/gpt-researcher/multi_agents/langgraph) for more information. + +## 🖥️ Frontend Applications + +GPT-Researcher now features an enhanced frontend to improve the user experience and streamline the research process. The frontend offers: + +- An intuitive interface for inputting research queries +- Real-time progress tracking of research tasks +- Interactive display of research findings +- Customizable settings for tailored research experiences + +Two deployment options are available: +1. A lightweight static frontend served by FastAPI +2. A feature-rich NextJS application for advanced functionality + +For detailed setup instructions and more information about the frontend features, please visit our [documentation page](https://docs.gptr.dev/docs/gpt-researcher/frontend/introduction). + +## 🚀 Contributing +We highly welcome contributions! Please check out [contributing](https://github.com/assafelovic/gpt-researcher/blob/master/CONTRIBUTING.md) if you're interested. + +Please check out our [roadmap](https://trello.com/b/3O7KBePw/gpt-researcher-roadmap) page and reach out to us via our [Discord community](https://discord.gg/QgZXvJAccX) if you're interested in joining our mission. + + + +## ✉️ Support / Contact us +- [Community Discord](https://discord.gg/spBgZmm3Xe) +- Author Email: assaf.elovic@gmail.com + +## 🛡 Disclaimer + +This project, GPT Researcher, is an experimental application and is provided "as-is" without any warranty, express or implied. We are sharing codes for academic purposes under the Apache 2 license. Nothing herein is academic advice, and NOT a recommendation to use in academic or research papers. + +Our view on unbiased research claims: +1. The main goal of GPT Researcher is to reduce incorrect and biased facts. How? We assume that the more sites we scrape the less chances of incorrect data. By scraping multiple sites per research, and choosing the most frequent information, the chances that they are all wrong is extremely low. +2. We do not aim to eliminate biases; we aim to reduce it as much as possible. **We are here as a community to figure out the most effective human/llm interactions.** +3. In research, people also tend towards biases as most have already opinions on the topics they research about. This tool scrapes many opinions and will evenly explain diverse views that a biased person would never have read. + +--- + +

+ + + + + Star History Chart + + +

+ + +

+ ⬆️ Back to Top +

diff --git a/systems/research/gpt-researcher/backend/__init__.py b/systems/research/gpt-researcher/backend/__init__.py new file mode 100644 index 0000000..870e956 --- /dev/null +++ b/systems/research/gpt-researcher/backend/__init__.py @@ -0,0 +1 @@ +from multi_agents import agents \ No newline at end of file diff --git a/systems/research/gpt-researcher/backend/chat/__init__.py b/systems/research/gpt-researcher/backend/chat/__init__.py new file mode 100644 index 0000000..00c51a2 --- /dev/null +++ b/systems/research/gpt-researcher/backend/chat/__init__.py @@ -0,0 +1 @@ +from .chat import ChatAgentWithMemory \ No newline at end of file diff --git a/systems/research/gpt-researcher/backend/chat/chat.py b/systems/research/gpt-researcher/backend/chat/chat.py new file mode 100644 index 0000000..b7e3ed7 --- /dev/null +++ b/systems/research/gpt-researcher/backend/chat/chat.py @@ -0,0 +1,106 @@ +from fastapi import WebSocket +import uuid + +from gpt_researcher.utils.llm import get_llm +from gpt_researcher.memory import Memory +from gpt_researcher.config.config import Config + +from langgraph.prebuilt import create_react_agent +from langgraph.checkpoint.memory import MemorySaver + +from langchain_community.vectorstores import InMemoryVectorStore +from langchain.text_splitter import RecursiveCharacterTextSplitter +from langchain.tools import Tool, tool + +class ChatAgentWithMemory: + def __init__( + self, + report: str, + config_path, + headers, + vector_store = None + ): + self.report = report + self.headers = headers + self.config = Config(config_path) + self.vector_store = vector_store + self.graph = self.create_agent() + + def create_agent(self): + """Create React Agent Graph""" + cfg = Config() + + # Retrieve LLM using get_llm with settings from config + provider = get_llm( + llm_provider=cfg.smart_llm_provider, + model=cfg.smart_llm_model, + temperature=0.35, + max_tokens=cfg.smart_token_limit, + **self.config.llm_kwargs + ).llm + + # If vector_store is not initialized, process documents and add to vector_store + if not self.vector_store: + documents = self._process_document(self.report) + self.chat_config = {"configurable": {"thread_id": str(uuid.uuid4())}} + self.embedding = Memory( + cfg.embedding_provider, + cfg.embedding_model, + **cfg.embedding_kwargs + ).get_embeddings() + self.vector_store = InMemoryVectorStore(self.embedding) + self.vector_store.add_texts(documents) + + # Create the React Agent Graph with the configured provider + graph = create_react_agent( + provider, + tools=[self.vector_store_tool(self.vector_store)], + checkpointer=MemorySaver() + ) + + return graph + + def vector_store_tool(self, vector_store) -> Tool: + """Create Vector Store Tool""" + @tool + def retrieve_info(query): + """ + Consult the report for relevant contexts whenever you don't know something + """ + retriever = vector_store.as_retriever(k = 4) + return retriever.invoke(query) + return retrieve_info + + def _process_document(self, report): + """Split Report into Chunks""" + text_splitter = RecursiveCharacterTextSplitter( + chunk_size=1024, + chunk_overlap=20, + length_function=len, + is_separator_regex=False, + ) + documents = text_splitter.split_text(report) + return documents + + async def chat(self, message, websocket): + """Chat with React Agent""" + message = f""" + You are GPT Researcher, a autonomous research agent created by an open source community at https://github.com/assafelovic/gpt-researcher, homepage: https://gptr.dev. + To learn more about GPT Researcher you can suggest to check out: https://docs.gptr.dev. + + This is a chat message between the user and you: GPT Researcher. + The chat is about a research reports that you created. Answer based on the given context and report. + You must include citations to your answer based on the report. + + Report: {self.report} + User Message: {message} + """ + inputs = {"messages": [("user", message)]} + response = await self.graph.ainvoke(inputs, config=self.chat_config) + ai_message = response["messages"][-1].content + if websocket is not None: + await websocket.send_json({"type": "chat", "content": ai_message}) + + def get_context(self): + """return the current context of the chat""" + return self.report diff --git a/systems/research/gpt-researcher/backend/memory/__init__.py b/systems/research/gpt-researcher/backend/memory/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/systems/research/gpt-researcher/backend/memory/draft.py b/systems/research/gpt-researcher/backend/memory/draft.py new file mode 100644 index 0000000..ff78837 --- /dev/null +++ b/systems/research/gpt-researcher/backend/memory/draft.py @@ -0,0 +1,10 @@ +from typing import TypedDict, List, Annotated +import operator + + +class DraftState(TypedDict): + task: dict + topic: str + draft: dict + review: str + revision_notes: str \ No newline at end of file diff --git a/systems/research/gpt-researcher/backend/memory/research.py b/systems/research/gpt-researcher/backend/memory/research.py new file mode 100644 index 0000000..3835c10 --- /dev/null +++ b/systems/research/gpt-researcher/backend/memory/research.py @@ -0,0 +1,20 @@ +from typing import TypedDict, List, Annotated +import operator + + +class ResearchState(TypedDict): + task: dict + initial_research: str + sections: List[str] + research_data: List[dict] + # Report layout + title: str + headers: dict + date: str + table_of_contents: str + introduction: str + conclusion: str + sources: List[str] + report: str + + diff --git a/systems/research/gpt-researcher/backend/report_type/__init__.py b/systems/research/gpt-researcher/backend/report_type/__init__.py new file mode 100644 index 0000000..fc55264 --- /dev/null +++ b/systems/research/gpt-researcher/backend/report_type/__init__.py @@ -0,0 +1,7 @@ +from .basic_report.basic_report import BasicReport +from .detailed_report.detailed_report import DetailedReport + +__all__ = [ + "BasicReport", + "DetailedReport" +] \ No newline at end of file diff --git a/systems/research/gpt-researcher/backend/report_type/basic_report/__init__.py b/systems/research/gpt-researcher/backend/report_type/basic_report/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/systems/research/gpt-researcher/backend/report_type/basic_report/basic_report.py b/systems/research/gpt-researcher/backend/report_type/basic_report/basic_report.py new file mode 100644 index 0000000..93e0b33 --- /dev/null +++ b/systems/research/gpt-researcher/backend/report_type/basic_report/basic_report.py @@ -0,0 +1,52 @@ +from fastapi import WebSocket +from typing import Any + +from gpt_researcher import GPTResearcher + + +class BasicReport: + def __init__( + self, + query: str, + query_domains: list, + report_type: str, + report_source: str, + source_urls, + document_urls, + tone: Any, + config_path: str, + websocket: WebSocket, + headers=None, + language:str = "english" + ): + self.query = query + self.query_domains = query_domains + self.report_type = report_type + self.report_source = report_source + self.source_urls = source_urls + self.document_urls = document_urls + self.tone = tone + self.config_path = config_path + self.websocket = websocket + self.headers = headers or {} + self.language = language + + # Initialize researcher + self.gpt_researcher = GPTResearcher( + query=self.query, + query_domains=self.query_domains, + report_type=self.report_type, + report_source=self.report_source, + source_urls=self.source_urls, + document_urls=self.document_urls, + tone=self.tone, + config_path=self.config_path, + websocket=self.websocket, + headers=self.headers, + language=self.language + ) + + async def run(self): + await self.gpt_researcher.conduct_research() + report = await self.gpt_researcher.write_report() + return report diff --git a/systems/research/gpt-researcher/backend/report_type/deep_research/README.md b/systems/research/gpt-researcher/backend/report_type/deep_research/README.md new file mode 100644 index 0000000..e2eaba8 --- /dev/null +++ b/systems/research/gpt-researcher/backend/report_type/deep_research/README.md @@ -0,0 +1,129 @@ +# Deep Research ✨ NEW ✨ + +With the latest "Deep Research" trend in the AI community, we're excited to implement our own Open source deep research capability! Introducing GPT Researcher's Deep Research - an advanced recursive research system that explores topics with unprecedented depth and breadth. + +## How It Works + +Deep Research employs a fascinating tree-like exploration pattern: + +1. **Breadth**: At each level, it generates multiple search queries to explore different aspects of your topic +2. **Depth**: For each branch, it recursively dives deeper, following leads and uncovering connections +3. **Concurrent Processing**: Utilizes async/await patterns to run multiple research paths simultaneously +4. **Smart Context Management**: Automatically aggregates and synthesizes findings across all branches +5. **Progress Tracking**: Real-time updates on research progress across both breadth and depth dimensions + +Think of it as deploying a team of AI researchers, each following their own research path while collaborating to build a comprehensive understanding of your topic. + +## Process Flow +![deep research](https://github.com/user-attachments/assets/eba2d94b-bef3-4f8d-bbc0-f15bd0a40968) + + +## Quick Start + +```python +from gpt_researcher import GPTResearcher +from gpt_researcher.utils.enum import ReportType, Tone +import asyncio + +async def main(): + # Initialize researcher with deep research type + researcher = GPTResearcher( + query="What are the latest developments in quantum computing?", + report_type="deep", # This triggers deep research modd + ) + + # Run research + research_data = await researcher.conduct_research() + + # Generate report + report = await researcher.write_report() + print(report) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +## Configuration + +Deep Research behavior can be customized through several parameters: + +- `deep_research_breadth`: Number of parallel research paths at each level (default: 4) +- `deep_research_depth`: How many levels deep to explore (default: 2) +- `deep_research_concurrency`: Maximum number of concurrent research operations (default: 2) + +You can configure these in your config file, pass as environment variables or pass them directly: + +```python +researcher = GPTResearcher( + query="your query", + report_type="deep", + config_path="path/to/config.yaml" # Configure deep research parameters here +) +``` + +## Progress Tracking + +The `on_progress` callback provides real-time insights into the research process: + +```python +class ResearchProgress: + current_depth: int # Current depth level + total_depth: int # Maximum depth to explore + current_breadth: int # Current number of parallel paths + total_breadth: int # Maximum breadth at each level + current_query: str # Currently processing query + completed_queries: int # Number of completed queries + total_queries: int # Total queries to process +``` + +## Advanced Usage + +### Custom Research Flow + +```python +researcher = GPTResearcher( + query="your query", + report_type="deep", + tone=Tone.Objective, + headers={"User-Agent": "your-agent"}, # Custom headers for web requests + verbose=True # Enable detailed logging +) + +# Get raw research context +context = await researcher.conduct_research() + +# Access research sources +sources = researcher.get_research_sources() + +# Get visited URLs +urls = researcher.get_source_urls() + +# Generate formatted report +report = await researcher.write_report() +``` + +### Error Handling + +The deep research system is designed to be resilient: + +- Failed queries are automatically skipped +- Research continues even if some branches fail +- Progress tracking helps identify any issues + +## Best Practices + +1. **Start Broad**: Begin with a general query and let the system explore specifics +2. **Monitor Progress**: Use the progress callback to understand the research flow +3. **Adjust Parameters**: Tune breadth and depth based on your needs: + - More breadth = wider coverage + - More depth = deeper insights +4. **Resource Management**: Consider concurrency limits based on your system capabilities + +## Limitations + +- Usage of reasoning LLM models such as `o3-mini`. This means that permissions for reasoning are required and the overall run will be significantly slower. +- Deep research may take longer than standard research +- Higher API usage and costs due to multiple concurrent queries +- May require more system resources for parallel processing + +Happy researching! 🎉 diff --git a/systems/research/gpt-researcher/backend/report_type/deep_research/__init__.py b/systems/research/gpt-researcher/backend/report_type/deep_research/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/systems/research/gpt-researcher/backend/report_type/deep_research/example.py b/systems/research/gpt-researcher/backend/report_type/deep_research/example.py new file mode 100644 index 0000000..92736c7 --- /dev/null +++ b/systems/research/gpt-researcher/backend/report_type/deep_research/example.py @@ -0,0 +1,324 @@ +from typing import List, Dict, Any, Optional, Set +from fastapi import WebSocket +import asyncio +import logging +from gpt_researcher import GPTResearcher +from gpt_researcher.llm_provider.generic.base import ReasoningEfforts +from gpt_researcher.utils.llm import create_chat_completion +from gpt_researcher.utils.enum import ReportType, ReportSource, Tone + +logger = logging.getLogger(__name__) + +# Constants for models +GPT4_MODEL = "gpt-4o" # For standard tasks +O3_MINI_MODEL = "o3-mini" # For reasoning tasks +LLM_PROVIDER = "openai" + +class ResearchProgress: + def __init__(self, total_depth: int, total_breadth: int): + self.current_depth = total_depth + self.total_depth = total_depth + self.current_breadth = total_breadth + self.total_breadth = total_breadth + self.current_query: Optional[str] = None + self.total_queries = 0 + self.completed_queries = 0 + +class DeepResearch: + def __init__( + self, + query: str, + breadth: int = 4, + depth: int = 2, + websocket: Optional[WebSocket] = None, + tone: Tone = Tone.Objective, + config_path: Optional[str] = None, + headers: Optional[Dict] = None, + concurrency_limit: int = 2 # Match TypeScript version + ): + self.query = query + self.breadth = breadth + self.depth = depth + self.websocket = websocket + self.tone = tone + self.config_path = config_path + self.headers = headers or {} + self.visited_urls: Set[str] = set() + self.learnings: List[str] = [] + self.concurrency_limit = concurrency_limit + + async def generate_feedback(self, query: str, num_questions: int = 3) -> List[str]: + """Generate follow-up questions to clarify research direction""" + messages = [ + {"role": "system", "content": "You are an expert researcher helping to clarify research directions."}, + {"role": "user", "content": f"Given the following query from the user, ask some follow up questions to clarify the research direction. Return a maximum of {num_questions} questions, but feel free to return less if the original query is clear. Format each question on a new line starting with 'Question: ': {query}"} + ] + + response = await create_chat_completion( + messages=messages, + llm_provider=LLM_PROVIDER, + model=O3_MINI_MODEL, # Using reasoning model for better question generation + temperature=0.7, + max_tokens=500, + reasoning_effort=ReasoningEfforts.High.value + ) + + # Parse questions from response + questions = [q.replace('Question:', '').strip() + for q in response.split('\n') + if q.strip().startswith('Question:')] + return questions[:num_questions] + + async def generate_serp_queries(self, query: str, num_queries: int = 3) -> List[Dict[str, str]]: + """Generate SERP queries for research""" + messages = [ + {"role": "system", "content": "You are an expert researcher generating search queries."}, + {"role": "user", "content": f"Given the following prompt, generate {num_queries} unique search queries to research the topic thoroughly. For each query, provide a research goal. Format as 'Query: ' followed by 'Goal: ' for each pair: {query}"} + ] + + response = await create_chat_completion( + messages=messages, + llm_provider=LLM_PROVIDER, + model=GPT4_MODEL, # Using GPT-4 for general task + temperature=0.7, + max_tokens=1000 + ) + + # Parse queries and goals from response + lines = response.split('\n') + queries = [] + current_query = {} + + for line in lines: + line = line.strip() + if line.startswith('Query:'): + if current_query: + queries.append(current_query) + current_query = {'query': line.replace('Query:', '').strip()} + elif line.startswith('Goal:') and current_query: + current_query['researchGoal'] = line.replace('Goal:', '').strip() + + if current_query: + queries.append(current_query) + + return queries[:num_queries] + + async def process_serp_result(self, query: str, context: str, num_learnings: int = 3) -> Dict[str, List[str]]: + """Process research results to extract learnings and follow-up questions""" + messages = [ + {"role": "system", "content": "You are an expert researcher analyzing search results."}, + {"role": "user", "content": f"Given the following research results for the query '{query}', extract key learnings and suggest follow-up questions. For each learning, include a citation to the source URL if available. Format each learning as 'Learning [source_url]: ' and each question as 'Question: ':\n\n{context}"} + ] + + response = await create_chat_completion( + messages=messages, + llm_provider=LLM_PROVIDER, + model=O3_MINI_MODEL, # Using reasoning model for analysis + temperature=0.7, + max_tokens=1000, + reasoning_effort=ReasoningEfforts.High.value + ) + + # Parse learnings and questions with citations + lines = response.split('\n') + learnings = [] + questions = [] + citations = {} + + for line in lines: + line = line.strip() + if line.startswith('Learning'): + # Extract URL if present in square brackets + import re + url_match = re.search(r'\[(.*?)\]:', line) + if url_match: + url = url_match.group(1) + learning = line.split(':', 1)[1].strip() + learnings.append(learning) + citations[learning] = url + else: + learnings.append(line.replace('Learning:', '').strip()) + elif line.startswith('Question:'): + questions.append(line.replace('Question:', '').strip()) + + return { + 'learnings': learnings[:num_learnings], + 'followUpQuestions': questions[:num_learnings], + 'citations': citations + } + + async def deep_research( + self, + query: str, + breadth: int, + depth: int, + learnings: List[str] = None, + citations: Dict[str, str] = None, + visited_urls: Set[str] = None, + on_progress = None + ) -> Dict[str, Any]: + """Conduct deep iterative research""" + if learnings is None: + learnings = [] + if citations is None: + citations = {} + if visited_urls is None: + visited_urls = set() + + progress = ResearchProgress(depth, breadth) + + if on_progress: + on_progress(progress) + + # Generate search queries + serp_queries = await self.generate_serp_queries(query, num_queries=breadth) + progress.total_queries = len(serp_queries) + + all_learnings = learnings.copy() + all_citations = citations.copy() + all_visited_urls = visited_urls.copy() + + # Process queries with concurrency limit + semaphore = asyncio.Semaphore(self.concurrency_limit) + + async def process_query(serp_query: Dict[str, str]) -> Optional[Dict[str, Any]]: + async with semaphore: + try: + progress.current_query = serp_query['query'] + if on_progress: + on_progress(progress) + + # Initialize researcher for this query + researcher = GPTResearcher( + query=serp_query['query'], + report_type=ReportType.ResearchReport.value, + report_source=ReportSource.Web.value, + tone=self.tone, + websocket=self.websocket, + config_path=self.config_path, + headers=self.headers + ) + + # Conduct research + await researcher.conduct_research() + + # Get results + context = researcher.context + visited = set(researcher.visited_urls) + + # Process results + results = await self.process_serp_result( + query=serp_query['query'], + context=context + ) + + # Update progress + progress.completed_queries += 1 + if on_progress: + on_progress(progress) + + return { + 'learnings': results['learnings'], + 'visited_urls': visited, + 'followUpQuestions': results['followUpQuestions'], + 'researchGoal': serp_query['researchGoal'], + 'citations': results['citations'] + } + + except Exception as e: + logger.error(f"Error processing query '{serp_query['query']}': {str(e)}") + return None + + # Process queries concurrently with limit + tasks = [process_query(query) for query in serp_queries] + results = await asyncio.gather(*tasks) + results = [r for r in results if r is not None] # Filter out failed queries + + # Collect all results + for result in results: + all_learnings.extend(result['learnings']) + all_visited_urls.update(set(result['visited_urls'])) + all_citations.update(result['citations']) + + # Continue deeper if needed + if depth > 1: + new_breadth = max(2, breadth // 2) + new_depth = depth - 1 + + # Create next query from research goal and follow-up questions + next_query = f""" + Previous research goal: {result['researchGoal']} + Follow-up questions: {' '.join(result['followUpQuestions'])} + """ + + # Recursive research + deeper_results = await self.deep_research( + query=next_query, + breadth=new_breadth, + depth=new_depth, + learnings=all_learnings, + citations=all_citations, + visited_urls=all_visited_urls, + on_progress=on_progress + ) + + all_learnings = deeper_results['learnings'] + all_visited_urls = set(deeper_results['visited_urls']) + all_citations.update(deeper_results['citations']) + + return { + 'learnings': list(set(all_learnings)), + 'visited_urls': list(all_visited_urls), + 'citations': all_citations + } + + async def run(self, on_progress=None) -> str: + """Run the deep research process and generate final report""" + # Get initial feedback + follow_up_questions = await self.generate_feedback(self.query) + + # Collect answers (this would normally come from user interaction) + answers = ["Automatically proceeding with research"] * len(follow_up_questions) + + # Combine query and Q&A + combined_query = f""" + Initial Query: {self.query} + Follow-up Questions and Answers: + {' '.join([f'Q: {q}\nA: {a}' for q, a in zip(follow_up_questions, answers)])} + """ + + # Run deep research + results = await self.deep_research( + query=combined_query, + breadth=self.breadth, + depth=self.depth, + on_progress=on_progress + ) + + # Generate final report + researcher = GPTResearcher( + query=self.query, + report_type=ReportType.DetailedReport.value, + report_source=ReportSource.Web.value, + tone=self.tone, + websocket=self.websocket, + config_path=self.config_path, + headers=self.headers + ) + + # Prepare context with citations + context_with_citations = [] + for learning in results['learnings']: + citation = results['citations'].get(learning, '') + if citation: + context_with_citations.append(f"{learning} [Source: {citation}]") + else: + context_with_citations.append(learning) + + # Set enhanced context for final report + researcher.context = "\n".join(context_with_citations) + researcher.visited_urls = set(results['visited_urls']) + + # Generate report + report = await researcher.write_report() + return report \ No newline at end of file diff --git a/systems/research/gpt-researcher/backend/report_type/deep_research/main.py b/systems/research/gpt-researcher/backend/report_type/deep_research/main.py new file mode 100644 index 0000000..f9e5f41 --- /dev/null +++ b/systems/research/gpt-researcher/backend/report_type/deep_research/main.py @@ -0,0 +1,33 @@ +from gpt_researcher import GPTResearcher +from backend.utils import write_md_to_pdf +import asyncio + + +async def main(task: str): + # Progress callback + def on_progress(progress): + print(f"Depth: {progress.current_depth}/{progress.total_depth}") + print(f"Breadth: {progress.current_breadth}/{progress.total_breadth}") + print(f"Queries: {progress.completed_queries}/{progress.total_queries}") + if progress.current_query: + print(f"Current query: {progress.current_query}") + + # Initialize researcher with deep research type + researcher = GPTResearcher( + query=task, + report_type="deep", # This will trigger deep research + ) + + # Run research with progress tracking + print("Starting deep research...") + context = await researcher.conduct_research(on_progress=on_progress) + print("\nResearch completed. Generating report...") + + # Generate the final report + report = await researcher.write_report() + await write_md_to_pdf(report, "deep_research_report") + print(f"\nFinal Report: {report}") + +if __name__ == "__main__": + query = "What are the most effective ways for beginners to start investing?" + asyncio.run(main(query)) \ No newline at end of file diff --git a/systems/research/gpt-researcher/backend/report_type/detailed_report/README.md b/systems/research/gpt-researcher/backend/report_type/detailed_report/README.md new file mode 100644 index 0000000..72103c0 --- /dev/null +++ b/systems/research/gpt-researcher/backend/report_type/detailed_report/README.md @@ -0,0 +1,12 @@ +## Detailed Reports + +Introducing long and detailed reports, with a completely new architecture inspired by the latest [STORM](https://arxiv.org/abs/2402.14207) paper. + +In this method we do the following: + +1. Trigger Initial GPT Researcher report based on task +2. Generate subtopics from research summary +3. For each subtopic the headers of the subtopic report are extracted and accumulated +4. For each subtopic a report is generated making sure that any information about the headers accumulated until now are not re-generated. +5. An additional introduction section is written along with a table of contents constructed from the entire report. +6. The final report is constructed by appending these : Intro + Table of contents + Subsection reports \ No newline at end of file diff --git a/systems/research/gpt-researcher/backend/report_type/detailed_report/__init__.py b/systems/research/gpt-researcher/backend/report_type/detailed_report/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/systems/research/gpt-researcher/backend/report_type/detailed_report/detailed_report.py b/systems/research/gpt-researcher/backend/report_type/detailed_report/detailed_report.py new file mode 100644 index 0000000..31c80ad --- /dev/null +++ b/systems/research/gpt-researcher/backend/report_type/detailed_report/detailed_report.py @@ -0,0 +1,151 @@ +import asyncio +from typing import List, Dict, Set, Optional, Any +from fastapi import WebSocket + +from gpt_researcher import GPTResearcher + + +class DetailedReport: + def __init__( + self, + query: str, + report_type: str, + report_source: str, + source_urls: List[str] = [], + document_urls: List[str] = [], + query_domains: List[str] = [], + config_path: str = None, + tone: Any = "", + websocket: WebSocket = None, + subtopics: List[Dict] = [], + headers: Optional[Dict] = None, + complement_source_urls: bool = False, + language: str = "english", + ): + self.query = query + self.report_type = report_type + self.report_source = report_source + self.source_urls = source_urls + self.document_urls = document_urls + self.query_domains = query_domains + self.config_path = config_path + self.tone = tone + self.websocket = websocket + self.subtopics = subtopics + self.headers = headers or {} + self.complement_source_urls = complement_source_urls + self.language = language + self.gpt_researcher = GPTResearcher( + query=self.query, + query_domains=self.query_domains, + report_type="research_report", + report_source=self.report_source, + source_urls=self.source_urls, + document_urls=self.document_urls, + config_path=self.config_path, + tone=self.tone, + websocket=self.websocket, + headers=self.headers, + complement_source_urls=self.complement_source_urls, + language=self.language + ) + self.existing_headers: List[Dict] = [] + self.global_context: List[str] = [] + self.global_written_sections: List[str] = [] + self.global_urls: Set[str] = set( + self.source_urls) if self.source_urls else set() + + async def run(self) -> str: + await self._initial_research() + subtopics = await self._get_all_subtopics() + report_introduction = await self.gpt_researcher.write_introduction() + _, report_body = await self._generate_subtopic_reports(subtopics) + self.gpt_researcher.visited_urls.update(self.global_urls) + report = await self._construct_detailed_report(report_introduction, report_body) + return report + + async def _initial_research(self) -> None: + await self.gpt_researcher.conduct_research() + self.global_context = self.gpt_researcher.context + self.global_urls = self.gpt_researcher.visited_urls + + async def _get_all_subtopics(self) -> List[Dict]: + subtopics_data = await self.gpt_researcher.get_subtopics() + + all_subtopics = [] + if subtopics_data and subtopics_data.subtopics: + for subtopic in subtopics_data.subtopics: + all_subtopics.append({"task": subtopic.task}) + else: + print(f"Unexpected subtopics data format: {subtopics_data}") + + return all_subtopics + + async def _generate_subtopic_reports(self, subtopics: List[Dict]) -> tuple: + subtopic_reports = [] + subtopics_report_body = "" + + for subtopic in subtopics: + result = await self._get_subtopic_report(subtopic) + if result["report"]: + subtopic_reports.append(result) + subtopics_report_body += f"\n\n\n{result['report']}" + + return subtopic_reports, subtopics_report_body + + async def _get_subtopic_report(self, subtopic: Dict) -> Dict[str, str]: + current_subtopic_task = subtopic.get("task") + subtopic_assistant = GPTResearcher( + query=current_subtopic_task, + query_domains=self.query_domains, + report_type="subtopic_report", + report_source=self.report_source, + websocket=self.websocket, + headers=self.headers, + parent_query=self.query, + subtopics=self.subtopics, + visited_urls=self.global_urls, + agent=self.gpt_researcher.agent, + role=self.gpt_researcher.role, + tone=self.tone, + complement_source_urls=self.complement_source_urls, + source_urls=self.source_urls, + language=self.language + ) + + subtopic_assistant.context = list(set(self.global_context)) + await subtopic_assistant.conduct_research() + + draft_section_titles = await subtopic_assistant.get_draft_section_titles(current_subtopic_task) + + if not isinstance(draft_section_titles, str): + draft_section_titles = str(draft_section_titles) + + parse_draft_section_titles = self.gpt_researcher.extract_headers(draft_section_titles) + parse_draft_section_titles_text = [header.get( + "text", "") for header in parse_draft_section_titles] + + relevant_contents = await subtopic_assistant.get_similar_written_contents_by_draft_section_titles( + current_subtopic_task, parse_draft_section_titles_text, self.global_written_sections + ) + + subtopic_report = await subtopic_assistant.write_report(self.existing_headers, relevant_contents) + + self.global_written_sections.extend(self.gpt_researcher.extract_sections(subtopic_report)) + self.global_context = list(set(subtopic_assistant.context)) + self.global_urls.update(subtopic_assistant.visited_urls) + + self.existing_headers.append({ + "subtopic task": current_subtopic_task, + "headers": self.gpt_researcher.extract_headers(subtopic_report), + }) + + return {"topic": subtopic, "report": subtopic_report} + + async def _construct_detailed_report(self, introduction: str, report_body: str) -> str: + toc = self.gpt_researcher.table_of_contents(report_body) + conclusion = await self.gpt_researcher.write_report_conclusion(report_body) + conclusion_with_references = self.gpt_researcher.add_references( + conclusion, self.gpt_researcher.visited_urls) + report = f"{introduction}\n\n{toc}\n\n{report_body}\n\n{conclusion_with_references}" + return report diff --git a/systems/research/gpt-researcher/backend/server/__init__.py b/systems/research/gpt-researcher/backend/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/systems/research/gpt-researcher/backend/server/app.py b/systems/research/gpt-researcher/backend/server/app.py new file mode 100644 index 0000000..ee88636 --- /dev/null +++ b/systems/research/gpt-researcher/backend/server/app.py @@ -0,0 +1,16 @@ +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +import logging + +logger = logging.getLogger(__name__) + +app = FastAPI() + +# Add CORS middleware +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # In production, replace with your frontend domain + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) \ No newline at end of file diff --git a/systems/research/gpt-researcher/backend/server/logging_config.py b/systems/research/gpt-researcher/backend/server/logging_config.py new file mode 100644 index 0000000..ad88044 --- /dev/null +++ b/systems/research/gpt-researcher/backend/server/logging_config.py @@ -0,0 +1,83 @@ +import logging +import json +import os +from datetime import datetime +from pathlib import Path + +class JSONResearchHandler: + def __init__(self, json_file): + self.json_file = json_file + self.research_data = { + "timestamp": datetime.now().isoformat(), + "events": [], + "content": { + "query": "", + "sources": [], + "context": [], + "report": "", + "costs": 0.0 + } + } + + def log_event(self, event_type: str, data: dict): + self.research_data["events"].append({ + "timestamp": datetime.now().isoformat(), + "type": event_type, + "data": data + }) + self._save_json() + + def update_content(self, key: str, value): + self.research_data["content"][key] = value + self._save_json() + + def _save_json(self): + with open(self.json_file, 'w') as f: + json.dump(self.research_data, f, indent=2) + +def setup_research_logging(): + # Create logs directory if it doesn't exist + logs_dir = Path("logs") + logs_dir.mkdir(exist_ok=True) + + # Generate timestamp for log files + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + # Create log file paths + log_file = logs_dir / f"research_{timestamp}.log" + json_file = logs_dir / f"research_{timestamp}.json" + + # Configure file handler for research logs + file_handler = logging.FileHandler(log_file) + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + + # Get research logger and configure it + research_logger = logging.getLogger('research') + research_logger.setLevel(logging.INFO) + + # Remove any existing handlers to avoid duplicates + research_logger.handlers.clear() + + # Add file handler + research_logger.addHandler(file_handler) + + # Add stream handler for console output + console_handler = logging.StreamHandler() + console_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) + research_logger.addHandler(console_handler) + + # Prevent propagation to root logger to avoid duplicate logs + research_logger.propagate = False + + # Create JSON handler + json_handler = JSONResearchHandler(json_file) + + return str(log_file), str(json_file), research_logger, json_handler + +# Create a function to get the logger and JSON handler +def get_research_logger(): + return logging.getLogger('research') + +def get_json_handler(): + return getattr(logging.getLogger('research'), 'json_handler', None) \ No newline at end of file diff --git a/systems/research/gpt-researcher/backend/server/server.py b/systems/research/gpt-researcher/backend/server/server.py new file mode 100644 index 0000000..8204a1c --- /dev/null +++ b/systems/research/gpt-researcher/backend/server/server.py @@ -0,0 +1,204 @@ +import json +import os +from typing import Dict, List +import time + +from fastapi import FastAPI, Request, WebSocket, WebSocketDisconnect, File, UploadFile, BackgroundTasks +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates +from fastapi.responses import FileResponse +from pydantic import BaseModel + +from backend.server.websocket_manager import WebSocketManager +from backend.server.server_utils import ( + get_config_dict, sanitize_filename, + update_environment_variables, handle_file_upload, handle_file_deletion, + execute_multi_agents, handle_websocket_communication +) + +from backend.server.websocket_manager import run_agent +from backend.utils import write_md_to_word, write_md_to_pdf +from gpt_researcher.utils.logging_config import setup_research_logging +from gpt_researcher.utils.enum import Tone + +import logging + +# Get logger instance +logger = logging.getLogger(__name__) + +# Don't override parent logger settings +logger.propagate = True + +logging.basicConfig( + level=logging.INFO, + format="%(asctime)s - %(levelname)s - %(message)s", + handlers=[ + logging.StreamHandler() # Only log to console + ] +) + +# Models + + +class ResearchRequest(BaseModel): + task: str + report_type: str + report_source: str + tone: str + headers: dict | None = None + repo_name: str + branch_name: str + generate_in_background: bool = True + + +class ConfigRequest(BaseModel): + ANTHROPIC_API_KEY: str + TAVILY_API_KEY: str + LANGCHAIN_TRACING_V2: str + LANGCHAIN_API_KEY: str + OPENAI_API_KEY: str + DOC_PATH: str + RETRIEVER: str + GOOGLE_API_KEY: str = '' + GOOGLE_CX_KEY: str = '' + BING_API_KEY: str = '' + SEARCHAPI_API_KEY: str = '' + SERPAPI_API_KEY: str = '' + SERPER_API_KEY: str = '' + SEARX_URL: str = '' + XAI_API_KEY: str + DEEPSEEK_API_KEY: str + + +# App initialization +app = FastAPI() + +# Static files and templates +app.mount("/site", StaticFiles(directory="./frontend"), name="site") +app.mount("/static", StaticFiles(directory="./frontend/static"), name="static") +templates = Jinja2Templates(directory="./frontend") + +# WebSocket manager +manager = WebSocketManager() + +# Middleware +app.add_middleware( + CORSMiddleware, + allow_origins=["http://localhost:3000"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# Constants +DOC_PATH = os.getenv("DOC_PATH", "./my-docs") + +# Startup event + + +@app.on_event("startup") +def startup_event(): + os.makedirs("outputs", exist_ok=True) + app.mount("/outputs", StaticFiles(directory="outputs"), name="outputs") + # os.makedirs(DOC_PATH, exist_ok=True) # Commented out to avoid creating the folder if not needed + + +# Routes + + +@app.get("/") +async def read_root(request: Request): + return templates.TemplateResponse("index.html", {"request": request, "report": None}) + + +@app.get("/report/{research_id}") +async def read_report(request: Request, research_id: str): + docx_path = os.path.join('outputs', f"{research_id}.docx") + if not os.path.exists(docx_path): + return {"message": "Report not found."} + return FileResponse(docx_path) + + +async def write_report(research_request: ResearchRequest, research_id: str = None): + report_information = await run_agent( + task=research_request.task, + report_type=research_request.report_type, + report_source=research_request.report_source, + source_urls=[], + document_urls=[], + tone=Tone[research_request.tone], + websocket=None, + stream_output=None, + headers=research_request.headers, + query_domains=[], + config_path="", + return_researcher=True + ) + + docx_path = await write_md_to_word(report_information[0], research_id) + pdf_path = await write_md_to_pdf(report_information[0], research_id) + if research_request.report_type != "multi_agents": + report, researcher = report_information + response = { + "research_id": research_id, + "research_information": { + "source_urls": researcher.get_source_urls(), + "research_costs": researcher.get_costs(), + "visited_urls": list(researcher.visited_urls), + "research_images": researcher.get_research_images(), + # "research_sources": researcher.get_research_sources(), # Raw content of sources may be very large + }, + "report": report, + "docx_path": docx_path, + "pdf_path": pdf_path + } + else: + response = { "research_id": research_id, "report": "", "docx_path": docx_path, "pdf_path": pdf_path } + + return response + +@app.post("/report/") +async def generate_report(research_request: ResearchRequest, background_tasks: BackgroundTasks): + research_id = sanitize_filename(f"task_{int(time.time())}_{research_request.task}") + + if research_request.generate_in_background: + background_tasks.add_task(write_report, research_request=research_request, research_id=research_id) + return {"message": "Your report is being generated in the background. Please check back later.", + "research_id": research_id} + else: + response = await write_report(research_request, research_id) + return response + + +@app.get("/files/") +async def list_files(): + if not os.path.exists(DOC_PATH): + os.makedirs(DOC_PATH, exist_ok=True) + files = os.listdir(DOC_PATH) + print(f"Files in {DOC_PATH}: {files}") + return {"files": files} + + +@app.post("/api/multi_agents") +async def run_multi_agents(): + return await execute_multi_agents(manager) + + +@app.post("/upload/") +async def upload_file(file: UploadFile = File(...)): + return await handle_file_upload(file, DOC_PATH) + + +@app.delete("/files/{filename}") +async def delete_file(filename: str): + return await handle_file_deletion(filename, DOC_PATH) + + +@app.websocket("/ws") +async def websocket_endpoint(websocket: WebSocket): + await manager.connect(websocket) + try: + await handle_websocket_communication(websocket, manager) + except WebSocketDisconnect: + await manager.disconnect(websocket) diff --git a/systems/research/gpt-researcher/backend/server/server_utils.py b/systems/research/gpt-researcher/backend/server/server_utils.py new file mode 100644 index 0000000..7b14677 --- /dev/null +++ b/systems/research/gpt-researcher/backend/server/server_utils.py @@ -0,0 +1,320 @@ +import asyncio +import json +import os +import re +import time +import shutil +import traceback +from typing import Awaitable, Dict, List, Any +from fastapi.responses import JSONResponse, FileResponse +from gpt_researcher.document.document import DocumentLoader +from gpt_researcher import GPTResearcher +from backend.utils import write_md_to_pdf, write_md_to_word, write_text_to_md +from pathlib import Path +from datetime import datetime +from fastapi import HTTPException +import logging + +logging.basicConfig(level=logging.DEBUG) +logger = logging.getLogger(__name__) + +class CustomLogsHandler: + """Custom handler to capture streaming logs from the research process""" + def __init__(self, websocket, task: str): + self.logs = [] + self.websocket = websocket + sanitized_filename = sanitize_filename(f"task_{int(time.time())}_{task}") + self.log_file = os.path.join("outputs", f"{sanitized_filename}.json") + self.timestamp = datetime.now().isoformat() + # Initialize log file with metadata + os.makedirs("outputs", exist_ok=True) + with open(self.log_file, 'w') as f: + json.dump({ + "timestamp": self.timestamp, + "events": [], + "content": { + "query": "", + "sources": [], + "context": [], + "report": "", + "costs": 0.0 + } + }, f, indent=2) + + async def send_json(self, data: Dict[str, Any]) -> None: + """Store log data and send to websocket""" + # Send to websocket for real-time display + if self.websocket: + await self.websocket.send_json(data) + + # Read current log file + with open(self.log_file, 'r') as f: + log_data = json.load(f) + + # Update appropriate section based on data type + if data.get('type') == 'logs': + log_data['events'].append({ + "timestamp": datetime.now().isoformat(), + "type": "event", + "data": data + }) + else: + # Update content section for other types of data + log_data['content'].update(data) + + # Save updated log file + with open(self.log_file, 'w') as f: + json.dump(log_data, f, indent=2) + logger.debug(f"Log entry written to: {self.log_file}") + + +class Researcher: + def __init__(self, query: str, report_type: str = "research_report"): + self.query = query + self.report_type = report_type + # Generate unique ID for this research task + self.research_id = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}_{hash(query)}" + # Initialize logs handler with research ID + self.logs_handler = CustomLogsHandler(None, self.research_id) + self.researcher = GPTResearcher( + query=query, + report_type=report_type, + websocket=self.logs_handler + ) + + async def research(self) -> dict: + """Conduct research and return paths to generated files""" + await self.researcher.conduct_research() + report = await self.researcher.write_report() + + # Generate the files + sanitized_filename = sanitize_filename(f"task_{int(time.time())}_{self.query}") + file_paths = await generate_report_files(report, sanitized_filename) + + # Get the JSON log path that was created by CustomLogsHandler + json_relative_path = os.path.relpath(self.logs_handler.log_file) + + return { + "output": { + **file_paths, # Include PDF, DOCX, and MD paths + "json": json_relative_path + } + } + +def sanitize_filename(filename: str) -> str: + # Split into components + prefix, timestamp, *task_parts = filename.split('_') + task = '_'.join(task_parts) + + # Calculate max length for task portion + # 255 - len(os.getcwd()) - len("\\gpt-researcher\\outputs\\") - len("task_") - len(timestamp) - len("_.json") - safety_margin + max_task_length = 255 - len(os.getcwd()) - 24 - 5 - 10 - 6 - 5 # ~189 chars for task + + # Truncate task if needed + truncated_task = task[:max_task_length] if len(task) > max_task_length else task + + # Reassemble and clean the filename + sanitized = f"{prefix}_{timestamp}_{truncated_task}" + return re.sub(r"[^\w\s-]", "", sanitized).strip() + + +async def handle_start_command(websocket, data: str, manager): + json_data = json.loads(data[6:]) + ( + task, + report_type, + source_urls, + document_urls, + tone, + headers, + report_source, + query_domains, + language, + ) = extract_command_data(json_data) + + if not task or not report_type: + print("Error: Missing task or report_type") + return + + # Create logs handler with websocket and task + logs_handler = CustomLogsHandler(websocket, task) + # Initialize log content with query + await logs_handler.send_json({ + "query": task, + "sources": [], + "context": [], + "report": "" + }) + + sanitized_filename = sanitize_filename(f"task_{int(time.time())}_{task}") + + report = await manager.start_streaming( + task, + report_type, + report_source, + source_urls, + document_urls, + tone, + websocket, + headers, + query_domains, + language, + ) + report = str(report) + file_paths = await generate_report_files(report, sanitized_filename) + # Add JSON log path to file_paths + file_paths["json"] = os.path.relpath(logs_handler.log_file) + await send_file_paths(websocket, file_paths) + + +async def handle_human_feedback(data: str): + feedback_data = json.loads(data[14:]) # Remove "human_feedback" prefix + print(f"Received human feedback: {feedback_data}") + # TODO: Add logic to forward the feedback to the appropriate agent or update the research state + +async def handle_chat(websocket, data: str, manager): + json_data = json.loads(data[4:]) + print(f"Received chat message: {json_data.get('message')}") + await manager.chat(json_data.get("message"), websocket) + +async def generate_report_files(report: str, filename: str) -> Dict[str, str]: + pdf_path = await write_md_to_pdf(report, filename) + docx_path = await write_md_to_word(report, filename) + md_path = await write_text_to_md(report, filename) + return {"pdf": pdf_path, "docx": docx_path, "md": md_path} + + +async def send_file_paths(websocket, file_paths: Dict[str, str]): + await websocket.send_json({"type": "path", "output": file_paths}) + + +def get_config_dict( + langchain_api_key: str, openai_api_key: str, tavily_api_key: str, + google_api_key: str, google_cx_key: str, bing_api_key: str, + searchapi_api_key: str, serpapi_api_key: str, serper_api_key: str, searx_url: str +) -> Dict[str, str]: + return { + "LANGCHAIN_API_KEY": langchain_api_key or os.getenv("LANGCHAIN_API_KEY", ""), + "OPENAI_API_KEY": openai_api_key or os.getenv("OPENAI_API_KEY", ""), + "TAVILY_API_KEY": tavily_api_key or os.getenv("TAVILY_API_KEY", ""), + "GOOGLE_API_KEY": google_api_key or os.getenv("GOOGLE_API_KEY", ""), + "GOOGLE_CX_KEY": google_cx_key or os.getenv("GOOGLE_CX_KEY", ""), + "BING_API_KEY": bing_api_key or os.getenv("BING_API_KEY", ""), + "SEARCHAPI_API_KEY": searchapi_api_key or os.getenv("SEARCHAPI_API_KEY", ""), + "SERPAPI_API_KEY": serpapi_api_key or os.getenv("SERPAPI_API_KEY", ""), + "SERPER_API_KEY": serper_api_key or os.getenv("SERPER_API_KEY", ""), + "SEARX_URL": searx_url or os.getenv("SEARX_URL", ""), + "LANGCHAIN_TRACING_V2": os.getenv("LANGCHAIN_TRACING_V2", "true"), + "DOC_PATH": os.getenv("DOC_PATH", "./my-docs"), + "RETRIEVER": os.getenv("RETRIEVER", ""), + "EMBEDDING_MODEL": os.getenv("OPENAI_EMBEDDING_MODEL", "") + } + + +def update_environment_variables(config: Dict[str, str]): + for key, value in config.items(): + os.environ[key] = value + + +async def handle_file_upload(file, DOC_PATH: str) -> Dict[str, str]: + file_path = os.path.join(DOC_PATH, os.path.basename(file.filename)) + with open(file_path, "wb") as buffer: + shutil.copyfileobj(file.file, buffer) + print(f"File uploaded to {file_path}") + + document_loader = DocumentLoader(DOC_PATH) + await document_loader.load() + + return {"filename": file.filename, "path": file_path} + + +async def handle_file_deletion(filename: str, DOC_PATH: str) -> JSONResponse: + file_path = os.path.join(DOC_PATH, os.path.basename(filename)) + if os.path.exists(file_path): + os.remove(file_path) + print(f"File deleted: {file_path}") + return JSONResponse(content={"message": "File deleted successfully"}) + else: + print(f"File not found: {file_path}") + return JSONResponse(status_code=404, content={"message": "File not found"}) + + +async def execute_multi_agents(manager) -> Any: + websocket = manager.active_connections[0] if manager.active_connections else None + if websocket: + report = await run_research_task("Is AI in a hype cycle?", websocket, stream_output) + return {"report": report} + else: + return JSONResponse(status_code=400, content={"message": "No active WebSocket connection"}) + + +async def handle_websocket_communication(websocket, manager): + running_task: asyncio.Task | None = None + + def run_long_running_task(awaitable: Awaitable) -> asyncio.Task: + async def safe_run(): + try: + await awaitable + except asyncio.CancelledError: + logger.info("Task cancelled.") + raise + except Exception as e: + logger.error(f"Error running task: {e}\n{traceback.format_exc()}") + await websocket.send_json( + { + "type": "logs", + "content": "error", + "output": f"Error: {e}", + } + ) + + return asyncio.create_task(safe_run()) + + try: + while True: + try: + data = await websocket.receive_text() + if data == "ping": + await websocket.send_text("pong") + elif running_task and not running_task.done(): + # discard any new request if a task is already running + logger.warning( + f"Received request while task is already running. Request data preview: {data[: min(20, len(data))]}..." + ) + websocket.send_json( + { + "types": "logs", + "output": "Task already running. Please wait.", + } + ) + elif data.startswith("start"): + running_task = run_long_running_task( + handle_start_command(websocket, data, manager) + ) + elif data.startswith("human_feedback"): + running_task = run_long_running_task(handle_human_feedback(data)) + elif data.startswith("chat"): + running_task = run_long_running_task( + handle_chat(websocket, data, manager) + ) + else: + print("Error: Unknown command or not enough parameters provided.") + except Exception as e: + print(f"WebSocket error: {e}") + break + finally: + if running_task and not running_task.done(): + running_task.cancel() + +def extract_command_data(json_data: Dict) -> tuple: + return ( + json_data.get("task"), + json_data.get("report_type"), + json_data.get("source_urls"), + json_data.get("document_urls"), + json_data.get("tone"), + json_data.get("headers", {}), + json_data.get("report_source"), + json_data.get("query_domains", []), + json_data.get("language") + ) diff --git a/systems/research/gpt-researcher/backend/server/websocket_manager.py b/systems/research/gpt-researcher/backend/server/websocket_manager.py new file mode 100644 index 0000000..8c952a8 --- /dev/null +++ b/systems/research/gpt-researcher/backend/server/websocket_manager.py @@ -0,0 +1,145 @@ +import asyncio +import datetime +from typing import Dict, List + +from fastapi import WebSocket + +from backend.report_type import BasicReport, DetailedReport +from backend.chat import ChatAgentWithMemory + +from gpt_researcher.utils.enum import ReportType, Tone +from multi_agents.main import run_research_task +from gpt_researcher.actions import stream_output # Import stream_output +from backend.server.server_utils import CustomLogsHandler + + +class WebSocketManager: + """Manage websockets""" + + def __init__(self): + """Initialize the WebSocketManager class.""" + self.active_connections: List[WebSocket] = [] + self.sender_tasks: Dict[WebSocket, asyncio.Task] = {} + self.message_queues: Dict[WebSocket, asyncio.Queue] = {} + self.chat_agent = None + + async def start_sender(self, websocket: WebSocket): + """Start the sender task.""" + queue = self.message_queues.get(websocket) + if not queue: + return + + while True: + try: + message = await queue.get() + if message is None: # Shutdown signal + break + + if websocket in self.active_connections: + if message == "ping": + await websocket.send_text("pong") + else: + await websocket.send_text(message) + else: + break + except Exception as e: + print(f"Error in sender task: {e}") + break + + async def connect(self, websocket: WebSocket): + """Connect a websocket.""" + try: + await websocket.accept() + self.active_connections.append(websocket) + self.message_queues[websocket] = asyncio.Queue() + self.sender_tasks[websocket] = asyncio.create_task( + self.start_sender(websocket)) + except Exception as e: + print(f"Error connecting websocket: {e}") + if websocket in self.active_connections: + await self.disconnect(websocket) + + async def disconnect(self, websocket: WebSocket): + """Disconnect a websocket.""" + if websocket in self.active_connections: + self.active_connections.remove(websocket) + if websocket in self.sender_tasks: + self.sender_tasks[websocket].cancel() + await self.message_queues[websocket].put(None) + del self.sender_tasks[websocket] + if websocket in self.message_queues: + del self.message_queues[websocket] + try: + await websocket.close() + except: + pass # Connection might already be closed + + async def start_streaming(self, task, report_type, report_source, source_urls, document_urls, tone, websocket, headers=None, query_domains=[], language="english"): + """Start streaming the output.""" + tone = Tone[tone] + # add customized JSON config file path here + config_path = "default" + report = await run_agent(task, report_type, report_source, source_urls, document_urls, tone, websocket, headers=headers, query_domains=query_domains, config_path=config_path, language=language) + # Create new Chat Agent whenever a new report is written + self.chat_agent = ChatAgentWithMemory(report, config_path, headers) + return report + + async def chat(self, message, websocket): + """Chat with the agent based message diff""" + if self.chat_agent: + await self.chat_agent.chat(message, websocket) + else: + await websocket.send_json({"type": "chat", "content": "Knowledge empty, please run the research first to obtain knowledge"}) + +async def run_agent(task, report_type, report_source, source_urls, document_urls, tone: Tone, websocket, stream_output=stream_output, headers=None, query_domains=[], config_path="", return_researcher=False,language="english"): + """Run the agent.""" + # Create logs handler for this research task + logs_handler = CustomLogsHandler(websocket, task) + + # Initialize researcher based on report type + if report_type == "multi_agents": + report = await run_research_task( + query=task, + websocket=logs_handler, # Use logs_handler instead of raw websocket + stream_output=stream_output, + tone=tone, + headers=headers + ) + report = report.get("report", "") + + elif report_type == ReportType.DetailedReport.value: + researcher = DetailedReport( + query=task, + query_domains=query_domains, + report_type=report_type, + report_source=report_source, + source_urls=source_urls, + document_urls=document_urls, + tone=tone, + config_path=config_path, + websocket=logs_handler, # Use logs_handler instead of raw websocket + headers=headers, + language=language + ) + report = await researcher.run() + + else: + researcher = BasicReport( + query=task, + query_domains=query_domains, + report_type=report_type, + report_source=report_source, + source_urls=source_urls, + document_urls=document_urls, + tone=tone, + config_path=config_path, + websocket=logs_handler, # Use logs_handler instead of raw websocket + headers=headers, + language=language + ) + report = await researcher.run() + + if report_type != "multi_agents" and return_researcher: + return report, researcher.gpt_researcher + else: + return report diff --git a/systems/research/gpt-researcher/backend/utils.py b/systems/research/gpt-researcher/backend/utils.py new file mode 100644 index 0000000..d7bdf92 --- /dev/null +++ b/systems/research/gpt-researcher/backend/utils.py @@ -0,0 +1,92 @@ +import aiofiles +import urllib +import mistune + +async def write_to_file(filename: str, text: str) -> None: + """Asynchronously write text to a file in UTF-8 encoding. + + Args: + filename (str): The filename to write to. + text (str): The text to write. + """ + # Ensure text is a string + if not isinstance(text, str): + text = str(text) + + # Convert text to UTF-8, replacing any problematic characters + text_utf8 = text.encode('utf-8', errors='replace').decode('utf-8') + + async with aiofiles.open(filename, "w", encoding='utf-8') as file: + await file.write(text_utf8) + +async def write_text_to_md(text: str, filename: str = "") -> str: + """Writes text to a Markdown file and returns the file path. + + Args: + text (str): Text to write to the Markdown file. + + Returns: + str: The file path of the generated Markdown file. + """ + file_path = f"outputs/{filename[:60]}.md" + await write_to_file(file_path, text) + return urllib.parse.quote(file_path) + +async def write_md_to_pdf(text: str, filename: str = "") -> str: + """Converts Markdown text to a PDF file and returns the file path. + + Args: + text (str): Markdown text to convert. + + Returns: + str: The encoded file path of the generated PDF. + """ + file_path = f"outputs/{filename[:60]}.pdf" + + try: + from md2pdf.core import md2pdf + md2pdf(file_path, + md_content=text, + # md_file_path=f"{file_path}.md", + css_file_path="./frontend/pdf_styles.css", + base_url=None) + print(f"Report written to {file_path}") + except Exception as e: + print(f"Error in converting Markdown to PDF: {e}") + return "" + + encoded_file_path = urllib.parse.quote(file_path) + return encoded_file_path + +async def write_md_to_word(text: str, filename: str = "") -> str: + """Converts Markdown text to a DOCX file and returns the file path. + + Args: + text (str): Markdown text to convert. + + Returns: + str: The encoded file path of the generated DOCX. + """ + file_path = f"outputs/{filename[:60]}.docx" + + try: + from docx import Document + from htmldocx import HtmlToDocx + # Convert report markdown to HTML + html = mistune.html(text) + # Create a document object + doc = Document() + # Convert the html generated from the report to document format + HtmlToDocx().add_html_to_document(html, doc) + + # Saving the docx document to file_path + doc.save(file_path) + + print(f"Report written to {file_path}") + + encoded_file_path = urllib.parse.quote(file_path) + return encoded_file_path + + except Exception as e: + print(f"Error in converting Markdown to DOCX: {e}") + return "" \ No newline at end of file diff --git a/systems/research/gpt-researcher/citation.cff b/systems/research/gpt-researcher/citation.cff new file mode 100644 index 0000000..a4487e4 --- /dev/null +++ b/systems/research/gpt-researcher/citation.cff @@ -0,0 +1,10 @@ +cff-version: 1.0.0 +message: "If you use this software, please cite it as below." +authors: + - family-names: Elovic + given-names: Assaf +title: gpt-researcher +version: 0.5.4 +date-released: 2023-07-23 +repository-code: https://github.com/assafelovic/gpt-researcher +url: https://gptr.dev \ No newline at end of file diff --git a/systems/research/gpt-researcher/cli.py b/systems/research/gpt-researcher/cli.py new file mode 100644 index 0000000..00dbe86 --- /dev/null +++ b/systems/research/gpt-researcher/cli.py @@ -0,0 +1,155 @@ +""" +Provides a command line interface for the GPTResearcher class. + +Usage: + +```shell +python cli.py "" --report_type --tone --query_domains +``` + +""" +import asyncio +import argparse +from argparse import RawTextHelpFormatter +from uuid import uuid4 +import os + +from dotenv import load_dotenv + +from gpt_researcher import GPTResearcher +from gpt_researcher.utils.enum import ReportType, Tone +from backend.report_type import DetailedReport + +# ============================================================================= +# CLI +# ============================================================================= + +cli = argparse.ArgumentParser( + description="Generate a research report.", + # Enables the use of newlines in the help message + formatter_class=RawTextHelpFormatter) + +# ===================================== +# Arg: Query +# ===================================== + +cli.add_argument( + # Position 0 argument + "query", + type=str, + help="The query to conduct research on.") + +# ===================================== +# Arg: Report Type +# ===================================== + +choices = [report_type.value for report_type in ReportType] + +report_type_descriptions = { + ReportType.ResearchReport.value: "Summary - Short and fast (~2 min)", + ReportType.DetailedReport.value: "Detailed - In depth and longer (~5 min)", + ReportType.ResourceReport.value: "", + ReportType.OutlineReport.value: "", + ReportType.CustomReport.value: "", + ReportType.SubtopicReport.value: "", + ReportType.DeepResearch.value: "Deep Research" +} + +cli.add_argument( + "--report_type", + type=str, + help="The type of report to generate. Options:\n" + "\n".join( + f" {choice}: {report_type_descriptions[choice]}" for choice in choices + ), + # Deserialize ReportType as a List of strings: + choices=choices, + required=True) + +# ===================================== +# Arg: Tone +# ===================================== + +cli.add_argument( + "--tone", + type=str, + help="The tone of the report (optional).", + choices=["objective", "formal", "analytical", "persuasive", "informative", + "explanatory", "descriptive", "critical", "comparative", "speculative", + "reflective", "narrative", "humorous", "optimistic", "pessimistic"], + default="objective" +) + +# ===================================== +# Arg: Query Domains +# ===================================== + +cli.add_argument( + "--query_domains", + type=str, + help="A comma-separated list of domains to search for the query.", + default="" +) + +# ============================================================================= +# Main +# ============================================================================= + +async def main(args): + """ + Conduct research on the given query, generate the report, and write + it as a markdown file to the output directory. + """ + query_domains = args.query_domains.split(",") if args.query_domains else [] + + if args.report_type == 'detailed_report': + detailed_report = DetailedReport( + query=args.query, + query_domains=query_domains, + report_type="research_report", + report_source="web_search", + ) + + report = await detailed_report.run() + else: + # Convert the simple keyword to the full Tone enum value + tone_map = { + "objective": Tone.Objective, + "formal": Tone.Formal, + "analytical": Tone.Analytical, + "persuasive": Tone.Persuasive, + "informative": Tone.Informative, + "explanatory": Tone.Explanatory, + "descriptive": Tone.Descriptive, + "critical": Tone.Critical, + "comparative": Tone.Comparative, + "speculative": Tone.Speculative, + "reflective": Tone.Reflective, + "narrative": Tone.Narrative, + "humorous": Tone.Humorous, + "optimistic": Tone.Optimistic, + "pessimistic": Tone.Pessimistic + } + + researcher = GPTResearcher( + query=args.query, + query_domains=query_domains, + report_type=args.report_type, + tone=tone_map[args.tone] + ) + + await researcher.conduct_research() + + report = await researcher.write_report() + + # Write the report to a file + artifact_filepath = f"outputs/{uuid4()}.md" + os.makedirs("outputs", exist_ok=True) + with open(artifact_filepath, "w") as f: + f.write(report) + + print(f"Report written to '{artifact_filepath}'") + +if __name__ == "__main__": + load_dotenv() + args = cli.parse_args() + asyncio.run(main(args)) diff --git a/systems/research/gpt-researcher/docker-compose.yml b/systems/research/gpt-researcher/docker-compose.yml new file mode 100644 index 0000000..dbd968b --- /dev/null +++ b/systems/research/gpt-researcher/docker-compose.yml @@ -0,0 +1,70 @@ +services: + gpt-researcher: + pull_policy: build + image: gptresearcher/gpt-researcher + build: ./ + environment: + OPENAI_API_KEY: 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 + TAVILY_API_KEY: ${TAVILY_API_KEY} + LANGCHAIN_API_KEY: ${LANGCHAIN_API_KEY} + LOGGING_LEVEL: INFO + volumes: + - ${PWD}/my-docs:/usr/src/app/my-docs:rw + - ${PWD}/outputs:/usr/src/app/outputs:rw + - ${PWD}/logs:/usr/src/app/logs:rw + user: root + restart: always + ports: + - 9000:9000 + + gptr-nextjs: + pull_policy: build + image: gptresearcher/gptr-nextjs + stdin_open: true + environment: + CHOKIDAR_USEPOLLING: "true" + LOGGING_LEVEL: INFO + NEXT_PUBLIC_GA_MEASUREMENT_ID: ${NEXT_PUBLIC_GA_MEASUREMENT_ID} + NEXT_PUBLIC_GPTR_API_URL: ${NEXT_PUBLIC_GPTR_API_URL} + build: + dockerfile: Dockerfile.dev + context: frontend/nextjs + volumes: + - /app/node_modules + - ./frontend/nextjs:/app + - ./frontend/nextjs/.next:/app/.next + - ./outputs:/app/outputs + restart: always + ports: + - 3000:3000 + + gpt-researcher-tests: + image: gptresearcher/gpt-researcher-tests + build: ./ + environment: + OPENAI_API_KEY: ${OPENAI_API_KEY} + TAVILY_API_KEY: ${TAVILY_API_KEY} + LANGCHAIN_API_KEY: ${LANGCHAIN_API_KEY} + LOGGING_LEVEL: INFO + profiles: ["test"] + command: > + /bin/sh -c " + pip install pytest pytest-asyncio faiss-cpu && + python -m pytest tests/report-types.py && + python -m pytest tests/vector-store.py + " + + discord-bot: + build: + context: ./docs/discord-bot + dockerfile: Dockerfile.dev + environment: + - DISCORD_BOT_TOKEN=${DISCORD_BOT_TOKEN} + - DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID} + volumes: + - ./docs/discord-bot:/app + - /app/node_modules + ports: + - 3001:3000 + profiles: ["discord"] + restart: always diff --git a/systems/research/gpt-researcher/docs/CNAME b/systems/research/gpt-researcher/docs/CNAME new file mode 100644 index 0000000..c566187 --- /dev/null +++ b/systems/research/gpt-researcher/docs/CNAME @@ -0,0 +1 @@ +docs.gptr.dev \ No newline at end of file diff --git a/systems/research/gpt-researcher/docs/README.md b/systems/research/gpt-researcher/docs/README.md new file mode 100644 index 0000000..a931c90 --- /dev/null +++ b/systems/research/gpt-researcher/docs/README.md @@ -0,0 +1,31 @@ +# Website + +This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. + +## Prerequisites + +To build and test documentation locally, begin by downloading and installing [Node.js](https://nodejs.org/en/download/), and then installing [Yarn](https://classic.yarnpkg.com/en/). +On Windows, you can install via the npm package manager (npm) which comes bundled with Node.js: + +```console +npm install --global yarn +``` + +## Installation + +```console +pip install pydoc-markdown +cd website +yarn install +``` + +## Local Development + +Navigate to the website folder and run: + +```console +pydoc-markdown +yarn start +``` + +This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. diff --git a/systems/research/gpt-researcher/docs/babel.config.js b/systems/research/gpt-researcher/docs/babel.config.js new file mode 100644 index 0000000..e00595d --- /dev/null +++ b/systems/research/gpt-researcher/docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/systems/research/gpt-researcher/docs/blog/2023-09-22-gpt-researcher/architecture.png b/systems/research/gpt-researcher/docs/blog/2023-09-22-gpt-researcher/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf4a7ea347f0e89c5e2a387358fed637ff1508b GIT binary patch literal 143143 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 z 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

-C~e>nho*wAqukSWUgg^|Ju$&7`2}C>??x;X{ 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

CZ*;^5S(ea}2Y`x3 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 + + + +More specifically: +- Generate an outline of research questions that form an objective opinion on any given task. +- For each research question, trigger a crawler agent that scrapes online resources for information relevant to the given task. +- For each scraped resource, keep track, filter, and summarize only if it includes relevant information. +- Finally, aggregate all summarized sources and generate a final research report. + +### Going forward +The future of online research automation is heading toward a major disruption. As AI continues to improve, it is only a matter of time before AI agents can perform comprehensive research tasks for any of our day-to-day needs. AI research can disrupt areas of finance, legal, academia, health, and retail, reducing our time for each research by 95% while optimizing for factual and unbiased reports within an influx and overload of ever-growing online information. + +Imagine if an AI can eventually understand and analyze any form of online content — videos, images, graphs, tables, reviews, text, audio. And imagine if it could support and analyze hundreds of thousands of words of aggregated information within a single prompt. Even imagine that AI can eventually improve in reasoning and analysis, making it much more suitable for reaching new and innovative research conclusions. And that it can do all that in minutes, if not seconds. + +It’s all a matter of time and what [GPT Researcher](https://github.com/assafelovic/gpt-researcher) is all about. diff --git a/systems/research/gpt-researcher/docs/blog/2023-09-22-gpt-researcher/planner.jpeg b/systems/research/gpt-researcher/docs/blog/2023-09-22-gpt-researcher/planner.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..71dfc095af8b86a10e971bdbed83cb59838e5256 GIT binary patch literal 135677 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 z�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 literal 0 HcmV?d00001 diff --git a/systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/diagram-1.png b/systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/diagram-1.png new file mode 100644 index 0000000000000000000000000000000000000000..31a46a5f9bcafed1360350e1a2a855baac0582f2 GIT binary patch literal 21252 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 L%BbAX_5ObWk$}y6 literal 0 HcmV?d00001 diff --git a/systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/diagram-assistant.jpeg b/systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/diagram-assistant.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f467f5bc75ef46b81a6d4cf804cbd2eb227872f6 GIT binary patch literal 62656 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 aRdq*G_Ty343*Gl3CTd)ME`W4Drv5+3HTLTO literal 0 HcmV?d00001 diff --git a/systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/index.md b/systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/index.md new file mode 100644 index 0000000..fe2e901 --- /dev/null +++ b/systems/research/gpt-researcher/docs/blog/2023-11-12-openai-assistant/index.md @@ -0,0 +1,259 @@ +--- +slug: building-openai-assistant +title: How to build an OpenAI Assistant with Internet access +authors: [assafe] +tags: [tavily, search-api, openai, assistant-api] +--- + +OpenAI has done it again with a [groundbreaking DevDay](https://openai.com/blog/new-models-and-developer-products-announced-at-devday) showcasing some of the latest improvements to the OpenAI suite of tools, products and services. One major release was the new [Assistants API](https://platform.openai.com/docs/assistants/overview) that makes it easier for developers to build their own assistive AI apps that have goals and can call models and tools. + +The new Assistants API currently supports three types of tools: Code Interpreter, Retrieval, and Function calling. Although you might expect the Retrieval tool to support online information retrieval (such as search APIs or as ChatGPT plugins), it only supports raw data for now such as text or CSV files. + +This blog will demonstrate how to leverage the latest Assistants API with online information using the function calling tool. + +To skip the tutorial below, feel free to check out the full [Github Gist here](https://gist.github.com/assafelovic/579822cd42d52d80db1e1c1ff82ffffd). + +At a high level, a typical integration of the Assistants API has the following steps: + +- Create an [Assistant](https://platform.openai.com/docs/api-reference/assistants/createAssistant) in the API by defining its custom instructions and picking a model. If helpful, enable tools like Code Interpreter, Retrieval, and Function calling. +- Create a [Thread](https://platform.openai.com/docs/api-reference/threads) when a user starts a conversation. +- Add [Messages](https://platform.openai.com/docs/api-reference/messages) to the Thread as the user ask questions. +- [Run](https://platform.openai.com/docs/api-reference/runs) the Assistant on the Thread to trigger responses. This automatically calls the relevant tools. + +As you can see below, an Assistant object includes Threads for storing and handling conversation sessions between the assistant and users, and Run for invocation of an Assistant on a Thread. + +![OpenAI Assistant Object](./diagram-assistant.jpeg) + +Let’s go ahead and implement these steps one by one! For the example, we will build a finance GPT that can provide insights about financial questions. We will use the [OpenAI Python SDK v1.2](https://github.com/openai/openai-python/tree/main#installation) and [Tavily Search API](https://tavily.com). + +First things first, let’s define the assistant’s instructions: + +```python +assistant_prompt_instruction = """You are a finance expert. +Your goal is to provide answers based on information from the internet. +You must use the provided Tavily search API function to find relevant online information. +You should never use your own knowledge to answer questions. +Please include relevant url sources in the end of your answers. +""" +``` +Next, let’s finalize step 1 and create an assistant using the latest [GPT-4 Turbo model](https://github.com/openai/openai-python/tree/main#installation) (128K context), and the call function using the [Tavily web search API](https://tavily.com/): + +```python +# Create an assistant +assistant = client.beta.assistants.create( + instructions=assistant_prompt_instruction, + model="gpt-4-1106-preview", + tools=[{ + "type": "function", + "function": { + "name": "tavily_search", + "description": "Get information on recent events from the web.", + "parameters": { + "type": "object", + "properties": { + "query": {"type": "string", "description": "The search query to use. For example: 'Latest news on Nvidia stock performance'"}, + }, + "required": ["query"] + } + } + }] +) +``` + +Step 2+3 are quite straight forward, we’ll initiate a new thread and update it with a user message: + +```python +thread = client.beta.threads.create() +user_input = input("You: ") +message = client.beta.threads.messages.create( + thread_id=thread.id, + role="user", + content=user_input, +) +``` + +Finally, we’ll run the assistant on the thread to trigger the function call and get the response: + +```python +run = client.beta.threads.runs.create( + thread_id=thread.id, + assistant_id=assistant_id, +) +``` + +So far so good! But this is where it gets a bit messy. Unlike with the regular GPT APIs, the Assistants API doesn’t return a synchronous response, but returns a status. This allows for asynchronous operations across assistants, but requires more overhead for fetching statuses and dealing with each manually. + +![Status Diagram](./diagram-1.png) + +To manage this status lifecycle, let’s build a function that can be reused and handles waiting for various statuses (such as ‘requires_action’): + +```python +# Function to wait for a run to complete +def wait_for_run_completion(thread_id, run_id): + while True: + time.sleep(1) + run = client.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run_id) + print(f"Current run status: {run.status}") + if run.status in ['completed', 'failed', 'requires_action']: + return run +``` + +This function will sleep as long as the run has not been finalized such as in cases where it’s completed or requires an action from a function call. + +We’re almost there! Lastly, let’s take care of when the assistant wants to call the web search API: + +```python +# Function to handle tool output submission +def submit_tool_outputs(thread_id, run_id, tools_to_call): + tool_output_array = [] + for tool in tools_to_call: + output = None + tool_call_id = tool.id + function_name = tool.function.name + function_args = tool.function.arguments + + if function_name == "tavily_search": + output = tavily_search(query=json.loads(function_args)["query"]) + + if output: + tool_output_array.append({"tool_call_id": tool_call_id, "output": output}) + + return client.beta.threads.runs.submit_tool_outputs( + thread_id=thread_id, + run_id=run_id, + tool_outputs=tool_output_array + ) +``` + +As seen above, if the assistant has reasoned that a function call should trigger, we extract the given required function params and pass back to the runnable thread. We catch this status and call our functions as seen below: + +```python +if run.status == 'requires_action': + run = submit_tool_outputs(thread.id, run.id, run.required_action.submit_tool_outputs.tool_calls) + run = wait_for_run_completion(thread.id, run.id) +``` + +That’s it! We now have a working OpenAI Assistant that can be used to answer financial questions using real time online information. Below is the full runnable code: + +```python +import os +import json +import time +from openai import OpenAI +from tavily import TavilyClient + +# Initialize clients with API keys +client = OpenAI(api_key=os.environ["OPENAI_API_KEY"]) +tavily_client = TavilyClient(api_key=os.environ["TAVILY_API_KEY"]) + +assistant_prompt_instruction = """You are a finance expert. +Your goal is to provide answers based on information from the internet. +You must use the provided Tavily search API function to find relevant online information. +You should never use your own knowledge to answer questions. +Please include relevant url sources in the end of your answers. +""" + +# Function to perform a Tavily search +def tavily_search(query): + search_result = tavily_client.get_search_context(query, search_depth="advanced", max_tokens=8000) + return search_result + +# Function to wait for a run to complete +def wait_for_run_completion(thread_id, run_id): + while True: + time.sleep(1) + run = client.beta.threads.runs.retrieve(thread_id=thread_id, run_id=run_id) + print(f"Current run status: {run.status}") + if run.status in ['completed', 'failed', 'requires_action']: + return run + +# Function to handle tool output submission +def submit_tool_outputs(thread_id, run_id, tools_to_call): + tool_output_array = [] + for tool in tools_to_call: + output = None + tool_call_id = tool.id + function_name = tool.function.name + function_args = tool.function.arguments + + if function_name == "tavily_search": + output = tavily_search(query=json.loads(function_args)["query"]) + + if output: + tool_output_array.append({"tool_call_id": tool_call_id, "output": output}) + + return client.beta.threads.runs.submit_tool_outputs( + thread_id=thread_id, + run_id=run_id, + tool_outputs=tool_output_array + ) + +# Function to print messages from a thread +def print_messages_from_thread(thread_id): + messages = client.beta.threads.messages.list(thread_id=thread_id) + for msg in messages: + print(f"{msg.role}: {msg.content[0].text.value}") + +# Create an assistant +assistant = client.beta.assistants.create( + instructions=assistant_prompt_instruction, + model="gpt-4-1106-preview", + tools=[{ + "type": "function", + "function": { + "name": "tavily_search", + "description": "Get information on recent events from the web.", + "parameters": { + "type": "object", + "properties": { + "query": {"type": "string", "description": "The search query to use. For example: 'Latest news on Nvidia stock performance'"}, + }, + "required": ["query"] + } + } + }] +) +assistant_id = assistant.id +print(f"Assistant ID: {assistant_id}") + +# Create a thread +thread = client.beta.threads.create() +print(f"Thread: {thread}") + +# Ongoing conversation loop +while True: + user_input = input("You: ") + if user_input.lower() == 'exit': + break + + # Create a message + message = client.beta.threads.messages.create( + thread_id=thread.id, + role="user", + content=user_input, + ) + + # Create a run + run = client.beta.threads.runs.create( + thread_id=thread.id, + assistant_id=assistant_id, + ) + print(f"Run ID: {run.id}") + + # Wait for run to complete + run = wait_for_run_completion(thread.id, run.id) + + if run.status == 'failed': + print(run.error) + continue + elif run.status == 'requires_action': + run = submit_tool_outputs(thread.id, run.id, run.required_action.submit_tool_outputs.tool_calls) + run = wait_for_run_completion(thread.id, run.id) + + # Print messages from the thread + print_messages_from_thread(thread.id) +``` + +The assistant can be further customized and improved using additional retrieval information, OpenAI’s coding interpreter and more. Also, you can go ahead and add more function tools to make the assistant even smarter. + +Feel free to drop a comment below if you have any further questions! diff --git a/systems/research/gpt-researcher/docs/blog/2024-05-19-gptr-langgraph/architecture.jpeg b/systems/research/gpt-researcher/docs/blog/2024-05-19-gptr-langgraph/architecture.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..76f70d482d3bd064d715c5f9133036ba4f5e3d31 GIT binary patch literal 93005 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