Together AI CI Integration

VerifiedSafe

Set up CI/CD for Together AI integrations: unit tests with mocked responses and live API integration tests.

Sby Skills Guide Bot
DevOpsIntermediate
108/29/2026
Claude Code
#together-ai#ci-cd#inference-testing#github-actions#api-mocking

Recommended for

Our review

Sets up a CI/CD pipeline for Together AI integrations, running mocked unit tests on pull requests and live API checks on merge to main.

Strengths

  • Provides a ready-to-use GitHub Actions workflow covering both pull requests and main.
  • Includes comprehensive mock-based unit tests for chat completions and embeddings.
  • Validates live API connectivity and inference with real Together AI models.
  • Leverages Together AI's OpenAI-compatible API for broad model support.

Limitations

  • Tailored to a Node.js/TypeScript stack with GitHub Actions and vitest.
  • Integration tests require a TOGETHER_API_KEY secret and only run on main.
  • Mock data may not always reflect actual API response shapes.
When to use it

When you need dependable CI for Together AI inference, embedding, or fine-tuning integrations.

When not to use it

When you are not using Together AI or need a full deployment pipeline beyond CI validation.

Security analysis

Safe
Quality score85/100

The skill provides CI/CD setup instructions for Together AI, including mock and integration test examples. It uses API keys via GitHub Secrets securely and does not instruct any destructive, exfiltrating, or obfuscated actions.

No concerns found

Examples

Generate Together AI CI workflow
together ci integration: set up the GitHub Actions workflow with mocked unit tests on PRs and live API integration tests on main.
Add mock-based tests
together ci integration: create vitest mocks for the Together AI client covering chat completions, embeddings, and listModels.
Run live inference check
together ci integration: add an integration test that calls the Together AI chat completions endpoint with the TOGETHER_API_KEY secret.

name: together-ci-integration description: 'Together AI ci integration for inference, fine-tuning, and model deployment.

Use when working with Together AI''s OpenAI-compatible API.

Trigger: "together ci integration".

' allowed-tools: Read, Write, Edit, Bash(pip:*), Grep version: 1.0.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io tags:

  • saas
  • ai
  • inference
  • together compatibility: Designed for Claude Code

Together AI CI Integration

Overview

Set up CI/CD for Together AI inference integrations: run unit tests with mocked completion and embedding responses on every PR, validate live API connectivity for model inference on merge to main. Together AI provides an OpenAI-compatible API for 100+ open-source models including Llama, Mixtral, and FLUX, so CI pipelines verify prompt formatting, response parsing, model selection logic, and fine-tuning job management.

GitHub Actions Workflow

# .github/workflows/together-ci.yml
name: Together AI CI
on:
  pull_request:
    paths: ['src/together/**', 'tests/**']
  push:
    branches: [main]

jobs:
  unit-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: npm test -- --reporter=verbose

  integration-tests:
    if: github.ref == 'refs/heads/main'
    needs: unit-tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '20' }
      - run: npm ci
      - run: npm run test:integration
        env:
          TOGETHER_API_KEY: ${{ secrets.TOGETHER_API_KEY }}

Mock-Based Unit Tests

// tests/together-service.test.ts
import { describe, it, expect, vi } from 'vitest';
import { generateCompletion, createEmbedding } from '../src/together-service';

vi.mock('../src/together-client', () => ({
  TogetherClient: vi.fn().mockImplementation(() => ({
    chatCompletion: vi.fn().mockResolvedValue({
      id: 'cmpl_abc123',
      model: 'meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo',
      choices: [{ message: { role: 'assistant', content: 'Hello! How can I help?' }, finish_reason: 'stop' }],
      usage: { prompt_tokens: 12, completion_tokens: 8, total_tokens: 20 },
    }),
    createEmbedding: vi.fn().mockResolvedValue({
      data: [{ embedding: new Array(768).fill(0.01), index: 0 }],
      model: 'togethercomputer/m2-bert-80M-8k-retrieval',
      usage: { total_tokens: 5 },
    }),
    listModels: vi.fn().mockResolvedValue([
      { id: 'meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo', type: 'chat' },
      { id: 'togethercomputer/m2-bert-80M-8k-retrieval', type: 'embedding' },
    ]),
  })),
}));

describe('Together AI Service', () => {
  it('generates a chat completion', async () => {
    const result = await generateCompletion('Hello', { model: 'meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo' });
    expect(result.choices[0].finish_reason).toBe('stop');
    expect(result.usage.total_tokens).toBe(20);
  });

  it('creates embeddings for text', async () => {
    const result = await createEmbedding('test text');
    expect(result.data[0].embedding).toHaveLength(768);
  });
});

Integration Tests

// tests/integration/together.integration.test.ts
import { describe, it, expect } from 'vitest';

const hasKey = !!process.env.TOGETHER_API_KEY;

describe.skipIf(!hasKey)('Together AI Live API', () => {
  it('runs inference via OpenAI-compatible endpoint', async () => {
    const res = await fetch('https://api.together.xyz/v1/chat/completions', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.TOGETHER_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        model: 'meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo',
        messages: [{ role: 'user', content: 'Say hello in one word.' }],
        max_tokens: 10,
      }),
    });
    expect(res.status).toBe(200);
    const body = await res.json();
    expect(body.choices[0].message.content).toBeDefined();
  });
});

Error Handling

| CI Issue | Cause | Fix | |----------|-------|-----| | 401 Unauthorized | Invalid API key | Regenerate at api.together.xyz/settings | | Model not found | Wrong model ID string | Use client.models.list() to get valid IDs | | 429 Rate limit | Too many concurrent requests | Implement exponential backoff with 3 retries | | 500 Server error | Model overloaded or cold start | Retry with backoff; use Turbo variants for faster cold starts | | Embedding dimension mismatch | Wrong model for embeddings | Use m2-bert-80M-8k-retrieval for embeddings, not chat models |

Resources

Next Steps

See related Together AI skills for fine-tuning and batch inference patterns.

Related skills