> ## Documentation Index
> Fetch the complete documentation index at: https://praison.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Parity Notices

> Which TypeScript SDK options are accepted for Python parity but not yet acted on

Some TypeScript SDK options are accepted for Python-SDK parity but are not yet acted on; when you pass one, the SDK tells you so it's never silently dropped.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
graph LR
    subgraph "Parity Notice"
        A[📝 new Agent option] --> B{🔍 In ledger?}
        B -->|Yes| C[⚠️ notYetHonoured notice]
        B -->|No| D[✅ Acted on]
    end

    classDef input fill:#8B0000,stroke:#7C90A0,color:#fff
    classDef check fill:#F59E0B,stroke:#7C90A0,color:#fff
    classDef notice fill:#189AB4,stroke:#7C90A0,color:#fff
    classDef acted fill:#10B981,stroke:#7C90A0,color:#fff

    class A input
    class B check
    class C notice
    class D acted
```

## Quick Start

<Steps>
  <Step title="See the notice fire">
    ```typescript theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    import { Task } from 'praisonai';

    const task = new Task({
      name: 'Research',
      description: 'Research a topic',
      memory: true,   // accepted for parity, not yet honoured on Task
    });
    // console: [praisonai] Task: option "memory" is accepted for parity
    // with the Python SDK but is not yet honoured in TypeScript.
    ```

    As of PR #4841 every `Agent` constructor and `Agent.chat` option is honoured — see the [Agent](/docs/docs/js/agent) page — and PR #4836 honoured all eight `Handoff` options. The notice above now fires only for the surfaces still in the queue below.
  </Step>

  <Step title="Silence the notices">
    Set `PRAISONAI_PARITY_SILENT=1` for the process (useful in tests) to mute every parity notice.

    ```bash theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    PRAISONAI_PARITY_SILENT=1 node app.js
    ```
  </Step>
</Steps>

***

## How It Works

Each surface consults the `UNHONOURED_OPTIONS` ledger when it is constructed, and warns once per `(surface, option)` pair if you pass a listed option with a non-default value.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
sequenceDiagram
    participant User
    participant Surface as Agent / Task / Handoff
    participant Ledger as UNHONOURED_OPTIONS

    User->>Surface: new Agent({ reflection: true })
    Surface->>Ledger: unhonouredFor('Agent.__init__')
    Ledger-->>Surface: [..., 'reflection', ...]
    Surface-->>User: [praisonai] … not yet honoured (once per pair)
```

| Concept          | Meaning                                                                           |
| ---------------- | --------------------------------------------------------------------------------- |
| Accepted         | The option is typed and takes a value, so Python examples copy-paste.             |
| Not yet honoured | The TypeScript behaviour behind the option isn't ported yet.                      |
| Notice           | A one-time `console.warn` per `(surface, option)` so nothing is dropped silently. |

***

## The Remaining Surfaces

These options are accepted for Python-SDK parity but not yet acted on. Pass any with a non-default value and the SDK emits a notice.

| Surface              | Count  | Options                                                                                                                                                                                                                                                                                                                                                                                                                  |
| -------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `AgentTeam.__init__` | 8      | `autonomy`, `knowledge`, `guardrails`, `web`, `reflection`, `caching`, `learn`, `toolsRunOn`                                                                                                                                                                                                                                                                                                                             |
| `Task.__init__`      | 32     | `asyncExecution`, `config`, `outputPydantic`, `images`, `nextTasks`, `condition`, `isStart`, `loopState`, `memory`, `inputFile`, `rerun`, `retainFullContext`, `agentConfig`, `skipOnFailure`, `retryDelay`, `handler`, `loopOver`, `loopVar`, `execution`, `routing`, `outputConfig`, `when`, `thenTask`, `elseTask`, `autonomy`, `knowledge`, `web`, `reflection`, `planning`, `hooks`, `caching`, `failOnMemoryError` |
| **Total**            | **40** |                                                                                                                                                                                                                                                                                                                                                                                                                          |

Plus **partial** options that work for some inputs and announce themselves for the rest:

