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": "openai/gpt-6-sol",
"messages": [
{"role": "user", "content": "Summarize this deposition in 3 bullet points."}
]
}'
casedev llm:v1:chat create-completion \
--model openai/gpt-6-sol \
--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: 'openai/gpt-6-sol',
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='openai/gpt-6-sol',
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("openai/gpt-6-sol"),
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": "openai/gpt-6-sol",
"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
| Parameter | Type | Description |
|---|---|---|
messages | array | The conversation. Each message has a role and content. |
Optional
| Parameter | Type | Default | Description |
|---|---|---|---|
model | string | casemark/core-large | Which model to use. Browse all models → |
max_tokens | number | 4096 | Maximum tokens to generate |
temperature | number | 1 | Randomness (0-2). Use 0 for factual tasks. |
stream | boolean | false | Stream response token-by-token |
stop | array | null | Stop generation when these strings appear |
Messages
Each message in themessages array:
| Field | Type | Description |
|---|---|---|
role | string | system, user, or assistant |
content | string | The message text |
System prompts
Set the AI’s behavior with a system message:casedev llm:v1:chat create-completion \
--model openai/gpt-6-sol \
--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: 'openai/gpt-6-sol',
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='openai/gpt-6-sol',
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("openai/gpt-6-sol"),
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-6-sol \
--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-6-sol',
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-6-sol',
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-6-sol"),
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 openai/gpt-6-sol \
--message '{role: user, content: "Write a case summary."}' \
--stream
const stream = await client.llm.v1.chat.createCompletion({
model: 'openai/gpt-6-sol',
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='openai/gpt-6-sol',
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("openai/gpt-6-sol"),
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
}
Streaming HTTP failures
When an upstream provider rejects a streaming request before streaming begins, Case.dev returns a non-2xx JSON error instead of opening an SSE stream. The response preserves the upstream HTTP status and includesdata.code: "UPSTREAM_PROVIDER_ERROR" with a generic message.
Check this machine-readable code before interpreting the HTTP status. In
particular, a 401 or 403 carrying UPSTREAM_PROVIDER_ERROR describes an
upstream failure, not an invalid Case.dev API key. Do not automatically revoke
or rotate the caller’s key based on that status alone. Provider response bodies
are not returned. This describes pre-stream failures; failures after SSE has
started follow the stream’s error handling.
Vision
Send images to models that support vision (GPT and Gemini):Typescript
const response = await client.llm.v1.chat.createCompletion({
model: 'openai/gpt-6-sol',
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 openai/gpt-6-luna or google/gemini-3.1-flash-lite for simpler tasks.Common patterns
Deposition summary
casedev llm:v1:chat create-completion \
--model openai/gpt-6-sol \
--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: 'openai/gpt-6-sol',
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='openai/gpt-6-sol',
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("openai/gpt-6-sol"),
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-6-sol \
--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-6-sol',
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-6-sol',
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-6-sol"),
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 openai/gpt-6-astra \
--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: 'openai/gpt-6-astra',
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='openai/gpt-6-astra',
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("openai/gpt-6-astra"),
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)

