|
94 | 94 | convert_logit_bias_input_to_json, |
95 | 95 | get_content_from_message, |
96 | 96 | convert_output_to_messages, |
| 97 | + filter_output_by_content, |
97 | 98 | ) |
98 | 99 | from open_webui.utils.tools import ( |
99 | 100 | get_tools, |
@@ -1948,11 +1949,40 @@ def process_messages_with_output(messages: list[dict]) -> list[dict]: |
1948 | 1949 |
|
1949 | 1950 | for message in messages: |
1950 | 1951 | if message.get("role") == "assistant" and message.get("output"): |
1951 | | - # Use output items for clean OpenAI-format messages |
1952 | | - output_messages = convert_output_to_messages(message["output"]) |
| 1952 | + # Drop output items for tool call blocks removed from content |
| 1953 | + output = filter_output_by_content( |
| 1954 | + message["output"], message.get("content", "") |
| 1955 | + ) |
| 1956 | + |
| 1957 | + # Use content for text (respects edits), output for structured items |
| 1958 | + content = re.sub( |
| 1959 | + r"<details\b[^>]*>.*?</details>", "", |
| 1960 | + message.get("content", ""), flags=re.S, |
| 1961 | + ).strip() |
| 1962 | + non_message_items = [ |
| 1963 | + i for i in output if i.get("type") != "message" |
| 1964 | + ] |
| 1965 | + output_messages = convert_output_to_messages(non_message_items) |
| 1966 | + |
1953 | 1967 | if output_messages: |
| 1968 | + # Prepend edited text to first assistant message |
| 1969 | + for om in output_messages: |
| 1970 | + if om.get("role") == "assistant": |
| 1971 | + om["content"] = ( |
| 1972 | + (content + "\n" + om["content"]).strip() |
| 1973 | + if om.get("content") |
| 1974 | + else content |
| 1975 | + ) |
| 1976 | + content = "" |
| 1977 | + break |
| 1978 | + if content: |
| 1979 | + output_messages.insert( |
| 1980 | + 0, {"role": "assistant", "content": content} |
| 1981 | + ) |
1954 | 1982 | processed.extend(output_messages) |
1955 | | - continue |
| 1983 | + elif content: |
| 1984 | + processed.append({"role": "assistant", "content": content}) |
| 1985 | + continue |
1956 | 1986 |
|
1957 | 1987 | # Strip 'output' field before adding (LLM shouldn't see it) |
1958 | 1988 | clean_message = {k: v for k, v in message.items() if k != "output"} |
|
0 commit comments