# NousResearch/hermes-agent · Object values rendering as \[object Object\] in settings UI

## Open now

- Nothing open on GitHub.

Multiple reports and corresponding fixes for a bug where object/list config values, particularly fallback_providers, are incorrectly rendered as '\[object Object\]' in the web UI settings pages.

## TL;DR

- 5 member(s): 0 open issue(s), 3 closed issue(s), 0 open PR(s), 1 merged PR(s), 1 PR(s) closed without merging.
- A fix was merged to main in PR #10949. Verify it addresses your case.
- **Recommended:** read PR #10949 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `partially_resolved` · deciding PR(s): `pr-10949`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_PARTIAL`): some members are connected by structural evidence (shared changed files, or a closing/superseded reference); the rest are joined by an automated relevance judgement over their text.
- Members outside that structural core may belong to a different underlying problem.
- Pairwise link density `0.31`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #9726: \[Bug\]: Dashboard Config page renders fallback_providers as "\[object Object\]"
- #11190: \[webUI\] fallback_providers list renders as \`\[object Object\]\` in General settings
- #25352: Settings UI: fallback_providers renders as "\[object Object\], \[object Object\]" in General settings

## Prior & competing PRs

- **#10949: fix(web): render object config values structurally**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`; implication `superseded`
  - files: `web/src/components/AutoField.tsx`
  - fix hunks:
  - `web/src/components/AutoField.tsx`

    ```diff
    @@ -17,6 +17,71 @@ function FieldHint({ schema, schemaKey }: { schema: Record<string, unknown>; sch
       );
     }
     
    +function isRecord(value: unknown): value is Record<string, unknown> {
    +  return typeof value === "object" && value !== null && !Array.isArray(value);
    +}
    +
    +function formatScalar(value: unknown): string {
    +  if (value === undefined || value === null) return "";
    +  if (typeof value === "string") return value;
    +  if (typeof value === "number" || typeof value === "boolean") return String(value);
    +  return JSON.stringify(value);
    +}
    +
    +function NestedValueEditor({
    +  fieldKey,
    +  value,
    +  onChange,
    +}: {
    +  fieldKey: string;
    +  value: unknown;
    +  onChange: (v: unknown) => void;
    +}) {
    +  if (isRecord(value)) {
    +    return (
    +      <div className="grid gap-2 border border-border p-2">
    +        {Object.entries(value).map(([subKey, subVal]) => (
    +          <div key={subKey} className="grid gap-1">
    +            <Label className="text-xs text-muted-foreground">{subKey}</Label>
    +            <NestedValueEditor
    +              fieldKey={`${fieldKey}.${subKey}`}
    +              value={subVal}
    +              onChange={(next) => onChange({ ...value, [subKey]: next })}
    +            />
    +          </div>
    +        ))}
    +      </div>
    +    );
    +  }
    +
    +  if (Array.isArray(value)) {
    +    return (
    +      <div className="grid gap-2">
    +        {value.map((item, index) => (
    +          <div key={`${fieldKey}.${index}`} className="grid gap-1">
    +            <Label className="text-xs text-muted-foreground">Item {index + 1}</Label>
    +            <NestedValueEditor
    +              fieldKey={`${fieldKey}.${index}`}
    +              value={item}
    +              onChange={(next) =>
    +                onChange(value.map((existing, i) => (i === index ? next : existing)))
    +              }
    +            />
    +          </div>
    +        ))}
    +      </div>
    +    );
    +  }
    +
    +  return (
    +    <Input
    +      value={formatScalar(value)}
    +      onChange={(e) => onChange(e.target.value)}
    +      className="text-xs"
    +    />
    +  );
    +}
    +
     export function AutoField({
       schemaKey,
       schema,
    ```

    ```diff
    @@ -26,6 +91,16 @@ export function AutoField({
       const rawLabel = schemaKey.split(".").pop() ?? schemaKey;
       const label = rawLabel.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
     
    +  if (isRecord(value) || (Array.isArray(value) && value.some((item) => isRecord(item)))) {
    +    return (
    +      <div className="grid gap-3 border border-border p-3">
    +        <Label className="text-xs font-medium">{label}</Label>
    +        <FieldHint schema={schema} schemaKey={schemaKey} />
    +        <NestedValueEditor fieldKey={schemaKey} value={value} onChange={onChange} />
    +      </div>
    +    );
    +  }
    +
       if (schema.type === "boolean") {
         return (
           <div className="flex items-center justify-between gap-4">
    ```

    ```diff
    @@ -114,26 +189,6 @@ export function AutoField({
         );
       }
     
    -  if (typeof value === "object" && value !== null && !Array.isArray(value)) {
    -    const obj = value as Record<string, unknown>;
    -    return (
    -      <div className="grid gap-3 border border-border p-3">
    -        <Label className="text-xs font-medium">{label}</Label>
    -        <FieldHint schema={schema} schemaKey={schemaKey} />
    -        {Object.entries(obj).map(([subKey, subVal]) => (
    -          <div key={subKey} className="grid gap-1">
    -            <Label className="text-xs text-muted-foreground">{subKey}</Label>
    -            <Input
    -              value={String(subVal ?? "")}
    -              onChange={(e) => onChange({ ...obj, [subKey]: e.target.value })}
    -              className="text-xs"
    -            />
    -          </div>
    -        ))}
    -      </div>
    -    );
    -  }
    -
       return (
         <div className="grid gap-1.5">
           <Label className="text-sm">{label}</Label>
    ```
- **#25376: fix(web): AutoField list type renders objects as \[object Object\]**. closed without merge
  - maintainer direction: category `stale_abandoned`; implication `active`

## Fix status

- Merged to main in PR #10949 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-05-18`.
- Subsystem: `gateway`
