diff --git a/README-JP.md b/README-JP.md
deleted file mode 100644
index fb3c1dd97..000000000
--- a/README-JP.md
+++ /dev/null
@@ -1,695 +0,0 @@
-[English](README.md) | [中文翻译](/README-CN.md) | 日本語
-
-
-ここに簡単なPythonの例があります:
-
-
-
-
-from julep import Julep, AsyncJulep
-
-# 🔑 Julepクライアントを初期化する
-# または、非同期操作のためにAsyncJulepを使用する
-client = Julep(api_key="your_api_key")
-
-##################
-## 🤖 エージェント 🤖 ##
-##################
-
-# 研究エージェントを作成する
-agent = client.agents.create(
- name="Research Agent",
- model="claude-3.5-sonnet",
- about="You are a research agent designed to handle research inquiries.",
-)
-
-# 🔍 エージェントにウェブ検索ツールを追加する
-client.agents.tools.create(
- agent_id=agent.id,
- name="web_search", # Pythonの有効な変数名である必要があります
- description="Use this tool to research inquiries.",
- integration={
- "provider": "brave",
- "method": "search",
- "setup": {
- "api_key": "your_brave_api_key",
- },
- },
-)
-
-#################
-## 💬 チャット 💬 ##
-#################
-
-# エージェントとのインタラクティブなチャットセッションを開始する
-session = client.sessions.create(
- agent_id=agent.id,
- context_overflow="adaptive", # 🧠 必要に応じてJulepがコンテキストウィンドウを動的に計算します
-)
-
-# 🔄 チャットループ
-while (user_input := input("You: ")) != "exit":
- response = client.sessions.chat(
- session_id=session.id,
- message=user_input,
- )
-
- print("Agent: ", response.choices[0].message.content)
-
-
-#################
-## 📋 タスク 📋 ##
-#################
-
-# エージェントのための定期的な研究タスクを作成する
-task = client.tasks.create(
- agent_id=agent.id,
- name="Research Task",
- description="Research the given topic every 24 hours.",
- #
- # 🛠️ タスク固有のツール
- tools=[
- {
- "name": "send_email",
- "description": "Send an email to the user with the results.",
- "api_call": {
- "method": "post",
- "url": "https://api.sendgrid.com/v3/mail/send",
- "headers": {"Authorization": "Bearer YOUR_SENDGRID_API_KEY"},
- },
- }
- ],
- #
- # 🔢 タスクの主なステップ
- main=[
- #
- # ステップ1:トピックを調査する
- {
- # `_`(アンダースコア)変数は前のステップの出力を指します
- # ここでは、ユーザーからのトピック入力を指します
- "prompt": "Look up topic '{{_.topic}}' and summarize the results.",
- "tools": [{"ref": {"name": "web_search"}}], # 🔍 エージェントのウェブ検索ツールを使用する
- "unwrap": True,
- },
- #
- # ステップ2:研究結果を含むメールを送信する
- {
- "tool": "send_email",
- "arguments": {
- "subject": "Research Results",
- "body": "'Here are the research results for today: ' + _.content",
- "to": "inputs[0].email", # ユーザーの入力からメールを参照する
- },
- },
- #
- # ステップ3:繰り返す前に24時間待つ
- {"sleep": "24 * 60 * 60"},
- ],
-)
-
-# 🚀 定期的なタスクを開始する
-client.executions.create(task_id=task.id, input={"topic": "Python"})
-
-# 🔁 これにより、タスクは24時間ごとに実行され、
-# "Python"のトピックを調査し、
-# 結果をユーザーのメールに送信します
-
-
-
-
-## 特徴
-
-Julepは、カスタマイズ可能なワークフローを持つ持続可能なAIエージェントの構築プロセスを簡素化します。主な特徴は次のとおりです:
-
-- **持続可能なAIエージェント**:複数のインタラクションにわたってコンテキストを保持するAIエージェントを作成および管理します。
-- **カスタマイズ可能なワークフロー**:タスクを使用して複雑な多段階のAIワークフローを設計します。
-- **ツール統合**:さまざまなツールやAPIをAIワークフローにシームレスに統合します。
-- **ドキュメント管理**:エージェントのためのドキュメントを効率的に管理および検索します。
-- **セッション管理**:継続的なインタラクションのための持続的なセッションを処理します。
-- **柔軟な実行**:ワークフローでの並行処理、条件ロジック、およびエラー処理をサポートします。
-
-## インストール
-
-Julepを始めるには、[npm](https://www.npmjs.com/package/@julep/sdk)または[pip](https://pypi.org/project/julep/)を使用してインストールします:
-
-```bash
-npm install @julep/sdk
-```
-
-または
-
-```bash
-pip install julep
-```
-
-> [!TIP]
-> ~~APIキーを[こちら](https://app.julep.ai/api-keys)から取得してください。~~
->
-> ベータ版の間、APIキーを取得するには[Discord](https://discord.com/invite/JTSBGRZrzj)でお問い合わせください。
-
-## クイックスタートガイド
-
-### ステップ1:Julepをインポートする
-
-まず、Julep SDKをプロジェクトにインポートします:
-
-```javascript
-const Julep = require('@julep/sdk');
-```
-
-または
-
-```python
-from julep import AsyncJulep
-```
-
-### ステップ2:エージェントを初期化する
-
-基本設定で新しいエージェントを作成します:
-
-```javascript
-const julep = new Julep({ apiKey: 'your-api-key' });
-
-const agent = await julep.agents.create({
- name: 'ResearchAssistant',
- model: 'gpt-4-turbo',
- about: "You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.",
-});
-```
-
-または
-
-```python
-client = AsyncJulep(api_key="your_api_key")
-
-agent = await client.agents.create(
- name="Storytelling Agent",
- model="gpt-4-turbo",
- about="You are a creative storytelling agent that can craft engaging stories and generate comic panels based on ideas.",
-)
-```
-
-### ステップ3:エージェントとチャットする
-
-エージェントとのインタラクティブなチャットセッションを開始します:
-
-```javascript
-const session = await julep.sessions.create({
- agentId: agent.id,
-});
-
-// エージェントにメッセージを送信する
-const response = await julep.sessions.chat({
- sessionId: session.id,
- message: 'Hello, can you tell me a story?',
-});
-
-console.log(response);
-```
-
-または
-
-```python
-session = await client.sessions.create(agent_id=agent.id)
-
-# エージェントにメッセージを送信する
-response = await client.sessions.chat(
- session_id=session.id,
- message="Hello, can you tell me a story?",
-)
-
-print(response)
-```
-
-
-### ステップ4:多段階タスクを作成する
-
-入力されたアイデアに基づいてストーリーを作成し、パネル化されたコミックストリップを生成する多段階タスクを定義しましょう:
-
-```python
-# 🛠️ エージェントに画像生成ツール(DALL·E)を追加する
-await client.agents.tools.create(
- agent_id=agent.id,
- name="image_generator",
- description="Use this tool to generate images based on descriptions.",
- integration={
- "provider": "dalle",
- "method": "generate_image",
- "setup": {
- "api_key": "your_dalle_api_key",
- },
- },
-)
-
-# 📋 タスク
-# アイデアを受け取り、ストーリーと4コマ漫画を作成するタスクを作成する
-task = await client.tasks.create(
- agent_id=agent.id,
- name="Story and Comic Creator",
- description="Create a story based on an idea and generate a 4-panel comic strip illustrating the story.",
- main=[
- # ステップ1:ストーリーを生成し、4つのパネルに要約する
- {
- "prompt": [
- {
- "role": "system",
- "content": "You are {{agent.name}}. {{agent.about}}"
- },
- {
- "role": "user",
- "content": (
- "Based on the idea '{{_.idea}}', write a short story suitable for a 4-panel comic strip. "
- "Provide the story and a numbered list of 4 brief descriptions for each panel illustrating key moments in the story."
- ),
- },
- ],
- "unwrap": True,
- },
- # ステップ2:パネルの説明とストーリーを抽出する
- {
- "evaluate": {
- "story": "_.split('1. ')[0].strip()",
- "panels": "re.findall(r'\\d+\\.\\s*(.*?)(?=\\d+\\.\\s*|$)', _)",
- }
- },
- # ステップ3:画像生成ツールを使用して各パネルの画像を生成する
- {
- "foreach": {
- "in": "_.panels",
- "do": {
- "tool": "image_generator",
- "arguments": {
- "description": "_",
- },
- },
- },
- },
- # ステップ4:ストーリーのキャッチーなタイトルを生成する
- {
- "prompt": [
- {
- "role": "system",
- "content": "You are {{agent.name}}. {{agent.about}}"
- },
- {
- "role": "user",
- "content": "Based on the story below, generate a catchy title.\n\nStory: {{outputs[1].story}}",
- },
- ],
- "unwrap": True,
- },
- # ステップ5:ストーリー、生成された画像、およびタイトルを返す
- {
- "return": {
- "title": "outputs[3]",
- "story": "outputs[1].story",
- "comic_panels": "[output.image.url for output in outputs[2]]",
- }
- },
- ],
-)
-```
-
-> [!TIP]
-> これのnode.jsバージョンは似ています。
-
-### ステップ5:タスクを実行する
-
-```python
-# 🚀 アイデアを入力してタスクを実行する
-execution = await client.executions.create(
- task_id=task.id,
- input={"idea": "A cat who learns to fly"}
-)
-
-# 🎉 ストーリーとコミックパネルが生成される様子を見守る
-await client.executions.stream(execution_id=execution.id)
-```
-
-この例は、カスタムツールを持つエージェントを作成し、複数のステップを持つ複雑なタスクを定義し、それを実行してクリエイティブな出力を生成する方法を示しています。
-
-
-
-> [!TIP]
-> もう一つのnode.jsの例は[こちら](example.ts)またはpythonの例は[こちら](example.py)にあります。
-
-## 概念
-
-Julepは、強力なAIワークフローを作成するために連携するいくつかの主要な技術コンポーネントに基づいて構築されています:
-
-### エージェント
-タスクを実行し、ユーザーと対話する大規模な言語モデル(LLM)に支えられたAIエンティティ。エージェントはJulepのコア機能ユニットです。
-
-```mermaid
-graph TD
- Agent[Agent] --> LLM[Large Language Model]
- Agent --> Tasks[Tasks]
- Agent --> Users[Users]
- Tasks --> Tools[Tools]
-```
-
-### ユーザー
-エージェントと対話するエンティティ。ユーザーはセッションに関連付けられ、独自のメタデータを持つことができ、個別の対話が可能になります。
-
-```mermaid
-graph LR
- User[User] --> Sessions[Sessions]
- Sessions --> Agents[Agents]
- Sessions --> Metadata[Metadata]
-```
-
-### セッション
-エージェントとユーザーの間の有状態の対話。セッションは複数の交換にわたってコンテキストを保持し、コンテキスト管理やオーバーフロー処理などの異なる動作に対して構成できます。
-
-```mermaid
-graph LR
- Sessions[Sessions] --> Agents[Agents]
- Sessions --> Users[Users]
- Sessions --> ContextManagement[Context Management]
- Sessions --> OverflowHandling[Overflow Handling]
-```
-
-### タスク
-エージェントが実行できる多段階のプログラムワークフロー。タスクは複雑な操作を定義し、プロンプト、ツール呼び出し、条件ロジックなどのさまざまなタイプのステップを含むことができます。
-
-```mermaid
-graph TD
- Tasks[Tasks] --> Steps[Workflow Steps]
- Steps --> Prompt[Prompt]
- Steps --> ToolCalls[Tool Calls]
- Steps --> ConditionalLogic[Conditional Logic]
-```
-
-### ツール
-エージェントの能力を拡張する統合。ツールはユーザー定義の関数、システムツール、またはサードパーティのAPI統合である可能性があります。これにより、エージェントはテキスト生成を超えたアクションを実行できます。
-
-```mermaid
-graph LR
- Tools[Tools] --> UserDefinedFunctions[User-Defined Functions]
- Tools --> SystemTools[System Tools]
- Tools --> ThirdPartyAPIs[Third-Party APIs]
-```
-
-### ドキュメント
-エージェントまたはユーザーに関連付けることができるテキストまたはデータオブジェクト。ドキュメントはベクトル化され、エージェントの対話中にセマンティック検索と取得を可能にするベクトルデータベースに保存されます。
-
-```mermaid
-graph LR
- Documents[Documents] --> VectorDatabase[Vector Database]
- Documents --> SemanticSearch[Semantic Search]
- Documents --> AgentsOrUsers[Agents or Users]
-```
-
-### 実行
-特定の入力で開始されたタスクのインスタンス。実行には独自のライフサイクルと状態マシンがあり、長時間実行されるプロセスの監視、管理、および再開が可能です。
-
-```mermaid
-graph LR
- Executions[Executions] --> Tasks[Tasks]
- Executions --> Lifecycle[Lifecycle]
- Executions --> Monitoring[Monitoring]
- Executions --> Management[Management]
- Executions --> Resumption[Resumption]
-```
-
-これらの概念とその相互作用の詳細な説明については、[概念ドキュメント](https://github.com/julep-ai/julep/blob/dev/docs/julep-concepts.md)を参照してください。
-
-## タスクの理解
-
-タスクはJulepのワークフローシステムのコアです。これにより、エージェントが実行できる複雑な多段階のAIワークフローを定義できます。タスクコンポーネントの概要は次のとおりです:
-
-- **名前と説明**:各タスクには、簡単に識別できるように一意の名前と説明があります。
-- **主要なステップ**:タスクのコアであり、実行されるアクションのシーケンスを定義します。
-- **ツール**:タスク実行中にエージェントの能力を拡張するオプションの統合。
-
-### ワークフローステップの種類
-
-Julepのタスクには、さまざまな種類のステップを含めることができます:
-
-1. **プロンプト**:AIモデルにメッセージを送信し、応答を受け取ります。
- ```python
- {"prompt": "Analyze the following data: {{data}}"}
- ```
-
-2. **ツール呼び出し**:統合されたツールまたはAPIを実行します。
- ```python
- {"tool": "web_search", "arguments": {"query": "Latest AI developments"}}
- ```
-
-3. **評価**:計算を実行するか、データを操作します。
- ```python
- {"evaluate": {"average_score": "sum(scores) / len(scores)"}}
- ```
-
-4. **条件ロジック**:条件に基づいてステップを実行します。
- ```python
- {"if": "score > 0.8", "then": [...], "else": [...]}
- ```
-
-5. **ループ**:データを反復処理するか、ステップを繰り返します。
- ```python
- {"foreach": {"in": "data_list", "do": [...]}}
- ```
-
-| ステップ名 | 説明 | 入力 |
-|--------------------|--------------------------------------------------------------------------------------------------|------------------------------------------------------|
-| **プロンプト** | AIモデルにメッセージを送信し、応答を受け取ります。 | プロンプトテキストまたはテンプレート |
-| **ツール呼び出し** | 統合されたツールまたはAPIを実行します。 | ツール名と引数 |
-| **評価** | 計算を実行するか、データを操作します。 | 評価する式または変数 |
-| **入力待ち** | 入力が受信されるまでワークフローを一時停止します。 | 必要なユーザーまたはシステム入力 |
-| **ログ** | 指定された値またはメッセージを記録します。 | 記録するメッセージまたは値 |
-| **埋め込み** | テキストを特定の形式またはシステムに埋め込みます。 | 埋め込むテキストまたはコンテンツ |
-| **検索** | クエリに基づいてドキュメント検索を実行します。 | 検索クエリ |
-| **取得** | キー値ストアから値を取得します。 | キー識別子 |
-| **設定** | キー値ストアのキーに値を割り当てます。 | 割り当てるキーと値 |
-| **並列** | 複数のステップを並行して実行します。 | 同時に実行するステップのリスト |
-| **反復** | コレクションを反復処理し、各アイテムに対してステップを実行します。 | 反復するコレクションまたはリスト |
-| **マップリデュース** | コレクションをマップし、式に基づいて結果をリデュースします。 | マップおよびリデュースするコレクションと式 |
-| **条件分岐** | 条件に基づいてステップを実行します。 | 評価する条件 |
-| **スイッチ** | 複数の条件に基づいてステップを実行します。スイッチケース文に似ています。 | 複数の条件と対応するステップ |
-| **生成** | サブワークフローを実行し、その完了を待ちます。 | サブワークフロー識別子と入力データ |
-| **エラー** | エラーメッセージを指定してエラーを処理します。 | エラーメッセージまたは処理指示 |
-| **スリープ** | 指定された期間ワークフローを一時停止します。 | 期間(秒、分など) |
-| **リターン** | ワークフローから値を返します。 | 返す値 |
-
-各ステップタイプの詳細情報と高度な使用法については、[タスクドキュメント](https://docs.julep.ai/tasks)を参照してください。
-
-## 高度な機能
-
-Julepは、AIワークフローを強化するための高度な機能を提供します:
-
-### エージェントにツールを追加する
-
-外部ツールやAPIを統合してエージェントの能力を拡張します:
-
-```python
-client.agents.tools.create(
- agent_id=agent.id,
- name="web_search",
- description="Search the web for information.",
- integration={
- "provider": "brave",
- "method": "search",
- "setup": {"api_key": "your_brave_api_key"},
- },
-)
-```
-
-### セッションとユーザーの管理
-
-Julepは、持続的なインタラクションのための強力なセッション管理を提供します:
-
-```python
-session = client.sessions.create(
- agent_id=agent.id,
- user_id=user.id,
- context_overflow="adaptive"
-)
-
-# 同じセッションで会話を続ける
-response = client.sessions.chat(
- session_id=session.id,
- messages=[
- {
- "role": "user",
- "content": "Follow up on our previous conversation."
- }
- ]
-)
-```
-
-### ドキュメントの統合と検索
-
-エージェントのためのドキュメントを簡単に管理および検索します:
-
-```python
-# ドキュメントをアップロードする
-document = client.agents.docs.create(
- title="AI advancements",
- content="AI is changing the world...",
- metadata={"category": "research_paper"}
-)
-
-# ドキュメントを検索する
-results = client.agents.docs.search(
- text="AI advancements",
- metadata_filter={"category": "research_paper"}
-)
-```
-
-高度な機能と詳細な使用法については、[高度な機能ドキュメント](https://docs.julep.ai/advanced-features)を参照してください。
-
-## SDKリファレンス
-
-- [Node.js SDK](https://github.com/julep-ai/node-sdk/blob/main/api.md)
-- [Python SDK](https://github.com/julep-ai/python-sdk/blob/main/api.md)
-
-## APIリファレンス
-
-エージェント、タスク、および実行について詳しく学ぶために、包括的なAPIドキュメントを探索してください:
-
-- [エージェントAPI](https://api.julep.ai/api/docs#tag/agents)
-- [タスクAPI](https://api.julep.ai/api/docs#tag/tasks)
-- [実行API](https://api.julep.ai/api/docs#tag/executions)
-
-## 例とチュートリアル
-
-提供された例を基にして始めるのに役立つ例のプロジェクトとチュートリアルを見つけてください:
-
-- [例のプロジェクト](https://github.com/julep-ai/julep/tree/main/examples)
-- [チュートリアル](https://docs.julep.ai/tutorials)
-
-## 貢献
-
-プロジェクトへの貢献を歓迎します!貢献方法と行動規範を学びましょう:
-
-- [貢献ガイドライン](https://github.com/julep-ai/julep/blob/main/CONTRIBUTING.md)
-- [行動規範](https://github.com/julep-ai/julep/blob/main/CODE_OF_CONDUCT.md)
-
-## サポートとコミュニティ
-
-コミュニティに参加して、助けを得たり、質問したり、アイデアを共有したりしましょう:
-
-- [Discord](https://discord.com/invite/JTSBGRZrzj)
-- [GitHub Discussions](https://github.com/julep-ai/julep/discussions)
-- [Twitter](https://twitter.com/julep_ai)
-
-## ライセンス
-
-このプロジェクトは[Apache License 2.0](https://github.com/julep-ai/julep/blob/main/LICENSE)の下でライセンスされています。
-
-## 謝辞
-
-貴重なリソースと貢献を提供してくれたすべての貢献者とオープンソースコミュニティに感謝します。
diff --git a/README.md b/README.md
index 0e4b36635..2b9e69dc5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-
@@ -30,6 +30,8 @@
> [!NOTE]
> 👨💻 Here for the devfest.ai event ? Join our [Discord](https://discord.com/invite/JTSBGRZrzj) and check out the details below.
+>
+> Get your API key [here](https://dashboard-dev.julep.ai).
🌟 Contributors and DevFest.AI Participants (Click to expand)
@@ -55,11 +57,6 @@ Exciting news! We're participating in DevFest.AI throughout October 2024! 🗓
> [!TIP]
> Ready to join the fun? **[Tweet that you are participating](https://twitter.com/intent/tweet?text=Pumped%20to%20be%20participating%20in%20%40devfestai%20with%20%40julep_ai%20building%20%23ai%20%23agents%20%23workflows%20Let's%20gooo!%20https%3A%2F%2Fgit.new%2Fjulep)** and let's get coding! 🖥️
-> [!NOTE]
-> Get your API key [here](https://dashboard-dev.julep.ai).
->
-> While we are in beta, you can also reach out on [Discord](https://discord.com/invite/JTSBGRZrzj) to get rate limits lifted on your API key.
-
![Julep DevFest.AI](https://media.giphy.com/media/YjyUeyotft6epaMHtU/giphy.gif)
diff --git a/deploy/simple-docker-compose.yaml b/deploy/simple-docker-compose.yaml
new file mode 100644
index 000000000..8b6093e9a
--- /dev/null
+++ b/deploy/simple-docker-compose.yaml
@@ -0,0 +1,328 @@
+name: julep
+
+services:
+ agents-api:
+ depends_on:
+ worker:
+ condition: service_started
+ required: true
+ environment:
+ AGENTS_API_HOSTNAME: localhost
+ AGENTS_API_KEY: ${AGENTS_API_KEY}
+ AGENTS_API_KEY_HEADER_NAME: Authorization
+ AGENTS_API_PROTOCOL: http
+ AGENTS_API_PUBLIC_PORT: "80"
+ AGENTS_API_URL: http://agents-api:8080
+ COZO_AUTH_TOKEN: ${COZO_AUTH_TOKEN}
+ COZO_HOST: http://memory-store:9070
+ EMBEDDING_MODEL_ID: voyage/voyage-3
+ INTEGRATION_SERVICE_URL: http://integrations:8000
+ LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY}
+ LITELLM_URL: http://litellm:4000
+ SUMMARIZATION_MODEL_NAME: gpt-4o-mini
+ TEMPORAL_ENDPOINT: temporal:7233
+ TEMPORAL_NAMESPACE: default
+ TEMPORAL_TASK_QUEUE: julep-task-queue
+ TEMPORAL_WORKER_URL: temporal:7233
+ TRUNCATE_EMBED_TEXT: "True"
+ WORKER_URL: temporal:7233
+ image: julepai/agents-api:${TAG:-1.0}
+ networks:
+ default: null
+ ports:
+ - mode: ingress
+ target: 8080
+ published: "8080"
+ protocol: tcp
+
+ cozo-migrate:
+ environment:
+ AGENTS_API_HOSTNAME: localhost
+ AGENTS_API_KEY: ${AGENTS_API_KEY}
+ AGENTS_API_KEY_HEADER_NAME: Authorization
+ AGENTS_API_PROTOCOL: http
+ AGENTS_API_PUBLIC_PORT: "80"
+ AGENTS_API_URL: http://agents-api:8080
+ COZO_AUTH_TOKEN: ${COZO_AUTH_TOKEN}
+ COZO_HOST: http://memory-store:9070
+ EMBEDDING_MODEL_ID: voyage/voyage-3
+ INTEGRATION_SERVICE_URL: http://integrations:8000
+ LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY}
+ LITELLM_URL: http://litellm:4000
+ SUMMARIZATION_MODEL_NAME: gpt-4o-mini
+ TEMPORAL_ENDPOINT: temporal:7233
+ TEMPORAL_NAMESPACE: default
+ TEMPORAL_TASK_QUEUE: julep-task-queue
+ TEMPORAL_WORKER_URL: temporal:7233
+ TRUNCATE_EMBED_TEXT: "True"
+ WORKER_URL: temporal:7233
+ image: julepai/cozo-migrate:${TAG:-1.0}
+ networks:
+ default: null
+ restart: "no"
+
+ integrations:
+ environment:
+ OPENAI_API_KEY: ${OPENAI_API_KEY}
+ networks:
+ default: null
+ ports:
+ - mode: ingress
+ target: 8000
+ published: "8000"
+ protocol: tcp
+
+ litellm:
+ command:
+ - --config
+ - /app/config.yaml
+ - --port
+ - "4000"
+ - --num_workers
+ - "8"
+ - --telemetry
+ - "False"
+ depends_on:
+ litellm-db:
+ condition: service_started
+ required: true
+ litellm-redis:
+ condition: service_started
+ required: true
+ environment:
+ ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
+ CLOUDFLARE_ACCOUNT_ID: ${CLOUDFLARE_ACCOUNT_ID}
+ CLOUDFLARE_API_KEY: ${CLOUDFLARE_API_KEY}
+ DATABASE_URL: ${DATABASE_URL}
+ GITHUB_API_KEY: ${GITHUB_API_KEY}
+ GOOGLE_APPLICATION_CREDENTIALS: ${GOOGLE_APPLICATION_CREDENTIALS}
+ GROQ_API_KEY: ${GROQ_API_KEY}
+ LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY}
+ NVIDIA_NIM_API_KEY: ${NVIDIA_NIM_API_KEY}
+ OPENAI_API_KEY: ${OPENAI_API_KEY}
+ REDIS_URL: redis://default:${REDIS_PASSWORD:-redis}@litellm-redis:6379
+ VOYAGE_API_KEY: ${VOYAGE_API_KEY}
+ hostname: litellm
+ image: ghcr.io/berriai/litellm-database:main-v1.46.6
+ networks:
+ default: null
+ restart: unless-stopped
+ volumes:
+ - type: bind
+ source: ./llm-proxy/litellm-config.yaml
+ target: /app/config.yaml
+ bind:
+ create_host_path: true
+ - type: bind
+ source: ./llm-proxy/.keys
+ target: /app/.keys
+ read_only: true
+ bind:
+ create_host_path: true
+
+ litellm-db:
+ environment:
+ POSTGRES_DB: ${LITELM_POSTGRES_DB:-litellm}
+ POSTGRES_PASSWORD: ${LITELM_POSTGRES_PASSWORD:-postgres}
+ POSTGRES_USER: ${LITELM_POSTGRES_USER:-llmproxy}
+ healthcheck:
+ test:
+ - CMD-SHELL
+ - pg_isready -d ${LITELM_POSTGRES_DB:-litellm} -U ${LITELM_POSTGRES_USER:-llmproxy}
+ timeout: 5s
+ interval: 1s
+ retries: 10
+ image: postgres:16
+ networks:
+ default: null
+ restart: unless-stopped
+ volumes:
+ - type: volume
+ source: litellm-db-data
+ target: /var/lib/postgresql/data
+ volume: {}
+
+ litellm-redis:
+ environment:
+ REDIS_ARGS: --requirepass ${REDIS_PASSWORD:-redis}
+ image: redis/redis-stack-server
+ networks:
+ default: null
+ restart: unless-stopped
+ volumes:
+ - type: volume
+ source: litellm-redis-data
+ target: /data
+ volume: {}
+
+ memory-store:
+ environment:
+ COZO_AUTH_TOKEN: ${COZO_AUTH_TOKEN}
+ COZO_BACKUP_DIR: /backup
+ COZO_MNT_DIR: /data
+ COZO_PORT: "9070"
+ image: julepai/memory-store:${TAG:-1.0}
+ labels:
+ ofelia.enabled: "true"
+ ofelia.job-exec.backupcron.command: bash /app/backup.sh
+ ofelia.job-exec.backupcron.environment: '["COZO_PORT=9070", "COZO_AUTH_TOKEN=${COZO_AUTH_TOKEN}", "COZO_BACKUP_DIR=/backup"]'
+ ofelia.job-exec.backupcron.schedule: '@every 3h'
+ networks:
+ default: null
+ ports:
+ - mode: ingress
+ target: 9070
+ published: "9070"
+ protocol: tcp
+ volumes:
+ - type: volume
+ source: cozo_data
+ target: /data
+ volume: {}
+ - type: volume
+ source: cozo_backup
+ target: /backup
+ volume: {}
+
+ memory-store-backup-cron:
+ command:
+ - daemon
+ - --docker
+ - -f
+ - label=com.docker.compose.project=julep
+ depends_on:
+ memory-store:
+ condition: service_started
+ required: true
+ image: mcuadros/ofelia:latest
+ networks:
+ default: null
+ restart: unless-stopped
+ volumes:
+ - type: bind
+ source: /var/run/docker.sock
+ target: /var/run/docker.sock
+ read_only: true
+ bind:
+ create_host_path: true
+
+ temporal:
+ depends_on:
+ temporal-db:
+ condition: service_started
+ required: true
+ environment:
+ DB: postgres12
+ DB_HOST: temporal-db
+ DB_PORT: "5432"
+ DYNAMIC_CONFIG_FILE_PATH: config/dynamicconfig/temporal-postgres.yaml
+ LOG_LEVEL: info
+ POSTGRES_DB: ${TEMPORAL_POSTGRES_DB:-temporal}
+ POSTGRES_PWD: ${TEMPORAL_POSTGRES_PASSWORD:-temporal}
+ POSTGRES_SEEDS: temporal-db
+ POSTGRES_TLS_CA_FILE: /cert/ca.crt
+ POSTGRES_TLS_DISABLE_HOST_VERIFICATION: "false"
+ POSTGRES_TLS_ENABLED: "false"
+ POSTGRES_USER: ${TEMPORAL_POSTGRES_USER:-temporal}
+ SKIP_DB_CREATE: "false"
+ SKIP_SCHEMA_SETUP: "false"
+ SQL_CA: /cert/ca.crt
+ SQL_TLS_ENABLED: "false"
+ TEMPORAL_ADDRESS: temporal:7233
+ VISIBILITY_DBNAME: temporal_visibility
+ hostname: temporal
+ image: temporalio/auto-setup:1.25
+ networks:
+ default: null
+ volumes:
+ - type: bind
+ source: ./scheduler/dynamicconfig
+ target: /etc/temporal/config/dynamicconfig
+ bind:
+ create_host_path: true
+ - type: bind
+ source: ./scheduler/cert
+ target: /cert
+ bind:
+ create_host_path: true
+
+ temporal-db:
+ environment:
+ POSTGRES_DB: ${TEMPORAL_POSTGRES_DB:-temporal}
+ POSTGRES_PASSWORD: ${TEMPORAL_POSTGRES_PASSWORD:-temporal}
+ POSTGRES_USER: ${TEMPORAL_POSTGRES_USER:-temporal}
+ healthcheck:
+ test:
+ - CMD-SHELL
+ - pg_isready -d ${TEMPORAL_POSTGRES_DB:-temporal} -U ${TEMPORAL_POSTGRES_USER:-temporal}
+ timeout: 5s
+ interval: 1s
+ retries: 10
+ image: postgres:16
+ networks:
+ default: null
+ restart: unless-stopped
+ volumes:
+ - type: volume
+ source: temporal-db-data
+ target: /var/lib/postgresql/data
+ volume: {}
+
+ temporal-ui:
+ environment:
+ TEMPORAL_ADDRESS: temporal:7233
+ TEMPORAL_CODEC_ENDPOINT: http://localhost/api/temporal
+ TEMPORAL_CSRF_COOKIE_INSECURE: "true"
+ TEMPORAL_FEEDBACK_URL: https://github.com/julep-ai/julep
+ TEMPORAL_NOTIFY_ON_NEW_VERSION: "false"
+ TEMPORAL_OPEN_API_ENABLED: "true"
+ TEMPORAL_UI_ENABLED: "true"
+ image: temporalio/ui:latest
+ networks:
+ default: null
+ ports:
+ - mode: ingress
+ target: 8080
+ published: "9000"
+ protocol: tcp
+
+ worker:
+ environment:
+ AGENTS_API_HOSTNAME: localhost
+ AGENTS_API_KEY: ${AGENTS_API_KEY}
+ AGENTS_API_KEY_HEADER_NAME: Authorization
+ AGENTS_API_PROTOCOL: http
+ AGENTS_API_PUBLIC_PORT: "80"
+ AGENTS_API_URL: http://agents-api:8080
+ COZO_AUTH_TOKEN: ${COZO_AUTH_TOKEN}
+ COZO_HOST: http://memory-store:9070
+ EMBEDDING_MODEL_ID: voyage/voyage-3
+ INTEGRATION_SERVICE_URL: http://integrations:8000
+ LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY}
+ LITELLM_URL: http://litellm:4000
+ SUMMARIZATION_MODEL_NAME: gpt-4o-mini
+ TEMPORAL_ENDPOINT: temporal:7233
+ TEMPORAL_NAMESPACE: default
+ TEMPORAL_TASK_QUEUE: julep-task-queue
+ TEMPORAL_WORKER_URL: temporal:7233
+ TRUNCATE_EMBED_TEXT: "True"
+ WORKER_URL: temporal:7233
+ image: julepai/worker:${TAG:-1.0}
+ networks:
+ default: null
+
+networks:
+ default:
+ name: julep_default
+
+volumes:
+ cozo_backup:
+ name: cozo_backup
+ cozo_data:
+ name: cozo_data
+ litellm-db-data:
+ name: julep_litellm-db-data
+ litellm-redis-data:
+ name: julep_litellm-redis-data
+ temporal-db-data:
+ name: julep_temporal-db-data