diff --git a/README.md b/README.md index 37651c7133..64fdbea7cf 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,12 @@

Discord - JA doc - ZH doc - ES doc - IN doc - License + JA doc + ZH doc + ES doc + UK doc + IN doc + License

Get early access to the desktop app‎ ‎ |‎ ‎ Documentation

diff --git a/docs/README_DE.md b/docs/README_DE.md index 8e2c58a47f..b9f36ef8f3 100644 --- a/docs/README_DE.md +++ b/docs/README_DE.md @@ -7,8 +7,9 @@ ES doc JA doc ZH doc - EN doc - License + EN doc + UK doc + License

Lassen Sie Sprachmodelle Code auf Ihrem Computer ausführen.
Eine Open-Source, lokal laufende Implementierung von OpenAIs Code-Interpreter.
diff --git a/docs/README_ES.md b/docs/README_ES.md index 62a087651e..430e74ac4f 100644 --- a/docs/README_ES.md +++ b/docs/README_ES.md @@ -4,10 +4,11 @@ Discord EN doc - JA doc - ZH doc - IN doc - License + JA doc + ZH doc + UK doc + IN doc + License


Obtenga acceso temprano a la aplicación de escritorio‎ ‎ |‎ ‎ Documentación
@@ -279,7 +280,7 @@ En el modo interactivo, puede utilizar los siguientes comandos para mejorar su e **Comandos Disponibles:** - `%verbose [true/false]`: Activa o desactiva el modo detallado. Sin parámetros o con `true` entra en modo detallado. -Con `false` sale del modo verbose. + Con `false` sale del modo verbose. - `%reset`: Reinicia la sesión actual de conversación. - `%undo`: Elimina el mensaje de usuario previo y la respuesta del AI del historial de mensajes. - `%tokens [prompt]`: (_Experimental_) Calcula los tokens que se enviarán con el próximo prompt como contexto y estima su costo. Opcionalmente, calcule los tokens y el costo estimado de un `prompt` si se proporciona. Depende de [LiteLLM's `cost_per_token()` method](https://docs.litellm.ai/docs/completion/token_usage#2-cost_per_token) para costos estimados. diff --git a/docs/README_IN.md b/docs/README_IN.md index 1f75780d2f..bb2bc1762f 100644 --- a/docs/README_IN.md +++ b/docs/README_IN.md @@ -7,8 +7,8 @@ ES doc JA doc ZH doc - IN doc - License + UK doc + License

अपने कंप्यूटर पर कोड चलाने के लिए भाषा मॉडल को चलाएं।
ओपनएआई कोड इंटरप्रेटर का एक ओपन-सोर्स, स्थानीय चलने वाला अमल।
@@ -211,13 +211,13 @@ $ interpreter इंटरैक्टिव मोड में, आप निम्नलिखित कमांडों का उपयोग करके अपने अनुभव को बेहतर बना सकते हैं। यहां उपलब्ध कमांडों की सूची है: -**उपलब्ध कमांड:** - • `%verbose [true/false]`: डीबग मोड को टॉगल करें। कोई तर्क नहीं या 'true' के साथ, यह डीबग मोड में प्रवेश करता है। 'false' के साथ, यह डीबग मोड से बाहर निकलता है। - • `%reset`: वर्तमान सत्र को रीसेट करता है। - • `%undo`: पिछले संदेश और उसके जवाब को संदेश इतिहास से हटा देता है। - • `%save_message [पथ]`: संदेशों को एक निर्दिष्ट JSON पथ पर सहेजता है। यदि कोई पथ निर्दिष्ट नहीं किया गया है, तो यह डिफ़ॉल्ट रूप से 'messages.json' पर जाता है। - • `%load_message [पथ]`: एक निर्दिष्ट JSON पथ से संदेश लोड करता है। यदि कोई पथ निर्दिष्ट नहीं किया गया है, तो यह डिफ़ॉल्ट रूप से 'messages.json' पर जाता है। - • `%help`: मदद संदेश दिखाएं। +**उपलब्ध कमांड:** +• `%verbose [true/false]`: डीबग मोड को टॉगल करें। कोई तर्क नहीं या 'true' के साथ, यह डीबग मोड में प्रवेश करता है। 'false' के साथ, यह डीबग मोड से बाहर निकलता है। +• `%reset`: वर्तमान सत्र को रीसेट करता है। +• `%undo`: पिछले संदेश और उसके जवाब को संदेश इतिहास से हटा देता है। +• `%save_message [पथ]`: संदेशों को एक निर्दिष्ट JSON पथ पर सहेजता है। यदि कोई पथ निर्दिष्ट नहीं किया गया है, तो यह डिफ़ॉल्ट रूप से 'messages.json' पर जाता है। +• `%load_message [पथ]`: एक निर्दिष्ट JSON पथ से संदेश लोड करता है। यदि कोई पथ निर्दिष्ट नहीं किया गया है, तो यह डिफ़ॉल्ट रूप से 'messages.json' पर जाता है। +• `%help`: मदद संदेश दिखाएं। इन कमांडों का प्रयोग करके अपनी प्रतिक्रिया दें और हमें अपनी प्रतिक्रिया दें! diff --git a/docs/README_JA.md b/docs/README_JA.md index 6bd06f9fa5..e6a33f18fa 100644 --- a/docs/README_JA.md +++ b/docs/README_JA.md @@ -6,8 +6,9 @@ ES doc EN doc ZH doc + UK doc IN doc - License + License

自然言語で指示するだけでコードを書いて実行までしてくれる。
@@ -216,7 +217,7 @@ interpreter --local より詳細なガイドについては、[Mike Bird によるこのビデオ](https://www.youtube.com/watch?v=CEs51hGWuGU?si=cN7f6QhfT4edfG5H) をご覧ください。 -**LM Studioをバックグラウンドで使用する方法** +**LM Studio をバックグラウンドで使用する方法** 1. [https://lmstudio.ai/](https://lmstudio.ai/)からダウンロードして起動します。 2. モデルを選択し、**↓ ダウンロード** をクリックします。 diff --git a/docs/README_UK.md b/docs/README_UK.md new file mode 100644 index 0000000000..e214154d7d --- /dev/null +++ b/docs/README_UK.md @@ -0,0 +1,413 @@ +

● Open Interpreter

+ +

+ + Discord + JA doc + ZH doc + ES doc + IN doc + EN doc + License +
+
+
Отримайте ранній доступ до десктопної програми‎ ‎ |‎ ‎ Документація
+

+ +
+ +![poster](https://github.com/KillianLucas/open-interpreter/assets/63927363/08f0d493-956b-4d49-982e-67d4b20c4b56) + +
+

+Нове комп'ютерне оновлення представило --os та новий Computer API. Читати далі → +

+
+ +```shell +pip install open-interpreter +``` + +> Не працює? Прочитайте наш [посібник з налаштування](https://docs.openinterpreter.com/getting-started/setup). + +```shell +interpreter +``` + +
+ +**Open Interpreter** дозволяє LLM локально запускати код (Python, Javascript, Shell тощо). Ви можете спілкуватися з Open Interpreter через інтерфейс, схожий на ChatGPT, у вашому терміналі, запустивши `$ interpreter` після встановлення. + +Це забезпечує інтерфейс природною мовою для загального використання можливостей вашого комп’ютера: + +- Створювати та редагувати фотографії, відео, PDF-файли тощо. +- Керувати браузером Chrome для проведення досліджень +- Створювати, очищати та аналізувати великі набори даних +- ...і т.д. + +**⚠️ Увага: Вам буде запропоновано підтвердити код перед його запуском.** + +
+ +## Demo + +https://github.com/KillianLucas/open-interpreter/assets/63927363/37152071-680d-4423-9af3-64836a6f7b60 + +#### Інтерактивна демонстрація також доступна на Google Colab: + +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1WKmRXZgsErej2xUriKzxrEAXdxMSgWbb?usp=sharing) + +#### Разом із прикладом голосового інтерфейсу, натхненного _Her_: + +[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1NojYGHDgxH6Y1G1oxThEBBb2AtyODBIK) + +## Швидкий старт + +```shell +pip install open-interpreter +``` + +### Термінал + +Після встановлення просто запустіть `interpreter`: + +```shell +interpreter +``` + +### Python + +```python +from interpreter import interpreter + +interpreter.chat("Plot AAPL and META's normalized stock prices") # Виконує одну команду +interpreter.chat() # Починає інтерактивний чат +``` + +### GitHub Codespaces + +Натисніть клавішу `,` на сторінці GitHub цього репозиторію, щоб створити Codespace. Через деякий час ви отримаєте хмарне середовище віртуальної машини, попередньо встановлене з відкритим інтерпретатором. Потім ви можете почати взаємодіяти з ним безпосередньо та вільно підтверджувати виконання ним системних команд, не турбуючись про пошкодження системи. + +## Порівняння з інтерпретатором коду ChatGPT + +Випуск OpenAI [Code Interpreter](https://openai.com/blog/chatgpt-plugins#code-interpreter) з GPT-4 надає фантастичну можливість виконувати реальні завдання за допомогою ChatGPT. + +Однак служба OpenAI є хмарною, з закритим вихідним кодом і суворо обмежена: + +- Немає доступу до Інтернету. +- [Обмежений набір попередньо встановлених пакетів](https://wfhbrian.com/mastering-chatgpts-code-interpreter-list-of-python-packages/). +- Максимальний розмір завантаження - 100 МБ, обмеження часу виконання - 120,0 секунд. +- Стан очищається (разом із будь-якими згенерованими файлами чи посиланнями), коли середовище зупиняється. + +--- + +Open Interpreter долає ці обмеження, запускаючись у вашому локальному середовищі. Він має повний доступ до Інтернету, не обмежений часом або розміром файлу, і може використовувати будь-який пакет або бібліотеку. + +Це поєднує потужність інтерпретатора коду GPT-4 із гнучкістю вашого локального середовища розробки. + +## Команди + +**Оновлення:** Оновлення Generator (0.1.5) представило потокове передавання: + +```python +message = "What operating system are we on?" + +for chunk in interpreter.chat(message, display=False, stream=True): + print(chunk) +``` + +### Інтерактивний чат + +Щоб почати інтерактивний чат у вашому терміналі, запустіть `interpreter` з командного рядка: + +```shell +interpreter +``` + +Або `interpreter.chat()` з файлу .py: + +```python +interpreter.chat() +``` + +**Ви також можете транслювати кожен фрагмент:** + +```python +message = "На якій операційній системі ми працюємо?" + +for chunk in interpreter.chat(message, display=False, stream=True): + print(chunk) +``` + +### Програмований чат + +Для більш точного керування ви можете передавати повідомлення безпосередньо до `.chat(message)`: + +```python +interpreter.chat("Додайте субтитри до всіх відео в /videos.") + +# ... Потік виведення на ваш термінал, виконання завдання ... + +interpreter.chat("Виглядає чудово, але чи можеш ти збільшити субтитри?") + +# ... +``` + +### Почати новий чат + +В Python, Open Interpreter запам’ятовує історію розмов. Якщо ви хочете почати заново, ви можете скинути її: + +```python +interpreter.messages = [] +``` + +### Зберегти та відновити чати + +`interpreter.chat()` повертає список повідомлень, який можна використовувати для відновлення розмови за допомогою `interpreter.messages = messages`: + +```python +messages = interpreter.chat("Мене звати Степан.") # Зберегти повідомлення в "messages" +interpreter.messages = [] # Скинути інтерпретатор ("Степан" буде забутий) + +interpreter.messages = messages # Відновити чат із "messages" ("Степан" запам’ятається) +``` + +### Кастомізувати системне повідомлення + +Ви можете перевірити та налаштувати системне повідомлення Open Interpreter, щоб розширити його функціональність, змінити дозволи або надати йому більше контексту. + +```python +interpreter.system_message += """ +Виконуй команди оболонки з -y, щоб користувачеві не потрібно було їх підтверджувати. +""" +print(interpreter.system_message) +``` + +### Змініть свою мовну модель + +Open Interpreter використовує [LiteLLM](https://docs.litellm.ai/docs/providers/) для підключення до розміщених мовних моделей. + +Ви можете змінити модель, встановивши параметр моделі: + +```shell +interpreter --model gpt-3.5-turbo +interpreter --model claude-2 +interpreter --model command-nightly +``` + +В Pythonб встановити модель на об’єкт: + +```python +interpreter.llm.model = "gpt-3.5-turbo" +``` + +[Знайдіть відповідний рядок «model» для вашої мовної моделі тут.](https://docs.litellm.ai/docs/providers/) + +### Запуск Open Interpreter локально + +#### Термінал + +Open Interpreter може використовувати OpenAI-сумісний сервер для запуску моделей локально. (LM Studio, jan.ai, ollama тощо) + +Просто запустіть `interpreter` з URL-адресою api_base вашого сервера interference (для LM Studio це `http://localhost:1234/v1` за замовчуванням): + +```shell +interpreter --api_base "http://localhost:1234/v1" --api_key "fake_key" +``` + +Крім того, ви можете використовувати Llamafile без встановлення стороннього програмного забезпечення, просто запустивши його + +```shell +interpreter --local +``` + +for a more detailed guide check out [this video by Mike Bird](https://www.youtube.com/watch?v=CEs51hGWuGU?si=cN7f6QhfT4edfG5H) + +**Як запустити LM Studio у фоновому режимі.** + +1. Завантажте [https://lmstudio.ai/](https://lmstudio.ai/), після чого запустіть його. +2. Виберіть модель і натисніть **↓ Завантажити**. +3. Натисніть кнопку **↔️** ліворуч (нижче 💬). +4. Виберіть свою модель угорі, а потім натисніть **Запустити сервер**. + +Коли сервер запущено, ви можете почати розмову за допомогою Open Interpreter. + +> **Примітка.** Локальний режим встановлює ваше `context_window` на 3000, а `max_tokens` на 1000. Якщо ваша модель має інші вимоги, установіть ці параметри вручну (див. нижче). + +#### Python + +Наш пакет Python дає вам більше контролю над кожним параметром. Для реплікації та підключення до LM Studio використовуйте ці налаштування: + +```python +from interpreter import interpreter + +interpreter.offline = True # Вимикає такі онлайн-функції, як Open Procedures +interpreter.llm.model = "openai/x" # Каже AI надсилати повідомлення у форматі OpenAI +interpreter.llm.api_key = "fake_key" # LiteLLM, який ми використовуємо для спілкування з LM Studio, вимагає api-ключ +interpreter.llm.api_base = "http://localhost:1234/v1" # Познчате це на будь-якому сервері, сумісному з OpenAI + +interpreter.chat() +``` + +#### Контекстне вікно, максимальна кількість токенів + +Ви можете змінити `max_tokens` і `context_window` (у токенах) локально запущених моделей. + +У локальному режимі менші контекстні вікна використовуватимуть менше оперативної пам’яті, тому ми рекомендуємо спробувати набагато коротше вікно (~1000), якщо воно не вдається або працює повільно. Переконайтеся, що `max_tokens` менший за `context_window`. + +```shell +interpreter --local --max_tokens 1000 --context_window 3000 +``` + +### Режим "verbose" + +Щоб допомогти вам перевірити Open Interpreter, у нас є режим `--verbose` для налагодження. + +Ви можете активувати режим "verbose", використовуючи його прапорець (`interpreter --verbose`) або в середині чату: + +```shell +$ interpreter +... +> %verbose true <- Вмикає режим verbose + +> %verbose false <- Вимикає режим verbose +``` + +### Команди інтерактивного режиму + +В інтерактивному режимі ви можете використовувати наведені нижче команди, щоб покращити свій досвід. Ось список доступних команд: +**Доступні команди:** + +- `%verbose [true/false]`: увімкнути режим verbose. Без аргументів або з `true`. + переходить у багатослівний режим. З `false` він виходить із багатослівного режиму. +- `%reset`: скидає розмову поточного сеансу. +- `% undo`: видаляє попереднє повідомлення користувача та відповідь ШІ з історії повідомлень. +- `%tokens [prompt]`: (_Експериментально_) Розрахувати токени, які будуть надіслані з наступним запитом як контекст, і оцінити їх вартість. Додатково обчисліть токени та приблизну вартість «підказки», якщо вона надається. Покладається на [метод `cost_per_token()` LiteLLM](https://docs.litellm.ai/docs/completion/token_usage#2-cost_per_token) для оцінки витрат. +- `%help`: Показати повідомлення довідки. + +### Конфігурація / Профілі + +Open Interpreter дозволяє встановлювати поведінку за замовчуванням за допомогою файлів `yaml`. + +Це забезпечує гнучкий спосіб налаштування інтерпретатора, не змінюючи щоразу аргументи командного рядка. + +Виконайте цю команду, щоб відкрити каталог профілів: + +``` +interpreter --profiles +``` + +Ви можете додати файли `yaml`. Профіль за замовчуванням має назву `default.yaml`. + +#### Кілька профілів + +Open Interpreter підтримує декілька файлів `yaml`, що дозволяє легко перемикатися між конфігураціями: + +``` +interpreter --profile my_profile.yaml +``` + +## Зразок сервера FastAPI + +Оновлення генератора дозволяє керувати Open Interpreter через кінцеві точки HTTP REST: + +```python +# server.py + +from fastapi import FastAPI +from fastapi.responses import StreamingResponse +from interpreter import interpreter + +app = FastAPI() + +@app.get("/chat") +def chat_endpoint(message: str): + def event_stream(): + for result in interpreter.chat(message, stream=True): + yield f"data: {result}\n\n" + + return StreamingResponse(event_stream(), media_type="text/event-stream") + +@app.get("/history") +def history_endpoint(): + return interpreter.messages +``` + +```shell +pip install fastapi uvicorn +uvicorn server:app --reload +``` + +Ви також можете запустити сервер, ідентичний наведеному вище, просто запустивши `interpreter.server()`. + +## Android + +Покроковий посібник із встановлення Open Interpreter на вашому пристрої Android можна знайти в [репозиторії open-interpreter-termux](https://github.com/MikeBirdTech/open-interpreter-termux). + +## Повідомлення про безпеку + +Оскільки згенерований код виконується у вашому локальному середовищі, він може взаємодіяти з вашими файлами та налаштуваннями системи, потенційно призводячи до неочікуваних результатів, як-от втрати даних або ризиків для безпеки. + +**⚠️ Open Interpreter попросить підтвердження користувача перед виконанням коду.** + +Ви можете запустити `interpreter -y` або встановити `interpreter.auto_run = True`, щоб обійти це підтвердження, у такому випадку: + +- Будьте обережні, запитуючи команди, які змінюють файли або налаштування системи. +- Дивіться на Open Interpreter як на самокерований автомобіль і будьте готові завершити процес, закривши термінал. +- Спробуйте запустити Open Interpreter у обмеженому середовищі, наприклад Google Colab або Replit. Ці середовища більш ізольовані, що зменшує ризики виконання довільного коду. + +Існує **експериментальна** підтримка [безпечного режиму](https://github.com/OpenInterpreter/open-interpreter/blob/main/docs/SAFE_MODE.md), щоб зменшити деякі ризики. + +## Як це працює? + +Open Interpreter оснащує [модель мови виклику функцій](https://platform.openai.com/docs/guides/gpt/function-calling) функцією `exec()`, яка приймає `мову` (як "Python" або "JavaScript") і `code` для запуску. + +Потім ми передаємо повідомлення моделі, код і результати вашої системи на термінал як Markdown. + +# Доступ до документації в автономному режимі + +Повна [документація](https://docs.openinterpreter.com/) доступна в дорозі без підключення до Інтернету. + +[Node](https://nodejs.org/en) є необхідною умовою: + +- Версія 18.17.0 або будь-яка пізніша версія 18.x.x. +- Версія 20.3.0 або будь-яка пізніша версія 20.x.x. +- Будь-яка версія, починаючи з 21.0.0 і далі, без вказівки верхньої межі. + +Встановіть [Mintlify](https://mintlify.com/): + +```bash +npm i -g mintlify@latest +``` + +Перейдіть у каталог документів і виконайте відповідну команду: + +```bash +# Якщо ви перебуваєте в кореневому каталозі проекту +cd ./docs + +# Запустіть сервер документації +mintlify dev +``` + +Має відкритися нове вікно браузера. Документація буде доступна за адресою [http://localhost:3000](http://localhost:3000), поки працює сервер документації. + +# Вклади + +Дякуємо за ваш інтерес до участі! Ми вітаємо участь спільноти. + +Щоб дізнатися більше про те, як взяти участь, ознайомтеся з нашими [інструкціями щодо створення внеску](https://github.com/OpenInterpreter/open-interpreter/blob/main/docs/CONTRIBUTING.md). + +# Дорожня карта + +Відвідайте [нашу дорожню карту](https://github.com/KillianLucas/open-interpreter/blob/main/docs/ROADMAP.md), щоб переглянути майбутнє Open Interpreter. + +**Примітка**: це програмне забезпечення не пов’язане з OpenAI. + +![thumbnail-ncu](https://github.com/KillianLucas/open-interpreter/assets/63927363/1b19a5db-b486-41fd-a7a1-fe2028031686) + +> Маючи доступ до джуніора, який працює зі швидкістю ваших пальців ... ви можете зробити нові робочі процеси легкими та ефективними, а також відкрити переваги програмування новій аудиторії. +> +> — _OpenAI's Code Interpreter Release_ + +
diff --git a/docs/README_VN.md b/docs/README_VN.md index 7b4d539817..0996835178 100644 --- a/docs/README_VN.md +++ b/docs/README_VN.md @@ -6,8 +6,9 @@ ES doc JA doc ZH doc + UK doc IN doc - License + License

chạy mô hình ngôn ngữ trí tuệ nhân tạo trên máy tính của bạn.
@@ -200,13 +201,13 @@ Open Interpreter có thể sử dụng máy chủ tương thích với OpenAI đ Chỉ cần chạy `interpreter` với URL api_base của máy chủ suy luận của bạn (đối với LM studio, nó là `http://localhost:1234/v1` theo mặc định): -``` vỏ +```vỏ trình thông dịch --api_base "http://localhost:1234/v1" --api_key "fake_key" ``` Ngoài ra, bạn có thể sử dụng Llamafile mà không cần cài đặt bất kỳ phần mềm bên thứ ba nào chỉ bằng cách chạy -``` vỏ +```vỏ thông dịch viên --local ``` @@ -221,7 +222,6 @@ thông dịch viên --local Một khi server chạy, bạn có thể bắt đầu trò chuyện với Open Interpreter. - > **Lưu ý:** Chế độ cục bộ chỉnh `context_window` của bạn tới 3000, và `max_tokens` của bạn tới 600. Nếu mô hình của bạn có các yêu cầu khác, thì hãy chỉnh các tham số thủ công (xem bên dưới). #### Cửa sổ ngữ cảnh (Context Window), (Max Tokens) diff --git a/docs/README_ZH.md b/docs/README_ZH.md index 0254a5f3cc..3b008fbe27 100644 --- a/docs/README_ZH.md +++ b/docs/README_ZH.md @@ -3,10 +3,11 @@

Discord JA doc - IN doc ES doc + UK doc + IN doc EN doc - License + License

让语言模型在您的计算机上运行代码。
diff --git a/docs/assets/favicon.ico b/docs/assets/favicon.ico new file mode 100644 index 0000000000..e3c4d9ec0d Binary files /dev/null and b/docs/assets/favicon.ico differ diff --git a/docs/getting-started/setup.mdx b/docs/getting-started/setup.mdx index 485f94c2f1..b32fb32652 100644 --- a/docs/getting-started/setup.mdx +++ b/docs/getting-started/setup.mdx @@ -69,7 +69,7 @@ curl -sL https://raw.githubusercontent.com/KillianLucas/open-interpreter/main/in ``` ```powershell Windows -iex "& {$(irm https://raw.githubusercontent.com/KillianLucas/open-interpreter/main/installers/oi-windows-installer.ps1)}" +iex "& {$(irm https://raw.githubusercontent.com/KillianLucas/open-interpreter/main/installers/oi-windows-installer-conda.ps1)}" ``` ```bash Linux diff --git a/installers/oi-windows-installer-conda.ps1 b/installers/oi-windows-installer-conda.ps1 new file mode 100644 index 0000000000..03f09ca480 --- /dev/null +++ b/installers/oi-windows-installer-conda.ps1 @@ -0,0 +1,112 @@ +# Define variables +$condaInstallerUrl = "https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe" +$condaInstallerPath = "$env:TEMP\Miniconda3-latest-Windows-x86_64.exe" +$condaPath = "$env:USERPROFILE\Miniconda3" +$envName = "oi" +$pythonVersion = "3.11.7" +$packageName = "open-interpreter litellm openai" +$desktopPath = [System.IO.Path]::Combine([System.Environment]::GetFolderPath('Desktop'), 'Open Interpreter.lnk') +$condaExePath = "$condaPath\Scripts\conda.exe" + +# URL of the .ico file +$icoUrl = "https://raw.githubusercontent.com/OpenInterpreter/open-interpreter/main/docs/assets/favicon.ico" +$icoPath = "$env:TEMP\open-interpreter.ico" + +# Function to download a file with progress +function DownloadFileWithProgress { + param ( + [string]$url, + [string]$output + ) + + $request = [System.Net.HttpWebRequest]::Create($url) + $response = $request.GetResponse() + $totalLength = $response.ContentLength + $readBytes = 0 + $buffer = New-Object byte[] 1024 + $percentComplete = 0 + + $stream = $response.GetResponseStream() + $fileStream = New-Object IO.FileStream ($output, [System.IO.FileMode]::Create) + + try { + while (($read = $stream.Read($buffer, 0, $buffer.Length)) -gt 0) { + $fileStream.Write($buffer, 0, $read) + $readBytes += $read + $newPercentComplete = [math]::Round(($readBytes / $totalLength) * 100) + + if ($newPercentComplete -ne $percentComplete) { + $percentComplete = $newPercentComplete + Write-Progress -Activity "Downloading Miniconda Installer" -Status "$percentComplete% Complete" -PercentComplete $percentComplete + } + } + } finally { + $fileStream.Close() + $stream.Close() + } + + Write-Progress -Activity "Downloading Miniconda Installer" -Completed +} + +# Download the .ico file +Write-Host "Downloading icon file..." +DownloadFileWithProgress -url $icoUrl -output $icoPath + +# Function to check if Conda is installed +function Test-CondaInstalled { + try { + & conda --version > $null 2>&1 + return $true + } catch { + return $false + } +} + +# Check if Conda is installed +if (-Not (Test-CondaInstalled)) { + Write-Host "Conda is not installed." + + # Download Miniconda installer if not already downloaded + if (-Not (Test-Path $condaInstallerPath)) { + DownloadFileWithProgress -url $condaInstallerUrl -output $condaInstallerPath + } else { + Write-Host "Miniconda installer already downloaded." + } + + # Run the Miniconda installer with messages before and after + Write-Host "Starting Miniconda installation... (there will be no progress bar)" + Start-Process -Wait -FilePath $condaInstallerPath -ArgumentList "/InstallationType=JustMe", "/AddToPath=1", "/RegisterPython=0", "/S", "/D=$condaPath" + Write-Host "Miniconda installation complete." + + # Ensure Conda is in the PATH for the current session + $env:Path += ";$condaPath\Scripts;$condaPath" +} else { + Write-Host "Conda is already installed." +} + +# Create and activate the Conda environment, and show progress +Write-Host "Creating Conda environment '$envName'..." +& $condaExePath create -n $envName python=$pythonVersion -y +Write-Host "Conda environment '$envName' created." + +# Dynamically generate the user's paths for the shortcut +$userCondaScriptsPath = "$condaPath\Scripts" +$userEnvName = $envName + +# Create a shortcut on the desktop to activate the environment, install OpenInterpreter, and run it +$targetPath = "$env:SystemRoot\System32\cmd.exe" +$arguments = "/K `"$userCondaScriptsPath\activate.bat` $userEnvName && echo Updating Open Interpreter && pip install -U $packageName && cls && echo Launching Open Interpreter && interpreter`"" + +$shell = New-Object -ComObject WScript.Shell +$shortcut = $shell.CreateShortcut($desktopPath) +$shortcut.TargetPath = $targetPath +$shortcut.Arguments = $arguments +$shortcut.WorkingDirectory = $env:USERPROFILE +$shortcut.WindowStyle = 1 # Normal window +$shortcut.IconLocation = $icoPath +$shortcut.Save() + +Write-Host "Shortcut 'Open Interpreter.lnk' has been created on the desktop with the custom icon." + +# Open the shortcut +Start-Process -FilePath $desktopPath diff --git a/interpreter/core/async_core.py b/interpreter/core/async_core.py index d0b0747b0e..13504ecd05 100644 --- a/interpreter/core/async_core.py +++ b/interpreter/core/async_core.py @@ -122,7 +122,7 @@ def respond(self, run_code=None): if self.stop_event.is_set(): return - if self.print or self.debug: + if self.print: if "start" in chunk: print("\n") if chunk["type"] in ["code", "console"] and "format" in chunk: @@ -140,12 +140,15 @@ def respond(self, run_code=None): ) print(content, end="", flush=True) + if self.debug: + print("Interpreter produced this chunk:", chunk) + self.output_queue.sync_q.put(chunk) self.output_queue.sync_q.put(complete_message) if self.print or self.debug: - print("Server response complete.") + print("\nServer response complete.\n") except Exception as e: error = traceback.format_exc() + "\n" + str(e) @@ -464,17 +467,23 @@ async def send_output(): # First, try to send any unsent messages while async_interpreter.unsent_messages: output = async_interpreter.unsent_messages[0] - try: - await send_message(output) + if async_interpreter.debug: + print("This was unsent, sending it again:", output) + + success = await send_message(output) + if success: async_interpreter.unsent_messages.popleft() - except Exception: - # If we can't send, break and try again later - break # If we've sent all unsent messages, get a new output if not async_interpreter.unsent_messages: output = await async_interpreter.output() - await send_message(output) + success = await send_message(output) + if not success: + async_interpreter.unsent_messages.append(output) + if async_interpreter.debug: + print( + f"Added message to unsent_messages queue after failed attempts: {output}" + ) except Exception as e: error = traceback.format_exc() + "\n" + str(e) @@ -506,16 +515,19 @@ async def send_message(output): # time.sleep(0.5) if websocket.client_state != WebSocketState.CONNECTED: - break + return False try: # print("sending:", output) if isinstance(output, bytes): await websocket.send_bytes(output) + return True # Haven't set up ack for this else: if async_interpreter.require_acknowledge: output["id"] = id + if async_interpreter.debug: + print("Sending this over the websocket:", output) await websocket.send_text(json.dumps(output)) if async_interpreter.require_acknowledge: @@ -524,31 +536,38 @@ async def send_message(output): if id in async_interpreter.acknowledged_outputs: async_interpreter.acknowledged_outputs.remove(id) acknowledged = True + if async_interpreter.debug: + print("This output was acknowledged:", output) break await asyncio.sleep(0.0001) if acknowledged: - return + return True else: - raise Exception("Acknowledgement not received.") + if async_interpreter.debug: + print("Acknowledgement not received for:", output) + return False else: - return + return True except Exception as e: print( f"Failed to send output on attempt number: {attempt + 1}. Output was: {output}" ) print(f"Error: {str(e)}") - await asyncio.sleep(0.05) + traceback.print_exc() + await asyncio.sleep(0.01) # If we've reached this point, we've failed to send after 100 attempts if output not in async_interpreter.unsent_messages: - async_interpreter.unsent_messages.append(output) + print("Failed to send message:", output) + else: print( - f"Added message to unsent_messages queue after failed attempts: {output}" + "Failed to send message, also it was already in unsent queue???:", + output, ) - else: - print("Why was this already in unsent_messages?", output) + + return False await asyncio.gather(receive_input(), send_output()) @@ -577,7 +596,8 @@ async def post_input(payload: Dict[str, Any]): @router.post("/settings") async def set_settings(payload: Dict[str, Any]): for key, value in payload.items(): - print(f"Updating settings: {key} = {value}") + print("Updating settings...") + # print(f"Updating settings: {key} = {value}") if key in ["llm", "computer"] and isinstance(value, dict): if key == "auto_run": return { diff --git a/interpreter/core/llm/llm.py b/interpreter/core/llm/llm.py index 9b6997abf4..15f137d83b 100644 --- a/interpreter/core/llm/llm.py +++ b/interpreter/core/llm/llm.py @@ -279,8 +279,10 @@ def run(self, messages): if self.interpreter.verbose: litellm.set_verbose = True - if self.interpreter.debug: - print("\n\n\nOPENAI COMPATIBLE MESSAGES\n\n\n") + if ( + self.interpreter.debug == True + ): # debug will equal "server" if we're debugging the server specifically + print("\n\n\nOPENAI COMPATIBLE MESSAGES:\n\n\n") for message in messages: if len(str(message)) > 5000: print(str(message)[:200] + "...") @@ -400,6 +402,8 @@ def fixed_litellm_completions(**params): attempts = 4 first_error = None + params["num_retries"] = 0 + for attempt in range(attempts): try: yield from litellm.completion(**params) diff --git a/interpreter/core/llm/utils/convert_to_openai_messages.py b/interpreter/core/llm/utils/convert_to_openai_messages.py index 3689b0d513..aabe2790f8 100644 --- a/interpreter/core/llm/utils/convert_to_openai_messages.py +++ b/interpreter/core/llm/utils/convert_to_openai_messages.py @@ -83,6 +83,10 @@ def convert_to_openai_messages( new_message["name"] = "execute" if "content" not in message: print("What is this??", content) + if type(message["content"]) != str: + if interpreter.debug: + print("\n\n\nStrange chunk found:", message, "\n\n\n") + message["content"] = str(message["content"]) if message["content"].strip() == "": new_message[ "content" diff --git a/interpreter/core/render_message.py b/interpreter/core/render_message.py index 874709c4fa..55e2b95439 100644 --- a/interpreter/core/render_message.py +++ b/interpreter/core/render_message.py @@ -21,7 +21,12 @@ def render_message(interpreter, message): ) # Extract the output content - outputs = (line["content"] for line in output if line.get("format") == "output" and "IGNORE_ALL_ABOVE_THIS_LINE" not in line["content"]) + outputs = ( + line["content"] + for line in output + if line.get("format") == "output" + and "IGNORE_ALL_ABOVE_THIS_LINE" not in line["content"] + ) # Replace the part with the output parts[i] = "\n".join(outputs) @@ -29,7 +34,9 @@ def render_message(interpreter, message): # Join the parts back into the message rendered_message = "".join(parts).strip() - if interpreter.debug: + if ( + interpreter.debug == True + ): # debug will equal "server" if we're debugging the server specifically print("\n\n\nSYSTEM MESSAGE\n\n\n") print(rendered_message) print("\n\n\n") diff --git a/interpreter/terminal_interface/profiles/defaults/obsidian.py b/interpreter/terminal_interface/profiles/defaults/obsidian.py new file mode 100644 index 0000000000..edfe4df22b --- /dev/null +++ b/interpreter/terminal_interface/profiles/defaults/obsidian.py @@ -0,0 +1,32 @@ +""" +This is an Open Interpreter profile to control an Obsidian vault. +""" + +from interpreter import interpreter +import os + +# You can hardcode the path to the Obsidian vault or use the environment variable +obsidian_directory = os.environ.get("OBSIDIAN_VAULT_PATH") + +# You can update to the model you want to use +interpreter.llm.model = "groq/llama-3.1-70b-versatile" + +interpreter.computer.import_computer_api = False + +interpreter.llm.supports_functions = False +interpreter.llm.supports_vision = False +interpreter.llm.context_window = 110000 +interpreter.llm.max_tokens = 4096 +interpreter.auto_run = True + +interpreter.custom_instructions = f""" +You are an AI assistant integrated with Obsidian. You love Obsidian and will only focus on Obsidian tasks. +Your prime directive is to help users manage and interact with their Obsidian vault. You have full control and permission over this vault. +The root of the Obsidian vault is {obsidian_directory}. +You can create, read, update, and delete markdown files in this directory. +You can create new directories as well. Organization is important. +You are able to get the directory structure of the vault to learn which files exist. +You are able to print out the contents of a file to help you learn its contents. +Use markdown syntax for formatting when creating or editing files. +Every file is markdown. +""" diff --git a/pyproject.toml b/pyproject.toml index 4c3778a4fa..36dbde0b33 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ packages = [ {include = "interpreter"}, {include = "scripts"}, ] -version = "0.3.7" # Use "-rc1", "-rc2", etc. for pre-release versions +version = "0.3.8" # Use "-rc1", "-rc2", etc. for pre-release versions description = "Let language models run code" authors = ["Killian Lucas "] readme = "README.md"