Repository files navigation

OpenAI Adapter Reference

A reference implementation for building OpenAI API-compatible services. This adapter implements the OpenAI API interface and can be used as a starting point for creating custom implementations that maintain the same API but with different internal authentication, routing, or business logic.

Features

  • Focused API: Supports only the core completions endpoints
  • Authentication: Optional API key authentication for securing your proxy
  • Request Validation: Validates all requests before sending to the AI provider
  • Improved Error Handling: Returns appropriate HTTP status codes and sanitized error messages
  • Model Restrictions: Optionally restrict which models can be used
  • Custom Base URL: Connect to different OpenAI-compatible endpoints
  • Metrics: Built-in metrics endpoint for monitoring
  • Streaming Support: Fully supports streaming responses for chat and completions
  • Health Check: Built-in health check endpoint for monitoring
  • Extensibility: Example adapters for other AI providers

Supported Endpoints

  • /v1/chat/completions - Chat completions API
  • /v1/completions - Text completions API (legacy)

Note: Other OpenAI endpoints like embeddings, image generation, and model listing are not supported in this focused adapter.

Getting Started

Prerequisites

  • Python 3.11 or higher
  • An OpenAI API key (or API key for another provider if using an adapter)

Installation

  1. Clone this repository:
git clone https://github.com/dynamofl/adapter_reference.git
cd adapter_reference
  1. Create a virtual environment and install dependencies:
python3 -m venv venv
source venv/bin/activate # On macOS/Linux# OR
.\venv\Scripts\activate # On Windows
pip install -r requirements.txt
  1. Create a .env file from the example:
cp .env.example .env
  1. Edit the .env file and add your API key:
OPENAI_API_KEY=your_openai_api_key_here

Running Locally

python app.py

The server will start at http://localhost:8000 by default.

Using Docker

docker compose up --build

Configuration

The following environment variables can be used to configure the adapter:

VariableDescriptionDefault
OPENAI_API_KEYYour OpenAI API key (required)-
OPENAI_BASE_URLCustom base URL for OpenAI APIhttps://api.openai.com/v1
ENABLE_AUTHEnable API key authenticationfalse
API_KEY_SECRETAPI key for authentication when enabledRandom generated
PORTPort to run the server on8000
ALLOWED_MODELSComma-separated list of allowed modelsAll models allowed

Using the API

Making API Requests

You can make requests to the API without authentication:

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hello, how are you?" } ] }'

Authentication is disabled by default but can be enabled by uncommenting the authentication code in app.py and setting ENABLE_AUTH=true in your .env file.

Using with the OpenAI Python client

importopenaiclient=openai.OpenAI(
base_url="http://localhost:8000/v1",
# No API key needed by default since authentication is disabled# If you enable authentication, include your API key:# api_key="your_api_key_here"
)
# Chat completionsresponse=client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello, how are you?"}
]
)
print(response.choices[0].message.content)
# Completions (legacy)completion_response=client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="Hello, how are you?",
max_tokens=50
)
print(completion_response.choices[0].text)

Creating Custom Client Implementations

This reference implementation is designed to help you build services that expose the same API interface as OpenAI but with your own customized client implementation. Here's how to use it:

Understanding the Architecture

The reference implementation has three main components:

  1. API Endpoints: FastAPI routes that expose OpenAI-compatible endpoints
  2. Client Implementation: The OpenAI client that handles actual API calls
  3. Validation & Error Handling: Logic that ensures requests and responses follow the OpenAI format

Customizing for Your Own Implementation

To create your own client implementation that maintains OpenAI API compatibility:

  1. Fork this repo: Use it as a starting point for your implementation
  2. Replace the client: Modify the get_openai_client() function in app.py to return your custom client
  3. Customize authentication: Update authentication as needed for your use case
  4. Add business logic: Insert any additional logic like request modification, logging, etc.

Example custom client implementation:

# In app.pydefget_openai_client():
""" Returns a custom OpenAI client implementation with the same interface but different internal authentication and routing. """# Import your custom client implementationfromyour_custom_moduleimportCustomOpenAIClient# Return your custom client with the same interfacereturnCustomOpenAIClient(
api_key=config.openai_api_key,
# Add your custom parameters hereenterprise_id=config.enterprise_id,
custom_routing=config.custom_routing
)

Example Use Cases

  1. Enterprise Routing: Route requests to different OpenAI deployments based on business rules
  2. Custom Authentication: Implement custom JWT, OAuth, or other auth schemes
  3. Request Transformation: Modify requests before sending to OpenAI (e.g., adding context)
  4. Response Filtering: Apply content filtering or modification to responses
  5. Logging & Analytics: Add detailed logging for compliance or usage tracking

The examples directory contains a custom client implementation to demonstrate how to maintain the OpenAI API interface while implementing your own authentication and routing logic.

Health and Monitoring

  • Health check: GET /health
  • API metrics: GET /metrics

Testing

Running End-to-End Tests

The repository includes end-to-end tests that validate the API functionality against a running instance of the adapter.

To run the end-to-end tests:

  1. Make sure the adapter is running:
# In one terminal window
python app.py
  1. Run the tests in another terminal:
# Run basic tests
python -m tests.e2e_tests
# Run with verbose output (shows full API responses)
python -m tests.e2e_tests --verbose
# Test against a different URL
python -m tests.e2e_tests --base-url http://your-server:8000
# Test with authentication (if enabled)
python -m tests.e2e_tests --api-key your_api_key

The tests verify all API endpoints, authentication, validation, and error handling to ensure the adapter works correctly.

Running Unit Tests

For unit tests:

pytest

About

Public reference of implementation for Adapter to interact with custom endpoints.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

