Skip to main content
This is the core endpoint for all AI-powered features — summarization, extraction, analysis, drafting.
Endpoint
POST /llm/v1/chat/completions
curl -X POST https://api.case.dev/llm/v1/chat/completions \
  -H "Authorization: Bearer sk_case_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-4.5",
    "messages": [
      {"role": "user", "content": "Summarize this deposition in 3 bullet points."}
    ]
  }'
casedev llm:v1:chat create-completion \
  --model anthropic/claude-sonnet-4.5 \
  --message '{role: user, content: "Summarize this deposition in 3 bullet points."}'
import Casedev from 'casedev';

const client = new Casedev({ apiKey: 'sk_case_YOUR_API_KEY' });

const response = await client.llm.v1.chat.createCompletion({
  model: 'anthropic/claude-sonnet-4.5',
  messages: [
    { role: 'user', content: 'Summarize this deposition in 3 bullet points.' }
  ]
});

console.log(response.choices[0].message.content);
import casedev

client = casedev.Casedev(api_key='sk_case_YOUR_API_KEY')

response = client.llm.v1.chat.create_completion(
    model='anthropic/claude-sonnet-4.5',
    messages=[
        {'role': 'user', 'content': 'Summarize this deposition in 3 bullet points.'}
    ]
)

print(response.choices[0].message.content)
resp, _ := client.Llm.V1.Chat.NewCompletion(ctx, casedev.LlmV1ChatNewCompletionParams{
	Model: casedev.F("anthropic/claude-sonnet-4.5"),
	Messages: casedev.F([]casedev.LlmV1ChatNewCompletionParamsMessage{{
		Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleUser),
		Content: casedev.F("Summarize this deposition in 3 bullet points."),
	}}),
})
fmt.Println(resp.Choices[0].Message.Content)
Response
{
  "id": "gen_01K972J7KV4Y0MJZ3SRTA6YYMH",
  "object": "chat.completion",
  "model": "anthropic/claude-sonnet-4.5",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Here are the key points:\n\n• Witness testified that...\n• Documents reviewed include...\n• Timeline established from..."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 245,
    "completion_tokens": 87,
    "total_tokens": 332,
    "cost": 0.000105
  }
}

Parameters

Required

ParameterTypeDescription
messagesarrayThe conversation. Each message has a role and content.

Optional

ParameterTypeDefaultDescription
modelstringcasemark/core-largeWhich model to use. Browse all 195+ models →
max_tokensnumber4096Maximum tokens to generate
temperaturenumber1Randomness (0-2). Use 0 for factual tasks.
streambooleanfalseStream response token-by-token
stoparraynullStop generation when these strings appear

Messages

Each message in the messages array:
FieldTypeDescription
rolestringsystem, user, or assistant
contentstringThe message text

System prompts

Set the AI’s behavior with a system message:
casedev llm:v1:chat create-completion \
  --model anthropic/claude-sonnet-4.5 \
  --message '{role: system, content: "You are a legal assistant. Be concise. Cite case law when relevant."}' \
  --message '{role: user, content: "What are the elements of negligence?"}'
const response = await client.llm.v1.chat.createCompletion({
  model: 'anthropic/claude-sonnet-4.5',
  messages: [
    {
      role: 'system',
      content: 'You are a legal assistant. Be concise. Cite case law when relevant.'
    },
    {
      role: 'user',
      content: 'What are the elements of negligence?'
    }
  ]
});
response = client.llm.v1.chat.create_completion(
    model='anthropic/claude-sonnet-4.5',
    messages=[
        {
            'role': 'system',
            'content': 'You are a legal assistant. Be concise. Cite case law when relevant.'
        },
        {
            'role': 'user',
            'content': 'What are the elements of negligence?'
        }
    ]
)
resp, _ := client.Llm.V1.Chat.NewCompletion(ctx, casedev.LlmV1ChatNewCompletionParams{
	Model: casedev.F("anthropic/claude-sonnet-4.5"),
	Messages: casedev.F([]casedev.LlmV1ChatNewCompletionParamsMessage{
		{
			Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleSystem),
			Content: casedev.F("You are a legal assistant. Be concise. Cite case law when relevant."),
		},
		{
			Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleUser),
			Content: casedev.F("What are the elements of negligence?"),
		},
	}),
})
fmt.Println(resp.Choices[0].Message.Content)

Multi-turn conversations

Include previous messages to maintain context:
casedev llm:v1:chat create-completion \
  --model openai/gpt-4o \
  --message '{role: user, content: "What is a deposition?"}' \
  --message '{role: assistant, content: "A deposition is sworn testimony taken outside of court..."}' \
  --message '{role: user, content: "How long do they typically last?"}'
