> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kymaapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cloudflare Workers

> Deploy a Kyma-powered AI API on Cloudflare Workers.

## Setup

Create a new Cloudflare Worker project:

```bash theme={null}
npm create cloudflare@latest kyma-worker
cd kyma-worker
```

## Worker Code

<CodeGroup>
  ```typescript src/index.ts theme={null}
  import OpenAI from "openai";

  export default {
    async fetch(request: Request, env: any): Promise<Response> {
      if (request.method !== "POST") {
        return new Response("POST /chat with { message, model? }", { status: 405 });
      }

      const client = new OpenAI({
        baseURL: "https://kymaapi.com/v1",
        apiKey: env.KYMA_API_KEY,
      });

      const { message, model } = (await request.json()) as any;

      const response = await client.chat.completions.create({
        model: model || "qwen-3.6-plus",
        messages: [{ role: "user", content: message }],
      });

      return new Response(
        JSON.stringify({ reply: response.choices[0].message.content }),
        { headers: { "Content-Type": "application/json" } }
      );
    },
  };
  ```

  ```toml wrangler.toml theme={null}
  name = "kyma-worker"
  main = "src/index.ts"
  compatibility_date = "2024-01-01"
  ```
</CodeGroup>

## Add Your API Key

```bash theme={null}
npx wrangler secret put KYMA_API_KEY
# Paste your Kyma API key from https://kymaapi.com
```

## Deploy

```bash theme={null}
npx wrangler deploy
```

Your AI API is now live at `https://kyma-worker.<your-subdomain>.workers.dev`.

## Test It

```bash theme={null}
curl -X POST https://kyma-worker.<your-subdomain>.workers.dev \
  -H "Content-Type: application/json" \
  -d '{"message": "Hello!", "model": "qwen-3.6-plus"}'
```

## Streaming

For streaming responses, pass through the SSE stream directly:

```typescript theme={null}
const response = await client.chat.completions.create({
  model: model || "qwen-3.6-plus",
  messages: [{ role: "user", content: message }],
  stream: true,
});

return new Response(response.toReadableStream(), {
  headers: { "Content-Type": "text/event-stream" },
});
```

<Tip>
  Cloudflare Workers have a 30-second CPU time limit. For long responses, use streaming to avoid timeouts.
</Tip>
