Simple, unified interface to multiple Generative AI providers
This report summarizes scanner evidence for andrewyng/aisuite, a Python project with 16,321 GitHub stars. SynthScan examined 137,123 lines of code across 669 source files, recording 2260 pattern matches distributed across 21 syntactic categories. The legacy adjusted pattern signal is 22.3 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 1388 finding(s).
Are imports declared and package/API names verified? 529 finding(s).
Are wrappers, guards, and repeated structures necessary? 1570 finding(s).
Which changes need focused human review? 2260 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 2260 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite/provider.py | 46 | def chat_completions_create_stream(self, model, messages, **kwargs): | CODE |
| LOW | aisuite/provider.py | 58 | async def achat_completions_create_stream(self, model, messages, **kwargs): | CODE |
| LOW | aisuite/client.py | 219 | def _extract_thinking_content(self, response): | CODE |
| LOW | aisuite/client.py | 290 | def _finalize_runner_response( | CODE |
| LOW | aisuite/tracing/viewer.py | 546 | def prepare_viewer_run_summaries(runs: list[dict[str, Any]]) -> list[dict[str, Any]]: | STRING |
| LOW⚡ | aisuite/providers/openai_provider.py | 68 | def chat_completions_create_stream(self, model, messages, **kwargs): | CODE |
| LOW⚡ | aisuite/providers/openai_provider.py | 82 | async def achat_completions_create_stream(self, model, messages, **kwargs): | CODE |
| LOW | aisuite/providers/huggingface_provider.py | 239 | def _parse_huggingface_response( | CODE |
| LOW | aisuite/providers/anthropic_provider.py | 224 | def _create_tool_result_message(self, tool_call_id, content): | CODE |
| LOW | aisuite/providers/anthropic_provider.py | 237 | def _create_assistant_tool_message(self, content, tool_calls): | CODE |
| LOW | aisuite/providers/anthropic_provider.py | 315 | def convert_response_with_tool_use(self, response): | CODE |
| LOW | aisuite/providers/anthropic_provider.py | 387 | def chat_completions_create_stream(self, model, messages, **kwargs): | CODE |
| LOW | aisuite/providers/anthropic_provider.py | 405 | async def achat_completions_create_stream(self, model, messages, **kwargs): | CODE |
| LOW⚡ | aisuite/providers/google_provider.py | 38 | def convert_user_role_message(message: Dict[str, Any]) -> Content: | CODE |
| LOW⚡ | aisuite/providers/google_provider.py | 44 | def convert_assistant_role_message(message: Dict[str, Any]) -> Content: | CODE |
| LOW | aisuite/providers/google_provider.py | 73 | def convert_tool_role_message(message: Dict[str, Any]) -> Part: | CODE |
| LOW | aisuite/providers/google_provider.py | 462 | def _build_recognition_config( | CODE |
| LOW | aisuite/providers/google_provider.py | 489 | def _create_streaming_requests( | CODE |
| LOW | aisuite/providers/aws_provider.py | 80 | def convert_response_tool_call( | CODE |
| LOW | aisuite/providers/gemini_provider.py | 409 | def chat_completions_create_stream(self, model, messages, **kwargs): | CODE |
| LOW | aisuite/providers/gemini_provider.py | 419 | async def achat_completions_create_stream(self, model, messages, **kwargs): | CODE |
| LOW | aisuite/agents/postgres_state_store.py | 543 | def _state_payload_without_messages(state: RunState) -> dict[str, Any]: | CODE |
| LOW | aisuite/agents/postgres_state_store.py | 585 | def _replace_ordered_subsequence( | CODE |
| LOW | aisuite/agents/postgres_state_store.py | 598 | def _shared_message_prefix_length( | CODE |
| LOW | aisuite/agents/utils.py | 70 | def extract_response_messages( | CODE |
| LOW | aisuite/agents/artifacts.py | 86 | def collect_artifactized_fields(value: Any) -> list[dict[str, Any]]: | CODE |
| LOW | aisuite/agents/artifacts.py | 208 | def _collect_artifactized_fields(value: Any, refs: list[dict[str, Any]]) -> None: | CODE |
| LOW | aisuite/toolkits/shell.py | 123 | def _validate_no_shell_syntax(self, command: str) -> None: | CODE |
| LOW | aisuite/toolkits/shell.py | 141 | def _looks_like_shell_operator(self, token: str) -> bool: | CODE |
| LOW | aisuite/utils/tools.py | 75 | def _artifactized_trace_value(self, value: Any) -> tuple[Any, list[dict[str, Any]]]: | CODE |
| LOW | aisuite/utils/tools.py | 150 | def _resolve_local_json_schema_ref(ref: str, definitions: Dict[str, Any]): | CODE |
| LOW | aisuite/utils/tools.py | 157 | def _flatten_nullable_json_schema(schema: Dict[str, Any]) -> Dict[str, Any]: | CODE |
| LOW | aisuite/utils/tools.py | 199 | def __extract_param_descriptions(self, func: Callable) -> dict[str, str]: | CODE |
| LOW | aisuite/utils/tools.py | 217 | def _convert_mcp_schema_to_tool_spec(self, func: Callable) -> Dict[str, Any]: | CODE |
| LOW | aisuite/utils/tools.py | 238 | def _create_pydantic_model_from_mcp_schema(self, func: Callable) -> Type[BaseModel]: | CODE |
| LOW | aisuite/utils/tools.py | 323 | def __convert_to_openai_format(self) -> list: | CODE |
| LOW | aisuite/mcp/schema_converter.py | 12 | def json_schema_to_python_type(schema: Dict[str, Any]) -> type: | CODE |
| LOW | aisuite/mcp/schema_converter.py | 60 | def mcp_schema_to_annotations(input_schema: Dict[str, Any]) -> Dict[str, type]: | CODE |
| LOW | aisuite/mcp/schema_converter.py | 107 | def create_function_signature( | CODE |
| LOW | aisuite/mcp/schema_converter.py | 158 | def extract_parameter_descriptions(input_schema: Dict[str, Any]) -> Dict[str, str]: | CODE |
| LOW | openworker-archive/tests/test_model_errors.py | 12 | def test_new_flagships_in_matrix_with_labels(): | CODE |
| LOW | openworker-archive/tests/test_model_errors.py | 26 | def test_flagships_are_the_defaults(): | CODE |
| LOW | openworker-archive/tests/test_model_errors.py | 33 | def test_no_access_errors_are_translated(): | CODE |
| LOW | openworker-archive/tests/test_model_errors.py | 51 | def test_quota_errors_are_translated(): | CODE |
| LOW | openworker-archive/tests/test_model_errors.py | 67 | def test_unrelated_errors_pass_through_raw(): | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 48 | def test_legacy_private_app_default_migrates_to_one_portal(secrets): | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 65 | def test_managed_portals_list_with_access_and_sandbox(secrets): | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 81 | def test_default_repoints_on_disconnect(secrets): | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 113 | def test_tools_pick_the_requested_portal_by_id_or_name(secrets, monkeypatch): | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 136 | def test_hidden_fields_stripped_from_search_and_get(secrets, monkeypatch): | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 167 | def test_no_delete_tool_exists(secrets): | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 179 | def test_write_tools_carry_portal_and_no_stripping_needed(secrets, monkeypatch): | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 203 | def test_managed_callback_lands_in_portal_profile(client): | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 235 | def test_portal_routes_default_and_disconnect(client, monkeypatch): | CODE |
| LOW | openworker-archive/tests/test_web_search.py | 40 | def test_tool_returns_results(): | CODE |
| LOW | openworker-archive/tests/test_web_search.py | 52 | def test_tool_clamps_max_results(): | CODE |
| LOW | openworker-archive/tests/test_web_search.py | 60 | def test_tool_reports_search_errors(): | CODE |
| LOW⚡ | openworker-archive/tests/test_web_search.py | 71 | def test_build_provider_default_is_keyless_duckduckgo(): | CODE |
| LOW⚡ | openworker-archive/tests/test_web_search.py | 77 | def test_build_provider_third_party_requires_key(): | CODE |
| LOW⚡ | openworker-archive/tests/test_web_search.py | 84 | def test_tool_surfaces_missing_key_error(tmp_path): | CODE |
| 1160 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite/provider.py | 5 | CODE | |
| LOW | aisuite/client.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 1 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 2 | CODE | |
| LOW | aisuite/__init__.py | 32 | CODE | |
| LOW | aisuite/__init__.py | 33 | CODE | |
| LOW | aisuite/__init__.py | 34 | CODE | |
| LOW | aisuite/__init__.py | 35 | CODE | |
| LOW | aisuite/tracing/store.py | 1 | CODE | |
| LOW | aisuite/tracing/viewer.py | 1 | CODE | |
| LOW | aisuite/tracing/normalize.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 1 | CODE | |
| LOW | aisuite/tracing/__init__.py | 12 | CODE | |
| LOW | aisuite/tracing/__init__.py | 12 | CODE | |
| LOW | aisuite/tracing/__init__.py | 12 | CODE | |
| LOW | aisuite/tracing/__init__.py | 13 | CODE | |
| LOW | aisuite/tracing/__init__.py | 13 | CODE | |
| LOW | aisuite/tracing/__init__.py | 13 | CODE | |
| LOW | aisuite/tracing/sinks.py | 1 | CODE | |
| LOW | aisuite/framework/__init__.py | 1 | CODE | |
| LOW | aisuite/framework/__init__.py | 2 | CODE | |
| LOW | aisuite/framework/__init__.py | 3 | CODE | |
| LOW | aisuite/framework/__init__.py | 3 | CODE | |
| LOW | aisuite/framework/__init__.py | 3 | CODE | |
| LOW | aisuite/framework/__init__.py | 3 | CODE | |
| 409 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | aisuite/agents/state_store.py | 135 | except FileNotFoundError: | CODE |
| HIGH | aisuite/agents/artifact_store.py | 168 | except FileNotFoundError: | CODE |
| HIGH | aisuite/agents/artifact_store.py | 172 | except FileNotFoundError: | CODE |
| HIGH | aisuite/agents/artifact_store.py | 176 | except FileNotFoundError: | CODE |
| HIGH | aisuite/agents/artifact_store.py | 178 | except OSError: | CODE |
| HIGH | aisuite/mcp/client.py | 261 | except ImportError: | CODE |
| HIGH | aisuite/mcp/client.py | 495 | except httpx.HTTPError: | CODE |
| HIGH | aisuite/mcp/client.py | 750 | except Exception: | CODE |
| HIGH | aisuite/mcp/client.py | 761 | except Exception: | CODE |
| HIGH | aisuite/mcp/client.py | 768 | except Exception: | CODE |
| HIGH | openworker-archive/tests/test_durable_resume.py | 51 | except asyncio.CancelledError: | CODE |
| HIGH | openworker-archive/tests/test_providers.py | 233 | except RuntimeError: | CODE |
| HIGH | openworker-archive/coworker/cloud.py | 505 | except httpx.HTTPError: | CODE |
| HIGH | openworker-archive/coworker/cloud.py | 554 | except ValueError: | CODE |
| HIGH | openworker-archive/coworker/cloud.py | 583 | except httpx.HTTPError: | CODE |
| HIGH | openworker-archive/coworker/cloud.py | 603 | except httpx.HTTPError: | CODE |
| HIGH | openworker-archive/coworker/cloud.py | 648 | except httpx.HTTPError: | CODE |
| HIGH | openworker-archive/coworker/subscriptions.py | 187 | except OSError: | CODE |
| HIGH | openworker-archive/coworker/subscriptions.py | 160 | except (OSError, ValueError, AttributeError): | CODE |
| HIGH | openworker-archive/coworker/engine.py | 526 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/secrets.py | 85 | except OSError: | CODE |
| HIGH | openworker-archive/coworker/secrets.py | 173 | except OSError: | CODE |
| HIGH | openworker-archive/coworker/interactions.py | 38 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/conversations.py | 90 | except sqlite3.OperationalError: | CODE |
| HIGH | …orker-archive/coworker/connectors/integration_tools.py | 353 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/connectors/relay_client.py | 177 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/connectors/relay_client.py | 526 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/connectors/senders.py | 40 | except ValueError: | CODE |
| HIGH | openworker-archive/coworker/connectors/email_tools.py | 389 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/connectors/email_tools.py | 671 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/connectors/email_tools.py | 827 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/connectors/email_tools.py | 838 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/connectors/email_tools.py | 412 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/connectors/adapters.py | 361 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/connectors/parked.py | 64 | except OSError: | CODE |
| HIGH | openworker-archive/coworker/tools/shell.py | 133 | except (ProcessLookupError, PermissionError, OSError): | CODE |
| HIGH | openworker-archive/coworker/tools/shell.py | 325 | except (subprocess.TimeoutExpired, OSError): | CODE |
| HIGH | openworker-archive/coworker/tools/shell.py | 369 | except (FileNotFoundError, OSError): | CODE |
| HIGH | openworker-archive/coworker/tools/shell.py | 394 | except (ProcessLookupError, OSError): | CODE |
| HIGH | openworker-archive/coworker/tools/shell.py | 128 | except (OSError, subprocess.SubprocessError): | CODE |
| HIGH | openworker-archive/coworker/tools/shell.py | 355 | except (OSError, ValueError): | CODE |
| HIGH | openworker-archive/coworker/tools/shell.py | 385 | except (OSError, subprocess.SubprocessError): | CODE |
| HIGH | openworker-archive/coworker/tools/shell.py | 389 | except (subprocess.TimeoutExpired, OSError): | CODE |
| HIGH | openworker-archive/coworker/tools/shell.py | 367 | except (ProcessLookupError, ValueError, OSError): | CODE |
| HIGH | openworker-archive/coworker/web/fetch.py | 71 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/providers/router.py | 44 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/server/run.py | 123 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/server/run.py | 57 | except PermissionError: | CODE |
| HIGH | openworker-archive/coworker/server/app.py | 1655 | except WebSocketDisconnect: | CODE |
| HIGH | openworker-archive/coworker/server/app.py | 668 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/server/app.py | 947 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/server/app.py | 1635 | except ValueError: | CODE |
| HIGH | openworker-archive/coworker/server/manager.py | 1382 | except OSError: | CODE |
| HIGH | openworker-archive/coworker/server/manager.py | 2225 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/server/manager.py | 2245 | except ValueError: | CODE |
| HIGH | openworker-archive/coworker/server/manager.py | 2340 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/server/manager.py | 3337 | except ValueError: | CODE |
| HIGH | openworker-archive/coworker/server/manager.py | 248 | except OSError: | CODE |
| HIGH | openworker-archive/coworker/server/manager.py | 412 | except Exception: | CODE |
| HIGH | openworker-archive/coworker/server/manager.py | 2085 | except OSError: | CODE |
| 19 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | aisuite/tracing/viewer.py | 128 | if (value === null || value === undefined) return ""; | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 128 | if (value === null || value === undefined) return ""; | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 130 | return JSON.stringify(value, null, 2); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 189 | if (event.agent_name || run.agent_name) bits.push(event.agent_name || run.agent_name); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 189 | if (event.agent_name || run.agent_name) bits.push(event.agent_name || run.agent_name); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 190 | if (event.run_name) bits.push(event.run_name); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 191 | if (data.message_count !== undefined) bits.push(`${data.message_count} messages`); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 191 | if (data.message_count !== undefined) bits.push(`${data.message_count} messages`); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 196 | return (run.display && run.display.latest_activity) || ""; | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 200 | if (!message || message.content === undefined) return displayValue(message); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 200 | if (!message || message.content === undefined) return displayValue(message); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 268 | if (!value || typeof value !== "object") return ""; | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 276 | if (result && typeof result === "object" && ("command" in result || "exit_code" in result || "stdout" in result || | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 285 | if (result && typeof result === "object" && ("path" in result || "content" in result)) { | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 343 | if (data.allowed !== undefined) bits.push(`allowed=${data.allowed}`); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 343 | if (data.allowed !== undefined) bits.push(`allowed=${data.allowed}`); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 344 | if (data.status) bits.push(`status=${data.status}`); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 345 | if (data.reason) bits.push(`reason=${data.reason}`); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 346 | if (data.arguments) bits.push(`args=${compactValue(data.arguments)}`); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 347 | if (data.result_preview) bits.push(`result=${compactValue(data.result_preview)}`); | CODE |
| HIGH⚡ | aisuite/tracing/viewer.py | 354 | const detail = event.data ? JSON.stringify(event.data, null, 2) : ""; | CODE |
| HIGH | aisuite/tracing/viewer.py | 116 | let selectedTraceId = null; | CODE |
| HIGH | aisuite/tracing/viewer.py | 165 | const name = data.tool_name || event.name || event.agent_name || run.agent_name || ""; | CODE |
| HIGH | aisuite/tracing/viewer.py | 235 | const title = display.title || run.run_name || run.trace_id || "run"; | CODE |
| HIGH | aisuite/tracing/viewer.py | 241 | <div class="meta">${escapeHtml(display.subtitle || run.agent_name || "")}</div> | CODE |
| HIGH | aisuite/tracing/viewer.py | 303 | <div class="timeline-title">${escapeHtml(item.title || item.event_type)}</div> | CODE |
| HIGH | aisuite/tracing/viewer.py | 310 | <details><summary>Details</summary><pre>${escapeHtml(JSON.stringify(item.raw || {}, null, 2))}</pre></details> | CODE |
| HIGH | aisuite/tracing/viewer.py | 365 | const finalOutput = run.final_output === undefined || run.final_output === null | CODE |
| HIGH | aisuite/tracing/viewer.py | 373 | <div class="title">${escapeHtml(display.title || run.run_name || run.trace_id)}</div> | CODE |
| HIGH | aisuite/tracing/viewer.py | 412 | <div class="tab-panel${active("raw")}"><pre>${escapeHtml(JSON.stringify(run, null, 2))}</pre></div> | CODE |
| HIGH | aisuite/tracing/viewer.py | 428 | if (!selectedTraceId && runs.length) selectedTraceId = runs[0].trace_id; | CODE |
| HIGH⚡ | aisuite/agents/postgres_state_store.py | 21 | revision bigint not null, | STRING |
| HIGH⚡ | aisuite/agents/postgres_state_store.py | 30 | thread_id text not null, | STRING |
| HIGH⚡ | aisuite/agents/postgres_state_store.py | 32 | message jsonb not null, | STRING |
| HIGH⚡ | aisuite/agents/postgres_state_store.py | 44 | thread_id text not null, | STRING |
| HIGH⚡ | aisuite/agents/postgres_state_store.py | 45 | source_message_ids text[] not null, | STRING |
| HIGH⚡ | aisuite/agents/postgres_state_store.py | 46 | summary_message_id text not null, | STRING |
| HIGH⚡ | aisuite/agents/postgres_state_store.py | 47 | summary_text text not null, | STRING |
| HIGH | aisuite/mcp/tool_wrapper.py | 124 | # (e.g., a tool expecting number won't accept null, it wants the param omitted) | COMMENT |
| HIGH | …rker-archive/coworker/connectors/browser_automation.py | 275 | return style && style.visibility !== 'hidden' && style.display !== 'none' && rect.width > 0 && rect.height > 0; | CODE |
| HIGH | …rker-archive/coworker/connectors/browser_automation.py | 278 | if (el.labels && el.labels.length) return Array.from(el.labels).map(l => l.innerText.trim()).filter(Boolean).join(' | CODE |
| HIGH | …rker-archive/coworker/connectors/browser_automation.py | 296 | text: (el.innerText || el.value || '').trim().slice(0, 200), | CODE |
| HIGH⚡ | tests/toolkits/test_shell.py | 54 | run_shell("python3 -m pytest && npm test") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | aisuite/providers/cohere_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/crusoe_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/deepseek_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/tongyi_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/mistral_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/openai_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/sambanova_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/openrouter_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/edenai_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/groq_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/requesty_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/featherless_provider.py | 0 | initialize the eden ai provider with the given configuration. pass the entire configuration dictionary to the openai cli | STRING |
| HIGH | aisuite/providers/fireworks_provider.py | 0 | initialize the xai provider with the given configuration. the api key is fetched from the config or environment variable | STRING |
| HIGH | aisuite/providers/together_provider.py | 0 | initialize the xai provider with the given configuration. the api key is fetched from the config or environment variable | STRING |
| HIGH | aisuite/providers/xai_provider.py | 0 | initialize the xai provider with the given configuration. the api key is fetched from the config or environment variable | STRING |
| HIGH | openworker-archive/tests/test_message_source.py | 0 | inbound delivery is gated on the connector being connected (§4.3). tests used to pass by riding the developer's real sla | STRING |
| HIGH | openworker-archive/tests/test_subscriptions.py | 0 | inbound delivery is gated on the connector being connected (§4.3). tests used to pass by riding the developer's real sla | STRING |
| HIGH | openworker-archive/tests/test_dm_routing.py | 0 | inbound delivery is gated on the connector being connected (§4.3). tests used to pass by riding the developer's real sla | STRING |
| HIGH | openworker-archive/coworker/connectors/accounts.py | 0 | the default account email: the stored pointer if it still exists, else the first connected account, else "". | STRING |
| HIGH | …enworker-archive/coworker/connectors/gmail_accounts.py | 0 | the default account email: the stored pointer if it still exists, else the first connected account, else "". | STRING |
| HIGH | openworker-archive/coworker/connectors/gcal_accounts.py | 0 | the default account email: the stored pointer if it still exists, else the first connected account, else "". | STRING |
| HIGH | tests/providers/test_deepgram_provider.py | 0 | test audio transcription with transcriptionoptions. | STRING |
| HIGH | tests/providers/test_openai_provider.py | 0 | test audio transcription with transcriptionoptions. | STRING |
| HIGH | tests/providers/test_google_provider.py | 0 | test audio transcription with transcriptionoptions. | STRING |
| HIGH | tests/providers/test_edenai_provider.py | 0 | test that the provider is initialized and chat completions are requested. | STRING |
| HIGH | tests/providers/test_groq_provider.py | 0 | test that the provider is initialized and chat completions are requested. | STRING |
| HIGH | tests/providers/test_cerebras_provider.py | 0 | test that the provider is initialized and chat completions are requested. | STRING |
| HIGH | tests/providers/test_deepseek_provider.py | 0 | test that the provider is initialized and chat completions are requested. | STRING |
| HIGH | tests/providers/test_edenai_provider.py | 0 | tests that usage data is correctly parsed when present in the response. | STRING |
| HIGH | tests/providers/test_sambanova_provider.py | 0 | tests that usage data is correctly parsed when present in the response. | STRING |
| HIGH | tests/providers/test_groq_provider.py | 0 | tests that usage data is correctly parsed when present in the response. | STRING |
| HIGH | tests/providers/test_cerebras_provider.py | 0 | tests that usage data is correctly parsed when present in the response. | STRING |
| HIGH | tests/providers/test_deepseek_provider.py | 0 | tests that usage data is correctly parsed when present in the response. | STRING |
| HIGH | tests/providers/test_mistral_provider.py | 0 | tests that usage data is correctly parsed when present in the response. | STRING |
| HIGH | tests/providers/test_nebius_provider.py | 0 | high-level test that the interface is initialized and chat completions are requested successfully. | STRING |
| HIGH | tests/providers/test_inception_provider.py | 0 | high-level test that the interface is initialized and chat completions are requested successfully. | STRING |
| HIGH | tests/providers/test_sambanova_provider.py | 0 | high-level test that the interface is initialized and chat completions are requested successfully. | STRING |
| HIGH | tests/providers/test_watsonx_provider.py | 0 | high-level test that the interface is initialized and chat completions are requested successfully. | STRING |
| HIGH | tests/providers/test_crusoe_provider.py | 0 | high-level test that the interface is initialized and chat completions are requested successfully. | STRING |
| HIGH | tests/providers/test_cohere_provider.py | 0 | high-level test that the interface is initialized and chat completions are requested successfully. | STRING |
| HIGH | tests/providers/test_mistral_provider.py | 0 | high-level test that the interface is initialized and chat completions are requested successfully. | STRING |
| HIGH | tests/providers/test_tongyi_provider.py | 0 | high-level test that the interface is initialized and chat completions are requested successfully. | STRING |
| HIGH | tests/providers/test_google_provider.py | 0 | high-level test that the interface is initialized and chat completions are requested successfully. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite/client.py | 208 | except Exception as e: | CODE |
| LOW | aisuite/client.py | 346 | except Exception as exc: | CODE |
| LOW | aisuite/client.py | 415 | except Exception as exc: | CODE |
| LOW | aisuite/providers/cohere_provider.py | 168 | except Exception as e: | CODE |
| LOW | aisuite/providers/cerebras_provider.py | 43 | except Exception as e: | CODE |
| LOW | aisuite/providers/deepseek_provider.py | 48 | except Exception as e: | CODE |
| LOW | aisuite/providers/fireworks_provider.py | 130 | except Exception as e: | CODE |
| LOW | aisuite/providers/tongyi_provider.py | 32 | except Exception as e: | CODE |
| MEDIUM | aisuite/providers/tongyi_provider.py | 24 | def chat_completions_create(self, model, messages, **kwargs): | CODE |
| LOW | aisuite/providers/mistral_provider.py | 73 | except Exception as e: | CODE |
| LOW | aisuite/providers/openai_provider.py | 52 | except Exception as e: | CODE |
| LOW⚡ | aisuite/providers/openai_provider.py | 65 | except Exception as e: | CODE |
| LOW⚡ | aisuite/providers/openai_provider.py | 78 | except Exception as e: | CODE |
| LOW⚡ | aisuite/providers/openai_provider.py | 92 | except Exception as e: | CODE |
| LOW | aisuite/providers/openai_provider.py | 152 | except Exception as e: | CODE |
| LOW | aisuite/providers/openai_provider.py | 231 | except Exception as stream_error: | CODE |
| LOW | aisuite/providers/openai_provider.py | 236 | except Exception as e: | CODE |
| LOW | aisuite/providers/inception_provider.py | 33 | except Exception as e: | CODE |
| LOW | aisuite/providers/deepgram_provider.py | 108 | except Exception as e: | CODE |
| LOW | aisuite/providers/deepgram_provider.py | 241 | except Exception as e: | CODE |
| LOW | aisuite/providers/deepgram_provider.py | 314 | except Exception as e: | CODE |
| LOW | aisuite/providers/huggingface_provider.py | 83 | except Exception as e: | CODE |
| LOW | aisuite/providers/huggingface_provider.py | 224 | except Exception as e: | CODE |
| LOW | aisuite/providers/sambanova_provider.py | 52 | except Exception as e: | CODE |
| LOW | aisuite/providers/openrouter_provider.py | 48 | except Exception as e: | CODE |
| LOW | aisuite/providers/together_provider.py | 64 | except Exception as e: | CODE |
| LOW | aisuite/providers/edenai_provider.py | 48 | except Exception as e: | CODE |
| LOW | aisuite/providers/groq_provider.py | 61 | except Exception as e: | CODE |
| LOW | aisuite/providers/requesty_provider.py | 48 | except Exception as e: | CODE |
| LOW | aisuite/providers/xai_provider.py | 65 | except Exception as e: | CODE |
| LOW | aisuite/providers/google_provider.py | 380 | except Exception as e: | CODE |
| LOW | aisuite/providers/google_provider.py | 432 | except Exception as e: | CODE |
| LOW | aisuite/agents/runner.py | 269 | except Exception as exc: | CODE |
| LOW | aisuite/agents/postgres_state_store.py | 118 | except Exception: | CODE |
| LOW | aisuite/agents/postgres_state_store.py | 214 | except Exception: | CODE |
| LOW | aisuite/agents/postgres_state_store.py | 264 | except Exception: | CODE |
| LOW | aisuite/agents/postgres_state_store.py | 363 | except Exception: | CODE |
| LOW | aisuite/utils/tools.py | 568 | except Exception as exc: | CODE |
| LOW | aisuite/utils/tools.py | 579 | except Exception as exc: | CODE |
| LOW | aisuite/utils/utils.py | 32 | except Exception: | CODE |
| LOW | aisuite/utils/utils.py | 58 | except Exception: | CODE |
| LOW | aisuite/mcp/client.py | 750 | except Exception: | CODE |
| LOW | aisuite/mcp/client.py | 761 | except Exception: | CODE |
| LOW | aisuite/mcp/client.py | 768 | except Exception: | CODE |
| LOW | openworker-archive/coworker/pdf_support.py | 76 | except Exception: | CODE |
| LOW | openworker-archive/coworker/pdf_support.py | 95 | except Exception: | CODE |
| LOW | openworker-archive/coworker/pdf_support.py | 98 | except Exception as exc: | CODE |
| LOW | openworker-archive/coworker/pdf_support.py | 124 | except Exception: | CODE |
| LOW | openworker-archive/coworker/pdf_support.py | 193 | except Exception: | CODE |
| LOW | openworker-archive/coworker/cloud.py | 671 | except Exception as exc: # malformed manifest: surface, don't crash | CODE |
| LOW | openworker-archive/coworker/engine.py | 185 | except Exception: | CODE |
| LOW | openworker-archive/coworker/engine.py | 213 | except Exception as exc: # provider failure | CODE |
| LOW | openworker-archive/coworker/engine.py | 273 | except Exception as exc: # surfaced to the awaiting consumer | CODE |
| LOW | openworker-archive/coworker/engine.py | 464 | except Exception as exc: | CODE |
| LOW | openworker-archive/coworker/engine.py | 526 | except Exception: | CODE |
| MEDIUM | openworker-archive/coworker/engine.py | 267 | def produce(): | CODE |
| LOW | openworker-archive/coworker/interactions.py | 38 | except Exception: | CODE |
| LOW | …orker-archive/coworker/connectors/integration_tools.py | 322 | except Exception as exc: | CODE |
| LOW | …orker-archive/coworker/connectors/integration_tools.py | 353 | except Exception: | CODE |
| LOW | …nworker-archive/coworker/connectors/slack_directory.py | 146 | except Exception as exc: | CODE |
| 124 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite/tracing/store.py | 162 | CODE | |
| LOW | aisuite/tracing/viewer.py | 944 | CODE | |
| LOW | aisuite/tracing/normalize.py | 104 | CODE | |
| LOW | aisuite/framework/parameter_mapper.py | 131 | CODE | |
| LOW | aisuite/providers/cohere_provider.py | 14 | CODE | |
| LOW | aisuite/providers/openai_provider.py | 112 | CODE | |
| LOW | aisuite/providers/openai_provider.py | 155 | CODE | |
| LOW | aisuite/providers/openai_provider.py | 239 | CODE | |
| LOW | aisuite/providers/deepgram_provider.py | 68 | CODE | |
| LOW | aisuite/providers/deepgram_provider.py | 111 | CODE | |
| LOW | aisuite/providers/huggingface_provider.py | 113 | CODE | |
| LOW | aisuite/providers/huggingface_provider.py | 239 | CODE | |
| LOW | aisuite/providers/message_converter.py | 20 | CODE | |
| LOW | aisuite/providers/google_provider.py | 383 | CODE | |
| LOW | aisuite/providers/google_provider.py | 443 | CODE | |
| LOW | aisuite/providers/aws_provider.py | 39 | CODE | |
| LOW | aisuite/providers/aws_provider.py | 136 | CODE | |
| LOW | aisuite/providers/gemini_provider.py | 86 | CODE | |
| LOW | aisuite/providers/gemini_provider.py | 190 | CODE | |
| LOW | aisuite/providers/gemini_provider.py | 263 | CODE | |
| LOW | aisuite/toolkits/files.py | 385 | CODE | |
| LOW | aisuite/toolkits/files.py | 460 | CODE | |
| LOW | aisuite/toolkits/files.py | 643 | CODE | |
| LOW | aisuite/toolkits/files.py | 731 | CODE | |
| LOW | aisuite/mcp/client.py | 307 | CODE | |
| LOW | aisuite/mcp/client.py | 651 | CODE | |
| LOW | aisuite/mcp/client.py | 680 | CODE | |
| LOW | openworker-archive/tests/test_ui_refresh_e2e.py | 92 | CODE | |
| LOW | openworker-archive/tests/test_email_tools.py | 49 | CODE | |
| LOW | openworker-archive/coworker/pdf_support.py | 102 | CODE | |
| LOW | openworker-archive/coworker/pdf_support.py | 106 | CODE | |
| LOW | openworker-archive/coworker/audit.py | 123 | CODE | |
| LOW | openworker-archive/coworker/subscriptions.py | 141 | CODE | |
| LOW | openworker-archive/coworker/attachments.py | 31 | CODE | |
| LOW | openworker-archive/coworker/attachments.py | 81 | CODE | |
| LOW | openworker-archive/coworker/engine.py | 167 | CODE | |
| LOW | openworker-archive/coworker/engine.py | 357 | CODE | |
| LOW | openworker-archive/coworker/conversations.py | 122 | CODE | |
| LOW | openworker-archive/coworker/conversations.py | 156 | CODE | |
| LOW | openworker-archive/coworker/roots.py | 33 | CODE | |
| LOW | openworker-archive/coworker/connectors/relay_client.py | 128 | CODE | |
| LOW | openworker-archive/coworker/connectors/email_tools.py | 355 | CODE | |
| LOW | openworker-archive/coworker/connectors/email_tools.py | 392 | CODE | |
| LOW | openworker-archive/coworker/connectors/email_tools.py | 421 | CODE | |
| LOW | openworker-archive/coworker/connectors/email_tools.py | 532 | CODE | |
| LOW | openworker-archive/coworker/tools/files.py | 50 | CODE | |
| LOW | openworker-archive/coworker/tools/files.py | 53 | CODE | |
| LOW | openworker-archive/coworker/tools/search.py | 150 | CODE | |
| LOW | openworker-archive/coworker/tui/app.py | 173 | CODE | |
| LOW | openworker-archive/coworker/tui/app.py | 203 | CODE | |
| LOW | openworker-archive/coworker/providers/registry.py | 376 | CODE | |
| LOW | …enworker-archive/coworker/providers/openai_provider.py | 338 | CODE | |
| LOW | …enworker-archive/coworker/providers/openai_provider.py | 409 | CODE | |
| LOW | …enworker-archive/coworker/providers/openai_provider.py | 155 | CODE | |
| LOW | …orker-archive/coworker/providers/anthropic_provider.py | 129 | CODE | |
| LOW | …orker-archive/coworker/providers/anthropic_provider.py | 158 | CODE | |
| LOW | …orker-archive/coworker/providers/anthropic_provider.py | 350 | CODE | |
| LOW | …enworker-archive/coworker/providers/gemini_provider.py | 115 | CODE | |
| LOW | …enworker-archive/coworker/providers/gemini_provider.py | 160 | CODE | |
| LOW | …enworker-archive/coworker/providers/gemini_provider.py | 246 | CODE | |
| 15 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | aisuite/providers/anthropic_provider.py | 25 | # Define a constant for the default max_tokens value | COMMENT |
| MEDIUM⚡ | aisuite/providers/google_provider.py | 53 | # Create a Part from the function call | COMMENT |
| MEDIUM | aisuite/providers/google_provider.py | 287 | # Create the GenerativeModel | COMMENT |
| MEDIUM | aisuite/mcp/tool_wrapper.py | 68 | # Create a proper signature for inspect.signature() to read | COMMENT |
| MEDIUM | tests/utils/test_tools_mcp_schema.py | 329 | # Create a copy to verify immutability | COMMENT |
| MEDIUM | tests/utils/test_tool_manager.py | 8 | # Define a sample tool function and Pydantic model for testing | COMMENT |
| MEDIUM | tests/mcp/conftest.py | 52 | # Create a subdirectory | COMMENT |
| MEDIUM | tests/mcp/test_http_llm_e2e.py | 134 | # Define a Python function | COMMENT |
| MEDIUM | tests/mcp/test_llm_e2e.py | 145 | # Define a Python function | COMMENT |
| MEDIUM | tests/mcp/test_e2e.py | 24 | # Create a simple mock object that mimics the response structure | COMMENT |
| MEDIUM | tests/mcp/test_e2e.py | 155 | # Define a Python function | COMMENT |
| MEDIUM | tests/mcp/test_e2e.py | 208 | # Create a second temp directory | COMMENT |
| MEDIUM | tests/client/test_manual_tool_calling.py | 98 | # Create a callable tool function | COMMENT |
| MEDIUM | tests/client/test_client.py | 356 | # Create a mock provider with audio support | COMMENT |
| MEDIUM | tests/client/test_client.py | 385 | # Create a mock provider with audio support | COMMENT |
| MEDIUM | examples/mcp_http_example.py | 154 | # Define a custom Python function | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite/__init__.py | 37 | __all__ = [ | CODE |
| LOW | aisuite/tracing/__init__.py | 15 | __all__ = [ | CODE |
| LOW | aisuite/framework/asr_params.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | aisuite/agents/__init__.py | 35 | __all__ = [ | CODE |
| LOW | aisuite/toolkits/__init__.py | 5 | __all__ = ["files", "git", "shell"] | CODE |
| LOW | aisuite/mcp/__init__.py | 33 | __all__ = ["MCPClient"] | CODE |
| LOW | openworker-archive/coworker/pdf_support.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | openworker-archive/coworker/overrides.py | 70 | def set_rule(self, pattern: str, risk: RiskClass | str) -> None: | CODE |
| LOW | openworker-archive/coworker/inbox_routing.py | 81 | def set_persona_default(self, persona_id: str, inbox_name: str) -> None: | CODE |
| LOW | openworker-archive/coworker/inbox_routing.py | 86 | def set_session_override(self, session_id: str, inbox_name: str) -> None: | CODE |
| LOW | openworker-archive/coworker/conversations.py | 237 | def set_extra_roots(self, session_id: str, extra_roots: list[dict]) -> None: | CODE |
| LOW | openworker-archive/coworker/connectors/gateway.py | 58 | def set_handler(self, handler: MessageHandler) -> None: | CODE |
| LOW | openworker-archive/coworker/connectors/github_relay.py | 97 | def set_install(self, installation_id: str, info: dict[str, Any]) -> None: | CODE |
| LOW | openworker-archive/coworker/connectors/__init__.py | 41 | __all__ = [ | CODE |
| LOW | openworker-archive/coworker/connectors/base.py | 145 | def set_message_handler(self, handler: MessageHandler) -> None: | CODE |
| LOW | openworker-archive/coworker/connectors/base.py | 148 | def set_interaction_handler(self, handler: InteractionHandler) -> None: | CODE |
| LOW | openworker-archive/coworker/connectors/adapters.py | 384 | async def update_message(self, chat_id: str, message_id: str, text: str) -> None: | CODE |
| LOW | openworker-archive/coworker/tools/__init__.py | 3 | __all__ = ["ToolRegistry", "ToolSpec"] | CODE |
| LOW | openworker-archive/coworker/memory/__init__.py | 5 | __all__ = [ | CODE |
| LOW | openworker-archive/coworker/tui/__init__.py | 3 | __all__ = ["CoworkerApp"] | CODE |
| LOW | openworker-archive/coworker/web/__init__.py | 17 | __all__ = [ | CODE |
| LOW | openworker-archive/coworker/providers/__init__.py | 24 | __all__ = [ | CODE |
| LOW | openworker-archive/coworker/agents/__init__.py | 8 | __all__ = [ | CODE |
| LOW | openworker-archive/coworker/server/__init__.py | 4 | __all__ = ["create_app", "SessionManager"] | CODE |
| LOW | openworker-archive/coworker/mcp/__init__.py | 19 | __all__ = [ | CODE |
| LOW | openworker-archive/coworker/mcp/oauth.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | openworker-archive/coworker/mcp/oauth.py | 74 | async def set_tokens(self, tokens: OAuthToken) -> None: | CODE |
| LOW⚡ | openworker-archive/coworker/mcp/oauth.py | 86 | async def set_client_info(self, info: OAuthClientInformationFull) -> None: | CODE |
| LOW | openworker-archive/coworker/personas/registry.py | 295 | def set_enabled(self, persona_id: str, enabled: bool) -> None: | CODE |
| LOW | openworker-archive/coworker/personas/registry.py | 306 | def set_surfaced(self, persona_id: str, surfaced: bool) -> None: | CODE |
| LOW | openworker-archive/coworker/personas/registry.py | 312 | def set_default(self, persona_id: str) -> None: | CODE |
| LOW | openworker-archive/coworker/personas/registry.py | 411 | def set_registry(registry: PersonaRegistry) -> None: | CODE |
| LOW | openworker-archive/coworker/personas/__init__.py | 14 | __all__ = [ | CODE |
| LOW | …worker-archive/coworker/testing/fake_slack/__init__.py | 10 | __all__ = ["FakeSlack"] | CODE |
| LOW | openworker-archive/coworker/skills/__init__.py | 3 | __all__ = ["Skill", "SkillLoader", "skill_catalog_text", "skill_tools"] | CODE |
| LOW | openworker-archive/coworker/automation/__init__.py | 10 | __all__ = [ | CODE |
| LOW | cli/py/aisuite-code-cli/aisuite_code_cli/__init__.py | 6 | __all__ = ["CliConfig", "CodeCli", "DEFAULT_ALLOWED_COMMANDS"] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | aisuite/client.py | 662 | Create audio transcription with parameter validation. This method uses a pass-through approach with va | STRING |
| HIGH | aisuite/framework/asr_params.py | 183 | Validate and map parameters for the given provider. This method: 1. Maps common parameters to | STRING |
| HIGH | aisuite/mcp/config.py | 50 | Validate and normalize an MCP tool configuration. This function: 1. Validates required fields are present | STRING |
| HIGH | aisuite/mcp/client.py | 138 | Create an MCPClient from a configuration dictionary. This method validates the config and creates an M | STRING |
| HIGH | aisuite/mcp/client.py | 310 | Parse SSE stream and extract JSON-RPC response. SSE format per spec: data: {"jsonrpc": "2. | STRING |
| HIGH | aisuite/mcp/client.py | 377 | Send JSON-RPC request to MCP server via HTTP. Args: method: JSON-RPC method name | STRING |
| HIGH | aisuite/mcp/client.py | 617 | Execute an MCP tool call. This method is called by MCPToolWrapper when the LLM requests a tool. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite/client.py | 741 | # Check if provider supports audio transcription | COMMENT |
| LOW | aisuite/client.py | 753 | # Check if provider supports output streaming | COMMENT |
| LOW | aisuite/framework/asr_params.py | 206 | # Check if it's a common param that needs mapping | COMMENT |
| LOW | aisuite/framework/asr_params.py | 221 | # Check if it's a valid provider-specific param | COMMENT |
| LOW | aisuite/providers/anthropic_provider.py | 294 | # Check if response contains any tool use blocks (regardless of stop_reason) | COMMENT |
| LOW | aisuite/providers/message_converter.py | 31 | # Check if tmsg is a dict, otherwise get role attribute | COMMENT |
| LOW | aisuite/providers/google_provider.py | 151 | # Check if the response contains function calls | COMMENT |
| LOW | aisuite/providers/aws_provider.py | 171 | # Check if the model is requesting tool use | COMMENT |
| LOW | aisuite/utils/tools.py | 89 | # Check if this is an MCP tool with original schema | COMMENT |
| LOW | aisuite/utils/tools.py | 293 | # Check if a type annotation is missing | COMMENT |
| LOW | aisuite/mcp/schema_converter.py | 124 | # Check if it's an Optional type | COMMENT |
| LOW | aisuite/mcp/client.py | 348 | # Check if this is the response to our request | COMMENT |
| LOW | aisuite/mcp/client.py | 731 | # Check if we need to cleanup (either stdio or HTTP) | COMMENT |
| LOW | tests/client/test_prerelease.py | 60 | # Check if either version of the required phrase is present | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite/providers/azure_provider.py | 1 | import urllib.request | COMMENT |
| LOW | aisuite/providers/azure_provider.py | 21 | # Cohere Embed V3 family of models | COMMENT |
| LOW | aisuite/providers/mistral_provider.py | 21 | def convert_response(self, response_data) -> ChatCompletionResponse: | COMMENT |
| LOW | aisuite/providers/groq_provider.py | 1 | import os | COMMENT |
| LOW | aisuite/providers/google_provider.py | 121 | if ENABLE_DEBUG_MESSAGES: | COMMENT |
| LOW | aisuite/providers/google_provider.py | 141 | # value { | COMMENT |
| LOW | aisuite/providers/gemini_provider.py | 1 | # Gemini provider — Google's Gemini Developer API (API key), via the google-genai SDK. | COMMENT |
| LOW | openworker-archive/release-workflow.yml | 1 | # Desktop release builds — macOS (.dmg, arm64 + Intel) and Windows (.msi + NSIS .exe). | COMMENT |
| LOW | openworker-archive/packaging/build_dmg.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | openworker-archive/packaging/build_dmg.sh | 21 | # `tauri build` signs the .app + the bundled sidecar with it. Left unset → UNSIGNED (first launch | COMMENT |
| LOW | openworker-archive/packaging/build_dmg.sh | 81 | # stale onefile binary from pre-onedir builds. | COMMENT |
| LOW | openworker-archive/coworker/engine.py | 81 | self.approver = approver or _deny_all | COMMENT |
| LOW | openworker-archive/coworker/connectors/descriptors.py | 61 | # Registry metadata (UI-Refresh §1): the connector's brand color (hex; fallback gray) and a | COMMENT |
| LOW | openworker-archive/surfaces/gui/src-tauri/src/lib.rs | 1 | //! OpenWorker desktop shell. | COMMENT |
| LOW | openworker-archive/surfaces/gui/src-tauri/src/lib.rs | 621 | server_cmd | COMMENT |
| LOW | openworker-archive/surfaces/gui/src/App.tsx | 661 | // NOTE: `workspace` is intentionally NOT a dependency. Every real workspace change | COMMENT |
| LOW | openworker-archive/surfaces/gui/src/streamGate.ts | 1 | // §33 refinement #3 (owner, 2026-07-14 — v2's gate only covered turn START; mid-turn | COMMENT |
| LOW | openworker-archive/surfaces/gui/src/paths.ts | 1 | // Last path segment, for displaying a workspace/root as its folder name. Splits on both | COMMENT |
| LOW | …orker-archive/surfaces/gui/src/connectors/registry.tsx | 1 | // Connector logo registry — maps a stable `logo` id (from a connector's API descriptor) to the | COMMENT |
| LOW | …e/surfaces/gui/src/components/ConnectorMessageCard.tsx | 1 | // ConnectorMessageCard — renders a connector-delivered inbound message (§3.3) as a structured card: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | aisuite/providers/deepgram_provider.py | 92 | response = self.client.listen.v1.media.transcribe_file( | CODE |
| CRITICAL | tests/providers/test_async_provider.py | 53 | provider.aclient.chat.completions.create.assert_awaited_once() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite-js/examples/tool-calling.ts | 50 | // Step 1: Initial request with tools | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 65 | // Step 2: Execute tool calls and send results back | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 90 | // Step 3: Get final response with tool results | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 108 | // Step 1: Initial request with tools | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 123 | // Step 2: Execute tool calls and send results back | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 148 | // Step 3: Get final response with tool results | COMMENT |
| LOW | aisuite-js/examples/groq.ts | 159 | // Step 1: Initial request with tools | COMMENT |
| LOW | aisuite-js/examples/groq.ts | 174 | // Step 2: Execute tool calls and send results back | COMMENT |
| LOW | aisuite-js/examples/groq.ts | 199 | // Step 3: Get final response with tool results | COMMENT |
| LOW | guides/watsonx.md | 7 | ### Step 1: Create a Watsonx Account | COMMENT |
| LOW | guides/watsonx.md | 15 | ### Step 2: Obtain API Credentials | COMMENT |
| LOW | guides/watsonx.md | 34 | ### Step 3: Set Environment Variables | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | aisuite/tracing/static/viewer/assets/index-C29aAR1d.js | 9 | `).replace(U0,"")}function Kd(t,l){return l=Vd(l),Vd(t)===l}function st(t,l,e,a,u,n){switch(e){case"children":typeof a== | CODE |
| MEDIUM | openworker-archive/pyproject.toml | 40 | # aiohttp is slack-bolt's Socket Mode transport at runtime (and the FakeSlack test harness | COMMENT |
| MEDIUM | openworker-archive/coworker/connectors/adapters.py | 170 | # slack_sdk's own reconnect stays on in production (seamless on Slack's graceful cycling); | COMMENT |
| MEDIUM | openworker-archive/coworker/connectors/adapters.py | 194 | # Base-URL override so tests (and the FakeSlack harness) can redirect every Web API | COMMENT |
| MEDIUM | openworker-archive/surfaces/gui/src/api.ts | 622 | // bounded per-persona cards. Defaults to "flat" (absent → flat) so the GUI is robust to an older | COMMENT |
| MEDIUM | openworker-archive/surfaces/gui/src/api.ts | 630 | // and attach-time thresholds. Optional so the GUI is robust to an older backend. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite-js/examples/tool-calling.ts | 50 | // Step 1: Initial request with tools | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 65 | // Step 2: Execute tool calls and send results back | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 90 | // Step 3: Get final response with tool results | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 108 | // Step 1: Initial request with tools | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 123 | // Step 2: Execute tool calls and send results back | COMMENT |
| LOW | aisuite-js/examples/tool-calling.ts | 148 | // Step 3: Get final response with tool results | COMMENT |
| LOW | aisuite-js/examples/groq.ts | 159 | // Step 1: Initial request with tools | COMMENT |
| LOW | aisuite-js/examples/groq.ts | 174 | // Step 2: Execute tool calls and send results back | COMMENT |
| LOW | aisuite-js/examples/groq.ts | 199 | // Step 3: Get final response with tool results | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | openworker-archive/tests/test_hubspot_portals.py | 214 | "account": "Acme Inc", | CODE |
| LOW | openworker-archive/tests/test_hubspot_portals.py | 227 | "name": "Acme Inc", | CODE |
| LOW | openworker-archive/coworker/connectors/descriptors.py | 32 | "placeholder": self.placeholder, | CODE |
| LOW | …rker-archive/coworker/connectors/browser_automation.py | 295 | placeholder: el.getAttribute('placeholder') || '', | CODE |
| LOW | openworker-archive/coworker/providers/registry.py | 50 | "placeholder": self.placeholder, | CODE |
| LOW | openworker-archive/ui-mocks/voice-input-settings.html | 119 | <div class="placeholder">Ask OpenCoworker anything…</div> | CODE |
| LOW | openworker-archive/surfaces/gui/e2e/fixtures.ts | 477 | { hub_id: "111", name: "Acme Inc", sandbox: false }, | CODE |
| LOW | …nworker-archive/surfaces/gui/e2e/provider-keys.spec.ts | 41 | await expect(page.getByTestId("set-field-api_key")).toHaveAttribute("placeholder", "••••••••"); | CODE |
| LOW | …nworker-archive/surfaces/gui/e2e/provider-keys.spec.ts | 53 | await expect(page.getByTestId("set-field-api_key")).toHaveAttribute("placeholder", "••••••••"); | CODE |
| LOW | openworker-archive/surfaces/gui/e2e/onboarding.spec.ts | 81 | await expect(page.getByTestId("ob-field-api_key")).toHaveAttribute("placeholder", "••••••••"); | CODE |
| LOW | …enworker-archive/surfaces/gui/e2e/hubspot-page.spec.ts | 35 | await expect(page.getByTestId("connector-hubspot")).toContainText("Acme Inc", { | CODE |
| LOW | …enworker-archive/surfaces/gui/e2e/hubspot-page.spec.ts | 61 | await expect(page.getByTestId("connector-hubspot")).toContainText("Acme Inc", { timeout: 10_000 }); | CODE |
| LOW | …enworker-archive/surfaces/gui/e2e/hubspot-page.spec.ts | 84 | await expect(page.getByTestId("connector-hubspot")).toContainText("Acme Inc", { timeout: 10_000 }); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | guides/tongyi.md | 6 | export TONGYI_API_KEY="your-api-key" | CODE |
| HIGH | guides/azure.md | 27 | export AZURE_API_KEY="your-api-key" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | aisuite/agents/runner.py | 64 | CODE | |
| LOW | aisuite/agents/runner.py | 118 | CODE | |
| LOW | aisuite/agents/runner.py | 525 | CODE | |
| LOW | openworker-archive/coworker/engine.py | 53 | CODE | |
| LOW | openworker-archive/coworker/agent.py | 108 | CODE | |
| LOW | openworker-archive/coworker/inbox.py | 116 | CODE | |
| LOW | openworker-archive/coworker/connectors/email_tools.py | 421 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | openworker-archive/docs/PERSONAS.md | 257 | ## Tabled for later — unattended guardrails | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | openworker-archive/coworker/automation/scheduler.py | 91 | async def run_task(self, task: ScheduledTask, *, trigger: str) -> Optional[TaskRun]: | CODE |