From 2c45de26e6f8975626975ee16fd1eb526007ac33 Mon Sep 17 00:00:00 2001
From: Co Tran
Date: Thu, 10 Oct 2024 14:56:23 -0700
Subject: [PATCH 01/10] fix for linux (#175)
* fix for linux
* fix pre commit
* fix
* fix extra white space
* fix commit
---
arch/docker-compose.yaml | 2 ++
arch/tools/cli/main.py | 1 +
demos/function_calling/docker-compose.yaml | 2 ++
demos/insurance_agent/docker-compose.yaml | 2 ++
demos/network_agent/docker-compose.yaml | 2 ++
5 files changed, 9 insertions(+)
diff --git a/arch/docker-compose.yaml b/arch/docker-compose.yaml
index 02752736..0a2e5a99 100644
--- a/arch/docker-compose.yaml
+++ b/arch/docker-compose.yaml
@@ -12,3 +12,5 @@ services:
- ~/archgw_logs:/var/log/
env_file:
- stage.env
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
diff --git a/arch/tools/cli/main.py b/arch/tools/cli/main.py
index 95c056e6..8c295042 100644
--- a/arch/tools/cli/main.py
+++ b/arch/tools/cli/main.py
@@ -62,6 +62,7 @@ def build(services):
"-t",
"archgw:latest",
".",
+ "--add-host=host.docker.internal:host-gateway",
],
check=True,
)
diff --git a/demos/function_calling/docker-compose.yaml b/demos/function_calling/docker-compose.yaml
index 46e1b421..6c6f0429 100644
--- a/demos/function_calling/docker-compose.yaml
+++ b/demos/function_calling/docker-compose.yaml
@@ -18,6 +18,8 @@ services:
- "18080:8080"
environment:
- CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1 #this is only because we are running the sample app in the same docker container environemtn as archgw
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
opentelemetry:
build:
diff --git a/demos/insurance_agent/docker-compose.yaml b/demos/insurance_agent/docker-compose.yaml
index 5a44b9a2..372446ea 100644
--- a/demos/insurance_agent/docker-compose.yaml
+++ b/demos/insurance_agent/docker-compose.yaml
@@ -18,3 +18,5 @@ services:
- "18080:8080"
environment:
- CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
diff --git a/demos/network_agent/docker-compose.yaml b/demos/network_agent/docker-compose.yaml
index 25e19420..7ea41173 100644
--- a/demos/network_agent/docker-compose.yaml
+++ b/demos/network_agent/docker-compose.yaml
@@ -19,3 +19,5 @@ services:
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY:?error}
- CHAT_COMPLETION_ENDPOINT=http://host.docker.internal:10000/v1
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
From ceca0dba2819fdeb6fab4c2433d20924d942b640 Mon Sep 17 00:00:00 2001
From: Aayush <82300923+aayushwhiz@users.noreply.github.com>
Date: Thu, 10 Oct 2024 14:57:20 -0700
Subject: [PATCH 02/10] fix prometheus target and update dashboard. (#165)
* fix prometheus target and update dashboard.
* Update envoy_overview.json with whitespace at the end
---
.../grafana/dashboards/envoy_overview.json | 210 ++++++++++++------
.../prometheus/prometheus.yaml | 2 +-
2 files changed, 146 insertions(+), 66 deletions(-)
diff --git a/demos/function_calling/grafana/dashboards/envoy_overview.json b/demos/function_calling/grafana/dashboards/envoy_overview.json
index 51bff777..eca35419 100644
--- a/demos/function_calling/grafana/dashboards/envoy_overview.json
+++ b/demos/function_calling/grafana/dashboards/envoy_overview.json
@@ -22,6 +22,7 @@
"panels": [
{
"datasource": {
+ "default": true,
"type": "prometheus",
"uid": "PBFA97CFB590B2093"
},
@@ -37,6 +38,7 @@
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
+ "barWidthFactor": 0.6,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
@@ -77,7 +79,32 @@
]
}
},
- "overrides": []
+ "overrides": [
+ {
+ "__systemRef": "hideSeriesFrom",
+ "matcher": {
+ "id": "byNames",
+ "options": {
+ "mode": "exclude",
+ "names": [
+ "api_server"
+ ],
+ "prefix": "All except:",
+ "readOnly": true
+ }
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom",
+ "value": {
+ "legend": false,
+ "tooltip": false,
+ "viz": true
+ }
+ }
+ ]
+ }
+ ]
},
"gridPos": {
"h": 8,
@@ -85,7 +112,7 @@
"x": 0,
"y": 0
},
- "id": 2,
+ "id": 3,
"options": {
"legend": {
"calcs": [],
@@ -106,22 +133,39 @@
},
"disableTextWrap": false,
"editorMode": "code",
- "expr": "avg(rate(envoy_cluster_internal_upstream_rq_time_sum[1m]) / rate(envoy_cluster_internal_upstream_rq_time_count[1m])) by (envoy_cluster_name)",
+ "expr": "avg(rate(envoy_cluster_internal_upstream_rq_completed{envoy_cluster_name=~\"api_server|openai\"}[1m])) by (envoy_cluster_name)",
"fullMetaSearch": false,
- "hide": false,
"includeNullMetadata": true,
"instant": false,
"legendFormat": "__auto",
"range": true,
"refId": "A",
"useBackend": false
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "disableTextWrap": false,
+ "editorMode": "code",
+ "expr": "avg(rate(envoy_cluster_external_upstream_rq_completed{envoy_cluster_name=~\"api_server|openai\"}[1m])) by (envoy_cluster_name)",
+ "fullMetaSearch": false,
+ "hide": false,
+ "includeNullMetadata": true,
+ "instant": false,
+ "legendFormat": "__auto",
+ "range": true,
+ "refId": "B",
+ "useBackend": false
}
],
- "title": "request latency - internal (ms)",
+ "title": "Upstream request rate",
"type": "timeseries"
},
{
"datasource": {
+ "default": true,
"type": "prometheus",
"uid": "PBFA97CFB590B2093"
},
@@ -137,6 +181,7 @@
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
+ "barWidthFactor": 0.6,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
@@ -206,7 +251,7 @@
},
"disableTextWrap": false,
"editorMode": "code",
- "expr": "avg(rate(envoy_cluster_external_upstream_rq_time_sum[1m]) / rate(envoy_cluster_external_upstream_rq_time_count[1m])) by (envoy_cluster_name)",
+ "expr": "avg(rate (envoy_cluster_external_upstream_rq_time_sum{envoy_cluster_name=~\"api_server|openai\"}[1m])/ rate(envoy_cluster_external_upstream_rq_time_count{envoy_cluster_name=~\"api_server|openai\"}[1m])) by (envoy_cluster_name)",
"fullMetaSearch": false,
"hide": false,
"includeNullMetadata": true,
@@ -222,45 +267,14 @@
},
{
"datasource": {
+ "default": true,
"type": "prometheus",
"uid": "PBFA97CFB590B2093"
},
"fieldConfig": {
"defaults": {
"color": {
- "mode": "palette-classic"
- },
- "custom": {
- "axisBorderShow": false,
- "axisCenteredZero": false,
- "axisColorMode": "text",
- "axisLabel": "",
- "axisPlacement": "auto",
- "barAlignment": 0,
- "drawStyle": "line",
- "fillOpacity": 0,
- "gradientMode": "none",
- "hideFrom": {
- "legend": false,
- "tooltip": false,
- "viz": false
- },
- "insertNulls": false,
- "lineInterpolation": "linear",
- "lineWidth": 1,
- "pointSize": 5,
- "scaleDistribution": {
- "type": "linear"
- },
- "showPoints": "auto",
- "spanNulls": false,
- "stacking": {
- "group": "A",
- "mode": "none"
- },
- "thresholdsStyle": {
- "mode": "off"
- }
+ "mode": "thresholds"
},
"mappings": [],
"thresholds": {
@@ -285,19 +299,25 @@
"x": 0,
"y": 8
},
- "id": 3,
+ "id": 4,
"options": {
- "legend": {
- "calcs": [],
- "displayMode": "list",
- "placement": "bottom",
- "showLegend": true
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
},
- "tooltip": {
- "mode": "single",
- "sort": "none"
- }
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
},
+ "pluginVersion": "11.2.0",
"targets": [
{
"datasource": {
@@ -305,38 +325,98 @@
"uid": "PBFA97CFB590B2093"
},
"disableTextWrap": false,
- "editorMode": "code",
- "expr": "avg(rate(envoy_cluster_internal_upstream_rq_completed[1m])) by (envoy_cluster_name)",
+ "editorMode": "builder",
+ "exemplar": false,
+ "expr": "envoy_cluster_upstream_rq_completed{envoy_cluster_name=~\"openai|api_server\"}",
"fullMetaSearch": false,
"includeNullMetadata": true,
- "instant": false,
- "legendFormat": "__auto",
- "range": true,
+ "instant": true,
+ "legendFormat": "{{envoy_cluster_name}}",
+ "range": false,
"refId": "A",
"useBackend": false
+ }
+ ],
+ "title": "# of Completd Requests",
+ "type": "stat"
+ },
+ {
+ "datasource": {
+ "default": true,
+ "type": "prometheus",
+ "uid": "PBFA97CFB590B2093"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
},
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 8,
+ "w": 12,
+ "x": 12,
+ "y": 8
+ },
+ "id": 5,
+ "options": {
+ "colorMode": "value",
+ "graphMode": "area",
+ "justifyMode": "auto",
+ "orientation": "auto",
+ "percentChangeColorMode": "standard",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showPercentChange": false,
+ "textMode": "auto",
+ "wideLayout": true
+ },
+ "pluginVersion": "11.2.0",
+ "targets": [
{
"datasource": {
"type": "prometheus",
"uid": "PBFA97CFB590B2093"
},
"disableTextWrap": false,
- "editorMode": "code",
- "expr": "avg(rate(envoy_cluster_external_upstream_rq_completed[1m])) by (envoy_cluster_name)",
+ "editorMode": "builder",
+ "exemplar": false,
+ "expr": "envoy_cluster_upstream_rq_cancelled{envoy_cluster_name=~\"api_server|openai\"} + envoy_cluster_upstream_rq_pending_failure_eject{envoy_cluster_name=~\"api_server|openai\"} + envoy_cluster_upstream_rq_pending_overflow{envoy_cluster_name=~\"api_server|openai\"}",
"fullMetaSearch": false,
- "hide": false,
"includeNullMetadata": true,
- "instant": false,
- "legendFormat": "__auto",
- "range": true,
- "refId": "B",
+ "instant": true,
+ "legendFormat": "{{envoy_cluster_name}}",
+ "range": false,
+ "refId": "A",
"useBackend": false
}
],
- "title": "Upstream request count",
- "type": "timeseries"
+ "title": "# of Failed or Cancelled Requests",
+ "type": "stat"
}
],
+ "refresh": "",
"schemaVersion": 39,
"tags": [],
"templating": {
@@ -348,8 +428,8 @@
},
"timepicker": {},
"timezone": "browser",
- "title": "Intelligent Gateway Overview",
+ "title": "Arch Gateway Dashboard",
"uid": "adt6uhx5lk8aob",
- "version": 3,
+ "version": 1,
"weekStart": ""
}
diff --git a/demos/function_calling/prometheus/prometheus.yaml b/demos/function_calling/prometheus/prometheus.yaml
index 95fcfd41..b947f31b 100644
--- a/demos/function_calling/prometheus/prometheus.yaml
+++ b/demos/function_calling/prometheus/prometheus.yaml
@@ -18,6 +18,6 @@ scrape_configs:
scheme: http
static_configs:
- targets:
- - arch:9901
+ - host.docker.internal:19901
params:
format: ['prometheus']
From 7d5f7608841eed28d7627d5cb4d68dd67fc9af86 Mon Sep 17 00:00:00 2001
From: Adil Hafeez
Date: Thu, 10 Oct 2024 17:44:41 -0700
Subject: [PATCH 03/10] Improve cli (#179)
---
.github/workflows/checks.yml | 5 +-
README.md | 2 +-
arch/tools/README.md | 13 +-
arch/tools/cli/consts.py | 1 +
arch/tools/cli/core.py | 67 ++-
arch/tools/cli/main.py | 120 +++-
arch/tools/cli/utils.py | 29 +-
arch/tools/poetry.lock | 561 +++++++++---------
arch/tools/pyproject.toml | 5 +-
demos/function_calling/arch_config.yaml | 4 +-
demos/network_agent/arch_config.yaml | 2 +-
.../agent/function-calling-agent.yaml | 2 +-
model_server/app/__init__.py | 107 ----
model_server/app/cli.py | 119 ++++
model_server/app/commons/constants.py | 2 +-
model_server/app/loader.py | 9 +-
model_server/app/main.py | 4 +-
model_server/pyproject.toml | 4 +-
18 files changed, 611 insertions(+), 445 deletions(-)
create mode 100644 arch/tools/cli/consts.py
create mode 100644 model_server/app/cli.py
diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml
index acb08a78..666981bd 100644
--- a/.github/workflows/checks.yml
+++ b/.github/workflows/checks.yml
@@ -1,6 +1,9 @@
name: Checks
-on: pull_request
+on:
+ pull_request:
+ push:
+ branches: [main]
jobs:
test:
diff --git a/README.md b/README.md
index ab9817f1..25685f18 100644
--- a/README.md
+++ b/README.md
@@ -69,7 +69,7 @@ llm_providers:
- name: OpenAI
provider: openai
access_key: OPENAI_API_KEY
- model: gpt-4o
+ model: gpt-3.5-turbo
default: true
stream: true
diff --git a/arch/tools/README.md b/arch/tools/README.md
index 8a74dc37..321a9efa 100644
--- a/arch/tools/README.md
+++ b/arch/tools/README.md
@@ -56,9 +56,18 @@ sh build_cli.sh
archgw build
```
-## Step 5: start model server in the background
+### Step 5: download models
+This will help download models so model_server can load faster. This should be done once.
+
+```bash
+archgw download-models
```
-archgw up --services model_server
+
+### Logs
+`archgw` command can also view logs from gateway and model_server. Use following command to view logs,
+
+```bash
+archgw logs --follow
```
## Uninstall Instructions: archgw CLI
diff --git a/arch/tools/cli/consts.py b/arch/tools/cli/consts.py
new file mode 100644
index 00000000..1b602134
--- /dev/null
+++ b/arch/tools/cli/consts.py
@@ -0,0 +1 @@
+KATANEMO_DOCKERHUB_REPO = "katanemo/archgw"
diff --git a/arch/tools/cli/core.py b/arch/tools/cli/core.py
index 9e9e9ab0..a1af4d6f 100644
--- a/arch/tools/cli/core.py
+++ b/arch/tools/cli/core.py
@@ -4,6 +4,37 @@ import time
import pkg_resources
import select
from cli.utils import run_docker_compose_ps, print_service_status, check_services_state
+from cli.utils import getLogger
+import sys
+
+log = getLogger(__name__)
+
+
+def stream_gateway_logs(follow):
+ """
+ Stream logs from the arch gateway service.
+ """
+ compose_file = pkg_resources.resource_filename(
+ __name__, "../config/docker-compose.yaml"
+ )
+
+ log.info("Logs from arch gateway service.")
+
+ options = ["docker", "compose", "-p", "arch", "logs"]
+ if follow:
+ options.append("-f")
+ try:
+ # Run `docker-compose logs` to stream logs from the gateway service
+ subprocess.run(
+ options,
+ cwd=os.path.dirname(compose_file),
+ check=True,
+ stdout=sys.stdout,
+ stderr=sys.stderr,
+ )
+
+ except subprocess.CalledProcessError as e:
+ log.info(f"Failed to stream logs: {str(e)}")
def start_arch(arch_config_file, env, log_timeout=120):
@@ -14,7 +45,7 @@ def start_arch(arch_config_file, env, log_timeout=120):
path (str): The path where the prompt_confi.yml file is located.
log_timeout (int): Time in seconds to show logs before checking for healthy state.
"""
-
+ log.info("Starting arch gateway")
compose_file = pkg_resources.resource_filename(
__name__, "../config/docker-compose.yaml"
)
@@ -35,9 +66,10 @@ def start_arch(arch_config_file, env, log_timeout=120):
), # Ensure the Docker command runs in the correct path
env=env, # Pass the modified environment
check=True, # Raise an exception if the command fails
+ stderr=subprocess.PIPE,
+ stdout=subprocess.PIPE,
)
- print(f"Arch docker-compose started in detached.")
- print("Monitoring `docker-compose ps` logs...")
+ log.info(f"Arch docker-compose started in detached.")
start_time = time.time()
services_status = {}
@@ -51,14 +83,14 @@ def start_arch(arch_config_file, env, log_timeout=120):
# Check if timeout is reached
if elapsed_time > log_timeout:
- print(f"Stopping log monitoring after {log_timeout} seconds.")
+ log.info(f"Stopping log monitoring after {log_timeout} seconds.")
break
current_services_status = run_docker_compose_ps(
compose_file=compose_file, env=env
)
if not current_services_status:
- print(
+ log.info(
"Status for the services could not be detected. Something went wrong. Please run docker logs"
)
break
@@ -74,11 +106,11 @@ def start_arch(arch_config_file, env, log_timeout=120):
running_states = ["running", "up"]
if check_services_state(current_services_status, running_states):
- print("Arch is up and running!")
+ log.info("Arch gateway is up and running!")
break
if check_services_state(current_services_status, unhealthy_states):
- print(
+ log.info(
"One or more Arch services are unhealthy. Please run `docker logs` for more information"
)
print_service_status(
@@ -92,7 +124,7 @@ def start_arch(arch_config_file, env, log_timeout=120):
services_status[service_name]["State"]
!= current_services_status[service_name]["State"]
):
- print(
+ log.info(
"One or more Arch services have changed state. Printing current state"
)
print_service_status(current_services_status)
@@ -101,7 +133,7 @@ def start_arch(arch_config_file, env, log_timeout=120):
services_status = current_services_status
except subprocess.CalledProcessError as e:
- print(f"Failed to start Arch: {str(e)}")
+ log.info(f"Failed to start Arch: {str(e)}")
def stop_arch():
@@ -115,17 +147,21 @@ def stop_arch():
__name__, "../config/docker-compose.yaml"
)
+ log.info("Shutting down arch gateway service.")
+
try:
# Run `docker-compose down` to shut down all services
subprocess.run(
["docker", "compose", "-p", "arch", "down"],
cwd=os.path.dirname(compose_file),
check=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
)
- print("Successfully shut down all services.")
+ log.info("Successfully shut down arch gateway service.")
except subprocess.CalledProcessError as e:
- print(f"Failed to shut down services: {str(e)}")
+ log.info(f"Failed to shut down services: {str(e)}")
def start_arch_modelserver():
@@ -134,12 +170,13 @@ def start_arch_modelserver():
"""
try:
+ log.info("archgw_modelserver restart")
subprocess.run(
["archgw_modelserver", "restart"], check=True, start_new_session=True
)
- print("Successfull run the archgw model_server")
+ log.info("Successfull ran model_server")
except subprocess.CalledProcessError as e:
- print(f"Failed to start model_server. Please check archgw_modelserver logs")
+ log.info(f"Failed to start model_server. Please check archgw_modelserver logs")
sys.exit(1)
@@ -153,7 +190,7 @@ def stop_arch_modelserver():
["archgw_modelserver", "stop"],
check=True,
)
- print("Successfull stopped the archgw model_server")
+ log.info("Successfull stopped the archgw model_server")
except subprocess.CalledProcessError as e:
- print(f"Failed to start model_server. Please check archgw_modelserver logs")
+ log.info(f"Failed to start model_server. Please check archgw_modelserver logs")
sys.exit(1)
diff --git a/arch/tools/cli/main.py b/arch/tools/cli/main.py
index 8c295042..e28cc3bc 100644
--- a/arch/tools/cli/main.py
+++ b/arch/tools/cli/main.py
@@ -10,8 +10,17 @@ from cli.core import (
stop_arch_modelserver,
start_arch,
stop_arch,
+ stream_gateway_logs,
)
from cli.utils import get_llm_provider_access_keys, load_env_file_to_dict
+from cli.consts import KATANEMO_DOCKERHUB_REPO
+from cli.utils import getLogger
+import multiprocessing
+from huggingface_hub import snapshot_download
+import joblib
+
+
+log = getLogger(__name__)
logo = r"""
_ _
@@ -39,17 +48,17 @@ MODEL_SERVER_BUILD_FILE = "./model_server/pyproject.toml"
@click.command()
@click.option(
- "--services",
+ "--service",
default="all",
- help="Services to build. Options are all, model_server, archgw. Default is all",
+ help="Optioanl parameter to specify which service to build. Options are model_server, archgw",
)
-def build(services):
+def build(service):
"""Build Arch from source. Must be in root of cloned repo."""
- if services not in ["all", "model_server", "archgw"]:
- print(f"Error: Invalid service {services}. Exiting")
+ if service not in ["model_server", "archgw", "all"]:
+ print(f"Error: Invalid service {service}. Exiting")
sys.exit(1)
# Check if /arch/Dockerfile exists
- if services == "archgw" or services == "all":
+ if service == "archgw" or service == "all":
if os.path.exists(ARCHGW_DOCKERFILE):
click.echo("Building archgw image...")
try:
@@ -60,7 +69,7 @@ def build(services):
"-f",
ARCHGW_DOCKERFILE,
"-t",
- "archgw:latest",
+ f"{KATANEMO_DOCKERHUB_REPO}:latest",
".",
"--add-host=host.docker.internal:host-gateway",
],
@@ -77,7 +86,7 @@ def build(services):
click.echo("archgw image built successfully.")
"""Install the model server dependencies using Poetry."""
- if services == "model_server" or services == "all":
+ if service == "model_server" or service == "all":
# Check if pyproject.toml exists
if os.path.exists(MODEL_SERVER_BUILD_FILE):
click.echo("Installing model server dependencies with Poetry...")
@@ -102,17 +111,17 @@ def build(services):
"--path", default=".", help="Path to the directory containing arch_config.yaml"
)
@click.option(
- "--services",
+ "--service",
default="all",
- help="Services to start. Options are all, model_server, archgw. Default is all",
+ help="Service to start. Options are model_server, archgw.",
)
-def up(file, path, services):
+def up(file, path, service):
"""Starts Arch."""
- if services not in ["all", "model_server", "archgw"]:
- print(f"Error: Invalid service {services}. Exiting")
+ if service not in ["all", "model_server", "archgw"]:
+ print(f"Error: Invalid service {service}. Exiting")
sys.exit(1)
- if services == "model_server":
+ if service == "model_server":
start_arch_modelserver()
return
@@ -142,7 +151,7 @@ def up(file, path, services):
print(f"Exiting archgw up: {e}")
sys.exit(1)
- print("Starting Arch gateway and Arch model server services via docker ")
+ log.info("Starging arch model server and arch gateway")
# Set the ARCH_CONFIG_FILE environment variable
env_stage = {}
@@ -184,7 +193,7 @@ def up(file, path, services):
env.update(env_stage)
env["ARCH_CONFIG_FILE"] = arch_config_file
- if services == "archgw":
+ if service == "archgw":
start_arch(arch_config_file, env)
else:
start_arch_modelserver()
@@ -193,19 +202,19 @@ def up(file, path, services):
@click.command()
@click.option(
- "--services",
+ "--service",
default="all",
- help="Services to down. Options are all, model_server, archgw. Default is all",
+ help="Service to down. Options are all, model_server, archgw. Default is all",
)
-def down(services):
+def down(service):
"""Stops Arch."""
- if services not in ["all", "model_server", "archgw"]:
- print(f"Error: Invalid service {services}. Exiting")
+ if service not in ["all", "model_server", "archgw"]:
+ print(f"Error: Invalid service {service}. Exiting")
sys.exit(1)
- if services == "model_server":
+ if service == "model_server":
stop_arch_modelserver()
- elif services == "archgw":
+ elif service == "archgw":
stop_arch()
else:
stop_arch_modelserver()
@@ -234,9 +243,74 @@ def generate_prompt_targets(file):
targets.generate_prompt_targets(file)
+def stream_model_server_logs(follow):
+ log_file = "~/archgw_logs/modelserver.log"
+ log_file_expanded = os.path.expanduser(log_file)
+ stream_command = ["tail"]
+ if follow:
+ stream_command.append("-f")
+ stream_command.append(log_file_expanded)
+ subprocess.run(
+ stream_command,
+ check=True,
+ stdout=sys.stdout,
+ stderr=sys.stderr,
+ )
+
+
+@click.command()
+@click.option(
+ "--service",
+ default="all",
+ help="Service to monitor. By default it will monitor both gateway and model_serve",
+)
+@click.option("--follow", help="Follow the logs", is_flag=True)
+def logs(service, follow):
+ """Stream logs from arch services."""
+
+ if service not in ["all", "model_server", "archgw"]:
+ print(f"Error: Invalid service {service}. Exiting")
+ sys.exit(1)
+ archgw_process = None
+ if service == "archgw" or service == "all":
+ archgw_process = multiprocessing.Process(
+ target=stream_gateway_logs, args=(follow,)
+ )
+ archgw_process.start()
+
+ model_server_process = None
+ if service == "model_server" or service == "all":
+ model_server_process = multiprocessing.Process(
+ target=stream_model_server_logs, args=(follow,)
+ )
+ model_server_process.start()
+
+ if archgw_process:
+ archgw_process.join()
+ if model_server_process:
+ model_server_process.join()
+
+
+model_list = [
+ "katanemo/Arch-Guard-cpu",
+ "katanemo/Arch-Guard",
+ "katanemo/bge-large-en-v1.5",
+]
+
+
+@click.command()
+def download_models():
+ """Download required models from Hugging Face Hub in the cache directory"""
+ for model in model_list:
+ log.info(f"Downloading model: {model}")
+ snapshot_download(repo_id=model)
+
+
main.add_command(up)
main.add_command(down)
main.add_command(build)
+main.add_command(logs)
+main.add_command(download_models)
main.add_command(generate_prompt_targets)
if __name__ == "__main__":
diff --git a/arch/tools/cli/utils.py b/arch/tools/cli/utils.py
index 5ed3e0fc..7803e331 100644
--- a/arch/tools/cli/utils.py
+++ b/arch/tools/cli/utils.py
@@ -5,6 +5,23 @@ import select
import shlex
import yaml
import json
+import logging
+
+logging.basicConfig(
+ level=logging.INFO,
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
+)
+
+
+def getLogger(name="cli"):
+ import logging
+
+ logger = logging.getLogger(name)
+ logger.setLevel(logging.INFO)
+ return logger
+
+
+log = getLogger(__name__)
def run_docker_compose_ps(compose_file, env):
@@ -15,7 +32,7 @@ def run_docker_compose_ps(compose_file, env):
path (str): The path where the docker-compose.yml file is located.
"""
try:
- # Run `docker-compose ps` to get the health status of each service
+ # Run `docker compose ps` to get the health status of each service
ps_process = subprocess.Popen(
[
"docker",
@@ -38,7 +55,7 @@ def run_docker_compose_ps(compose_file, env):
# Check if there is any error output
if error_output:
- print(
+ log.info(
f"Error while checking service status:\n{error_output}",
file=os.sys.stderr,
)
@@ -48,18 +65,18 @@ def run_docker_compose_ps(compose_file, env):
return services
except subprocess.CalledProcessError as e:
- print(f"Failed to check service status. Error:\n{e.stderr}")
+ log.info(f"Failed to check service status. Error:\n{e.stderr}")
return e
# Helper method to print service status
def print_service_status(services):
- print(f"{'Service Name':<25} {'State':<20} {'Ports'}")
- print("=" * 72)
+ log.info(f"{'Service Name':<25} {'State':<20} {'Ports'}")
+ log.info("=" * 72)
for service_name, info in services.items():
status = info["STATE"]
ports = info["PORTS"]
- print(f"{service_name:<25} {status:<20} {ports}")
+ log.info(f"{service_name:<25} {status:<20} {ports}")
# check for states based on the states passed in
diff --git a/arch/tools/poetry.lock b/arch/tools/poetry.lock
index 9d160897..8c802c60 100644
--- a/arch/tools/poetry.lock
+++ b/arch/tools/poetry.lock
@@ -44,102 +44,102 @@ files = [
[[package]]
name = "aiohttp"
-version = "3.10.9"
+version = "3.10.10"
description = "Async http client/server framework (asyncio)"
optional = false
python-versions = ">=3.8"
files = [
- {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8b3fb28a9ac8f2558760d8e637dbf27aef1e8b7f1d221e8669a1074d1a266bb2"},
- {file = "aiohttp-3.10.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91aa966858593f64c8a65cdefa3d6dc8fe3c2768b159da84c1ddbbb2c01ab4ef"},
- {file = "aiohttp-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:63649309da83277f06a15bbdc2a54fbe75efb92caa2c25bb57ca37762789c746"},
- {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3e7fabedb3fe06933f47f1538df7b3a8d78e13d7167195f51ca47ee12690373"},
- {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c070430fda1a550a1c3a4c2d7281d3b8cfc0c6715f616e40e3332201a253067"},
- {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:51d0a4901b27272ae54e42067bc4b9a90e619a690b4dc43ea5950eb3070afc32"},
- {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fec5fac7aea6c060f317f07494961236434928e6f4374e170ef50b3001e14581"},
- {file = "aiohttp-3.10.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:172ad884bb61ad31ed7beed8be776eb17e7fb423f1c1be836d5cb357a096bf12"},
- {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d646fdd74c25bbdd4a055414f0fe32896c400f38ffbdfc78c68e62812a9e0257"},
- {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e86260b76786c28acf0b5fe31c8dca4c2add95098c709b11e8c35b424ebd4f5b"},
- {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d7cafc11d70fdd8801abfc2ff276744ae4cb39d8060b6b542c7e44e5f2cfc2"},
- {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:fc262c3df78c8ff6020c782d9ce02e4bcffe4900ad71c0ecdad59943cba54442"},
- {file = "aiohttp-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:482c85cf3d429844396d939b22bc2a03849cb9ad33344689ad1c85697bcba33a"},
- {file = "aiohttp-3.10.9-cp310-cp310-win32.whl", hash = "sha256:aeebd3061f6f1747c011e1d0b0b5f04f9f54ad1a2ca183e687e7277bef2e0da2"},
- {file = "aiohttp-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:fa430b871220dc62572cef9c69b41e0d70fcb9d486a4a207a5de4c1f25d82593"},
- {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4"},
- {file = "aiohttp-3.10.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31"},
- {file = "aiohttp-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea"},
- {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10"},
- {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444"},
- {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9"},
- {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6"},
- {file = "aiohttp-3.10.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de"},
- {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf"},
- {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c"},
- {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08"},
- {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb"},
- {file = "aiohttp-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9"},
- {file = "aiohttp-3.10.9-cp311-cp311-win32.whl", hash = "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316"},
- {file = "aiohttp-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9"},
- {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4fd16b30567c5b8e167923be6e027eeae0f20cf2b8a26b98a25115f28ad48ee0"},
- {file = "aiohttp-3.10.9-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40ff5b7660f903dc587ed36ef08a88d46840182d9d4b5694e7607877ced698a1"},
- {file = "aiohttp-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4edc3fd701e2b9a0d605a7b23d3de4ad23137d23fc0dbab726aa71d92f11aaaf"},
- {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e525b69ee8a92c146ae5b4da9ecd15e518df4d40003b01b454ad694a27f498b5"},
- {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5002a02c17fcfd796d20bac719981d2fca9c006aac0797eb8f430a58e9d12431"},
- {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fd4ceeae2fb8cabdd1b71c82bfdd39662473d3433ec95b962200e9e752fb70d0"},
- {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6e395c3d1f773cf0651cd3559e25182eb0c03a2777b53b4575d8adc1149c6e9"},
- {file = "aiohttp-3.10.9-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbdb8def5268f3f9cd753a265756f49228a20ed14a480d151df727808b4531dd"},
- {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f82ace0ec57c94aaf5b0e118d4366cff5889097412c75aa14b4fd5fc0c44ee3e"},
- {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6ebdc3b3714afe1b134b3bbeb5f745eed3ecbcff92ab25d80e4ef299e83a5465"},
- {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f9ca09414003c0e96a735daa1f071f7d7ed06962ef4fa29ceb6c80d06696d900"},
- {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1298b854fd31d0567cbb916091be9d3278168064fca88e70b8468875ef9ff7e7"},
- {file = "aiohttp-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60ad5b8a7452c0f5645c73d4dad7490afd6119d453d302cd5b72b678a85d6044"},
- {file = "aiohttp-3.10.9-cp312-cp312-win32.whl", hash = "sha256:1a0ee6c0d590c917f1b9629371fce5f3d3f22c317aa96fbdcce3260754d7ea21"},
- {file = "aiohttp-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:c46131c6112b534b178d4e002abe450a0a29840b61413ac25243f1291613806a"},
- {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2bd9f3eac515c16c4360a6a00c38119333901b8590fe93c3257a9b536026594d"},
- {file = "aiohttp-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8cc0d13b4e3b1362d424ce3f4e8c79e1f7247a00d792823ffd640878abf28e56"},
- {file = "aiohttp-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba1a599255ad6a41022e261e31bc2f6f9355a419575b391f9655c4d9e5df5ff5"},
- {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:776e9f3c9b377fcf097c4a04b241b15691e6662d850168642ff976780609303c"},
- {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8debb45545ad95b58cc16c3c1cc19ad82cffcb106db12b437885dbee265f0ab5"},
- {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2555e4949c8d8782f18ef20e9d39730d2656e218a6f1a21a4c4c0b56546a02e"},
- {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c54dc329cd44f7f7883a9f4baaefe686e8b9662e2c6c184ea15cceee587d8d69"},
- {file = "aiohttp-3.10.9-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e709d6ac598c5416f879bb1bae3fd751366120ac3fa235a01de763537385d036"},
- {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:17c272cfe7b07a5bb0c6ad3f234e0c336fb53f3bf17840f66bd77b5815ab3d16"},
- {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0c21c82df33b264216abffff9f8370f303dab65d8eee3767efbbd2734363f677"},
- {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9331dd34145ff105177855017920dde140b447049cd62bb589de320fd6ddd582"},
- {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ac3196952c673822ebed8871cf8802e17254fff2a2ed4835d9c045d9b88c5ec7"},
- {file = "aiohttp-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2c33fa6e10bb7ed262e3ff03cc69d52869514f16558db0626a7c5c61dde3c29f"},
- {file = "aiohttp-3.10.9-cp313-cp313-win32.whl", hash = "sha256:a14e4b672c257a6b94fe934ee62666bacbc8e45b7876f9dd9502d0f0fe69db16"},
- {file = "aiohttp-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:a35ed3d03910785f7d9d6f5381f0c24002b2b888b298e6f941b2fc94c5055fcd"},
- {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f392ef50e22c31fa49b5a46af7f983fa3f118f3eccb8522063bee8bfa6755f8"},
- {file = "aiohttp-3.10.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d1f5c9169e26db6a61276008582d945405b8316aae2bb198220466e68114a0f5"},
- {file = "aiohttp-3.10.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d9d10d10ec27c0d46ddaecc3c5598c4db9ce4e6398ca872cdde0525765caa2f"},
- {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d97273a52d7f89a75b11ec386f786d3da7723d7efae3034b4dda79f6f093edc1"},
- {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d271f770b52e32236d945911b2082f9318e90ff835d45224fa9e28374303f729"},
- {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7003f33f5f7da1eb02f0446b0f8d2ccf57d253ca6c2e7a5732d25889da82b517"},
- {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6e00c8a92e7663ed2be6fcc08a2997ff06ce73c8080cd0df10cc0321a3168d7"},
- {file = "aiohttp-3.10.9-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a61df62966ce6507aafab24e124e0c3a1cfbe23c59732987fc0fd0d71daa0b88"},
- {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:60555211a006d26e1a389222e3fab8cd379f28e0fbf7472ee55b16c6c529e3a6"},
- {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:d15a29424e96fad56dc2f3abed10a89c50c099f97d2416520c7a543e8fddf066"},
- {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:a19caae0d670771ea7854ca30df76f676eb47e0fd9b2ee4392d44708f272122d"},
- {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:99f9678bf0e2b1b695e8028fedac24ab6770937932eda695815d5a6618c37e04"},
- {file = "aiohttp-3.10.9-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2914caa46054f3b5ff910468d686742ff8cff54b8a67319d75f5d5945fd0a13d"},
- {file = "aiohttp-3.10.9-cp38-cp38-win32.whl", hash = "sha256:0bc059ecbce835630e635879f5f480a742e130d9821fbe3d2f76610a6698ee25"},
- {file = "aiohttp-3.10.9-cp38-cp38-win_amd64.whl", hash = "sha256:e883b61b75ca6efc2541fcd52a5c8ccfe288b24d97e20ac08fdf343b8ac672ea"},
- {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fcd546782d03181b0b1d20b43d612429a90a68779659ba8045114b867971ab71"},
- {file = "aiohttp-3.10.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:85711eec2d875cd88c7eb40e734c4ca6d9ae477d6f26bd2b5bb4f7f60e41b156"},
- {file = "aiohttp-3.10.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:02d1d6610588bcd743fae827bd6f2e47e0d09b346f230824b4c6fb85c6065f9c"},
- {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3668d0c2a4d23fb136a753eba42caa2c0abbd3d9c5c87ee150a716a16c6deec1"},
- {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7c071235a47d407b0e93aa6262b49422dbe48d7d8566e1158fecc91043dd948"},
- {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac74e794e3aee92ae8f571bfeaa103a141e409863a100ab63a253b1c53b707eb"},
- {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bbf94d4a0447705b7775417ca8bb8086cc5482023a6e17cdc8f96d0b1b5aba6"},
- {file = "aiohttp-3.10.9-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb0b2d5d51f96b6cc19e6ab46a7b684be23240426ae951dcdac9639ab111b45e"},
- {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e83dfefb4f7d285c2d6a07a22268344a97d61579b3e0dce482a5be0251d672ab"},
- {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f0a44bb40b6aaa4fb9a5c1ee07880570ecda2065433a96ccff409c9c20c1624a"},
- {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c2b627d3c8982691b06d89d31093cee158c30629fdfebe705a91814d49b554f8"},
- {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:03690541e4cc866eef79626cfa1ef4dd729c5c1408600c8cb9e12e1137eed6ab"},
- {file = "aiohttp-3.10.9-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad3675c126f2a95bde637d162f8231cff6bc0bc9fbe31bd78075f9ff7921e322"},
- {file = "aiohttp-3.10.9-cp39-cp39-win32.whl", hash = "sha256:1321658f12b6caffafdc35cfba6c882cb014af86bef4e78c125e7e794dfb927b"},
- {file = "aiohttp-3.10.9-cp39-cp39-win_amd64.whl", hash = "sha256:9fdf5c839bf95fc67be5794c780419edb0dbef776edcfc6c2e5e2ffd5ee755fa"},
- {file = "aiohttp-3.10.9.tar.gz", hash = "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857"},
+ {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"},
+ {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"},
+ {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"},
+ {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"},
+ {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"},
+ {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"},
+ {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"},
+ {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"},
+ {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"},
+ {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"},
+ {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"},
+ {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"},
+ {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"},
+ {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"},
+ {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"},
+ {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"},
+ {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"},
+ {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"},
+ {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"},
+ {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"},
+ {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"},
+ {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"},
+ {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"},
+ {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"},
+ {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"},
+ {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"},
+ {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"},
+ {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"},
+ {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"},
+ {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"},
+ {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"},
+ {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"},
+ {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"},
+ {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"},
+ {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"},
+ {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"},
+ {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"},
+ {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"},
+ {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"},
+ {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"},
+ {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"},
+ {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"},
+ {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"},
]
[package.dependencies]
@@ -203,13 +203,13 @@ trio = ["trio (>=0.26.1)"]
[[package]]
name = "archgw-modelserver"
-version = "0.0.2"
+version = "0.0.3"
description = "A model server for serving models"
optional = false
python-versions = ">=3.10"
files = [
- {file = "archgw_modelserver-0.0.2-py3-none-any.whl", hash = "sha256:5a0b287b1cccb45480c39af89719c4f4e0673e2e608cec3093cf0c76f08ac787"},
- {file = "archgw_modelserver-0.0.2.tar.gz", hash = "sha256:acaaf3507bb60860298cb2511623b4ca370001a2ff0fb1247271b82c85f09cc4"},
+ {file = "archgw_modelserver-0.0.3-py3-none-any.whl", hash = "sha256:d5cb3267e41ab2eddb8e1201e8fcf2cf0b69d62063fabc8326687581dd8dc301"},
+ {file = "archgw_modelserver-0.0.3.tar.gz", hash = "sha256:0e1622b79bf4dc7082bf90225c8e9303d00a5a6db26abb2c0a3629975bc284d5"},
]
[package.dependencies]
@@ -1190,65 +1190,75 @@ dill = ">=0.3.7"
[[package]]
name = "networkx"
-version = "3.3"
+version = "3.4"
description = "Python package for creating and manipulating graphs and networks"
optional = false
python-versions = ">=3.10"
files = [
- {file = "networkx-3.3-py3-none-any.whl", hash = "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2"},
- {file = "networkx-3.3.tar.gz", hash = "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9"},
+ {file = "networkx-3.4-py3-none-any.whl", hash = "sha256:46dad0ec74a825a968e2b36c37ef5b91faa3868f017b2283d9cbff33112222ce"},
+ {file = "networkx-3.4.tar.gz", hash = "sha256:1269b90f8f0d3a4095f016f49650f35ac169729f49b69d0572b2bb142748162b"},
]
[package.extras]
-default = ["matplotlib (>=3.6)", "numpy (>=1.23)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"]
+default = ["matplotlib (>=3.7)", "numpy (>=1.24)", "pandas (>=2.0)", "scipy (>=1.10,!=1.11.0,!=1.11.1)"]
developer = ["changelist (==0.5)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"]
-doc = ["myst-nb (>=1.0)", "numpydoc (>=1.7)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"]
-extra = ["lxml (>=4.6)", "pydot (>=2.0)", "pygraphviz (>=1.12)", "sympy (>=1.10)"]
+doc = ["intersphinx-registry", "myst-nb (>=1.1)", "numpydoc (>=1.8.0)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.15)", "sphinx (>=7.3)", "sphinx-gallery (>=0.16)", "texext (>=0.6.7)"]
+example = ["cairocffi (>=1.7)", "contextily (>=1.6)", "igraph (>=0.11)", "momepy (>=0.7.2)", "osmnx (>=1.9)", "scikit-learn (>=1.5)", "seaborn (>=0.13)"]
+extra = ["lxml (>=4.6)", "pydot (>=3.0.1)", "pygraphviz (>=1.14)", "sympy (>=1.10)"]
test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
[[package]]
name = "numpy"
-version = "1.26.4"
+version = "2.0.2"
description = "Fundamental package for array computing in Python"
optional = false
python-versions = ">=3.9"
files = [
- {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"},
- {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"},
- {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"},
- {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"},
- {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"},
- {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"},
- {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"},
- {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"},
- {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"},
- {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"},
- {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"},
- {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"},
- {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"},
- {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"},
- {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"},
- {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"},
- {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"},
- {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"},
- {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"},
- {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"},
- {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"},
- {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"},
- {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"},
- {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"},
- {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"},
- {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"},
- {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"},
- {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"},
- {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"},
- {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"},
- {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"},
- {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"},
- {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"},
- {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"},
- {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"},
- {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"},
+ {file = "numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece"},
+ {file = "numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04"},
+ {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66"},
+ {file = "numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b"},
+ {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd"},
+ {file = "numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318"},
+ {file = "numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8"},
+ {file = "numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326"},
+ {file = "numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97"},
+ {file = "numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131"},
+ {file = "numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448"},
+ {file = "numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195"},
+ {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57"},
+ {file = "numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a"},
+ {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669"},
+ {file = "numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951"},
+ {file = "numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9"},
+ {file = "numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15"},
+ {file = "numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4"},
+ {file = "numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc"},
+ {file = "numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b"},
+ {file = "numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e"},
+ {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c"},
+ {file = "numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c"},
+ {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692"},
+ {file = "numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a"},
+ {file = "numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c"},
+ {file = "numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded"},
+ {file = "numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5"},
+ {file = "numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a"},
+ {file = "numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c"},
+ {file = "numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd"},
+ {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b"},
+ {file = "numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729"},
+ {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1"},
+ {file = "numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd"},
+ {file = "numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d"},
+ {file = "numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d"},
+ {file = "numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa"},
+ {file = "numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73"},
+ {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8"},
+ {file = "numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4"},
+ {file = "numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c"},
+ {file = "numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385"},
+ {file = "numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78"},
]
[[package]]
@@ -1555,24 +1565,24 @@ files = [
[[package]]
name = "optimum"
-version = "1.22.0"
+version = "1.23.0"
description = "Optimum Library is an extension of the Hugging Face Transformers library, providing a framework to integrate third-party libraries from Hardware Partners and interface with their specific functionality."
optional = false
python-versions = ">=3.7.0"
files = [
- {file = "optimum-1.22.0-py3-none-any.whl", hash = "sha256:80d2ba0c34f60e1c5e0fc0840647d3899f48924a86caedd97d47fc64836a0a5a"},
- {file = "optimum-1.22.0.tar.gz", hash = "sha256:b0fcbe08987d453c685b4fdb6b3afe408ee7cfa74ffa1230eb20a1272e67952c"},
+ {file = "optimum-1.23.0-py3-none-any.whl", hash = "sha256:3d05deb1e23c5b8e9969146b70ccca0826d6e86a79fbb282c89ae52f6450c42a"},
+ {file = "optimum-1.23.0.tar.gz", hash = "sha256:c27ecb41a45e418392df3406e83ba4bd10f2d1cdd0b95e6ae0bc3268661978da"},
]
[package.dependencies]
coloredlogs = "*"
datasets = "*"
huggingface-hub = ">=0.8.0"
-numpy = "<2.0"
+numpy = "*"
packaging = "*"
sympy = "*"
torch = ">=1.11"
-transformers = {version = ">=4.29,<4.45.0", extras = ["sentencepiece"]}
+transformers = {version = ">=4.29", extras = ["sentencepiece"]}
[package.extras]
amd = ["optimum-amd"]
@@ -1580,8 +1590,8 @@ benchmark = ["evaluate (>=0.2.0)", "optuna", "scikit-learn", "seqeval", "torchvi
dev = ["Pillow", "accelerate", "black (>=23.1,<24.0)", "diffusers (>=0.17.0)", "einops", "invisible-watermark", "parameterized", "pytest (<=8.0.0)", "pytest-xdist", "requests", "rjieba", "ruff (==0.1.5)", "sacremoses", "scikit-learn", "timm", "torchaudio", "torchvision"]
diffusers = ["diffusers"]
doc-build = ["accelerate"]
-exporters = ["onnx", "onnxruntime", "timm"]
-exporters-gpu = ["onnx", "onnxruntime-gpu", "timm"]
+exporters = ["onnx", "onnxruntime", "timm", "transformers (<4.46.0)"]
+exporters-gpu = ["onnx", "onnxruntime-gpu", "timm", "transformers (<4.46.0)"]
exporters-tf = ["datasets (<=2.16)", "h5py", "numpy (<1.24.0)", "onnx", "onnxruntime", "tensorflow (>=2.4,<=2.12.1)", "tf2onnx", "timm", "transformers[sentencepiece] (>=4.26,<4.38)"]
furiosa = ["optimum-furiosa"]
graphcore = ["optimum-graphcore"]
@@ -1592,8 +1602,8 @@ neural-compressor = ["optimum-intel[neural-compressor] (>=1.18.0)"]
neuron = ["optimum-neuron[neuron] (>=0.0.20)", "transformers (>=4.36.2,<4.42.0)"]
neuronx = ["optimum-neuron[neuronx] (>=0.0.20)", "transformers (>=4.36.2,<4.42.0)"]
nncf = ["optimum-intel[nncf] (>=1.18.0)"]
-onnxruntime = ["datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime (>=1.11.0)", "protobuf (>=3.20.1)"]
-onnxruntime-gpu = ["accelerate", "datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime-gpu (>=1.11.0)", "protobuf (>=3.20.1)"]
+onnxruntime = ["datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime (>=1.11.0)", "protobuf (>=3.20.1)", "transformers (<4.46.0)"]
+onnxruntime-gpu = ["accelerate", "datasets (>=1.2.1)", "evaluate", "onnx", "onnxruntime-gpu (>=1.11.0)", "protobuf (>=3.20.1)", "transformers (<4.46.0)"]
openvino = ["optimum-intel[openvino] (>=1.18.0)"]
quality = ["black (>=23.1,<24.0)", "ruff (==0.1.5)"]
quanto = ["optimum-quanto (>=0.2.4)"]
@@ -1601,33 +1611,33 @@ tests = ["Pillow", "accelerate", "diffusers (>=0.17.0)", "einops", "invisible-wa
[[package]]
name = "optimum-intel"
-version = "1.19.0"
+version = "1.20.0"
description = "Optimum Library is an extension of the Hugging Face Transformers library, providing a framework to integrate third-party libraries from Hardware Partners and interface with their specific functionality."
optional = false
python-versions = "*"
files = [
- {file = "optimum-intel-1.19.0.tar.gz", hash = "sha256:46396debf89d30e85a3f15caa3f8f93febb9a246b22bbff99d7867627d04ca01"},
- {file = "optimum_intel-1.19.0-py3-none-any.whl", hash = "sha256:55cfa17c2c2f6d25cb10994b827b09c2fb4603cd55cda0f8d4c15b799d882a42"},
+ {file = "optimum-intel-1.20.0.tar.gz", hash = "sha256:6b37814a543065f4f864c82875c328c6153e3e13c99807a0337b616bb9b6e9be"},
+ {file = "optimum_intel-1.20.0-py3-none-any.whl", hash = "sha256:f2760d7aded5edb2d363dc2e522823f1790800d984dc6bb4a6df370ff887ce4d"},
]
[package.dependencies]
datasets = ">=1.4.0"
onnx = "*"
-optimum = ">=1.22,<2.0"
+optimum = ">=1.23,<2.0"
scipy = "*"
sentencepiece = "*"
setuptools = "*"
torch = ">=1.11"
-transformers = ">=4.36,<4.45"
+transformers = ">=4.36,<4.46"
[package.extras]
diffusers = ["diffusers"]
ipex = ["intel-extension-for-pytorch", "transformers (>=4.39,<4.45)"]
-neural-compressor = ["accelerate", "neural-compressor[pt] (>3.0)", "transformers (<=4.43.2)"]
+neural-compressor = ["accelerate", "neural-compressor[pt] (>3.0)"]
nncf = ["nncf (>=2.11.0)"]
-openvino = ["nncf (>=2.11.0)", "openvino (>=2023.3)", "openvino-tokenizers[transformers]"]
+openvino = ["nncf (>=2.11.0)", "openvino (==2024.4.1.dev20240926)", "openvino-tokenizers[transformers] (==2024.4.1.0.dev20240926)"]
quality = ["black (>=23.1,<24.0)", "ruff (==0.4.4)"]
-tests = ["Pillow", "accelerate", "diffusers", "einops", "evaluate", "invisible-watermark (>=0.2.0)", "parameterized", "py-cpuinfo", "pytest (>=7.2.0,<8.0.0)", "rjieba", "sacremoses", "sentence-transformers", "tiktoken", "timm", "torchaudio", "transformers-stream-generator"]
+tests = ["Pillow", "accelerate", "diffusers", "einops", "evaluate", "invisible-watermark (>=0.2.0)", "open-clip-torch (>=2.26.1)", "parameterized", "py-cpuinfo", "pytest (>=7.2.0,<8.0.0)", "rjieba", "sacremoses", "sentence-transformers", "tiktoken", "timm", "torchaudio", "transformers-stream-generator"]
[[package]]
name = "packaging"
@@ -2924,111 +2934,111 @@ files = [
[[package]]
name = "tokenizers"
-version = "0.19.1"
+version = "0.20.1"
description = ""
optional = false
python-versions = ">=3.7"
files = [
- {file = "tokenizers-0.19.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:952078130b3d101e05ecfc7fc3640282d74ed26bcf691400f872563fca15ac97"},
- {file = "tokenizers-0.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82c8b8063de6c0468f08e82c4e198763e7b97aabfe573fd4cf7b33930ca4df77"},
- {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f03727225feaf340ceeb7e00604825addef622d551cbd46b7b775ac834c1e1c4"},
- {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:453e4422efdfc9c6b6bf2eae00d5e323f263fff62b29a8c9cd526c5003f3f642"},
- {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02e81bf089ebf0e7f4df34fa0207519f07e66d8491d963618252f2e0729e0b46"},
- {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b07c538ba956843833fee1190cf769c60dc62e1cf934ed50d77d5502194d63b1"},
- {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28cab1582e0eec38b1f38c1c1fb2e56bce5dc180acb1724574fc5f47da2a4fe"},
- {file = "tokenizers-0.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b01afb7193d47439f091cd8f070a1ced347ad0f9144952a30a41836902fe09e"},
- {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7fb297edec6c6841ab2e4e8f357209519188e4a59b557ea4fafcf4691d1b4c98"},
- {file = "tokenizers-0.19.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2e8a3dd055e515df7054378dc9d6fa8c8c34e1f32777fb9a01fea81496b3f9d3"},
- {file = "tokenizers-0.19.1-cp310-none-win32.whl", hash = "sha256:7ff898780a155ea053f5d934925f3902be2ed1f4d916461e1a93019cc7250837"},
- {file = "tokenizers-0.19.1-cp310-none-win_amd64.whl", hash = "sha256:bea6f9947e9419c2fda21ae6c32871e3d398cba549b93f4a65a2d369662d9403"},
- {file = "tokenizers-0.19.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5c88d1481f1882c2e53e6bb06491e474e420d9ac7bdff172610c4f9ad3898059"},
- {file = "tokenizers-0.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ddf672ed719b4ed82b51499100f5417d7d9f6fb05a65e232249268f35de5ed14"},
- {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dadc509cc8a9fe460bd274c0e16ac4184d0958117cf026e0ea8b32b438171594"},
- {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfedf31824ca4915b511b03441784ff640378191918264268e6923da48104acc"},
- {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac11016d0a04aa6487b1513a3a36e7bee7eec0e5d30057c9c0408067345c48d2"},
- {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76951121890fea8330d3a0df9a954b3f2a37e3ec20e5b0530e9a0044ca2e11fe"},
- {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b342d2ce8fc8d00f376af068e3274e2e8649562e3bc6ae4a67784ded6b99428d"},
- {file = "tokenizers-0.19.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d16ff18907f4909dca9b076b9c2d899114dd6abceeb074eca0c93e2353f943aa"},
- {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:706a37cc5332f85f26efbe2bdc9ef8a9b372b77e4645331a405073e4b3a8c1c6"},
- {file = "tokenizers-0.19.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:16baac68651701364b0289979ecec728546133e8e8fe38f66fe48ad07996b88b"},
- {file = "tokenizers-0.19.1-cp311-none-win32.whl", hash = "sha256:9ed240c56b4403e22b9584ee37d87b8bfa14865134e3e1c3fb4b2c42fafd3256"},
- {file = "tokenizers-0.19.1-cp311-none-win_amd64.whl", hash = "sha256:ad57d59341710b94a7d9dbea13f5c1e7d76fd8d9bcd944a7a6ab0b0da6e0cc66"},
- {file = "tokenizers-0.19.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:621d670e1b1c281a1c9698ed89451395d318802ff88d1fc1accff0867a06f153"},
- {file = "tokenizers-0.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d924204a3dbe50b75630bd16f821ebda6a5f729928df30f582fb5aade90c818a"},
- {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4f3fefdc0446b1a1e6d81cd4c07088ac015665d2e812f6dbba4a06267d1a2c95"},
- {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9620b78e0b2d52ef07b0d428323fb34e8ea1219c5eac98c2596311f20f1f9266"},
- {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04ce49e82d100594715ac1b2ce87d1a36e61891a91de774755f743babcd0dd52"},
- {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5c2ff13d157afe413bf7e25789879dd463e5a4abfb529a2d8f8473d8042e28f"},
- {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3174c76efd9d08f836bfccaca7cfec3f4d1c0a4cf3acbc7236ad577cc423c840"},
- {file = "tokenizers-0.19.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9d5b6c0e7a1e979bec10ff960fae925e947aab95619a6fdb4c1d8ff3708ce3"},
- {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a179856d1caee06577220ebcfa332af046d576fb73454b8f4d4b0ba8324423ea"},
- {file = "tokenizers-0.19.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:952b80dac1a6492170f8c2429bd11fcaa14377e097d12a1dbe0ef2fb2241e16c"},
- {file = "tokenizers-0.19.1-cp312-none-win32.whl", hash = "sha256:01d62812454c188306755c94755465505836fd616f75067abcae529c35edeb57"},
- {file = "tokenizers-0.19.1-cp312-none-win_amd64.whl", hash = "sha256:b70bfbe3a82d3e3fb2a5e9b22a39f8d1740c96c68b6ace0086b39074f08ab89a"},
- {file = "tokenizers-0.19.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:bb9dfe7dae85bc6119d705a76dc068c062b8b575abe3595e3c6276480e67e3f1"},
- {file = "tokenizers-0.19.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:1f0360cbea28ea99944ac089c00de7b2e3e1c58f479fb8613b6d8d511ce98267"},
- {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:71e3ec71f0e78780851fef28c2a9babe20270404c921b756d7c532d280349214"},
- {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b82931fa619dbad979c0ee8e54dd5278acc418209cc897e42fac041f5366d626"},
- {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e8ff5b90eabdcdaa19af697885f70fe0b714ce16709cf43d4952f1f85299e73a"},
- {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e742d76ad84acbdb1a8e4694f915fe59ff6edc381c97d6dfdd054954e3478ad4"},
- {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d8c5d59d7b59885eab559d5bc082b2985555a54cda04dda4c65528d90ad252ad"},
- {file = "tokenizers-0.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b2da5c32ed869bebd990c9420df49813709e953674c0722ff471a116d97b22d"},
- {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:638e43936cc8b2cbb9f9d8dde0fe5e7e30766a3318d2342999ae27f68fdc9bd6"},
- {file = "tokenizers-0.19.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:78e769eb3b2c79687d9cb0f89ef77223e8e279b75c0a968e637ca7043a84463f"},
- {file = "tokenizers-0.19.1-cp37-none-win32.whl", hash = "sha256:72791f9bb1ca78e3ae525d4782e85272c63faaef9940d92142aa3eb79f3407a3"},
- {file = "tokenizers-0.19.1-cp37-none-win_amd64.whl", hash = "sha256:f3bbb7a0c5fcb692950b041ae11067ac54826204318922da754f908d95619fbc"},
- {file = "tokenizers-0.19.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:07f9295349bbbcedae8cefdbcfa7f686aa420be8aca5d4f7d1ae6016c128c0c5"},
- {file = "tokenizers-0.19.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10a707cc6c4b6b183ec5dbfc5c34f3064e18cf62b4a938cb41699e33a99e03c1"},
- {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6309271f57b397aa0aff0cbbe632ca9d70430839ca3178bf0f06f825924eca22"},
- {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad23d37d68cf00d54af184586d79b84075ada495e7c5c0f601f051b162112dc"},
- {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:427c4f0f3df9109314d4f75b8d1f65d9477033e67ffaec4bca53293d3aca286d"},
- {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e83a31c9cf181a0a3ef0abad2b5f6b43399faf5da7e696196ddd110d332519ee"},
- {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c27b99889bd58b7e301468c0838c5ed75e60c66df0d4db80c08f43462f82e0d3"},
- {file = "tokenizers-0.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bac0b0eb952412b0b196ca7a40e7dce4ed6f6926489313414010f2e6b9ec2adf"},
- {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8a6298bde623725ca31c9035a04bf2ef63208d266acd2bed8c2cb7d2b7d53ce6"},
- {file = "tokenizers-0.19.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:08a44864e42fa6d7d76d7be4bec62c9982f6f6248b4aa42f7302aa01e0abfd26"},
- {file = "tokenizers-0.19.1-cp38-none-win32.whl", hash = "sha256:1de5bc8652252d9357a666e609cb1453d4f8e160eb1fb2830ee369dd658e8975"},
- {file = "tokenizers-0.19.1-cp38-none-win_amd64.whl", hash = "sha256:0bcce02bf1ad9882345b34d5bd25ed4949a480cf0e656bbd468f4d8986f7a3f1"},
- {file = "tokenizers-0.19.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0b9394bd204842a2a1fd37fe29935353742be4a3460b6ccbaefa93f58a8df43d"},
- {file = "tokenizers-0.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4692ab92f91b87769d950ca14dbb61f8a9ef36a62f94bad6c82cc84a51f76f6a"},
- {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6258c2ef6f06259f70a682491c78561d492e885adeaf9f64f5389f78aa49a051"},
- {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c85cf76561fbd01e0d9ea2d1cbe711a65400092bc52b5242b16cfd22e51f0c58"},
- {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:670b802d4d82bbbb832ddb0d41df7015b3e549714c0e77f9bed3e74d42400fbe"},
- {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:85aa3ab4b03d5e99fdd31660872249df5e855334b6c333e0bc13032ff4469c4a"},
- {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbf001afbbed111a79ca47d75941e9e5361297a87d186cbfc11ed45e30b5daba"},
- {file = "tokenizers-0.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c89aa46c269e4e70c4d4f9d6bc644fcc39bb409cb2a81227923404dd6f5227"},
- {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:39c1ec76ea1027438fafe16ecb0fb84795e62e9d643444c1090179e63808c69d"},
- {file = "tokenizers-0.19.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c2a0d47a89b48d7daa241e004e71fb5a50533718897a4cd6235cb846d511a478"},
- {file = "tokenizers-0.19.1-cp39-none-win32.whl", hash = "sha256:61b7fe8886f2e104d4caf9218b157b106207e0f2a4905c9c7ac98890688aabeb"},
- {file = "tokenizers-0.19.1-cp39-none-win_amd64.whl", hash = "sha256:f97660f6c43efd3e0bfd3f2e3e5615bf215680bad6ee3d469df6454b8c6e8256"},
- {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3b11853f17b54c2fe47742c56d8a33bf49ce31caf531e87ac0d7d13d327c9334"},
- {file = "tokenizers-0.19.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d26194ef6c13302f446d39972aaa36a1dda6450bc8949f5eb4c27f51191375bd"},
- {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e8d1ed93beda54bbd6131a2cb363a576eac746d5c26ba5b7556bc6f964425594"},
- {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca407133536f19bdec44b3da117ef0d12e43f6d4b56ac4c765f37eca501c7bda"},
- {file = "tokenizers-0.19.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce05fde79d2bc2e46ac08aacbc142bead21614d937aac950be88dc79f9db9022"},
- {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:35583cd46d16f07c054efd18b5d46af4a2f070a2dd0a47914e66f3ff5efb2b1e"},
- {file = "tokenizers-0.19.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:43350270bfc16b06ad3f6f07eab21f089adb835544417afda0f83256a8bf8b75"},
- {file = "tokenizers-0.19.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b4399b59d1af5645bcee2072a463318114c39b8547437a7c2d6a186a1b5a0e2d"},
- {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6852c5b2a853b8b0ddc5993cd4f33bfffdca4fcc5d52f89dd4b8eada99379285"},
- {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd266ae85c3d39df2f7e7d0e07f6c41a55e9a3123bb11f854412952deacd828"},
- {file = "tokenizers-0.19.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecb2651956eea2aa0a2d099434134b1b68f1c31f9a5084d6d53f08ed43d45ff2"},
- {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:b279ab506ec4445166ac476fb4d3cc383accde1ea152998509a94d82547c8e2a"},
- {file = "tokenizers-0.19.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:89183e55fb86e61d848ff83753f64cded119f5d6e1f553d14ffee3700d0a4a49"},
- {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2edbc75744235eea94d595a8b70fe279dd42f3296f76d5a86dde1d46e35f574"},
- {file = "tokenizers-0.19.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:0e64bfde9a723274e9a71630c3e9494ed7b4c0f76a1faacf7fe294cd26f7ae7c"},
- {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b5ca92bfa717759c052e345770792d02d1f43b06f9e790ca0a1db62838816f3"},
- {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f8a20266e695ec9d7a946a019c1d5ca4eddb6613d4f466888eee04f16eedb85"},
- {file = "tokenizers-0.19.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63c38f45d8f2a2ec0f3a20073cccb335b9f99f73b3c69483cd52ebc75369d8a1"},
- {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:dd26e3afe8a7b61422df3176e06664503d3f5973b94f45d5c45987e1cb711876"},
- {file = "tokenizers-0.19.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:eddd5783a4a6309ce23432353cdb36220e25cbb779bfa9122320666508b44b88"},
- {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:56ae39d4036b753994476a1b935584071093b55c7a72e3b8288e68c313ca26e7"},
- {file = "tokenizers-0.19.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f9939ca7e58c2758c01b40324a59c034ce0cebad18e0d4563a9b1beab3018243"},
- {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6c330c0eb815d212893c67a032e9dc1b38a803eccb32f3e8172c19cc69fbb439"},
- {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec11802450a2487cdf0e634b750a04cbdc1c4d066b97d94ce7dd2cb51ebb325b"},
- {file = "tokenizers-0.19.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b718f316b596f36e1dae097a7d5b91fc5b85e90bf08b01ff139bd8953b25af"},
- {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:ed69af290c2b65169f0ba9034d1dc39a5db9459b32f1dd8b5f3f32a3fcf06eab"},
- {file = "tokenizers-0.19.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f8a9c828277133af13f3859d1b6bf1c3cb6e9e1637df0e45312e6b7c2e622b1f"},
- {file = "tokenizers-0.19.1.tar.gz", hash = "sha256:ee59e6680ed0fdbe6b724cf38bd70400a0c1dd623b07ac729087270caeac88e3"},
+ {file = "tokenizers-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:439261da7c0a5c88bda97acb284d49fbdaf67e9d3b623c0bfd107512d22787a9"},
+ {file = "tokenizers-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03dae629d99068b1ea5416d50de0fea13008f04129cc79af77a2a6392792d93c"},
+ {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b61f561f329ffe4b28367798b89d60c4abf3f815d37413b6352bc6412a359867"},
+ {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec870fce1ee5248a10be69f7a8408a234d6f2109f8ea827b4f7ecdbf08c9fd15"},
+ {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d388d1ea8b7447da784e32e3b86a75cce55887e3b22b31c19d0b186b1c677800"},
+ {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:299c85c1d21135bc01542237979bf25c32efa0d66595dd0069ae259b97fb2dbe"},
+ {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e96f6c14c9752bb82145636b614d5a78e9cde95edfbe0a85dad0dd5ddd6ec95c"},
+ {file = "tokenizers-0.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc9e95ad49c932b80abfbfeaf63b155761e695ad9f8a58c52a47d962d76e310f"},
+ {file = "tokenizers-0.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f22dee205329a636148c325921c73cf3e412e87d31f4d9c3153b302a0200057b"},
+ {file = "tokenizers-0.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2ffd9a8895575ac636d44500c66dffaef133823b6b25067604fa73bbc5ec09d"},
+ {file = "tokenizers-0.20.1-cp310-none-win32.whl", hash = "sha256:2847843c53f445e0f19ea842a4e48b89dd0db4e62ba6e1e47a2749d6ec11f50d"},
+ {file = "tokenizers-0.20.1-cp310-none-win_amd64.whl", hash = "sha256:f9aa93eacd865f2798b9e62f7ce4533cfff4f5fbd50c02926a78e81c74e432cd"},
+ {file = "tokenizers-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4a717dcb08f2dabbf27ae4b6b20cbbb2ad7ed78ce05a829fae100ff4b3c7ff15"},
+ {file = "tokenizers-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f84dad1ff1863c648d80628b1b55353d16303431283e4efbb6ab1af56a75832"},
+ {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:929c8f3afa16a5130a81ab5079c589226273ec618949cce79b46d96e59a84f61"},
+ {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d10766473954397e2d370f215ebed1cc46dcf6fd3906a2a116aa1d6219bfedc3"},
+ {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9300fac73ddc7e4b0330acbdda4efaabf74929a4a61e119a32a181f534a11b47"},
+ {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ecaf7b0e39caeb1aa6dd6e0975c405716c82c1312b55ac4f716ef563a906969"},
+ {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5170be9ec942f3d1d317817ced8d749b3e1202670865e4fd465e35d8c259de83"},
+ {file = "tokenizers-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f1ae08fa9aea5891cbd69df29913e11d3841798e0bfb1ff78b78e4e7ea0a4"},
+ {file = "tokenizers-0.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ee86d4095d3542d73579e953c2e5e07d9321af2ffea6ecc097d16d538a2dea16"},
+ {file = "tokenizers-0.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:86dcd08da163912e17b27bbaba5efdc71b4fbffb841530fdb74c5707f3c49216"},
+ {file = "tokenizers-0.20.1-cp311-none-win32.whl", hash = "sha256:9af2dc4ee97d037bc6b05fa4429ddc87532c706316c5e11ce2f0596dfcfa77af"},
+ {file = "tokenizers-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:899152a78b095559c287b4c6d0099469573bb2055347bb8154db106651296f39"},
+ {file = "tokenizers-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:407ab666b38e02228fa785e81f7cf79ef929f104bcccf68a64525a54a93ceac9"},
+ {file = "tokenizers-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f13a2d16032ebc8bd812eb8099b035ac65887d8f0c207261472803b9633cf3e"},
+ {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e98eee4dca22849fbb56a80acaa899eec5b72055d79637dd6aa15d5e4b8628c9"},
+ {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47c1bcdd61e61136087459cb9e0b069ff23b5568b008265e5cbc927eae3387ce"},
+ {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128c1110e950534426e2274837fc06b118ab5f2fa61c3436e60e0aada0ccfd67"},
+ {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2e2d47a819d2954f2c1cd0ad51bb58ffac6f53a872d5d82d65d79bf76b9896d"},
+ {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bdd67a0e3503a9a7cf8bc5a4a49cdde5fa5bada09a51e4c7e1c73900297539bd"},
+ {file = "tokenizers-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:689b93d2e26d04da337ac407acec8b5d081d8d135e3e5066a88edd5bdb5aff89"},
+ {file = "tokenizers-0.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0c6a796ddcd9a19ad13cf146997cd5895a421fe6aec8fd970d69f9117bddb45c"},
+ {file = "tokenizers-0.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3ea919687aa7001a8ff1ba36ac64f165c4e89035f57998fa6cedcfd877be619d"},
+ {file = "tokenizers-0.20.1-cp312-none-win32.whl", hash = "sha256:6d3ac5c1f48358ffe20086bf065e843c0d0a9fce0d7f0f45d5f2f9fba3609ca5"},
+ {file = "tokenizers-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:b0874481aea54a178f2bccc45aa2d0c99cd3f79143a0948af6a9a21dcc49173b"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:96af92e833bd44760fb17f23f402e07a66339c1dcbe17d79a9b55bb0cc4f038e"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:65f34e5b731a262dfa562820818533c38ce32a45864437f3d9c82f26c139ca7f"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17f98fccb5c12ab1ce1f471731a9cd86df5d4bd2cf2880c5a66b229802d96145"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b8c0fc3542cf9370bf92c932eb71bdeb33d2d4aeeb4126d9fd567b60bd04cb30"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b39356df4575d37f9b187bb623aab5abb7b62c8cb702867a1768002f814800c"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfdad27b0e50544f6b838895a373db6114b85112ba5c0cefadffa78d6daae563"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:094663dd0e85ee2e573126918747bdb40044a848fde388efb5b09d57bc74c680"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e4cf033a2aa207d7ac790e91adca598b679999710a632c4a494aab0fc3a1b2"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9310951c92c9fb91660de0c19a923c432f110dbfad1a2d429fbc44fa956bf64f"},
+ {file = "tokenizers-0.20.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:05e41e302c315bd2ed86c02e917bf03a6cf7d2f652c9cee1a0eb0d0f1ca0d32c"},
+ {file = "tokenizers-0.20.1-cp37-none-win32.whl", hash = "sha256:212231ab7dfcdc879baf4892ca87c726259fa7c887e1688e3f3cead384d8c305"},
+ {file = "tokenizers-0.20.1-cp37-none-win_amd64.whl", hash = "sha256:896195eb9dfdc85c8c052e29947169c1fcbe75a254c4b5792cdbd451587bce85"},
+ {file = "tokenizers-0.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:741fb22788482d09d68e73ece1495cfc6d9b29a06c37b3df90564a9cfa688e6d"},
+ {file = "tokenizers-0.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:10be14ebd8082086a342d969e17fc2d6edc856c59dbdbddd25f158fa40eaf043"},
+ {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:514cf279b22fa1ae0bc08e143458c74ad3b56cd078b319464959685a35c53d5e"},
+ {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a647c5b7cb896d6430cf3e01b4e9a2d77f719c84cefcef825d404830c2071da2"},
+ {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7cdf379219e1e1dd432091058dab325a2e6235ebb23e0aec8d0508567c90cd01"},
+ {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ba72260449e16c4c2f6f3252823b059fbf2d31b32617e582003f2b18b415c39"},
+ {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:910b96ed87316e4277b23c7bcaf667ce849c7cc379a453fa179e7e09290eeb25"},
+ {file = "tokenizers-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53975a6694428a0586534cc1354b2408d4e010a3103117f617cbb550299797c"},
+ {file = "tokenizers-0.20.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:07c4b7be58da142b0730cc4e5fd66bb7bf6f57f4986ddda73833cd39efef8a01"},
+ {file = "tokenizers-0.20.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b605c540753e62199bf15cf69c333e934077ef2350262af2ccada46026f83d1c"},
+ {file = "tokenizers-0.20.1-cp38-none-win32.whl", hash = "sha256:88b3bc76ab4db1ab95ead623d49c95205411e26302cf9f74203e762ac7e85685"},
+ {file = "tokenizers-0.20.1-cp38-none-win_amd64.whl", hash = "sha256:d412a74cf5b3f68a90c615611a5aa4478bb303d1c65961d22db45001df68afcb"},
+ {file = "tokenizers-0.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a25dcb2f41a0a6aac31999e6c96a75e9152fa0127af8ece46c2f784f23b8197a"},
+ {file = "tokenizers-0.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a12c3cebb8c92e9c35a23ab10d3852aee522f385c28d0b4fe48c0b7527d59762"},
+ {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02e18da58cf115b7c40de973609c35bde95856012ba42a41ee919c77935af251"},
+ {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f326a1ac51ae909b9760e34671c26cd0dfe15662f447302a9d5bb2d872bab8ab"},
+ {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b4872647ea6f25224e2833b044b0b19084e39400e8ead3cfe751238b0802140"},
+ {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce6238a3311bb8e4c15b12600927d35c267b92a52c881ef5717a900ca14793f7"},
+ {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57b7a8880b208866508b06ce365dc631e7a2472a3faa24daa430d046fb56c885"},
+ {file = "tokenizers-0.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a908c69c2897a68f412aa05ba38bfa87a02980df70f5a72fa8490479308b1f2d"},
+ {file = "tokenizers-0.20.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:da1001aa46f4490099c82e2facc4fbc06a6a32bf7de3918ba798010954b775e0"},
+ {file = "tokenizers-0.20.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c097390e2f0ed0a5c5d569e6669dd4e9fff7b31c6a5ce6e9c66a61687197de"},
+ {file = "tokenizers-0.20.1-cp39-none-win32.whl", hash = "sha256:3d4d218573a3d8b121a1f8c801029d70444ffb6d8f129d4cca1c7b672ee4a24c"},
+ {file = "tokenizers-0.20.1-cp39-none-win_amd64.whl", hash = "sha256:37d1e6f616c84fceefa7c6484a01df05caf1e207669121c66213cb5b2911d653"},
+ {file = "tokenizers-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48689da7a395df41114f516208d6550e3e905e1239cc5ad386686d9358e9cef0"},
+ {file = "tokenizers-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:712f90ea33f9bd2586b4a90d697c26d56d0a22fd3c91104c5858c4b5b6489a79"},
+ {file = "tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:359eceb6a620c965988fc559cebc0a98db26713758ec4df43fb76d41486a8ed5"},
+ {file = "tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d3caf244ce89d24c87545aafc3448be15870096e796c703a0d68547187192e1"},
+ {file = "tokenizers-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03b03cf8b9a32254b1bf8a305fb95c6daf1baae0c1f93b27f2b08c9759f41dee"},
+ {file = "tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:218e5a3561561ea0f0ef1559c6d95b825308dbec23fb55b70b92589e7ff2e1e8"},
+ {file = "tokenizers-0.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f40df5e0294a95131cc5f0e0eb91fe86d88837abfbee46b9b3610b09860195a7"},
+ {file = "tokenizers-0.20.1-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:08aaa0d72bb65058e8c4b0455f61b840b156c557e2aca57627056624c3a93976"},
+ {file = "tokenizers-0.20.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:998700177b45f70afeb206ad22c08d9e5f3a80639dae1032bf41e8cbc4dada4b"},
+ {file = "tokenizers-0.20.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62f7fbd3c2c38b179556d879edae442b45f68312019c3a6013e56c3947a4e648"},
+ {file = "tokenizers-0.20.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31e87fca4f6bbf5cc67481b562147fe932f73d5602734de7dd18a8f2eee9c6dd"},
+ {file = "tokenizers-0.20.1-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:956f21d359ae29dd51ca5726d2c9a44ffafa041c623f5aa33749da87cfa809b9"},
+ {file = "tokenizers-0.20.1-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1fbbaf17a393c78d8aedb6a334097c91cb4119a9ced4764ab8cfdc8d254dc9f9"},
+ {file = "tokenizers-0.20.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ebe63e31f9c1a970c53866d814e35ec2ec26fda03097c486f82f3891cee60830"},
+ {file = "tokenizers-0.20.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:81970b80b8ac126910295f8aab2d7ef962009ea39e0d86d304769493f69aaa1e"},
+ {file = "tokenizers-0.20.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130e35e76f9337ed6c31be386e75d4925ea807055acf18ca1a9b0eec03d8fe23"},
+ {file = "tokenizers-0.20.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd28a8614f5c82a54ab2463554e84ad79526c5184cf4573bbac2efbbbcead457"},
+ {file = "tokenizers-0.20.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9041ee665d0fa7f5c4ccf0f81f5e6b7087f797f85b143c094126fc2611fec9d0"},
+ {file = "tokenizers-0.20.1-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:62eb9daea2a2c06bcd8113a5824af8ef8ee7405d3a71123ba4d52c79bb3d9f1a"},
+ {file = "tokenizers-0.20.1-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f861889707b54a9ab1204030b65fd6c22bdd4a95205deec7994dc22a8baa2ea4"},
+ {file = "tokenizers-0.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:89d5c337d74ea6e5e7dc8af124cf177be843bbb9ca6e58c01f75ea103c12c8a9"},
+ {file = "tokenizers-0.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0b7f515c83397e73292accdbbbedc62264e070bae9682f06061e2ddce67cacaf"},
+ {file = "tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e0305fc1ec6b1e5052d30d9c1d5c807081a7bd0cae46a33d03117082e91908c"},
+ {file = "tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dc611e6ac0fa00a41de19c3bf6391a05ea201d2d22b757d63f5491ec0e67faa"},
+ {file = "tokenizers-0.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5ffe0d7f7bfcfa3b2585776ecf11da2e01c317027c8573c78ebcb8985279e23"},
+ {file = "tokenizers-0.20.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:e7edb8ec12c100d5458d15b1e47c0eb30ad606a05641f19af7563bc3d1608c14"},
+ {file = "tokenizers-0.20.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:de291633fb9303555793cc544d4a86e858da529b7d0b752bcaf721ae1d74b2c9"},
+ {file = "tokenizers-0.20.1.tar.gz", hash = "sha256:84edcc7cdeeee45ceedb65d518fffb77aec69311c9c8e30f77ad84da3025f002"},
]
[package.dependencies]
@@ -3115,13 +3125,13 @@ telegram = ["requests"]
[[package]]
name = "transformers"
-version = "4.44.2"
+version = "4.45.2"
description = "State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow"
optional = false
python-versions = ">=3.8.0"
files = [
- {file = "transformers-4.44.2-py3-none-any.whl", hash = "sha256:1c02c65e7bfa5e52a634aff3da52138b583fc6f263c1f28d547dc144ba3d412d"},
- {file = "transformers-4.44.2.tar.gz", hash = "sha256:36aa17cc92ee154058e426d951684a2dab48751b35b49437896f898931270826"},
+ {file = "transformers-4.45.2-py3-none-any.whl", hash = "sha256:c551b33660cfc815bae1f9f097ecfd1e65be623f13c6ee0dda372bd881460210"},
+ {file = "transformers-4.45.2.tar.gz", hash = "sha256:72bc390f6b203892561f05f86bbfaa0e234aab8e927a83e62b9d92ea7e3ae101"},
]
[package.dependencies]
@@ -3135,21 +3145,21 @@ regex = "!=2019.12.17"
requests = "*"
safetensors = ">=0.4.1"
sentencepiece = {version = ">=0.1.91,<0.1.92 || >0.1.92", optional = true, markers = "extra == \"sentencepiece\""}
-tokenizers = ">=0.19,<0.20"
+tokenizers = ">=0.20,<0.21"
tqdm = ">=4.27"
[package.extras]
-accelerate = ["accelerate (>=0.21.0)"]
-agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"]
-all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision"]
+accelerate = ["accelerate (>=0.26.0)"]
+agents = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "datasets (!=2.5.0)", "diffusers", "opencv-python", "sentencepiece (>=0.1.91,!=0.1.92)", "torch"]
+all = ["Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "codecarbon (==1.2.0)", "decord (==0.6.0)", "flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "phonemizer", "protobuf", "pyctcdecode (>=0.4.0)", "ray[tune] (>=2.7.0)", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision"]
audio = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
-benchmark = ["optimum-benchmark (>=0.2.0)"]
+benchmark = ["optimum-benchmark (>=0.3.0)"]
codecarbon = ["codecarbon (==1.2.0)"]
-deepspeed = ["accelerate (>=0.21.0)", "deepspeed (>=0.9.3)"]
-deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.21.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
-dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
-dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "librosa", "nltk", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.19,<0.20)", "urllib3 (<2.0.0)"]
-dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.21.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "librosa", "nltk", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.19,<0.20)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
+deepspeed = ["accelerate (>=0.26.0)", "deepspeed (>=0.9.3)"]
+deepspeed-testing = ["GitPython (<3.1.19)", "accelerate (>=0.26.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "deepspeed (>=0.9.3)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "optuna", "parameterized", "protobuf", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
+dev = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "av (==9.2.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "decord (==0.6.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "flax (>=0.4.1,<=0.7.0)", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "optax (>=0.0.8,<=0.1.4)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "scipy (<1.13.0)", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
+dev-tensorflow = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "isort (>=5.5.4)", "kenlm", "keras-nlp (>=0.3.1,<0.14.0)", "libcst", "librosa", "nltk (<=3.8.1)", "onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx", "timeout-decorator", "tokenizers (>=0.20,<0.21)", "urllib3 (<2.0.0)"]
+dev-torch = ["GitPython (<3.1.19)", "Pillow (>=10.0.1,<=15.0)", "accelerate (>=0.26.0)", "beautifulsoup4", "codecarbon (==1.2.0)", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "fugashi (>=1.0)", "ipadic (>=1.0.0,<2.0)", "isort (>=5.5.4)", "kenlm", "libcst", "librosa", "nltk (<=3.8.1)", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "optuna", "parameterized", "phonemizer", "protobuf", "psutil", "pyctcdecode (>=0.4.0)", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "ray[tune] (>=2.7.0)", "rhoknp (>=1.1.0,<1.3.1)", "rich", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "scikit-learn", "sentencepiece (>=0.1.91,!=0.1.92)", "sigopt", "sudachidict-core (>=20220729)", "sudachipy (>=0.6.6)", "tensorboard", "timeout-decorator", "timm (<=0.9.16)", "tokenizers (>=0.20,<0.21)", "torch", "torchaudio", "torchvision", "unidic (>=1.0.2)", "unidic-lite (>=1.0.7)", "urllib3 (<2.0.0)"]
flax = ["flax (>=0.4.1,<=0.7.0)", "jax (>=0.4.1,<=0.4.13)", "jaxlib (>=0.4.1,<=0.4.13)", "optax (>=0.0.8,<=0.1.4)", "scipy (<1.13.0)"]
flax-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
ftfy = ["ftfy"]
@@ -3160,7 +3170,7 @@ natten = ["natten (>=0.14.6,<0.15.0)"]
onnx = ["onnxconverter-common", "onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)", "tf2onnx"]
onnxruntime = ["onnxruntime (>=1.4.0)", "onnxruntime-tools (>=1.4.2)"]
optuna = ["optuna"]
-quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "ruff (==0.5.1)", "urllib3 (<2.0.0)"]
+quality = ["GitPython (<3.1.19)", "datasets (!=2.5.0)", "isort (>=5.5.4)", "libcst", "rich", "ruff (==0.5.1)", "urllib3 (<2.0.0)"]
ray = ["ray[tune] (>=2.7.0)"]
retrieval = ["datasets (!=2.5.0)", "faiss-cpu"]
ruff = ["ruff (==0.5.1)"]
@@ -3170,16 +3180,17 @@ serving = ["fastapi", "pydantic", "starlette", "uvicorn"]
sigopt = ["sigopt"]
sklearn = ["scikit-learn"]
speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"]
-testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
+testing = ["GitPython (<3.1.19)", "beautifulsoup4", "cookiecutter (==1.7.3)", "datasets (!=2.5.0)", "dill (<0.3.5)", "evaluate (>=0.2.0)", "faiss-cpu", "nltk (<=3.8.1)", "parameterized", "psutil", "pydantic", "pytest (>=7.2.0,<8.0.0)", "pytest-rich", "pytest-timeout", "pytest-xdist", "rjieba", "rouge-score (!=0.0.7,!=0.0.8,!=0.1,!=0.1.1)", "ruff (==0.5.1)", "sacrebleu (>=1.4.12,<2.0.0)", "sacremoses", "sentencepiece (>=0.1.91,!=0.1.92)", "tensorboard", "timeout-decorator"]
tf = ["keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow (>2.9,<2.16)", "tensorflow-text (<2.16)", "tf2onnx"]
tf-cpu = ["keras (>2.9,<2.16)", "keras-nlp (>=0.3.1,<0.14.0)", "onnxconverter-common", "tensorflow-cpu (>2.9,<2.16)", "tensorflow-probability (<0.24)", "tensorflow-text (<2.16)", "tf2onnx"]
tf-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)"]
+tiktoken = ["blobfile", "tiktoken"]
timm = ["timm (<=0.9.16)"]
-tokenizers = ["tokenizers (>=0.19,<0.20)"]
-torch = ["accelerate (>=0.21.0)", "torch"]
+tokenizers = ["tokenizers (>=0.20,<0.21)"]
+torch = ["accelerate (>=0.26.0)", "torch"]
torch-speech = ["kenlm", "librosa", "phonemizer", "pyctcdecode (>=0.4.0)", "torchaudio"]
torch-vision = ["Pillow (>=10.0.1,<=15.0)", "torchvision"]
-torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.19,<0.20)", "torch", "tqdm (>=4.27)"]
+torchhub = ["filelock", "huggingface-hub (>=0.23.2,<1.0)", "importlib-metadata", "numpy (>=1.17)", "packaging (>=20.0)", "protobuf", "regex (!=2019.12.17)", "requests", "sentencepiece (>=0.1.91,!=0.1.92)", "tokenizers (>=0.20,<0.21)", "torch", "tqdm (>=4.27)"]
video = ["av (==9.2.0)", "decord (==0.6.0)"]
vision = ["Pillow (>=10.0.1,<=15.0)"]
@@ -3521,4 +3532,4 @@ propcache = ">=0.2.0"
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
-content-hash = "11509af5007ffed46d1a84a53de8fb2f816eca24247064b2d85560e80d5eaf24"
+content-hash = "35ffc7511fb162b24cc24f3d2884128b8e34b68c42811eba4f878479d98b55b7"
diff --git a/arch/tools/pyproject.toml b/arch/tools/pyproject.toml
index 936ff85f..e662ad4f 100644
--- a/arch/tools/pyproject.toml
+++ b/arch/tools/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "archgw"
-version = "0.0.1"
+version = "0.0.3"
description = "Python-based CLI tool to manage Arch Gateway."
authors = ["Katanemo Labs, Inc."]
packages = [
@@ -22,7 +22,8 @@ click = "^8.1.7"
jinja2 = "^3.1.4"
jsonschema = "^4.23.0"
setuptools = "75.1.0"
-archgw_modelserver= "0.0.2"
+archgw_modelserver= "0.0.3"
+huggingface_hub = "^0.25.2"
[tool.poetry.scripts]
archgw = "cli.main:main"
diff --git a/demos/function_calling/arch_config.yaml b/demos/function_calling/arch_config.yaml
index f409d753..a2c92883 100644
--- a/demos/function_calling/arch_config.yaml
+++ b/demos/function_calling/arch_config.yaml
@@ -16,10 +16,10 @@ overrides:
prompt_target_intent_matching_threshold: 0.6
llm_providers:
- - name: gpt-4o
+ - name: gpt
access_key: OPENAI_API_KEY
provider: openai
- model: gpt-4o
+ model: gpt-3.5-turbo
default: true
system_prompt: |
diff --git a/demos/network_agent/arch_config.yaml b/demos/network_agent/arch_config.yaml
index 81195488..63ada88e 100644
--- a/demos/network_agent/arch_config.yaml
+++ b/demos/network_agent/arch_config.yaml
@@ -9,7 +9,7 @@ llm_providers:
- name: OpenAI
provider: openai
access_key: OPENAI_API_KEY
- model: gpt-4o
+ model: gpt-3.5-turbo
default: true
# default system prompt used by all prompt targets
diff --git a/docs/source/build_with_arch/includes/agent/function-calling-agent.yaml b/docs/source/build_with_arch/includes/agent/function-calling-agent.yaml
index 6d4c0409..50264c1b 100644
--- a/docs/source/build_with_arch/includes/agent/function-calling-agent.yaml
+++ b/docs/source/build_with_arch/includes/agent/function-calling-agent.yaml
@@ -9,7 +9,7 @@ llm_providers:
- name: OpenAI
provider: openai
access_key: OPENAI_API_KEY
- model: gpt-4o
+ model: gpt-3.5-turbo
default: true
# default system prompt used by all prompt targets
diff --git a/model_server/app/__init__.py b/model_server/app/__init__.py
index c3c8e9f6..e69de29b 100644
--- a/model_server/app/__init__.py
+++ b/model_server/app/__init__.py
@@ -1,107 +0,0 @@
-import sys
-import os
-import time
-import requests
-import psutil
-import tempfile
-import subprocess
-
-
-# Path to the file where the server process ID will be stored
-PID_FILE = os.path.join(tempfile.gettempdir(), "model_server.pid")
-
-
-def run_server():
- """Start, stop, or restart the Uvicorn server based on command-line arguments."""
- if len(sys.argv) > 1:
- action = sys.argv[1]
- else:
- action = "start"
-
- if action == "start":
- start_server()
- elif action == "stop":
- stop_server()
- elif action == "restart":
- restart_server()
- else:
- print(f"Unknown action: {action}")
- sys.exit(1)
-
-
-def start_server():
- """Start the Uvicorn server and save the process ID."""
- if os.path.exists(PID_FILE):
- print("Server is already running. Use 'model_server restart' to restart it.")
- sys.exit(1)
-
- print(
- "Starting Archgw Model Server - Loading some awesomeness, this may take a little time.)"
- )
- process = subprocess.Popen(
- ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "51000"],
- start_new_session=True,
- stdout=subprocess.DEVNULL, # Suppress standard output. There is a logger that model_server prints to
- stderr=subprocess.DEVNULL, # Suppress standard error. There is a logger that model_server prints to
- )
-
- if wait_for_health_check("http://0.0.0.0:51000/healthz"):
- # Write the process ID to the PID file
- with open(PID_FILE, "w") as f:
- f.write(str(process.pid))
- print(f"Archgw Model Server started with PID {process.pid}")
- else:
- # Add model_server boot-up logs
- print("Archgw Model Server - Didn't Sart In Time. Shutting Down")
- process.terminate()
-
-
-def wait_for_health_check(url, timeout=180):
- """Wait for the Uvicorn server to respond to health-check requests."""
- start_time = time.time()
- while time.time() - start_time < timeout:
- try:
- response = requests.get(url)
- if response.status_code == 200:
- return True
- except requests.ConnectionError:
- time.sleep(1)
- print("Timed out waiting for Archgw Model Server to respond.")
- return False
-
-
-def stop_server():
- """Stop the running Uvicorn server."""
- if not os.path.exists(PID_FILE):
- print("Status: Archgw Model Server not running")
- return
-
- # Read the process ID from the PID file
- with open(PID_FILE, "r") as f:
- pid = int(f.read())
-
- try:
- # Get process by PID
- process = psutil.Process(pid)
-
- # Gracefully terminate the process
- process.terminate() # Sends SIGTERM by default
- process.wait(timeout=10) # Wait for up to 10 seconds for the process to exit
-
- print(f"Server with PID {pid} stopped.")
- os.remove(PID_FILE)
-
- except psutil.NoSuchProcess:
- print(f"Process with PID {pid} not found. Cleaning up PID file.")
- os.remove(PID_FILE)
- except psutil.TimeoutExpired:
- print(f"Process with PID {pid} did not terminate in time. Forcing shutdown.")
- process.kill() # Forcefully kill the process
- os.remove(PID_FILE)
-
-
-def restart_server():
- """Restart the Uvicorn server."""
- print("Check: Is Archgw Model Server running?")
- stop_server()
- start_server()
diff --git a/model_server/app/cli.py b/model_server/app/cli.py
new file mode 100644
index 00000000..d803e855
--- /dev/null
+++ b/model_server/app/cli.py
@@ -0,0 +1,119 @@
+import sys
+import os
+import time
+import requests
+import psutil
+import tempfile
+import subprocess
+import logging
+
+logging.basicConfig(
+ level=logging.INFO,
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
+)
+
+log = logging.getLogger("model_server.cli")
+log.setLevel(logging.INFO)
+
+# Path to the file where the server process ID will be stored
+PID_FILE = os.path.join(tempfile.gettempdir(), "model_server.pid")
+
+
+def run_server():
+ """Start, stop, or restart the Uvicorn server based on command-line arguments."""
+ if len(sys.argv) > 1:
+ action = sys.argv[1]
+ else:
+ action = "start"
+
+ if action == "start":
+ start_server()
+ elif action == "stop":
+ stop_server()
+ elif action == "restart":
+ restart_server()
+ else:
+ log.info(f"Unknown action: {action}")
+ sys.exit(1)
+
+
+def start_server():
+ """Start the Uvicorn server and save the process ID."""
+ if os.path.exists(PID_FILE):
+ log.info("Server is already running. Use 'model_server restart' to restart it.")
+ sys.exit(1)
+
+ log.info(
+ "Starting model server - loading some awesomeness, this may take some time :)"
+ )
+ process = subprocess.Popen(
+ ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "51000"],
+ start_new_session=True,
+ bufsize=1,
+ universal_newlines=True,
+ stdout=subprocess.PIPE, # Suppress standard output. There is a logger that model_server prints to
+ stderr=subprocess.PIPE, # Suppress standard error. There is a logger that model_server prints to
+ )
+
+ if wait_for_health_check("http://0.0.0.0:51000/healthz"):
+ # Write the process ID to the PID file
+ with open(PID_FILE, "w") as f:
+ f.write(str(process.pid))
+ log.info(f"Model server started with PID {process.pid}")
+ else:
+ # Add model_server boot-up logs
+ log.info("Model server - Didn't Sart In Time. Shutting Down")
+ process.terminate()
+
+
+def wait_for_health_check(url, timeout=180):
+ """Wait for the Uvicorn server to respond to health-check requests."""
+ start_time = time.time()
+ while time.time() - start_time < timeout:
+ try:
+ response = requests.get(url)
+ if response.status_code == 200:
+ return True
+ except requests.ConnectionError:
+ time.sleep(1)
+ print("Timed out waiting for model server to respond.")
+ return False
+
+
+def stop_server():
+ """Stop the running Uvicorn server."""
+ log.info("Stopping model server")
+ if not os.path.exists(PID_FILE):
+ log.info("Process id file not found, seems like model server was not running")
+ return
+
+ # Read the process ID from the PID file
+ with open(PID_FILE, "r") as f:
+ pid = int(f.read())
+
+ try:
+ # Get process by PID
+ process = psutil.Process(pid)
+
+ # Gracefully terminate the process
+ process.terminate() # Sends SIGTERM by default
+ process.wait(timeout=10) # Wait for up to 10 seconds for the process to exit
+
+ log.info(f"Model server with PID {pid} stopped.")
+ os.remove(PID_FILE)
+
+ except psutil.NoSuchProcess:
+ log.info(f"Model server with PID {pid} not found. Cleaning up PID file.")
+ os.remove(PID_FILE)
+ except psutil.TimeoutExpired:
+ log.info(
+ f"Model server with PID {pid} did not terminate in time. Forcing shutdown."
+ )
+ process.kill() # Forcefully kill the process
+ os.remove(PID_FILE)
+
+
+def restart_server():
+ """Restart the Uvicorn server."""
+ stop_server()
+ start_server()
diff --git a/model_server/app/commons/constants.py b/model_server/app/commons/constants.py
index 5c92388a..abce6fa9 100644
--- a/model_server/app/commons/constants.py
+++ b/model_server/app/commons/constants.py
@@ -5,6 +5,7 @@ import app.loader as loader
from app.function_calling.model_handler import ArchFunctionHandler
from app.prompt_guard.model_handler import ArchGuardHanlder
+logger = utils.get_model_server_logger()
arch_function_hanlder = ArchFunctionHandler()
arch_function_endpoint = "https://api.fc.archgw.com/v1"
@@ -19,7 +20,6 @@ arch_function_generation_params = {
arch_guard_model_type = {"cpu": "katanemo/Arch-Guard-cpu", "gpu": "katanemo/Arch-Guard"}
-
# Model definition
embedding_model = loader.get_embedding_model()
zero_shot_model = loader.get_zero_shot_model()
diff --git a/model_server/app/loader.py b/model_server/app/loader.py
index 0994bf54..280d0976 100644
--- a/model_server/app/loader.py
+++ b/model_server/app/loader.py
@@ -6,12 +6,15 @@ from optimum.onnxruntime import (
ORTModelForFeatureExtraction,
ORTModelForSequenceClassification,
)
+import app.commons.utilities as utils
+
+logger = utils.get_model_server_logger()
def get_embedding_model(
model_name=os.getenv("MODELS", "katanemo/bge-large-en-v1.5"),
):
- print("Loading Embedding Model...")
+ logger.info("Loading Embedding Model...")
if glb.DEVICE != "cuda":
model = ORTModelForFeatureExtraction.from_pretrained(
@@ -32,7 +35,7 @@ def get_embedding_model(
def get_zero_shot_model(
model_name=os.getenv("ZERO_SHOT_MODELS", "katanemo/bart-large-mnli"),
):
- print("Loading Zero-shot Model...")
+ logger.info("Loading Zero-shot Model...")
if glb.DEVICE != "cuda":
model = ORTModelForSequenceClassification.from_pretrained(
@@ -58,7 +61,7 @@ def get_zero_shot_model(
def get_prompt_guard(model_name, hardware_config="cpu"):
- print("Loading Guard Model...")
+ logger.info("Loading Guard Model...")
if hardware_config == "cpu":
from optimum.intel import OVModelForSequenceClassification
diff --git a/model_server/app/main.py b/model_server/app/main.py
index 82bbeb50..6a90c0b1 100644
--- a/model_server/app/main.py
+++ b/model_server/app/main.py
@@ -4,7 +4,6 @@ import app.commons.utilities as utils
import app.commons.globals as glb
import app.prompt_guard.model_utils as guard_utils
-
from typing import List, Dict
from pydantic import BaseModel
from fastapi import FastAPI, Response, HTTPException
@@ -17,8 +16,7 @@ from app.function_calling.model_utils import (
logger = utils.get_model_server_logger()
-logger.info(f"Devices Avialble: {glb.DEVICE}")
-
+logger.info(f"Ready to serve traffic. available device: {glb.DEVICE}")
app = FastAPI()
diff --git a/model_server/pyproject.toml b/model_server/pyproject.toml
index 6f41bf1b..ad730e96 100644
--- a/model_server/pyproject.toml
+++ b/model_server/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "archgw_modelserver"
-version = "0.0.2"
+version = "0.0.3"
description = "A model server for serving models"
authors = ["Katanemo Labs, Inc "]
license = "Apache 2.0"
@@ -31,7 +31,7 @@ onnx = "1.17.0"
onnxruntime = "1.19.2"
[tool.poetry.scripts]
-archgw_modelserver = "app:run_server"
+archgw_modelserver = "app.cli:run_server"
[build-system]
requires = ["poetry-core>=1.0.0"]
From 50bea9135cee99f92da6425777c3059d8ae21e85 Mon Sep 17 00:00:00 2001
From: Adil Hafeez
Date: Thu, 10 Oct 2024 17:50:57 -0700
Subject: [PATCH 04/10] update broken link
---
demos/function_calling/README.md | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/demos/function_calling/README.md b/demos/function_calling/README.md
index bc2b1ff5..41ac7242 100644
--- a/demos/function_calling/README.md
+++ b/demos/function_calling/README.md
@@ -2,13 +2,15 @@
This demo shows how you can use Arch's core function calling capabilites.
# Starting the demo
-1. Please make sure the [pre-requisites](../../../README.md?tab=readme-ov-file#prerequisites) are installed correctly
+1. Please make sure the [pre-requisites](https://github.com/katanemo/arch/?tab=readme-ov-file#prerequisites) are installed correctly
2. Start Arch
+
+3.
```sh
sh run_demo.sh
```
-3. Navigate to http://localhost:18080/
-4. You can type in queries like "how is the weather?"
+4. Navigate to http://localhost:18080/
+5. You can type in queries like "how is the weather?"
# Observability
Arch gateway publishes stats endpoint at http://localhost:19901/stats. In this demo we are using prometheus to pull stats from arch and we are using grafana to visalize the stats in dashboard. To see grafana dashboard follow instructions below,
From 7b51cce2f7600c9057456a9089995792f5158488 Mon Sep 17 00:00:00 2001
From: Adil Hafeez
Date: Thu, 10 Oct 2024 17:52:33 -0700
Subject: [PATCH 05/10] fix demo broken links
---
.gitignore | 1 +
demos/insurance_agent/README.md | 2 +-
demos/network_agent/README.md | 2 +-
3 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/.gitignore b/.gitignore
index 0fd2e447..08f9462c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,4 @@ model_server/venv_model_server
model_server/build
model_server/dist
arch_logs/
+dist/
diff --git a/demos/insurance_agent/README.md b/demos/insurance_agent/README.md
index 4f3663c5..46067173 100644
--- a/demos/insurance_agent/README.md
+++ b/demos/insurance_agent/README.md
@@ -36,7 +36,7 @@ The system can perform a variety of tasks, such as answering insurance-related q
**Arch** is designed to intelligently routes prompts to the appropriate functions based on the target, allowing for seamless interaction with various insurance-related services.
# Starting the demo
-1. Please make sure the [pre-requisites](../../../README.md?tab=readme-ov-file#prerequisites) are installed correctly
+1. Please make sure the [pre-requisites](https://github.com/katanemo/arch/?tab=readme-ov-file#prerequisites) are installed correctly
2. Start Arch
```sh
sh run_demo.sh
diff --git a/demos/network_agent/README.md b/demos/network_agent/README.md
index 1da2d62e..2b019462 100644
--- a/demos/network_agent/README.md
+++ b/demos/network_agent/README.md
@@ -19,7 +19,7 @@ The assistant can perform several key operations, including rebooting devices, a
# Starting the demo
-1. Please make sure the [pre-requisites](../../../README.md?tab=readme-ov-file#prerequisites) are installed correctly
+1. Please make sure the [pre-requisites](https://github.com/katanemo/arch/?tab=readme-ov-file#prerequisites) are installed correctly
2. Start Arch
```sh
sh run_demo.sh
From 11fba23f1ff1e3a6bbb7723aefc74c453d855e4d Mon Sep 17 00:00:00 2001
From: Shuguang Chen <54548843+nehcgs@users.noreply.github.com>
Date: Thu, 10 Oct 2024 22:30:54 -0700
Subject: [PATCH 06/10] Update doc (#178)
* Update doc
* Update links
---
docs/source/build_with_arch/agent.rst | 10 +-
.../agent/function-calling-agent.yaml | 2 +-
docs/source/build_with_arch/rag.rst | 12 +--
docs/source/concepts/llm_provider.rst | 4 +-
docs/source/concepts/prompt_target.rst | 2 +-
.../concepts/tech_overview/error_target.rst | 2 -
docs/source/concepts/tech_overview/prompt.rst | 51 +++++-----
.../tech_overview/request_lifecycle.rst | 12 +--
.../concepts/tech_overview/terminology.rst | 2 +-
docs/source/get_started/intro_to_arch.rst | 92 +++++++------------
docs/source/get_started/quickstart.rst | 2 +-
docs/source/guides/function_calling.rst | 2 +-
docs/source/guides/prompt_guard.rst | 2 +-
docs/source/index.rst | 5 +
14 files changed, 82 insertions(+), 118 deletions(-)
diff --git a/docs/source/build_with_arch/agent.rst b/docs/source/build_with_arch/agent.rst
index 2e41f5fa..ffced78d 100644
--- a/docs/source/build_with_arch/agent.rst
+++ b/docs/source/build_with_arch/agent.rst
@@ -5,14 +5,14 @@ Agentic Workflow
Arch helps you easily personalize your applications by calling application-specific (API) functions
via user prompts. This involves any predefined functions or APIs you want to expose to users to perform tasks,
-gather information, or manipulate data. This capability is generally referred to as **function calling**, where
+gather information, or manipulate data. This capability is generally referred to as :ref:`function calling `, where
you have the flexibility to support “agentic” apps tailored to specific use cases - from updating insurance
claims to creating ad campaigns - via prompts.
Arch analyzes prompts, extracts critical information from prompts, engages in lightweight conversation with
the user to gather any missing parameters and makes API calls so that you can focus on writing business logic.
-Arch does this via its purpose-built :ref:`Arch-Function ` - the fastest (200ms p90 - 10x faser than GPT-4o)
-and cheapest (100x than GPT-40) function-calling LLM that matches performance with frontier models.
+Arch does this via its purpose-built `Arch-Function `_ - the fastest (200ms p90 - 10x faser than GPT-4o)
+and cheapest (100x than GPT-4o) function calling LLM that matches performance with frontier models.
.. image:: includes/agent/function-calling-flow.jpg
:width: 100%
@@ -31,7 +31,7 @@ Step 1: Define Prompt Targets
.. literalinclude:: includes/agent/function-calling-agent.yaml
:language: yaml
:linenos:
- :emphasize-lines: 21-34
+ :emphasize-lines: 19-49
:caption: Prompt Target Example Configuration
Step 2: Process Request Parameters
@@ -66,5 +66,5 @@ Example of Multiple Prompt Targets in YAML:
.. literalinclude:: includes/agent/function-calling-agent.yaml
:language: yaml
:linenos:
- :emphasize-lines: 21-34
+ :emphasize-lines: 19-49
:caption: Prompt Target Example Configuration
diff --git a/docs/source/build_with_arch/includes/agent/function-calling-agent.yaml b/docs/source/build_with_arch/includes/agent/function-calling-agent.yaml
index 50264c1b..5e31615b 100644
--- a/docs/source/build_with_arch/includes/agent/function-calling-agent.yaml
+++ b/docs/source/build_with_arch/includes/agent/function-calling-agent.yaml
@@ -46,7 +46,7 @@ prompt_targets:
- name: time_range
type: int
description: Time range in days for which to gather device statistics. Defaults to 7.
- default: "7"
+ default: 7
# Arch creates a round-robin load balancing between different endpoints, managed via the cluster subsystem.
endpoints:
diff --git a/docs/source/build_with_arch/rag.rst b/docs/source/build_with_arch/rag.rst
index 3e50d603..9961b133 100644
--- a/docs/source/build_with_arch/rag.rst
+++ b/docs/source/build_with_arch/rag.rst
@@ -9,7 +9,7 @@ Retrieval-Augmented Generation (RAG) applications.
Parameter Extraction for RAG
----------------------------
-To build RAG (Retrieval-Augmented Generation) applications, you can configure prompt targets with parameters,
+To build RAG (Retrieval Augmented Generation) applications, you can configure prompt targets with parameters,
enabling Arch to retrieve critical information in a structured way for processing. This approach improves the
retrieval quality and speed of your application. By extracting parameters from the conversation, you can pull
the appropriate chunks from a vector database or SQL-like data store to enhance accuracy. With Arch, you can
@@ -37,12 +37,12 @@ Once the prompt targets are configured as above, handling those parameters is
-----------------------------------------------------------------------------------------------------------------------------------------
Developers struggle to efficiently handle ``follow-up`` or ``clarification`` questions. Specifically, when users ask for
changes or additions to previous responses their AI applications often generate entirely new responses instead of adjusting
-previous ones.Arch offers **intent** tracking as a feature so that developers can know when the user has shifted away from a
+previous ones. Arch offers ``intent tracking`` as a feature so that developers can know when the user has shifted away from a
previous intent so that they can dramatically improve retrieval accuracy, lower overall token cost and improve the speed of
their responses back to users.
Arch uses its built-in lightweight NLI and embedding models to know if the user has steered away from an active intent.
-Arch's intent-drift detection mechanism is based on its' :ref:`prompt_targets ` primtive. Arch tries to match an incoming
+Arch's intent-drift detection mechanism is based on its :ref:`prompt target ` primtive. Arch tries to match an incoming
prompt to one of the prompt_targets configured in the gateway. Once it detects that the user has moved away from an active
active intent, Arch adds the ``x-arch-intent-marker`` headers to the request before sending it your application servers.
@@ -50,15 +50,15 @@ active intent, Arch adds the ``x-arch-intent-marker`` headers to the request bef
:language: python
:linenos:
:lines: 101-157
- :emphasize-lines: 14-24
+ :emphasize-lines: 14-25
:caption: Intent Detection Example
.. Note::
Arch is (mostly) stateless so that it can scale in an embarrassingly parrallel fashion. So, while Arch offers
- intent-drift detetction, you still have to maintain converational state with intent drift as meta-data. The
- following code snippets show how easily you can build and enrich conversational history with Langchain (in python),
+ intent-drift detetction, you still have to maintain converational state with intent drift as metadata. The
+ following code snippets show how easily you can build and enrich conversational history with Langchain (in Python),
so that you can use the most relevant prompts for your retrieval and for prompting upstream LLMs.
diff --git a/docs/source/concepts/llm_provider.rst b/docs/source/concepts/llm_provider.rst
index 68b4ba61..498ee875 100644
--- a/docs/source/concepts/llm_provider.rst
+++ b/docs/source/concepts/llm_provider.rst
@@ -23,7 +23,7 @@ Below is an example of how you can configure ``llm_providers`` with an instance
.. Note::
When you start Arch, it creates a listener port for egress traffic based on the presence of ``llm_providers``
configuration section in the ``arch_config.yml`` file. Arch binds itself to a local address such as
- ``127.0.0.1:51001/v1``.
+ ``127.0.0.1:12000``.
Arch also offers vendor-agnostic SDKs and libraries to make LLM calls to API-based LLM providers (like OpenAI,
Anthropic, Mistral, Cohere, etc.) and supports calls to OSS LLMs that are hosted on your infrastructure. Arch
@@ -40,7 +40,7 @@ Example: Using the OpenAI Python SDK
from openai import OpenAI
# Initialize the Arch client
- client = OpenAI(base_url="http://127.0.0.1:51001/v1")
+ client = OpenAI(base_url="http://127.0.0.12000/")
# Define your LLM provider and prompt
llm_provider = "openai"
diff --git a/docs/source/concepts/prompt_target.rst b/docs/source/concepts/prompt_target.rst
index 8e0ac1c9..b489b0c1 100644
--- a/docs/source/concepts/prompt_target.rst
+++ b/docs/source/concepts/prompt_target.rst
@@ -80,7 +80,7 @@ Here is a full list of parameter attributes that Arch can support:
Example Configuration
~~~~~~~~~~~~~~~~~~~~~
-.. code-block:: python
+.. code-block:: yaml
prompt_targets:
- name: get_weather
diff --git a/docs/source/concepts/tech_overview/error_target.rst b/docs/source/concepts/tech_overview/error_target.rst
index cce92e57..e901ae5e 100644
--- a/docs/source/concepts/tech_overview/error_target.rst
+++ b/docs/source/concepts/tech_overview/error_target.rst
@@ -16,8 +16,6 @@ Key Concepts
- **Error Message**: A clear, human-readable message describing the error. This should provide enough detail to inform users or developers of the root cause or required action.
-- **Target Prompt**: The specific prompt or operation where the error occurred. Understanding where the error happened helps with debugging and pinpointing the source of the problem.
-
- **Parameter-Specific Errors**: Errors that arise due to invalid or missing parameters when invoking a function. These errors are critical for ensuring the correctness of inputs.
diff --git a/docs/source/concepts/tech_overview/prompt.rst b/docs/source/concepts/tech_overview/prompt.rst
index 5473941c..4cc9e56b 100644
--- a/docs/source/concepts/tech_overview/prompt.rst
+++ b/docs/source/concepts/tech_overview/prompt.rst
@@ -27,7 +27,7 @@ containing two key-value pairs:
Prompt Guard
-----------------
-Arch is engineered with :ref:`Arch-Guard `, an industry leading safety layer, powered by a
+Arch is engineered with `Arch-Guard `_, an industry leading safety layer, powered by a
compact and high-performimg LLM that monitors incoming prompts to detect and reject jailbreak attempts -
ensuring that unauthorized or harmful behaviors are intercepted early in the process.
@@ -50,7 +50,7 @@ Prompt Targets
--------------
Once a prompt passes any configured guardrail checks, Arch processes the contents of the incoming conversation
-and identifies where to forwad the conversation to via its ``prompt_targets`` primitve. Prompt targets are endpoints
+and identifies where to forwad the conversation to via its ``prompt target`` primitve. Prompt targets are endpoints
that receive prompts that are processed by Arch. For example, Arch enriches incoming prompts with metadata like knowing
when a user's intent has changed so that you can build faster, more accurate RAG apps.
@@ -67,48 +67,39 @@ Configuring ``prompt_targets`` is simple. See example below:
Check :ref:`Prompt Target ` for more details!
-Intent Detection and Prompt Matching:
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Intent Matching
+^^^^^^^^^^^^^^^
-Arch uses fast Natural Language Inference (NLI) and embedding approaches to first detect the intent of each
-incoming prompt. This intent detection phase analyzes the prompt's content and matches it against predefined
-prompt targets, ensuring that each prompt is forwarded to the most appropriate endpoint. Arch’s intent
-detection framework considers both the name and description of each prompt target, and uses a composite matching
-score between an NLI and cosine similarity to enchance accuracy in forwarding decisions.
+Arch uses fast text embedding and intent recognition approaches to first detect the intent of each incoming prompt.
+This intent matching phase analyzes the prompt's content and matches it against predefined prompt targets, ensuring that each prompt is forwarded to the most appropriate endpoint.
+Arch’s intent matching framework considers both the name and description of each prompt target, and uses a composite matching score between embedding similarity and intent classification scores to enchance accuracy in forwarding decisions.
-- **Embeddings**: By embedding the prompt and comparing it to known target vectors, Arch effectively identifies
- the closest match, ensuring that the prompt is handled by the correct downstream service.
+- **Intent Recognition**: NLI techniques further refine the matching process by evaluating the semantic alignment between the prompt and potential targets.
-- **NLI**: NLI techniques further refine the matching process by evaluating the semantic alignment between the
- prompt and potential targets.
+- **Text Embedding**: By embedding the prompt and comparing it to known target vectors, Arch effectively identifies the closest match, ensuring that the prompt is handled by the correct downstream service.
Agentic Apps via Prompt Targets
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-To support agentic apps, like scheduling travel plans or sharing comments on a document - via prompts, Arch uses
-its function calling abilities to extract critical information from the incoming prompt (or a set of prompts)
-needed by a downstream backend API or function call before calling it directly. For more details on how you can
-build agentic applications using Arch, see our full guide :ref:`here `:
+To support agentic apps, like scheduling travel plans or sharing comments on a document - via prompts, Arch uses its function calling abilities to extract critical information from the incoming prompt (or a set of prompts) needed by a downstream backend API or function call before calling it directly.
+For more details on how you can build agentic applications using Arch, see our full guide :ref:`here `:
.. Note::
- Arch :ref:`Arch-Function ` is the dedicated agentic model engineered in Arch to extract information from
- a (set of) prompts and executes necessary backend API calls. This allows for efficient handling of agentic tasks,
- such as scheduling data retrieval, by dynamically interacting with backend services. Arch-Function is a flagship 1.3
- billion parameter model that matches performance with frontier models like Claude Sonnet 3.5 ang GPT-4, while
- being 100x cheaper ($0.05M/token hosted) and 10x faster (p50 latencies of 200ms).
+ `Arch-Function `_ is a collection of dedicated agentic models engineered in Arch to extract information from a (set of) prompts and executes necessary backend API calls.
+ This allows for efficient handling of agentic tasks, such as scheduling data retrieval, by dynamically interacting with backend services.
+ Arch-Function achieves state-of-the-art performance, comparable with frontier models like Claude Sonnet 3.5 ang GPT-4, while being 100x cheaper ($0.05M/token hosted) and 10x faster (p50 latencies of 200ms).
Prompting LLMs
--------------
-Arch is a single piece of software that is designed to manage both ingress and egress prompt traffic, drawing its
-distributed proxy nature from the robust `Envoy `_. This makes it extremely efficient and capable
-of handling upstream connections to LLMs. If your application is originating code to an API-based LLM, simply use
-the OpenAI client and configure it with Arch. By sending traffic through Arch, you can propagate traces, manage and monitor
-traffic, apply rate limits, and utilize a large set of traffic management capabilities in a centralized way.
+Arch is a single piece of software that is designed to manage both ingress and egress prompt traffic, drawing its distributed proxy nature from the robust `Envoy `_.
+This makes it extremely efficient and capable of handling upstream connections to LLMs.
+If your application is originating code to an API-based LLM, simply use the OpenAI client and configure it with Arch.
+By sending traffic through Arch, you can propagate traces, manage and monitor traffic, apply rate limits, and utilize a large set of traffic management capabilities in a centralized way.
.. Attention::
When you start Arch, it automatically creates a listener port for egress calls to upstream LLMs. This is based on the
``llm_providers`` configuration section in the ``arch_config.yml`` file. Arch binds itself to a local address such as
- 127.0.0.1:12000/v1.
+ ``127.0.0.1:12000``.
Example: Using OpenAI Client with Arch as an Egress Gateway
@@ -119,7 +110,7 @@ Example: Using OpenAI Client with Arch as an Egress Gateway
import openai
# Set the OpenAI API base URL to the Arch gateway endpoint
- openai.api_base = "http://127.0.0.1:12000/v1"
+ openai.api_base = "http://127.0.0.1:12000"
# No need to set openai.api_key since it's configured in Arch's gateway
@@ -132,5 +123,5 @@ Example: Using OpenAI Client with Arch as an Egress Gateway
print("OpenAI Response:", response.choices[0].text.strip())
In these examples, the OpenAI client is used to send traffic directly through the Arch egress proxy to the LLM of your choice, such as OpenAI.
-The OpenAI client is configured to route traffic via Arch by setting the proxy to ``127.0.0.1:51001``, assuming Arch is running locally and bound to that address and port.
+The OpenAI client is configured to route traffic via Arch by setting the proxy to ``127.0.0.1:12000``, assuming Arch is running locally and bound to that address and port.
This setup allows you to take advantage of Arch's advanced traffic management features while interacting with LLM APIs like OpenAI.
diff --git a/docs/source/concepts/tech_overview/request_lifecycle.rst b/docs/source/concepts/tech_overview/request_lifecycle.rst
index dd6084ee..dd3bcc8f 100644
--- a/docs/source/concepts/tech_overview/request_lifecycle.rst
+++ b/docs/source/concepts/tech_overview/request_lifecycle.rst
@@ -87,8 +87,6 @@ Today, only support a static bootstrap configuration file for simplicity today:
Request Flow (Ingress)
----------------------
-Overview
-^^^^^^^^
A brief outline of the lifecycle of a request and response using the example configuration above:
1. **TCP Connection Establishment**:
@@ -105,7 +103,7 @@ A brief outline of the lifecycle of a request and response using the example con
intent matching via is **prompt-handler** subsystem using the name and description of the defined prompt targets,
determining which endpoint should handle the prompt.
-4. **Parameter Gathering with Arch-FC**:
+4. **Parameter Gathering with Arch-Function**:
If a prompt target requires specific parameters, Arch engages Arch-FC to extract the necessary details
from the incoming prompt(s). This process gathers the critical information needed for downstream API calls.
@@ -115,7 +113,7 @@ A brief outline of the lifecycle of a request and response using the example con
6. **Default Summarization by Upstream LLM**:
By default, if no specific endpoint processing is needed, the prompt is sent to an upstream LLM for summarization.
- This ensures that responses are concise and relevant, enhancing user experience in RAG (Retrieval-Augmented Generation)
+ This ensures that responses are concise and relevant, enhancing user experience in RAG (Retrieval Augmented Generation)
and agentic applications.
7. **Error Handling and Forwarding**:
@@ -134,11 +132,7 @@ A brief outline of the lifecycle of a request and response using the example con
Request Flow (Egress)
---------------------
-Overview
---------
-
-A brief outline of the lifecycle of a request and response in the context of egress traffic from an application
-to Large Language Models (LLMs) via Arch:
+A brief outline of the lifecycle of a request and response in the context of egress traffic from an application to Large Language Models (LLMs) via Arch:
1. **HTTP Connection Establishment to LLM**:
Arch initiates an HTTP connection to the upstream LLM service. This connection is handled by Arch’s egress listener
diff --git a/docs/source/concepts/tech_overview/terminology.rst b/docs/source/concepts/tech_overview/terminology.rst
index eb461b95..2f1c9c6d 100644
--- a/docs/source/concepts/tech_overview/terminology.rst
+++ b/docs/source/concepts/tech_overview/terminology.rst
@@ -29,7 +29,7 @@ networking operations (auth, tls, observability, etc) and the second process to
decisions on how to accept, handle and forward prompts. The second process is optional, as the model serving sevice could be
hosted on a different network (an API call). But these two processes are considered a single instance of Arch.
-**Prompt Target**: Arch offers a primitive called :ref:`prompt_target ` to help separate business logic from undifferentiated
+**Prompt Target**: Arch offers a primitive called :ref:`prompt target ` to help separate business logic from undifferentiated
work in building generative AI apps. Prompt targets are endpoints that receive prompts that are processed by Arch.
For example, Arch enriches incoming prompts with metadata like knowing when a request is a follow-up or clarifying prompt
so that you can build faster, more accurate retrieval (RAG) apps. To support agentic apps, like scheduling travel plans or
diff --git a/docs/source/get_started/intro_to_arch.rst b/docs/source/get_started/intro_to_arch.rst
index 63931b84..7f61b4f9 100644
--- a/docs/source/get_started/intro_to_arch.rst
+++ b/docs/source/get_started/intro_to_arch.rst
@@ -3,13 +3,8 @@
Intro to Arch
=============
-Arch is an intelligent `(Layer 7) `_ gateway
-designed for generative AI apps, AI agents, and Co-pilots that work with prompts. Engineered with purpose-built
-large language models (LLMs), Arch handles all the critical but undifferentiated tasks related to the handling and
-processing of prompts, including detecting and rejecting `jailbreak `_
-attempts, intelligently calling “backend” APIs to fulfill the user's request represented in a prompt, routing to
-and offering disaster recovery between upstream LLMs, and managing the observability of prompts and LLM interactions
-in a centralized way.
+Arch is an intelligent `(Layer 7) `_ gateway designed for generative AI apps, AI agents, and AI copilots that work with prompts.
+Engineered with purpose-built large language models (LLMs), Arch handles all the critical but undifferentiated tasks related to the handling and processing of prompts, including detecting and rejecting jailbreak attempts, intelligently calling “backend” APIs to fulfill the user's request represented in a prompt, routing to and offering disaster recovery between upstream LLMs, and managing the observability of prompts and LLM interactions in a centralized way.
.. image:: /_static/img/arch-logo.png
:width: 100%
@@ -21,70 +16,51 @@ in a centralized way.
including secure handling, intelligent routing, robust observability, and integration with backend (API)
systems for personalization - all outside business logic.*
+In practice, achieving the above goal is incredibly difficult.
+Arch attempts to do so by providing the following high level features:
-In practice, achieving the above goal is incredibly difficult. Arch attempts to do so by providing the
-following high level features:
+**Out-of-process architecture, built on** `Envoy `_:
+Arch is takes a dependency on Envoy and is a self-contained process that is designed to run alongside your application servers.
+Arch uses Envoy's HTTP connection management subsystem, HTTP L7 filtering and telemetry capabilities to extend the functionality exclusively for prompts and LLMs.
+This gives Arch several advantages:
-_____________________________________________________________________________________________________________
+* Arch builds on Envoy's proven success. Envoy is used at masssive sacle by the leading technology companies of our time including `AirBnB `_, `Dropbox `_, `Google `_, `Reddit `_, `Stripe `_, etc. Its battle tested and scales linearly with usage and enables developers to focus on what really matters: application features and business logic.
-**Out-of-process architecture, built on** `Envoy `_: Arch is takes a dependency on
-Envoy and is a self-contained process that is designed to run alongside your application servers. Arch uses
-Envoy's HTTP connection management subsystem, HTTP L7 filtering and telemetry capabilities to extend the
-functionality exclusively for prompts and LLMs. This gives Arch several advantages:
+* Arch works with any application language. A single Arch deployment can act as gateway for AI applications written in Python, Java, C++, Go, Php, etc.
-* Arch builds on Envoy's proven success. Envoy is used at masssive sacle by the leading technology companies of
- our time including `AirBnB `_, `Dropbox `_,
- `Google `_, `Reddit `_, `Stripe `_,
- etc. Its battle tested and scales linearly with usage and enables developers to focus on what really matters:
- application features and business logic.
+* Arch can be deployed and upgraded quickly across your infrastructure transparently without the horrid pain of deploying library upgrades in your applications.
-* Arch works with any application language. A single Arch deployment can act as gateway for AI applications
- written in Python, Java, C++, Go, Php, etc.
+**Engineered with Fast LLMs:** Arch is engineered with specialized tiny LLMs that are desgined for fast, cost-effective and acurrate handling of prompts.
+These LLMs are designed to be best-in-class for critcal prompt-related tasks like:
-* Arch can be deployed and upgraded quickly across your infrastructure transparently without the horrid pain
- of deploying library upgrades in your applications.
+* **Function Calling:** Arch helps you easily personalize your applications by enabling calls to application-specific (API) operations via user prompts.
+ This involves any predefined functions or APIs you want to expose to users to perform tasks, gather information, or manipulate data.
+ With function calling, you have flexibility to support "agentic" experiences tailored to specific use cases - from updating insurance claims to creating ad campaigns - via prompts.
+ Arch analyzes prompts, extracts critical information from prompts, engages in lightweight conversation to gather any missing parameters and makes API calls so that you can focus on writing business logic.
+ For more details, read :ref:`Function Calling `.
-**Engineered with Fast LLMs:** Arch is engineered with specialized (sub-billion) LLMs that are desgined for
-fast, cost-effective and acurrate handling of prompts. These LLMs are designed to be
-best-in-class for critcal prompt-related tasks like:
+* **Prompt Guard:** Arch helps you improve the safety of your application by applying prompt guardrails in a centralized way for better governance hygiene.
+ With prompt guardrails you can prevent ``jailbreak attempts`` present in user's prompts without having to write a single line of code.
+ To learn more about how to configure guardrails available in Arch, read :ref:`Prompt Guard `.
-* **Function/API Calling:** Arch helps you easily personalize your applications by enabling calls to
- application-specific (API) operations via user prompts. This involves any predefined functions or APIs
- you want to expose to users to perform tasks, gather information, or manipulate data. With function calling,
- you have flexibility to support "agentic" experiences tailored to specific use cases - from updating insurance
- claims to creating ad campaigns - via prompts. Arch analyzes prompts, extracts critical information from
- prompts, engages in lightweight conversation to gather any missing parameters and makes API calls so that you can
- focus on writing business logic. For more details, read :ref:`prompt processing `.
+* **[Coming Soon] Intent-Markers:** Developers struggle to handle ``follow-up`` or ``clarifying`` questions.
+ Specifically, when users ask for modifications or additions to previous responses their AI applications often generate entirely new responses instead of adjusting the previous ones.
+ Arch offers intent-markers as a feature so that developers know when the user has shifted away from the previous intent so that they can improve their retrieval, lower overall token cost and dramatically improve the speed and accuracy of their responses back to users.
+ For more details :ref:`intent markers `.
-* **Prompt Guardrails:** Arch helps you improve the safety of your application by applying prompt guardrails in
- a centralized way for better governance hygiene. With prompt guardrails you can prevent `jailbreak `_
- attempts or toxicity present in user's prompts without having to write a single line of code. To learn more
- about how to configure guardrails available in Arch, read :ref:`prompt processing `.
+**Traffic Management:** Arch offers several capabilities for LLM calls originating from your applications, including smart retries on errors from upstream LLMs, and automatic cutover to other LLMs configured in Arch for continuous availability and disaster recovery scenarios.
+Arch extends Envoy's `cluster subsystem `_ to manage upstream connections to LLMs so that you can build resilient AI applications.
-* **[Coming Soon] Intent-Markers:** Developers struggle to handle `follow-up `_,
- or `clarifying `_
- questions. Specifically, when users ask for modifications or additions to previous responses their AI applications
- often generate entirely new responses instead of adjusting the previous ones. Arch offers intent-markers as a
- feature so that developers know when the user has shifted away from the previous intent so that they can improve
- their retrieval, lower overall token cost and dramatically improve the speed and accuracy of their responses back
- to users. For more details :ref:`intent markers`
-
-**Traffic Management:** Arch offers several capabilities for LLM calls originating from your applications, including smart
-retries on errors from upstream LLMs, and automatic cutover to other LLMs configured in Arch for continuous availability
-and disaster recovery scenarios. Arch extends Envoy's `cluster subsystem `_
-to manage upstream connections to LLMs so that you can build resilient AI applications.
-
-**Front/edge Gateway:** There is substantial benefit in using the same software at the edge (observability,
-traffic shaping alogirithms, applying guardrails, etc.) as for outbound LLM inference use cases. Arch has the feature set
-that makes it exceptionally well suited as an edge gateway for AI applications. This includes TLS termination, applying
-guardrail early in the pricess, intelligent parameter gathering from prompts, and prompt-based routing to backend APIs.
+**Front/edge Gateway:** There is substantial benefit in using the same software at the edge (observability, traffic shaping alogirithms, applying guardrails, etc.) as for outbound LLM inference use cases.
+Arch has the feature set that makes it exceptionally well suited as an edge gateway for AI applications.
+This includes TLS termination, applying guardrail early in the pricess, intelligent parameter gathering from prompts, and prompt-based routing to backend APIs.
**Best-In Class Monitoring:** Arch offers several monitoring metrics that help you understand three critical aspects of
your application: latency, token usage, and error rates by an upstream LLM provider. Latency measures the speed at which
your application is responding to users, which includes metrics like time to first token (TFT), time per output token (TOT)
metrics, and the total latency as perceived by users.
-**End-to-End Tracing:** Arch propagates trace context using the W3C Trace Context standard, specifically through the
-``traceparent`` header. This allows each component in the system to record its part of the request flow, enabling **end-to-end tracing**
-across the entire application. By using OpenTelemetry, Arch ensures that developers can capture this trace data consistently and
-in a format compatible with various observability tools. For more details, read :ref:`tracing `.
+**End-to-End Tracing:** Arch propagates trace context using the W3C Trace Context standard, specifically through the ``traceparent`` header.
+This allows each component in the system to record its part of the request flow, enabling end-to-end tracing across the entire application.
+By using OpenTelemetry, Arch ensures that developers can capture this trace data consistently and in a format compatible with various observability tools.
+For more details, read :ref:`Tracing `.
diff --git a/docs/source/get_started/quickstart.rst b/docs/source/get_started/quickstart.rst
index 23a76379..1d6ff635 100644
--- a/docs/source/get_started/quickstart.rst
+++ b/docs/source/get_started/quickstart.rst
@@ -16,7 +16,7 @@ Before you begin, ensure you have the following:
- ``Docker`` & ``Python`` installed on your system
- ``API Keys`` for LLM providers (if using external LLMs)
-The fastest way to get started using Arch is to use `katanemo/arch `_ pre-built binaries.
+The fastest way to get started using Arch is to use `katanemo/archgw `_ pre-built binaries.
You can also build it from source.
diff --git a/docs/source/guides/function_calling.rst b/docs/source/guides/function_calling.rst
index 907326a0..cb09bc6b 100644
--- a/docs/source/guides/function_calling.rst
+++ b/docs/source/guides/function_calling.rst
@@ -35,7 +35,7 @@ Function Calling Workflow
Arch-Function
-------------------------
-The `Arch-Function `_ collection of large language models (LLMs) is a collection state-of-the-art (SOTA) LLMs specifically designed for **function calling** tasks.
+The `Arch-Function `_ collection of large language models (LLMs) is a collection state-of-the-art (SOTA) LLMs specifically designed for **function calling** tasks.
The models are designed to understand complex function signatures, identify required parameters, and produce accurate function call outputs based on natural language prompts.
Achieving performance on par with GPT-4, these models set a new benchmark in the domain of function-oriented tasks, making them suitable for scenarios where automated API interaction and function execution is crucial.
diff --git a/docs/source/guides/prompt_guard.rst b/docs/source/guides/prompt_guard.rst
index e6e2beaf..2f9bbd01 100644
--- a/docs/source/guides/prompt_guard.rst
+++ b/docs/source/guides/prompt_guard.rst
@@ -39,7 +39,7 @@ Arch-Guard is designed to address this challenge.
What Is Arch-Guard
~~~~~~~~~~~~~~~~~~
-`Arch-Guard `_ is a robust classifier model specifically trained on a diverse corpus of prompt attacks.
+`Arch-Guard `_ is a robust classifier model specifically trained on a diverse corpus of prompt attacks.
It excels at detecting explicitly malicious prompts, providing an essential layer of security for LLM applications.
By embedding Arch-Guard within the Arch architecture, we empower developers to build robust, LLM-powered applications while prioritizing security and safety. With Arch-Guard, you can navigate the complexities of prompt management with confidence, knowing you have a reliable defense against malicious input.
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 1079b99e..bda66032 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -23,6 +23,7 @@ Arch (built by the contributors of `Envoy `_ ) was b
.. toctree::
:caption: Get Started
:titlesonly:
+ :maxdepth: 2
get_started/overview
get_started/intro_to_arch
@@ -33,6 +34,7 @@ Arch (built by the contributors of `Envoy `_ ) was b
.. toctree::
:caption: Concepts
:titlesonly:
+ :maxdepth: 2
concepts/tech_overview/tech_overview
concepts/llm_provider
@@ -43,6 +45,7 @@ Arch (built by the contributors of `Envoy `_ ) was b
.. toctree::
:caption: Guides
:titlesonly:
+ :maxdepth: 2
guides/prompt_guard
guides/function_calling
@@ -53,6 +56,7 @@ Arch (built by the contributors of `Envoy `_ ) was b
.. toctree::
:caption: Build with Arch
:titlesonly:
+ :maxdepth: 2
build_with_arch/agent
build_with_arch/rag
@@ -62,5 +66,6 @@ Arch (built by the contributors of `Envoy `_ ) was b
.. toctree::
:caption: Resources
:titlesonly:
+ :maxdepth: 2
resources/configuration_reference
From f72588c6dadb870df0500063f9e0c515199e6b9b Mon Sep 17 00:00:00 2001
From: Adil Hafeez
Date: Thu, 10 Oct 2024 23:34:21 -0700
Subject: [PATCH 07/10] fix lint
---
demos/function_calling/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/demos/function_calling/README.md b/demos/function_calling/README.md
index 41ac7242..5334d4a5 100644
--- a/demos/function_calling/README.md
+++ b/demos/function_calling/README.md
@@ -5,7 +5,7 @@ This demo shows how you can use Arch's core function calling capabilites.
1. Please make sure the [pre-requisites](https://github.com/katanemo/arch/?tab=readme-ov-file#prerequisites) are installed correctly
2. Start Arch
-3.
+3.
```sh
sh run_demo.sh
```
From 5e22c24f7708001afa5d4d3e35b208296916bff6 Mon Sep 17 00:00:00 2001
From: Salman Paracha
Date: Sat, 12 Oct 2024 18:02:03 -0700
Subject: [PATCH 08/10] minor changes to the README to highlight what Arch is
designed to do in a single line (#182)
Co-authored-by: Salman Paracha
---
README.md | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/README.md b/README.md
index 25685f18..f5447c81 100644
--- a/README.md
+++ b/README.md
@@ -4,14 +4,16 @@
## Build fast, robust, and personalized GenAI apps (agents, assistants, etc.)
-Arch is an intelligent [Layer 7](https://www.cloudflare.com/learning/ddos/what-is-layer-7/) gateway designed for generative AI apps, AI agents, and co-pilots that work with prompts. Engineered with purpose-built LLMs, Arch handles the critical but undifferentiated tasks related to the handling and processing of prompts, including detecting and rejecting [jailbreak](https://github.com/verazuo/jailbreak_llms) attempts, intelligently calling "backend" APIs to fulfill the user's request represented in a prompt, routing to and offering disaster recovery between upstream LLMs, and managing the observability of prompts and LLM interactions in a centralized way.
+Arch is an intelligent [Layer 7](https://www.cloudflare.com/learning/ddos/what-is-layer-7/) gateway designed to protect, observe, and personalize LLM apps with your APIs.
+
+Engineered with purpose-built LLMs, Arch handles the critical but undifferentiated tasks related to the handling and processing of prompts, including detecting and rejecting [jailbreak](https://github.com/verazuo/jailbreak_llms) attempts, intelligently calling "backend" APIs to fulfill the user's request represented in a prompt, routing to and offering disaster recovery between upstream LLMs, and managing the observability of prompts and LLM interactions in a centralized way.
Arch is built on (and by the core contributors of) [Envoy Proxy](https://www.envoyproxy.io/) with the belief that:
>Prompts are nuanced and opaque user requests, which require the same capabilities as traditional HTTP requests including secure handling, intelligent routing, robust observability, and integration with backend (API) systems for personalization – all outside business logic.*
**Core Features**:
- - Built on [Envoy](https://envoyproxy.io): Arch runs alongside application servers, and builds on top of Envoy's proven HTTP management and scalability features to handle ingress and egress traffic related to prompts and LLMs
+ - Built on [Envoy](https://envoyproxy.io): Arch runs alongside application servers, and builds on top of Envoy's proven HTTP management and scalability features to handle ingress and egress traffic related to prompts and LLMs.
- Function Calling for fast Agentic and RAG apps. Engineered with purpose-built [LLMs](https://huggingface.co/collections/katanemo/arch-function-66f209a693ea8df14317ad68) to handle fast, cost-effective, and accurate prompt-based tasks like function/API calling, and parameter extraction from prompts.
- Prompt [Guard](https://huggingface.co/collections/katanemo/arch-guard-6702bdc08b889e4bce8f446d): Arch centralizes prompt guardrails to prevent jailbreak attempts and ensure safe user interactions without writing a single line of code.
- Traffic Management: Arch manages LLM calls, offering smart retries, automatic cutover, and resilient upstream connections for continuous availability.
@@ -35,7 +37,7 @@ Follow this guide to learn how to quickly set up Arch and integrate it into your
Before you begin, ensure you have the following:
-- `Docker` & `Python` verion 3.10 installed on your system
+- `Docker` & `Python` installed on your system
- `API Keys` for LLM providers (if using external LLMs)
### Step 1: Install Arch
@@ -69,7 +71,7 @@ llm_providers:
- name: OpenAI
provider: openai
access_key: OPENAI_API_KEY
- model: gpt-3.5-turbo
+ model: gpt-4o
default: true
stream: true
@@ -109,15 +111,12 @@ Make outbound calls via Arch
import openai
# Set the OpenAI API base URL to the Arch gateway endpoint
-openai.api_base = "http://127.0.0.1:12000/"
+openai.api_base = "http://127.0.0.1:51001/v1"
# No need to set openai.api_key since it's configured in Arch's gateway
# Use the OpenAI client as usual
-# we set api_key to '--' becasue openai client would fail to initiate request without it. Just pass any
-# dummy value here since arch gateway will properly pass access key before making outbound call.
response = openai.Completion.create(
- api_key="--",
model="text-davinci-003",
prompt="What is the capital of France?"
)
From bfb549b0755f40bc1ede4170c9117077fa56f3f0 Mon Sep 17 00:00:00 2001
From: Salman Paracha
Date: Sun, 13 Oct 2024 20:46:12 -0700
Subject: [PATCH 09/10] ensuring that logo appears in dark mode (#184)
Co-authored-by: Salman Paracha
---
README.md | 4 ++--
docs/source/_static/img/arch-logo.png | Bin 342724 -> 334876 bytes
docs/source/index.rst | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index f5447c81..44c49bc3 100644
--- a/README.md
+++ b/README.md
@@ -2,9 +2,9 @@
-## Build fast, robust, and personalized GenAI apps (agents, assistants, etc.)
+## Build fast, robust, and personalized AI agents.
-Arch is an intelligent [Layer 7](https://www.cloudflare.com/learning/ddos/what-is-layer-7/) gateway designed to protect, observe, and personalize LLM apps with your APIs.
+Arch is an intelligent [Layer 7](https://www.cloudflare.com/learning/ddos/what-is-layer-7/) gateway designed to protect, observe, and personalize LLM applications (agents, assistants, co-pilots) with your APIs.
Engineered with purpose-built LLMs, Arch handles the critical but undifferentiated tasks related to the handling and processing of prompts, including detecting and rejecting [jailbreak](https://github.com/verazuo/jailbreak_llms) attempts, intelligently calling "backend" APIs to fulfill the user's request represented in a prompt, routing to and offering disaster recovery between upstream LLMs, and managing the observability of prompts and LLM interactions in a centralized way.
diff --git a/docs/source/_static/img/arch-logo.png b/docs/source/_static/img/arch-logo.png
index 183f6ee99c18a308ae8a357c89ae0c764c0c85dc..f1d11f6285bdf047aaf390e94942a5a857568f21 100644
GIT binary patch
literal 334876
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