| Surface        | Option                | Honoured when                                                                                                  |
| -------------- | --------------------- | -------------------------------------------------------------------------------------------------------------- |
| `Agent`        | `context`             | some inputs                                                                                                    |
| `Agent`        | `guardrails`          | some inputs                                                                                                    |
| `Agent`        | `knowledge`           | some inputs                                                                                                    |
| `Agent`        | `memory`              | some inputs                                                                                                    |
| `Agent`        | `reasoningEffort`     | some inputs                                                                                                    |
| `Agent`        | `web`                 | some inputs                                                                                                    |
| `Agent`        | `toolConfig.parallel` | forwarded as `parallel_tool_calls` on the OpenAI-compatible backend; the AI SDK backend still emits a notice   |
| `Agent.chat`   | `attachments`         | honoured on the OpenAI-compatible backend; the AI SDK backend emits a "not yet honoured" notice for multimodal |
| `Agent.chat`   | `outputPydantic`      | some inputs                                                                                                    |
| `Agent.chat`   | `seed`                | some inputs                                                                                                    |
| `AgentTeam`    | `context`             | some inputs                                                                                                    |
| `AgentTeam`    | `execution`           | some inputs                                                                                                    |
| `AgentTeam`    | `hooks`               | some inputs                                                                                                    |
| `AgentTeam`    | `memory`              | some inputs                                                                                                    |
| `AgentTeam`    | `planning`            | some inputs                                                                                                    |
| `ChromaMemory` | `ragDbPath`           | some inputs                                                                                                    |
| `Task`         | `guardrails`          | some inputs                                                                                                    |

<Note>
  Counts current as of PR #4836 (2026-09-06), which honoured all eight `Handoff` options (`contextPolicy`, `maxContextTokens`, `maxContextMessages`, `preserveSystem`, `timeoutSeconds`, `maxConcurrent`, `detectCycles`, `maxDepth`), dropping the total 48 → 40 and removing the `Handoff` surface entirely — see [Handoffs](/docs/docs/js/handoffs). PR #4841 (2026-09-05) honoured all **21** `Agent` options (`Agent.__init__` 15 → 0, `Agent.chat` 6 → 0, total 69 → 48). Those options now do what they promise — and some of them **throw** on a typo. See [Agent](/docs/docs/js/agent) for examples and the exact error strings. PR [#4837](https://github.com/MervinPraison/PraisonAI/pull/4837) honoured seven `AgentTeam` options (`AgentTeam.__init__` 15 → 8, total 76 → 69). PR [#4838](https://github.com/MervinPraison/PraisonAI/pull/4838) landed the Task engine implementing 28 of the 32 `Task.__init__` options, but the ledger above is unchanged: the engine has no call sites yet, so the options still emit notices until a future PR wires the team runner in. The four that stay open on merit — `autonomy`, `web`, `reflection`, `planning` — have no reference behaviour in Python to port. The list is a downward ratchet, so it will shrink over time. The live list is [`BEHAVIOUR_PARITY.md`](https://github.com/MervinPraison/PraisonAI/blob/main/src/praisonai-ts/BEHAVIOUR_PARITY.md); the ledger is [`parity-notice.ts`](https://github.com/MervinPraison/PraisonAI/blob/main/src/praisonai-ts/src/utils/parity-notice.ts). PR [#4880](https://github.com/MervinPraison/PraisonAI/pull/4880) hardened the parity checkers so a green report now requires the checker to have actually evaluated the row — see the changelog note below.
</Note>

<Warning>
  `runOn` on `AgentTeam` is not just unhonoured — it **throws a `TypeError` at construction**. This differs from the silent-notice pattern above: `runOn` hands one agent's whole loop to a managed runtime, and a team orchestrates several agents locally, so there is no single loop to hand over. Put `runOn` on an individual `Agent` instead.
</Warning>

***

## Different defaults, same option

The same `Agent(output=…)` code is silent in Python and verbose in TypeScript because the two SDKs resolve different defaults for an option that both honour.

```mermaid theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
graph LR
    A[📝 Agent output=…] --> B{⚙️ Which SDK resolves it?}
    B -->|Python| C[🟢 verbose: false<br/>markdown: false<br/>stream: false]
    B -->|TypeScript| D[🔵 markdown: true<br/>stream: true<br/>verbose: PRAISON_VERBOSE]

    classDef input fill:#8B0000,stroke:#7C90A0,color:#fff
    classDef resolver fill:#F59E0B,stroke:#7C90A0,color:#fff
    classDef python fill:#10B981,stroke:#7C90A0,color:#fff
    classDef typescript fill:#189AB4,stroke:#7C90A0,color:#fff

    class A input
    class B resolver
    class C python
    class D typescript
```

