Skip to content

Commit 4fa409d

Browse files
OyaAIProdclaude
andcommitted
fix: docs URLs, drop stale studio fallback, add changelog + providers doc
Closes #1: correct oya-labs/oya → OyaAIProd/oya URLs in docs; de-link the unverified oya-planner reference in CONTRIBUTING. Closes #2: remove the legacy inline STUDIO_HTML fallback (dead code — the built React Flow SPA ships in dist/studio); `oya dev` now returns a clear build hint when run from source without a build. Closes #3: add CHANGELOG.md (Keep a Changelog) covering v0.1.1–v0.1.7. Closes #4: add a Model Providers docs page (anthropic/openai/google + swapping) and wire it into the sidebar and README. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 0241257 commit 4fa409d

9 files changed

Lines changed: 183 additions & 160 deletions

File tree

CHANGELOG.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Changelog
2+
3+
All notable changes to `oyadotai` and `oyadotai-server` are documented here.
4+
5+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7+
8+
> **How releases work:** CI auto-publishes a patch release of both packages to npm
9+
> on every merge to `main` (see `.github/workflows/ci.yml`), so version numbers
10+
> increment quickly and a release commit follows the change that shipped in it.
11+
> The two packages are versioned together. oya is pre-1.0 — minor versions may
12+
> include breaking changes; they'll be called out here.
13+
14+
## [Unreleased]
15+
16+
### Added
17+
- Markdown rendering in the Studio chat and answer panels (dependency-free
18+
renderer for headings, bold/italic, code, lists, links, blockquotes, and rules).
19+
- Documentation links from the README to the `docs/` guide and concepts pages.
20+
- Community project scaffolding: `CODE_OF_CONDUCT.md`, `SECURITY.md`,
21+
`GOVERNANCE.md`, a pull-request template, and structured issue forms.
22+
- White-paper links and an [oya.ai](https://oya.ai) callout in both READMEs.
23+
24+
### Removed
25+
- The legacy inline `STUDIO_HTML` fallback in the `oya dev` CLI. The built React
26+
Flow Studio SPA ships in the package (`dist/studio`), so the stale vanilla-JS
27+
copy was dead code; running from source without a build now returns a clear
28+
"run `bun run build`" message.
29+
30+
### Fixed
31+
- Corrected `oya-labs/oya``OyaAIProd/oya` GitHub URLs in the docs.
32+
33+
## [0.1.7] — 2026-07-13
34+
35+
### Added
36+
- Studio renders agent responses as Markdown; expanded docs.
37+
38+
## [0.1.6] — 2026-07-13
39+
40+
### Changed
41+
- Oya brand refresh in Studio: ring logo, green (`#2ca01c`) palette, "Oya"
42+
wordmark.
43+
44+
## [0.1.5] — 2026-07-13
45+
46+
### Added
47+
- `bunx oyadotai dev` now serves the full React Flow Studio SPA from the CLI,
48+
shipped inside the package.
49+
50+
## [0.1.4]
51+
52+
### Added
53+
- Rebuilt the Studio/playground on React Flow with a Tailwind theme; added docs.
54+
55+
## [0.1.3]
56+
57+
### Added
58+
- Ship a sample `oya.config.ts` so `bunx oyadotai dev` works out of the box in the
59+
repo.
60+
61+
## [0.1.2]
62+
63+
### Changed
64+
- Readable benchmark output (banner + tables, no elision) and clearer README
65+
benchmark commands.
66+
67+
## [0.1.1]
68+
69+
### Added
70+
- First public release of `oyadotai` (runtime, `Agent`, `createTool`, the
71+
`anthropic` / `openai` / `google` providers, `oyadotai/react` hooks, the
72+
`oya dev` Studio) and `oyadotai-server` (`toSSEResponse` / `toTextResponse`).
73+
74+
[Unreleased]: https://github.com/OyaAIProd/oya/compare/v0.1.7...HEAD
75+
[0.1.7]: https://github.com/OyaAIProd/oya/compare/v0.1.6...v0.1.7
76+
[0.1.6]: https://github.com/OyaAIProd/oya/compare/v0.1.5...v0.1.6
77+
[0.1.5]: https://github.com/OyaAIProd/oya/compare/v0.1.4...v0.1.5
78+
[0.1.4]: https://github.com/OyaAIProd/oya/compare/v0.1.3...v0.1.4
79+
[0.1.3]: https://github.com/OyaAIProd/oya/compare/v0.1.2...v0.1.3
80+
[0.1.2]: https://github.com/OyaAIProd/oya/compare/v0.1.1...v0.1.2
81+
[0.1.1]: https://github.com/OyaAIProd/oya/releases/tag/v0.1.1

CONTRIBUTING.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ make example # the weather example, no network
4949
## The correctness oracle
5050

5151
The core runtime is a TypeScript port of the Python reference implementation
52-
[`oya-planner`](https://github.com/oya-labs). **The test suite under `test/`
53-
mirrors the reference's tests one-for-one** and is the source of truth for runtime
54-
behaviour. If you change the runtime:
52+
(`oya-planner`). **The test suite under `test/` mirrors the reference's tests
53+
one-for-one** and is the source of truth for runtime behaviour. If you change the
54+
runtime:
5555

5656
- keep the mirrored tests green, and
5757
- when you fix a behavioural difference from the reference, add a test that pins

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ Full docs live in [`docs/`](./docs) (served locally with `make docs`):
231231
**Guide**
232232
- [Getting Started](./docs/guide/getting-started.md) — install and write your first agent
233233
- [Creating an Agent](./docs/guide/creating-agents.md) — tools, instructions, and the plan-once model
234+
- [Model Providers](./docs/guide/providers.md) — Anthropic, OpenAI, and Google, and swapping between them
234235
- [Configuring the Sandbox](./docs/guide/sandbox.md) — where and how each tool's `execute` runs
235236
- [Studio](./docs/guide/studio.md) — chat with your agents and watch the plan execute live
236237

docs/.vitepress/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export default defineConfig({
1515
items: [
1616
{ text: "Getting Started", link: "/guide/getting-started" },
1717
{ text: "Creating an Agent", link: "/guide/creating-agents" },
18+
{ text: "Model Providers", link: "/guide/providers" },
1819
{ text: "Configuring the Sandbox", link: "/guide/sandbox" },
1920
{ text: "Studio", link: "/guide/studio" },
2021
],

docs/guide/getting-started.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,6 @@ if (result.ok) {
105105
}
106106
```
107107

108-
See the [runnable example](https://github.com/oya-labs/oya/tree/main/examples) for
108+
See the [runnable example](https://github.com/OyaAIProd/oya/tree/main/packages/core/examples) for
109109
the full SDR follow-up plan, and [Projection Types](/concepts/projection-types)
110110
for the discipline that makes it safe.

docs/guide/providers.md

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Model Providers
2+
3+
An oya `Agent` takes a `model`. oya ships three provider adapters — Anthropic,
4+
OpenAI, and Google — each a small function that returns a `LanguageModel`. They're
5+
interchangeable: the rest of your agent (tools, instructions, `generate` /
6+
`stream`) stays identical no matter which one plans.
7+
8+
Each provider is a separate entry point, so you only pull in what you use:
9+
10+
```ts
11+
import { anthropic } from "oyadotai/anthropic";
12+
import { openai } from "oyadotai/openai";
13+
import { google } from "oyadotai/google";
14+
```
15+
16+
## Anthropic
17+
18+
Reads `ANTHROPIC_API_KEY` from the environment unless you pass `apiKey`.
19+
20+
```ts
21+
import { Agent, createTool } from "oyadotai";
22+
import { anthropic } from "oyadotai/anthropic";
23+
24+
const agent = new Agent({
25+
model: anthropic("claude-haiku-4-5-20251001"),
26+
tools: { get_weather: getWeather },
27+
});
28+
29+
const { text } = await agent.generate("How's the weather in NYC?");
30+
```
31+
32+
## OpenAI
33+
34+
Reads `OPENAI_API_KEY` from the environment unless you pass `apiKey`.
35+
36+
```ts
37+
import { Agent } from "oyadotai";
38+
import { openai } from "oyadotai/openai";
39+
40+
const agent = new Agent({
41+
model: openai("gpt-4o"),
42+
tools: { get_weather: getWeather },
43+
});
44+
```
45+
46+
## Google
47+
48+
Reads `GEMINI_API_KEY` (or `GOOGLE_API_KEY`) from the environment unless you pass
49+
`apiKey`.
50+
51+
```ts
52+
import { Agent } from "oyadotai";
53+
import { google } from "oyadotai/google";
54+
55+
const agent = new Agent({
56+
model: google("gemini-2.5-pro"),
57+
tools: { get_weather: getWeather },
58+
});
59+
```
60+
61+
## Passing the key explicitly
62+
63+
Every provider accepts an options object with `apiKey`, so you don't have to rely
64+
on environment variables — useful in serverless or multi-tenant setups:
65+
66+
```ts
67+
anthropic("claude-haiku-4-5-20251001", { apiKey: process.env.MY_ANTHROPIC_KEY });
68+
openai("gpt-4o", { apiKey: myKey });
69+
google("gemini-2.5-pro", { apiKey: myKey });
70+
```
71+
72+
If no key is found, the provider throws a clear error naming the environment
73+
variable to set.
74+
75+
## Swapping providers
76+
77+
Because the provider is just the `model` value, switching is a one-line change —
78+
your tools, instructions, and the plan-once execution model are unchanged:
79+
80+
```diff
81+
- model: anthropic("claude-haiku-4-5-20251001"),
82+
+ model: openai("gpt-4o"),
83+
```
84+
85+
The model only ever emits the plan; from there the runtime executes the DAG the
86+
same way regardless of which provider planned it. See
87+
[Projection Types](/concepts/projection-types) for what the model does and doesn't
88+
get to see.

docs/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ hero:
1414
link: /concepts/projection-types
1515
- theme: alt
1616
text: GitHub
17-
link: https://github.com/oya-labs/oya
17+
link: https://github.com/OyaAIProd/oya
1818

1919
features:
2020
- title: OPAQUE by default

packages/core/src/cli.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@ import { existsSync } from "node:fs";
99
import { resolve } from "node:path";
1010
import { fileURLToPath, pathToFileURL } from "node:url";
1111

12-
import { STUDIO_HTML } from "./studio-html.js";
13-
1412
type Streamable = { stream: (p: string) => { fullStream: AsyncIterable<unknown> } };
1513

1614
// The built Studio SPA (React Flow UI), emitted next to this file at dist/studio.
@@ -81,13 +79,18 @@ async function dev(argv: string[]) {
8179
const a = (agent && agents[agent]) || agents[names[0]];
8280
return sse(a.stream(prompt).fullStream);
8381
}
84-
// Serve the built Studio SPA; fall back to the inline HTML if it isn't built.
82+
// Serve the built Studio SPA (React Flow UI). It ships in the `oyadotai`
83+
// package under dist/studio, so it's always present for installed users.
8584
const path = url.pathname === "/" || url.pathname.includes("..") ? "/index.html" : url.pathname;
8685
const asset = Bun.file(STUDIO_DIR + path);
8786
if (await asset.exists()) return new Response(asset);
8887
const index = Bun.file(STUDIO_DIR + "/index.html");
8988
if (await index.exists()) return new Response(index, { headers: { "content-type": "text/html; charset=utf-8" } });
90-
return new Response(STUDIO_HTML, { headers: { "content-type": "text/html; charset=utf-8", "cache-control": "no-store" } });
89+
// Only reached when running from source without a build.
90+
return new Response(
91+
"oya Studio isn't built. Run `bun run build` (or `make build`) to emit dist/studio, then restart `oya dev`.",
92+
{ status: 503, headers: { "content-type": "text/plain; charset=utf-8", "cache-control": "no-store" } },
93+
);
9194
};
9295

9396
for (let p = wanted; p < wanted + 10; p++) {

0 commit comments

Comments
 (0)