# Important: This file contains all available configuration options. # Do not copy this entire file to your repository configuration. # Your repository configuration should only include options you wish to override from the defaults. [config] # models model="gpt-5.6" fallback_models=["gpt-5.6-terra"] #model_reasoning="gpt-5.6-terra" # dedicated reasoning model for self-reflection #model_weak="gpt-5.6-luna" # optional, a weaker model to use for some easier tasks # CLI git_provider="github" publish_output=true publish_output_progress=true progress_gif_url="" # optional, override for the progress loading gif url (example: 'https://.../spinner.gif'). progress_gif_width=48 # optional, width (in px) of the progress loading gif. verbosity_level=0 # 0,1,2 use_extra_bad_extensions=false # Log log_level="DEBUG" # Configurations use_repo_settings_file=true use_global_settings_file=true extra_config_url="" # optional URL or path to an additional .pr_agent.toml merged before the repo-local config; also settable via --extra_config_url or PR_AGENT_EXTRA_CONFIG_URL. See docs/docs/usage-guide/configuration_options.md#external-configuration-url. disable_auto_feedback = false enable_auto_approval = false # when true, /review may auto-approve a PR via auto_approve_logic(); that caller is currently commented out ai_timeout=120 # 2 minutes retry_same_model_on_timeout = true # when false, a timed-out call is not retried on the same model and moves on to fallback_models # num_retries = 0 # per-call retries inside the completion client itself; unset keeps the client's default. These multiply the handler's own retry attempts skip_keys = [] custom_reasoning_model = false # when true, disables system messages and temperature controls for models that don't support chat-style inputs response_language="en-US" # Language locales code for PR responses in ISO 3166 and ISO 639 format (e.g., "en-US", "it-IT", "zh-CN", ...) repo_context_files = ["AGENTS.md"] # Repository-relative files (e.g. AGENTS.md, CLAUDE.md) to include as AI prompt context; set to [] to disable repo_context_from_default_branch = true # Read repo context files from the repository default branch (trusts only default-branch content). Set to false to read from the PR target branch instead. repo_context_max_lines = 500 # Maximum total rendered lines for repo context, including wrapper tags # token limits max_description_tokens = 500 max_commits_tokens = 500 max_model_tokens = 32000 # Limits the maximum number of tokens that can be used by any model, regardless of the model's default capabilities. custom_model_max_tokens=-1 # for models not in the default list # Sent as max_completion_tokens for GPT-6 Astra, otherwise max_tokens; use a limit supported by the model. max_output_tokens = 0 # 0 = unset (the provider's own default applies) model_token_count_estimate_factor=0.3 # factor to increase the token count estimate, in order to reduce likelihood of model failure due to too many tokens - applicable only when requesting an accurate estimate. # patch extension logic patch_extension_skip_types =[".md",".txt"] allow_dynamic_context=true max_extra_lines_before_dynamic_context = 10 # will try to include up to 10 extra lines before the hunk in the patch, until we reach an enclosing function or class patch_extra_lines_before = 5 # Number of extra lines (+3 default ones) to include before each hunk in the patch patch_extra_lines_after = 1 # Number of extra lines (+3 default ones) to include after each hunk in the patch secret_provider="" # "" (disabled), "google_cloud_storage", or "aws_secrets_manager" for secure secret management cli_mode=false output_relevant_configurations=false output_run_details=false # if true, append an agent run details section (model, tokens, time cost, AI calls) to generated PR comments output_run_cost=false # if true, collect estimated LiteLLM API cost and include it inside the enabled run details section large_patch_policy = "clip" # "clip", "skip" duplicate_prompt_examples = false # Persistent inline comments (issue #2037): when true, the GitHub, GitLab, and Azure DevOps providers # fingerprint each inline comment, embed the fingerprint as an HTML marker, and skip # re-posting suggestions already present on the PR/MR across runs. persistent_inline_comments = false # seed seed=-1 # set positive value to fix the seed (and ensure temperature=0) temperature=0.2 # ignore logic ignore_pr_title = ["^\\[Auto\\]", "^Auto"] # a list of regular expressions to match against the PR title to ignore the PR agent ignore_pr_target_branches = [] # a list of regular expressions of target branches to ignore from PR agent when an PR is created ignore_pr_source_branches = [] # a list of regular expressions of source branches to ignore from PR agent when an PR is created ignore_pr_labels = [] # labels to ignore from PR agent when an PR is created ignore_pr_authors = [] # authors to ignore from PR agent when an PR is created # Reactions added to the comment that triggered a command. Names are provider-specific: # GitHub accepts only +1, -1, laugh, confused, heart, hooray, rocket, eyes; GitLab and Gitea # take any award-emoji name. An empty value disables that reaction. When an outcome reaction # is configured it replaces the start reaction rather than joining it. reaction_on_start = "eyes" # added before the command runs reaction_on_success = "" # added when the command finished successfully reaction_on_failure = "" # added when the command failed ignore_repositories = [] # a list of regular expressions of repository full names (e.g. "org/repo") to ignore from PR agent processing ignore_language_framework = [] # a list of code-generation languages or frameworks (e.g. 'protobuf', 'go_gen') whose auto-generated source files will be excluded from analysis # Substring indicators used to skip bot users on webhook events. Currently consumed by # the GitLab webhook (`is_bot_user`); other providers may adopt this list in future. # The match is case-insensitive against the sender's display name. Overriding this # setting REPLACES the default list — include the entries below in your override if # you want to keep them (e.g. `["codium", "bot_", "bot-", "_bot", "-bot", "renovate"]`). bot_user_indicators = ["codium", "bot_", "bot-", "_bot", "-bot"] # restricted_mode = false # when true, skip operations that require elevated permissions (e.g. pushing code to the repository) is_auto_command = false # will be auto-set to true if the command is triggered by an automation propagate_tool_errors = false # when true, a tool re-raises instead of swallowing an internal error, so a caller can tell a failed run from an empty one enable_ai_metadata = false # will enable adding ai metadata add_user_to_requests = false # send the current command and PR URL in the OpenAI-compatible "user" request field, for provider-side attribution of requests (e.g. OpenRouter "external_user") reasoning_effort = "medium" # "none", "minimal", "low", "medium", "high", "xhigh", "max" # extended thinking for Claude reasoning models enable_claude_extended_thinking = false # Set to true to enable extended thinking feature extended_thinking_budget_tokens = 2048 extended_thinking_max_output_tokens = 4096 # Adaptive thinking for Claude Opus 4.7/4.8 and Claude 5 models. When enabled, # these models receive thinking={"type": "adaptive"} and an output_config effort. # Do not add adaptive-only models to claude_extended_thinking_models_override; # when both features are enabled, adaptive thinking takes precedence. enable_claude_adaptive_thinking = false # Optional: override the built-in list of Claude models that receive the extended-thinking payload. # When non-empty, this list fully replaces the built-in defaults (see CLAUDE_EXTENDED_THINKING_MODELS # in pr_agent/algo/__init__.py). Leave empty to use the defaults. claude_extended_thinking_models_override = [] # Extract issue number from PR source branch name (e.g. feature/1-auth-google -> issue #1). When true, branch-derived # issue URLs are merged with tickets from the PR description for compliance. Set to false to restore description-only behaviour. # Note: Branch-name extraction is GitHub-only for now; other providers planned for later. extract_issue_from_branch = true # Optional: custom regex with exactly one capturing group for the issue number (validated at runtime; falls back # to default if missing). If empty, uses default pattern: first 1-6 digits at start of branch or after a slash, # followed by hyphen or end (e.g. feature/1-test, 123-fix). GitHub only; other providers planned for later. branch_issue_regex = "" [pr_reviewer] # /review # # enable/disable features require_score_review=false require_tests_review=true require_estimate_effort_to_review=true require_can_be_split_review=false require_security_review=true require_estimate_contribution_time_cost=false require_todo_scan=false require_ticket_analysis_review=true # Opt-in structured assessment fields. Each adds one field to the review output and to the model's output schema. require_risk_assessment=false # ask the model for an overall risk level (low/medium/high) require_merge_recommendation=false # ask the model for a merge recommendation (safe_to_merge/merge_with_caution/changes_required) require_priority_files=false # ask the model which files a human should inspect first # general options publish_output_no_suggestions=true # Set to "false" if you only need the reviewer's remarks (not labels, not "security audit", etc.) and want to avoid noisy "No major issues detected" comments. publish_error_details=false # Publish a deterministic, sanitized failure reason in manual review comments. No AI call is used. persistent_comment=true # Visible base heading for full and incremental review comments. Identity is tracked separately. review_heading = "PR Reviewer Guide" persistent_finding_state=true # Persist review finding state across complete review runs. inline_key_issues=false extra_instructions = "" num_max_findings = 3 final_update_message = true # review labels enable_review_labels_security=true enable_review_labels_effort=true # specific configurations for incremental review (/review -i) require_all_thresholds_for_incremental_review=false minimal_commits_for_incremental_review=0 minimal_minutes_for_incremental_review=0 enable_intro_text=true enable_help_text=false # Determines whether to include help text in the PR review. Enabled by default. enable_review_coverage_footer=true # large-diff chunking (opt-in). When the token budget leaves files out of the review, split the diff # into chunks, review each chunk, and merge the per-chunk results into one review. enable_large_pr_chunking=false max_number_of_calls=3 # maximum number of chunk review calls, used only when enable_large_pr_chunking is true [pr_description] # /describe # publish_labels=false add_original_user_description=true generate_ai_title=false use_bullet_points=true extra_instructions = "" enable_pr_type=true enable_pr_description=true # adds a section with an AI-generated summary of the PR changes final_update_message = true enable_help_text=false enable_help_comment=false enable_pr_diagram=true # adds a section with a diagram of the PR changes pr_diagram_direction='adaptive' # 'adaptive', 'LR', 'TD'. 'adaptive' picks the direction from the shape of the diagram pr_diagram_direction_threshold=5 # with 'adaptive', a chain longer than this many nodes is drawn top-down # describe as comment publish_description_as_comment=false publish_description_as_comment_persistent=true ## changes walkthrough section enable_semantic_files_types=true collapsible_file_list='adaptive' # true, false, 'adaptive' collapsible_file_list_threshold=6 file_table_collapsible_open_by_default=false inline_file_summary=false # false, true, 'table' # markers use_description_markers=false enable_large_pr_handling=true include_generated_by_header=true #custom_labels = ['Bug fix', 'Tests', 'Bug fix with tests', 'Enhancement', 'Documentation', 'Other'] max_ai_calls=4 async_ai_calls=true [pr_questions] # /ask # enable_help_text=false use_conversation_history=true # Set the plain-text heading for top-level /ask answers; provider-specific presentation is added automatically. ask_heading = "Ask" # Enable to let /ask_line resolve the review thread when the LLM judges the # issue addressed. Note: also resolves threads started by human reviewers. resolve_threads=false extra_instructions = "" [pr_code_suggestions] # /improve # commitable_code_suggestions = false dual_publishing_score_threshold=-1 # -1 to disable, [0-10] to set the threshold (>=) for publishing a code suggestion both in a table and as committable focus_only_on_problems=true # extra_instructions = "" # Visible base heading for summary-table /improve comments. Identity is tracked separately. suggestions_heading = "PR Code Suggestions" enable_help_text=false enable_chat_text=false persistent_comment=true max_history_len=4 publish_output_no_suggestions=true enable_suggestions_coverage_footer=true # show when failed analysis chunks make the suggestions incomplete # suggestions scoring suggestions_score_threshold=0 # [0-10]| recommend not to set this value above 8, since above it may clip highly relevant suggestions new_score_mechanism=true new_score_mechanism_th_high=9 new_score_mechanism_th_medium=7 # params for '/improve --extended' mode auto_extended_mode=true num_code_suggestions_per_chunk=3 # Maximum suggestions retained per file after all chunks are merged; 0 disables the cap. max_suggestions_per_file = 0 max_number_of_calls = 3 parallel_calls = true final_clip_factor = 0.8 decouple_hunks = false # self-review checkbox demand_code_suggestions_self_review=false # add a checkbox for the author to self-review the code suggestions code_suggestions_self_review_text= "**Author self-review**: I have reviewed the PR code suggestions, and addressed the relevant ones." approve_pr_on_self_review=false # if true, the PR will be auto-approved after the author clicks on the self-review checkbox fold_suggestions_on_self_review=true # if true, the code suggestions will be folded after the author clicks on the self-review checkbox [pr_custom_prompt] # /custom_prompt # prompt = """\ The code suggestions should focus only on the following: - ... - ... ... """ suggestions_score_threshold=0 num_code_suggestions_per_chunk=3 self_reflect_on_custom_suggestions=true enable_help_text=false [pr_add_docs] # /add_docs # extra_instructions = "" docs_style = "Sphinx" # "Google Style with Args, Returns, Attributes...etc", "Numpy Style", "Sphinx Style", "PEP257", "reStructuredText" file = "" # in case there are several components with the same name, you can specify the relevant file class_name = "" # in case there are several methods with the same name in the same file, you can specify the relevant class name [pr_update_changelog] # /update_changelog # push_changelog_changes=false extra_instructions = "" add_pr_link=true skip_ci_on_push=true [pr_analyze] # /analyze # enable_help_text=true [pr_test] # /test # extra_instructions = "" testing_framework = "" # specify the testing framework you want to use num_tests=3 # number of tests to generate. max 5. avoid_mocks=true # if true, the generated tests will prefer to use real objects instead of mocks file = "" # in case there are several components with the same name, you can specify the relevant file class_name = "" # in case there are several methods with the same name in the same file, you can specify the relevant class name enable_help_text=false [pr_improve_component] # /improve_component # num_code_suggestions=4 extra_instructions = "" file = "" # in case there are several components with the same name, you can specify the relevant file class_name = "" # in case there are several methods with the same name in the same file, you can specify the relevant class name [pr_help] # /help # force_local_db=false num_retrieved_snippets=5 [pr_config] # /config # [pr_help_docs] repo_url = "" #If not overwritten, will use the repo from where the context came from (issue or PR) repo_default_branch = "main" docs_path = "docs" exclude_root_readme = false supported_doc_exts = [".md", ".mdx", ".rst"] enable_help_text=false [github] # The type of deployment to create. Valid values are 'app' or 'user'. deployment_type = "user" ratelimit_retries = 5 polling_request_timeout = 10 # total seconds for comment-history fallback; positive values capped at 60 base_url = "https://api.github.com" publish_inline_comments_fallback_with_verification = true try_fix_invalid_inline_comments = true app_name = "pr-agent" ignore_bot_pr = true publish_as_check_run = false # when true, publish review/description/improve output as GitHub Checks instead of PR comments [github_action_config] # auto_review = true # set as env var in .github/workflows/pr-agent.yaml # auto_describe = true # set as env var in .github/workflows/pr-agent.yaml # auto_improve = true # set as env var in .github/workflows/pr-agent.yaml # pr_actions = ['opened', 'reopened', 'ready_for_review', 'review_requested'] # handle_push_trigger = false # when true, handle synchronize events using push_commands (falls back to github_app.handle_push_trigger) # push_trigger_ignore_bot_commits = true # push_trigger_ignore_merge_commits = true # push_commands = ['/describe', '/review'] # defaults mirror github_app.push_commands # review_states = ['changes_requested'] # states that trigger review_commands after a submitted GitHub review # review_author_types = ['User'] # review.user.type values allowed to trigger review_commands # review_commands = [] # empty by default; falls back to github_app.review_commands when unset [github_app] # these toggles allows running the github app from custom deployments bot_user = "github-actions[bot]" override_deployment_type = true # settings for "pull_request" event handle_pr_actions = ['opened', 'reopened', 'ready_for_review'] feedback_on_draft_pr = false # A submitted GitHub review can optionally trigger these commands. The empty default preserves current behavior. review_states = ["changes_requested"] review_author_types = ["User"] review_commands = [] # settings for "pull_request" event with "synchronize" action - used to detect and handle push triggers for new commits handle_push_trigger = false push_trigger_ignore_bot_commits = true push_trigger_ignore_merge_commits = true push_trigger_wait_for_initial_review = true push_trigger_pending_tasks_backlog = true push_trigger_pending_tasks_ttl = 300 push_commands = [ "/describe", "/review", ] [gitlab] url = "https://gitlab.com" expand_submodule_diffs = false feedback_on_draft_pr = false # Post the /review summary as a resolvable thread (discussion) instead of a plain note. publish_review_as_thread = false # Post the /improve suggestions comment as a resolvable thread (discussion) instead of a plain note. publish_improve_as_thread = false # When pr_code_suggestions.commitable_code_suggestions is true, queue each suggestion as a GitLab draft # note and publish them all together in one batch (like GitLab's own "start a review" flow) instead of # posting each as its own live discussion - and its own notification - as soon as it's created. publish_code_suggestions_as_review = false # Resolve the bot's own inline threads that a later push left on an outdated diff version. resolve_outdated_inline_threads = false handle_push_trigger = false push_commands = [ "/describe", "/review", ] # Configure SSL validation for GitLab. Can be either set to the path of a custom CA or disabled entirely. # ssl_verify = true # Auto-trigger commands when the bot is assigned as a reviewer on an MR handle_reviewer_assignment = false reviewer_commands = [ "/review", ] [gitea] url = "https://gitea.com" # Optional user-facing base URL used to build links published in comments, for # self-hosted instances where the API is reached via an internal address but # users browse a different external URL, or where the server's own ROOT_URL is # misconfigured. Defaults to `url` when it differs from the shipped default # above, else derived from the PR's html_url. # web_url = "" handle_push_trigger = false push_commands = [ "/describe", "/review", ] [bitbucket_app] avoid_full_files = false request_timeout = 30 # positive seconds for connection and response-read inactivity timeouts [local] # LocalGitProvider settings - uncomment to use paths other than default # description_path= "path/to/description.md" # review_path= "path/to/review.md" # improve_path= "path/to/improve.md" [gerrit] # both are required: the gerrit webhook endpoint rejects every call until they are set webhook_username = "" webhook_password = "" # endpoint to the gerrit service # url = "ssh://gerrit.example.com:29418" # user for gerrit authentication # user = "ai-reviewer" # patch server where patches will be saved # patch_server_endpoint = "http://127.0.0.1:5000/patch" # token to authenticate in the patch server # patch_server_token = "" [bitbucket_server] # URL to the BitBucket Server instance # url = "https://git.bitbucket.com" url = "" [litellm] # use_client = false # drop_params = false enable_callbacks = false success_callback = [] failure_callback = [] service_callback = [] turn_off_message_logging = false # set true to keep prompt/response content (the whole PR diff) out of callback payloads; strongly recommended with the "otel" callback # Optional: forward a fixed custom_llm_provider to LiteLLM, so a raw hosted model id # (e.g. "claude-sonnet-4-5") reaches the provider unchanged instead of being rewritten # by LiteLLM's prefix inference. Empty = let LiteLLM infer the provider from the model name. custom_llm_provider = "" # Force streaming when the request matches this provider AND its api_base contains one of the # substrings below. Some OpenAI-compatible endpoints return a response that LiteLLM cannot # normalize in non-streaming mode. Both must be set for the workaround to apply. force_streaming_custom_llm_provider = "" force_streaming_api_base_substrings = [] callback_timeout_seconds = 30 # max seconds to wait for pending litellm callbacks to flush before exiting # Application inference profile ARN for classic `bedrock/` calls through the `bedrock-runtime` APIs. # Not used by `bedrock_mantle/`, which uses Projects for cost allocation. # model_id = "" cache_control_injection_points = [] # Optional: enable Anthropic prompt caching via LiteLLM, e.g. [{location = "message", role = "system"}] (https://docs.litellm.ai/docs/tutorials/prompt_caching) [openrouter] # OpenRouter provider routing, reasoning control and output cap. These apply only # to models addressed as "openrouter/...". The API key and api_base live in # .secrets.toml (or the openrouter__key env var); the keys below are non-secret. # Refs: https://openrouter.ai/docs/guides/routing/provider-selection # https://openrouter.ai/docs/guides/best-practices/reasoning-tokens provider_only = [] # restrict routing to these upstream providers only, a hard allowlist (e.g. ["z-ai"]); empty = OpenRouter default routing provider_order = [] # preferred provider order; ignored when provider_only is set; empty = unset allow_fallbacks = true # when provider_order is set, allow routing beyond the listed providers # Invalid reasoning_effort values are warned about and treated as unset. # Empty inherits config.reasoning_effort for models in SUPPORT_REASONING_EFFORT_MODELS. # Valid values: "none", "minimal", "low", "medium", "high", "xhigh", "max". # OpenRouter normalizes "max" to "xhigh" to match LiteLLM 1.98.0. # Model-specific support varies; mandatory reasoning models reject "none". reasoning_effort = "" # A positive value overrides global effort and non-none OpenRouter-specific efforts. # Explicit openrouter.reasoning_effort = "none" keeps reasoning disabled, except on # Grok 4.5/4.6: there "none" is clamped to the lowest supported # effort first, so a positive budget wins over it. # Some providers require max_tokens to be greater than the reasoning budget. reasoning_max_tokens = 0 max_tokens = 0 # hard cap on completion tokens for the request; 0 = unset [model_routing] # send a small pull request to a cheaper primary model (disabled by default) # Rules are checked in order; the first one whose limits the pull request fits selects the primary model for the # call, and config.fallback_models still apply after it. A pull request that fits no rule uses config.model. # Size is measured after the [ignore] rules by diff hunks (max_hunks) and changed files (max_files), which every # git provider reports and which do not depend on any model's tokenizer. Only calls that ask for the regular model # are routed (/review, /improve, /generate_labels, /add_docs); tools that use model_weak are left alone. # With Azure (openai.deployment_id set) a rule also needs its own deployment_id, or it is skipped. enable = false rules = [] # e.g. [{ max_hunks = 3, model = "gpt-5.6-luna" }, { max_hunks = 15, max_files = 6, model = "gpt-5.6-terra" }] [otel] # Keys map to settings.get("OTEL.*") via section-key dot notation. is_enabled = false # disabled by default; set to true to enable telemetry exporter_type = "console" # "console", "otlp", or "none" service_name = "pr-agent" environment = "development" # "development", "staging", "production", etc. otlp_timeout = 3 # seconds; hard deadline per OTLP export call (incl. retries). Bounds CLI-exit/request stalls when the collector is unreachable; batches slower than this are dropped. otlp_protocol = "http" # "http" (default; exporter ships with pr-agent) or "grpc" (requires the otel-grpc extra: pip install pr-agent[otel-grpc]) include_pr_url = false # set to true to attach PR URLs to spans (may expose private repo names) include_error_details = false # set to true to attach exception messages and rejected-command text to spans (may expose PR URLs, repo names, or other request content) [pr_similar_issue] skip_comments = false force_update_dataset = false max_issues_to_scan = 500 vectordb = "pinecone" # options: "pinecone", "lancedb", "qdrant" [pr_find_similar_component] class_name = "" file = "" search_from_org = false allow_fallback_less_words = true number_of_keywords = 5 number_of_results = 5 [pinecone] # fill and place in .secrets.toml #api_key = ... # environment = "gcp-starter" [lancedb] uri = "./lancedb" [qdrant] # fill and place credentials in .secrets.toml # url = "https://YOUR-QDRANT-URL" # api_key = "..." [skills] # Agent skills (SKILL.md) support: discovers SKILL.md files from the configured # filesystem paths and injects their content into review/improve/describe and # top-level /ask prompts. # Sibling *.md files in the skill directory tree (e.g. references/guide.md) are # inlined alongside SKILL.md. PR-Agent supports text-only skills: scripts/ and # assets/ subdirectories are skipped because PR-Agent uses a single-shot model # call (no tool-use loop) and cannot execute scripts or load binary assets on # demand. Skills that depend on script execution will not work here. # See https://github.com/The-PR-Agent/pr-agent/issues/2384 enabled = false paths = [] # directories to scan recursively for "*/SKILL.md"; supports ~ and $VAR max_skills_tokens = 8000 # token budget for the combined skills_context block [best_practices] content = "" organization_name = "" max_lines_allowed = 800 enable_global_best_practices = false [auto_best_practices] enable_auto_best_practices = true # public - general flag to disable all auto best practices usage utilize_auto_best_practices = true # public - disable usage of auto best practices in the 'improve' tool extra_instructions = "" # public - extra instructions to the auto best practices generation prompt content = "" max_patterns = 5 # max number of patterns to be detected [artifacts] # Enable artifact injection into tool prompts (off by default; auto-enabled when artifact_path input is set) enable = false # File path to the artifact (relative to GITHUB_WORKSPACE, or absolute) artifact_path = "" # Custom instructions appended after the artifact content (leave empty for a sensible default) artifact_instructions = "" # Label shown to the AI — defaults to the filename when empty artifact_label = "" # Which tools receive artifact context target_tools = ["pr_reviewer", "pr_description", "pr_code_suggestions"] # Max artifact size in characters (content is truncated if exceeded) max_artifact_size = 50000 [asana] request_timeout = 10 # seconds allowed for each Asana task API request [azure_devops] default_comment_status = "closed" [azure_devops_server] agent_identity = "" # empty: discover the identity from earlier agent comments on the PR [push_outputs] # push tool outputs to external sinks without calling git-provider APIs (disabled by default) enable = false channels = [] # any of: "stdout", "file", "webhook", "slack". Nothing is emitted until a channel is listed here file_path = "pr-agent-outputs/reviews.jsonl" # used by the "file" channel webhook_url = "" # used by the "webhook" channel: generic JSON POST target. Must be an absolute https:// URL slack_webhook_url = "" # used by the "slack" channel: a Slack Incoming Webhook URL. Must be an absolute https:// URL