Repository: julep-ai/julep
Branch: dev
Commit: 5371a620af25
Files: 984
Total size: 13.1 MB
Directory structure:
gitextract_2v2u36g9/
├── .agentignore
├── .codex/
│ └── setup.sh
├── .github/
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yml
│ │ ├── config.yml
│ │ ├── feature_request.yml
│ │ └── refactor.yml
│ ├── LICENSE
│ ├── README-CN.md
│ ├── README-FR.md
│ ├── README-JA.md
│ ├── SUPPORT.md
│ ├── dependabot.yml
│ └── workflows/
│ ├── bake-push-to-hub.yml
│ ├── bandit-security-check-python-agents-api.yml
│ ├── changelog-ci.yml
│ ├── changelog-sync.yml
│ ├── claude-changelog-pr.yml
│ ├── claude-code-review.yml
│ ├── claude-docs-manual.yml
│ ├── claude-docs-pr.yml
│ ├── claude.yml
│ ├── docker-bake-on-pr.yml
│ ├── doctoc-on-push.yml
│ ├── generate-changelog.yml
│ ├── generate-openapi-code-from-typespec.yml
│ ├── latest-push-to-hub.yml
│ ├── lint-agents-api-pr.yml
│ ├── lint-integrations-service-pr.yml
│ ├── publish-cli-prerelease.yml
│ ├── sync-model-docs.yml
│ ├── test-agents-api-pr.yml
│ ├── test-integrations-service-pr.yml
│ ├── translate-readme.yml
│ └── typecheck-agents-api-pr.yml
├── .gitignore
├── .gitmodules
├── .mcp.json
├── AGENTS.md
├── CHANGELOG.md
├── README.md
├── changelog/
│ ├── Templates/
│ │ ├── JulepCustom/
│ │ │ ├── entries.html
│ │ │ ├── entry.html
│ │ │ ├── footer.html
│ │ │ ├── head.html
│ │ │ ├── header.html
│ │ │ ├── package.json
│ │ │ └── style.css
│ │ └── index-template/
│ │ ├── archives.html
│ │ ├── entries.html
│ │ ├── entry.html
│ │ ├── error.html
│ │ ├── feed.rss
│ │ ├── footer.html
│ │ ├── head.html
│ │ ├── header.html
│ │ ├── home-summary.html
│ │ ├── package.json
│ │ ├── public.html
│ │ ├── robots.txt
│ │ ├── script.js
│ │ ├── search.html
│ │ ├── sitemap.xml
│ │ ├── style.css
│ │ └── tagged.html
│ ├── dev/
│ │ ├── 2025-06-17.md
│ │ ├── 2025-06-23.md
│ │ ├── 2025-06-25.md
│ │ ├── 2025-06-26.md
│ │ ├── 2025-06-30.md
│ │ ├── 2025-07-02.md
│ │ ├── 2025-07-03.md
│ │ ├── 2025-07-04.md
│ │ ├── 2025-07-05.md
│ │ ├── 2025-07-08.md
│ │ ├── 2025-07-09.md
│ │ ├── 2025-07-18.md
│ │ ├── 2025-07-31.md
│ │ ├── 2025-08-06.md
│ │ ├── 2025-08-07.md
│ │ ├── 2025-08-08.md
│ │ └── 2025-08-15.md
│ └── stable (main)/
│ ├── 2025-01-31.md
│ ├── 2025-02-14.md
│ ├── 2025-04-11.md
│ ├── 2025-05-09.md
│ ├── 2025-05-21.md
│ ├── 2025-06-23.md
│ ├── 2025-06-30.md
│ ├── 2025-07-04.md
│ ├── 2025-07-05.md
│ ├── 2025-07-08.md
│ └── 2025-07-18.md
├── cookbooks/
│ ├── IDEAS.md
│ ├── README.md
│ ├── __init__.py
│ ├── advanced/
│ │ ├── 00-Devfest-Email-Assistant.ipynb
│ │ ├── 01-website-crawler.ipynb
│ │ ├── 02-sarcastic-news-headline-generator.ipynb
│ │ ├── 03-trip-planning-assistant.ipynb
│ │ ├── 04-hook-generator-trending-reels.ipynb
│ │ ├── 05-video-processing-with-natural-language.ipynb
│ │ ├── 06-browser-use.ipynb
│ │ ├── 07-personalized-research-assistant.ipynb
│ │ ├── 08-rag-chatbot.ipynb
│ │ ├── 09-companion-agent.ipynb
│ │ ├── 10-reel-generator.ipynb
│ │ └── 11-hacker-news-personalized-generator.ipynb
│ └── basics/
│ ├── 01-Hello-Agent.ipynb
│ ├── 02-Simple-Task.ipynb
│ ├── 03-Adding-Tools.ipynb
│ ├── 04-Parallel-Steps.ipynb
│ └── 05-RAG-and-Docs.ipynb
├── deploy/
│ ├── responses-build-docker-compose.yaml
│ ├── simple-docker-compose.yaml
│ └── standalone-docker-compose.yaml
├── docker-bake.hcl
├── docker-compose.yml
├── documentation/
│ ├── AGENTS.md
│ ├── FAQ.mdx
│ ├── README.md
│ ├── advanced/
│ │ ├── agentic-patterns.mdx
│ │ ├── architecture-deep-dive.mdx
│ │ ├── chat.mdx
│ │ ├── files.mdx
│ │ ├── lifecycle.mdx
│ │ ├── localsetup.mdx
│ │ ├── multi-agent-multi-user-sessions.mdx
│ │ ├── new-syntax.mdx
│ │ ├── python-expression.mdx
│ │ ├── render.mdx
│ │ ├── secrets-management.mdx
│ │ ├── system-templates.mdx
│ │ └── types-of-task-steps.mdx
│ ├── concepts/
│ │ ├── agents.mdx
│ │ ├── docs.mdx
│ │ ├── execution.mdx
│ │ ├── files.mdx
│ │ ├── projects.mdx
│ │ ├── secrets.mdx
│ │ ├── sessions.mdx
│ │ ├── tasks.mdx
│ │ ├── tools.mdx
│ │ └── users.mdx
│ ├── docs.json
│ ├── guides/
│ │ ├── adding-tool-integration.mdx
│ │ ├── advanced/
│ │ │ ├── complex-workflows.mdx
│ │ │ ├── integration-patterns.mdx
│ │ │ └── multi-agent-systems.mdx
│ │ ├── cookbooks/
│ │ │ ├── community-examples.mdx
│ │ │ ├── industry-solutions.mdx
│ │ │ └── quick-solutions.mdx
│ │ ├── getting-started/
│ │ │ ├── chat-with-an-agent.mdx
│ │ │ ├── create-and-execute-julep-task.mdx
│ │ │ └── tool-integration-demo.mdx
│ │ ├── modifying-agent-workflow.mdx
│ │ ├── use-cases/
│ │ │ ├── customer-service.mdx
│ │ │ ├── data-analysis.mdx
│ │ │ ├── document-processing.mdx
│ │ │ └── research-assistant.mdx
│ │ └── using-secrets.mdx
│ ├── integrations/
│ │ ├── communicationdata/
│ │ │ ├── email.mdx
│ │ │ ├── google-sheets.mdx
│ │ │ └── weather.mdx
│ │ ├── contributing-integrations.mdx
│ │ ├── extensibility/
│ │ │ └── mcp.mdx
│ │ ├── mediafile/
│ │ │ ├── cloudinary.mdx
│ │ │ ├── ffmpeg.mdx
│ │ │ ├── llamaparse.mdx
│ │ │ └── unstructured.mdx
│ │ ├── search/
│ │ │ ├── algolia.mdx
│ │ │ ├── arxiv.mdx
│ │ │ ├── brave.mdx
│ │ │ └── wikipedia.mdx
│ │ ├── supported-integrations.mdx
│ │ ├── supported-models.mdx
│ │ └── webbrowser/
│ │ ├── browserbase.mdx
│ │ ├── remote-browser.mdx
│ │ └── spider.mdx
│ ├── introduction/
│ │ ├── developer-orientation.mdx
│ │ ├── install.mdx
│ │ ├── julep.mdx
│ │ └── quickstart.mdx
│ ├── julepcli/
│ │ ├── commands.mdx
│ │ └── introduction.mdx
│ ├── llms.txt
│ ├── responses/
│ │ ├── cli.mdx
│ │ ├── concepts.mdx
│ │ ├── examples.mdx
│ │ ├── quickstart.mdx
│ │ └── roadmap.mdx
│ ├── scripts/
│ │ └── julep-chat-widget.js
│ ├── sdks/
│ │ ├── common/
│ │ │ ├── authentication.mdx
│ │ │ ├── error-handling.mdx
│ │ │ ├── secrets.mdx
│ │ │ └── testing.mdx
│ │ ├── index.mdx
│ │ ├── nodejs/
│ │ │ ├── advanced-usage.mdx
│ │ │ ├── agents.mdx
│ │ │ ├── installation.mdx
│ │ │ ├── reference.mdx
│ │ │ ├── secrets.mdx
│ │ │ ├── sessions.mdx
│ │ │ ├── tasks.mdx
│ │ │ └── tools-integration.mdx
│ │ └── python/
│ │ ├── advanced-usage.mdx
│ │ ├── agents.mdx
│ │ ├── installation.mdx
│ │ ├── reference.mdx
│ │ ├── secrets.mdx
│ │ ├── sessions.mdx
│ │ ├── tasks.mdx
│ │ └── tools-integration.mdx
│ ├── snippets/
│ │ └── integrations-slider.jsx
│ ├── style.css
│ └── tutorials/
│ ├── browser-use.mdx
│ ├── hacker-news-newsletter.mdx
│ ├── julep-assistant.mdx
│ ├── rag-chatbot.mdx
│ ├── trip-planning-input.mdx
│ ├── trip-planning-running.mdx
│ ├── trip-planning-tools.mdx
│ ├── trip-planning-workflow.mdx
│ ├── trip-planning.mdx
│ └── video-processing.mdx
├── ruff.toml
└── src/
├── agents-api/
│ ├── .dockerignore
│ ├── .gitignore
│ ├── .python-version
│ ├── .tool-versions
│ ├── AGENTS.md
│ ├── Dockerfile
│ ├── Dockerfile.worker
│ ├── README.md
│ ├── agents_api/
│ │ ├── __init__.py
│ │ ├── activities/
│ │ │ ├── AGENTS.md
│ │ │ ├── __init__.py
│ │ │ ├── demo.py
│ │ │ ├── execute_api_call.py
│ │ │ ├── execute_integration.py
│ │ │ ├── execute_system.py
│ │ │ ├── logger.py
│ │ │ ├── pg_query_step.py
│ │ │ ├── sync_items_remote.py
│ │ │ ├── task_steps/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── base_evaluate.py
│ │ │ │ ├── get_value_step.py
│ │ │ │ ├── prompt_step.py
│ │ │ │ ├── raise_complete_async.py
│ │ │ │ ├── tool_call_step.py
│ │ │ │ └── transition_step.py
│ │ │ └── tool_executor.py
│ │ ├── app.py
│ │ ├── autogen/
│ │ │ ├── .ignore
│ │ │ ├── AGENTS.md
│ │ │ ├── Agents.py
│ │ │ ├── Chat.py
│ │ │ ├── Common.py
│ │ │ ├── Docs.py
│ │ │ ├── Entries.py
│ │ │ ├── Executions.py
│ │ │ ├── Files.py
│ │ │ ├── Jobs.py
│ │ │ ├── Projects.py
│ │ │ ├── Responses.py
│ │ │ ├── Secrets.py
│ │ │ ├── Sessions.py
│ │ │ ├── Tasks.py
│ │ │ ├── Tools.py
│ │ │ ├── Users.py
│ │ │ ├── __init__.py
│ │ │ └── openapi_model.py
│ │ ├── clients/
│ │ │ ├── AGENTS.md
│ │ │ ├── __init__.py
│ │ │ ├── async_s3.py
│ │ │ ├── feature_flags.py
│ │ │ ├── integrations.py
│ │ │ ├── litellm.py
│ │ │ ├── pg.py
│ │ │ ├── sync_s3.py
│ │ │ └── temporal.py
│ │ ├── common/
│ │ │ ├── AGENTS.md
│ │ │ ├── __init__.py
│ │ │ ├── exceptions/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── agents.py
│ │ │ │ ├── executions.py
│ │ │ │ ├── secrets.py
│ │ │ │ ├── sessions.py
│ │ │ │ ├── tasks.py
│ │ │ │ ├── tools.py
│ │ │ │ ├── users.py
│ │ │ │ └── validation.py
│ │ │ ├── interceptors.py
│ │ │ ├── nlp.py
│ │ │ ├── protocol/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── agents.py
│ │ │ │ ├── developers.py
│ │ │ │ ├── models.py
│ │ │ │ ├── sessions.py
│ │ │ │ ├── state_machine.py
│ │ │ │ └── tasks.py
│ │ │ ├── retry_policies.py
│ │ │ └── utils/
│ │ │ ├── __init__.py
│ │ │ ├── checks.py
│ │ │ ├── datetime.py
│ │ │ ├── db_exceptions.py
│ │ │ ├── evaluator.py
│ │ │ ├── expressions.py
│ │ │ ├── feature_flags.py
│ │ │ ├── get_doc_search.py
│ │ │ ├── humanization_utils.py
│ │ │ ├── json.py
│ │ │ ├── llm_providers.py
│ │ │ ├── memory.py
│ │ │ ├── messages.py
│ │ │ ├── mmr.py
│ │ │ ├── model_validation.py
│ │ │ ├── secrets.py
│ │ │ ├── task_validation.py
│ │ │ ├── template.py
│ │ │ ├── tool_runner.py
│ │ │ ├── types.py
│ │ │ ├── usage.py
│ │ │ ├── workflows.py
│ │ │ └── yaml.py
│ │ ├── dependencies/
│ │ │ ├── __init__.py
│ │ │ ├── auth.py
│ │ │ ├── content_length.py
│ │ │ ├── developer_id.py
│ │ │ ├── exceptions.py
│ │ │ └── query_filter.py
│ │ ├── env.py
│ │ ├── exceptions.py
│ │ ├── metrics/
│ │ │ ├── __init__.py
│ │ │ └── counters.py
│ │ ├── model_registry.py
│ │ ├── queries/
│ │ │ ├── AGENTS.md
│ │ │ ├── __init__.py
│ │ │ ├── agents/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_agent.py
│ │ │ │ ├── create_or_update_agent.py
│ │ │ │ ├── delete_agent.py
│ │ │ │ ├── get_agent.py
│ │ │ │ ├── list_agents.py
│ │ │ │ ├── patch_agent.py
│ │ │ │ └── update_agent.py
│ │ │ ├── chat/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── gather_messages.py
│ │ │ │ └── prepare_chat_context.py
│ │ │ ├── developers/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_developer.py
│ │ │ │ ├── get_developer.py
│ │ │ │ ├── patch_developer.py
│ │ │ │ └── update_developer.py
│ │ │ ├── docs/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── bulk_delete_docs.py
│ │ │ │ ├── create_doc.py
│ │ │ │ ├── delete_doc.py
│ │ │ │ ├── get_doc.py
│ │ │ │ ├── list_docs.py
│ │ │ │ ├── search_docs_by_embedding.py
│ │ │ │ ├── search_docs_by_text.py
│ │ │ │ ├── search_docs_hybrid.py
│ │ │ │ └── utils.py
│ │ │ ├── entries/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_entries.py
│ │ │ │ ├── delete_entries.py
│ │ │ │ ├── get_history.py
│ │ │ │ └── list_entries.py
│ │ │ ├── executions/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── constants.py
│ │ │ │ ├── count_executions.py
│ │ │ │ ├── create_execution.py
│ │ │ │ ├── create_execution_transition.py
│ │ │ │ ├── create_temporal_lookup.py
│ │ │ │ ├── get_execution.py
│ │ │ │ ├── get_execution_status.py
│ │ │ │ ├── get_execution_transition.py
│ │ │ │ ├── get_paused_execution_token.py
│ │ │ │ ├── get_temporal_workflow_data.py
│ │ │ │ ├── list_execution_inputs_data.py
│ │ │ │ ├── list_execution_state_data.py
│ │ │ │ ├── list_execution_transitions.py
│ │ │ │ ├── list_executions.py
│ │ │ │ ├── lookup_temporal_data.py
│ │ │ │ └── prepare_execution_input.py
│ │ │ ├── files/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_file.py
│ │ │ │ ├── delete_file.py
│ │ │ │ ├── get_file.py
│ │ │ │ └── list_files.py
│ │ │ ├── projects/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_project.py
│ │ │ │ ├── list_projects.py
│ │ │ │ └── project_exists.py
│ │ │ ├── secrets/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create.py
│ │ │ │ ├── delete.py
│ │ │ │ ├── get_by_name.py
│ │ │ │ ├── list.py
│ │ │ │ └── update.py
│ │ │ ├── sessions/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── count_sessions.py
│ │ │ │ ├── create_or_update_session.py
│ │ │ │ ├── create_session.py
│ │ │ │ ├── delete_session.py
│ │ │ │ ├── get_session.py
│ │ │ │ ├── list_sessions.py
│ │ │ │ ├── patch_session.py
│ │ │ │ └── update_session.py
│ │ │ ├── tasks/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_or_update_task.py
│ │ │ │ ├── create_task.py
│ │ │ │ ├── delete_task.py
│ │ │ │ ├── get_task.py
│ │ │ │ ├── list_tasks.py
│ │ │ │ ├── patch_task.py
│ │ │ │ └── update_task.py
│ │ │ ├── tools/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_tools.py
│ │ │ │ ├── delete_tool.py
│ │ │ │ ├── get_tool.py
│ │ │ │ ├── get_tool_args_from_metadata.py
│ │ │ │ ├── list_tools.py
│ │ │ │ ├── patch_tool.py
│ │ │ │ └── update_tool.py
│ │ │ ├── usage/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_usage_record.py
│ │ │ │ └── get_user_cost.py
│ │ │ ├── users/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_or_update_user.py
│ │ │ │ ├── create_user.py
│ │ │ │ ├── delete_user.py
│ │ │ │ ├── get_user.py
│ │ │ │ ├── list_users.py
│ │ │ │ ├── patch_user.py
│ │ │ │ └── update_user.py
│ │ │ └── utils.py
│ │ ├── rec_sum/
│ │ │ ├── __init__.py
│ │ │ ├── data.py
│ │ │ ├── entities.py
│ │ │ ├── entities_example_chat.json
│ │ │ ├── generate.py
│ │ │ ├── summarize.py
│ │ │ ├── summarize_example_chat.json
│ │ │ ├── summarize_example_result.json
│ │ │ ├── trim.py
│ │ │ ├── trim_example_chat.json
│ │ │ ├── trim_example_result.json
│ │ │ └── utils.py
│ │ ├── routers/
│ │ │ ├── AGENTS.md
│ │ │ ├── __init__.py
│ │ │ ├── agents/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_agent.py
│ │ │ │ ├── create_agent_tool.py
│ │ │ │ ├── create_or_update_agent.py
│ │ │ │ ├── delete_agent.py
│ │ │ │ ├── delete_agent_tool.py
│ │ │ │ ├── get_agent_details.py
│ │ │ │ ├── list_agent_tools.py
│ │ │ │ ├── list_agents.py
│ │ │ │ ├── list_models.py
│ │ │ │ ├── patch_agent.py
│ │ │ │ ├── patch_agent_tool.py
│ │ │ │ ├── router.py
│ │ │ │ ├── update_agent.py
│ │ │ │ └── update_agent_tool.py
│ │ │ ├── docs/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── bulk_delete_docs.py
│ │ │ │ ├── create_doc.py
│ │ │ │ ├── delete_doc.py
│ │ │ │ ├── embed.py
│ │ │ │ ├── get_doc.py
│ │ │ │ ├── list_docs.py
│ │ │ │ ├── router.py
│ │ │ │ └── search_docs.py
│ │ │ ├── files/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_file.py
│ │ │ │ ├── delete_file.py
│ │ │ │ ├── get_file.py
│ │ │ │ ├── list_files.py
│ │ │ │ └── router.py
│ │ │ ├── healthz/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── check_health.py
│ │ │ │ └── router.py
│ │ │ ├── internal/
│ │ │ │ ├── __init__.py
│ │ │ │ └── router.py
│ │ │ ├── jobs/
│ │ │ │ ├── __init__.py
│ │ │ │ └── routers.py
│ │ │ ├── projects/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_project.py
│ │ │ │ ├── list_projects.py
│ │ │ │ └── router.py
│ │ │ ├── responses/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_response.py
│ │ │ │ ├── get_response.py
│ │ │ │ └── router.py
│ │ │ ├── secrets/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_secret.py
│ │ │ │ ├── delete_secret.py
│ │ │ │ ├── list_secrets.py
│ │ │ │ ├── router.py
│ │ │ │ └── update_secret.py
│ │ │ ├── sessions/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── auto_tools/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── chat.py
│ │ │ │ │ └── render.py
│ │ │ │ ├── chat.py
│ │ │ │ ├── create_or_update_session.py
│ │ │ │ ├── create_session.py
│ │ │ │ ├── delete_session.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── get_session.py
│ │ │ │ ├── get_session_history.py
│ │ │ │ ├── legacy/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── chat.py
│ │ │ │ │ └── render.py
│ │ │ │ ├── list_sessions.py
│ │ │ │ ├── metrics.py
│ │ │ │ ├── patch_session.py
│ │ │ │ ├── render.py
│ │ │ │ ├── router.py
│ │ │ │ └── update_session.py
│ │ │ ├── tasks/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_or_update_task.py
│ │ │ │ ├── create_task.py
│ │ │ │ ├── create_task_execution.py
│ │ │ │ ├── get_execution_details.py
│ │ │ │ ├── get_task_details.py
│ │ │ │ ├── list_execution_transitions.py
│ │ │ │ ├── list_task_executions.py
│ │ │ │ ├── list_tasks.py
│ │ │ │ ├── router.py
│ │ │ │ ├── stream_execution_status.py
│ │ │ │ ├── stream_transitions_events.py
│ │ │ │ └── update_execution.py
│ │ │ ├── users/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── create_or_update_user.py
│ │ │ │ ├── create_user.py
│ │ │ │ ├── delete_user.py
│ │ │ │ ├── get_user_details.py
│ │ │ │ ├── list_users.py
│ │ │ │ ├── patch_user.py
│ │ │ │ ├── router.py
│ │ │ │ └── update_user.py
│ │ │ └── utils/
│ │ │ ├── __init__.py
│ │ │ ├── model_converters.py
│ │ │ └── model_validation.py
│ │ ├── web.py
│ │ ├── worker/
│ │ │ ├── AGENTS.md
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── codec.py
│ │ │ └── worker.py
│ │ └── workflows/
│ │ ├── AGENTS.md
│ │ ├── __init__.py
│ │ ├── demo.py
│ │ └── task_execution/
│ │ ├── __init__.py
│ │ ├── helpers.py
│ │ └── transition.py
│ ├── docker-compose-api.yml
│ ├── docker-compose.yml
│ ├── gunicorn_conf.py
│ ├── poe_tasks.toml
│ ├── pyproject.toml
│ ├── pytype.toml
│ ├── tests/
│ │ ├── __init__.py
│ │ ├── fixtures.py
│ │ ├── sample_tasks/
│ │ │ ├── __init__.py
│ │ │ ├── find_selector.yaml
│ │ │ ├── integration_example.yaml
│ │ │ ├── reclaim-example.yaml
│ │ │ ├── screenshot.base64
│ │ │ ├── simple_multi_step.yaml
│ │ │ ├── simple_parameter_extractor.yaml
│ │ │ ├── simple_prompt.yaml
│ │ │ └── test_find_selector.py
│ │ ├── test_activities.py
│ │ ├── test_activities_utils.py
│ │ ├── test_agent_metadata_filtering.py
│ │ ├── test_agent_queries.py
│ │ ├── test_agent_routes.py
│ │ ├── test_base_evaluate.py
│ │ ├── test_chat_auto_tools.py
│ │ ├── test_chat_metadata.py
│ │ ├── test_chat_routes.py
│ │ ├── test_chat_streaming.py
│ │ ├── test_developer_queries.py
│ │ ├── test_docs_metadata_filtering.py
│ │ ├── test_docs_queries.py
│ │ ├── test_docs_routes.py
│ │ ├── test_entry_queries.py
│ │ ├── test_execution_queries.py
│ │ ├── test_execution_workflow.py
│ │ ├── test_expression_validation.py
│ │ ├── test_file_routes.py
│ │ ├── test_files_queries.py
│ │ ├── test_get_doc_search.py
│ │ ├── test_litellm_utils.py
│ │ ├── test_memory_utils.py
│ │ ├── test_messages_truncation.py
│ │ ├── test_metadata_filter_utils.py
│ │ ├── test_middleware.py
│ │ ├── test_mmr.py
│ │ ├── test_model_validation.py
│ │ ├── test_nlp_utilities.py
│ │ ├── test_pg_query_step.py
│ │ ├── test_prepare_for_step.py
│ │ ├── test_prompt_step_auto_tools.py
│ │ ├── test_query_utils.py
│ │ ├── test_secrets_queries.py
│ │ ├── test_secrets_routes.py
│ │ ├── test_secrets_usage.py
│ │ ├── test_session_queries.py
│ │ ├── test_session_routes.py
│ │ ├── test_task_execution_workflow.py
│ │ ├── test_task_queries.py
│ │ ├── test_task_routes.py
│ │ ├── test_task_validation.py
│ │ ├── test_tool_call_step.py
│ │ ├── test_tool_queries.py
│ │ ├── test_tool_runner.py
│ │ ├── test_transitions_queries.py
│ │ ├── test_usage_cost.py
│ │ ├── test_usage_tracking.py
│ │ ├── test_user_queries.py
│ │ ├── test_user_routes.py
│ │ ├── test_validation_errors.py
│ │ ├── test_workflow_helpers.py
│ │ ├── test_workflow_routes.py
│ │ └── utils.py
│ └── uuid_extensions.pyi
├── analytics/
│ ├── AGENTS.md
│ ├── README.md
│ └── docker-compose.yml
├── blob-store/
│ ├── .gitignore
│ ├── AGENTS.md
│ ├── Dockerfile
│ ├── docker-compose-ha.yml
│ ├── docker-compose.yml
│ ├── entrypoint.sh
│ └── s3.json.template
├── cli/
│ ├── .gitignore
│ ├── AGENTS.md
│ ├── README.md
│ ├── cli-reference.md
│ ├── poe_tasks.toml
│ ├── pyproject.toml
│ ├── spec.md
│ ├── src/
│ │ └── julep_cli/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── agents.py
│ │ ├── app.py
│ │ ├── auth.py
│ │ ├── chat.py
│ │ ├── executions.py
│ │ ├── importt.py
│ │ ├── init.py
│ │ ├── logs.py
│ │ ├── ls.py
│ │ ├── models.py
│ │ ├── run.py
│ │ ├── sync.py
│ │ ├── tasks.py
│ │ ├── tools.py
│ │ ├── utils.py
│ │ └── wrapper.py
│ └── tests/
│ ├── __init__.py
│ └── test_auth.py
├── feature-flags/
│ ├── docker-compose.yml
│ └── env.example
├── gateway/
│ ├── AGENTS.md
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── entrypoint.sh
│ ├── letsencrypt/
│ │ ├── .gitignore
│ │ └── .gitkeep
│ └── traefik.yml.template
├── hasura/
│ ├── docker-compose.yml
│ └── metadata/
│ ├── hasura_metadata_2025_04_07_16_21_57_118.json
│ └── hasura_metadata_2025_04_24_14_57_23_154.json
├── integrations-service/
│ ├── .dockerignore
│ ├── .python-version
│ ├── AGENTS.md
│ ├── Dockerfile
│ ├── README.md
│ ├── docker-compose.yml
│ ├── gunicorn_conf.py
│ ├── integrations/
│ │ ├── __init__.py
│ │ ├── __main__.py
│ │ ├── autogen/
│ │ │ ├── Agents.py
│ │ │ ├── Chat.py
│ │ │ ├── Common.py
│ │ │ ├── Docs.py
│ │ │ ├── Entries.py
│ │ │ ├── Executions.py
│ │ │ ├── Files.py
│ │ │ ├── Jobs.py
│ │ │ ├── Projects.py
│ │ │ ├── Responses.py
│ │ │ ├── Secrets.py
│ │ │ ├── Sessions.py
│ │ │ ├── Tasks.py
│ │ │ ├── Tools.py
│ │ │ ├── Users.py
│ │ │ └── __init__.py
│ │ ├── env.py
│ │ ├── models/
│ │ │ ├── __init__.py
│ │ │ ├── algolia.py
│ │ │ ├── arxiv.py
│ │ │ ├── base_models.py
│ │ │ ├── brave.py
│ │ │ ├── browserbase.py
│ │ │ ├── cloudinary.py
│ │ │ ├── email.py
│ │ │ ├── execution.py
│ │ │ ├── ffmpeg.py
│ │ │ ├── google_sheets.py
│ │ │ ├── llama_parse.py
│ │ │ ├── mailgun.py
│ │ │ ├── mcp.py
│ │ │ ├── remote_browser.py
│ │ │ ├── spider.py
│ │ │ ├── unstructured.py
│ │ │ ├── weather.py
│ │ │ └── wikipedia.py
│ │ ├── providers.py
│ │ ├── routers/
│ │ │ ├── __init__.py
│ │ │ ├── execution/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── execute.py
│ │ │ │ └── router.py
│ │ │ └── integrations/
│ │ │ ├── __init__.py
│ │ │ ├── get_integration.py
│ │ │ ├── get_integration_tool.py
│ │ │ ├── get_integrations.py
│ │ │ └── router.py
│ │ ├── utils/
│ │ │ ├── __init__.py
│ │ │ ├── execute_integration.py
│ │ │ └── integrations/
│ │ │ ├── __init__.py
│ │ │ ├── algolia.py
│ │ │ ├── arxiv.py
│ │ │ ├── brave.py
│ │ │ ├── browserbase.py
│ │ │ ├── cloudinary.py
│ │ │ ├── email.py
│ │ │ ├── ffmpeg.py
│ │ │ ├── google_sheets.py
│ │ │ ├── llama_parse.py
│ │ │ ├── mailgun.py
│ │ │ ├── mcp.py
│ │ │ ├── remote_browser.py
│ │ │ ├── spider.py
│ │ │ ├── unstructured.py
│ │ │ ├── weather.py
│ │ │ └── wikipedia.py
│ │ └── web.py
│ ├── poe_tasks.toml
│ ├── pyproject.toml
│ ├── pytest.ini
│ ├── pytype.toml
│ └── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── mocks/
│ │ ├── __init__.py
│ │ ├── brave.py
│ │ ├── email.py
│ │ ├── llama_parse.py
│ │ ├── spider.py
│ │ ├── weather.py
│ │ └── wikipedia.py
│ ├── test_mcp.py
│ ├── test_mcp_sse_server.py
│ ├── test_provider_execution.py
│ ├── test_providers.py
│ └── working_mcp_sse_server.py
├── llm-proxy/
│ ├── .dockerignore
│ ├── .gitignore
│ ├── AGENTS.md
│ ├── docker-compose.yml
│ └── litellm-config.yaml
├── memory-store/
│ ├── .gitignore
│ ├── AGENTS.md
│ ├── Dockerfile.migrations
│ ├── README.md
│ ├── docker-compose.yml
│ └── migrations/
│ ├── 000001_initial.down.sql
│ ├── 000001_initial.up.sql
│ ├── 000002_developers.down.sql
│ ├── 000002_developers.up.sql
│ ├── 000003_users.down.sql
│ ├── 000003_users.up.sql
│ ├── 000004_agents.down.sql
│ ├── 000004_agents.up.sql
│ ├── 000005_files.down.sql
│ ├── 000005_files.up.sql
│ ├── 000006_docs.down.sql
│ ├── 000006_docs.up.sql
│ ├── 000007_ann.down.sql
│ ├── 000007_ann.up.sql
│ ├── 000008_tools.down.sql
│ ├── 000008_tools.up.sql
│ ├── 000009_sessions.down.sql
│ ├── 000009_sessions.up.sql
│ ├── 000010_tasks.down.sql
│ ├── 000010_tasks.up.sql
│ ├── 000011_executions.down.sql
│ ├── 000011_executions.up.sql
│ ├── 000012_transitions.down.sql
│ ├── 000012_transitions.up.sql
│ ├── 000013_executions_continuous_view.down.sql
│ ├── 000013_executions_continuous_view.up.sql
│ ├── 000014_temporal_lookup.down.sql
│ ├── 000014_temporal_lookup.up.sql
│ ├── 000015_entries.down.sql
│ ├── 000015_entries.up.sql
│ ├── 000016_entry_relations.down.sql
│ ├── 000016_entry_relations.up.sql
│ ├── 000017_compression.down.sql
│ ├── 000017_compression.up.sql
│ ├── 000018_doc_search.down.sql
│ ├── 000018_doc_search.up.sql
│ ├── 000019_system_developer.down.sql
│ ├── 000019_system_developer.up.sql
│ ├── 000020_executions_task_cascade.down.sql
│ ├── 000020_executions_task_cascade.up.sql
│ ├── 000021_fix_toolname_contraint.down.sql
│ ├── 000021_fix_toolname_contraint.up.sql
│ ├── 000022_vector_search.down.sql
│ ├── 000022_vector_search.up.sql
│ ├── 000023_update_strings_length_constraints.down.sql
│ ├── 000023_update_strings_length_constraints.up.sql
│ ├── 000024_hybrid_search.down.sql
│ ├── 000024_hybrid_search.up.sql
│ ├── 000025_default_system_template.down.sql
│ ├── 000025_default_system_template.up.sql
│ ├── 000026_transition_cursor.down.sql
│ ├── 000026_transition_cursor.up.sql
│ ├── 000027_add_postgraphile.down.sql
│ ├── 000027_add_postgraphile.up.sql
│ ├── 000028_new_hybrid_search_implementation.down.sql
│ ├── 000028_new_hybrid_search_implementation.up.sql
│ ├── 000029_duplicate_doc_prevention.down.sql
│ ├── 000029_duplicate_doc_prevention.up.sql
│ ├── 000030_add_unaccent_search_config.down.sql
│ ├── 000030_add_unaccent_search_config.up.sql
│ ├── 000031_add_trigram_search.down.sql
│ ├── 000031_add_trigram_search.up.sql
│ ├── 000032_enhance_trigram_search.down.sql
│ ├── 000032_enhance_trigram_search.up.sql
│ ├── 000033_fix_latest_transitions.down.sql
│ ├── 000033_fix_latest_transitions.up.sql
│ ├── 000034_switch_to_hypercore.down.sql
│ ├── 000034_switch_to_hypercore.up.sql
│ ├── 000035_enhanced_indices.down.sql
│ ├── 000035_enhanced_indices.up.sql
│ ├── 000036_usage.down.sql
│ ├── 000036_usage.up.sql
│ ├── 000037_speed_up_search.down.sql
│ ├── 000037_speed_up_search.up.sql
│ ├── 000038_usage_cost_monthly.down.sql
│ ├── 000038_usage_cost_monthly.up.sql
│ ├── 000039_projects.down.sql
│ ├── 000039_projects.up.sql
│ ├── 000040_add_secrets.down.sql
│ ├── 000040_add_secrets.up.sql
│ ├── 000041_non_null_forward_tool_calls.down.sql
│ ├── 000041_non_null_forward_tool_calls.up.sql
│ ├── 000042_add_api_keys.down.sql
│ ├── 000042_add_api_keys.up.sql
│ ├── 000043_optional_trigram_search.down.sql
│ ├── 000043_optional_trigram_search.up.sql
│ ├── 000044_search_optimize.down.sql
│ └── 000044_search_optimize.up.sql
├── monitoring/
│ ├── AGENTS.md
│ ├── README.md
│ ├── docker-compose.yml
│ ├── grafana/
│ │ ├── dashboard.yaml
│ │ └── provisioning/
│ │ ├── dashboards/
│ │ │ ├── advanced-visibility-specific.json
│ │ │ ├── clustermonitoring-kubernetes.json
│ │ │ ├── frontend-service-specific.json
│ │ │ ├── history-service-specific.json
│ │ │ ├── main.yaml
│ │ │ ├── matching-service-specific.json
│ │ │ ├── queries-metrics.json
│ │ │ ├── requests-metrics.json
│ │ │ ├── sdk-general.json
│ │ │ ├── sdk-java.json
│ │ │ ├── server-general.json
│ │ │ ├── temporal_cloud.json
│ │ │ └── worker-service-specific.json
│ │ └── datasources/
│ │ └── datasource.yml
│ └── prometheus/
│ └── config/
│ └── prometheus.yml
├── scheduler/
│ ├── AGENTS.md
│ ├── cert/
│ │ └── .gitignore
│ ├── docker-compose.yml
│ └── dynamicconfig/
│ └── temporal-postgres.yaml
├── schemas/
│ ├── create_agent_request.json
│ ├── create_task_request.json
│ └── walk.jq
├── scripts/
│ ├── __init__.py
│ ├── generate_changelog.py
│ ├── generate_jwt.py
│ ├── generate_openapi_code.sh
│ ├── readme_translator.py
│ ├── sync_model_docs.py
│ └── templates/
│ ├── changelog.yaml
│ └── header.html
└── typespec/
├── .gitignore
├── AGENTS.md
├── agents/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── chat/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── common/
│ ├── constants.tsp
│ ├── interfaces.tsp
│ ├── main.tsp
│ ├── mixins.tsp
│ ├── scalars.tsp
│ └── types.tsp
├── docs/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── entries/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── executions/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── files/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── jobs/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── main.tsp
├── package.json
├── projects/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── responses/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── secrets/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── sessions/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
├── tasks/
│ ├── endpoints.tsp
│ ├── main.tsp
│ ├── models.tsp
│ ├── step_kind.tsp
│ └── steps.tsp
├── tools/
│ ├── algolia.tsp
│ ├── anthropic.tsp
│ ├── arxiv.tsp
│ ├── brave.tsp
│ ├── browserbase/
│ │ ├── contexts.tsp
│ │ ├── extensions.tsp
│ │ ├── main.tsp
│ │ └── sessions.tsp
│ ├── cloudinary.tsp
│ ├── email.tsp
│ ├── endpoints.tsp
│ ├── ffmpeg.tsp
│ ├── google_sheets.tsp
│ ├── llama_parse.tsp
│ ├── mailgun.tsp
│ ├── main.tsp
│ ├── mcp.tsp
│ ├── models.tsp
│ ├── remote_browser.tsp
│ ├── spider.tsp
│ ├── unstructured.tsp
│ ├── weather.tsp
│ └── wikipedia.tsp
├── tsp-output/
│ └── @typespec/
│ └── openapi3/
│ └── openapi-1.0.0.yaml
├── tspconfig.yaml
├── users/
│ ├── endpoints.tsp
│ ├── main.tsp
│ └── models.tsp
└── versions.tsp
================================================
FILE CONTENTS
================================================
================================================
FILE: .agentignore
================================================
# Git
.git/
.codex/
# Build and distribution directories
**/dist/
**/build/
**/.ruff_cache/
**/node_modules/
**/__pycache__/
**/.pytest_cache/
**/.mypy_cache/
**/.tox/
**/.coverage/
**/.venv/
**/venv/
**/.next/
**/.nuxt/
**/out/
**/coverage/
# Environment and configuration files
.env
.env.*
**/.env.local
**/.env.development.local
**/.env.test.local
**/.env.production.local
# Large data files
**/*.parquet
**/*.arrow
**/*.pickle
**/*.pkl
**/*.db
**/*.sqlite
**/*.sqlite3
# Generated documentation
**/docs/_build/
**/site/
**/public/
documentation/openapi.yaml
# Package-manager files
**/yarn-error.log
**/npm-debug.log
**/package-lock.json
**/yarn.lock
**/pnpm-lock.yaml
**/pnpm-workspace.yaml
**/poetry.lock
**/Pipfile.lock
**/requirements-frozen.txt
**/uv.lock
# Logs
**/logs/
**/*.log
# Cache directories
**/.cache/
**/.npm/
**/.pnpm/
**/.yarn/
**/.pnp/
# IDE and editor files
**/.vscode/
**/.idea/
**/.DS_Store
**/.ipynb_checkpoints/
**/*.swp
# Compiled binaries
**/*.so
**/*.dll
**/*.dylib
**/*.exe
**/*.whl
**/*.egg-info/
**/*.egg
# Large media files
**/*.mp4
**/*.mp3
**/*.wav
**/*.avi
**/*.mov
**/*.png
**/*.jpg
**/*.jpeg
**/*.gif
**/*.svg
**/*.ico
# Container and deployment files
**/*.tfvars
**/*.tfstate
**/*.tfstate.backup
# Temporary files
**/tmp/
**/temp/
**/*.tmp
**/*.temp
# Large generated files
gaga.json
openapi.yaml
openapi*.yaml
openapi*.yml
openapi*.json
# Julep-specific
# TypeSpec generated outputs
**/tsp-output/
typespec/node_modules/
# Local database data
data/
# Testing fixtures and large example files
**/tests/sample_tasks/*.base64
**/tests/sample_tasks/*.png
# Temporal scheduler certificates
scheduler/cert/
# Docker and container configuration
**/.docker/
**/docker-compose.override.yml
# Generated files in gateway
gateway/letsencrypt/
# Monitoring data
monitoring/grafana/dashboards/
monitoring/prometheus/data/
monitoring/grafana/storage/
================================================
FILE: .codex/setup.sh
================================================
#!/usr/bin/env bash
#
# setup-all.sh ─ one-shot bootstrap for the whole julep monorepo
#
# › run from repo root: ./setup-all.sh
#
# It will:
# • ensure Poetry + TypeSpec compiler are available
# • iterate over each top-level directory and install deps:
# – pyproject.toml ➜ poetry install
# – package.json ➜ npm install (uses pnpm if present)
# – requirements.txt➜ pip install -r
# • install root pre-commit hooks (if .pre-commit-config.yaml exists)
# • stop on first error (set -e)
set -euo pipefail
### 1. Globals --------------------------------------------------------------
IGNORE_DIRS_DEFAULT="sdks deploy scripts monitoring .git .venv node_modules"
IGNORE_DIRS="${IGNORE_DIRS:-$IGNORE_DIRS_DEFAULT}"
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
# cd "$ROOT_DIR"
RED="\033[0;31m"; GREEN="\033[0;32m"; CYAN="\033[0;36m"; NC="\033[0m"
announce() { echo -e "${CYAN}==>$1${NC}"; }
### 3. Ensure TypeSpec compiler --------------------------------------------
if ! command -v tsp &> /dev/null; then
announce "Installing TypeSpec compiler globally (npm)…"
npm install -g @typespec/compiler > /dev/null
else
announce "TypeSpec compiler present → $(tsp --version)"
fi
announce "Installing hasura-cli globally (npm)…"
curl -L https://github.com/hasura/graphql-engine/raw/stable/cli/get.sh | bash
### 4. Walk directories -----------------------------------------------------
curl -LsSf https://astral.sh/uv/install.sh | sh
if [[ -f "pyproject.toml" ]]; then
announce "Installing root deps"
uv sync
echo -e "${GREEN}✓ root deps installed${NC}"
fi
OIFS=$IFS; IFS=$'\n'
for dir in $(git ls-tree --name-only -d HEAD | sort); do
d="${dir#./}"
if [[ " $IGNORE_DIRS " =~ [[:space:]]"$d"[[:space:]] ]]; then
echo -e "· skipping $d (ignored)"
continue
fi
announce "Processing $d/"
# uv project?
if [[ -f "$d/pyproject.toml" ]]; then
pushd "$d" > /dev/null
announce "[uv] installing in $d …"
uv sync
uv pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl
popd > /dev/null
echo -e "${GREEN}✓ uv install done for $d${NC}"
continue
fi
# Node project?
if [[ -f "$d/package.json" ]]; then
pushd "$d" > /dev/null
announce "[npm] installing in $d …"
if command -v pnpm &> /dev/null; then
pnpm install --silent
else
npm install --silent
fi
popd > /dev/null
echo -e "${GREEN}✓ npm install done for $d${NC}"
continue
fi
# Plain requirements.txt?
if [[ -f "$d/requirements.txt" ]]; then
pushd "$d" > /dev/null
announce "[pip] installing requirements in $d …"
pip install -r requirements.txt
pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl
popd > /dev/null
echo -e "${GREEN}✓ pip install done for $d${NC}"
continue
fi
echo -e "· no recognised manifest in $d – nothing to install"
done
IFS=$OIFS
### 5. Pre-commit -----------------------------------------------------------
if [[ -f ".pre-commit-config.yaml" ]]; then
announce "Installing git pre-commit hooks…"
pip install --quiet pre-commit
pre-commit install
echo -e "${GREEN}✓ pre-commit hooks installed${NC}"
fi
echo -e "${GREEN}\nAll done – monorepo dependencies ready!${NC}"
================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [INSERT EMAIL ADDRESS]. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing to Julep
👋 Welcome! We're excited that you're interested in contributing to Julep. This guide will help you get started.
---
## 🚀 Quick Start
1. Fork the repository
2. Create a new branch for your changes
3. Make your changes and test them
4. Submit a pull request
---
## 📝 Ways to Contribute
### 🐛 Reporting Issues
Found a bug? Have a feature request? [Submit an issue](https://github.com/julep-ai/julep/issues) with:
- [ ] Steps to reproduce
- [ ] Expected behavior
- [ ] Actual behavior
- [ ] Screenshots (if applicable)
### 💻 Contributing Code
1. Fork the repository
2. Create a feature branch: `git checkout -b feature/your-feature-name`
3. Make your changes
4. Write/update tests
5. Push to your fork
6. Open a pull request
> 💡 **Tip:** Make sure your code follows our style guide and passes all tests.
---
## 🏗 Project Architecture
### Core Services
| Service | Description |
|---------|-------------|
| `agents-api` | Core API service |
| `memory-store` | PostgreSQL database with TimescaleDB for persistent storage |
| `blob-store` | Object storage for files and binary data |
| `integrations-service` | Adapters for external services and tools |
| `scheduler` | Temporal workflow engine for task scheduling and orchestration |
| `gateway` | API gateway for routing and request handling |
| `llm-proxy` | LiteLLM proxy for language model interactions |
| `monitoring` | Prometheus and Grafana monitoring infrastructure |
| `typespec` | API specifications in TypeSpec format |
| `sdks` | Node.js and Python client SDKs |
| `cli` | Command-line interface for Julep |
### Supporting Modules
- `deploy`: Deployment configs
- `documentation`: Project documentation assets
- `scripts`: Utility scripts and tools
- `cookbooks`: Usage examples and recipes
### Tech Stack
- **FastAPI**: Web framework for building APIs
- **TypeSpec**: API specification language
- **Timescale**: Database system
- **SeaweedFS**: Blob storage system
- **Grafana**: Monitoring and observability platform
- **Prometheus**: Monitoring and observability platform
- **LiteLLM**: LLM framework
- **Temporal**: Workflow engine
- **Docker**: Containerization
> To understand the relationships between the components, please refer to the [System Architecture](https://docs.julep.ai/docs/advanced/architecture-deep-dive) section.
## Understanding the Codebase
To get a comprehensive understanding of Julep, we recommend exploring the codebase in the following order:
1. **Project Overview**
- Read `README.md` in the root directory
- Explore `docs/` for detailed documentation
2. **System Architecture**
- Examine `docker-compose.yml` in the root directory
- Review `deploy/` directory for different deployment configurations
3. **API Specifications**
- Learn about TypeSpec: https://typespec.io/docs/
- Explore `typespec/` directory:
- Start with `common/` folder
- Review `main.tsp`
- Examine each module sequentially
4. **Core API Implementation**
- Learn about FastAPI: https://fastapi.tiangolo.com/
- Explore `agents-api/` directory:
- Review `README.md` for an overview
- Examine `routers/` for API endpoints
- Look into `models/` for data models
5. **Database and Storage**
- Learn about Cozo: https://docs.cozodb.org/en/latest/tutorial.html
- Review `agents-api/README.md` for database schema
- Explore `agents-api/models/` for database queries
6. **Workflow Management**
- Learn about Temporal: https://docs.temporal.io/develop/python
- Explore `agents-api/activities/` for individual workflow steps
- Review `agents-api/workflows/task_execution/` for main workflow logic
7. **Testing**
- Examine `agents-api/tests/` for test cases
8. **Additional Services**
- Explore other service directories (`integrations-service/`, `embedding-service/`, etc.) to understand their specific roles and implementations
## Contributing Guidelines
1. **Set Up Development Environment**
- Clone the repository
- Install Docker and Docker Compose
- Set up necessary API keys and environment variables
> You can check our [Local Setup](https://docs.julep.ai/docs/advanced/localsetup) section in the docs for more information.
2. **Choose an Area to Contribute**
- Check the issue tracker for open issues
- Look for "good first issue" labels for newcomers
3. **Make Changes**
- Create a new branch for your changes
- Write clean, well-documented code
- Ensure your changes adhere to the project's coding standards
4. **Test Your Changes**
- Run existing tests
- Add new tests for new functionality
- Ensure all tests pass before submitting your changes
5. **Submit a Pull Request**
- Provide a clear description of your changes
- Reference any related issues
- Be prepared to respond to feedback and make adjustments
6. **Code Review**
- Address any comments or suggestions from reviewers
- Make necessary changes and push updates to your branch
7. **Merge**
- Once approved, your changes will be merged into the main branch
### Adding a New Integration
The integration service is a crucial part of Julep, and we welcome contributions from the community to enhance its functionality and capabilities.
To contribute to the integration service, you can follow these steps:
1. **Add a new integration provider to our TypeSpec:** You can do so by:
1. Adding the provider name to the `integrationProvider` alias in `typespec/tools/models.tsp`
2. Adding a new file in `typespec/tools/` with the provider name. Take a look at the other integration files in the `typespec/tools/` directory for examples.
> If the integration needs an API key or other form of authentication, you would have to add a `Setup` model to the integration definition file, where you would define the authentication parameters (`spider.tsp` is an example of this). Otherwise, you can omit the `Setup` model (`wikipedia.tsp` is an example of this).
2. **Generate the new OpenAPI schema and Pydantic models:** You need to `cd` into the root directory of the project and run `./scripts/generate_openapi_code.sh` to generate the new OpenAPI schema along with Pydantic models for the new changes.
> The new OpenAPI schema will be generated in `./openapi.yaml` and the Pydantic models will be generated in `./integrations-service/integrations/autogen`.
3. **Add the new integration logic in the integration service:** You need to add the new integration logic in the integration service by adding a new file in `integration-service/integrations/utils/integrations` with the provider name. Take a look at the other integration files in the same directory for examples.
4. **Add the new integration provider to the providers registry:** You need to add the new integration provider to the providers registry by adding a new entry to the `available_providers` dictionary in `integrations-service/integrations/providers.py`.
### Documentation Improvements
Improvements to documentation are always appreciated! If you see areas that could be clarified or expanded, feel free to make the changes and submit a pull request.
### Sharing Feedback and Ideas
We'd love to hear your feedback and ideas for the project! Feel free to submit an issue or contact the maintainers directly to share your thoughts. Your input is very valuable in shaping the future direction of the project.
Remember, contributions aren't limited to code. Documentation improvements, bug reports, and feature suggestions are also valuable contributions to the project.
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: "🐛 Bug Report"
description: "Submit a bug report to help us improve"
title: "[Bug]: "
labels: ["bug"]
body:
- type: textarea
id: description
attributes:
label: "📜 Description"
placeholder: "A clear and concise description of what the bug is."
- type: textarea
id: steps-to-reproduce
attributes:
label: "👟 Reproduction steps"
placeholder: "1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error"
- type: checkboxes
id: no-duplicate-issues
attributes:
label: "👀 Have you searched previous issues to see if this has been raised before?"
options:
- label: "I checked and didn't find similar issue"
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Have Question?
url: https://discord.com/invite/JTSBGRZrzj
about: Join Official Discord server
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: 🚀 Feature
description: "Submit a proposal for a new feature"
title: "[Feature]: "
labels: ["enhancement"]
body:
- type: textarea
id: feature-description
validations:
required: true
attributes:
label: "🔖 Feature description"
placeholder: "A clear and concise description of what the feature is."
- type: textarea
id: pitch
attributes:
label: "🎤 Why is this feature needed ?"
placeholder: "Please explain why this feature should be implemented and how it would be used. Add examples, if applicable."
- type: textarea
id: solution
attributes:
label: "✌️ How do you aim to achieve this?"
placeholder: "A clear and concise description of what you want to happen."
- type: checkboxes
id: no-duplicate-issues
attributes:
label: "👀 Have you searched issues and PRs to see if this feature request has been raised before?"
options:
- label: "I checked and didn't find similar issue"
required: true
================================================
FILE: .github/ISSUE_TEMPLATE/refactor.yml
================================================
name: "🛠️ Refactor"
description: "Submit a bug report to help us improve"
title: "[Refactor]: "
labels: ["refactor"]
body:
- type: textarea
id: description
attributes:
label: "📜 Description"
placeholder: "A clear and concise description of what should be refactored."
- type: textarea
id: relevant-files
attributes:
label: "👟 Relevant files"
placeholder: "1. `agents-api/Dockerfile` needs to change
2. `integrations/**/*.py` files need to be reformatted"
================================================
FILE: .github/LICENSE
================================================
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.
================================================
FILE: .github/README-CN.md
================================================
[Deutsch](https://www.readme-i18n.com/julep-ai/julep?lang=de) |
[Español](https://www.readme-i18n.com/julep-ai/julep?lang=es) |
[français](https://www.readme-i18n.com/julep-ai/julep?lang=fr) |
[日本語](https://www.readme-i18n.com/julep-ai/julep?lang=ja) |
[한국어](https://www.readme-i18n.com/julep-ai/julep?lang=ko) |
[Português](https://www.readme-i18n.com/julep-ai/julep?lang=pt) |
[Русский](https://www.readme-i18n.com/julep-ai/julep?lang=ru) |
[中文](https://www.readme-i18n.com/julep-ai/julep?lang=zh)
**立即试用Julep:** 访问 **[Julep网站](https://julep.ai)** · 在 **[Julep控制台](https://dashboard.julep.ai)** 开始使用 (免费API密钥) · 阅读 **[文档](https://docs.julep.ai/introduction/julep)**
📖 目录
- [为什么选择Julep?](#为什么选择julep)
- [开始使用](#开始使用)
- [文档和示例](#文档和示例)
- [社区和贡献](#社区和贡献)
- [许可证](#许可证)
## 为什么选择Julep?
Julep是一个构建**基于智能代理的AI工作流**的开源平台,远超简单的提示链。它让你能够使用大型语言模型(LLM)和工具编排复杂的多步骤流程,**无需管理任何基础设施**。使用Julep,你可以创建**记住过往交互**并处理具有分支逻辑、循环、并行执行和外部API集成等复杂任务的AI代理。简而言之,Julep就像*"AI代理的Firebase"*,为规模化的智能工作流提供强大的后端。
**主要功能和优势:**
* **持久记忆:** 构建在对话中维持上下文和长期记忆的AI代理,让它们能够随时间学习和改进。
* **模块化工作流:** 将复杂任务定义为模块化步骤(YAML或代码),具有条件逻辑、循环和错误处理。Julep的工作流引擎自动管理多步骤流程和决策。
* **工具编排:** 轻松集成外部工具和API(网页搜索、数据库、第三方服务等)作为代理工具箱的一部分。Julep的代理可以调用这些工具来增强其能力,实现检索增强生成等功能。
* **并行和可扩展:** 并行运行多个操作以提高效率,让Julep处理后台的扩展和并发。平台是无服务器的,因此可以无缝扩展工作流,无需额外的DevOps开销。
* **可靠执行:** 不用担心故障 - Julep提供内置重试、自愈步骤和强大的错误处理,让长时间运行的任务保持正轨。你还能获得实时监控和日志记录来跟踪进展。
* **易于集成:** 通过我们的**Python**和**Node.js** SDK快速开始,或使用Julep CLI进行脚本编写。如果你想直接集成到其他系统中,Julep的REST API也可以使用。
*专注于你的AI逻辑和创意,而把繁重的工作交给Julep!*
## 开始使用
使用Julep简单易行:
1. **注册和API密钥:** 首先,在 [Julep控制台](https://dashboard.julep.ai) 注册以获取你的API密钥(用于验证SDK调用)。
2. **安装SDK:** 为你首选的语言安装Julep SDK:
*
**Python:** `pip install julep`
*
**Node.js:** `npm install @julep/sdk` (或 `yarn add @julep/sdk`)
3. **定义你的代理:** 使用SDK或YAML定义代理及其任务工作流。例如,你可以指定代理的记忆、可使用的工具以及逐步的任务逻辑。(详细演练请参见我们文档中的**[快速开始](https://docs.julep.ai/introduction/quick-start)**。)
4. **运行工作流:** 通过SDK调用你的代理来执行任务。Julep平台将在云端编排整个工作流,并为你管理状态、工具调用和LLM交互。你可以检查代理的输出,在控制台上监控执行,并根据需要进行迭代。
就是这样!你的第一个AI代理可以在几分钟内启动并运行。要获得完整教程,请查看文档中的**[快速开始指南](https://docs.julep.ai/introduction/quick-start)**。
> **注意:** Julep还提供命令行界面(CLI)(当前为Python的beta版)来管理工作流和代理。如果你喜欢无代码方法或想要脚本化常见任务,请参见 [Julep CLI文档](https://docs.julep.ai/responses/quickstart#cli-installation) 了解详情。
## 文档和示例
想要深入了解?**[Julep文档](https://docs.julep.ai)**涵盖了掌握平台所需的一切 - 从核心概念(代理、任务、会话、工具)到高级主题如代理记忆管理和架构内部。关键资源包括:
* **[概念指南](https://docs.julep.ai/concepts/):** 了解Julep的架构、会话和记忆的工作原理、工具使用、管理长对话等等。
* **[API和SDK参考](https://docs.julep.ai/api-reference/):** 查找所有SDK方法和REST API端点的详细参考,以将Julep集成到你的应用程序中。
* **[教程](https://docs.julep.ai/tutorials/):** 构建真实应用程序的分步指南(例如搜索网络的研究代理、旅行规划助手或具有自定义知识的聊天机器人)。
* **[Cookbook食谱](https://github.com/julep-ai/julep/tree/dev/cookbooks):** 探索**Julep Cookbook**以获取现成的示例工作流和代理。这些食谱展示了常见模式和用例 - 通过示例学习的绝佳方式。*浏览此存储库中的 [`cookbooks/`](https://github.com/julep-ai/julep/tree/dev/cookbooks) 目录以获取示例代理定义。*
* **[IDE集成](https://context7.com/julep-ai/julep):** 直接在IDE中访问Julep文档!在编码时获得即时答案的完美解决方案。
## 社区和贡献
加入我们不断壮大的开发者和AI爱好者社区!以下是一些参与和获得支持的方式:
* **Discord社区:** 有问题或想法?加入我们 [官方Discord服务器](https://discord.gg/7H5peSN9QP) 上的对话,与Julep团队和其他用户聊天。我们很乐意帮助故障排除或头脑风暴新的用例。
* **GitHub讨论和问题:** 请随时使用GitHub报告错误、请求功能或讨论实现细节。如果你想贡献,请查看 [**good first issues**](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - 我们欢迎各种类型的贡献。
* **贡献:** 如果你想贡献代码或改进,请查看我们的 [贡献指南](CONTRIBUTING.md) 了解如何开始。我们感谢所有的PR和反馈。通过协作,我们可以让Julep变得更好!
*专业提示:
给我们的仓库点星以保持更新 - 我们正在不断添加新功能和示例。*
你的贡献,无论大小,对我们都很有价值。让我们一起构建令人惊叹的东西!
我们杰出的贡献者:
## 许可证
Julep采用**Apache 2.0许可证**提供,这意味着你可以在自己的项目中自由使用。详情请参见 [LICENSE](LICENSE) 文件。享受使用Julep构建的乐趣!
================================================
FILE: .github/README-FR.md
================================================
[Deutsch](https://www.readme-i18n.com/julep-ai/julep?lang=de) |
[Español](https://www.readme-i18n.com/julep-ai/julep?lang=es) |
[français](https://www.readme-i18n.com/julep-ai/julep?lang=fr) |
[日本語](https://www.readme-i18n.com/julep-ai/julep?lang=ja) |
[한국어](https://www.readme-i18n.com/julep-ai/julep?lang=ko) |
[Português](https://www.readme-i18n.com/julep-ai/julep?lang=pt) |
[Русский](https://www.readme-i18n.com/julep-ai/julep?lang=ru) |
[中文](https://www.readme-i18n.com/julep-ai/julep?lang=zh)
**Essayez Julep dès aujourd'hui :** Visitez le **[Site Web de Julep](https://julep.ai)** · Commencez sur le **[Tableau de Bord Julep](https://dashboard.julep.ai)** (clé API gratuite) · Lisez la **[Documentation](https://docs.julep.ai/introduction/julep)**
📖 Table des matières
- [Pourquoi Julep ?](#pourquoi-julep-)
- [Commencer](#commencer)
- [Documentation et exemples](#documentation-et-exemples)
- [Communauté et contributions](#communauté-et-contributions)
- [Licence](#licence)
## Pourquoi Julep ?
Julep est une plateforme open-source pour construire des **flux de travail d'IA basés sur des agents** qui vont bien au-delà de simples chaînes de prompts. Elle vous permet d'orchestrer des processus complexes en plusieurs étapes avec des modèles de langage de grande taille (LLM) et des outils **sans gérer d'infrastructure**. Avec Julep, vous pouvez créer des agents d'IA qui **se souviennent des interactions passées** et gèrent des tâches sophistiquées avec une logique de branchement, des boucles, une exécution parallèle et l'intégration d'APIs externes. En bref, Julep agit comme un *"Firebase pour les agents d'IA,"* fournissant un backend robuste pour les flux de travail intelligents à grande échelle.
**Caractéristiques clés et avantages :**
* **Mémoire persistante :** Construisez des agents d'IA qui maintiennent le contexte et la mémoire à long terme à travers les conversations, afin qu'ils puissent apprendre et s'améliorer au fil du temps.
* **Flux de travail modulaires :** Définissez des tâches complexes comme des étapes modulaires (en YAML ou code) avec une logique conditionnelle, des boucles et la gestion d'erreurs. Le moteur de flux de travail de Julep gère automatiquement les processus multi-étapes et les décisions.
* **Orchestration d'outils :** Intégrez facilement des outils externes et des APIs (recherche web, bases de données, services tiers, etc.) dans la boîte à outils de votre agent. Les agents de Julep peuvent invoquer ces outils pour augmenter leurs capacités, permettant la génération augmentée par récupération et plus.
* **Parallèle et extensible :** Exécutez plusieurs opérations en parallèle pour l'efficacité, et laissez Julep gérer la mise à l'échelle et la concurrence en arrière-plan. La plateforme est sans serveur, donc elle met à l'échelle les flux de travail de manière transparente sans surcharge DevOps supplémentaire.
* **Exécution fiable :** Ne vous inquiétez pas des problèmes - Julep fournit des réessais intégrés, des étapes d'auto-guérison et une gestion d'erreurs robuste pour maintenir les tâches de longue durée sur la bonne voie. Vous obtenez également une surveillance et une journalisation en temps réel pour suivre les progrès.
* **Intégration facile :** Commencez rapidement avec nos SDKs pour **Python** et **Node.js**, ou utilisez le CLI Julep pour les scripts. L'API REST de Julep est disponible si vous voulez intégrer directement dans d'autres systèmes.
*Concentrez-vous sur votre logique et créativité d'IA, pendant que Julep s'occupe du gros travail !*
## Commencer
Démarrer avec Julep est simple :
1. **Inscription et clé API :** D'abord, inscrivez-vous sur le [Tableau de Bord Julep](https://dashboard.julep.ai) pour obtenir votre clé API (nécessaire pour authentifier vos appels SDK).
2. **Installer le SDK :** Installez le SDK Julep pour votre langage préféré :
*
**Python :** `pip install julep`
*
**Node.js :** `npm install @julep/sdk` (ou `yarn add @julep/sdk`)
3. **Définir votre agent :** Utilisez le SDK ou YAML pour définir un agent et son flux de travail de tâches. Par exemple, vous pouvez spécifier la mémoire de l'agent, les outils qu'il peut utiliser, et une logique de tâche étape par étape. (Voir le **[Guide de démarrage rapide](https://docs.julep.ai/introduction/quick-start)** dans notre documentation pour une procédure détaillée.)
4. **Exécuter un flux de travail :** Invoquez votre agent via le SDK pour exécuter la tâche. La plateforme Julep orchestrera l'ensemble du flux de travail dans le cloud et gérera l'état, les appels d'outils et les interactions LLM pour vous. Vous pouvez vérifier la sortie de l'agent, surveiller l'exécution sur le tableau de bord, et itérer selon les besoins.
C'est tout ! Votre premier agent d'IA peut être opérationnel en quelques minutes. Pour un tutoriel complet, consultez le **[Guide de démarrage rapide](https://docs.julep.ai/introduction/quick-start)** dans la documentation.
> **Note :** Julep offre également une interface en ligne de commande (CLI) (actuellement en bêta pour Python) pour gérer les flux de travail et les agents. Si vous préférez une approche sans code ou voulez scripter des tâches communes, voir les [documents CLI Julep](https://docs.julep.ai/responses/quickstart#cli-installation) pour plus de détails.
## Documentation et exemples
Vous voulez plonger plus profondément ? La **[Documentation Julep](https://docs.julep.ai)** couvre tout ce dont vous avez besoin pour maîtriser la plateforme - des concepts fondamentaux (Agents, Tâches, Sessions, Outils) aux sujets avancés comme la gestion de la mémoire des agents et les éléments internes de l'architecture. Les ressources clés incluent :
* **[Guides de concepts](https://docs.julep.ai/concepts/) :** Apprenez sur l'architecture de Julep, comment fonctionnent les sessions et la mémoire, l'utilisation d'outils, la gestion de longues conversations, et plus.
* **[Référence API et SDK](https://docs.julep.ai/api-reference/) :** Trouvez une référence détaillée pour toutes les méthodes SDK et les points de terminaison de l'API REST pour intégrer Julep dans vos applications.
* **[Tutoriels](https://docs.julep.ai/tutorials/) :** Guides étape par étape pour construire des applications réelles (ex. un agent de recherche qui parcourt le web, un assistant de planification de voyage, ou un chatbot avec des connaissances personnalisées).
* **[Recettes de livre de cuisine](https://github.com/julep-ai/julep/tree/dev/cookbooks) :** Explorez le **Livre de cuisine Julep** pour des exemples de flux de travail et d'agents prêts à l'emploi. Ces recettes démontrent des modèles communs et des cas d'usage - un excellent moyen d'apprendre par l'exemple. *Parcourez le répertoire [`cookbooks/`](https://github.com/julep-ai/julep/tree/dev/cookbooks) dans ce dépôt pour des définitions d'agents d'exemple.*
* **[Intégration IDE](https://context7.com/julep-ai/julep) :** Accédez à la documentation Julep directement dans votre IDE ! Parfait pour obtenir des réponses instantanées pendant que vous codez.
## Communauté et contributions
Rejoignez notre communauté grandissante de développeurs et d'enthousiastes de l'IA ! Voici quelques façons de s'impliquer et d'obtenir du soutien :
* **Communauté Discord :** Vous avez des questions ou des idées ? Rejoignez la conversation sur notre [serveur Discord officiel](https://discord.gg/7H5peSN9QP) pour discuter avec l'équipe Julep et d'autres utilisateurs. Nous sommes heureux d'aider avec le dépannage ou de réfléchir à de nouveaux cas d'usage.
* **Discussions et issues GitHub :** N'hésitez pas à utiliser GitHub pour signaler des bugs, demander des fonctionnalités, ou discuter des détails d'implémentation. Consultez les [**bonnes premières issues**](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) si vous souhaitez contribuer - nous accueillons les contributions de toutes sortes.
* **Contribuer :** Si vous voulez contribuer du code ou des améliorations, veuillez voir notre [Guide de contribution](CONTRIBUTING.md) pour comment commencer. Nous apprécions toutes les PR et les retours. En collaborant, nous pouvons rendre Julep encore meilleur !
*Conseil de pro :
Mettez une étoile à notre dépôt pour rester à jour - nous ajoutons constamment de nouvelles fonctionnalités et exemples.*
Vos contributions, grandes ou petites, nous sont précieuses. Construisons quelque chose d'incroyable ensemble !
Nos contributeurs extraordinaires :
## Licence
Julep est offert sous la **Licence Apache 2.0**, ce qui signifie qu'il est libre d'utilisation dans vos propres projets. Voir le fichier [LICENSE](LICENSE) pour plus de détails. Amusez-vous à construire avec Julep !
================================================
FILE: .github/README-JA.md
================================================
[Deutsch](https://www.readme-i18n.com/julep-ai/julep?lang=de) |
[Español](https://www.readme-i18n.com/julep-ai/julep?lang=es) |
[français](https://www.readme-i18n.com/julep-ai/julep?lang=fr) |
[日本語](https://www.readme-i18n.com/julep-ai/julep?lang=ja) |
[한국어](https://www.readme-i18n.com/julep-ai/julep?lang=ko) |
[Português](https://www.readme-i18n.com/julep-ai/julep?lang=pt) |
[Русский](https://www.readme-i18n.com/julep-ai/julep?lang=ru) |
[中文](https://www.readme-i18n.com/julep-ai/julep?lang=zh)
**今すぐJulepを試す:** **[Julepウェブサイト](https://julep.ai)** をご覧ください · **[Julepダッシュボード](https://dashboard.julep.ai)** で始める (無料APIキー) · **[ドキュメント](https://docs.julep.ai/introduction/julep)** を読む
📖 目次
- [なぜJulepなのか?](#なぜjulepなのか)
- [はじめに](#はじめに)
- [ドキュメントと例](#ドキュメントと例)
- [コミュニティと貢献](#コミュニティと貢献)
- [ライセンス](#ライセンス)
## なぜJulepなのか?
Julepは、単純なプロンプトのチェーンをはるかに超えた**エージェントベースのAIワークフロー**を構築するためのオープンソースプラットフォームです。大規模言語モデル(LLM)とツールを使用して複雑な多段階プロセスを**インフラストラクチャの管理なしに**オーケストレーションできます。Julepを使用すると、**過去のやり取りを記憶し**、分岐ロジック、ループ、並列実行、外部APIとの統合を備えた洗練されたタスクを処理するAIエージェントを作成できます。要するに、Julepは*「AIエージェントのためのFirebase」*として機能し、スケールでのインテリジェントワークフローのための堅牢なバックエンドを提供します。
**主要機能と利点:**
* **永続メモリ:** 会話を通じてコンテキストと長期記憶を維持するAIエージェントを構築し、時間をかけて学習と改善ができます。
* **モジュラーワークフロー:** 条件ロジック、ループ、エラーハンドリングを備えたモジュラーステップとして複雑なタスクを定義します(YAMLまたはコード)。Julepのワークフローエンジンが多段階プロセスと決定を自動的に管理します。
* **ツールオーケストレーション:** 外部ツールとAPI(Web検索、データベース、サードパーティサービスなど)をエージェントのツールキットの一部として簡単に統合します。Julepのエージェントはこれらのツールを呼び出して機能を拡張し、検索拡張生成などを可能にします。
* **並列・スケーラブル:** 効率性のために複数の操作を並列で実行し、Julepにスケーリングと並行処理を任せます。プラットフォームはサーバーレスなので、追加のDevOpsオーバーヘッドなしにワークフローをシームレスにスケールします。
* **信頼性のある実行:** 不具合を心配する必要はありません - Julepは組み込まれた再試行、自己修復ステップ、堅牢なエラーハンドリングを提供し、長時間実行タスクを軌道に乗せ続けます。また、進捗を追跡するためのリアルタイム監視とログも提供します。
* **簡単な統合:** **Python**と**Node.js**向けのSDK、またはスクリプト用のJulep CLIですぐに始められます。他のシステムに直接統合したい場合は、JulepのREST APIが利用可能です。
*AIロジックと創造性に集中し、重労働はJulepにお任せください!*
## はじめに
Julepの起動と実行は簡単です:
1. **サインアップとAPIキー:** まず、[Julepダッシュボード](https://dashboard.julep.ai)にサインアップしてAPIキーを取得します(SDK呼び出しの認証に必要)。
2. **SDKのインストール:** お好みの言語でJulep SDKをインストールします:
*
**Python:** `pip install julep`
*
**Node.js:** `npm install @julep/sdk` (または `yarn add @julep/sdk`)
3. **エージェントの定義:** SDKまたはYAMLを使用してエージェントとそのタスクワークフローを定義します。例えば、エージェントのメモリ、使用できるツール、ステップバイステップのタスクロジックを指定できます。(詳細なウォークスルーについては、ドキュメントの**[クイックスタート](https://docs.julep.ai/introduction/quick-start)**を参照してください。)
4. **ワークフローの実行:** SDKを通じてエージェントを呼び出してタスクを実行します。Julepプラットフォームがクラウドでワークフロー全体をオーケストレーションし、状態、ツール呼び出し、LLMインタラクションを管理します。エージェントの出力を確認し、ダッシュボードで実行を監視し、必要に応じて反復できます。
これで完了です!最初のAIエージェントを数分で起動して実行できます。完全なチュートリアルについては、ドキュメント内の**[クイックスタートガイド](https://docs.julep.ai/introduction/quick-start)**をご確認ください。
> **注意:** Julepはワークフローとエージェントを管理するためのコマンドラインインターface(CLI)も提供しています(現在Pythonのベータ版)。ノーコードアプローチを好む場合や一般的なタスクをスクリプト化したい場合は、詳細について[Julep CLIドキュメント](https://docs.julep.ai/responses/quickstart#cli-installation)を参照してください。
## ドキュメントと例
さらに深く学びたいですか?**[Julepドキュメント](https://docs.julep.ai)**は、コアコンセプト(エージェント、タスク、セッション、ツール)から高度なトピック(エージェントメモリ管理やアーキテクチャの内部構造)まで、プラットフォームを習得するために必要なすべてをカバーしています。主要なリソースには以下があります:
* **[コンセプトガイド](https://docs.julep.ai/concepts/):** Julepのアーキテクチャ、セッションとメモリの仕組み、ツールの使用、長い会話の管理などについて学びます。
* **[API・SDK リファレンス](https://docs.julep.ai/api-reference/):** JulepをアプリケーションNに統合するためのすべてのSDKメソッドとREST APIエンドポイントの詳細なリファレンスを見つけます。
* **[チュートリアル](https://docs.julep.ai/tutorials/):** 実際のアプリケーション構築のためのステップバイステップガイド(例:Webを検索するリサーチエージェント、旅行計画アシスタント、カスタム知識を持つチャットボット)。
* **[クックブックレシピ](https://github.com/julep-ai/julep/tree/dev/cookbooks):** 既製のワークフローとエージェントの例については**Julep Cookbook**を探索してください。これらのレシピは一般的なパターンと使用例を示しています - 例から学ぶ素晴らしい方法です。*サンプルエージェント定義については、このリポジトリの[`cookbooks/`](https://github.com/julep-ai/julep/tree/dev/cookbooks)ディレクトリを参照してください。*
* **[IDE統合](https://context7.com/julep-ai/julep):** IDE内でJulepドキュメントに直接アクセス!コーディング中に即座に答えを得るのに最適です。
## コミュニティと貢献
成長する開発者とAI愛好家のコミュニティに参加しましょう!参加とサポートを得る方法をいくつか紹介します:
* **Discordコミュニティ:** 質問やアイデアがありますか?[公式Discordサーバー](https://discord.gg/7H5peSN9QP)での会話に参加して、Julepチームや他のユーザーとチャットしましょう。トラブルシューティングのお手伝いや新しい使用例のブレインストーミングを喜んでサポートします。
* **GitHub ディスカッションとイシュー:** バグ報告、機能要求、実装詳細の議論には、GitHubを自由にご利用ください。貢献したい場合は[**good first issues**](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)をチェックしてください - あらゆる種類の貢献を歓迎します。
* **貢献:** コードや改善を貢献したい場合は、始め方について[貢献ガイド](CONTRIBUTING.md)を参照してください。すべてのPRとフィードバックを感謝します。協力することで、Julepをさらに良くすることができます!
*プロのヒント:
リポジトリにスターを付けて最新情報を入手してください - 新機能と例を継続的に追加しています。*
あなたの貢献は、大きいものも小さいものも、私たちにとって価値があります。一緒に素晴らしいものを構築しましょう!
素晴らしい貢献者たち:
## ライセンス
Julepは**Apache 2.0ライセンス**の下で提供されており、これは自分のプロジェクトで自由に使用できることを意味します。詳細については[LICENSE](LICENSE)ファイルを参照してください。Julepでの構築をお楽しみください!
================================================
FILE: .github/SUPPORT.md
================================================
# Support for Julep
Welcome to the Julep support page! We're here to help you with any questions or issues you may encounter while using our platform. This document outlines the various ways you can get support and engage with our community.
## Getting Help
### Documentation
Our comprehensive documentation is the first place to look for answers:
- [Explore Docs](https://docs.julep.ai)
Here you'll find detailed guides, API references, and tutorials to help you make the most of Julep.
### Community Support
Join our vibrant community to get help from other users and the Julep team:
- [Discord](https://discord.com/invite/JTSBGRZrzj): Join our Discord server to ask questions, share ideas, and discuss Julep with other developers.
- [GitHub](https://github.com/julep-ai/julep): Report issues and feature requests.
### Social Media
Follow us on social media for updates, tips, and community highlights:
- [𝕏 (Twitter)](https://x.com/julep_ai)
- [LinkedIn](https://www.linkedin.com/company/julep-ai)
## Reporting Issues
If you encounter a bug or have a feature request, please open an issue on our GitHub repository:
- [GitHub Issues](https://github.com/julep-ai/julep/issues)
When reporting issues, please provide as much detail as possible, including:
- Steps to reproduce the issue
- Expected behavior
- Actual behavior
- Any error messages or logs
- Your environment (Julep version, operating system, etc.)
## Contributing
We welcome contributions to Julep! If you're interested in contributing, please check out our:
- [Contributing Guidelines](https://github.com/julep-ai/julep/blob/dev/.github/CONTRIBUTING.md)
- [Code of Conduct](https://github.com/julep-ai/julep/blob/main/.github/CODE_OF_CONDUCT.md)
## API Keys
While we are in beta, you can reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get your API key.
## Staying Updated
To stay informed about the latest updates, features, and community news:
- Watch our [GitHub repository](https://github.com/julep-ai/julep)
- Follow us on [𝕏 (Twitter)](https://x.com/julep_ai)
- Join our [Discord](https://discord.com/invite/JTSBGRZrzj) for announcements
Thank you for using Julep! We're excited to see what you build with our platform.
================================================
FILE: .github/dependabot.yml
================================================
# 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/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
- package-ecosystem: "" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
================================================
FILE: .github/workflows/bake-push-to-hub.yml
================================================
name: Build and push images to docker hub on merge to dev
run-name: ${{ github.actor }} is building and pushing images to docker hub
on:
push:
branches:
- "dev"
tags:
- "v*"
release:
types: [published, released, prereleased]
jobs:
Bake-Push-Images:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: julepai
password: "${{ secrets.DOCKER_HUB_PASSWORD }}"
- name: Build and push agent images
uses: docker/bake-action@v5
with:
files: |
./docker-bake.hcl
targets: agents-api
push: true
set: |
*.cache-from=type=gha
*.cache-to=type=gha,mode=max
env:
TAG: ${{ github.ref_name }}
GIT_SHA: ${{ github.sha }}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
================================================
FILE: .github/workflows/bandit-security-check-python-agents-api.yml
================================================
name: Bandit security check python agents-api
run-name: ${{ github.actor }} is checking the security of the code
on:
workflow_dispatch:
pull_request:
paths:
- 'src/agents-api/**'
push:
paths:
- 'src/agents-api/**'
jobs:
bandit_check:
name: bandit check security of python code in agents-api
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Run Bandit scan
uses: PyCQA/bandit-action@v1
with:
targets: "./src/agents-api/agents_api"
confidence: high
severity: high
================================================
FILE: .github/workflows/changelog-ci.yml
================================================
name: Changelog on release
on:
release:
types: [published]
jobs:
changelog:
runs-on: ubuntu-latest
steps:
# Checks-out your repository
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: dev
# Generate changelog from release notes
- uses: rhysd/changelog-from-release/action@v3
with:
file: CHANGELOG.md
github_token: ${{ secrets.GITHUB_TOKEN }}
pull_request: true
================================================
FILE: .github/workflows/changelog-sync.yml
================================================
name: Sync changelog with Blot
on:
pull_request:
types: [opened, synchronize, reopened]
paths: ["changelog/**"]
push:
branches:
- main
- dev
paths:
- "changelog/**"
workflow_run:
workflows: ["Claude Changelog (PR)"]
types: [completed]
workflow_dispatch:
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Configure git identity
run: |
git config --global user.name "${{ secrets.BLOT_GIT_USERNAME }}"
git config --global user.email "${{ secrets.BLOT_GIT_USERNAME }}"
- name: Clone Blot repo
env:
BLOT_USERNAME: ${{ secrets.BLOT_GIT_USERNAME }}
BLOT_PASSWORD: ${{ secrets.BLOT_GIT_PASSWORD }}
run: |
# URL-encode the username (replace @ with %40)
export ENCODED_USERNAME=${BLOT_USERNAME//@/%40}
# Clone into a directory outside the current git repo to avoid conflicts
cd ${{ runner.temp }}
if ! git clone \
"https://${ENCODED_USERNAME}:${BLOT_PASSWORD}@blot.im/clients/git/end/julepchangelog.git" ; then
echo "Error: Failed to clone Blot repository"
exit 1
fi
# Get the default branch and ensure we're on it
cd julepchangelog
git checkout -B master origin/master
cd ${{ github.workspace }}
- name: Copy updated files into Blot working tree
run: |
if [ ! -d "changelog" ]; then
echo "Error: changelog directory not found"
exit 1
fi
if ! rsync -a --delete --exclude='.git/' --exclude='.gitignore' changelog/ ${{ runner.temp }}/julepchangelog/; then
echo "Error: Failed to sync files"
exit 1
fi
- name: Commit & push if there are changes
env:
BLOT_USERNAME: ${{ secrets.BLOT_GIT_USERNAME }}
BLOT_PASSWORD: ${{ secrets.BLOT_GIT_PASSWORD }}
run: |
cd ${{ runner.temp }}/julepchangelog
if [ -z "$(git status --porcelain)" ]; then
echo "No changes to publish"
exit 0
fi
if ! git add -A; then
echo "Error: Failed to stage changes"
exit 1
fi
if ! git commit -m "chore: publish updates"; then
echo "Error: Failed to commit changes"
exit 1
fi
# URL-encode the username (replace @ with %40)
export ENCODED_USERNAME=${BLOT_USERNAME//@/%40}
if ! git push "https://${ENCODED_USERNAME}:${BLOT_PASSWORD}@blot.im/clients/git/end/julepchangelog.git" master; then
echo "Error: Failed to push changes to branch master"
exit 1
fi
echo "Successfully synced changelog to Blot"
================================================
FILE: .github/workflows/claude-changelog-pr.yml
================================================
name: Claude Changelog (PR)
on:
pull_request:
branches: [main, dev]
types: [opened, synchronize, reopened]
paths-ignore:
- "changelog/**"
jobs:
changelog:
name: Update Changelog
runs-on: ubuntu-latest
if: ${{ github.event.sender.login != 'github-actions[bot]' && github.event.pull_request.user.login != 'claude-doc-bot' && contains(github.event.pull_request.title, '[skip-claude]') == false }}
permissions:
contents: write
pull-requests: write
issues: write
actions: read
id-token: write
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.AWS_ROLE_NAME }}
role-session-name: GitHubActions-Claude-Changelog-${{ github.run_id }}
aws-region: us-east-1
- name: Save PR patch
run: gh pr diff ${{ github.event.pull_request.number }} --patch > diff.patch
env:
GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
- name: Set changelog directory
id: set_cl_dir
run: |
if [[ "${{ github.event.pull_request.base.ref }}" == "dev" ]]; then
echo "CHANGELOG_DIR=changelog/dev" >> "$GITHUB_ENV"
echo "CHANGELOG_TAG=dev" >> "$GITHUB_ENV"
else
echo "CHANGELOG_DIR=changelog/main" >> "$GITHUB_ENV"
echo "CHANGELOG_TAG=main" >> "$GITHUB_ENV"
fi
- name: Claude updates changelog & home summary
uses: anthropics/claude-code-action@v1
with:
use_bedrock: "true"
track_progress: true
github_token: ${{ secrets.GITHUB_TOKEN }}
claude_args: |
--model us.anthropic.claude-sonnet-4-20250514-v1:0
--max-turns 5
--allowedTools Read,Edit,MultiEdit
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
You are the team's *changelog* bot. Follow these rules strictly:
1. Read the unified diff in *diff.patch*.
2. Decide if the patch introduces any user-visible change (new feature, behaviour change, deprecation, bug fix).
• If **no user-visible change** – *do nothing*: exit without writing, committing, or replying.
3. If **yes**:
a. **Create or update** file in *${{ env.CHANGELOG_DIR }}* named `{YYYY}-{MM}-{DD}.md` with a concise bullet list of the changes.
• Begin each bullet with a past-tense verb (e.g. "Added", "Fixed").
• Keep bullets short (< 100 chars).
• Ensure the file contains YAML front-matter:
```
---
title: "Julep AI Changelog"
date: {YYYY}-{MM}-{DD}
tags: [${{ env.CHANGELOG_TAG }}]
---
```
b. **Update** `Templates/index-template/home-summary.html` so the home page shows the newest entry's title, date and bullet list (only if the PR is on main).
4. Finally, stage, commit and push the edits with a clear message.
================================================
FILE: .github/workflows/claude-code-review.yml
================================================
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
# Optional: Only run on specific file changes
# paths:
# - "src/**/*.ts"
# - "src/**/*.tsx"
# - "src/**/*.js"
# - "src/**/*.jsx"
jobs:
claude-review:
# Optional: Filter by PR author
# if: |
# github.event.pull_request.user.login == 'external-contributor' ||
# github.event.pull_request.user.login == 'new-developer' ||
# github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
actions: read
id-token: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.AWS_ROLE_NAME }}
role-session-name: GitHubActions-Claude-${{ github.run_id }}
aws-region: us-east-1
- name: Run Claude Code Review
id: claude-review
uses: anthropics/claude-code-action@v1
with:
use_bedrock: "true"
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
This is a monorepo with multiple different services.
The repo uses AGENTS.md as the file that contains instructions for
AI agents (instead of CLAUDE.md files). CLAUDE.md still exists but is just a symlink to the corresponding AGENTS.md (usually in the same dir).
Please review this pull request and provide feedback on:
- Code quality and best practices
- Potential bugs or issues
- Performance considerations
- Security concerns
- Test coverage
Use the repository's CLAUDE.md for guidance on style and conventions. Be constructive and helpful in your feedback.
Use `gh pr comment` with your Bash tool to leave your review as a comment on the PR.
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://docs.anthropic.com/en/docs/claude-code/sdk#command-line for available options
claude_args: |
--model us.anthropic.claude-opus-4-1-20250805-v1:0
--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"
================================================
FILE: .github/workflows/claude-docs-manual.yml
================================================
name: Claude Docs (Manual)
on:
workflow_dispatch:
inputs:
pr_number:
description: "PR number"
required: true
jobs:
update-docs:
name: Manual Doc Update
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
actions: read
id-token: write
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.AWS_ROLE_NAME }}
role-session-name: GitHubActions-Claude-Docs-${{ github.run_id }}
aws-region: us-east-1
- name: Save PR patch
run: gh pr diff ${{ github.event.inputs.pr_number }} --patch > diff.patch
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Determine PR base branch
id: pr_base
run: |
base=$(gh pr view ${{ github.event.inputs.pr_number }} --json baseRefName -q .baseRefName)
echo "BASE_BRANCH=$base" >> "$GITHUB_OUTPUT"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Set changelog directory
id: set_cl_dir
run: |
if [[ "${{ steps.pr_base.outputs.BASE_BRANCH }}" == "dev" ]]; then
echo "CHANGELOG_DIR=changelog/dev" >> "$GITHUB_ENV"
echo "CHANGELOG_TAG=dev" >> "$GITHUB_ENV"
else
echo "CHANGELOG_DIR=changelog/main" >> "$GITHUB_ENV"
echo "CHANGELOG_TAG=main" >> "$GITHUB_ENV"
fi
- name: Claude changes docs
uses: anthropics/claude-code-action@v1
with:
use_bedrock: "true"
track_progress: true
github_token: ${{ secrets.GITHUB_TOKEN }}
claude_args: |
--model us.anthropic.claude-sonnet-4-20250514-v1:0
--max-turns 10
--allowedTools Read,Edit,MultiEdit,Write
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.inputs.pr_number }}
You are the team's documentation bot.
1. Read *diff.patch*.
2. For any change that affects users:
1. **edit** files under *documentation/***
(Mintlify structure) so docs stay accurate.
2. **create** new file in *${{ env.CHANGELOG_DIR }}***
named `{YYYY}-{MM}-{DD}.md`** containing a bulleted list
of the changes (don't include unnecessary details).
- File front-matter:
```
---
title: "Julep AI Changelog – {human-readable-date}"
date: {YYYY}-{MM}-{DD}
tags: [${{ env.CHANGELOG_TAG }}]
---
```
- If the file already exists, append to its bullet list.
3. **update** `Templates/index-template/home-summary.html` so the home page summarises the latest entry from the changelog (same title/date and bullet list).
3. Commit the edits.
If diff.patch has no user-visible change, do nothing.
4. Finally, stage, commit and push the edits with a clear message.
Note: AGENTS.md replaces CLAUDE.md (CLAUDE.md is a symlink).
================================================
FILE: .github/workflows/claude-docs-pr.yml
================================================
name: Claude Docs (PR)
on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]
paths-ignore:
- "changelog/**"
jobs:
docs-gate:
name: Documentation Gate
runs-on: ubuntu-latest
if: ${{ github.event.sender.login != 'github-actions[bot]' && github.event.pull_request.user.login != 'claude-doc-bot' && contains(github.event.pull_request.title, '[skip-claude]') == false }}
outputs:
pr_number: ${{ steps.resolve.outputs.number }}
should_update: ${{ steps.gate.outputs.result }}
permissions:
contents: read
pull-requests: read
actions: read
id-token: write
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.AWS_ROLE_NAME }}
role-session-name: GitHubActions-Claude-DocsGate-${{ github.run_id }}
aws-region: us-east-1
- name: PR number
id: resolve
run: echo "number=${{ github.event.pull_request.number }}" >> "$GITHUB_OUTPUT"
- name: Save PR patch
run: gh pr diff ${{ steps.resolve.outputs.number }} --patch > diff.patch
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Gate
id: gate
uses: anthropics/claude-code-action@v1
with:
use_bedrock: "true"
track_progress: true
github_token: ${{ secrets.GITHUB_TOKEN }}
claude_args: |
--model us.anthropic.claude-sonnet-4-20250514-v1:0
--max-turns 2
--allowedTools Read
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ github.event.pull_request.number }}
You are a senior technical-writer.
Read *diff.patch* (unified diff).
Reply with the single word **UPDATE** if the patch
a) adds new user-visible functionality,
b) changes or removes existing behaviour,
c) deprecates anything,
otherwise reply **SKIP**.
update-docs:
name: Update Documentation
needs: docs-gate
if: ${{ github.event.sender.login != 'github-actions[bot]' &&
needs.docs-gate.result == 'success' &&
needs.docs-gate.outputs.should_update == 'UPDATE' }}
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
actions: read
id-token: write
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.AWS_ROLE_NAME }}
role-session-name: GitHubActions-Claude-DocsUpdate-${{ github.run_id }}
aws-region: us-east-1
- name: Save PR patch
run: gh pr diff ${{ needs.docs-gate.outputs.pr_number }} --patch > diff.patch
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Claude changes docs
uses: anthropics/claude-code-action@v1
with:
use_bedrock: "true"
track_progress: true
github_token: ${{ secrets.GITHUB_TOKEN }}
claude_args: |
--model us.anthropic.claude-opus-4-1-20250805-v1:0
--max-turns 10
--allowedTools Read,Edit,MultiEdit
prompt: |
REPO: ${{ github.repository }}
PR NUMBER: ${{ needs.docs-gate.outputs.pr_number }}
You are the team's documentation bot.
1. Read *diff.patch*.
2. For any change that affects users, **edit** files under *documentation/***
(Mintlify structure) so docs stay accurate.
3. Commit the edits.
If diff.patch has no user-visible change, do nothing.
4. Finally, stage, commit and push the edits with a clear message.
Note: AGENTS.md replaces CLAUDE.md (CLAUDE.md is a symlink).
================================================
FILE: .github/workflows/claude.yml
================================================
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
issues:
types: [opened, assigned]
pull_request_review:
types: [submitted]
jobs:
claude:
if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
actions: read # Required for Claude to read CI results on PRs
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::${{ secrets.AWS_ACCOUNT_ID }}:role/${{ secrets.AWS_ROLE_NAME }}
role-session-name: GitHubActions-Claude-${{ github.run_id }}
aws-region: us-east-1
- name: Run Claude Code
id: claude
uses: anthropics/claude-code-action@v1
with:
use_bedrock: "true"
# This is an optional setting that allows Claude to read CI results on PRs
additional_permissions: |
actions: read
# Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
# prompt: 'Update the pull request description to include a summary of changes.'
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://docs.anthropic.com/en/docs/claude-code/sdk#command-line for available options
claude_args: |
--model us.anthropic.claude-opus-4-1-20250805-v1:0
--allowed-tools "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh pr list:*)"
================================================
FILE: .github/workflows/docker-bake-on-pr.yml
================================================
name: Bake images on PR
run-name: ${{ github.actor }} is baking images
on:
pull_request:
jobs:
Bake-Images:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: julepai
password: "${{ secrets.DOCKER_HUB_PASSWORD }}"
- name: Bake images
uses: docker/bake-action@v5
with:
files: |
./docker-bake.hcl
targets: agents-api
push: false
set: |
*.cache-from=type=gha
*.cache-to=type=gha,mode=max
env:
TAG: pr-run-${{ github.run_number }}-${{ github.run_attempt }}
GIT_SHA: ${{ github.sha }}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
================================================
FILE: .github/workflows/doctoc-on-push.yml
================================================
on: push
name: TOC Generator
jobs:
generateTOC:
name: TOC Generator
runs-on: ubuntu-latest
steps:
- uses: technote-space/toc-generator@v4
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
MAX_HEADER_LEVEL: 3
TOC_TITLE: '📖 Table of Contents
'
FOLDING: false
CREATE_PR: true
CHECK_ONLY_DEFAULT_BRANCH: true
================================================
FILE: .github/workflows/generate-changelog.yml
================================================
name: Julep Changelog Generation
run-name: ${{ github.actor }} is generating changelog for the last two weeks using Julep
on:
workflow_dispatch:
jobs:
changelog_generation:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: dev
- name: Setup GitHub CLI
run: |
echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token
- name: Collect merged PRs from the last two weeks
id: collect_prs
run: |
date_threshold=$(date -d '-14 days' +"%Y-%m-%d")
echo "Fetching merged PRs since $date_threshold..."
merged_prs=$(
gh pr list --state merged --json number,title,body,author \
--search "merged:>=$date_threshold" \
--jq 'map({number, title, body, author: .author.login})'
)
if [ -z "$merged_prs" ] || [ "$merged_prs" = "null" ]; then
echo "No merged PRs found in the last two weeks."
echo "has_prs=false" >> $GITHUB_OUTPUT
exit 0
fi
echo "$merged_prs" > pr_data.json
echo "has_prs=true" >> $GITHUB_OUTPUT
- name: Setup Python v3.10.12
uses: actions/setup-python@v5
with:
python-version: "3.10.12"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
python -m pip install PyYAML julep
- name: Send PR data to Python script
if: steps.collect_prs.outputs.has_prs == 'true'
id: generate_changelog
run: |
if ! python src/scripts/generate_changelog.py; then
echo "Error: Failed to generate changelog"
exit 1
fi
env:
JULEP_API_KEY: ${{ secrets.JULEP_API_KEY }}
TASK_UUID: ${{ secrets.TASK_UUID }}
AGENT_UUID: ${{ secrets.AGENT_UUID }}
- name: Create Pull Request
if: success() && steps.collect_prs.outputs.has_prs == 'true'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "chore(changelog): update CHANGELOG.md"
title: "Update CHANGELOG.md"
body: "This PR updates the changelog with PRs from the last 2 weeks."
branch: "update-changelog"
delete-branch: true
add-paths: |
CHANGELOG.md
================================================
FILE: .github/workflows/generate-openapi-code-from-typespec.yml
================================================
name: Generate OpenAPI code
run-name: ${{ github.actor }} is generating openapi code
on:
pull_request:
paths:
- 'src/typespec/**'
push:
paths:
- 'src/typespec/**'
jobs:
Typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 'latest'
cache: npm
cache-dependency-path: 'src/typespec/package-lock.json'
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Generate openapi code
run: |
cd src/typespec; npm ci; cd -
export PATH=$PATH:$PWD/src/typespec/node_modules/.bin
bash src/scripts/generate_openapi_code.sh
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
================================================
FILE: .github/workflows/latest-push-to-hub.yml
================================================
name: Build and push images to docker hub on merge to main
run-name: ${{ github.actor }} is building and pushing images to docker hub
on:
push:
branches:
- "main"
jobs:
Bake-Push-Images:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: julepai
password: "${{ secrets.DOCKER_HUB_PASSWORD }}"
- name: Build and push agent images
uses: docker/bake-action@v5
with:
files: |
./docker-bake.hcl
targets: agents-api
push: true
set: |
*.cache-from=type=gha
*.cache-to=type=gha,mode=max
env:
TAG: latest
GIT_SHA: ${{ github.sha }}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
================================================
FILE: .github/workflows/lint-agents-api-pr.yml
================================================
name: Lint agents-api
run-name: ${{ github.actor }} is linting the code
on:
pull_request:
paths:
- 'src/agents-api/**'
push:
paths:
- 'src/agents-api/**'
jobs:
Lint-And-Format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install libboost
run: sudo apt-get install -y libboost-all-dev
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Install Go migrate
uses: jaxxstorm/action-install-gh-release@v1.10.0
with: # Grab the latest version
repo: golang-migrate/migrate
- name: Set up python and install dependencies
run: |
cd src/agents-api
uv python install
uv sync --all-extras --dev
- name: Lint and format
run: |
cd src/agents-api
uv run poe format
uv run poe lint
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "refactor: Lint agents-api (CI)"
branch: ${{ github.head_ref }}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
================================================
FILE: .github/workflows/lint-integrations-service-pr.yml
================================================
name: Lint integrations-service
run-name: ${{ github.actor }} is linting the code
on:
pull_request:
paths:
- 'src/integrations-service/**'
push:
paths:
- 'src/integrations-service/**'
jobs:
Lint-And-Format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Set up python and install dependencies
run: |
cd src/integrations-service
uv python install
uv sync --all-extras --dev
- name: Lint and format
run: |
cd src/integrations-service
uv run poe format
uv run poe lint
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "refactor: Lint integrations-service (CI)"
branch: ${{ github.head_ref }}
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
================================================
FILE: .github/workflows/publish-cli-prerelease.yml
================================================
name: Publish CLI Prerelease to PyPI
# AIDEV-NOTE: Auto-publish CLI package to PyPI for prerelease versions only
permissions:
contents: write
packages: write
on:
push:
branches:
- dev
- main
paths:
- 'src/cli/**'
workflow_dispatch:
jobs:
check-and-publish:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./src/cli
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Install dependencies
run: |
uv sync --dev
- name: Extract version from pyproject.toml
id: version
run: |
# Extract version using grep and sed (no additional dependencies needed)
VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Extracted version: $VERSION"
- name: Check if version is prerelease
id: prerelease
run: |
VERSION="${{ steps.version.outputs.version }}"
echo "Checking version: $VERSION"
# Check if version contains prerelease indicators
if echo "$VERSION" | grep -E "(alpha|beta|rc|pre|dev)" > /dev/null; then
echo "is_prerelease=true" >> $GITHUB_OUTPUT
echo "✅ Version $VERSION is a prerelease"
else
echo "is_prerelease=false" >> $GITHUB_OUTPUT
echo "❌ Version $VERSION is NOT a prerelease"
fi
- name: Run linting and type checking
if: steps.prerelease.outputs.is_prerelease == 'true'
run: |
uv run poe check
- name: Run tests
if: steps.prerelease.outputs.is_prerelease == 'true'
run: |
uv run poe test
- name: Build package
if: steps.prerelease.outputs.is_prerelease == 'true'
run: |
uv build
- name: Check if version already exists on PyPI
if: steps.prerelease.outputs.is_prerelease == 'true'
id: check_pypi
run: |
VERSION="${{ steps.version.outputs.version }}"
# Check if this version already exists on PyPI
if pip index versions julep-cli | grep "$VERSION" > /dev/null 2>&1; then
echo "version_exists=true" >> $GITHUB_OUTPUT
echo "⚠️ Version $VERSION already exists on PyPI"
else
echo "version_exists=false" >> $GITHUB_OUTPUT
echo "✅ Version $VERSION does not exist on PyPI, proceeding with publish"
fi
- name: Publish to PyPI
if: steps.prerelease.outputs.is_prerelease == 'true' && steps.check_pypi.outputs.version_exists == 'false'
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
packages-dir: src/cli/dist/
verbose: true
- name: Create GitHub Release
if: steps.check_pypi.outputs.version_exists == 'false'
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: cli-v${{ steps.version.outputs.version }}
release_name: CLI v${{ steps.version.outputs.version }}
body: |
🚀 **Julep CLI Prerelease v${{ steps.version.outputs.version }}**
This is a prerelease version of the Julep CLI.
## Installation
```bash
pip install julep-cli==${{ steps.version.outputs.version }}
```
## Changes
See the [changelog](https://github.com/julep-ai/julep/blob/dev/CHANGELOG.md) for detailed changes.
---
*This release was automatically generated by GitHub Actions.*
prerelease: true
draft: false
- name: Summary
run: |
echo "## Workflow Summary" >> $GITHUB_STEP_SUMMARY
echo "- **Version**: ${{ steps.version.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "- **Is Prerelease**: ${{ steps.prerelease.outputs.is_prerelease }}" >> $GITHUB_STEP_SUMMARY
echo "- **Version Exists on PyPI**: ${{ steps.check_pypi.outputs.version_exists }}" >> $GITHUB_STEP_SUMMARY
if [ "${{ steps.prerelease.outputs.is_prerelease }}" == "true" ] && [ "${{ steps.check_pypi.outputs.version_exists }}" == "false" ]; then
echo "- **Action**: ✅ Published to PyPI and created GitHub release" >> $GITHUB_STEP_SUMMARY
elif [ "${{ steps.prerelease.outputs.is_prerelease }}" == "true" ] && [ "${{ steps.check_pypi.outputs.version_exists }}" == "true" ]; then
echo "- **Action**: ⚠️ Skipped (version already exists on PyPI)" >> $GITHUB_STEP_SUMMARY
else
echo "- **Action**: ❌ Skipped (not a prerelease version)" >> $GITHUB_STEP_SUMMARY
fi
================================================
FILE: .github/workflows/sync-model-docs.yml
================================================
name: Sync Model Documentation
on:
push:
branches:
- dev
paths:
- 'src/llm-proxy/litellm-config.yaml'
- 'src/scripts/sync_model_docs.py'
workflow_dispatch:
jobs:
sync-model-docs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.12'
- name: Install dependencies
run: |
pip install pyyaml
- name: Run sync script
run: |
python src/scripts/sync_model_docs.py
- name: Check for changes
id: check_changes
run: |
if git diff --quiet documentation/integrations/supported-models.mdx; then
echo "changed=false" >> $GITHUB_OUTPUT
else
echo "changed=true" >> $GITHUB_OUTPUT
fi
- name: Commit and push changes
if: steps.check_changes.outputs.changed == 'true'
run: |
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git add documentation/integrations/supported-models.mdx
git commit -m "chore: sync model documentation from litellm-config.yaml [skip ci]"
git push
================================================
FILE: .github/workflows/test-agents-api-pr.yml
================================================
name: Test agents-api
run-name: ${{ github.actor }} is testing the code
on:
pull_request:
paths:
- 'src/agents-api/**'
push:
paths:
- 'src/agents-api/**'
jobs:
Test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install libboost
run: sudo apt-get install -y libboost-all-dev
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Install Go migrate
uses: jaxxstorm/action-install-gh-release@v1.10.0
with: # Grab the latest version
repo: golang-migrate/migrate
- name: Set up python and install dependencies
run: |
cd src/agents-api
uv python install
uv sync --all-extras --dev
- name: Run tests
env:
SECRETS_MASTER_KEY: ${{ secrets.SECRETS_MASTER_KEY }}
run: |
cd src/agents-api
uv run poe test --fail-limit 3
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
================================================
FILE: .github/workflows/test-integrations-service-pr.yml
================================================
name: Test integrations-service
run-name: ${{ github.actor }} is testing the code
on:
pull_request:
paths:
- 'src/integrations-service/**'
push:
paths:
- 'src/integrations-service/**'
jobs:
Test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Set up python and install dependencies
run: |
cd src/integrations-service
uv python install
uv sync --all-extras --dev
- name: Run tests
run: |
cd src/integrations-service
uv run poe test
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
================================================
FILE: .github/workflows/translate-readme.yml
================================================
name: Translate README
on:
pull_request:
paths:
- "README.md"
- ".github/README-*.md"
jobs:
translate_readme:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: anthropics/claude-code-action@beta
with:
direct_prompt: >-
Use the root README.md to review the .github/README-{lang}.md files
to see if they are correctly translated and if needed
make changes as necessary. Keep the contents exactly the same, just
translated to the target languages.
custom_instructions: >-
This is a monorepo with multiple different services.
The repo uses AGENTS.md as the file that contains instructions for
AI agents (instead of CLAUDE.md files). CLAUDE.md still exists but
is just a symlink to the corresponding AGENTS.md (usually in the same dir).
anthropic_model: ${{ vars.TRANSLATOR_CLAUDE_MODEL }}
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
allowed_tools: "Bash(npm install),Bash(npm run test),Edit,Replace,NotebookEditCell"
disallowed_tools: "TaskOutput,KillTask"
================================================
FILE: .github/workflows/typecheck-agents-api-pr.yml
================================================
name: Typecheck agents-api
run-name: ${{ github.actor }} is typechecking the code
on:
pull_request:
paths:
- 'src/agents-api/**'
push:
paths:
- 'src/agents-api/**'
jobs:
Typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install libboost
run: sudo apt-get install -y libboost-all-dev
- name: Cache pytype
uses: actions/cache@v4
with:
path: src/agents-api/.pytype
key: ${{ runner.os }}-agents-api-pytype-${{ github.base_ref }}
restore-keys: |
${{ runner.os }}-agents-api-pytype-
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
enable-cache: true
- name: Install Go migrate
uses: jaxxstorm/action-install-gh-release@v1.10.0
with: # Grab the latest version
repo: golang-migrate/migrate
- name: Set up python and install dependencies
run: |
cd src/integrations-service
uv python install
uv sync --all-extras --dev
- name: Typecheck
run: |
cd src/agents-api
uv run poe typecheck
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
================================================
FILE: .gitignore
================================================
# BECAUSE DIWANK IS OBSESSED
*gaga*
.DS_Store
*.swp
ngrok*
.env*
.env
*.env
*.pyc
**/node_modules/
.aider*
.vscode/
schema.sql
*.egg-info/
**/*.egg-info/
**/.claude/settings.local.json
================================================
FILE: .gitmodules
================================================
# [submodule "code-interpreter/vendor/cohere-ai/cohere-terrarium"]
# path = code-interpreter/vendor/cohere-ai/cohere-terrarium
# url = https://github.com/cohere-ai/cohere-terrarium.git
[submodule "sdks/python-sdk"]
path = sdks/python-sdk
url = https://github.com/julep-ai/python-sdk.git
[submodule "sdks/node-sdk"]
path = sdks/node-sdk
url = https://github.com/julep-ai/node-sdk.git
================================================
FILE: .mcp.json
================================================
{
"mcpServers": {
"deepwiki": {
"type": "http",
"url": "https://mcp.deepwiki.com/mcp"
},
"linear": {
"type": "sse",
"url": "https://mcp.linear.app/sse"
},
"fetch": {
"type": "stdio",
"command": "uvx",
"args": [
"mcp-server-fetch"
],
"env": {}
},
"firecrawl": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"firecrawl-mcp"
],
"env": {}
}
}
}
================================================
FILE: AGENTS.md
================================================
# AGENTS.md. Julep AI
*Last updated 2025-05-09*
> **purpose** – This file is the onboarding manual for every AI assistant (Claude, Cursor, GPT, etc.) and every human who edits this repository.
> It encodes our coding standards, guard-rails, and workflow tricks so the *human 30 %* (architecture, tests, domain judgment) stays in human hands.[^1]
---
## 0. Project overview
Julep is a serverless platform for building AI workflows and agents. It helps data and ML teams orchestrate complex AI operations, manage state across interactions, and integrate with existing data infrastructure and tools. Key components:
- **src/ts-api**: Core service for agent definitions and task execution
- **src/memory-store**: Persistent storage with PostgreSQL and vector capabilities
- **src/scheduler**: Temporal-based workflow engine for execution
- **src/integrations-service**: Connectors to external services and tools
- **src/**: All core service modules are now organized under the src/ directory
**Golden rule**: When unsure about implementation details or requirements, ALWAYS consult the developer rather than making assumptions.
---
## 1. Non-negotiable golden rules
| #: | AI *may* do | AI *must NOT* do |
|---|------------------------------------------------------------------------|-------------------------------------------------------------------------------------|
| G-0 | Whenever unsure about something that's related to the project, ask the developer for clarification before making changes. | ❌ Write changes or use tools when you are not sure about something project specific, or if you don't have context for a particular feature/decision. |
| G-1 | Generate code **only inside** relevant source directories (e.g., `src/agents-api/agents_api/` for the main API, `src/cli/src/` for the CLI, `src/integrations-service/` for integration-specific code) or explicitly pointed files. | ❌ Touch `tests/`, `SPEC.md`, or any `*_spec.py` / `*.ward` files (humans own tests & specs). |
| G-2 | Add/update **`AIDEV-NOTE:` anchor comments** near non-trivial edited code. | ❌ Delete or mangle existing `AIDEV-` comments. |
| G-3 | Follow lint/style configs (`pyproject.toml`, `.ruff.toml`, `.pre-commit-config.yaml`). Use the project's configured linter, if available, instead of manually re-formatting code. | ❌ Re-format code to any other style. |
| G-4 | For changes >300 LOC or >3 files, **ask for confirmation**. | ❌ Refactor large modules without human guidance. |
| G-5 | Stay within the current task context. Inform the dev if it'd be better to start afresh. | ❌ Continue work from a prior prompt after "new task" – start a fresh session. |
---
## 2. Build, test & utility commands
Use `poe` tasks for consistency (they ensure correct environment variables and configuration).
```bash
# Format, lint, type-check, test, codegen
poe format # ruff format
poe lint # ruff check
poe typecheck # pytype --config pytype.toml (for agents-api) / pyright (for cli)
poe test # ward test --exclude .venv (pytest for integrations-service)
poe test --search "pattern" # Run specific tests by Ward pattern
poe check # format + lint + type + SQL validation
poe codegen # generate API code (e.g., OpenAPI from TypeSpec)
```
For simple, quick Python script tests: `PYTHONPATH=$PWD python tests/test_file.py` (ensure correct CWD).
---
## 3. Coding standards
* **Python**: 3.12+, FastAPI, `async/await` preferred.
* **Formatting**: `ruff` enforces 96-char lines, double quotes, sorted imports. Standard `ruff` linter rules.
* **Typing**: Strict (Pydantic v2 models preferred); `from __future__ import annotations`.
* **Naming**: `snake_case` (functions/variables), `PascalCase` (classes), `SCREAMING_SNAKE` (constants).
* **Error Handling**: Typed exceptions; context managers for resources.
* **Documentation**: Google-style docstrings for public functions/classes.
* **Testing**: Separate test files matching source file patterns.
**Error handling patterns**:
- Use typed, hierarchical exceptions defined in `exceptions.py`
- Catch specific exceptions, not general `Exception`
- Use context managers for resources (database connections, file handles)
- For async code, use `try/finally` to ensure cleanup
Example:
```python
from agents_api.common.exceptions import ValidationError
async def process_data(data: dict) -> Result:
try:
# Process data
return result
except KeyError as e:
raise ValidationError(f"Missing required field: {e}") from e
```
---
## 4. Project layout & Core Components
| Directory | Description |
| --------------------------------- | ------------------------------------------------- |
| `src/agents-api/` | FastAPI service & Temporal activities |
| `src/memory-store/` | PostgreSQL + TimescaleDB schemas & migrations |
| `src/blob-store/` | S3-compatible object storage for files |
| `src/integrations-service/` | Adapters for external services (browsers, APIs) |
| `src/scheduler/` | Temporal workflow engine for execution |
| `src/gateway/` | API gateway (routing, request handling) |
| `src/llm-proxy/` | LiteLLM proxy for language models |
| `src/monitoring/` | Prometheus & Grafana |
| `src/typespec/` | **Source-of-truth** API specifications (TypeSpec) |
| `sdks/` | Node.js & Python client SDKs |
See `.github/CONTRIBUTING.md` for a full architecture diagram.
**Key domain models**:
- **Agents**: AI agent definitions with instructions and tools
- **Tasks**: Workflow definitions with individual steps
- **Tools**: Integrations and capabilities for agents to use
- **Sessions**: Conversation containers with context
- **Entries**: Message history tracking
- **Executions**: Task execution state tracking
---
## 5. Anchor comments
Add specially formatted comments throughout the codebase, where appropriate, for yourself as inline knowledge that can be easily `grep`ped for.
### Guidelines:
- Use `AIDEV-NOTE:`, `AIDEV-TODO:`, or `AIDEV-QUESTION:` (all-caps prefix) for comments aimed at AI and developers.
- Keep them concise (≤ 120 chars).
- **Important:** Before scanning files, always first try to **locate existing anchors** `AIDEV-*` in relevant subdirectories.
- **Update relevant anchors** when modifying associated code.
- **Do not remove `AIDEV-NOTE`s** without explicit human instruction.
- Make sure to add relevant anchor comments, whenever a file or piece of code is:
* too long, or
* too complex, or
* very important, or
* confusing, or
* could have a bug unrelated to the task you are currently working on.
Example:
```python
# AIDEV-NOTE: perf-hot-path; avoid extra allocations (see ADR-24)
async def render_feed(...):
...
```
---
## 6. Commit discipline
* **Granular commits**: One logical change per commit.
* **Tag AI-generated commits**: e.g., `feat: optimise feed query [AI]`.
* **Clear commit messages**: Explain the *why*; link to issues/ADRs if architectural.
* **Use `git worktree`** for parallel/long-running AI branches (e.g., `git worktree add ../wip-foo -b wip-foo`).
* **Review AI-generated code**: Never merge code you don't understand.
---
## 7. API models & codegen
* To modify API models (e.g., in `src/agents-api/agents_api/autogen/`), **edit TypeSpec files** in `src/typespec/`.
* **Regenerate code** after TypeSpec changes: `bash src/scripts/generate_openapi_code.sh` (from project root).
* **Do NOT manually edit** generated files (e.g., in `autogen/` directories) as they will be overwritten.
**API pattern examples**:
```python
# Route definition
@router.post("/sessions/{session_id}/entries", response_model=EntryResponse)
async def create_entry(
session_id: str,
entry_create: EntryCreate,
current_user: User = Depends(get_current_user),
) -> EntryResponse:
"""Create a new entry in a session."""
# Implementation...
```
---
## 8. Python expressions in tasks (agents-api)
* Evaluated using `simpleeval` in a sandboxed environment.
* Use `validate_py_expression()` from `agents_api.activities.task_steps.base_evaluate` for static checks (syntax, undefined names, safety).
* Expressions have access to `_` (current input) and standard library modules.
* Test expressions: `PYTHONPATH=$PWD python -c "from agents_api.activities.task_steps.base_evaluate import validate_py_expression; print(validate_py_expression('$ your_expr_here'))"`
* Task validation handles raw task dictionaries and Pydantic models (after `task_to_spec` conversion).
* In `task_to_spec` converted tasks, `kind_` field denotes step type. Raw tasks use step type keys.
* For "if_else" steps, condition is in `if_` field (aliased as "if").
**Expression example**:
```python
# Simple expression example
"$_['customer']['total_orders'] > 5" # Checks if customer has more than 5 orders
# More complex example with dict access and function calls
"$len([x for x in _['items'] if x['category'] == 'electronics']) > 0"
```
---
## 9. Ward testing framework
* Use descriptive test names: `@test("Descriptive name of what is being tested")`.
* Activate virtual environment: `source .venv/bin/activate`.
* Ensure correct working directory (e.g., `src/agents-api/`) and `PYTHONPATH=$PWD` for script-based tests.
* Filter tests: `poe test --search "pattern_to_match"` (do NOT use `-p`).
* Limit failures for faster feedback: `poe test --fail-limit 1 --search "pattern_to_match"`.
---
## 10. Directory-Specific AGENTS.md Files
* **Always check for `AGENTS.md` files in specific directories** before working on code within them. These files contain targeted context.
* If a directory's `AGENTS.md` is outdated or incorrect, **update it**.
* If you make significant changes to a directory's structure, patterns, or critical implementation details, **document these in its `AGENTS.md`**.
* If a directory lacks a `AGENTS.md` but contains complex logic or patterns worth documenting for AI/humans, **suggest creating one**.
---
## 11. Common pitfalls
* Mixing pytest & ward syntax (ward uses `@test()` decorator, not pytest fixtures/classes).
* Forgetting to `source .venv/bin/activate`.
* Wrong current working directory (CWD) or `PYTHONPATH` for commands/tests (e.g., ensure you are in `agents-api/` not root for some `agents-api` tasks).
* Large AI refactors in a single commit (makes `git bisect` difficult).
* Delegating test/spec writing entirely to AI (can lead to false confidence).
* **Note about `src/`**: Only the `cli` component has a `src/` directory. For `src/agents-api`, code is directly in `agents_api/`. Follow the existing pattern for each component.
---
## 12. Versioning conventions
Components (e.g., `agents-api`, `julep-cli`, `integrations-service`) are versioned independently. Semantic Versioning (SemVer: `MAJOR.MINOR.PATCH`) is generally followed, as specified in each component's `pyproject.toml` file.
* **MAJOR** version update: For incompatible API changes.
* **MINOR** version update: For adding functionality in a backward-compatible manner.
* **PATCH** version update: For backward-compatible bug fixes.
---
## 13. Key File & Pattern References
This section provides pointers to important files and common patterns within the codebase.
* **API Route Definitions**:
* Location: `src/agents-api/agents_api/routers/` (e.g., `src/agents-api/agents_api/routers/sessions.py`)
* Pattern: FastAPI routers, Pydantic models for request/response, dependency injection.
* **Typed Exceptions**:
* Location: `src/agents-api/agents_api/common/exceptions/`
* Pattern: Custom exception classes inheriting from base exceptions.
* **Pydantic Models**:
* Location: Used extensively across services, often in `models.py` files within component directories (e.g., `agents_api/common/protocol/`), or directly in router/activity files.
* Pattern: Data validation, serialization, and settings management.
* **Temporal Workflows & Activities**:
* Location: `src/agents-api/agents_api/workflows/` (workflow definitions) and `src/agents-api/agents_api/activities/` (activity implementations).
* Pattern: Define complex, stateful operations using Temporal's primitives.
* **Database Queries & Models (Memory Store)**:
* Location: `src/agents-api/agents_api/queries/` (for SQL query builders/files) and `src/memory-store/` (for schema migrations).
* Pattern: Asyncpg for database interaction, often with helper functions for CRUD operations.
---
## 14. Domain-Specific Terminology
* **Agent**: An AI entity with specific instructions, tools, and capabilities, defined via API. Core model in `src/typespec/agents/models.tsp`.
* **Task**: A definition of a workflow composed of multiple steps that an agent can execute. Core model in `src/typespec/tasks/models.tsp`.
* **Tool**: A specific capability or integration an agent can use (e.g., web search, API call). Defined in `src/typespec/tools/`.
* **Session**: A container for a sequence of interactions (entries) with an agent, maintaining context. Core model in `src/typespec/sessions/models.tsp`.
* **Entry**: A single message or event within a session (e.g., user input, agent response). Core model in `src/typespec/entries/models.tsp`.
* **Execution**: The runtime instance and state of a task being performed by an agent. Core model in `src/typespec/executions/models.tsp`.
* **POE (PoeThePoet)**: The task runner used in this project for development tasks like formatting, linting, testing, and code generation (configured in `pyproject.toml`).
* **TypeSpec**: The language used to define API schemas. It is the source of truth for API models, which are then generated into Python Pydantic models in `autogen/` directories.
* **Ward**: The primary Python testing framework used for unit and integration tests in most components (e.g., `agents-api`, `cli`).
* **Temporal**: The distributed workflow engine used to orchestrate complex, long-running tasks and ensure their reliable execution.
* **AIDEV-NOTE/TODO/QUESTION**: Specially formatted comments to provide inline context or tasks for AI assistants and developers.
---
## 15. Meta: Guidelines for updating AGENTS.md files
### Elements that would be helpful to add:
1. **Decision flowchart**: A simple decision tree for "when to use X vs Y" for key architectural choices would guide my recommendations.
2. **Reference links**: Links to key files or implementation examples that demonstrate best practices.
3. **Domain-specific terminology**: A small glossary of project-specific terms would help me understand domain language correctly.
4. **Versioning conventions**: How the project handles versioning, both for APIs and internal components.
### Format preferences:
1. **Consistent syntax highlighting**: Ensure all code blocks have proper language tags (`python`, `bash`, etc.).
2. **Hierarchical organization**: Consider using hierarchical numbering for subsections to make referencing easier.
3. **Tabular format for key facts**: The tables are very helpful - more structured data in tabular format would be valuable.
4. **Keywords or tags**: Adding semantic markers (like `#performance` or `#security`) to certain sections would help me quickly locate relevant guidance.
[^1]: This principle emphasizes human oversight for critical aspects like architecture, testing, and domain-specific decisions, ensuring AI assists rather than fully dictates development.
---
## 16. Files to NOT modify
These files control which files should be ignored by AI tools and indexing systems:
* @.agentignore : Specifies files that should be ignored by the Cursor IDE, including:
* Build and distribution directories
* Environment and configuration files
* Large data files (parquet, arrow, pickle, etc.)
* Generated documentation
* Package-manager files (lock files)
* Logs and cache directories
* IDE and editor files
* Compiled binaries and media files
* @.agentindexignore : Controls which files are excluded from Cursor's indexing to improve performance, including:
* All files in `.agentignore`
* Files that may contain sensitive information
* Large JSON data files
* Generated TypeSpec outputs
* Memory-store migration files
* Docker templates and configuration files
**Never modify these ignore files** without explicit permission, as they're carefully configured to optimize IDE performance while ensuring all relevant code is properly indexed.
**When adding new files or directories**, check these ignore patterns to ensure your files will be properly included in the IDE's indexing and AI assistance features.
---
## AI Assistant Workflow: Step-by-Step Methodology
When responding to user instructions, the AI assistant (Claude, Cursor, GPT, etc.) should follow this process to ensure clarity, correctness, and maintainability:
1. **Consult Relevant Guidance**: When the user gives an instruction, consult the relevant instructions from `AGENTS.md` files (both root and directory-specific) for the request.
2. **Clarify Ambiguities**: Based on what you could gather, see if there's any need for clarifications. If so, ask the user targeted questions before proceeding.
3. **Break Down & Plan**: Break down the task at hand and chalk out a rough plan for carrying it out, referencing project conventions and best practices.
4. **Trivial Tasks**: If the plan/request is trivial, go ahead and get started immediately.
5. **Non-Trivial Tasks**: Otherwise, present the plan to the user for review and iterate based on their feedback.
6. **Track Progress**: Use a to-do list (internally, or optionally in a `TODOS.md` file) to keep track of your progress on multi-step or complex tasks.
7. **If Stuck, Re-plan**: If you get stuck or blocked, return to step 3 to re-evaluate and adjust your plan.
8. **Update Documentation**: Once the user's request is fulfilled, update relevant anchor comments (`AIDEV-NOTE`, etc.) and `AGENTS.md` files in the files and directories you touched.
9. **User Review**: After completing the task, ask the user to review what you've done, and repeat the process as needed.
10. **Session Boundaries**: If the user's request isn't directly related to the current context and can be safely started in a fresh session, suggest starting from scratch to avoid context confusion.
================================================
FILE: CHANGELOG.md
================================================
# **Julep AI Changelog for 21 May 2025** ✨
- **Major Feature**: Introduced first-class **Projects**!
Adds `projects` table, association tables, CRUD endpoints, canonical-name support, and project-aware validation across agents, users, files, and sessions
- **Major Feature**: Landed encrypted **Secrets Vault** with full CRUD API, master-key encryption, and transparent secret-reference substitution in tool & API definitions ([#1312](https://github.com/julep-ai/julep/pull/1312))
- **Enhancement**: Added **custom-key aliasing** for secrets plus numerous workflow & cost-tracking refactors ([#1356](https://github.com/julep-ai/julep/pull/1356))
- **Enhancement**: Added `decrypt` flag to secrets queries—retrieve values encrypted or in plaintext as needed ([#1369](https://github.com/julep-ai/julep/pull/1369))
- **Enhancement**: Implemented **monthly cost aggregation** + middleware that enforces free-tier usage caps and active-developer checks ([#1351](https://github.com/julep-ai/julep/pull/1351))
- **Fix**: Re-wrote project-resource SQL views for accurate mapping and removed weak default secrets key in production ([#1362](https://github.com/julep-ai/julep/pull/1362))
- **Fix**: Hardened secrets endpoints & models, fixed insert/delete logic, and expanded expression-evaluator edge-cases ([#1343](https://github.com/julep-ai/julep/pull/1343))
- **Enhancement**: New GitHub Actions workflow automatically translates README files via Anthropic Claude, replacing the old Python job ([#1433](https://github.com/julep-ai/julep/pull/1433))
- **Other Breaking**: Removed fallback for `DEMO_*` placeholder credentials 💥
- **Minor Docs**: Updated docs and cookbooks to remove `DEMO_API_KEY` references.
- **Minor Docs**: Updated footer use-case links to the new `cookbooks/advanced` paths.
> _This list covers the most significant code-related PRs merged to **main** on 21 May 2025.
> For everything else, see the full list of [recent pull requests](https://github.com/julep-ai/julep/pulls?q=is:pr+created:>=2025-04-21)._
# **Julep AI Changelog for 15 May 2025** ✨
- **Minor Feature**: Updated `julep run` to execute tasks via the API with clearer error reporting ✨
- **Minor Docs**: Added examples for task execution and error handling in CLI docs 📚
# **Julep AI Changelog for 9 May 2025** ✨
- **Minor Docs**: Added links to cookbooks for Quick, Community, and Industry pages.
- **Minor Docs**: Updated cookbook links to use absolute GitHub URLs.
# **Julep AI Changelog for 11 April 2025** ✨
- **Major Feature**: Introduced support for Gemini models in `litellm-config.yaml` ✨
- **Minor Feature**: Added environment configuration for Open Responses API ✨
- **Critical Fix**: Corrected cardinality violations in SQL queries across agents-api 🔧
- **Minor Fix**: Resolved documentation formatting issues in 21 files 🔧
- **Minor Fix**: `get_live_urls` now uses `asyncio.to_thread` to avoid blocking the event loop 🔧
- **Major Enhancement**: Refactored API calls to include developer ID for better tracking 📈
- **Minor Enhancement**: Improved Gunicorn worker configurability via environment variables 📈
- **Secondary Performance**: Integrated OpenAPI model and TyeSpecs for expanded functionality 🚀
- **Critical Breaking**: Replaced Postgraphile with Hasura for GraphQL services 💥
- **Other Breaking**: Updated Docker configurations to adhere to new deployment requirements 💥
# **Julep AI Changelog for 14 February 2025** ✨
- **Major Feature**: Default `parallelism` in MapReduce now set to `task_max_parallelism` for optimized processing ✨
- **Minor Feature**: Backward compatibility support added for older syntax in `base_evaluate` ➕
- **Critical Fix**: Resolved data inconsistencies in subworkflow validations for smoother operations 🔧
- **Minor Fix**: Addressed hotfixes in `workflows.py` for robust workflow handling 🔧
- **Major Enhancement**: Introduced `backwards_compatibility` to refine evaluation logic 📈
- **Minor Enhancement**: Enhanced CLI documentation and guides for improved user understanding 📈
- **Key Performance**: Implemented Prometheus metrics for advanced monitoring and streamlined performance 🚀
- **Secondary Performance**: Enhanced task evaluation functions with efficient expression handling 🚀
- **Critical Breaking**: Deprecated legacy API with a migration guide for users 💥
- **Other Breaking**: Updated agent settings to be untyped, affecting configuration handling 💥
# **Julep AI Changelog for 31 January 2025** ✨
- **Major Feature**: Added experimental CLI with comprehensive management commands for agents and tasks ✨
- **Minor Feature**: Introduced new import functionality for agents in CLI ✨
- **Critical Fix**: Replaced `GITHUB_ENV` with `GITHUB_OUTPUT` for environment variable handling 🔧
- **Minor Fix**: Fixed CLI documentation by removing `pipx` installation 🔧
- **Major Enhancement**: Refactored task execution workflow for modularity 📈
- **Minor Enhancement**: Improved documentation with updated quickstart and lifecycle guides 📈
- **Key Performance**: Enhanced CLI with rich text and progress indicators 🚀
- **Secondary Performance**: Reduced API response times by 15% 🚀
- **Critical Breaking**: Removed `previous_inputs` parameter in workflows 💥
- **Other Breaking**: Deprecated legacy API (v1) to be removed next month 💥
================================================
FILE: README.md
================================================
[Deutsch](https://www.readme-i18n.com/julep-ai/julep?lang=de) |
[Español](https://www.readme-i18n.com/julep-ai/julep?lang=es) |
[français](https://www.readme-i18n.com/julep-ai/julep?lang=fr) |
[日本語](https://www.readme-i18n.com/julep-ai/julep?lang=ja) |
[한국어](https://www.readme-i18n.com/julep-ai/julep?lang=ko) |
[Português](https://www.readme-i18n.com/julep-ai/julep?lang=pt) |
[Русский](https://www.readme-i18n.com/julep-ai/julep?lang=ru) |
[中文](https://www.readme-i18n.com/julep-ai/julep?lang=zh)
---
## ⚠️ Important Notice: Julep is Shutting Down
**The Julep backend and dashboard will shut down on December 31, 2025.**
Julep is open source and you can continue using it by self-hosting. See the [Self-Hosting Guide](https://docs.julep.ai/advanced/localsetup) for instructions.
**We're now working on [memory.store](https://memory.store/)** — check it out!
---
📖 Table of Contents
- [Why Julep?](#why-julep)
- [Self-Hosting](#self-hosting)
- [Documentation and Examples](#documentation-and-examples)
- [Community and Contributions](#community-and-contributions)
- [License](#license)
## Why Julep?
Julep is an open-source platform for building **agent-based AI workflows** that go far beyond simple chains of prompts. It lets you orchestrate complex, multi-step processes with Large Language Models (LLMs) and tools **without managing any infrastructure**. With Julep, you can create AI agents that **remember past interactions** and handle sophisticated tasks with branching logic, loops, parallel execution, and integration of external APIs. In short, Julep acts like a *“Firebase for AI agents,”* providing a robust backend for intelligent workflows at scale.
**Key Features and Benefits:**
* **Persistent Memory:** Build AI agents that maintain context and long-term memory across conversations, so they can learn and improve over time.
* **Modular Workflows:** Define complex tasks as modular steps (in YAML or code) with conditional logic, loops, and error handling. Julep’s workflow engine manages multi-step processes and decisions automatically.
* **Tool Orchestration:** Easily integrate external tools and APIs (web search, databases, third-party services, etc.) as part of your agent’s toolkit. Julep’s agents can invoke these tools to augment their capabilities, enabling Retrieval-Augmented Generation and more.
* **Parallel & Scalable:** Run multiple operations in parallel for efficiency, and let Julep handle scaling and concurrency under the hood. The platform is serverless, so it seamlessly scales workflows without extra devops overhead.
* **Reliable Execution:** Don’t worry about glitches – Julep provides built-in retries, self-healing steps, and robust error handling to keep long-running tasks on track. You also get real-time monitoring and logging to track progress.
* **Easy Integration:** Get started quickly with our SDKs for **Python** and **Node.js**, or use the Julep CLI for scripting. Julep’s REST API is available if you want to integrate directly into other systems.
*Focus on your AI logic and creativity, while Julep takes care of the heavy lifting!*
## Self-Hosting
Since the hosted version is shutting down, you can self-host Julep to continue using it.
1. **Install the SDK:** Install the Julep SDK for your preferred language:
*
**Python:** `pip install julep`
*
**Node.js:** `npm install @julep/sdk` (or `yarn add @julep/sdk`)
2. **Self-Host Julep:** Follow the [Self-Hosting Guide](https://docs.julep.ai/advanced/localsetup) to run Julep on your own infrastructure.
3. **Define Your Agent:** Use the SDK or YAML to define an agent and its task workflow. For example, you can specify the agent's memory, tools it can use, and a step-by-step task logic. (See the **[Quick Start](https://docs.julep.ai/introduction/quick-start)** in our docs for a detailed walkthrough.)
4. **Run a Workflow:** Invoke your agent through the SDK to execute the task. Julep will orchestrate the entire workflow and manage the state, tool calls, and LLM interactions for you.
That's it! For a complete tutorial, check out the **[Quick Start Guide](https://docs.julep.ai/introduction/quick-start)** in the documentation.
> **Note:** Julep also offers a command-line interface (CLI) to manage workflows and agents. See the [Julep CLI docs](https://docs.julep.ai/responses/quickstart#cli-installation) for details.
## Documentation and Examples
Looking to dive deeper? The **[Julep Documentation](https://docs.julep.ai)** covers everything you need to master the platform – from core concepts (Agents, Tasks, Sessions, Tools) to advanced topics like agent memory management and architecture internals. Key resources include:
* **[Concept Guides](https://docs.julep.ai/concepts/):** Learn about Julep’s architecture, how sessions and memory work, using tools, managing long conversations, and more.
* **[API & SDK Reference](https://docs.julep.ai/api-reference/):** Find detailed reference for all SDK methods and REST API endpoints to integrate Julep into your applications.
* **[Tutorials](https://docs.julep.ai/tutorials/):** Step-by-step guides for building real applications (e.g. a research agent that searches the web, a trip-planning assistant, or a chatbot with custom knowledge).
* **[Cookbook Recipes](https://github.com/julep-ai/julep/tree/dev/cookbooks):** Explore the **Julep Cookbook** for ready-made example workflows and agents. These recipes demonstrate common patterns and use cases – a great way to learn by example. *Browse the [`cookbooks/`](https://github.com/julep-ai/julep/tree/dev/cookbooks) directory in this repository for sample agent definitions.*
* **[IDE Integration](https://context7.com/julep-ai/julep):** Access Julep documentation directly in your IDE! Perfect for getting instant answers while coding.
## Community and Contributions
Join our growing community of developers and AI enthusiasts! Here are some ways to get involved and get support:
* **Discord Community:** Have questions or ideas? Join the conversation on our [official Discord server](https://discord.gg/7H5peSN9QP) to chat with other users.
* **GitHub Discussions and Issues:** Feel free to use GitHub for reporting bugs, requesting features, or discussing implementation details. Check out the [**good first issues**](https://github.com/julep-ai/julep/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) if you'd like to contribute – we welcome contributions of all kinds.
* **Contributing:** If you want to contribute code or improvements, please see our [Contributing Guide](.github/CONTRIBUTING.md) for how to get started. We appreciate all PRs and feedback.
*Pro tip:
Star our repo to stay updated.*
Your contributions, big or small, are valuable to us. Let's build something amazing together!
Our Amazing Contributors:
## License
Julep is offered under the **Apache 2.0 License**, which means it’s free to use in your own projects. See the [LICENSE](.github/LICENSE) file for details. Enjoy building with Julep!
================================================
FILE: changelog/Templates/JulepCustom/entries.html
================================================
{{> head}}
{{> header}}
{{#entries}}
{{date}}
{{#summary}}
{{summary}}
{{/summary}}
{{/entries tagged "main"}}
{{> footer}}
================================================
FILE: changelog/Templates/JulepCustom/entry.html
================================================
{{> head}}
{{> header}}
{{title}}
{{date}}
{{{html}}}
{{#tags}}
#{{.}}
{{/tags}}
{{> footer}}
================================================
FILE: changelog/Templates/JulepCustom/footer.html
================================================