OpenAI Adapter Reference

A reference implementation for building OpenAI API-compatible services. This adapter implements the OpenAI API interface and can be used as a starting point for creating custom implementations that maintain the same API but with different internal authentication, routing, or business logic.

Features

  • Focused API: Supports only the core completions endpoints
  • Authentication: Optional API key authentication for securing your proxy
  • Request Validation: Validates all requests before sending to the AI provider
  • Improved Error Handling: Returns appropriate HTTP status codes and sanitized error messages
  • Model Restrictions: Optionally restrict which models can be used
  • Custom Base URL: Connect to different OpenAI-compatible endpoints
  • Metrics: Built-in metrics endpoint for monitoring
  • Streaming Support: Fully supports streaming responses for chat and completions
  • Health Check: Built-in health check endpoint for monitoring
  • Extensibility: Example adapters for other AI providers

Supported Endpoints

  • /v1/chat/completions - Chat completions API
  • /v1/completions - Text completions API (legacy)

Note: Other OpenAI endpoints like embeddings, image generation, and model listing are not supported in this focused adapter.

Getting Started

Prerequisites

  • Python 3.11 or higher
  • An OpenAI API key (or API key for another provider if using an adapter)

Installation

  1. Clone this repository:
git clone https://github.com/dynamofl/adapter_reference.git
cd adapter_reference
  1. Create a virtual environment and install dependencies:
python3 -m venv venv
source venv/bin/activate # On macOS/Linux# OR
.\venv\Scripts\activate # On Windows
pip install -r requirements.txt
  1. Create a .env file from the example:
cp .env.example .env
  1. Edit the .env file and add your API key:
OPENAI_API_KEY=your_openai_api_key_here

Running Locally

python app.py

The server will start at http://localhost:8000 by default.

Using Docker

docker compose up --build

Configuration

The following environment variables can be used to configure the adapter:

VariableDescriptionDefault
OPENAI_API_KEYYour OpenAI API key (required)-
OPENAI_BASE_URLCustom base URL for OpenAI APIhttps://api.openai.com/v1
ENABLE_AUTHEnable API key authenticationfalse
API_KEY_SECRETAPI key for authentication when enabledRandom generated
PORTPort to run the server on8000
ALLOWED_MODELSComma-separated list of allowed modelsAll models allowed

Using the API

Making API Requests

You can make requests to the API without authentication:

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hello, how are you?" } ] }'

Authentication is disabled by default but can be enabled by uncommenting the authentication code in app.py and setting ENABLE_AUTH=true in your .env file.

Using with the OpenAI Python client

importopenaiclient=openai.OpenAI(
base_url="http://localhost:8000/v1",
# No API key needed by default since authentication is disabled# If you enable authentication, include your API key:# api_key="your_api_key_here"
)
# Chat completionsresponse=client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello, how are you?"}
]
)
print(response.choices[0].message.content)
# Completions (legacy)completion_response=client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="Hello, how are you?",
max_tokens=50
)
print(completion_response.choices[0].text)

Creating Custom Client Implementations

This reference implementation is designed to help you build services that expose the same API interface as OpenAI but with your own customized client implementation. Here's how to use it:

Understanding the Architecture

The reference implementation has three main components:

  1. API Endpoints: FastAPI routes that expose OpenAI-compatible endpoints
  2. Client Implementation: The OpenAI client that handles actual API calls
  3. Validation & Error Handling: Logic that ensures requests and responses follow the OpenAI format

Customizing for Your Own Implementation

To create your own client implementation that maintains OpenAI API compatibility:

  1. Fork this repo: Use it as a starting point for your implementation
  2. Replace the client: Modify the get_openai_client() function in app.py to return your custom client
  3. Customize authentication: Update authentication as needed for your use case
  4. Add business logic: Insert any additional logic like request modification, logging, etc.

Example custom client implementation:

# In app.pydefget_openai_client():
""" Returns a custom OpenAI client implementation with the same interface but different internal authentication and routing. """# Import your custom client implementationfromyour_custom_moduleimportCustomOpenAIClient# Return your custom client with the same interfacereturnCustomOpenAIClient(
api_key=config.openai_api_key,
# Add your custom parameters hereenterprise_id=config.enterprise_id,
custom_routing=config.custom_routing
)

Example Use Cases

  1. Enterprise Routing: Route requests to different OpenAI deployments based on business rules
  2. Custom Authentication: Implement custom JWT, OAuth, or other auth schemes
  3. Request Transformation: Modify requests before sending to OpenAI (e.g., adding context)
  4. Response Filtering: Apply content filtering or modification to responses
  5. Logging & Analytics: Add detailed logging for compliance or usage tracking

The examples directory contains a custom client implementation to demonstrate how to maintain the OpenAI API interface while implementing your own authentication and routing logic.

Health and Monitoring

  • Health check: GET /health
  • API metrics: GET /metrics

Testing

Running End-to-End Tests

The repository includes end-to-end tests that validate the API functionality against a running instance of the adapter.

To run the end-to-end tests:

  1. Make sure the adapter is running:
# In one terminal window
python app.py
  1. Run the tests in another terminal:
# Run basic tests
python -m tests.e2e_tests
# Run with verbose output (shows full API responses)
python -m tests.e2e_tests --verbose
# Test against a different URL
python -m tests.e2e_tests --base-url http://your-server:8000
# Test with authentication (if enabled)
python -m tests.e2e_tests --api-key your_api_key

The tests verify all API endpoints, authentication, validation, and error handling to ensure the adapter works correctly.

Running Unit Tests

For unit tests:

pytest

About

Public reference of implementation for Adapter to interact with custom endpoints.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenAI Adapter Reference

A reference implementation for building OpenAI API-compatible services. This adapter implements the OpenAI API interface and can be used as a starting point for creating custom implementations that maintain the same API but with different internal authentication, routing, or business logic.

Features

  • Focused API: Supports only the core completions endpoints
  • Authentication: Optional API key authentication for securing your proxy
  • Request Validation: Validates all requests before sending to the AI provider
  • Improved Error Handling: Returns appropriate HTTP status codes and sanitized error messages
  • Model Restrictions: Optionally restrict which models can be used
  • Custom Base URL: Connect to different OpenAI-compatible endpoints
  • Metrics: Built-in metrics endpoint for monitoring
  • Streaming Support: Fully supports streaming responses for chat and completions
  • Health Check: Built-in health check endpoint for monitoring
  • Extensibility: Example adapters for other AI providers

Supported Endpoints

  • /v1/chat/completions - Chat completions API
  • /v1/completions - Text completions API (legacy)

Note: Other OpenAI endpoints like embeddings, image generation, and model listing are not supported in this focused adapter.

Getting Started

Prerequisites

  • Python 3.11 or higher
  • An OpenAI API key (or API key for another provider if using an adapter)

Installation

  1. Clone this repository:
git clone https://github.com/dynamofl/adapter_reference.git
cd adapter_reference
  1. Create a virtual environment and install dependencies:
python3 -m venv venv
source venv/bin/activate # On macOS/Linux# OR
.\venv\Scripts\activate # On Windows
pip install -r requirements.txt
  1. Create a .env file from the example:
cp .env.example .env
  1. Edit the .env file and add your API key:
OPENAI_API_KEY=your_openai_api_key_here

Running Locally

python app.py

The server will start at http://localhost:8000 by default.

Using Docker

docker compose up --build

Configuration

The following environment variables can be used to configure the adapter:

VariableDescriptionDefault
OPENAI_API_KEYYour OpenAI API key (required)-
OPENAI_BASE_URLCustom base URL for OpenAI APIhttps://api.openai.com/v1
ENABLE_AUTHEnable API key authenticationfalse
API_KEY_SECRETAPI key for authentication when enabledRandom generated
PORTPort to run the server on8000
ALLOWED_MODELSComma-separated list of allowed modelsAll models allowed

Using the API

Making API Requests

You can make requests to the API without authentication:

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hello, how are you?" } ] }'

Authentication is disabled by default but can be enabled by uncommenting the authentication code in app.py and setting ENABLE_AUTH=true in your .env file.

Using with the OpenAI Python client

importopenaiclient=openai.OpenAI(
base_url="http://localhost:8000/v1",
# No API key needed by default since authentication is disabled# If you enable authentication, include your API key:# api_key="your_api_key_here"
)
# Chat completionsresponse=client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello, how are you?"}
]
)
print(response.choices[0].message.content)
# Completions (legacy)completion_response=client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="Hello, how are you?",
max_tokens=50
)
print(completion_response.choices[0].text)

Creating Custom Client Implementations

This reference implementation is designed to help you build services that expose the same API interface as OpenAI but with your own customized client implementation. Here's how to use it:

Understanding the Architecture

The reference implementation has three main components:

  1. API Endpoints: FastAPI routes that expose OpenAI-compatible endpoints
  2. Client Implementation: The OpenAI client that handles actual API calls
  3. Validation & Error Handling: Logic that ensures requests and responses follow the OpenAI format

Customizing for Your Own Implementation

To create your own client implementation that maintains OpenAI API compatibility:

  1. Fork this repo: Use it as a starting point for your implementation
  2. Replace the client: Modify the get_openai_client() function in app.py to return your custom client
  3. Customize authentication: Update authentication as needed for your use case
  4. Add business logic: Insert any additional logic like request modification, logging, etc.

Example custom client implementation:

# In app.pydefget_openai_client():
""" Returns a custom OpenAI client implementation with the same interface but different internal authentication and routing. """# Import your custom client implementationfromyour_custom_moduleimportCustomOpenAIClient# Return your custom client with the same interfacereturnCustomOpenAIClient(
api_key=config.openai_api_key,
# Add your custom parameters hereenterprise_id=config.enterprise_id,
custom_routing=config.custom_routing
)

Example Use Cases

  1. Enterprise Routing: Route requests to different OpenAI deployments based on business rules
  2. Custom Authentication: Implement custom JWT, OAuth, or other auth schemes
  3. Request Transformation: Modify requests before sending to OpenAI (e.g., adding context)
  4. Response Filtering: Apply content filtering or modification to responses
  5. Logging & Analytics: Add detailed logging for compliance or usage tracking

The examples directory contains a custom client implementation to demonstrate how to maintain the OpenAI API interface while implementing your own authentication and routing logic.

Health and Monitoring

  • Health check: GET /health
  • API metrics: GET /metrics

Testing

Running End-to-End Tests

The repository includes end-to-end tests that validate the API functionality against a running instance of the adapter.

To run the end-to-end tests:

  1. Make sure the adapter is running:
# In one terminal window
python app.py
  1. Run the tests in another terminal:
# Run basic tests
python -m tests.e2e_tests
# Run with verbose output (shows full API responses)
python -m tests.e2e_tests --verbose
# Test against a different URL
python -m tests.e2e_tests --base-url http://your-server:8000
# Test with authentication (if enabled)
python -m tests.e2e_tests --api-key your_api_key

The tests verify all API endpoints, authentication, validation, and error handling to ensure the adapter works correctly.

Running Unit Tests

For unit tests:

pytest

About

Public reference of implementation for Adapter to interact with custom endpoints.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenAI Adapter Reference

A reference implementation for building OpenAI API-compatible services. This adapter implements the OpenAI API interface and can be used as a starting point for creating custom implementations that maintain the same API but with different internal authentication, routing, or business logic.

Features

  • Focused API: Supports only the core completions endpoints
  • Authentication: Optional API key authentication for securing your proxy
  • Request Validation: Validates all requests before sending to the AI provider
  • Improved Error Handling: Returns appropriate HTTP status codes and sanitized error messages
  • Model Restrictions: Optionally restrict which models can be used
  • Custom Base URL: Connect to different OpenAI-compatible endpoints
  • Metrics: Built-in metrics endpoint for monitoring
  • Streaming Support: Fully supports streaming responses for chat and completions
  • Health Check: Built-in health check endpoint for monitoring
  • Extensibility: Example adapters for other AI providers

Supported Endpoints

  • /v1/chat/completions - Chat completions API
  • /v1/completions - Text completions API (legacy)

Note: Other OpenAI endpoints like embeddings, image generation, and model listing are not supported in this focused adapter.

Getting Started

Prerequisites

  • Python 3.11 or higher
  • An OpenAI API key (or API key for another provider if using an adapter)

Installation

  1. Clone this repository:
git clone https://github.com/dynamofl/adapter_reference.git
cd adapter_reference
  1. Create a virtual environment and install dependencies:
python3 -m venv venv
source venv/bin/activate # On macOS/Linux# OR
.\venv\Scripts\activate # On Windows
pip install -r requirements.txt
  1. Create a .env file from the example:
cp .env.example .env
  1. Edit the .env file and add your API key:
OPENAI_API_KEY=your_openai_api_key_here

Running Locally

python app.py

The server will start at http://localhost:8000 by default.

Using Docker

docker compose up --build

Configuration

The following environment variables can be used to configure the adapter:

VariableDescriptionDefault
OPENAI_API_KEYYour OpenAI API key (required)-
OPENAI_BASE_URLCustom base URL for OpenAI APIhttps://api.openai.com/v1
ENABLE_AUTHEnable API key authenticationfalse
API_KEY_SECRETAPI key for authentication when enabledRandom generated
PORTPort to run the server on8000
ALLOWED_MODELSComma-separated list of allowed modelsAll models allowed

Using the API

Making API Requests

You can make requests to the API without authentication:

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hello, how are you?" } ] }'

Authentication is disabled by default but can be enabled by uncommenting the authentication code in app.py and setting ENABLE_AUTH=true in your .env file.

Using with the OpenAI Python client

importopenaiclient=openai.OpenAI(
base_url="http://localhost:8000/v1",
# No API key needed by default since authentication is disabled# If you enable authentication, include your API key:# api_key="your_api_key_here"
)
# Chat completionsresponse=client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello, how are you?"}
]
)
print(response.choices[0].message.content)
# Completions (legacy)completion_response=client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="Hello, how are you?",
max_tokens=50
)
print(completion_response.choices[0].text)

Creating Custom Client Implementations

This reference implementation is designed to help you build services that expose the same API interface as OpenAI but with your own customized client implementation. Here's how to use it:

Understanding the Architecture

The reference implementation has three main components:

  1. API Endpoints: FastAPI routes that expose OpenAI-compatible endpoints
  2. Client Implementation: The OpenAI client that handles actual API calls
  3. Validation & Error Handling: Logic that ensures requests and responses follow the OpenAI format

Customizing for Your Own Implementation

To create your own client implementation that maintains OpenAI API compatibility:

  1. Fork this repo: Use it as a starting point for your implementation
  2. Replace the client: Modify the get_openai_client() function in app.py to return your custom client
  3. Customize authentication: Update authentication as needed for your use case
  4. Add business logic: Insert any additional logic like request modification, logging, etc.

Example custom client implementation:

# In app.pydefget_openai_client():
""" Returns a custom OpenAI client implementation with the same interface but different internal authentication and routing. """# Import your custom client implementationfromyour_custom_moduleimportCustomOpenAIClient# Return your custom client with the same interfacereturnCustomOpenAIClient(
api_key=config.openai_api_key,
# Add your custom parameters hereenterprise_id=config.enterprise_id,
custom_routing=config.custom_routing
)

Example Use Cases

  1. Enterprise Routing: Route requests to different OpenAI deployments based on business rules
  2. Custom Authentication: Implement custom JWT, OAuth, or other auth schemes
  3. Request Transformation: Modify requests before sending to OpenAI (e.g., adding context)
  4. Response Filtering: Apply content filtering or modification to responses
  5. Logging & Analytics: Add detailed logging for compliance or usage tracking

The examples directory contains a custom client implementation to demonstrate how to maintain the OpenAI API interface while implementing your own authentication and routing logic.

Health and Monitoring

  • Health check: GET /health
  • API metrics: GET /metrics

Testing

Running End-to-End Tests

The repository includes end-to-end tests that validate the API functionality against a running instance of the adapter.

To run the end-to-end tests:

  1. Make sure the adapter is running:
# In one terminal window
python app.py
  1. Run the tests in another terminal:
# Run basic tests
python -m tests.e2e_tests
# Run with verbose output (shows full API responses)
python -m tests.e2e_tests --verbose
# Test against a different URL
python -m tests.e2e_tests --base-url http://your-server:8000
# Test with authentication (if enabled)
python -m tests.e2e_tests --api-key your_api_key

The tests verify all API endpoints, authentication, validation, and error handling to ensure the adapter works correctly.

Running Unit Tests

For unit tests:

pytest

About

Public reference of implementation for Adapter to interact with custom endpoints.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

OpenAI Adapter Reference

A reference implementation for building OpenAI API-compatible services. This adapter implements the OpenAI API interface and can be used as a starting point for creating custom implementations that maintain the same API but with different internal authentication, routing, or business logic.

Features

  • Focused API: Supports only the core completions endpoints
  • Authentication: Optional API key authentication for securing your proxy
  • Request Validation: Validates all requests before sending to the AI provider
  • Improved Error Handling: Returns appropriate HTTP status codes and sanitized error messages
  • Model Restrictions: Optionally restrict which models can be used
  • Custom Base URL: Connect to different OpenAI-compatible endpoints
  • Metrics: Built-in metrics endpoint for monitoring
  • Streaming Support: Fully supports streaming responses for chat and completions
  • Health Check: Built-in health check endpoint for monitoring
  • Extensibility: Example adapters for other AI providers

Supported Endpoints

  • /v1/chat/completions - Chat completions API
  • /v1/completions - Text completions API (legacy)

Note: Other OpenAI endpoints like embeddings, image generation, and model listing are not supported in this focused adapter.

Getting Started

Prerequisites

  • Python 3.11 or higher
  • An OpenAI API key (or API key for another provider if using an adapter)

Installation

  1. Clone this repository:
git clone https://github.com/dynamofl/adapter_reference.git
cd adapter_reference
  1. Create a virtual environment and install dependencies:
python3 -m venv venv
source venv/bin/activate # On macOS/Linux# OR
.\venv\Scripts\activate # On Windows
pip install -r requirements.txt
  1. Create a .env file from the example:
cp .env.example .env
  1. Edit the .env file and add your API key:
OPENAI_API_KEY=your_openai_api_key_here

Running Locally

python app.py

The server will start at http://localhost:8000 by default.

Using Docker

docker compose up --build

Configuration

The following environment variables can be used to configure the adapter:

VariableDescriptionDefault
OPENAI_API_KEYYour OpenAI API key (required)-
OPENAI_BASE_URLCustom base URL for OpenAI APIhttps://api.openai.com/v1
ENABLE_AUTHEnable API key authenticationfalse
API_KEY_SECRETAPI key for authentication when enabledRandom generated
PORTPort to run the server on8000
ALLOWED_MODELSComma-separated list of allowed modelsAll models allowed

Using the API

Making API Requests

You can make requests to the API without authentication:

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hello, how are you?" } ] }'

Authentication is disabled by default but can be enabled by uncommenting the authentication code in app.py and setting ENABLE_AUTH=true in your .env file.

Using with the OpenAI Python client

importopenaiclient=openai.OpenAI(
base_url="http://localhost:8000/v1",
# No API key needed by default since authentication is disabled# If you enable authentication, include your API key:# api_key="your_api_key_here"
)
# Chat completionsresponse=client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello, how are you?"}
]
)
print(response.choices[0].message.content)
# Completions (legacy)completion_response=client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="Hello, how are you?",
max_tokens=50
)
print(completion_response.choices[0].text)

Creating Custom Client Implementations

This reference implementation is designed to help you build services that expose the same API interface as OpenAI but with your own customized client implementation. Here's how to use it:

Understanding the Architecture

The reference implementation has three main components:

  1. API Endpoints: FastAPI routes that expose OpenAI-compatible endpoints
  2. Client Implementation: The OpenAI client that handles actual API calls
  3. Validation & Error Handling: Logic that ensures requests and responses follow the OpenAI format

Customizing for Your Own Implementation

To create your own client implementation that maintains OpenAI API compatibility:

  1. Fork this repo: Use it as a starting point for your implementation
  2. Replace the client: Modify the get_openai_client() function in app.py to return your custom client
  3. Customize authentication: Update authentication as needed for your use case
  4. Add business logic: Insert any additional logic like request modification, logging, etc.

Example custom client implementation:

# In app.pydefget_openai_client():
""" Returns a custom OpenAI client implementation with the same interface but different internal authentication and routing. """# Import your custom client implementationfromyour_custom_moduleimportCustomOpenAIClient# Return your custom client with the same interfacereturnCustomOpenAIClient(
api_key=config.openai_api_key,
# Add your custom parameters hereenterprise_id=config.enterprise_id,
custom_routing=config.custom_routing
)

Example Use Cases

  1. Enterprise Routing: Route requests to different OpenAI deployments based on business rules
  2. Custom Authentication: Implement custom JWT, OAuth, or other auth schemes
  3. Request Transformation: Modify requests before sending to OpenAI (e.g., adding context)
  4. Response Filtering: Apply content filtering or modification to responses
  5. Logging & Analytics: Add detailed logging for compliance or usage tracking

The examples directory contains a custom client implementation to demonstrate how to maintain the OpenAI API interface while implementing your own authentication and routing logic.

Health and Monitoring

  • Health check: GET /health
  • API metrics: GET /metrics

Testing

Running End-to-End Tests

The repository includes end-to-end tests that validate the API functionality against a running instance of the adapter.

To run the end-to-end tests:

  1. Make sure the adapter is running:
# In one terminal window
python app.py
  1. Run the tests in another terminal:
# Run basic tests
python -m tests.e2e_tests
# Run with verbose output (shows full API responses)
python -m tests.e2e_tests --verbose
# Test against a different URL
python -m tests.e2e_tests --base-url http://your-server:8000
# Test with authentication (if enabled)
python -m tests.e2e_tests --api-key your_api_key

The tests verify all API endpoints, authentication, validation, and error handling to ensure the adapter works correctly.

Running Unit Tests

For unit tests:

pytest

About

Public reference of implementation for Adapter to interact with custom endpoints.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenAI Adapter Reference

A reference implementation for building OpenAI API-compatible services. This adapter implements the OpenAI API interface and can be used as a starting point for creating custom implementations that maintain the same API but with different internal authentication, routing, or business logic.

Features

  • Focused API: Supports only the core completions endpoints
  • Authentication: Optional API key authentication for securing your proxy
  • Request Validation: Validates all requests before sending to the AI provider
  • Improved Error Handling: Returns appropriate HTTP status codes and sanitized error messages
  • Model Restrictions: Optionally restrict which models can be used
  • Custom Base URL: Connect to different OpenAI-compatible endpoints
  • Metrics: Built-in metrics endpoint for monitoring
  • Streaming Support: Fully supports streaming responses for chat and completions
  • Health Check: Built-in health check endpoint for monitoring
  • Extensibility: Example adapters for other AI providers

Supported Endpoints

  • /v1/chat/completions - Chat completions API
  • /v1/completions - Text completions API (legacy)

Note: Other OpenAI endpoints like embeddings, image generation, and model listing are not supported in this focused adapter.

Getting Started

Prerequisites

  • Python 3.11 or higher
  • An OpenAI API key (or API key for another provider if using an adapter)

Installation

  1. Clone this repository:
git clone https://github.com/dynamofl/adapter_reference.git
cd adapter_reference
  1. Create a virtual environment and install dependencies:
python3 -m venv venv
source venv/bin/activate # On macOS/Linux# OR
.\venv\Scripts\activate # On Windows
pip install -r requirements.txt
  1. Create a .env file from the example:
cp .env.example .env
  1. Edit the .env file and add your API key:
OPENAI_API_KEY=your_openai_api_key_here

Running Locally

python app.py

The server will start at http://localhost:8000 by default.

Using Docker

docker compose up --build

Configuration

The following environment variables can be used to configure the adapter:

VariableDescriptionDefault
OPENAI_API_KEYYour OpenAI API key (required)-
OPENAI_BASE_URLCustom base URL for OpenAI APIhttps://api.openai.com/v1
ENABLE_AUTHEnable API key authenticationfalse
API_KEY_SECRETAPI key for authentication when enabledRandom generated
PORTPort to run the server on8000
ALLOWED_MODELSComma-separated list of allowed modelsAll models allowed

Using the API

Making API Requests

You can make requests to the API without authentication:

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hello, how are you?" } ] }'

Authentication is disabled by default but can be enabled by uncommenting the authentication code in app.py and setting ENABLE_AUTH=true in your .env file.

Using with the OpenAI Python client

importopenaiclient=openai.OpenAI(
base_url="http://localhost:8000/v1",
# No API key needed by default since authentication is disabled# If you enable authentication, include your API key:# api_key="your_api_key_here"
)
# Chat completionsresponse=client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello, how are you?"}
]
)
print(response.choices[0].message.content)
# Completions (legacy)completion_response=client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="Hello, how are you?",
max_tokens=50
)
print(completion_response.choices[0].text)

Creating Custom Client Implementations

This reference implementation is designed to help you build services that expose the same API interface as OpenAI but with your own customized client implementation. Here's how to use it:

Understanding the Architecture

The reference implementation has three main components:

  1. API Endpoints: FastAPI routes that expose OpenAI-compatible endpoints
  2. Client Implementation: The OpenAI client that handles actual API calls
  3. Validation & Error Handling: Logic that ensures requests and responses follow the OpenAI format

Customizing for Your Own Implementation

To create your own client implementation that maintains OpenAI API compatibility:

  1. Fork this repo: Use it as a starting point for your implementation
  2. Replace the client: Modify the get_openai_client() function in app.py to return your custom client
  3. Customize authentication: Update authentication as needed for your use case
  4. Add business logic: Insert any additional logic like request modification, logging, etc.

Example custom client implementation:

# In app.pydefget_openai_client():
""" Returns a custom OpenAI client implementation with the same interface but different internal authentication and routing. """# Import your custom client implementationfromyour_custom_moduleimportCustomOpenAIClient# Return your custom client with the same interfacereturnCustomOpenAIClient(
api_key=config.openai_api_key,
# Add your custom parameters hereenterprise_id=config.enterprise_id,
custom_routing=config.custom_routing
)

Example Use Cases

  1. Enterprise Routing: Route requests to different OpenAI deployments based on business rules
  2. Custom Authentication: Implement custom JWT, OAuth, or other auth schemes
  3. Request Transformation: Modify requests before sending to OpenAI (e.g., adding context)
  4. Response Filtering: Apply content filtering or modification to responses
  5. Logging & Analytics: Add detailed logging for compliance or usage tracking

The examples directory contains a custom client implementation to demonstrate how to maintain the OpenAI API interface while implementing your own authentication and routing logic.

Health and Monitoring

  • Health check: GET /health
  • API metrics: GET /metrics

Testing

Running End-to-End Tests

The repository includes end-to-end tests that validate the API functionality against a running instance of the adapter.

To run the end-to-end tests:

  1. Make sure the adapter is running:
# In one terminal window
python app.py
  1. Run the tests in another terminal:
# Run basic tests
python -m tests.e2e_tests
# Run with verbose output (shows full API responses)
python -m tests.e2e_tests --verbose
# Test against a different URL
python -m tests.e2e_tests --base-url http://your-server:8000
# Test with authentication (if enabled)
python -m tests.e2e_tests --api-key your_api_key

The tests verify all API endpoints, authentication, validation, and error handling to ensure the adapter works correctly.

Running Unit Tests

For unit tests:

pytest

About

Public reference of implementation for Adapter to interact with custom endpoints.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

OpenAI Adapter Reference

A reference implementation for building OpenAI API-compatible services. This adapter implements the OpenAI API interface and can be used as a starting point for creating custom implementations that maintain the same API but with different internal authentication, routing, or business logic.

Features

  • Focused API: Supports only the core completions endpoints
  • Authentication: Optional API key authentication for securing your proxy
  • Request Validation: Validates all requests before sending to the AI provider
  • Improved Error Handling: Returns appropriate HTTP status codes and sanitized error messages
  • Model Restrictions: Optionally restrict which models can be used
  • Custom Base URL: Connect to different OpenAI-compatible endpoints
  • Metrics: Built-in metrics endpoint for monitoring
  • Streaming Support: Fully supports streaming responses for chat and completions
  • Health Check: Built-in health check endpoint for monitoring
  • Extensibility: Example adapters for other AI providers

Supported Endpoints

  • /v1/chat/completions - Chat completions API
  • /v1/completions - Text completions API (legacy)

Note: Other OpenAI endpoints like embeddings, image generation, and model listing are not supported in this focused adapter.

Getting Started

Prerequisites

  • Python 3.11 or higher
  • An OpenAI API key (or API key for another provider if using an adapter)

Installation

  1. Clone this repository:
git clone https://github.com/dynamofl/adapter_reference.git
cd adapter_reference
  1. Create a virtual environment and install dependencies:
python3 -m venv venv
source venv/bin/activate # On macOS/Linux# OR
.\venv\Scripts\activate # On Windows
pip install -r requirements.txt
  1. Create a .env file from the example:
cp .env.example .env
  1. Edit the .env file and add your API key:
OPENAI_API_KEY=your_openai_api_key_here

Running Locally

python app.py

The server will start at http://localhost:8000 by default.

Using Docker

docker compose up --build

Configuration

The following environment variables can be used to configure the adapter:

VariableDescriptionDefault
OPENAI_API_KEYYour OpenAI API key (required)-
OPENAI_BASE_URLCustom base URL for OpenAI APIhttps://api.openai.com/v1
ENABLE_AUTHEnable API key authenticationfalse
API_KEY_SECRETAPI key for authentication when enabledRandom generated
PORTPort to run the server on8000
ALLOWED_MODELSComma-separated list of allowed modelsAll models allowed

Using the API

Making API Requests

You can make requests to the API without authentication:

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hello, how are you?" } ] }'

Authentication is disabled by default but can be enabled by uncommenting the authentication code in app.py and setting ENABLE_AUTH=true in your .env file.

Using with the OpenAI Python client

importopenaiclient=openai.OpenAI(
base_url="http://localhost:8000/v1",
# No API key needed by default since authentication is disabled# If you enable authentication, include your API key:# api_key="your_api_key_here"
)
# Chat completionsresponse=client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello, how are you?"}
]
)
print(response.choices[0].message.content)
# Completions (legacy)completion_response=client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="Hello, how are you?",
max_tokens=50
)
print(completion_response.choices[0].text)

Creating Custom Client Implementations

This reference implementation is designed to help you build services that expose the same API interface as OpenAI but with your own customized client implementation. Here's how to use it:

Understanding the Architecture

The reference implementation has three main components:

  1. API Endpoints: FastAPI routes that expose OpenAI-compatible endpoints
  2. Client Implementation: The OpenAI client that handles actual API calls
  3. Validation & Error Handling: Logic that ensures requests and responses follow the OpenAI format

Customizing for Your Own Implementation

To create your own client implementation that maintains OpenAI API compatibility:

  1. Fork this repo: Use it as a starting point for your implementation
  2. Replace the client: Modify the get_openai_client() function in app.py to return your custom client
  3. Customize authentication: Update authentication as needed for your use case
  4. Add business logic: Insert any additional logic like request modification, logging, etc.

Example custom client implementation:

# In app.pydefget_openai_client():
""" Returns a custom OpenAI client implementation with the same interface but different internal authentication and routing. """# Import your custom client implementationfromyour_custom_moduleimportCustomOpenAIClient# Return your custom client with the same interfacereturnCustomOpenAIClient(
api_key=config.openai_api_key,
# Add your custom parameters hereenterprise_id=config.enterprise_id,
custom_routing=config.custom_routing
)

Example Use Cases

  1. Enterprise Routing: Route requests to different OpenAI deployments based on business rules
  2. Custom Authentication: Implement custom JWT, OAuth, or other auth schemes
  3. Request Transformation: Modify requests before sending to OpenAI (e.g., adding context)
  4. Response Filtering: Apply content filtering or modification to responses
  5. Logging & Analytics: Add detailed logging for compliance or usage tracking

The examples directory contains a custom client implementation to demonstrate how to maintain the OpenAI API interface while implementing your own authentication and routing logic.

Health and Monitoring

  • Health check: GET /health
  • API metrics: GET /metrics

Testing

Running End-to-End Tests

The repository includes end-to-end tests that validate the API functionality against a running instance of the adapter.

To run the end-to-end tests:

  1. Make sure the adapter is running:
# In one terminal window
python app.py
  1. Run the tests in another terminal:
# Run basic tests
python -m tests.e2e_tests
# Run with verbose output (shows full API responses)
python -m tests.e2e_tests --verbose
# Test against a different URL
python -m tests.e2e_tests --base-url http://your-server:8000
# Test with authentication (if enabled)
python -m tests.e2e_tests --api-key your_api_key

The tests verify all API endpoints, authentication, validation, and error handling to ensure the adapter works correctly.

Running Unit Tests

For unit tests:

pytest

About

Public reference of implementation for Adapter to interact with custom endpoints.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

OpenAI Adapter Reference

A reference implementation for building OpenAI API-compatible services. This adapter implements the OpenAI API interface and can be used as a starting point for creating custom implementations that maintain the same API but with different internal authentication, routing, or business logic.

Features

  • Focused API: Supports only the core completions endpoints
  • Authentication: Optional API key authentication for securing your proxy
  • Request Validation: Validates all requests before sending to the AI provider
  • Improved Error Handling: Returns appropriate HTTP status codes and sanitized error messages
  • Model Restrictions: Optionally restrict which models can be used
  • Custom Base URL: Connect to different OpenAI-compatible endpoints
  • Metrics: Built-in metrics endpoint for monitoring
  • Streaming Support: Fully supports streaming responses for chat and completions
  • Health Check: Built-in health check endpoint for monitoring
  • Extensibility: Example adapters for other AI providers

Supported Endpoints

  • /v1/chat/completions - Chat completions API
  • /v1/completions - Text completions API (legacy)

Note: Other OpenAI endpoints like embeddings, image generation, and model listing are not supported in this focused adapter.

Getting Started

Prerequisites

  • Python 3.11 or higher
  • An OpenAI API key (or API key for another provider if using an adapter)

Installation

  1. Clone this repository:
git clone https://github.com/dynamofl/adapter_reference.git
cd adapter_reference
  1. Create a virtual environment and install dependencies:
python3 -m venv venv
source venv/bin/activate # On macOS/Linux# OR
.\venv\Scripts\activate # On Windows
pip install -r requirements.txt
  1. Create a .env file from the example:
cp .env.example .env
  1. Edit the .env file and add your API key:
OPENAI_API_KEY=your_openai_api_key_here

Running Locally

python app.py

The server will start at http://localhost:8000 by default.

Using Docker

docker compose up --build

Configuration

The following environment variables can be used to configure the adapter:

VariableDescriptionDefault
OPENAI_API_KEYYour OpenAI API key (required)-
OPENAI_BASE_URLCustom base URL for OpenAI APIhttps://api.openai.com/v1
ENABLE_AUTHEnable API key authenticationfalse
API_KEY_SECRETAPI key for authentication when enabledRandom generated
PORTPort to run the server on8000
ALLOWED_MODELSComma-separated list of allowed modelsAll models allowed

Using the API

Making API Requests

You can make requests to the API without authentication:

curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Hello, how are you?" } ] }'

Authentication is disabled by default but can be enabled by uncommenting the authentication code in app.py and setting ENABLE_AUTH=true in your .env file.

Using with the OpenAI Python client

importopenaiclient=openai.OpenAI(
base_url="http://localhost:8000/v1",
# No API key needed by default since authentication is disabled# If you enable authentication, include your API key:# api_key="your_api_key_here"
)
# Chat completionsresponse=client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "Hello, how are you?"}
]
)
print(response.choices[0].message.content)
# Completions (legacy)completion_response=client.completions.create(
model="gpt-3.5-turbo-instruct",
prompt="Hello, how are you?",
max_tokens=50
)
print(completion_response.choices[0].text)

Creating Custom Client Implementations

This reference implementation is designed to help you build services that expose the same API interface as OpenAI but with your own customized client implementation. Here's how to use it:

Understanding the Architecture

The reference implementation has three main components:

  1. API Endpoints: FastAPI routes that expose OpenAI-compatible endpoints
  2. Client Implementation: The OpenAI client that handles actual API calls
  3. Validation & Error Handling: Logic that ensures requests and responses follow the OpenAI format

Customizing for Your Own Implementation

To create your own client implementation that maintains OpenAI API compatibility:

  1. Fork this repo: Use it as a starting point for your implementation
  2. Replace the client: Modify the get_openai_client() function in app.py to return your custom client
  3. Customize authentication: Update authentication as needed for your use case
  4. Add business logic: Insert any additional logic like request modification, logging, etc.

Example custom client implementation:

# In app.pydefget_openai_client():
""" Returns a custom OpenAI client implementation with the same interface but different internal authentication and routing. """# Import your custom client implementationfromyour_custom_moduleimportCustomOpenAIClient# Return your custom client with the same interfacereturnCustomOpenAIClient(
api_key=config.openai_api_key,
# Add your custom parameters hereenterprise_id=config.enterprise_id,
custom_routing=config.custom_routing
)

Example Use Cases

  1. Enterprise Routing: Route requests to different OpenAI deployments based on business rules
  2. Custom Authentication: Implement custom JWT, OAuth, or other auth schemes
  3. Request Transformation: Modify requests before sending to OpenAI (e.g., adding context)
  4. Response Filtering: Apply content filtering or modification to responses
  5. Logging & Analytics: Add detailed logging for compliance or usage tracking

The examples directory contains a custom client implementation to demonstrate how to maintain the OpenAI API interface while implementing your own authentication and routing logic.

Health and Monitoring

  • Health check: GET /health
  • API metrics: GET /metrics

Testing

Running End-to-End Tests

The repository includes end-to-end tests that validate the API functionality against a running instance of the adapter.

To run the end-to-end tests:

  1. Make sure the adapter is running:
# In one terminal window
python app.py
  1. Run the tests in another terminal:
# Run basic tests
python -m tests.e2e_tests
# Run with verbose output (shows full API responses)
python -m tests.e2e_tests --verbose
# Test against a different URL
python -m tests.e2e_tests --base-url http://your-server:8000
# Test with authentication (if enabled)
python -m tests.e2e_tests --api-key your_api_key

The tests verify all API endpoints, authentication, validation, and error handling to ensure the adapter works correctly.

Running Unit Tests

For unit tests:

pytest

About

Public reference of implementation for Adapter to interact with custom endpoints.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages