Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .github/workflows/check-org-profile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Check org profile

on:
schedule:
- cron: "0 9 * * 1" # Monday 09:00 UTC
workflow_dispatch:
pull_request:
paths:
- "profile/**"
- "scripts/check-org-profile.sh"
- ".github/workflows/check-org-profile.yml"

permissions:
contents: read

jobs:
check:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v7
- name: Check links, endpoints and model count in profile/README.md
run: bash scripts/check-org-profile.sh profile/README.md
70 changes: 33 additions & 37 deletions profile/README.md
Original file line number Diff line number Diff line change
@@ -1,60 +1,56 @@
<div align="center">
<img src="https://kymaapi.com/logo.png" alt="Kyma" width="92" />
<img src="https://kymaapi.com/logo.png" alt="Kyma API" width="88" />

<h1>Kyma</h1>
<h1>Kyma API</h1>

<p><strong>One API, one coding agent, one local workspace.</strong></p>
<p><strong>Kyma API gives your app one key for 100+ models across chat, embeddings, image, and audio, with published prices and measured uptime for every model.</strong></p>

<p>
Hosted model access, the <code>kyma</code> CLI, and the <code>kyma-ter</code> workspace built to work together.
</p>

<p>
<a href="https://kymaapi.com">Website</a>
·
<a href="https://docs.kymaapi.com">Docs</a>
·
<a href="https://kymaapi.com/ter">Kyma Ter</a>
·
<a href="https://docs.kymaapi.com/guides/windows-setup">Windows Setup</a>
·
<a href="https://github.com/kyma-api/kyma-ter-releases/releases">Releases</a>
<a href="https://kymaapi.com">Website</a> ·
<a href="https://docs.kymaapi.com">Docs</a> ·
<a href="https://kymaapi.com/pricing">Pricing</a> ·
<a href="https://kymaapi.com/rankings">Rankings</a> ·
<a href="https://kymaapi.com/status">Status</a>
</p>
</div>

---

## Install
## Quickstart

```bash
npm install -g @kyma-api/agent
Keep the OpenAI SDK you already use and change the base URL and key:

```python
from openai import OpenAI
client = OpenAI(base_url="https://kymaapi.com/v1", api_key="YOUR_KYMA_KEY")
print(client.chat.completions.create(model="qwen-3.6-plus", messages=[{"role": "user", "content": "Hello!"}]).choices[0].message.content)
```

This installs:
With the Anthropic SDK, set `base_url` to `https://kymaapi.com` and call `messages.create` as usual. New accounts get $0.50 of free credit with no card required, and it can be spent on the free-tier models. More setup options are in the [docs quickstart](https://docs.kymaapi.com/quickstart).

- `kyma`
- `kyma-ter`
## What you get

## Products
- One API key and one balance for every model.
- A published price for each model, listed on [Pricing](https://kymaapi.com/pricing).
- Uptime measured for each model, published on [Status](https://kymaapi.com/status).
- Public model rankings built from real customer usage, on [Rankings](https://kymaapi.com/rankings).
- If a model's route fails, requests fall back automatically.

| Product | What it does |
| --- | --- |
| **Kyma API** | Hosted model gateway, account, balance, and docs. |
| **Kyma Agent** | The `kyma` coding CLI for direct terminal workflows. |
| **Kyma Ter** | The local browser workspace for parallel agent and shell sessions. |
## Use it from the tools you already have

Kyma API works with OpenClaw, Cursor, Claude Code, Cline, Roo Code, Continue, Aider, OpenCode, and other OpenAI- or Anthropic-compatible clients.

- **MCP:** connect any MCP client to `https://mcp.kymaapi.com/mcp`. You sign in with OAuth, and each connection has a spend cap you set.
- **Agent Skills:** run `npx skills add kyma-api/kyma-skills` to add four skills to your agent: connect a tool, pick a model by price and uptime, check spend and credits, and send a test completion.

## Repositories

| Repository | What it contains |
| --- | --- |
| [`kyma-api`](https://github.com/kyma-api/kyma-api) | Website, docs, and the `@kyma-api/agent` package. |
| [`kyma-ter`](https://github.com/kyma-api/kyma-ter) | The local multi-agent terminal workspace runtime. |
| [`kyma-ter-releases`](https://github.com/kyma-api/kyma-ter-releases) | Public release assets for `kyma-ter` binaries. |
| [`kyma-mcp-plugin`](https://github.com/kyma-api/kyma-mcp-plugin) | The MCP server guide, the stdio bridge, and plugin manifests for coding agents. |
| [`kyma-skills`](https://github.com/kyma-api/kyma-skills) | Agent Skills: `connect-my-tool`, `pick-a-model`, `check-spend-and-credits`, `send-a-test-completion`. |
| [`openclaw-provider`](https://github.com/kyma-api/openclaw-provider) | The plugin that adds Kyma API models to OpenClaw. |

## Platform
---

| Platform | Status |
| --- | --- |
| macOS | Supported |
| Linux | Supported |
| Windows | `kyma` supported, `kyma-ter` beta, best with WSL2 for shell panes |
<p align="center"><sub>Questions: <a href="mailto:hello@kymaapi.com">hello@kymaapi.com</a></sub></p>
43 changes: 43 additions & 0 deletions scripts/check-org-profile.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#!/usr/bin/env bash
# Fails when profile/README.md drifts from live facts. Read-only: it never edits a file.
# Usage: scripts/check-org-profile.sh [path/to/README.md]
set -uo pipefail

readme="${1:-profile/README.md}"
models_url="https://api.kymaapi.com/v1/models"
ua="kyma-org-profile-check (+https://github.com/kyma-api/.github)"
fail=0
status() { curl -sL -A "$ua" -o /dev/null -m 20 --retry 2 -w '%{http_code}' "$1"; }

# Rule 1: every link a reader clicks or loads (href, src, markdown link) ends below 400 after redirects.
links=$(grep -oE '(href="|src="|\]\()https://[^")[:space:]]+' "$readme" | sed -E 's/^(href="|src="|\]\()//' | sort -u)
for url in $links; do
code=$(status "$url")
if [ "$code" = "000" ] || [ "$code" -ge 400 ]; then echo "FAIL link $url -> HTTP $code"; fail=1
else echo "ok link $url -> HTTP $code"; fi
done

# Rule 2: any other https URL is an API endpoint shown in code. A bare GET may answer 401 or 404,
# so it only has to answer at all: no connection or HTTP 5xx fails.
endpoints=$(grep -oE 'https://[^"'\''`)<>[:space:]]+' "$readme" | sort -u | grep -vxF -f <(printf '%s\n' "$links") || true)
for url in $endpoints; do
code=$(status "$url")
if [ "$code" = "000" ] || [ "$code" -ge 500 ]; then echo "FAIL endpoint $url -> HTTP $code"; fail=1
else echo "ok endpoint $url -> HTTP $code"; fi
done

# Rule 3: model-count claims match the live catalogue. "N+ models" needs at least N; "N models" needs exactly N.
count=$(curl -s -A "$ua" -m 20 --retry 2 "$models_url" | jq -r '.data | length' 2>/dev/null)
if ! [[ "$count" =~ ^[0-9]+$ ]]; then
echo "FAIL could not read the live model count from $models_url"; fail=1
else
while read -r claim; do
n="${claim%%[+ ]*}"
if [[ "$claim" == *+* ]]; then [ "$count" -ge "$n" ]; else [ "$count" -eq "$n" ]; fi
if [ $? -eq 0 ]; then echo "ok \"$claim\" (live count $count)"
else echo "FAIL README says \"$claim\" but the live count is $count"; fail=1; fi
done < <(grep -oE '[0-9]+\+? models' "$readme" | sort -u)
fi

if [ "$fail" -eq 0 ]; then echo "org profile check: passed"; else echo "org profile check: FAILED"; fi
exit "$fail"