The option *is* honoured on both sides, so this is not a "not yet honoured" surface — only the default differs when you leave it unset.

| Option     | Python default | TypeScript default                                          | Effect if unset                                          |
| ---------- | -------------- | ----------------------------------------------------------- | -------------------------------------------------------- |
| `verbose`  | `False`        | `PRAISON_VERBOSE` env var (verbose unless set to `"false"`) | Python quiet; TS verbose unless the env var is `"false"` |
| `markdown` | `False`        | `true`                                                      | Python returns plain text; TS renders markdown           |
| `stream`   | `False`        | `true`                                                      | Python returns the full string; TS streams tokens        |

<Tabs>
  <Tab title="Python">
    ```python theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    from praisonaiagents import Agent

    agent = Agent(instructions="You are helpful")
    print(agent.start("Say hi"))
    # Silent: no verbose logs, plain text returned, full string at once
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    import { Agent } from 'praisonai';

    const agent = new Agent({ instructions: 'You are helpful' });
    await agent.start('Say hi');
    // Verbose logs, markdown-formatted, tokens streamed as they arrive
    ```
  </Tab>
</Tabs>

To make TypeScript behave like Python's silent default, set the three fields explicitly:

```typescript theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
import { Agent } from 'praisonai';

const agent = new Agent({
  instructions: 'You are helpful',
  output: { verbose: false, markdown: false, stream: false },
});
```

<Note>
  The defaults are intentionally left as-is. In the words of the parity work that surfaced this: aligning defaults is a product decision, not a quiet edit — so the split is stable until a product-level decision changes it.
</Note>

***

## Best Practices

<AccordionGroup>
  <Accordion title="An option in this list didn't do anything — why?">
    It's accepted for API compatibility with the Python SDK, but the TypeScript behaviour behind it hasn't been implemented yet. Watch the console for a `[praisonai] … not yet honoured` notice at startup.
  </Accordion>

  <Accordion title="How do I silence the notices?">
    Set the environment variable `PRAISONAI_PARITY_SILENT=1` (or `PRAISONAI_PARITY_SILENT=true`) for the process. This is what test suites use to keep output clean.
  </Accordion>

  <Accordion title="How do I know if a specific option works?">
    Pass it. If you see no notice at startup, it's honoured. Otherwise check [`BEHAVIOUR_PARITY.md`](https://github.com/MervinPraison/PraisonAI/blob/main/src/praisonai-ts/BEHAVIOUR_PARITY.md) on `main` for the current list.
  </Accordion>

  <Accordion title="How can I help close a row?">
    Implement the behaviour, delete the option's entry from the ledger, add a test that proves the option changes what the code does, and regenerate. See [`_dev/parity/README.md`](https://github.com/MervinPraison/PraisonAI/blob/main/src/praisonai/praisonai/_dev/parity/README.md) in the SDK repo.

    If you add a waiver in [`signatures/waivers.yaml`](https://github.com/MervinPraison/PraisonAI/blob/main/src/praisonai/praisonai/_dev/parity/signatures/waivers.yaml), scope it with a `kinds:` list (e.g. `kinds: [default]`). A waiver is keyed by parameter, so an unscoped one waiving a default difference also silenced a required-ness change on the same parameter — waivers now take an optional `kinds`, and required-ness is never covered implicitly.

    A green checker report is no longer proof on its own. The checkers previously had eleven blind spots — flattened parameters that were matched but not checked, unrecognised TypeScript default forms silently matching Python's `None`, and `ts_only` required members that were rendered but not evaluated — and PR [#4880](https://github.com/MervinPraison/PraisonAI/pull/4880) closed them, so a clean run now genuinely means the row was inspected. Do not treat pre-#4880 green results as evidence.
  </Accordion>
</AccordionGroup>

***

## Related

<CardGroup cols={2}>
  <Card title="Agent" icon="robot" href="/docs/docs/js/agent">
    TypeScript Agent class — `Agent.__init__` and `Agent.chat` options.
  </Card>

  <Card title="Agent Team" icon="users" href="/docs/docs/js/agent-team">
    Multi-agent teams — `AgentTeam.__init__` options.
  </Card>

  <Card title="Handoffs" icon="right-left" href="/docs/docs/js/handoffs">
    Agent handoffs — `Handoff` options.
  </Card>

  <Card title="Tasks" icon="list-check" href="/docs/docs/js/tasks">
    Task definitions — `Task.__init__` options.
  </Card>
</CardGroup>
