Files
langsmith-java/langsmith-java-core
Jacob Lee 13b36e3f11 feat: Adds attachment support to Java multipart requests (#33)
Adds multipart run attachment support to the Java SDK.

- Added `RunAttachment` for binary run attachments.
- Added per-run attachments on `Run`.
- Added direct multipart ingest APIs:
  - `client.runs().multipartIngest(createRuns, updateRuns)`
  - async/raw response variants
- Multipart serialization now sends:
  - run payloads as `post.{runId}` / `patch.{runId}`
  - large fields separately, e.g. `post.{runId}.inputs`
  - attachments as `attachment.{runId}.{attachmentName}`
- `InputStream` attachments are treated as non-repeatable so retry
behavior is safe.

Java:
```java
import com.langchain.smith.client.okhttp.LangsmithOkHttpClient;
import com.langchain.smith.models.runs.Run;
import com.langchain.smith.models.runs.RunAttachment;

import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.UUID;

public class MultipartRunAttachmentExample {
    public static void main(String[] args) {
        var client = LangsmithOkHttpClient.builder()
            .apiKey(System.getenv("LANGSMITH_API_KEY"))
            .build();

        var runId = UUID.randomUUID().toString();

        var run = Run.builder()
            .id(runId)
            .traceId(runId)
            .dottedOrder("20250101T000000000Z" + runId)
            .name("run-with-attachment")
            .runType(Run.RunType.CHAIN)
            .putAttachment(
                "input-file",
                RunAttachment.of(
                    "text/plain",
                    "hello from an attachment".getBytes(StandardCharsets.UTF_8)
                )
            )
            .build();

        client.runs().multipartIngest(List.of(run), List.of());

        client.close();
    }
}
```

Kotlin:

```kotlin
var runId = UUID.randomUUID().toString();

var run = Run.builder()
    .id(runId)
    .traceId(runId)
    .dottedOrder("20250101T000000000Z" + runId)
    .name("run-with-attachment")
    .runType(Run.RunType.CHAIN)
    .putAttachment(
        "input-file",
        RunAttachment.of(
            "text/plain",
            "hello from an attachment".getBytes(StandardCharsets.UTF_8)
        )
    )
    .build();

client.runs().multipartIngest(List.of(run), List.of());
```
2026-07-07 15:56:59 -07:00
..