Unverified Commit 1c2c2440 authored by Timothy Jaeryang Baek's avatar Timothy Jaeryang Baek Committed by GitHub
Browse files

Merge branch 'dev' into feature/translation-fixes-croatian

parents ab1aeba1 f8e77ea1
...@@ -11,7 +11,7 @@ jobs: ...@@ -11,7 +11,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v2 uses: actions/checkout@v4
- name: Check for changes in package.json - name: Check for changes in package.json
run: | run: |
...@@ -36,7 +36,7 @@ jobs: ...@@ -36,7 +36,7 @@ jobs:
echo "::set-output name=content::$CHANGELOG_ESCAPED" echo "::set-output name=content::$CHANGELOG_ESCAPED"
- name: Create GitHub release - name: Create GitHub release
uses: actions/github-script@v5 uses: actions/github-script@v7
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}
script: | script: |
...@@ -51,7 +51,7 @@ jobs: ...@@ -51,7 +51,7 @@ jobs:
console.log(`Created release ${release.data.html_url}`) console.log(`Created release ${release.data.html_url}`)
- name: Upload package to GitHub release - name: Upload package to GitHub release
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: package name: package
path: . path: .
......
...@@ -23,7 +23,7 @@ jobs: ...@@ -23,7 +23,7 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v4
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
......
...@@ -19,7 +19,7 @@ jobs: ...@@ -19,7 +19,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v3 uses: actions/setup-node@v4
with: with:
node-version: '20' # Or specify any other version you want to use node-version: '20' # Or specify any other version you want to use
......
...@@ -99,7 +99,7 @@ jobs: ...@@ -99,7 +99,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Set up Python - name: Set up Python
uses: actions/setup-python@v2 uses: actions/setup-python@v5
with: with:
python-version: ${{ matrix.python-version }} python-version: ${{ matrix.python-version }}
......
...@@ -43,6 +43,7 @@ from utils.utils import ( ...@@ -43,6 +43,7 @@ from utils.utils import (
from config import ( from config import (
SRC_LOG_LEVELS, SRC_LOG_LEVELS,
OLLAMA_BASE_URLS, OLLAMA_BASE_URLS,
ENABLE_OLLAMA_API,
ENABLE_MODEL_FILTER, ENABLE_MODEL_FILTER,
MODEL_FILTER_LIST, MODEL_FILTER_LIST,
UPLOAD_DIR, UPLOAD_DIR,
...@@ -67,6 +68,8 @@ app.state.config = AppConfig() ...@@ -67,6 +68,8 @@ app.state.config = AppConfig()
app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST
app.state.config.ENABLE_OLLAMA_API = ENABLE_OLLAMA_API
app.state.config.OLLAMA_BASE_URLS = OLLAMA_BASE_URLS app.state.config.OLLAMA_BASE_URLS = OLLAMA_BASE_URLS
app.state.MODELS = {} app.state.MODELS = {}
...@@ -96,6 +99,21 @@ async def get_status(): ...@@ -96,6 +99,21 @@ async def get_status():
return {"status": True} return {"status": True}
@app.get("/config")
async def get_config(user=Depends(get_admin_user)):
return {"ENABLE_OLLAMA_API": app.state.config.ENABLE_OLLAMA_API}
class OllamaConfigForm(BaseModel):
enable_ollama_api: Optional[bool] = None
@app.post("/config/update")
async def update_config(form_data: OllamaConfigForm, user=Depends(get_admin_user)):
app.state.config.ENABLE_OLLAMA_API = form_data.enable_ollama_api
return {"ENABLE_OLLAMA_API": app.state.config.ENABLE_OLLAMA_API}
@app.get("/urls") @app.get("/urls")
async def get_ollama_api_urls(user=Depends(get_admin_user)): async def get_ollama_api_urls(user=Depends(get_admin_user)):
return {"OLLAMA_BASE_URLS": app.state.config.OLLAMA_BASE_URLS} return {"OLLAMA_BASE_URLS": app.state.config.OLLAMA_BASE_URLS}
...@@ -156,15 +174,24 @@ def merge_models_lists(model_lists): ...@@ -156,15 +174,24 @@ def merge_models_lists(model_lists):
async def get_all_models(): async def get_all_models():
log.info("get_all_models()") log.info("get_all_models()")
tasks = [fetch_url(f"{url}/api/tags") for url in app.state.config.OLLAMA_BASE_URLS]
if app.state.config.ENABLE_OLLAMA_API:
tasks = [
fetch_url(f"{url}/api/tags") for url in app.state.config.OLLAMA_BASE_URLS
]
responses = await asyncio.gather(*tasks) responses = await asyncio.gather(*tasks)
models = { models = {
"models": merge_models_lists( "models": merge_models_lists(
map(lambda response: response["models"] if response else None, responses) map(
lambda response: response["models"] if response else None, responses
)
) )
} }
else:
models = {"models": []}
app.state.MODELS = {model["model"]: model for model in models["models"]} app.state.MODELS = {model["model"]: model for model in models["models"]}
return models return models
......
...@@ -384,6 +384,13 @@ if not os.path.exists(LITELLM_CONFIG_PATH): ...@@ -384,6 +384,13 @@ if not os.path.exists(LITELLM_CONFIG_PATH):
# OLLAMA_BASE_URL # OLLAMA_BASE_URL
#################################### ####################################
ENABLE_OLLAMA_API = PersistentConfig(
"ENABLE_OLLAMA_API",
"ollama.enable",
os.environ.get("ENABLE_OLLAMA_API", "True").lower() == "true",
)
OLLAMA_API_BASE_URL = os.environ.get( OLLAMA_API_BASE_URL = os.environ.get(
"OLLAMA_API_BASE_URL", "http://localhost:11434/api" "OLLAMA_API_BASE_URL", "http://localhost:11434/api"
) )
......
fastapi==0.109.2 fastapi==0.111.0
uvicorn[standard]==0.22.0 uvicorn[standard]==0.22.0
pydantic==2.7.1 pydantic==2.7.1
python-multipart==0.0.9 python-multipart==0.0.9
Flask==3.0.3 Flask==3.0.3
Flask-Cors==4.0.0 Flask-Cors==4.0.1
python-socketio==5.11.2 python-socketio==5.11.2
python-jose==3.3.0 python-jose==3.3.0
passlib[bcrypt]==1.7.4 passlib[bcrypt]==1.7.4
requests==2.31.0 requests==2.32.2
aiohttp==3.9.5 aiohttp==3.9.5
peewee==3.17.3 peewee==3.17.5
peewee-migrate==1.12.2 peewee-migrate==1.12.2
psycopg2-binary==2.9.9 psycopg2-binary==2.9.9
PyMySQL==1.1.0 PyMySQL==1.1.1
bcrypt==4.1.2 bcrypt==4.1.3
litellm[proxy]==1.35.28 litellm[proxy]==1.37.20
boto3==1.34.95 boto3==1.34.110
argon2-cffi==23.1.0 argon2-cffi==23.1.0
APScheduler==3.10.4 APScheduler==3.10.4
google-generativeai==0.5.2 google-generativeai==0.5.4
langchain==0.1.16 langchain==0.2.0
langchain-community==0.0.34 langchain-community==0.2.0
langchain-chroma==0.1.0 langchain-chroma==0.1.1
fake-useragent==1.5.1 fake-useragent==1.5.1
chromadb==0.4.24 chromadb==0.5.0
sentence-transformers==2.7.0 sentence-transformers==2.7.0
pypdf==4.2.0 pypdf==4.2.0
docx2txt==0.8 docx2txt==0.8
python-pptx==0.6.23 python-pptx==0.6.23
unstructured==0.11.8 unstructured==0.14.0
Markdown==3.6 Markdown==3.6
pypandoc==1.13 pypandoc==1.13
pandas==2.2.2 pandas==2.2.2
...@@ -46,16 +46,16 @@ xlrd==2.0.1 ...@@ -46,16 +46,16 @@ xlrd==2.0.1
validators==0.28.1 validators==0.28.1
opencv-python-headless==4.9.0.80 opencv-python-headless==4.9.0.80
rapidocr-onnxruntime==1.2.3 rapidocr-onnxruntime==1.3.22
fpdf2==2.7.8 fpdf2==2.7.9
rank-bm25==0.2.2 rank-bm25==0.2.2
faster-whisper==1.0.1 faster-whisper==1.0.2
PyJWT[crypto]==2.8.0 PyJWT[crypto]==2.8.0
black==24.4.2 black==24.4.2
langfuse==2.27.3 langfuse==2.33.0
youtube-transcript-api==0.6.2 youtube-transcript-api==0.6.2
pytube pytube==15.0.0
\ No newline at end of file \ No newline at end of file
...@@ -6,44 +6,44 @@ authors = [ ...@@ -6,44 +6,44 @@ authors = [
] ]
license = { file = "LICENSE" } license = { file = "LICENSE" }
dependencies = [ dependencies = [
"fastapi==0.109.2", "fastapi==0.111.0",
"uvicorn[standard]==0.22.0", "uvicorn[standard]==0.22.0",
"pydantic==2.7.1", "pydantic==2.7.1",
"python-multipart==0.0.9", "python-multipart==0.0.9",
"Flask==3.0.3", "Flask==3.0.3",
"Flask-Cors==4.0.0", "Flask-Cors==4.0.1",
"python-socketio==5.11.2", "python-socketio==5.11.2",
"python-jose==3.3.0", "python-jose==3.3.0",
"passlib[bcrypt]==1.7.4", "passlib[bcrypt]==1.7.4",
"requests==2.31.0", "requests==2.32.2",
"aiohttp==3.9.5", "aiohttp==3.9.5",
"peewee==3.17.3", "peewee==3.17.5",
"peewee-migrate==1.12.2", "peewee-migrate==1.12.2",
"psycopg2-binary==2.9.9", "psycopg2-binary==2.9.9",
"PyMySQL==1.1.0", "PyMySQL==1.1.0",
"bcrypt==4.1.2", "bcrypt==4.1.3",
"litellm[proxy]==1.35.28", "litellm[proxy]==1.37.20",
"boto3==1.34.95", "boto3==1.34.110",
"argon2-cffi==23.1.0", "argon2-cffi==23.1.0",
"APScheduler==3.10.4", "APScheduler==3.10.4",
"google-generativeai==0.5.2", "google-generativeai==0.5.4",
"langchain==0.1.16", "langchain==0.2.0",
"langchain-community==0.0.34", "langchain-community==0.2.0",
"langchain-chroma==0.1.0", "langchain-chroma==0.1.1",
"fake-useragent==1.5.1", "fake-useragent==1.5.1",
"chromadb==0.4.24", "chromadb==0.5.0",
"sentence-transformers==2.7.0", "sentence-transformers==2.7.0",
"pypdf==4.2.0", "pypdf==4.2.0",
"docx2txt==0.8", "docx2txt==0.8",
"unstructured==0.11.8", "unstructured==0.14.0",
"Markdown==3.6", "Markdown==3.6",
"pypandoc==1.13", "pypandoc==1.13",
"pandas==2.2.2", "pandas==2.2.2",
...@@ -53,19 +53,19 @@ dependencies = [ ...@@ -53,19 +53,19 @@ dependencies = [
"validators==0.28.1", "validators==0.28.1",
"opencv-python-headless==4.9.0.80", "opencv-python-headless==4.9.0.80",
"rapidocr-onnxruntime==1.2.3", "rapidocr-onnxruntime==1.3.22",
"fpdf2==2.7.8", "fpdf2==2.7.9",
"rank-bm25==0.2.2", "rank-bm25==0.2.2",
"faster-whisper==1.0.1", "faster-whisper==1.0.2",
"PyJWT[crypto]==2.8.0", "PyJWT[crypto]==2.8.0",
"black==24.4.2", "black==24.4.2",
"langfuse==2.27.3", "langfuse==2.33.0",
"youtube-transcript-api==0.6.2", "youtube-transcript-api==0.6.2",
"pytube", "pytube==15.0.0",
] ]
readme = "README.md" readme = "README.md"
requires-python = ">= 3.11, < 3.12.0a1" requires-python = ">= 3.11, < 3.12.0a1"
......
...@@ -41,7 +41,7 @@ backoff==2.2.1 ...@@ -41,7 +41,7 @@ backoff==2.2.1
# via litellm # via litellm
# via posthog # via posthog
# via unstructured # via unstructured
bcrypt==4.1.2 bcrypt==4.1.3
# via chromadb # via chromadb
# via open-webui # via open-webui
# via passlib # via passlib
...@@ -53,9 +53,9 @@ black==24.4.2 ...@@ -53,9 +53,9 @@ black==24.4.2
# via open-webui # via open-webui
blinker==1.8.2 blinker==1.8.2
# via flask # via flask
boto3==1.34.95 boto3==1.34.110
# via open-webui # via open-webui
botocore==1.34.103 botocore==1.34.110
# via boto3 # via boto3
# via s3transfer # via s3transfer
build==1.2.1 build==1.2.1
...@@ -66,7 +66,6 @@ certifi==2024.2.2 ...@@ -66,7 +66,6 @@ certifi==2024.2.2
# via httpcore # via httpcore
# via httpx # via httpx
# via kubernetes # via kubernetes
# via pulsar-client
# via requests # via requests
# via unstructured-client # via unstructured-client
cffi==1.16.0 cffi==1.16.0
...@@ -79,7 +78,7 @@ charset-normalizer==3.3.2 ...@@ -79,7 +78,7 @@ charset-normalizer==3.3.2
# via unstructured-client # via unstructured-client
chroma-hnswlib==0.7.3 chroma-hnswlib==0.7.3
# via chromadb # via chromadb
chromadb==0.4.24 chromadb==0.5.0
# via langchain-chroma # via langchain-chroma
# via open-webui # via open-webui
click==8.1.7 click==8.1.7
...@@ -119,6 +118,7 @@ docx2txt==0.8 ...@@ -119,6 +118,7 @@ docx2txt==0.8
ecdsa==0.19.0 ecdsa==0.19.0
# via python-jose # via python-jose
email-validator==2.1.1 email-validator==2.1.1
# via fastapi
# via pydantic # via pydantic
emoji==2.11.1 emoji==2.11.1
# via unstructured # via unstructured
...@@ -126,15 +126,17 @@ et-xmlfile==1.1.0 ...@@ -126,15 +126,17 @@ et-xmlfile==1.1.0
# via openpyxl # via openpyxl
fake-useragent==1.5.1 fake-useragent==1.5.1
# via open-webui # via open-webui
fastapi==0.109.2 fastapi==0.111.0
# via chromadb # via chromadb
# via fastapi-sso # via fastapi-sso
# via langchain-chroma # via langchain-chroma
# via litellm # via litellm
# via open-webui # via open-webui
fastapi-cli==0.0.4
# via fastapi
fastapi-sso==0.10.0 fastapi-sso==0.10.0
# via litellm # via litellm
faster-whisper==1.0.1 faster-whisper==1.0.2
# via open-webui # via open-webui
filelock==3.14.0 filelock==3.14.0
# via huggingface-hub # via huggingface-hub
...@@ -145,13 +147,13 @@ filetype==1.2.0 ...@@ -145,13 +147,13 @@ filetype==1.2.0
flask==3.0.3 flask==3.0.3
# via flask-cors # via flask-cors
# via open-webui # via open-webui
flask-cors==4.0.0 flask-cors==4.0.1
# via open-webui # via open-webui
flatbuffers==24.3.25 flatbuffers==24.3.25
# via onnxruntime # via onnxruntime
fonttools==4.51.0 fonttools==4.51.0
# via fpdf2 # via fpdf2
fpdf2==2.7.8 fpdf2==2.7.9
# via open-webui # via open-webui
frozenlist==1.4.1 frozenlist==1.4.1
# via aiohttp # via aiohttp
...@@ -159,7 +161,7 @@ frozenlist==1.4.1 ...@@ -159,7 +161,7 @@ frozenlist==1.4.1
fsspec==2024.3.1 fsspec==2024.3.1
# via huggingface-hub # via huggingface-hub
# via torch # via torch
google-ai-generativelanguage==0.6.2 google-ai-generativelanguage==0.6.4
# via google-generativeai # via google-generativeai
google-api-core==2.19.0 google-api-core==2.19.0
# via google-ai-generativelanguage # via google-ai-generativelanguage
...@@ -176,7 +178,7 @@ google-auth==2.29.0 ...@@ -176,7 +178,7 @@ google-auth==2.29.0
# via kubernetes # via kubernetes
google-auth-httplib2==0.2.0 google-auth-httplib2==0.2.0
# via google-api-python-client # via google-api-python-client
google-generativeai==0.5.2 google-generativeai==0.5.4
# via open-webui # via open-webui
googleapis-common-protos==1.63.0 googleapis-common-protos==1.63.0
# via google-api-core # via google-api-core
...@@ -189,7 +191,7 @@ grpcio==1.63.0 ...@@ -189,7 +191,7 @@ grpcio==1.63.0
# via opentelemetry-exporter-otlp-proto-grpc # via opentelemetry-exporter-otlp-proto-grpc
grpcio-status==1.62.2 grpcio-status==1.62.2
# via google-api-core # via google-api-core
gunicorn==21.2.0 gunicorn==22.0.0
# via litellm # via litellm
h11==0.14.0 h11==0.14.0
# via httpcore # via httpcore
...@@ -203,6 +205,7 @@ httplib2==0.22.0 ...@@ -203,6 +205,7 @@ httplib2==0.22.0
httptools==0.6.1 httptools==0.6.1
# via uvicorn # via uvicorn
httpx==0.27.0 httpx==0.27.0
# via fastapi
# via fastapi-sso # via fastapi-sso
# via langfuse # via langfuse
# via openai # via openai
...@@ -229,6 +232,7 @@ importlib-resources==6.4.0 ...@@ -229,6 +232,7 @@ importlib-resources==6.4.0
itsdangerous==2.2.0 itsdangerous==2.2.0
# via flask # via flask
jinja2==3.1.4 jinja2==3.1.4
# via fastapi
# via flask # via flask
# via litellm # via litellm
# via torch # via torch
...@@ -239,7 +243,6 @@ joblib==1.4.2 ...@@ -239,7 +243,6 @@ joblib==1.4.2
# via nltk # via nltk
# via scikit-learn # via scikit-learn
jsonpatch==1.33 jsonpatch==1.33
# via langchain
# via langchain-core # via langchain-core
jsonpath-python==1.0.6 jsonpath-python==1.0.6
# via unstructured-client # via unstructured-client
...@@ -247,29 +250,30 @@ jsonpointer==2.4 ...@@ -247,29 +250,30 @@ jsonpointer==2.4
# via jsonpatch # via jsonpatch
kubernetes==29.0.0 kubernetes==29.0.0
# via chromadb # via chromadb
langchain==0.1.16 langchain==0.2.0
# via langchain-community
# via open-webui # via open-webui
langchain-chroma==0.1.0 langchain-chroma==0.1.1
# via open-webui # via open-webui
langchain-community==0.0.34 langchain-community==0.2.0
# via langchain
# via open-webui # via open-webui
langchain-core==0.1.52 langchain-core==0.2.1
# via langchain # via langchain
# via langchain-chroma # via langchain-chroma
# via langchain-community # via langchain-community
# via langchain-text-splitters # via langchain-text-splitters
langchain-text-splitters==0.0.1 langchain-text-splitters==0.2.0
# via langchain # via langchain
langdetect==1.0.9 langdetect==1.0.9
# via unstructured # via unstructured
langfuse==2.27.3 langfuse==2.33.0
# via open-webui # via open-webui
langsmith==0.1.57 langsmith==0.1.57
# via langchain # via langchain
# via langchain-community # via langchain-community
# via langchain-core # via langchain-core
litellm==1.35.28 litellm==1.37.20
# via litellm
# via open-webui # via open-webui
lxml==5.2.2 lxml==5.2.2
# via unstructured # via unstructured
...@@ -372,6 +376,7 @@ ordered-set==4.1.0 ...@@ -372,6 +376,7 @@ ordered-set==4.1.0
# via deepdiff # via deepdiff
orjson==3.10.3 orjson==3.10.3
# via chromadb # via chromadb
# via fastapi
# via langsmith # via langsmith
# via litellm # via litellm
overrides==7.7.0 overrides==7.7.0
...@@ -391,9 +396,10 @@ pandas==2.2.2 ...@@ -391,9 +396,10 @@ pandas==2.2.2
# via open-webui # via open-webui
passlib==1.7.4 passlib==1.7.4
# via open-webui # via open-webui
# via passlib
pathspec==0.12.1 pathspec==0.12.1
# via black # via black
peewee==3.17.3 peewee==3.17.5
# via open-webui # via open-webui
# via peewee-migrate # via peewee-migrate
peewee-migrate==1.12.2 peewee-migrate==1.12.2
...@@ -420,8 +426,6 @@ protobuf==4.25.3 ...@@ -420,8 +426,6 @@ protobuf==4.25.3
# via proto-plus # via proto-plus
psycopg2-binary==2.9.9 psycopg2-binary==2.9.9
# via open-webui # via open-webui
pulsar-client==3.5.0
# via chromadb
pyasn1==0.6.0 pyasn1==0.6.0
# via pyasn1-modules # via pyasn1-modules
# via python-jose # via python-jose
...@@ -450,6 +454,7 @@ pygments==2.18.0 ...@@ -450,6 +454,7 @@ pygments==2.18.0
pyjwt==2.8.0 pyjwt==2.8.0
# via litellm # via litellm
# via open-webui # via open-webui
# via pyjwt
pymysql==1.1.0 pymysql==1.1.0
# via open-webui # via open-webui
pypandoc==1.13 pypandoc==1.13
...@@ -481,6 +486,7 @@ python-jose==3.3.0 ...@@ -481,6 +486,7 @@ python-jose==3.3.0
python-magic==0.4.27 python-magic==0.4.27
# via unstructured # via unstructured
python-multipart==0.0.9 python-multipart==0.0.9
# via fastapi
# via litellm # via litellm
# via open-webui # via open-webui
python-socketio==5.11.2 python-socketio==5.11.2
...@@ -508,7 +514,7 @@ rank-bm25==0.2.2 ...@@ -508,7 +514,7 @@ rank-bm25==0.2.2
# via open-webui # via open-webui
rapidfuzz==3.9.0 rapidfuzz==3.9.0
# via unstructured # via unstructured
rapidocr-onnxruntime==1.2.3 rapidocr-onnxruntime==1.3.22
# via open-webui # via open-webui
redis==5.0.4 redis==5.0.4
# via rq # via rq
...@@ -516,7 +522,7 @@ regex==2024.5.10 ...@@ -516,7 +522,7 @@ regex==2024.5.10
# via nltk # via nltk
# via tiktoken # via tiktoken
# via transformers # via transformers
requests==2.31.0 requests==2.32.2
# via chromadb # via chromadb
# via google-api-core # via google-api-core
# via huggingface-hub # via huggingface-hub
...@@ -553,9 +559,6 @@ scipy==1.13.0 ...@@ -553,9 +559,6 @@ scipy==1.13.0
# via sentence-transformers # via sentence-transformers
sentence-transformers==2.7.0 sentence-transformers==2.7.0
# via open-webui # via open-webui
setuptools==69.5.1
# via ctranslate2
# via opentelemetry-instrumentation
shapely==2.0.4 shapely==2.0.4
# via rapidocr-onnxruntime # via rapidocr-onnxruntime
shellingham==1.5.4 shellingham==1.5.4
...@@ -580,7 +583,7 @@ soupsieve==2.5 ...@@ -580,7 +583,7 @@ soupsieve==2.5
sqlalchemy==2.0.30 sqlalchemy==2.0.30
# via langchain # via langchain
# via langchain-community # via langchain-community
starlette==0.36.3 starlette==0.37.2
# via fastapi # via fastapi
sympy==1.12 sympy==1.12
# via onnxruntime # via onnxruntime
...@@ -615,6 +618,7 @@ transformers==4.39.3 ...@@ -615,6 +618,7 @@ transformers==4.39.3
# via sentence-transformers # via sentence-transformers
typer==0.12.3 typer==0.12.3
# via chromadb # via chromadb
# via fastapi-cli
typing-extensions==4.11.0 typing-extensions==4.11.0
# via chromadb # via chromadb
# via fastapi # via fastapi
...@@ -637,7 +641,9 @@ tzdata==2024.1 ...@@ -637,7 +641,9 @@ tzdata==2024.1
# via pandas # via pandas
tzlocal==5.2 tzlocal==5.2
# via apscheduler # via apscheduler
unstructured==0.11.8 ujson==5.10.0
# via fastapi
unstructured==0.14.0
# via open-webui # via open-webui
unstructured-client==0.22.0 unstructured-client==0.22.0
# via unstructured # via unstructured
...@@ -650,8 +656,10 @@ urllib3==2.2.1 ...@@ -650,8 +656,10 @@ urllib3==2.2.1
# via unstructured-client # via unstructured-client
uvicorn==0.22.0 uvicorn==0.22.0
# via chromadb # via chromadb
# via fastapi
# via litellm # via litellm
# via open-webui # via open-webui
# via uvicorn
uvloop==0.19.0 uvloop==0.19.0
# via uvicorn # via uvicorn
validators==0.28.1 validators==0.28.1
...@@ -679,3 +687,6 @@ youtube-transcript-api==0.6.2 ...@@ -679,3 +687,6 @@ youtube-transcript-api==0.6.2
# via open-webui # via open-webui
zipp==3.18.1 zipp==3.18.1
# via importlib-metadata # via importlib-metadata
setuptools==69.5.1
# via ctranslate2
# via opentelemetry-instrumentation
...@@ -41,7 +41,7 @@ backoff==2.2.1 ...@@ -41,7 +41,7 @@ backoff==2.2.1
# via litellm # via litellm
# via posthog # via posthog
# via unstructured # via unstructured
bcrypt==4.1.2 bcrypt==4.1.3
# via chromadb # via chromadb
# via open-webui # via open-webui
# via passlib # via passlib
...@@ -53,9 +53,9 @@ black==24.4.2 ...@@ -53,9 +53,9 @@ black==24.4.2
# via open-webui # via open-webui
blinker==1.8.2 blinker==1.8.2
# via flask # via flask
boto3==1.34.95 boto3==1.34.110
# via open-webui # via open-webui
botocore==1.34.103 botocore==1.34.110
# via boto3 # via boto3
# via s3transfer # via s3transfer
build==1.2.1 build==1.2.1
...@@ -66,7 +66,6 @@ certifi==2024.2.2 ...@@ -66,7 +66,6 @@ certifi==2024.2.2
# via httpcore # via httpcore
# via httpx # via httpx
# via kubernetes # via kubernetes
# via pulsar-client
# via requests # via requests
# via unstructured-client # via unstructured-client
cffi==1.16.0 cffi==1.16.0
...@@ -79,7 +78,7 @@ charset-normalizer==3.3.2 ...@@ -79,7 +78,7 @@ charset-normalizer==3.3.2
# via unstructured-client # via unstructured-client
chroma-hnswlib==0.7.3 chroma-hnswlib==0.7.3
# via chromadb # via chromadb
chromadb==0.4.24 chromadb==0.5.0
# via langchain-chroma # via langchain-chroma
# via open-webui # via open-webui
click==8.1.7 click==8.1.7
...@@ -119,6 +118,7 @@ docx2txt==0.8 ...@@ -119,6 +118,7 @@ docx2txt==0.8
ecdsa==0.19.0 ecdsa==0.19.0
# via python-jose # via python-jose
email-validator==2.1.1 email-validator==2.1.1
# via fastapi
# via pydantic # via pydantic
emoji==2.11.1 emoji==2.11.1
# via unstructured # via unstructured
...@@ -126,15 +126,17 @@ et-xmlfile==1.1.0 ...@@ -126,15 +126,17 @@ et-xmlfile==1.1.0
# via openpyxl # via openpyxl
fake-useragent==1.5.1 fake-useragent==1.5.1
# via open-webui # via open-webui
fastapi==0.109.2 fastapi==0.111.0
# via chromadb # via chromadb
# via fastapi-sso # via fastapi-sso
# via langchain-chroma # via langchain-chroma
# via litellm # via litellm
# via open-webui # via open-webui
fastapi-cli==0.0.4
# via fastapi
fastapi-sso==0.10.0 fastapi-sso==0.10.0
# via litellm # via litellm
faster-whisper==1.0.1 faster-whisper==1.0.2
# via open-webui # via open-webui
filelock==3.14.0 filelock==3.14.0
# via huggingface-hub # via huggingface-hub
...@@ -145,13 +147,13 @@ filetype==1.2.0 ...@@ -145,13 +147,13 @@ filetype==1.2.0
flask==3.0.3 flask==3.0.3
# via flask-cors # via flask-cors
# via open-webui # via open-webui
flask-cors==4.0.0 flask-cors==4.0.1
# via open-webui # via open-webui
flatbuffers==24.3.25 flatbuffers==24.3.25
# via onnxruntime # via onnxruntime
fonttools==4.51.0 fonttools==4.51.0
# via fpdf2 # via fpdf2
fpdf2==2.7.8 fpdf2==2.7.9
# via open-webui # via open-webui
frozenlist==1.4.1 frozenlist==1.4.1
# via aiohttp # via aiohttp
...@@ -159,7 +161,7 @@ frozenlist==1.4.1 ...@@ -159,7 +161,7 @@ frozenlist==1.4.1
fsspec==2024.3.1 fsspec==2024.3.1
# via huggingface-hub # via huggingface-hub
# via torch # via torch
google-ai-generativelanguage==0.6.2 google-ai-generativelanguage==0.6.4
# via google-generativeai # via google-generativeai
google-api-core==2.19.0 google-api-core==2.19.0
# via google-ai-generativelanguage # via google-ai-generativelanguage
...@@ -176,7 +178,7 @@ google-auth==2.29.0 ...@@ -176,7 +178,7 @@ google-auth==2.29.0
# via kubernetes # via kubernetes
google-auth-httplib2==0.2.0 google-auth-httplib2==0.2.0
# via google-api-python-client # via google-api-python-client
google-generativeai==0.5.2 google-generativeai==0.5.4
# via open-webui # via open-webui
googleapis-common-protos==1.63.0 googleapis-common-protos==1.63.0
# via google-api-core # via google-api-core
...@@ -189,7 +191,7 @@ grpcio==1.63.0 ...@@ -189,7 +191,7 @@ grpcio==1.63.0
# via opentelemetry-exporter-otlp-proto-grpc # via opentelemetry-exporter-otlp-proto-grpc
grpcio-status==1.62.2 grpcio-status==1.62.2
# via google-api-core # via google-api-core
gunicorn==21.2.0 gunicorn==22.0.0
# via litellm # via litellm
h11==0.14.0 h11==0.14.0
# via httpcore # via httpcore
...@@ -203,6 +205,7 @@ httplib2==0.22.0 ...@@ -203,6 +205,7 @@ httplib2==0.22.0
httptools==0.6.1 httptools==0.6.1
# via uvicorn # via uvicorn
httpx==0.27.0 httpx==0.27.0
# via fastapi
# via fastapi-sso # via fastapi-sso
# via langfuse # via langfuse
# via openai # via openai
...@@ -229,6 +232,7 @@ importlib-resources==6.4.0 ...@@ -229,6 +232,7 @@ importlib-resources==6.4.0
itsdangerous==2.2.0 itsdangerous==2.2.0
# via flask # via flask
jinja2==3.1.4 jinja2==3.1.4
# via fastapi
# via flask # via flask
# via litellm # via litellm
# via torch # via torch
...@@ -239,7 +243,6 @@ joblib==1.4.2 ...@@ -239,7 +243,6 @@ joblib==1.4.2
# via nltk # via nltk
# via scikit-learn # via scikit-learn
jsonpatch==1.33 jsonpatch==1.33
# via langchain
# via langchain-core # via langchain-core
jsonpath-python==1.0.6 jsonpath-python==1.0.6
# via unstructured-client # via unstructured-client
...@@ -247,29 +250,30 @@ jsonpointer==2.4 ...@@ -247,29 +250,30 @@ jsonpointer==2.4
# via jsonpatch # via jsonpatch
kubernetes==29.0.0 kubernetes==29.0.0
# via chromadb # via chromadb
langchain==0.1.16 langchain==0.2.0
# via langchain-community
# via open-webui # via open-webui
langchain-chroma==0.1.0 langchain-chroma==0.1.1
# via open-webui # via open-webui
langchain-community==0.0.34 langchain-community==0.2.0
# via langchain
# via open-webui # via open-webui
langchain-core==0.1.52 langchain-core==0.2.1
# via langchain # via langchain
# via langchain-chroma # via langchain-chroma
# via langchain-community # via langchain-community
# via langchain-text-splitters # via langchain-text-splitters
langchain-text-splitters==0.0.1 langchain-text-splitters==0.2.0
# via langchain # via langchain
langdetect==1.0.9 langdetect==1.0.9
# via unstructured # via unstructured
langfuse==2.27.3 langfuse==2.33.0
# via open-webui # via open-webui
langsmith==0.1.57 langsmith==0.1.57
# via langchain # via langchain
# via langchain-community # via langchain-community
# via langchain-core # via langchain-core
litellm==1.35.28 litellm==1.37.20
# via litellm
# via open-webui # via open-webui
lxml==5.2.2 lxml==5.2.2
# via unstructured # via unstructured
...@@ -372,6 +376,7 @@ ordered-set==4.1.0 ...@@ -372,6 +376,7 @@ ordered-set==4.1.0
# via deepdiff # via deepdiff
orjson==3.10.3 orjson==3.10.3
# via chromadb # via chromadb
# via fastapi
# via langsmith # via langsmith
# via litellm # via litellm
overrides==7.7.0 overrides==7.7.0
...@@ -391,9 +396,10 @@ pandas==2.2.2 ...@@ -391,9 +396,10 @@ pandas==2.2.2
# via open-webui # via open-webui
passlib==1.7.4 passlib==1.7.4
# via open-webui # via open-webui
# via passlib
pathspec==0.12.1 pathspec==0.12.1
# via black # via black
peewee==3.17.3 peewee==3.17.5
# via open-webui # via open-webui
# via peewee-migrate # via peewee-migrate
peewee-migrate==1.12.2 peewee-migrate==1.12.2
...@@ -420,8 +426,6 @@ protobuf==4.25.3 ...@@ -420,8 +426,6 @@ protobuf==4.25.3
# via proto-plus # via proto-plus
psycopg2-binary==2.9.9 psycopg2-binary==2.9.9
# via open-webui # via open-webui
pulsar-client==3.5.0
# via chromadb
pyasn1==0.6.0 pyasn1==0.6.0
# via pyasn1-modules # via pyasn1-modules
# via python-jose # via python-jose
...@@ -450,6 +454,7 @@ pygments==2.18.0 ...@@ -450,6 +454,7 @@ pygments==2.18.0
pyjwt==2.8.0 pyjwt==2.8.0
# via litellm # via litellm
# via open-webui # via open-webui
# via pyjwt
pymysql==1.1.0 pymysql==1.1.0
# via open-webui # via open-webui
pypandoc==1.13 pypandoc==1.13
...@@ -481,6 +486,7 @@ python-jose==3.3.0 ...@@ -481,6 +486,7 @@ python-jose==3.3.0
python-magic==0.4.27 python-magic==0.4.27
# via unstructured # via unstructured
python-multipart==0.0.9 python-multipart==0.0.9
# via fastapi
# via litellm # via litellm
# via open-webui # via open-webui
python-socketio==5.11.2 python-socketio==5.11.2
...@@ -508,7 +514,7 @@ rank-bm25==0.2.2 ...@@ -508,7 +514,7 @@ rank-bm25==0.2.2
# via open-webui # via open-webui
rapidfuzz==3.9.0 rapidfuzz==3.9.0
# via unstructured # via unstructured
rapidocr-onnxruntime==1.2.3 rapidocr-onnxruntime==1.3.22
# via open-webui # via open-webui
redis==5.0.4 redis==5.0.4
# via rq # via rq
...@@ -516,7 +522,7 @@ regex==2024.5.10 ...@@ -516,7 +522,7 @@ regex==2024.5.10
# via nltk # via nltk
# via tiktoken # via tiktoken
# via transformers # via transformers
requests==2.31.0 requests==2.32.2
# via chromadb # via chromadb
# via google-api-core # via google-api-core
# via huggingface-hub # via huggingface-hub
...@@ -553,9 +559,6 @@ scipy==1.13.0 ...@@ -553,9 +559,6 @@ scipy==1.13.0
# via sentence-transformers # via sentence-transformers
sentence-transformers==2.7.0 sentence-transformers==2.7.0
# via open-webui # via open-webui
setuptools==69.5.1
# via ctranslate2
# via opentelemetry-instrumentation
shapely==2.0.4 shapely==2.0.4
# via rapidocr-onnxruntime # via rapidocr-onnxruntime
shellingham==1.5.4 shellingham==1.5.4
...@@ -580,7 +583,7 @@ soupsieve==2.5 ...@@ -580,7 +583,7 @@ soupsieve==2.5
sqlalchemy==2.0.30 sqlalchemy==2.0.30
# via langchain # via langchain
# via langchain-community # via langchain-community
starlette==0.36.3 starlette==0.37.2
# via fastapi # via fastapi
sympy==1.12 sympy==1.12
# via onnxruntime # via onnxruntime
...@@ -615,6 +618,7 @@ transformers==4.39.3 ...@@ -615,6 +618,7 @@ transformers==4.39.3
# via sentence-transformers # via sentence-transformers
typer==0.12.3 typer==0.12.3
# via chromadb # via chromadb
# via fastapi-cli
typing-extensions==4.11.0 typing-extensions==4.11.0
# via chromadb # via chromadb
# via fastapi # via fastapi
...@@ -637,7 +641,9 @@ tzdata==2024.1 ...@@ -637,7 +641,9 @@ tzdata==2024.1
# via pandas # via pandas
tzlocal==5.2 tzlocal==5.2
# via apscheduler # via apscheduler
unstructured==0.11.8 ujson==5.10.0
# via fastapi
unstructured==0.14.0
# via open-webui # via open-webui
unstructured-client==0.22.0 unstructured-client==0.22.0
# via unstructured # via unstructured
...@@ -650,8 +656,10 @@ urllib3==2.2.1 ...@@ -650,8 +656,10 @@ urllib3==2.2.1
# via unstructured-client # via unstructured-client
uvicorn==0.22.0 uvicorn==0.22.0
# via chromadb # via chromadb
# via fastapi
# via litellm # via litellm
# via open-webui # via open-webui
# via uvicorn
uvloop==0.19.0 uvloop==0.19.0
# via uvicorn # via uvicorn
validators==0.28.1 validators==0.28.1
...@@ -679,3 +687,6 @@ youtube-transcript-api==0.6.2 ...@@ -679,3 +687,6 @@ youtube-transcript-api==0.6.2
# via open-webui # via open-webui
zipp==3.18.1 zipp==3.18.1
# via importlib-metadata # via importlib-metadata
setuptools==69.5.1
# via ctranslate2
# via opentelemetry-instrumentation
import { OLLAMA_API_BASE_URL } from '$lib/constants'; import { OLLAMA_API_BASE_URL } from '$lib/constants';
import { promptTemplate } from '$lib/utils'; import { promptTemplate } from '$lib/utils';
export const getOllamaConfig = async (token: string = '') => {
let error = null;
const res = await fetch(`${OLLAMA_API_BASE_URL}/config`, {
method: 'GET',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
...(token && { authorization: `Bearer ${token}` })
}
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.log(err);
if ('detail' in err) {
error = err.detail;
} else {
error = 'Server connection failed';
}
return null;
});
if (error) {
throw error;
}
return res;
};
export const updateOllamaConfig = async (token: string = '', enable_ollama_api: boolean) => {
let error = null;
const res = await fetch(`${OLLAMA_API_BASE_URL}/config/update`, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
...(token && { authorization: `Bearer ${token}` })
},
body: JSON.stringify({
enable_ollama_api: enable_ollama_api
})
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.log(err);
if ('detail' in err) {
error = err.detail;
} else {
error = 'Server connection failed';
}
return null;
});
if (error) {
throw error;
}
return res;
};
export const getOllamaUrls = async (token: string = '') => { export const getOllamaUrls = async (token: string = '') => {
let error = null; let error = null;
......
...@@ -3,7 +3,13 @@ ...@@ -3,7 +3,13 @@
import { createEventDispatcher, onMount, getContext } from 'svelte'; import { createEventDispatcher, onMount, getContext } from 'svelte';
const dispatch = createEventDispatcher(); const dispatch = createEventDispatcher();
import { getOllamaUrls, getOllamaVersion, updateOllamaUrls } from '$lib/apis/ollama'; import {
getOllamaConfig,
getOllamaUrls,
getOllamaVersion,
updateOllamaConfig,
updateOllamaUrls
} from '$lib/apis/ollama';
import { import {
getOpenAIConfig, getOpenAIConfig,
getOpenAIKeys, getOpenAIKeys,
...@@ -26,6 +32,7 @@ ...@@ -26,6 +32,7 @@
let OPENAI_API_BASE_URLS = ['']; let OPENAI_API_BASE_URLS = [''];
let ENABLE_OPENAI_API = false; let ENABLE_OPENAI_API = false;
let ENABLE_OLLAMA_API = false;
const updateOpenAIHandler = async () => { const updateOpenAIHandler = async () => {
OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS); OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS);
...@@ -50,10 +57,13 @@ ...@@ -50,10 +57,13 @@
onMount(async () => { onMount(async () => {
if ($user.role === 'admin') { if ($user.role === 'admin') {
OLLAMA_BASE_URLS = await getOllamaUrls(localStorage.token); const ollamaConfig = await getOllamaConfig(localStorage.token);
const openaiConfig = await getOpenAIConfig(localStorage.token);
const config = await getOpenAIConfig(localStorage.token); ENABLE_OPENAI_API = openaiConfig.ENABLE_OPENAI_API;
ENABLE_OPENAI_API = config.ENABLE_OPENAI_API; ENABLE_OLLAMA_API = ollamaConfig.ENABLE_OLLAMA_API;
OLLAMA_BASE_URLS = await getOllamaUrls(localStorage.token);
OPENAI_API_BASE_URLS = await getOpenAIUrls(localStorage.token); OPENAI_API_BASE_URLS = await getOpenAIUrls(localStorage.token);
OPENAI_API_KEYS = await getOpenAIKeys(localStorage.token); OPENAI_API_KEYS = await getOpenAIKeys(localStorage.token);
...@@ -161,8 +171,20 @@ ...@@ -161,8 +171,20 @@
<hr class=" dark:border-gray-700" /> <hr class=" dark:border-gray-700" />
<div> <div class="pr-1.5 space-y-2">
<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Ollama Base URL')}</div> <div class="flex justify-between items-center text-sm">
<div class=" font-medium">{$i18n.t('Ollama API')}</div>
<div class="mt-1">
<Switch
bind:state={ENABLE_OLLAMA_API}
on:change={async () => {
updateOllamaConfig(localStorage.token, ENABLE_OLLAMA_API);
}}
/>
</div>
</div>
{#if ENABLE_OLLAMA_API}
<div class="flex w-full gap-1.5"> <div class="flex w-full gap-1.5">
<div class="flex-1 flex flex-col gap-2"> <div class="flex-1 flex flex-col gap-2">
{#each OLLAMA_BASE_URLS as url, idx} {#each OLLAMA_BASE_URLS as url, idx}
...@@ -216,9 +238,9 @@ ...@@ -216,9 +238,9 @@
{/each} {/each}
</div> </div>
<div class=""> <div class="flex">
<button <button
class="p-2.5 bg-gray-200 hover:bg-gray-300 dark:bg-gray-850 dark:hover:bg-gray-800 rounded-lg transition" class="self-center p-2 bg-gray-200 hover:bg-gray-300 dark:bg-gray-900 dark:hover:bg-gray-850 rounded-lg transition"
on:click={() => { on:click={() => {
updateOllamaUrlsHandler(); updateOllamaUrlsHandler();
}} }}
...@@ -250,6 +272,7 @@ ...@@ -250,6 +272,7 @@
{$i18n.t('Click here for help.')} {$i18n.t('Click here for help.')}
</a> </a>
</div> </div>
{/if}
</div> </div>
</div> </div>
......
...@@ -302,7 +302,7 @@ ...@@ -302,7 +302,7 @@
"Okay, Let's Go!": "حسنا دعنا نذهب!", "Okay, Let's Go!": "حسنا دعنا نذهب!",
"OLED Dark": "OLED داكن", "OLED Dark": "OLED داكن",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama Base URL": "Ollama الرابط الافتراضي", "Ollama API": "",
"Ollama Version": "Ollama الاصدار", "Ollama Version": "Ollama الاصدار",
"On": "تشغيل", "On": "تشغيل",
"Only": "فقط", "Only": "فقط",
......
...@@ -302,7 +302,7 @@ ...@@ -302,7 +302,7 @@
"Okay, Let's Go!": "ОК, Нека започваме!", "Okay, Let's Go!": "ОК, Нека започваме!",
"OLED Dark": "OLED тъмно", "OLED Dark": "OLED тъмно",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama Base URL": "Ollama Базов URL", "Ollama API": "",
"Ollama Version": "Ollama Версия", "Ollama Version": "Ollama Версия",
"On": "Вкл.", "On": "Вкл.",
"Only": "Само", "Only": "Само",
......
...@@ -302,7 +302,7 @@ ...@@ -302,7 +302,7 @@
"Okay, Let's Go!": "ঠিক আছে, চলুন যাই!", "Okay, Let's Go!": "ঠিক আছে, চলুন যাই!",
"OLED Dark": "OLED ডার্ক", "OLED Dark": "OLED ডার্ক",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama Base URL": "Ollama বেজ ইউআরএল", "Ollama API": "",
"Ollama Version": "Ollama ভার্সন", "Ollama Version": "Ollama ভার্সন",
"On": "চালু", "On": "চালু",
"Only": "শুধুমাত্র", "Only": "শুধুমাত্র",
......
...@@ -302,7 +302,7 @@ ...@@ -302,7 +302,7 @@
"Okay, Let's Go!": "D'acord, Anem!", "Okay, Let's Go!": "D'acord, Anem!",
"OLED Dark": "OLED Fosc", "OLED Dark": "OLED Fosc",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama Base URL": "URL Base d'Ollama", "Ollama API": "",
"Ollama Version": "Versió d'Ollama", "Ollama Version": "Versió d'Ollama",
"On": "Activat", "On": "Activat",
"Only": "Només", "Only": "Només",
......
This diff is collapsed.
...@@ -302,7 +302,7 @@ ...@@ -302,7 +302,7 @@
"Okay, Let's Go!": "Okay, los geht's!", "Okay, Let's Go!": "Okay, los geht's!",
"OLED Dark": "OLED Dunkel", "OLED Dark": "OLED Dunkel",
"Ollama": "Ollama", "Ollama": "Ollama",
"Ollama Base URL": "Ollama Basis URL", "Ollama API": "",
"Ollama Version": "Ollama-Version", "Ollama Version": "Ollama-Version",
"On": "Ein", "On": "Ein",
"Only": "Nur", "Only": "Nur",
......
...@@ -302,7 +302,7 @@ ...@@ -302,7 +302,7 @@
"Okay, Let's Go!": "Okay, Let's Go!", "Okay, Let's Go!": "Okay, Let's Go!",
"OLED Dark": "OLED Dark", "OLED Dark": "OLED Dark",
"Ollama": "", "Ollama": "",
"Ollama Base URL": "Ollama Base Bark", "Ollama API": "",
"Ollama Version": "Ollama Version", "Ollama Version": "Ollama Version",
"On": "On", "On": "On",
"Only": "Only", "Only": "Only",
......
...@@ -302,7 +302,7 @@ ...@@ -302,7 +302,7 @@
"Okay, Let's Go!": "", "Okay, Let's Go!": "",
"OLED Dark": "", "OLED Dark": "",
"Ollama": "", "Ollama": "",
"Ollama Base URL": "", "Ollama API": "",
"Ollama Version": "", "Ollama Version": "",
"On": "", "On": "",
"Only": "", "Only": "",
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment