# How to Configure Custom OpenAI‑Compatible API Endpoints for Meetily Summaries

> Configure custom OpenAI-compatible API endpoints for Meetily and integrate with Ollama, Groq, or self-hosted LLMs. Enable seamless meeting summaries with simple frontend configuration.

- Repository: [Zackriya Solutions/meetily](https://github.com/Zackriya-Solutions/meetily)
- Tags: how-to-guide
- Published: 2026-07-14

---

**Meetily supports custom OpenAI‑compatible endpoints by storing the URL and optional API key in the frontend configuration service, enabling seamless integration with Ollama, Groq, or self‑hosted LLMs for generating meeting summaries.**

Meetily, an open‑source meeting assistant from Zackriya‑Solutions, allows you to configure custom OpenAI‑compatible API endpoints for Meetily summaries. This flexibility enables you to process meeting transcripts using local models via Ollama, private cloud deployments, or third‑party providers that implement the OpenAI chat completions API contract. The configuration is stored locally and applied at runtime without requiring application restarts.

## How Meetily's Summarization Architecture Works

Behind the scenes, Meetily generates meeting summaries by sending transcribed text to an LLM service that conforms to the OpenAI API contract. The system stores your endpoint and API key in the front‑end configuration service ([`frontend/src/services/configService.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/frontend/src/services/configService.ts)), persists them in IndexedDB via `storageService`, and retrieves them during summary generation through the [`useSummaryGeneration.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/useSummaryGeneration.ts) hook.

When you trigger a summary, the hook constructs a standard OpenAI *chat/completions* payload and posts it to your configured endpoint. Because the request follows the standard OpenAI schema, any compatible server can be swapped in without modifying the application code.

## Configuring a Custom Endpoint via the Settings UI

The simplest way to configure custom OpenAI‑compatible API endpoints for Meetily summaries is through the [`ModelConfig.tsx`](https://github.com/Zackriya-Solutions/meetily/blob/main/ModelConfig.tsx) component:

1. Open the **Settings UI** by navigating to sidebar → *Model & API* (handled by [`frontend/src/components/Settings/ModelConfig.tsx`](https://github.com/Zackriya-Solutions/meetily/blob/main/frontend/src/components/Settings/ModelConfig.tsx)).
2. Enter the **full HTTP URL** of your server's `/v1/chat/completions` route (e.g., `http://localhost:11434/v1/chat/completions` for Ollama).
3. Provide an **API key** only if your server enforces authentication; leave this field blank for open local servers.
4. **Save** the configuration. The values are immediately written to IndexedDB and will be used for the next summary request.

## Technical Implementation Details

### Configuration Storage Layer

The `ConfigService` class in [`frontend/src/services/configService.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/frontend/src/services/configService.ts) handles persistence of your custom endpoint settings. The service exposes `setSummarizerEndpoint(endpoint, apiKey?)` to store values and `getSummarizerConfig()` to retrieve them:

```typescript
// Programmatically configure a custom endpoint (e.g., for Ollama)
ConfigService.setSummarizerEndpoint(
  'http://my-local-ollama:11434/v1/chat/completions',
  ''  // No API key required for local Ollama
);

// Retrieve stored configuration for debugging
const { endpoint, apiKey } = await ConfigService.getSummarizerConfig();
console.log('LLM endpoint:', endpoint, 'API key:', apiKey);

```

### Summary Generation Hook

The [`useSummaryGeneration.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/useSummaryGeneration.ts) hook located at [`frontend/src/hooks/meeting-details/useSummaryGeneration.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/frontend/src/hooks/meeting-details/useSummaryGeneration.ts) reads the stored configuration and constructs the HTTP request. The implementation uses a standard `fetch` call with the OpenAI chat completions format:

```typescript
const payload = {
  model: selectedModel,               // e.g., "llama3"
  messages: [{ role: 'user', content: transcriptText }],
  temperature: 0.7
};

const response = await fetch(endpoint, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    ...(apiKey && { Authorization: `Bearer ${apiKey}` })
  },
  body: JSON.stringify(payload)
});

const result = await response.json();
return result.choices[0].message.content;  // Rendered as meeting summary

```

The hook conditionally adds the `Authorization: Bearer <apiKey>` header only when a key is present, supporting both authenticated and open endpoints.

## Compatible LLM Providers

Because Meetily implements the standard OpenAI API contract, you can configure custom OpenAI‑compatible API endpoints for Meetily summaries using various backends:

- **Ollama**: Run models locally at `http://localhost:11434/v1/chat/completions`
- **Groq**: Use high‑speed inference with Groq's OpenAI‑compatible endpoint
- **LiteLLM**: Proxy multiple providers through a unified OpenAI‑compatible interface
- **Self‑hosted**: Deploy vLLM, Text Generation Inference (TGI), or custom inference servers

## Summary

- Meetily stores custom endpoint configurations in [`frontend/src/services/configService.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/frontend/src/services/configService.ts) and persists them in IndexedDB via [`storageService.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/storageService.ts)
- The `setSummarizerEndpoint(endpoint, apiKey?)` method saves your settings, while [`useSummaryGeneration.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/useSummaryGeneration.ts) retrieves them at runtime
- Requests follow the OpenAI *chat/completions* format, supporting any compatible server without code changes
- Authentication is optional; the system only sends the `Authorization` header when an API key is provided

## Frequently Asked Questions

### What is the exact format for the endpoint URL?

You must provide the full HTTP URL including the path to the chat completions endpoint, typically ending in `/v1/chat/completions`. For example, use `http://localhost:11434/v1/chat/completions` for Ollama or `https://api.groq.com/openai/v1/chat/completions` for Groq.

### Is authentication required for custom endpoints?

Authentication is only required if your specific server enforces it. The [`useSummaryGeneration.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/useSummaryGeneration.ts) hook conditionally adds the `Authorization: Bearer <apiKey>` header based on whether you provided a key via `ConfigService.setSummarizerEndpoint()`. Local servers like Ollama typically require no authentication.

### Where does Meetily store the API key and endpoint configuration?

Meetily persists these values in the browser's **IndexedDB** through the [`storageService.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/storageService.ts) layer, accessed via methods in [`configService.ts`](https://github.com/Zackriya-Solutions/meetily/blob/main/configService.ts). This client‑side storage ensures your configuration remains available across browser sessions without requiring backend changes.

### Can I switch between different providers without restarting the application?

Yes. Because the configuration is read at runtime from IndexedDB for each summary generation request, changes made through the Settings UI or `ConfigService.setSummarizerEndpoint()` take effect immediately. The next meeting summary you generate will use the newly configured endpoint.