const response = await client.llm.v1.chat.createCompletion({
  model: 'openai/gpt-4o',
  messages: [
    { role: 'user', content: 'What is a deposition?' },
    { role: 'assistant', content: 'A deposition is sworn testimony taken outside of court...' },
    { role: 'user', content: 'How long do they typically last?' }
  ]
});
response = client.llm.v1.chat.create_completion(
    model='openai/gpt-4o',
    messages=[
        {'role': 'user', 'content': 'What is a deposition?'},
        {'role': 'assistant', 'content': 'A deposition is sworn testimony taken outside of court...'},
        {'role': 'user', 'content': 'How long do they typically last?'}
    ]
)
resp, _ := client.Llm.V1.Chat.NewCompletion(ctx, casedev.LlmV1ChatNewCompletionParams{
	Model: casedev.F("openai/gpt-4o"),
	Messages: casedev.F([]casedev.LlmV1ChatNewCompletionParamsMessage{
		{Role: casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleUser), Content: casedev.F("What is a deposition?")},
		{Role: casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleAssistant), Content: casedev.F("A deposition is sworn testimony taken outside of court...")},
		{Role: casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleUser), Content: casedev.F("How long do they typically last?")},
	}),
})
fmt.Println(resp.Choices[0].Message.Content)

Streaming

Get responses token-by-token as they’re generated:
casedev llm:v1:chat create-completion \
  --model anthropic/claude-sonnet-4.5 \
  --message '{role: user, content: "Write a case summary."}' \
  --stream
const stream = await client.llm.v1.chat.createCompletion({
  model: 'anthropic/claude-sonnet-4.5',
  messages: [{ role: 'user', content: 'Write a case summary.' }],
  stream: true
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content || '');
}
stream = client.llm.v1.chat.create_completion(
    model='anthropic/claude-sonnet-4.5',
    messages=[{'role': 'user', 'content': 'Write a case summary.'}],
    stream=True
)

for chunk in stream:
    print(chunk.choices[0].delta.content or '', end='')
package main

import (
	"context"
	"net/http"

	casedev "github.com/CaseMark/casedev-go"
	"github.com/CaseMark/casedev-go/option"
)

func main() {
	client := casedev.NewClient()

	var httpResp *http.Response
	client.Llm.V1.Chat.NewCompletion(context.TODO(), casedev.LlmV1ChatNewCompletionParams{
		Model: casedev.F("anthropic/claude-sonnet-4.5"),
		Messages: casedev.F([]casedev.LlmV1ChatNewCompletionParamsMessage{{
			Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleUser),
			Content: casedev.F("Write a case summary."),
		}}),
		Stream: casedev.F(true),
	}, option.WithResponseInto(&httpResp))
	// Read httpResp.Body as SSE stream
}

Vision

Send images to models that support vision (Claude, GPT-4o):
Typescript
const response = await client.llm.v1.chat.createCompletion({
  model: 'anthropic/claude-sonnet-4.5',
  messages: [
    {
      role: 'user',
      content: [
        { type: 'text', text: 'What medical equipment is visible in this image?' },
        { type: 'image_url', image_url: { url: 'https://example.com/exhibit-a.jpg' } }
      ]
    }
  ]
});

Usage and costs

Every response includes token counts and cost:
Response
{
  "usage": {
    "prompt_tokens": 1245,
    "completion_tokens": 387,
    "total_tokens": 1632,
    "cost": 0.004896
  }
}
Reduce costs: Use temperature: 0 for factual extraction. Try cheaper models like deepseek/deepseek-chat or qwen/qwen-2.5-72b-instruct for simpler tasks.

Common patterns

Deposition summary

casedev llm:v1:chat create-completion \
  --model anthropic/claude-sonnet-4.5 \
  --message '{role: system, content: "Summarize depositions with: 1. Key admissions 2. Timeline of events 3. Credibility issues 4. Contradictions with other testimony"}' \
  --message '{role: user, content: "<deposition text>"}' \
  --temperature 0.3 \
  --max-tokens 2000
const response = await client.llm.v1.chat.createCompletion({
  model: 'anthropic/claude-sonnet-4.5',
  messages: [
    {
      role: 'system',
      content: `Summarize depositions with:
1. Key admissions
2. Timeline of events
3. Credibility issues
4. Contradictions with other testimony`
    },
    { role: 'user', content: depositionText }
  ],
  temperature: 0.3,
  max_tokens: 2000
});
response = client.llm.v1.chat.create_completion(
    model='anthropic/claude-sonnet-4.5',
    messages=[
        {
            'role': 'system',
            'content': 'Summarize depositions with:\n1. Key admissions\n2. Timeline of events\n3. Credibility issues\n4. Contradictions with other testimony'
        },
        {'role': 'user', 'content': deposition_text}
    ],
    temperature=0.3,
    max_tokens=2000
)
resp, _ := client.Llm.V1.Chat.NewCompletion(ctx, casedev.LlmV1ChatNewCompletionParams{
	Model: casedev.F("anthropic/claude-sonnet-4.5"),
	Messages: casedev.F([]casedev.LlmV1ChatNewCompletionParamsMessage{
		{
			Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleSystem),
			Content: casedev.F("Summarize depositions with:\n1. Key admissions\n2. Timeline of events\n3. Credibility issues\n4. Contradictions with other testimony"),
		},
		{
			Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleUser),
			Content: casedev.F(depositionText),
		},
	}),
	Temperature: casedev.F(0.3),
	MaxTokens:   casedev.F(int64(2000)),
})
fmt.Println(resp.Choices[0].Message.Content)

Contract clause extraction

casedev llm:v1:chat create-completion \
  --model openai/gpt-4o \
  --message '{role: system, content: "Extract all indemnification clauses. Return JSON: [{clause_text, page, party_protected}]"}' \
  --message '{role: user, content: "<contract text>"}' \
  --temperature 0
const response = await client.llm.v1.chat.createCompletion({
  model: 'openai/gpt-4o',
  messages: [
    {
      role: 'system',
      content: 'Extract all indemnification clauses. Return JSON: [{clause_text, page, party_protected}]'
    },
    { role: 'user', content: contractText }
  ],
  temperature: 0
});
response = client.llm.v1.chat.create_completion(
    model='openai/gpt-4o',
    messages=[
        {
            'role': 'system',
            'content': 'Extract all indemnification clauses. Return JSON: [{clause_text, page, party_protected}]'
        },
        {'role': 'user', 'content': contract_text}
    ],
    temperature=0
)
resp, _ := client.Llm.V1.Chat.NewCompletion(ctx, casedev.LlmV1ChatNewCompletionParams{
	Model: casedev.F("openai/gpt-4o"),
	Messages: casedev.F([]casedev.LlmV1ChatNewCompletionParamsMessage{
		{
			Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleSystem),
			Content: casedev.F("Extract all indemnification clauses. Return JSON: [{clause_text, page, party_protected}]"),
		},
		{
			Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleUser),
			Content: casedev.F(contractText),
		},
	}),
	Temperature: casedev.F(0.0),
})
fmt.Println(resp.Choices[0].Message.Content)

Medical record review

casedev llm:v1:chat create-completion \
  --model anthropic/claude-opus-4 \
  --message '{role: system, content: "You are a medical-legal expert. Identify standard-of-care deviations and timeline inconsistencies."}' \
  --message '{role: user, content: "<medical records>"}' \
  --max-tokens 5000
const response = await client.llm.v1.chat.createCompletion({
  model: 'anthropic/claude-opus-4',
  messages: [
    {
      role: 'system',
      content: 'You are a medical-legal expert. Identify standard-of-care deviations and timeline inconsistencies.'
    },
    { role: 'user', content: medicalRecords }
  ],
  max_tokens: 5000
});
response = client.llm.v1.chat.create_completion(
    model='anthropic/claude-opus-4',
    messages=[
        {
            'role': 'system',
            'content': 'You are a medical-legal expert. Identify standard-of-care deviations and timeline inconsistencies.'
        },
        {'role': 'user', 'content': medical_records}
    ],
    max_tokens=5000
)
resp, _ := client.Llm.V1.Chat.NewCompletion(ctx, casedev.LlmV1ChatNewCompletionParams{
	Model: casedev.F("anthropic/claude-opus-4"),
	Messages: casedev.F([]casedev.LlmV1ChatNewCompletionParamsMessage{
		{
			Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleSystem),
			Content: casedev.F("You are a medical-legal expert. Identify standard-of-care deviations and timeline inconsistencies."),
		},
		{
			Role:    casedev.F(casedev.LlmV1ChatNewCompletionParamsMessagesRoleUser),
			Content: casedev.F(medicalRecords),
		},
	}),
	MaxTokens: casedev.F(int64(5000)),
})
fmt.Println(resp.Choices[0].Message.Content)