Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(agents-api): Use blob store for objects that are too big #645

Merged
merged 13 commits into from
Oct 16, 2024
Merged
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ LITELLM_REDIS_PASSWORD=<your_litellm_redis_password>
# INTEGRATION_SERVICE_URL=http://integrations:8000
# USE_BLOB_STORE_FOR_TEMPORAL=false
# BLOB_STORE_CUTOFF_KB=1024
# BLOB_STORE_BUCKET=agents-api

# Memory Store
# -----------
Expand Down
76 changes: 32 additions & 44 deletions README-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,50 +64,38 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
<details>
<summary><h3>📖 目录</h3></summary>

- [简介](#introduction)
- [快速示例](#quick-example)
- [主要特点](#key-features)
- [为什么选择 Julep 而不是 LangChain?](#why-julep-vs-langchain)
- [不同用例](#different-use-cases)
- [不同的外形尺寸](#different-form-factor)
- [总结](#in-summary)
- [安装](#安装)
- [Python 快速入门 🐍](#python-quick-start-)
- [步骤 1:创建代理](#step-1-create-an-agent)
- [步骤 2:创建一个生成故事和漫画的任务](#step-2-create-a-task-that-generates-a-story-and-comic-strip)
- [步骤 3:执行任务](#step-3-execute-the-task)
- [步骤 4:与代理聊天](#step-4-chat-with-the-agent)
- [Node.js 快速入门🟩](#nodejs-quick-start-)
- [步骤 1:创建代理](#step-1-create-an-agent-1)
- [步骤 2:创建一个生成故事和漫画的任务](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1)
- [步骤 3:执行任务](#step-3-execute-the-task-1)
- [步骤 4:与代理聊天](#step-4-chat-with-the-agent-1)
- [组件](#components)
- [心智模型](#mental-model)
- [概念](#concepts)
- [理解任务](#understanding-tasks)
- [工作流步骤的类型](#types-of-workflow-steps)
- [工具类型](#tool-types)
- [用户定义的函数](#user-defined-functions)
- [`系统` 工具](#system-tools)
- [内置集成](#built-in-integrations)
- [直接 `api_call`](#direct-api_calls)
- [集成](#integrations)
- [勇敢搜索](#brave-search)
- [BrowserBase](#browserbase)
- [电子邮件](#email)
- [蜘蛛](#蜘蛛)
- [天气](#天气)
- [维基百科](#wikipedia)
- [其他功能](#other-features)
- [向代理添加工具](#adding-tools-to-agents)
- [管理会话和用户](#managing-sessions-and-users)
- [文档集成与搜索](#document-integration-and-search)
- [本地快速启动](#local-quickstart)
- [SDK 参考](#sdk-reference)
- [API 参考](#api-reference)
<summary><h3>📖 Table of Contents</h3></summary>

- [为什么选择 Julep 而不是 LangChain?](#%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%89%E6%8B%A9-julep-%E8%80%8C%E4%B8%8D%E6%98%AF-langchain)
- [不同的用例](#%E4%B8%8D%E5%90%8C%E7%9A%84%E7%94%A8%E4%BE%8B)
- [不同的外形尺寸](#%E4%B8%8D%E5%90%8C%E7%9A%84%E5%A4%96%E5%BD%A2%E5%B0%BA%E5%AF%B8)
- [Python 快速入门🐍](#python-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8)
- [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86)
- [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1)
- [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1)
- [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9)
- [Node.js 快速入门 🟩](#nodejs-%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8-)
- [步骤 1:创建代理](#%E6%AD%A5%E9%AA%A4-1%E5%88%9B%E5%BB%BA%E4%BB%A3%E7%90%86-1)
- [步骤 2:创建一个生成故事和漫画的任务](#%E6%AD%A5%E9%AA%A4-2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%94%9F%E6%88%90%E6%95%85%E4%BA%8B%E5%92%8C%E6%BC%AB%E7%94%BB%E7%9A%84%E4%BB%BB%E5%8A%A1-1)
- [步骤 3:执行任务](#%E6%AD%A5%E9%AA%A4-3%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1-1)
- [步骤 4:与代理聊天](#%E6%AD%A5%E9%AA%A4-4%E4%B8%8E%E4%BB%A3%E7%90%86%E8%81%8A%E5%A4%A9-1)
- [心智模型](#%E5%BF%83%E6%99%BA%E6%A8%A1%E5%9E%8B)
- [概念](#%E6%A6%82%E5%BF%B5)
- [理解任务](#%E7%90%86%E8%A7%A3%E4%BB%BB%E5%8A%A1)
- [工作流步骤的类型](#%E5%B7%A5%E4%BD%9C%E6%B5%81%E6%AD%A5%E9%AA%A4%E7%9A%84%E7%B1%BB%E5%9E%8B)
- [工具类型](#%E5%B7%A5%E5%85%B7%E7%B1%BB%E5%9E%8B)
- [用户定义的函数](#%E7%94%A8%E6%88%B7%E5%AE%9A%E4%B9%89%E7%9A%84%E5%87%BD%E6%95%B0)
- [`系统` 工具](#%E7%B3%BB%E7%BB%9F-%E5%B7%A5%E5%85%B7)
- [内置“集成”](#%E5%86%85%E7%BD%AE%E9%9B%86%E6%88%90)
- [直接 `api_call`](#%E7%9B%B4%E6%8E%A5-api_call)
- [集成](#%E9%9B%86%E6%88%90)
- [勇敢搜索](#%E5%8B%87%E6%95%A2%E6%90%9C%E7%B4%A2)
- [浏览器基础](#%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9F%BA%E7%A1%80)
- [向代理添加工具](#%E5%90%91%E4%BB%A3%E7%90%86%E6%B7%BB%E5%8A%A0%E5%B7%A5%E5%85%B7)
- [管理会话和用户](#%E7%AE%A1%E7%90%86%E4%BC%9A%E8%AF%9D%E5%92%8C%E7%94%A8%E6%88%B7)
- [文档集成与搜索](#%E6%96%87%E6%A1%A3%E9%9B%86%E6%88%90%E4%B8%8E%E6%90%9C%E7%B4%A2)
- [本地快速启动](#%E6%9C%AC%E5%9C%B0%E5%BF%AB%E9%80%9F%E5%90%AF%E5%8A%A8)
- [SDK 参考](#sdk-%E5%8F%82%E8%80%83)

</details>
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
Expand Down
82 changes: 41 additions & 41 deletions README-FR.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,50 +64,50 @@ Des nouvelles passionnantes ! Nous participons au DevFest.AI tout au long du moi
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
<details>
<summary><h3>📖 Table des matières</h3></summary>

- [Présentation](#introduction)
- [Exemple rapide](#quick-example)
- [Caractéristiques principales](#key-features)
- [Pourquoi Julep vs. LangChain ?](#pourquoi-julep-vs-langchain)
- [Différents cas d'utilisation](#different-use-cases)
- [Facteur de forme différent](#different-form-factor)
- [En résumé](#en-resumé)
<summary><h3>📖 Table of Contents</h3></summary>

- [Introduction](#introduction)
- [Exemple rapide](#exemple-rapide)
- [Principales caractéristiques](#principales-caract%C3%A9ristiques)
- [Pourquoi Julep vs. LangChain ?](#pourquoi-julep-vs-langchain%C2%A0)
- [Différents cas d'utilisation](#diff%C3%A9rents-cas-dutilisation)
- [Facteur de forme différent](#facteur-de-forme-diff%C3%A9rent)
- [En résumé](#en-r%C3%A9sum%C3%A9)
- [Installation](#installation)
- [Démarrage rapide de Python 🐍](#python-quick-start-)
- [Étape 1 : Créer un agent](#step-1-create-an-agent)
- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#step-2-create-a-task-that-generates-a-story-and-comic-strip)
- [Étape 3 : Exécuter la tâche](#step-3-execute-the-task)
- [Étape 4 : discuter avec l'agent](#step-4-chat-with-the-agent)
- [Démarrage rapide de Node.js 🟩](#nodejs-quick-start-)
- [Étape 1 : Créer un agent](#step-1-create-an-agent-1)
- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1)
- [Étape 3 : Exécuter la tâche](#step-3-execute-the-task-1)
- [Étape 4 : discuter avec l'agent](#step-4-chat-with-the-agent-1)
- [Démarrage rapide de Python 🐍](#d%C3%A9marrage-rapide-de-python-)
- [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent)
- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e)
- [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che)
- [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent)
- [Démarrage rapide de Node.js 🟩](#d%C3%A9marrage-rapide-de-nodejs-)
- [Étape 1 : Créer un agent](#%C3%89tape-1%C2%A0-cr%C3%A9er-un-agent-1)
- [Étape 2 : Créer une tâche qui génère une histoire et une bande dessinée](#%C3%89tape-2%C2%A0-cr%C3%A9er-une-t%C3%A2che-qui-g%C3%A9n%C3%A8re-une-histoire-et-une-bande-dessin%C3%A9e-1)
- [Étape 3 : Exécuter la tâche](#%C3%89tape-3%C2%A0-ex%C3%A9cuter-la-t%C3%A2che-1)
- [Étape 4 : Discuter avec l'agent](#%C3%89tape-4%C2%A0-discuter-avec-lagent-1)
- [Composants](#composants)
- [Modèle mental](#mental-model)
- [Modèle mental](#mod%C3%A8le-mental)
- [Concepts](#concepts)
- [Comprendre les tâches](#understanding-tasks)
- [Types d'étapes de flux de travail](#types-of-workflow-steps)
- [Types d'outils](#types-d'outils)
- [Fonctions définies par l'utilisateur](#user-defined-functions)
- [outils système](#outils-système)
- [Intégrations intégrées](#integrations-integrées)
- [Appels directs d'API](#appels directs d'API)
- [Intégrations](#intégrations)
- [Recherche courageuse](#brave-search)
- [Base du navigateur](#basedunavigateur)
- [Courriel](#courriel)
- [Araignée](#araignée)
- [Météo](#météo)
- [Wikipédia](#wikipédia)
- [Autres fonctionnalités](#other-features)
- [Ajout d'outils aux agents](#adding-tools-to-agents)
- [Gestion des sessions et des utilisateurs](#managing-sessions-and-users)
- [Intégration et recherche de documents](#document-integration-and-search)
- [Démarrage rapide local](#local-quickstart)
- [Référence SDK](#sdk-reference)
- [Référence API](#api-reference)
- [Comprendre les tâches](#comprendre-les-t%C3%A2ches)
- [Types d'étapes de flux de travail](#types-d%C3%A9tapes-de-flux-de-travail)
- [Types d'outils](#types-doutils)
- [Fonctions définies par l'utilisateur](#fonctions-d%C3%A9finies-par-lutilisateur)
- [outils `système`](#outils-syst%C3%A8me)
- [Intégrations intégrées](#int%C3%A9grations-int%C3%A9gr%C3%A9es)
- [Appels directs `api_call`](#appels-directs-api_call)
- [Intégrations](#int%C3%A9grations)
- [Recherche courageuse](#recherche-courageuse)
- [Base de navigateur](#base-de-navigateur)
- [E-mail](#e-mail)
- [Araignée](#araign%C3%A9e)
- [Météo](#m%C3%A9t%C3%A9o)
- [Wikipédia](#wikip%C3%A9dia)
- [Autres fonctionnalités](#autres-fonctionnalit%C3%A9s)
- [Ajout d'outils aux agents](#ajout-doutils-aux-agents)
- [Gestion des sessions et des utilisateurs](#gestion-des-sessions-et-des-utilisateurs)
- [Intégration et recherche de documents](#int%C3%A9gration-et-recherche-de-documents)
- [Démarrage rapide local](#d%C3%A9marrage-rapide-local)
- [Référence du SDK](#r%C3%A9f%C3%A9rence-du-sdk)
- [Référence API](#r%C3%A9f%C3%A9rence-api)

</details>
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
Expand Down
85 changes: 41 additions & 44 deletions README-JA.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,50 +64,47 @@ Julep プロジェクトに新しい貢献者を迎えられることを嬉し
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
<details>
<summary><h3>📖 目次</h3></summary>

- [はじめに](#introduction)
- [簡単な例](#quick-example)
- [主な機能](#key-features)
- [なぜ Julep と LangChain を比較するのか?](#why-julep-vs-langchain)
- [さまざまなユースケース](#different-use-cases)
- [異なるフォームファクター](#different-form-factor)
- [要約](#in-summary)
- [インストール](#installation)
- [Python クイックスタート 🐍](#python-quick-start-)
- [ステップ 1: エージェントを作成する](#step-1-create-an-agent)
- [ステップ 2: ストーリーとコミック ストリップを生成するタスクを作成する](#step-2-create-a-task-that-generates-a-story-and-comic-strip)
- [ステップ 3: タスクを実行する](#step-3-execute-the-task)
- [ステップ 4: エージェントとチャットする](#step-4-chat-with-the-agent)
- [Node.js クイック スタート 🟩](#nodejs-quick-start-)
- [ステップ 1: エージェントを作成する](#step-1-create-an-agent-1)
- [ステップ 2: ストーリーとコミック ストリップを生成するタスクを作成する](#step-2-create-a-task-that-generates-a-story-and-comic-strip-1)
- [ステップ 3: タスクを実行する](#step-3-execute-the-task-1)
- [ステップ 4: エージェントとチャットする](#step-4-chat-with-the-agent-1)
- [コンポーネント](#components)
- [メンタルモデル](#mental-model)
- [コンセプト](#concepts)
- [タスクの理解](#understanding-tasks)
- [ワークフロー ステップの種類](#types-of-workflow-steps)
- [ツールの種類](#tool-types)
- [ユーザー定義の `function`](#user-defined-functions)
- [`システム` ツール](#system-tools)
- [組み込みの `integration`s](#built-in-integrations)
- [直接の `api_call`](#direct-api_calls)
- [統合](#integrations)
- [勇敢な検索](#brave-search)
- [ブラウザベース](#browserbase)
- [メールアドレス](#email)
- [スパイダー](#spider)
- [天気](#weather)
- [ウィキペディア](#wikipedia)
- [その他の機能](#other-features)
- [エージェントへのツールの追加](#adding-tools-to-agents)
- [セッションとユーザーの管理](#managing-sessions-and-users)
- [ドキュメントの統合と検索](#document-integration-and-search)
- [ローカルクイックスタート](#local-quickstart)
- [SDKリファレンス](#sdk-reference)
- [API リファレンス](#api-reference)
<summary><h3>📖 Table of Contents</h3></summary>

- [簡単な例](#%E7%B0%A1%E5%8D%98%E3%81%AA%E4%BE%8B)
- [主な特徴](#%E4%B8%BB%E3%81%AA%E7%89%B9%E5%BE%B4)
- [Julep と LangChain を比較する理由](#julep-%E3%81%A8-langchain-%E3%82%92%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E7%90%86%E7%94%B1)
- [さまざまなユースケース](#%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9)
- [異なるフォームファクタ](#%E7%95%B0%E3%81%AA%E3%82%8B%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF)
- [インストール](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
- [Python クイックスタート 🐍](#python-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-)
- [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
- [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
- [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)
- [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B)
- [Node.js クイックスタート 🟩](#nodejs-%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88-)
- [ステップ 1: エージェントを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-1-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1)
- [ステップ2: ストーリーと漫画を生成するタスクを作成する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%972-%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%A8%E6%BC%AB%E7%94%BB%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-1)
- [ステップ3: タスクを実行する](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%973-%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B-1)
- [ステップ4: エージェントとチャットする](#%E3%82%B9%E3%83%86%E3%83%83%E3%83%974-%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A8%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%99%E3%82%8B-1)
- [コンポーネント](#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88)
- [メンタルモデル](#%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AB%E3%83%A2%E3%83%87%E3%83%AB)
- [コンセプト](#%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%97%E3%83%88)
- [タスクを理解する](#%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B)
- [ワークフローステップの種類](#%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E7%A8%AE%E9%A1%9E)
- [ツールの種類](#%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E7%A8%AE%E9%A1%9E)
- [ユーザー定義の `function`](#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9A%E7%BE%A9%E3%81%AE-function)
- [`システム` ツール](#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E3%83%84%E3%83%BC%E3%83%AB)
- [組み込みの `integration`](#%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE-integration)
- [直接の `api_call`](#%E7%9B%B4%E6%8E%A5%E3%81%AE-api_call)
- [統合](#%E7%B5%B1%E5%90%88)
- [ブレイブサーチ](#%E3%83%96%E3%83%AC%E3%82%A4%E3%83%96%E3%82%B5%E3%83%BC%E3%83%81)
- [ブラウザベース](#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%83%99%E3%83%BC%E3%82%B9)
- [メール](#%E3%83%A1%E3%83%BC%E3%83%AB)
- [スパイダー](#%E3%82%B9%E3%83%91%E3%82%A4%E3%83%80%E3%83%BC)
- [ウィキペディア](#%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2)
- [その他の機能](#%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E6%A9%9F%E8%83%BD)
- [エージェントへのツールの追加](#%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%B8%E3%81%AE%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0)
- [セッションとユーザーの管理](#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A8%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%AE%A1%E7%90%86)
- [ドキュメントの統合と検索](#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AE%E7%B5%B1%E5%90%88%E3%81%A8%E6%A4%9C%E7%B4%A2)
- [ローカルクイックスタート](#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88)
- [SDK リファレンス](#sdk-%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9)
- [APIリファレンス](#api%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9)

</details>
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
Expand Down
89 changes: 89 additions & 0 deletions agents-api/agents_api/clients/s3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
from functools import cache, lru_cache

import boto3
import botocore
from beartype import beartype
from xxhash import xxh3_64_hexdigest as xxhash_key

from ..env import (
blob_store_bucket,
blob_store_cutoff_kb,
s3_access_key,
s3_endpoint,
s3_secret_key,
)


@cache
def get_s3_client():
return boto3.client(
"s3",
endpoint_url=s3_endpoint,
aws_access_key_id=s3_access_key,
aws_secret_access_key=s3_secret_key,
)


def list_buckets() -> list[str]:
client = get_s3_client()
data = client.list_buckets()
buckets = [bucket["Name"] for bucket in data["Buckets"]]

return buckets


@cache
def setup():
client = get_s3_client()
if blob_store_bucket not in list_buckets():
client.create_bucket(Bucket=blob_store_bucket)


@lru_cache(maxsize=10_000)
def exists(key: str) -> bool:
client = get_s3_client()

try:
client.head_object(Bucket=blob_store_bucket, Key=key)
return True

except botocore.exceptions.ClientError as e:
if e.response["Error"]["Code"] == "404":
return False
else:
raise e


@beartype
def add_object(key: str, body: bytes, replace: bool = False) -> None:
creatorrr marked this conversation as resolved.
Show resolved Hide resolved
client = get_s3_client()

if replace:
client.put_object(Bucket=blob_store_bucket, Key=key, Body=body)
return

if exists(key):
return

client.put_object(Bucket=blob_store_bucket, Key=key, Body=body)


@lru_cache(maxsize=256 * 1024 // blob_store_cutoff_kb) # 256mb in cache
@beartype
def get_object(key: str) -> bytes:
client = get_s3_client()
return client.get_object(Bucket=blob_store_bucket, Key=key)["Body"].read()


@beartype
def delete_object(key: str) -> None:
client = get_s3_client()
client.delete_object(Bucket=blob_store_bucket, Key=key)


@beartype
def add_object_with_hash(body: bytes, replace: bool = False) -> str:
key = xxhash_key(body)
add_object(key, body, replace=replace)

return key
Loading
Loading