This project is a proxy application that forwards requests to an ARGO API and optionally converts the responses to be compatible with OpenAI’s API format. It can be used in conjunction with autossh-tunnel-dockerized or other secure connection tools.
pip install argo-proxy # install the package
argo-proxy # run the proxy
The machine or server making API calls to Argo must be connected to the Argonne internal network or through a VPN on an Argonne-managed computer if you are working off-site. Your instance of the argo proxy should always be on-premise at an Argonne machine. The software is provided “as is,” without any warranties. By using this software, you accept that the authors, contributors, and affiliated organizations will not be liable for any damages or issues arising from its use. You are solely responsible for ensuring the software meets your requirements.
Python 3.10+ is required. </br> It is recommended to use conda, mamba, or pipx, etc., to manage an exclusive environment. </br> Conda/Mamba Download and install from: https://conda-forge.org/download/ </br> pipx Download and install from: https://pipx.pypa.io/stable/installation/
Install dependencies:
PyPI current version:
pip install argo-proxy
To upgrade:
argo-proxy --version # Display current version
# Check against PyPI version
pip install argo-proxy --upgrade
or, if you decide to use dev version (make sure you are at the root of the repo cloned):
pip install .
If you don’t want to manually configure it, the First-Time Setup will automatically create it for you.
The application uses config.yaml
for configuration. Here’s an example:
port: 44497
host: 0.0.0.0
argo_url: "https://apps-dev.inside.anl.gov/argoapi/api/v1/resource/chat/"
argo_stream_url: "https://apps-dev.inside.anl.gov/argoapi/api/v1/resource/streamchat/"
argo_embedding_url: "https://apps.inside.anl.gov/argoapi/api/v1/resource/embed/"
user: "your_username" # set during first-time setup
verbose: true # can be changed during setup
To start the application:
argo-proxy [config_path]
config.yaml
under:
~/.config/argoproxy/
~/.argoproxy/
The first one found will be used.With path: uses specified config file, if exists. Otherwise, falls back to default search.
argo-proxy /path/to/config.yaml
--edit
flag: opens the config file in the default editor for modification.When running without an existing config file:
config.yaml
from config.sample.yaml
user
field)verbose
field)Example session:
$ argo-proxy
No valid configuration found.
Would you like to create it from config.sample.yaml? [Y/n]:
Creating new configuration...
Use port [52226]? [Y/n/<port>]:
Enter your username: your_username
Enable verbose mode? [Y/n]
Created new configuration at: /home/your_username/.config/argoproxy/config.yaml
Using port 52226...
Validating URL connectivity...
Current configuration:
--------------------------------------
{
"host": "0.0.0.0",
"port": 52226,
"user": "your_username",
"argo_url": "https://apps-dev.inside.anl.gov/argoapi/api/v1/resource/chat/",
"argo_stream_url": "https://apps-dev.inside.anl.gov/argoapi/api/v1/resource/streamchat/",
"argo_embedding_url": "https://apps.inside.anl.gov/argoapi/api/v1/resource/embed/",
"verbose": true
}
--------------------------------------
# ... proxy server starting info display ...
Option | Description | Default |
---|---|---|
host |
Host address to bind the server to | 0.0.0.0 |
port |
Application port (random available port selected by default) | randomly assigned |
argo_url |
Argo Chat API URL | Dev URL (for now) |
argo_stream_url |
Argo Stream API URL | Dev URL (for now) |
argo_embedding_url |
Argo Embedding API URL | Prod URL |
user |
Your username | (Set during setup) |
verbose |
Debug logging | true |
argo-proxy
CLI Available Options$ argo-proxy -h
usage: argo-proxy [-h] [--host HOST] [--port PORT] [--verbose | --quiet] [--edit]
[--validate] [--show] [--version]
[config]
Argo Proxy CLI
positional arguments:
config Path to the configuration file
options:
-h, --help show this help message and exit
--host HOST, -H HOST Host address to bind the server to
--port PORT, -p PORT Port number to bind the server to
--verbose, -v Enable verbose logging, override if `verbose` set False in config
--quiet, -q Disable verbose logging, override if `verbose` set True in config
--edit, -e Open the configuration file in the system's default editor for
editing
--validate, -vv Validate the configuration file and exit
--show, -s Show the current configuration during launch
--version, -V Show the version and exit.
The following options help manage the configuration file:
--edit, -e
: Open the configuration file in the system’s default editor for editing.
--validate, -vv
: Validate the configuration file and exit without starting the server.
--show, -s
: Show the current configuration during launch.
--validate
to just display configuration without starting the server# Example usage:
argo-proxy --edit # Edit config file
argo-proxy --validate --show # Validate and display config
argo-proxy --show # Show config at startup
These endpoints convert responses from the ARGO API to be compatible with OpenAI’s format:
/v1/responses
: Available from v2.7.0. Response API./v1/chat/completions
: Chat Completions API./v1/completions
: Legacy Completions API./v1/embeddings
: Embedding API./v1/models
: Lists available models in OpenAI-compatible format.These endpoints interact directly with the ARGO API and do not convert responses to OpenAI’s format:
/v1/chat
: Proxies requests to the ARGO API without conversion./v1/embed
: Proxies requests to the ARGO Embedding API without conversion./health
: Health check endpoint. Returns 200 OK
if the server is running./version
: Returns the version of the ArgoProxy server. Notifies if a new version is available. Available from 2.7.0.post1.You can override the default timeout with a timeout
parameter in your request. This parameter is optional for client request. Proxy server will keep the connection open until it finishes or client disconnects.
Details of how to make such override in different query flavors: Timeout Override Examples
Original ARGO Model Name | Argo Proxy Name |
---|---|
gpt35 |
argo:gpt-3.5-turbo |
gpt35large |
argo:gpt-3.5-turbo-16k |
gpt4 |
argo:gpt-4 |
gpt4large |
argo:gpt-4-32k |
gpt4turbo |
argo:gpt-4-turbo |
gpt4o |
argo:gpt-4o |
gpt4olatest |
argo:gpt-4o-latest |
gpto1preview |
argo:gpt-o1-preview , argo:o1-preview |
gpto1mini |
argo:gpt-o1-mini , argo:o1-mini |
gpto3mini |
argo:gpt-o3-mini , argo:o3-mini |
gpto1 |
argo:gpt-o1 , argo:o1 |
gpto3 |
argo:gpt-o3 , argo:o3 |
gpto4mini |
argo:gpt-o4-mini , argo:o4-mini |
gpt41 |
argo:gpt-4.1 |
gpt41mini |
argo:gpt-4.1-mini |
gpt41nano |
argo:gpt-4.1-nano |
Original ARGO Model Name | Argo Proxy Name |
---|---|
gemini25pro |
argo:gemini-2.5-pro |
gemini25flash |
argo:gemini-2.5-flash |
Original ARGO Model Name | Argo Proxy Name |
---|---|
claudeopus4 |
argo:claude-opus-4 , argo:claude-4-opus |
claudesonnet4 |
argo:claude-sonnet-4 , argo:claude-4-sonnet |
claudesonnet37 |
argo:claude-sonnet-3.7 , argo:claude-3.7-sonnet |
claudesonnet35v2 |
argo:claude-sonnet-3.5 , argo:claude-3.5-sonnet |
Original ARGO Model Name | Argo Proxy Name |
---|---|
ada002 |
argo:text-embedding-ada-002 |
v3small |
argo:text-embedding-3-small |
v3large |
argo:text-embedding-3-large |
For examples of how to use the raw request utilities (e.g., httpx
, requests
), refer to:
For examples demonstrating the use case of the OpenAI client (openai.OpenAI
), refer to:
The following is an overview of the project’s directory structure:
$ tree -I "__pycache__|*.egg-info|dist|dev_scripts|config.yaml"
.
├── config.sample.yaml
├── examples
│ ├── openai_client
│ │ ├── chat_completions.py
│ │ ├── chat_completions_stream.py
│ │ ├── embedding.py
│ │ ├── legacy_completions.py
│ │ ├── legacy_completions_stream.py
│ │ ├── o3_mini_simple_chatbot.py
│ │ ├── responses.py
│ │ └── responses_stream.py
│ └── raw_requests
│ ├── argo_chat.py
│ ├── argo_chat_stream.py
│ ├── argo_embed.py
│ ├── chat_completions.py
│ ├── chat_completions_stream.py
│ ├── embedding.py
│ ├── legacy_completions.py
│ ├── legacy_completions_stream.py
│ ├── o1_mini_chat_completions.py
│ ├── responses.py
│ └── responses_stream.py
├── LICENSE
├── Makefile
├── pyproject.toml
├── README.md
├── run_app.sh
├── src
│ └── argoproxy
│ ├── app.py
│ ├── cli.py
│ ├── config.py
│ ├── endpoints
│ │ ├── chat.py
│ │ ├── completions.py
│ │ ├── embed.py
│ │ ├── extras.py
│ │ └── responses.py
│ ├── __init__.py
│ ├── models.py
│ ├── py.typed
│ ├── types
│ │ ├── chat_completion.py
│ │ ├── completions.py
│ │ ├── embedding.py
│ │ ├── function_call.py
│ │ ├── __init__.py
│ │ └── responses.py
│ └── utils
│ ├── input_handle.py
│ ├── misc.py
│ ├── models.py
│ ├── tokens.py
│ └── transports.py
└── timeout_examples.md
9 directories, 48 files
This project is developed in my spare time. Bugs and issues may exist. If you encounter any or have suggestions for improvements, please open an issue or submit a pull request. Your contributions are highly appreciated!